diff options
Diffstat (limited to 'browser/base/content/test/urlbar/browser_urlbarSearchSuggestionsNotification.js')
-rw-r--r-- | browser/base/content/test/urlbar/browser_urlbarSearchSuggestionsNotification.js | 254 |
1 files changed, 254 insertions, 0 deletions
diff --git a/browser/base/content/test/urlbar/browser_urlbarSearchSuggestionsNotification.js b/browser/base/content/test/urlbar/browser_urlbarSearchSuggestionsNotification.js new file mode 100644 index 000000000..94ae8a3ff --- /dev/null +++ b/browser/base/content/test/urlbar/browser_urlbarSearchSuggestionsNotification.js @@ -0,0 +1,254 @@ +const SUGGEST_ALL_PREF = "browser.search.suggest.enabled"; +const SUGGEST_URLBAR_PREF = "browser.urlbar.suggest.searches"; +const CHOICE_PREF = "browser.urlbar.userMadeSearchSuggestionsChoice"; +const TEST_ENGINE_BASENAME = "searchSuggestionEngine.xml"; + +// Must run first. +add_task(function* prepare() { + let engine = yield promiseNewSearchEngine(TEST_ENGINE_BASENAME); + let oldCurrentEngine = Services.search.currentEngine; + Services.search.currentEngine = engine; + registerCleanupFunction(function* () { + Services.search.currentEngine = oldCurrentEngine; + Services.prefs.clearUserPref(SUGGEST_ALL_PREF); + Services.prefs.clearUserPref(SUGGEST_URLBAR_PREF); + + // Disable the notification for future tests so it doesn't interfere with + // them. clearUserPref() won't work because by default the pref is false. + yield setUserMadeChoicePref(true); + + // Make sure the popup is closed for the next test. + gURLBar.blur(); + Assert.ok(!gURLBar.popup.popupOpen, "popup should be closed"); + }); +}); + +add_task(function* focus() { + // Focusing the urlbar used to open the popup in order to show the + // notification, but it doesn't anymore. Make sure it does not. + Services.prefs.setBoolPref(SUGGEST_ALL_PREF, true); + yield setUserMadeChoicePref(false); + gURLBar.blur(); + gURLBar.focus(); + Assert.ok(!gURLBar.popup.popupOpen, "popup should remain closed"); +}); + +add_task(function* dismissWithoutResults() { + Services.prefs.setBoolPref(SUGGEST_ALL_PREF, true); + yield setUserMadeChoicePref(false); + gURLBar.blur(); + gURLBar.focus(); + let popupPromise = promisePopupShown(gURLBar.popup); + gURLBar.openPopup(); + yield popupPromise; + Assert.ok(gURLBar.popup.popupOpen, "popup should be open"); + assertVisible(true); + Assert.equal(gURLBar.popup._matchCount, 0, "popup should have no results"); + let disableButton = document.getAnonymousElementByAttribute( + gURLBar.popup, "anonid", "search-suggestions-notification-disable" + ); + let transitionPromise = promiseTransition(); + disableButton.click(); + yield transitionPromise; + Assert.ok(!gURLBar.popup.popupOpen, "popup should be closed"); + gURLBar.blur(); + gURLBar.focus(); + Assert.ok(!gURLBar.popup.popupOpen, "popup should remain closed"); + yield promiseAutocompleteResultPopup("foo"); + Assert.ok(gURLBar.popup.popupOpen, "popup should be open"); + assertVisible(false); +}); + +add_task(function* dismissWithResults() { + Services.prefs.setBoolPref(SUGGEST_ALL_PREF, true); + yield setUserMadeChoicePref(false); + gURLBar.blur(); + gURLBar.focus(); + yield promiseAutocompleteResultPopup("foo"); + Assert.ok(gURLBar.popup.popupOpen, "popup should be open"); + assertVisible(true); + Assert.ok(gURLBar.popup._matchCount > 0, "popup should have results"); + let disableButton = document.getAnonymousElementByAttribute( + gURLBar.popup, "anonid", "search-suggestions-notification-disable" + ); + let transitionPromise = promiseTransition(); + disableButton.click(); + yield transitionPromise; + Assert.ok(gURLBar.popup.popupOpen, "popup should remain open"); + gURLBar.blur(); + gURLBar.focus(); + Assert.ok(!gURLBar.popup.popupOpen, "popup should remain closed"); + yield promiseAutocompleteResultPopup("foo"); + Assert.ok(gURLBar.popup.popupOpen, "popup should be open"); + assertVisible(false); +}); + +add_task(function* disable() { + Services.prefs.setBoolPref(SUGGEST_ALL_PREF, true); + yield setUserMadeChoicePref(false); + gURLBar.blur(); + gURLBar.focus(); + yield promiseAutocompleteResultPopup("foo"); + Assert.ok(gURLBar.popup.popupOpen, "popup should be open"); + assertVisible(true); + let disableButton = document.getAnonymousElementByAttribute( + gURLBar.popup, "anonid", "search-suggestions-notification-disable" + ); + let transitionPromise = promiseTransition(); + disableButton.click(); + yield transitionPromise; + gURLBar.blur(); + yield promiseAutocompleteResultPopup("foo"); + Assert.ok(!suggestionsPresent()); +}); + +add_task(function* enable() { + Services.prefs.setBoolPref(SUGGEST_ALL_PREF, true); + Services.prefs.setBoolPref(SUGGEST_URLBAR_PREF, false); + yield setUserMadeChoicePref(false); + gURLBar.blur(); + gURLBar.focus(); + yield promiseAutocompleteResultPopup("foo"); + assertVisible(true); + Assert.ok(!suggestionsPresent()); + let enableButton = document.getAnonymousElementByAttribute( + gURLBar.popup, "anonid", "search-suggestions-notification-enable" + ); + let searchPromise = BrowserTestUtils.waitForCondition(suggestionsPresent, + "waiting for suggestions"); + enableButton.click(); + yield searchPromise; + // Clicking Yes should trigger a new search so that suggestions appear + // immediately. + Assert.ok(suggestionsPresent()); + gURLBar.blur(); + gURLBar.focus(); + // Suggestions should still be present in a new search of course. + yield promiseAutocompleteResultPopup("bar"); + Assert.ok(suggestionsPresent()); +}); + +add_task(function* privateWindow() { + // Since suggestions are disabled in private windows, the notification should + // not appear even when suggestions are otherwise enabled. + let win = yield BrowserTestUtils.openNewBrowserWindow({ private: true }); + win.gURLBar.blur(); + win.gURLBar.focus(); + yield promiseAutocompleteResultPopup("foo", win); + assertVisible(false, win); + win.gURLBar.blur(); + yield BrowserTestUtils.closeWindow(win); +}); + +add_task(function* multipleWindows() { + // Opening multiple windows, using their urlbars, and then dismissing the + // notification in one should dismiss the notification in all. + Services.prefs.setBoolPref(SUGGEST_ALL_PREF, true); + Services.prefs.setBoolPref(SUGGEST_URLBAR_PREF, false); + yield setUserMadeChoicePref(false); + + gURLBar.focus(); + yield promiseAutocompleteResultPopup("win1"); + assertVisible(true); + + let win2 = yield BrowserTestUtils.openNewBrowserWindow(); + win2.gURLBar.focus(); + yield promiseAutocompleteResultPopup("win2", win2); + assertVisible(true, win2); + + let win3 = yield BrowserTestUtils.openNewBrowserWindow(); + win3.gURLBar.focus(); + yield promiseAutocompleteResultPopup("win3", win3); + assertVisible(true, win3); + + let enableButton = win3.document.getAnonymousElementByAttribute( + win3.gURLBar.popup, "anonid", "search-suggestions-notification-enable" + ); + let transitionPromise = promiseTransition(win3); + enableButton.click(); + yield transitionPromise; + assertVisible(false, win3); + + win2.gURLBar.focus(); + yield promiseAutocompleteResultPopup("win2done", win2); + assertVisible(false, win2); + + gURLBar.focus(); + yield promiseAutocompleteResultPopup("win1done"); + assertVisible(false); + + yield BrowserTestUtils.closeWindow(win2); + yield BrowserTestUtils.closeWindow(win3); +}); + +add_task(function* enableOutsideNotification() { + // Setting the suggest.searches pref outside the notification (e.g., by + // ticking the checkbox in the preferences window) should hide it. + Services.prefs.setBoolPref(SUGGEST_ALL_PREF, true); + Services.prefs.setBoolPref(SUGGEST_URLBAR_PREF, false); + yield setUserMadeChoicePref(false); + + Services.prefs.setBoolPref(SUGGEST_URLBAR_PREF, true); + gURLBar.focus(); + yield promiseAutocompleteResultPopup("foo"); + assertVisible(false); +}); + +/** + * Setting the choice pref triggers a pref observer in the urlbar, which hides + * the notification if it's present. This function returns a promise that's + * resolved once the observer fires. + * + * @param userMadeChoice A boolean, the pref's new value. + * @return A Promise that's resolved when the observer fires -- or, if the pref + * is currently the given value, that's resolved immediately. + */ +function setUserMadeChoicePref(userMadeChoice) { + return new Promise(resolve => { + let currentUserMadeChoice = Services.prefs.getBoolPref(CHOICE_PREF); + if (currentUserMadeChoice != userMadeChoice) { + Services.prefs.addObserver(CHOICE_PREF, function obs(subj, topic, data) { + Services.prefs.removeObserver(CHOICE_PREF, obs); + resolve(); + }, false); + } + Services.prefs.setBoolPref(CHOICE_PREF, userMadeChoice); + if (currentUserMadeChoice == userMadeChoice) { + resolve(); + } + }); +} + +function suggestionsPresent() { + let controller = gURLBar.popup.input.controller; + let matchCount = controller.matchCount; + for (let i = 0; i < matchCount; i++) { + let url = controller.getValueAt(i); + let mozActionMatch = url.match(/^moz-action:([^,]+),(.*)$/); + if (mozActionMatch) { + let [, type, paramStr] = mozActionMatch; + let params = JSON.parse(paramStr); + if (type == "searchengine" && "searchSuggestion" in params) { + return true; + } + } + } + return false; +} + +function assertVisible(visible, win=window) { + let style = + win.getComputedStyle(win.gURLBar.popup.searchSuggestionsNotification); + Assert.equal(style.visibility, visible ? "visible" : "collapse"); +} + +function promiseTransition(win=window) { + return new Promise(resolve => { + win.gURLBar.popup.addEventListener("transitionend", function onEnd() { + win.gURLBar.popup.removeEventListener("transitionend", onEnd, true); + // The urlbar needs to handle the transitionend first, but that happens + // naturally since promises are resolved at the end of the current tick. + resolve(); + }, true); + }); +} |