summaryrefslogtreecommitdiffstats
path: root/browser/components/urlbar/tests/browser/browser_autocomplete_enter_race.js
diff options
context:
space:
mode:
Diffstat (limited to 'browser/components/urlbar/tests/browser/browser_autocomplete_enter_race.js')
-rw-r--r--browser/components/urlbar/tests/browser/browser_autocomplete_enter_race.js193
1 files changed, 193 insertions, 0 deletions
diff --git a/browser/components/urlbar/tests/browser/browser_autocomplete_enter_race.js b/browser/components/urlbar/tests/browser/browser_autocomplete_enter_race.js
new file mode 100644
index 0000000000..a684c60e5b
--- /dev/null
+++ b/browser/components/urlbar/tests/browser/browser_autocomplete_enter_race.js
@@ -0,0 +1,193 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/publicdomain/zero/1.0/ */
+
+"use strict";
+
+/**
+ * Tests what happens when the enter key is pressed quickly after entering text.
+ */
+
+// The order of these tests matters!
+
+add_setup(async function () {
+ let bm = await PlacesUtils.bookmarks.insert({
+ parentGuid: PlacesUtils.bookmarks.unfiledGuid,
+ url: "http://example.com/?q=%s",
+ title: "test",
+ });
+ registerCleanupFunction(async function () {
+ await PlacesUtils.bookmarks.remove(bm);
+ await PlacesUtils.history.clear();
+ });
+ // Needs at least one success.
+ ok(true, "Setup complete");
+});
+
+add_task(
+ taskWithNewTab(async function test_loadSite() {
+ await SpecialPowers.pushPrefEnv({
+ set: [["browser.urlbar.autofill", false]],
+ });
+ await UrlbarTestUtils.promiseAutocompleteResultPopup({
+ window,
+ value: "example.co",
+ });
+ gURLBar.focus();
+ EventUtils.sendString("m");
+ EventUtils.synthesizeKey("KEY_Enter");
+ info("wait for the page to load");
+ await BrowserTestUtils.browserLoaded(
+ gBrowser.selectedTab.linkedBrowser,
+ false,
+ "http://example.com/"
+ );
+ await SpecialPowers.popPrefEnv();
+ })
+);
+
+add_task(
+ taskWithNewTab(async function test_sametext() {
+ await UrlbarTestUtils.promiseAutocompleteResultPopup({
+ window,
+ value: "example.com",
+ fireInputEvent: true,
+ });
+
+ // Simulate re-entering the same text searched the last time. This may happen
+ // through a copy paste, but clipboard handling is not much reliable, so just
+ // fire an input event.
+ info("synthesize input event");
+ let event = document.createEvent("Events");
+ event.initEvent("input", true, true);
+ gURLBar.inputField.dispatchEvent(event);
+ EventUtils.synthesizeKey("KEY_Enter");
+
+ info("wait for the page to load");
+ await BrowserTestUtils.browserLoaded(
+ gBrowser.selectedTab.linkedBrowser,
+ false,
+ "http://example.com/"
+ );
+ })
+);
+
+add_task(
+ taskWithNewTab(async function test_after_empty_search() {
+ await UrlbarTestUtils.promiseAutocompleteResultPopup({
+ window,
+ value: "",
+ });
+ gURLBar.focus();
+ gURLBar.value = "e";
+ EventUtils.synthesizeKey("x");
+ EventUtils.synthesizeKey("KEY_Enter");
+
+ info("wait for the page to load");
+ await BrowserTestUtils.browserLoaded(
+ gBrowser.selectedTab.linkedBrowser,
+ false,
+ "http://example.com/"
+ );
+ })
+);
+
+add_task(
+ taskWithNewTab(async function test_disabled_ac() {
+ // Disable autocomplete.
+ let suggestHistory = Preferences.get("browser.urlbar.suggest.history");
+ Preferences.set("browser.urlbar.suggest.history", false);
+ let suggestBookmarks = Preferences.get("browser.urlbar.suggest.bookmark");
+ Preferences.set("browser.urlbar.suggest.bookmark", false);
+ let suggestOpenPages = Preferences.get("browser.urlbar.suggest.openpage");
+ Preferences.set("browser.urlbar.suggest.openpage", false);
+
+ await SearchTestUtils.installSearchExtension();
+
+ let engine = Services.search.getEngineByName("Example");
+ let originalEngine = await Services.search.getDefault();
+ await Services.search.setDefault(
+ engine,
+ Ci.nsISearchService.CHANGE_REASON_UNKNOWN
+ );
+
+ async function cleanup() {
+ Preferences.set("browser.urlbar.suggest.history", suggestHistory);
+ Preferences.set("browser.urlbar.suggest.bookmark", suggestBookmarks);
+ Preferences.set("browser.urlbar.suggest.openpage", suggestOpenPages);
+
+ await Services.search.setDefault(
+ originalEngine,
+ Ci.nsISearchService.CHANGE_REASON_UNKNOWN
+ );
+ }
+ registerCleanupFunction(cleanup);
+
+ gURLBar.focus();
+ gURLBar.value = "e";
+ EventUtils.sendString("x");
+ EventUtils.synthesizeKey("KEY_Enter");
+
+ info("wait for the page to load");
+ await BrowserTestUtils.browserLoaded(
+ gBrowser.selectedTab.linkedBrowser,
+ false,
+ "https://example.com/?q=ex"
+ );
+ await cleanup();
+ })
+);
+
+// Tests that setting a high value for browser.urlbar.delay does not delay the
+// fetching of heuristic results.
+add_task(
+ taskWithNewTab(async function test_delay() {
+ // This is needed to clear the current value, otherwise autocomplete may think
+ // the user removed text from the end.
+ await UrlbarTestUtils.promiseAutocompleteResultPopup({
+ window,
+ value: "",
+ });
+ await UrlbarTestUtils.promisePopupClose(window);
+
+ // Set a large delay.
+ const TIMEOUT = 3000;
+ let delay = UrlbarPrefs.get("delay");
+ UrlbarPrefs.set("delay", TIMEOUT);
+ registerCleanupFunction(function () {
+ UrlbarPrefs.set("delay", delay);
+ });
+
+ gURLBar.focus();
+ gURLBar.value = "e";
+ let recievedResult = new Promise(resolve => {
+ gURLBar.controller.addQueryListener({
+ onQueryResults(queryContext) {
+ gURLBar.controller.removeQueryListener(this);
+ Assert.ok(
+ queryContext.heuristicResult,
+ "Recieved a heuristic result."
+ );
+ Assert.equal(
+ queryContext.searchString,
+ "ex",
+ "The heuristic result is based on the correct search string."
+ );
+ resolve();
+ },
+ });
+ });
+ let start = Cu.now();
+ EventUtils.sendString("x");
+ EventUtils.synthesizeKey("KEY_Enter");
+ await recievedResult;
+ Assert.ok(Cu.now() - start < TIMEOUT);
+ })
+);
+
+// The main reason for running each test task in a new tab that's closed when
+// the task finishes is to avoid switch-to-tab results.
+function taskWithNewTab(fn) {
+ return async function () {
+ await BrowserTestUtils.withNewTab("about:blank", fn);
+ };
+}