summaryrefslogtreecommitdiffstats
path: root/browser/components/urlbar/tests/browser/browser_stopSearchOnSelection.js
diff options
context:
space:
mode:
Diffstat (limited to 'browser/components/urlbar/tests/browser/browser_stopSearchOnSelection.js')
-rw-r--r--browser/components/urlbar/tests/browser/browser_stopSearchOnSelection.js113
1 files changed, 113 insertions, 0 deletions
diff --git a/browser/components/urlbar/tests/browser/browser_stopSearchOnSelection.js b/browser/components/urlbar/tests/browser/browser_stopSearchOnSelection.js
new file mode 100644
index 0000000000..0a1ef1b057
--- /dev/null
+++ b/browser/components/urlbar/tests/browser/browser_stopSearchOnSelection.js
@@ -0,0 +1,113 @@
+/* eslint-disable mozilla/no-arbitrary-setTimeout */
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/publicdomain/zero/1.0/ */
+
+/**
+ * This tests that when a search is stopped due to the user selecting a result,
+ * the view doesn't update after that.
+ */
+
+"use strict";
+
+const TEST_ENGINE_BASENAME = "searchSuggestionEngineSlow.xml";
+
+// This should match the `timeout` query param used in the suggestions URL in
+// the test engine.
+const TEST_ENGINE_SUGGESTIONS_TIMEOUT = 3000;
+
+// The number of suggestions returned by the test engine.
+const TEST_ENGINE_NUM_EXPECTED_RESULTS = 2;
+
+add_setup(async function () {
+ await PlacesUtils.history.clear();
+ await SpecialPowers.pushPrefEnv({
+ set: [["browser.urlbar.suggest.searches", true]],
+ });
+ // Add a test search engine that returns suggestions on a delay.
+ let engine = await SearchTestUtils.promiseNewSearchEngine({
+ url: getRootDirectory(gTestPath) + TEST_ENGINE_BASENAME,
+ setAsDefault: true,
+ });
+ await Services.search.moveEngine(engine, 0);
+ registerCleanupFunction(async () => {
+ await PlacesUtils.history.clear();
+ });
+});
+
+add_task(async function mainTest() {
+ // Open a tab that will match the search string below so that we're guaranteed
+ // to have more than one result (the heuristic result) so that we can change
+ // the selected result. We open a tab instead of adding a page in history
+ // because open tabs are kept in a memory SQLite table, so open-tab results
+ // are more likely than history results to be fetched before our slow search
+ // suggestions. This is important when the test runs on slow debug builds on
+ // slow machines.
+ await BrowserTestUtils.withNewTab("http://example.com/", async () => {
+ await BrowserTestUtils.withNewTab("about:blank", async () => {
+ // Do an initial search. There should be 4 results: heuristic, open tab,
+ // and the two suggestions.
+ await UrlbarTestUtils.promiseAutocompleteResultPopup({
+ window,
+ value: "amp",
+ });
+ await TestUtils.waitForCondition(() => {
+ return (
+ UrlbarTestUtils.getResultCount(window) ==
+ 2 + TEST_ENGINE_NUM_EXPECTED_RESULTS
+ );
+ });
+
+ // Type a character to start a new search. The new search should still
+ // match the open tab so that the open-tab result appears again.
+ EventUtils.synthesizeKey("l");
+
+ // There should be 2 results immediately: heuristic and open tab.
+ await TestUtils.waitForCondition(() => {
+ return UrlbarTestUtils.getResultCount(window) == 2;
+ });
+
+ // Before the search completes, change the selected result. Pressing only
+ // the down arrow key ends up selecting the first one-off on Linux debug
+ // builds on the infrastructure for some reason, so arrow back up to
+ // select the heuristic result again. The important thing is to change
+ // the selection. It doesn't matter which result ends up selected.
+ EventUtils.synthesizeKey("KEY_ArrowDown");
+ EventUtils.synthesizeKey("KEY_ArrowUp");
+
+ // Wait for the new search to complete. It should be canceled due to the
+ // selection change, but it should still complete.
+ await UrlbarTestUtils.promiseSearchComplete(window);
+
+ // To make absolutely sure the suggestions don't appear after the search
+ // completes, wait a bit.
+ await new Promise(r =>
+ setTimeout(r, 1 + TEST_ENGINE_SUGGESTIONS_TIMEOUT)
+ );
+
+ // The heuristic result should reflect the new search, "ampl".
+ let result = await UrlbarTestUtils.getDetailsOfResultAt(window, 0);
+ Assert.equal(
+ result.type,
+ UrlbarUtils.RESULT_TYPE.SEARCH,
+ "Should have the correct result type"
+ );
+ Assert.equal(
+ result.searchParams.query,
+ "ampl",
+ "Should have the correct query"
+ );
+
+ // None of the other results should be "ampl" suggestions, i.e., amplfoo
+ // and amplbar should not be in the results.
+ let count = UrlbarTestUtils.getResultCount(window);
+ for (let i = 1; i < count; i++) {
+ result = await UrlbarTestUtils.getDetailsOfResultAt(window, i);
+ Assert.ok(
+ result.type != UrlbarUtils.RESULT_TYPE.SEARCH ||
+ !["amplfoo", "amplbar"].includes(result.searchParams.suggestion),
+ "Suggestions should not contain the typed l char"
+ );
+ }
+ });
+ });
+});