gecko-dev/browser/components/urlbar/tests/legacy/browser_urlbarSearchSuggestions_opt-out.js
Mike de Boer 481ae95c00 Bug 1524593 - nsISearchService (aka nsIBrowserSearchService, previously) refactor to be mostly an asynchronous, in preparation of WebExtension engines. r=daleharvey
This is a rollup of all the patches that have landed on the cedar project branch:

891252fdd0
Bug 1492475 - Part 1: Migrate most, if not all nsSearchService consumers to use async APIs. r=florian

79b2eb2367
Bug 1492475 - Part 2: Move nsIBrowserSearchService.idl to toolkit/components/search/nsISearchService.idl and update references. r=florian

a947d3cdf0
Bug 1492475 - Part 3: The search service init() method should simply return a Promise. r=florian

c1e172dfac
Bug 1492475 - Part 4: Remove the synchronous initialization flow. r=florian

cd41189eac
Bug 1492475 - Part 5: Since async initialization of the search service now is implicit behavior, remove the distinctive verbiage used internally. r=florian

2ae7189dfa
Bug 1492475 - Part 6: Update the cache build task to work with an actual Promise and re-initialize only once at the same time - all to fix race conditions here. r=florian

c8ee92973f
Bug 1492475 - Part 7: Make the region fetch not block the init flow, to ensure it's as fast as possible. r=florian

c44e674e16
Bug 1492475 - Part 8: Introduce an init flag, which can only be used privately, that allows to explicitly skip waiting for the region check process to complete. r=florian

6c79eaf1d3
Bug 1492475 - Part 9: Update unit tests to stop using 'currentEngine', in favor of 'defaultEngine'. r=Standard8

21b3aa17ee
Bug 1492475 - Part 10: Update unit tests to be fully aware of the new, async signatures of the search service API and remove sync init flow tests. r=mkaply,florian

ce5ba69019
Bug 1492475 - Part 11: Repair incorrect usage of the `identifier` property of nsISearchEngine instances. r=florian

fd177a7994
Bug 1518543 - Fix up the Android (Fennec) nsISearchService shim to work with the new asynchronous API. r=florian

3653d8ee22
Bug 1523708 - Change the search service interaction in the show-heartbeat action to use the new async API. r=florian

Differential Revision: https://phabricator.services.mozilla.com/D18355

--HG--
rename : netwerk/base/nsIBrowserSearchService.idl => toolkit/components/search/nsISearchService.idl
extra : moz-landing-system : lando
2019-02-02 11:27:21 +00:00

161 lines
6.7 KiB
JavaScript

