summaryrefslogtreecommitdiffstats
path: root/browser/components/urlbar/tests/browser/browser_searchSingleWordNotification.js
diff options
context:
space:
mode:
Diffstat (limited to 'browser/components/urlbar/tests/browser/browser_searchSingleWordNotification.js')
-rw-r--r--browser/components/urlbar/tests/browser/browser_searchSingleWordNotification.js372
1 files changed, 372 insertions, 0 deletions
diff --git a/browser/components/urlbar/tests/browser/browser_searchSingleWordNotification.js b/browser/components/urlbar/tests/browser/browser_searchSingleWordNotification.js
new file mode 100644
index 0000000000..36a065d58e
--- /dev/null
+++ b/browser/components/urlbar/tests/browser/browser_searchSingleWordNotification.js
@@ -0,0 +1,372 @@
+/* eslint-disable mozilla/no-arbitrary-setTimeout */
+"use strict";
+
+let gDNSResolved = false;
+add_setup(async function () {
+ registerCleanupFunction(function () {
+ Services.prefs.clearUserPref("browser.fixup.domainwhitelist.localhost");
+ });
+});
+
+function promiseNotification(aBrowser, value, expected, input) {
+ return new Promise(resolve => {
+ let notificationBox = aBrowser.getNotificationBox(aBrowser.selectedBrowser);
+ if (expected) {
+ info("Waiting for " + value + " notification");
+ resolve(
+ BrowserTestUtils.waitForNotificationInNotificationBox(
+ notificationBox,
+ value
+ )
+ );
+ } else {
+ setTimeout(() => {
+ is(
+ notificationBox.getNotificationWithValue(value),
+ null,
+ `We are expecting to not get a notification for ${input}`
+ );
+ resolve();
+ }, 1000);
+ }
+ });
+}
+
+async function runURLBarSearchTest({
+ valueToOpen,
+ enterSearchMode,
+ expectSearch,
+ expectNotification,
+ expectDNSResolve,
+ aWindow = window,
+}) {
+ gDNSResolved = false;
+ // Test both directly setting a value and pressing enter, or setting the
+ // value through input events, like the user would do.
+ const setValueFns = [
+ value => {
+ aWindow.gURLBar.value = value;
+ if (enterSearchMode) {
+ // Ensure to open the panel.
+ UrlbarTestUtils.fireInputEvent(aWindow);
+ }
+ },
+ value => {
+ return UrlbarTestUtils.promiseAutocompleteResultPopup({
+ window: aWindow,
+ value,
+ });
+ },
+ ];
+
+ for (let i = 0; i < setValueFns.length; ++i) {
+ await setValueFns[i](valueToOpen);
+ let topic = "uri-fixup-check-dns";
+ let observer = (aSubject, aTopicInner, aData) => {
+ if (aTopicInner == topic) {
+ gDNSResolved = true;
+ }
+ };
+ Services.obs.addObserver(observer, topic);
+
+ if (enterSearchMode) {
+ if (!expectSearch) {
+ throw new Error("Must execute a search in search mode");
+ }
+ await UrlbarTestUtils.enterSearchMode(aWindow);
+ }
+
+ let expectedURI;
+ if (!expectSearch) {
+ expectedURI = "http://" + valueToOpen + "/";
+ } else {
+ expectedURI = (await Services.search.getDefault()).getSubmission(
+ valueToOpen,
+ null,
+ "keyword"
+ ).uri.spec;
+ }
+ aWindow.gURLBar.focus();
+ let docLoadPromise = BrowserTestUtils.waitForDocLoadAndStopIt(
+ expectedURI,
+ aWindow.gBrowser.selectedBrowser
+ );
+ EventUtils.synthesizeKey("VK_RETURN", {}, aWindow);
+
+ if (!enterSearchMode) {
+ await promiseNotification(
+ aWindow.gBrowser,
+ "keyword-uri-fixup",
+ expectNotification,
+ valueToOpen
+ );
+ }
+ await docLoadPromise;
+
+ if (expectNotification) {
+ let notificationBox = aWindow.gBrowser.getNotificationBox(
+ aWindow.gBrowser.selectedBrowser
+ );
+ let notification =
+ notificationBox.getNotificationWithValue("keyword-uri-fixup");
+ // Confirm the notification only on the last loop.
+ if (i == setValueFns.length - 1) {
+ docLoadPromise = BrowserTestUtils.waitForDocLoadAndStopIt(
+ "http://" + valueToOpen + "/",
+ aWindow.gBrowser.selectedBrowser
+ );
+ notification.buttonContainer.querySelector("button").click();
+ await docLoadPromise;
+ } else {
+ notificationBox.currentNotification.close();
+ }
+ }
+
+ Services.obs.removeObserver(observer, topic);
+ Assert.equal(
+ gDNSResolved,
+ expectDNSResolve,
+ `Should${expectDNSResolve ? "" : " not"} DNS resolve "${valueToOpen}"`
+ );
+ }
+}
+
+add_task(async function test_navigate_full_domain() {
+ let tab = (gBrowser.selectedTab = BrowserTestUtils.addTab(
+ gBrowser,
+ "about:blank"
+ ));
+ await BrowserTestUtils.browserLoaded(tab.linkedBrowser);
+ await runURLBarSearchTest({
+ valueToOpen: "www.singlewordtest.org",
+ expectSearch: false,
+ expectNotification: false,
+ expectDNSResolve: false,
+ });
+ gBrowser.removeTab(tab);
+});
+
+add_task(async function test_navigate_decimal_ip() {
+ let tab = (gBrowser.selectedTab = BrowserTestUtils.addTab(
+ gBrowser,
+ "about:blank"
+ ));
+ await BrowserTestUtils.browserLoaded(tab.linkedBrowser);
+ await runURLBarSearchTest({
+ valueToOpen: "1234",
+ expectSearch: true,
+ expectNotification: false,
+ expectDNSResolve: false, // Possible IP in numeric format.
+ });
+ gBrowser.removeTab(tab);
+});
+
+add_task(async function test_navigate_decimal_ip_with_path() {
+ let tab = (gBrowser.selectedTab = BrowserTestUtils.addTab(
+ gBrowser,
+ "about:blank"
+ ));
+ await BrowserTestUtils.browserLoaded(tab.linkedBrowser);
+ await runURLBarSearchTest({
+ valueToOpen: "1234/12",
+ expectSearch: true,
+ expectNotification: false,
+ expectDNSResolve: false,
+ });
+ gBrowser.removeTab(tab);
+});
+
+add_task(async function test_navigate_large_number() {
+ let tab = (gBrowser.selectedTab = BrowserTestUtils.addTab(
+ gBrowser,
+ "about:blank"
+ ));
+ await BrowserTestUtils.browserLoaded(tab.linkedBrowser);
+ await runURLBarSearchTest({
+ valueToOpen: "123456789012345",
+ expectSearch: true,
+ expectNotification: false,
+ expectDNSResolve: false, // Possible IP in numeric format.
+ });
+ gBrowser.removeTab(tab);
+});
+
+add_task(async function test_navigate_small_hex_number() {
+ let tab = (gBrowser.selectedTab = BrowserTestUtils.addTab(
+ gBrowser,
+ "about:blank"
+ ));
+ await BrowserTestUtils.browserLoaded(tab.linkedBrowser);
+ await runURLBarSearchTest({
+ valueToOpen: "0x1f00ffff",
+ expectSearch: true,
+ expectNotification: false,
+ expectDNSResolve: false, // Possible IP in numeric format.
+ });
+ gBrowser.removeTab(tab);
+});
+
+add_task(async function test_navigate_large_hex_number() {
+ let tab = (gBrowser.selectedTab = BrowserTestUtils.addTab(
+ gBrowser,
+ "about:blank"
+ ));
+ await BrowserTestUtils.browserLoaded(tab.linkedBrowser);
+ await runURLBarSearchTest({
+ valueToOpen: "0x7f0000017f000001",
+ expectSearch: true,
+ expectNotification: false,
+ expectDNSResolve: false, // Possible IP in numeric format.
+ });
+ gBrowser.removeTab(tab);
+});
+
+function get_test_function_for_localhost_with_hostname(
+ hostName,
+ isPrivate = false
+) {
+ return async function test_navigate_single_host() {
+ info(`Test ${hostName}${isPrivate ? " in Private Browsing mode" : ""}`);
+ const pref = "browser.fixup.domainwhitelist.localhost";
+ let win;
+ if (isPrivate) {
+ let promiseWin = BrowserTestUtils.waitForNewWindow();
+ win = OpenBrowserWindow({ private: true });
+ await promiseWin;
+ await SimpleTest.promiseFocus(win);
+ } else {
+ win = window;
+ }
+
+ // Remove the domain from the whitelist
+ Services.prefs.setBoolPref(pref, false);
+
+ // The notification should not appear because the default value of
+ // browser.urlbar.dnsResolveSingleWordsAfterSearch is 0
+ await BrowserTestUtils.withNewTab(
+ {
+ gBrowser: win.gBrowser,
+ url: "about:blank",
+ },
+ browser =>
+ runURLBarSearchTest({
+ valueToOpen: hostName,
+ expectSearch: true,
+ expectNotification: false,
+ expectDNSResolve: false,
+ aWindow: win,
+ })
+ );
+
+ await SpecialPowers.pushPrefEnv({
+ set: [["browser.urlbar.dnsResolveSingleWordsAfterSearch", 1]],
+ });
+
+ // The notification should appear, unless we are in private browsing mode.
+ await BrowserTestUtils.withNewTab(
+ {
+ gBrowser: win.gBrowser,
+ url: "about:blank",
+ },
+ browser =>
+ runURLBarSearchTest({
+ valueToOpen: hostName,
+ expectSearch: true,
+ expectNotification: true,
+ expectDNSResolve: true,
+ aWindow: win,
+ })
+ );
+
+ // check pref value
+ let prefValue = Services.prefs.getBoolPref(pref);
+ is(prefValue, !isPrivate, "Pref should have the correct state.");
+
+ // Now try again with the pref set.
+ // In a private window, the notification should appear again.
+ await BrowserTestUtils.withNewTab(
+ {
+ gBrowser: win.gBrowser,
+ url: "about:blank",
+ },
+ browser =>
+ runURLBarSearchTest({
+ valueToOpen: hostName,
+ expectSearch: isPrivate,
+ expectNotification: isPrivate,
+ expectDNSResolve: isPrivate,
+ aWindow: win,
+ })
+ );
+
+ if (isPrivate) {
+ info("Waiting for private window to close");
+ await BrowserTestUtils.closeWindow(win);
+ await SimpleTest.promiseFocus(window);
+ }
+
+ await SpecialPowers.popPrefEnv();
+ };
+}
+
+add_task(get_test_function_for_localhost_with_hostname("localhost"));
+add_task(get_test_function_for_localhost_with_hostname("localhost."));
+add_task(get_test_function_for_localhost_with_hostname("localhost", true));
+
+add_task(async function test_dnsResolveSingleWordsAfterSearch() {
+ await SpecialPowers.pushPrefEnv({
+ set: [
+ ["browser.urlbar.dnsResolveSingleWordsAfterSearch", 0],
+ ["browser.fixup.domainwhitelist.localhost", false],
+ ],
+ });
+ await BrowserTestUtils.withNewTab(
+ {
+ gBrowser,
+ url: "about:blank",
+ },
+ browser =>
+ runURLBarSearchTest({
+ valueToOpen: "localhost",
+ expectSearch: true,
+ expectNotification: false,
+ expectDNSResolve: false,
+ })
+ );
+ await SpecialPowers.popPrefEnv();
+});
+
+add_task(async function test_navigate_invalid_url() {
+ let tab = (gBrowser.selectedTab = BrowserTestUtils.addTab(
+ gBrowser,
+ "about:blank"
+ ));
+ await BrowserTestUtils.browserLoaded(tab.linkedBrowser);
+ await runURLBarSearchTest({
+ valueToOpen: "mozilla is awesome",
+ expectSearch: true,
+ expectNotification: false,
+ expectDNSResolve: false,
+ });
+ gBrowser.removeTab(tab);
+});
+
+add_task(async function test_search_mode() {
+ info("When in search mode we should never query the DNS");
+ await SpecialPowers.pushPrefEnv({
+ set: [["browser.search.suggest.enabled", false]],
+ });
+ let tab = (gBrowser.selectedTab = BrowserTestUtils.addTab(
+ gBrowser,
+ "about:blank"
+ ));
+ await BrowserTestUtils.browserLoaded(tab.linkedBrowser);
+ await runURLBarSearchTest({
+ enterSearchMode: true,
+ valueToOpen: "mozilla",
+ expectSearch: true,
+ expectNotification: false,
+ expectDNSResolve: false,
+ });
+ gBrowser.removeTab(tab);
+});