mirror of
https://github.com/mozilla/gecko-dev.git
synced 2025-11-12 14:20:14 +02:00
This is a rollup of all the patches that have landed on the cedar project branch:891252fdd0Bug 1492475 - Part 1: Migrate most, if not all nsSearchService consumers to use async APIs. r=florian79b2eb2367Bug 1492475 - Part 2: Move nsIBrowserSearchService.idl to toolkit/components/search/nsISearchService.idl and update references. r=floriana947d3cdf0Bug 1492475 - Part 3: The search service init() method should simply return a Promise. r=florianc1e172dfacBug 1492475 - Part 4: Remove the synchronous initialization flow. r=floriancd41189eacBug 1492475 - Part 5: Since async initialization of the search service now is implicit behavior, remove the distinctive verbiage used internally. r=florian2ae7189dfaBug 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=florianc8ee92973fBug 1492475 - Part 7: Make the region fetch not block the init flow, to ensure it's as fast as possible. r=florianc44e674e16Bug 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=florian6c79eaf1d3Bug 1492475 - Part 9: Update unit tests to stop using 'currentEngine', in favor of 'defaultEngine'. r=Standard821b3aa17eeBug 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,floriance5ba69019Bug 1492475 - Part 11: Repair incorrect usage of the `identifier` property of nsISearchEngine instances. r=florianfd177a7994Bug 1518543 - Fix up the Android (Fennec) nsISearchService shim to work with the new asynchronous API. r=florian3653d8ee22Bug 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
161 lines
6.7 KiB
JavaScript
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");
|
|
}
|