/* Any copyright is dedicated to the Public Domain.
https://creativecommons.org/publicdomain/zero/1.0/ */
"use strict";
var MockSound = SpecialPowers.MockSound;
add_setup(() => {
MockSound.init();
registerCleanupFunction(() => MockSound.cleanup());
});
add_task(async
function test_notfound_sound() {
const url =
"data:text/html;base64," + btoa(
'');
let tab = await BrowserTestUtils.openNewForegroundTab(gBrowser, url);
let finder = tab.linkedBrowser.finder;
let listener = {
onFindResult() {
ok(
false,
"callback wasn't replaced");
},
};
finder.addResultListener(listener);
let promiseFind, findResult;
function waitForFind() {
return new Promise(resolve => {
listener.onFindResult = resolve;
});
}
const steps = [
[
"foo",
"FIND_FOUND", []],
[
"fox",
"FIND_NOTFOUND", []],
// silent if searchString has not increased its length
[
"foxx",
"FIND_NOTFOUND", [
"beep"]],
];
for (let index = 0; index < steps.length; index++) {
const [searchString, result, expectedPlayed] = steps[index];
MockSound.reset();
promiseFind = waitForFind();
finder.fastFind(searchString,
false,
false);
findResult = await promiseFind;
is(
findResult.result,
Ci.nsITypeAheadFind[result],
`Step ${index + 1}, find
"${searchString}"`
);
SimpleTest.isDeeply(
MockSound.played,
expectedPlayed,
`Step ${index + 1}, Not-found sound`
);
}
// Extra step for testing entireWord
finder.entireWord =
true;
MockSound.reset();
promiseFind = waitForFind();
finder.fastFind(
"foxxx",
false,
false);
findResult = await promiseFind;
is(
findResult.result,
Ci.nsITypeAheadFind.FIND_NOTFOUND,
'String "foxxx" not found'
);
SimpleTest.isDeeply(MockSound.played, [],
"No sound when entireWord is on");
gBrowser.removeTab(tab);
});
add_task(async
function test_wrapped_sound() {
const url =
"data:text/html;base64," +
btoa(
'');
let tab = await BrowserTestUtils.openNewForegroundTab(gBrowser, url);
await SpecialPowers.pushPrefEnv({
set: [[
"accessibility.typeaheadfind.wrappedSoundURL",
"beep"]],
});
let finder = tab.linkedBrowser.finder;
let listener = {
onFindResult() {
ok(
false,
"callback wasn't replaced");
},
};
finder.addResultListener(listener);
let promiseFind, findResult;
function waitForFind() {
return new Promise(resolve => {
listener.onFindResult = resolve;
});
}
MockSound.reset();
promiseFind = waitForFind();
finder.fastFind(
"foo",
false,
false);
findResult = await promiseFind;
promiseFind = waitForFind();
finder.findAgain(
"foo",
false,
false,
false);
findResult = await promiseFind;
is(findResult.result, Ci.nsITypeAheadFind.FIND_FOUND,
'Find "foo" 2 times');
SimpleTest.isDeeply(
MockSound.played,
[],
"No sound played for first 2 finds"
);
// 3rd find will trigger "wrapped"
promiseFind = waitForFind();
finder.findAgain(
"foo",
false,
false,
false);
findResult = await promiseFind;
is(
findResult.result,
Ci.nsITypeAheadFind.FIND_WRAPPED,
'Find "foo" 3rd time'
);
SimpleTest.isDeeply(MockSound.played, [
"beep"],
'"beep" for wrapped event');
gBrowser.removeTab(tab);
});
add_task(async
function test_notfound_sound_in_remote_findbar() {
const url =
"about:about";
let tab = await BrowserTestUtils.openNewForegroundTab(gBrowser, url);
let finder = tab.linkedBrowser.finder;
let listener = {
onFindResult() {
ok(
false,
"callback wasn't replaced");
},
};
finder.addResultListener(listener);
let promiseFind, findResult;
function waitForFind() {
return new Promise(resolve => {
listener.onFindResult = resolve;
});
}
const steps = [
[
"config",
"FIND_FOUND", []],
[
"confoo",
"FIND_NOTFOUND", []],
// silent if searchString has not increased its length
[
"confool",
"FIND_NOTFOUND", [
"beep"]],
];
for (let index = 0; index < steps.length; index++) {
const [searchString, result, expectedPlayed] = steps[index];
MockSound.reset();
promiseFind = waitForFind();
finder.fastFind(searchString,
false,
false);
findResult = await promiseFind;
is(
findResult.result,
Ci.nsITypeAheadFind[result],
`Step ${index + 1}, find
"${searchString}"`
);
SimpleTest.isDeeply(
MockSound.played,
expectedPlayed,
`Step ${index + 1}, Not-found sound
for ${searchString}`
);
}
// Extra step for testing entireWord
finder.entireWord =
true;
MockSound.reset();
promiseFind = waitForFind();
finder.fastFind(
"confoobar",
false,
false);
findResult = await promiseFind;
is(
findResult.result,
Ci.nsITypeAheadFind.FIND_NOTFOUND,
'String "confoobar" not found'
);
SimpleTest.isDeeply(MockSound.played, [],
"No sound when entireWord is on");
gBrowser.removeTab(tab);
});
add_task(async
function test_wrapped_sound_in_remote_findbar() {
const url = kFixtureBaseURL +
"file_FinderSample.html";
let tab = await BrowserTestUtils.openNewForegroundTab(gBrowser, url);
await SpecialPowers.pushPrefEnv({
set: [[
"accessibility.typeaheadfind.wrappedSoundURL",
"beep"]],
});
let finder = tab.linkedBrowser.finder;
let listener = {
onFindResult() {
ok(
false,
"callback wasn't replaced");
},
};
finder.addResultListener(listener);
let promiseFind, findResult;
function waitForFind() {
return new Promise(resolve => {
listener.onFindResult = resolve;
});
}
MockSound.reset();
promiseFind = waitForFind();
finder.fastFind(
"Roland",
false,
false);
findResult = await promiseFind;
promiseFind = waitForFind();
finder.findAgain(
"Roland",
false,
false,
false);
findResult = await promiseFind;
// Known: "Roland" appears in <body> 2 times
is(
findResult.result,
Ci.nsITypeAheadFind.FIND_FOUND,
'Find "Roland" 2 times'
);
SimpleTest.isDeeply(
MockSound.played,
[],
"No sound played for first 2 finds"
);
// 3rd find will trigger "wrapped"
promiseFind = waitForFind();
finder.findAgain(
"Roland",
false,
false,
false);
findResult = await promiseFind;
is(
findResult.result,
Ci.nsITypeAheadFind.FIND_WRAPPED,
'Find "Roland" 3rd time'
);
SimpleTest.isDeeply(MockSound.played, [
"beep"],
'"beep" for wrapped event');
gBrowser.removeTab(tab);
});