Source code
Revision control
Copy as Markdown
Other Tools
Test Info: Warnings
- This test gets skipped with pattern: os == 'linux' && os_version == '18.04' && asan OR os == 'linux' && os_version == '18.04' && tsan OR win11_2009 && asan
- Manifest: browser/components/preferences/tests/browser.toml
/* Any copyright is dedicated to the Public Domain.
const { SearchTestUtils } = ChromeUtils.importESModule(
);
const { SearchUtils } = ChromeUtils.importESModule(
"resource://gre/modules/SearchUtils.sys.mjs"
);
add_task(async function test_restore_functionality() {
await SpecialPowers.pushPrefEnv({
set: [["browser.urlbar.scotchBonnet.enableOverride", false]],
});
// Ensure no engines are hidden to begin with.
for (let engine of await Services.search.getAppProvidedEngines()) {
if (engine.hidden) {
engine.hidden = false;
}
}
await openPreferencesViaOpenPreferencesAPI("search", { leaveOpen: true });
let doc = gBrowser.selectedBrowser.contentDocument;
let restoreDefaultsButton = doc.getElementById("restoreDefaultSearchEngines");
Assert.ok(
restoreDefaultsButton.disabled,
"Should have disabled the restore default search engines button on open"
);
let updatedPromise = SearchTestUtils.promiseSearchNotification(
SearchUtils.MODIFIED_TYPE.CHANGED,
SearchUtils.TOPIC_ENGINE_MODIFIED
);
let tree = doc.querySelector("#engineList");
// Check for default search engines to be displayed in the engineList
let defaultEngines = await Services.search.getAppProvidedEngines();
for (let i = 0; i < defaultEngines.length; i++) {
let cellName = tree.view.getCellText(
i,
tree.columns.getNamedColumn("engineName")
);
if (cellName == "DuckDuckGo") {
tree.view.selection.select(i);
break;
}
}
doc.getElementById("removeEngineButton").click();
await updatedPromise;
let engine = await Services.search.getEngineByName("DuckDuckGo");
Assert.ok(engine.hidden, "Should have hidden the engine");
Assert.ok(
!restoreDefaultsButton.disabled,
"Should have enabled the restore default search engines button"
);
updatedPromise = SearchTestUtils.promiseSearchNotification(
SearchUtils.MODIFIED_TYPE.CHANGED,
SearchUtils.TOPIC_ENGINE_MODIFIED
);
restoreDefaultsButton.click();
await updatedPromise;
// Let the stack unwind so that the restore defaults button can update its
// state.
await new Promise(resolve => Services.tm.dispatchToMainThread(resolve));
Assert.ok(!engine.hidden, "Should have re-enabled the disabled engine");
Assert.ok(
restoreDefaultsButton.disabled,
"Should have disabled the restore default search engines button after use"
);
gBrowser.removeCurrentTab();
});
add_task(async function test_restoreEnabledOnOpenWithEngineHidden() {
let engine = await Services.search.getEngineByName("DuckDuckGo");
engine.hidden = true;
await openPreferencesViaOpenPreferencesAPI("search", { leaveOpen: true });
let doc = gBrowser.selectedBrowser.contentDocument;
let restoreDefaultsButton = doc.getElementById("restoreDefaultSearchEngines");
Assert.ok(
!restoreDefaultsButton.disabled,
"Should have enabled the restore default search engines button on open"
);
let updatedPromise = SearchTestUtils.promiseSearchNotification(
SearchUtils.MODIFIED_TYPE.CHANGED,
SearchUtils.TOPIC_ENGINE_MODIFIED
);
restoreDefaultsButton.click();
await updatedPromise;
// Let the stack unwind so that the restore defaults button can update its
// state.
await new Promise(resolve => Services.tm.dispatchToMainThread(resolve));
Assert.ok(!engine.hidden, "Should have re-enabled the disabled engine");
Assert.ok(
restoreDefaultsButton.disabled,
"Should have disabled the restore default search engines button after use"
);
gBrowser.removeCurrentTab();
});
// This removes the last two engines and then the remaining engines from top to
add_task(async function test_removeOutOfOrder() {
await openPreferencesViaOpenPreferencesAPI("search", { leaveOpen: true });
let doc = gBrowser.selectedBrowser.contentDocument;
let restoreDefaultsButton = doc.getElementById("restoreDefaultSearchEngines");
Assert.ok(
restoreDefaultsButton.disabled,
"The restore-defaults button is disabled initially"
);
let tree = doc.querySelector("#engineList");
let removeEngineButton = doc.getElementById("removeEngineButton");
removeEngineButton.scrollIntoView();
let defaultEngines = await Services.search.getAppProvidedEngines();
// Remove the last two engines. After each removal, the selection should move
// to the first local shortcut.
for (let i = 0; i < 2; i++) {
tree.view.selection.select(defaultEngines.length - i - 1);
let updatedPromise = SearchTestUtils.promiseSearchNotification(
SearchUtils.MODIFIED_TYPE.CHANGED,
SearchUtils.TOPIC_ENGINE_MODIFIED
);
removeEngineButton.click();
await updatedPromise;
Assert.ok(
removeEngineButton.disabled,
"The remove-engine button is disabled because a local shortcut is selected"
);
Assert.ok(
!restoreDefaultsButton.disabled,
"The restore-defaults button is enabled after removing an engine"
);
}
// Remove the remaining engines from top to bottom except for the default engine
// which can't be removed.
for (let i = 0; i < defaultEngines.length - 3; i++) {
tree.view.selection.select(0);
if (defaultEngines[0].name == Services.search.defaultEngine.name) {
tree.view.selection.select(1);
}
let updatedPromise = SearchTestUtils.promiseSearchNotification(
SearchUtils.MODIFIED_TYPE.CHANGED,
SearchUtils.TOPIC_ENGINE_MODIFIED
);
removeEngineButton.click();
await updatedPromise;
Assert.ok(
!restoreDefaultsButton.disabled,
"The restore-defaults button is enabled after removing an engine"
);
}
Assert.ok(
removeEngineButton.disabled,
"The remove-engine button is disabled because only one engine remains"
);
// Click the restore-defaults button.
let updatedPromise = SearchTestUtils.promiseSearchNotification(
SearchUtils.MODIFIED_TYPE.CHANGED,
SearchUtils.TOPIC_ENGINE_MODIFIED
);
restoreDefaultsButton.click();
await updatedPromise;
// Wait for the restore-defaults button to update its state.
await TestUtils.waitForCondition(
() => restoreDefaultsButton.disabled,
"Waiting for the restore-defaults button to become disabled"
);
Assert.ok(
restoreDefaultsButton.disabled,
"The restore-defaults button is disabled after restoring defaults"
);
Assert.equal(
tree.view.rowCount,
defaultEngines.length + UrlbarUtils.LOCAL_SEARCH_MODES.length,
"All engines are restored"
);
gBrowser.removeCurrentTab();
});
add_task(async function test_removeAndRestoreMultiple() {
await openPreferencesViaOpenPreferencesAPI("search", { leaveOpen: true });
let doc = gBrowser.selectedBrowser.contentDocument;
let restoreDefaultsButton = doc.getElementById("restoreDefaultSearchEngines");
let tree = doc.querySelector("#engineList");
let removeEngineButton = doc.getElementById("removeEngineButton");
removeEngineButton.scrollIntoView();
let defaultEngines = await Services.search.getAppProvidedEngines();
// Remove the second and fourth engines.
for (let i = 0; i < 2; i++) {
tree.view.selection.select(i * 2 + 1);
let updatedPromise = SearchTestUtils.promiseSearchNotification(
SearchUtils.MODIFIED_TYPE.CHANGED,
SearchUtils.TOPIC_ENGINE_MODIFIED
);
removeEngineButton.click();
await updatedPromise;
}
// Click the restore-defaults button.
let updatedPromise = SearchTestUtils.promiseSearchNotification(
SearchUtils.MODIFIED_TYPE.CHANGED,
SearchUtils.TOPIC_ENGINE_MODIFIED
);
restoreDefaultsButton.click();
await updatedPromise;
// Remove the third engine.
tree.view.selection.select(3);
updatedPromise = SearchTestUtils.promiseSearchNotification(
SearchUtils.MODIFIED_TYPE.CHANGED,
SearchUtils.TOPIC_ENGINE_MODIFIED
);
removeEngineButton.click();
await updatedPromise;
// Now restore again.
updatedPromise = SearchTestUtils.promiseSearchNotification(
SearchUtils.MODIFIED_TYPE.CHANGED,
SearchUtils.TOPIC_ENGINE_MODIFIED
);
restoreDefaultsButton.click();
await updatedPromise;
// Wait for the restore-defaults button to update its state.
await TestUtils.waitForCondition(
() => restoreDefaultsButton.disabled,
"Waiting for the restore-defaults button to become disabled"
);
Assert.equal(
tree.view.rowCount,
defaultEngines.length + UrlbarUtils.LOCAL_SEARCH_MODES.length,
"Should have the correct amount of engines"
);
gBrowser.removeCurrentTab();
});