/* Any copyright is dedicated to the Public Domain.
* http://creativecommons.org/publicdomain/zero/1.0/ */
/* eslint-disable mozilla/no-arbitrary-setTimeout */
// The order of the tests here matters!
const SUGGEST_ALL_PREF = "browser.search.suggest.enabled";
const SUGGEST_URLBAR_PREF = "browser.urlbar.suggest.searches";
const CHOICE_PREF = "browser.urlbar.userMadeSearchSuggestionsChoice";
const TIMES_PREF = "browser.urlbar.timesBeforeHidingSuggestionsHint";
const TEST_ENGINE_BASENAME = "searchSuggestionEngine.xml";
const ONEOFF_PREF = "browser.urlbar.oneOffSearches";
const NO_RESULTS_TIMEOUT_MS = 500;
add_task(async function prepare() {
let engine = await SearchTestUtils.promiseNewSearchEngine(
getRootDirectory(gTestPath) + TEST_ENGINE_BASENAME);
let oldDefaultEngine = await Services.search.getDefault();
await Services.search.setDefault(engine);
let suggestionsEnabled = Services.prefs.getBoolPref(SUGGEST_URLBAR_PREF);
let defaults = Services.prefs.getDefaultBranch("browser.urlbar.");
let searchSuggestionsDefault = defaults.getBoolPref("suggest.searches");
defaults.setBoolPref("suggest.searches", true);
let suggestionsChoice = Services.prefs.getBoolPref(CHOICE_PREF);
Services.prefs.setBoolPref(CHOICE_PREF, false);
let oneOffs = Services.prefs.getBoolPref(ONEOFF_PREF);
Services.prefs.setBoolPref(ONEOFF_PREF, true);
registerCleanupFunction(async function() {
defaults.setBoolPref("suggest.searches", searchSuggestionsDefault);
await Services.search.setDefault(oldDefaultEngine);
Services.prefs.clearUserPref(SUGGEST_ALL_PREF);
Services.prefs.setBoolPref(SUGGEST_URLBAR_PREF, suggestionsEnabled);
Services.prefs.setBoolPref(CHOICE_PREF, suggestionsChoice);
Services.prefs.setBoolPref(ONEOFF_PREF, oneOffs);
// Make sure the popup is closed for the next test.
gURLBar.blur();
Assert.ok(!gURLBar.popup.popupOpen, "popup should be closed");
});
});
add_task(async function focus() {
// Focusing the urlbar should open the popup in order to show the
// notification.
setupVisibleHint();
gURLBar.blur();
let popupPromise = promisePopupShown(gURLBar.popup);
focusAndSelectUrlBar(true);
await popupPromise;
Assert.ok(gURLBar.popup.popupOpen, "popup should be open");
// There are no results, so wait a bit for *nothing* to appear.
await new Promise(resolve => setTimeout(resolve, NO_RESULTS_TIMEOUT_MS));
assertVisible(true);
assertFooterVisible(false);
Assert.equal(gURLBar.popup.matchCount, 0, "popup should have no results");
// Start searching.
EventUtils.sendString("rnd");
await promiseSearchComplete();
await waitForAutocompleteResultAt(0);
await promiseSuggestionsPresent();
assertVisible(true);
assertFooterVisible(true);
// Check the Change Options link.
let changeOptionsLink = document.getAnonymousElementByAttribute(gURLBar.popup, "id", "search-suggestions-change-settings");
let prefsPromise = BrowserTestUtils.waitForLocationChange(gBrowser, "about:preferences#search");
changeOptionsLink.click();
await prefsPromise;
Assert.ok(!gURLBar.popup.popupOpen, "popup should be closed");
// The preferences page does fancy stuff with focus, ensure to unload it.
await BrowserTestUtils.loadURI(gBrowser.selectedBrowser, "about:blank");
});
add_task(async function click_on_focused() {
// Even if the location bar is already focused, we should still show the popup
// and the notification on click.
setupVisibleHint();
gURLBar.blur();
// Won't show the hint since it's not user initiated.
gURLBar.focus();
await new Promise(resolve => setTimeout(resolve, 1000));
Assert.ok(!gURLBar.popup.popupOpen, "popup should be closed");
Assert.ok(gURLBar.focused, "The input field should be focused");
let popupPromise = promisePopupShown(gURLBar.popup);
EventUtils.synthesizeMouseAtCenter(gURLBar.inputField, {});
await popupPromise;
Assert.ok(gURLBar.popup.popupOpen, "popup should be open");
// There are no results, so wait a bit for *nothing* to appear.
await new Promise(resolve => setTimeout(resolve, NO_RESULTS_TIMEOUT_MS));
assertVisible(true);
assertFooterVisible(false);
Assert.equal(gURLBar.popup.matchCount, 0, "popup should have no results");
gURLBar.blur();
Assert.ok(!gURLBar.popup.popupOpen, "popup should be closed");
});
add_task(async function new_tab() {
// Opening a new tab when the urlbar is unfocused, should focus it but not
// open the popup.
setupVisibleHint();
gURLBar.blur();
// openNewForegroundTab doesn't focus the urlbar.
await BrowserTestUtils.synthesizeKey("t", { accelKey: true }, gBrowser.selectedBrowser);
await new Promise(resolve => setTimeout(resolve, NO_RESULTS_TIMEOUT_MS));
Assert.ok(!gURLBar.popup.popupOpen, "popup should be closed");
BrowserTestUtils.removeTab(gBrowser.selectedTab);
});
add_task(async function privateWindow() {
// Since suggestions are disabled in private windows, the notification should
// not appear even when suggestions are otherwise enabled.
setupVisibleHint();
let win = await BrowserTestUtils.openNewBrowserWindow({ private: true });
await promiseAutocompleteResultPopup("foo", win);
// There are no results, so wait a bit for *nothing* to appear.
await new Promise(resolve => setTimeout(resolve, NO_RESULTS_TIMEOUT_MS));
assertVisible(false, win);
assertFooterVisible(true, win);
win.gURLBar.blur();
await BrowserTestUtils.closeWindow(win);
});
add_task(async function enableOutsideNotification() {
// Setting the suggest.searches pref outside the notification (e.g., by
// ticking the checkbox in the preferences window) should hide it.
setupVisibleHint();
Services.prefs.setBoolPref(SUGGEST_URLBAR_PREF, false);
await promiseAutocompleteResultPopup("foo");
await waitForAutocompleteResultAt(0);
assertVisible(false);
assertFooterVisible(true);
});
add_task(async function userMadeChoice() {
// If the user made a choice already, he should not see the hint.
setupVisibleHint();
Services.prefs.setBoolPref(CHOICE_PREF, true);
await promiseAutocompleteResultPopup("foo");
await waitForAutocompleteResultAt(0);
assertVisible(false);
assertFooterVisible(true);
});
function setupVisibleHint() {
Services.prefs.clearUserPref(TIMES_PREF);
Services.prefs.setBoolPref(SUGGEST_ALL_PREF, true);
// Toggle to reset the whichNotification cache.
Services.prefs.setBoolPref(SUGGEST_URLBAR_PREF, false);
Services.prefs.setBoolPref(SUGGEST_URLBAR_PREF, true);
}
function assertVisible(visible, win = window) {
let style =
win.getComputedStyle(win.gURLBar.popup.searchSuggestionsNotification);
let check = visible ? "notEqual" : "equal";
Assert[check](style.display, "none");
}
function assertFooterVisible(visible, win = window) {
let style = win.getComputedStyle(win.gURLBar.popup.footer);
Assert.equal(style.visibility, visible ? "visible" : "collapse");
}