summaryrefslogtreecommitdiffstats
path: root/browser/components/urlbar/tests/browser/browser_heuristicNotAddedFirst.js
diff options
context:
space:
mode:
Diffstat (limited to 'browser/components/urlbar/tests/browser/browser_heuristicNotAddedFirst.js')
-rw-r--r--browser/components/urlbar/tests/browser/browser_heuristicNotAddedFirst.js159
1 files changed, 159 insertions, 0 deletions
diff --git a/browser/components/urlbar/tests/browser/browser_heuristicNotAddedFirst.js b/browser/components/urlbar/tests/browser/browser_heuristicNotAddedFirst.js
new file mode 100644
index 0000000000..fa7c65b378
--- /dev/null
+++ b/browser/components/urlbar/tests/browser/browser_heuristicNotAddedFirst.js
@@ -0,0 +1,159 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/publicdomain/zero/1.0/ */
+
+// When the heuristic result is not the first result added, it should still be
+// selected.
+
+"use strict";
+
+// When the heuristic result is not the first result added, it should still be
+// selected.
+add_task(async function slowHeuristicSelected() {
+ // First, add a provider that adds a heuristic result on a delay. Both this
+ // provider and the one below have a high priority so that only they are used
+ // during the test.
+ let engine = await Services.search.getDefault();
+ let heuristicResult = new UrlbarResult(
+ UrlbarUtils.RESULT_TYPE.SEARCH,
+ UrlbarUtils.RESULT_SOURCE.SEARCH,
+ {
+ suggestion: "test",
+ engine: engine.name,
+ }
+ );
+ heuristicResult.heuristic = true;
+ let heuristicProvider = new UrlbarTestUtils.TestProvider({
+ results: [heuristicResult],
+ name: "heuristicProvider",
+ priority: Infinity,
+ addTimeout: 500,
+ });
+ UrlbarProvidersManager.registerProvider(heuristicProvider);
+
+ // Second, add another provider that adds a non-heuristic result immediately
+ // with suggestedIndex = 1.
+ let nonHeuristicResult = makeTipResult();
+ nonHeuristicResult.suggestedIndex = 1;
+ let nonHeuristicProvider = new UrlbarTestUtils.TestProvider({
+ results: [nonHeuristicResult],
+ name: "nonHeuristicProvider",
+ priority: Infinity,
+ });
+ UrlbarProvidersManager.registerProvider(nonHeuristicProvider);
+
+ // Do a search.
+ const win = await BrowserTestUtils.openNewBrowserWindow();
+ await UrlbarTestUtils.promiseAutocompleteResultPopup({
+ value: "test",
+ window: win,
+ });
+
+ // The first result should be the heuristic and it should be selected.
+ let actualHeuristic = await UrlbarTestUtils.getDetailsOfResultAt(win, 0);
+ Assert.equal(actualHeuristic.type, UrlbarUtils.RESULT_TYPE.SEARCH);
+ Assert.equal(UrlbarTestUtils.getSelectedElementIndex(win), 0);
+
+ // Check the second result for good measure.
+ let actualNonHeuristic = await UrlbarTestUtils.getDetailsOfResultAt(win, 1);
+ Assert.equal(actualNonHeuristic.type, UrlbarUtils.RESULT_TYPE.TIP);
+
+ await UrlbarTestUtils.promisePopupClose(win);
+ UrlbarProvidersManager.unregisterProvider(heuristicProvider);
+ UrlbarProvidersManager.unregisterProvider(nonHeuristicProvider);
+ await BrowserTestUtils.closeWindow(win);
+});
+
+// When the heuristic result is not the first result added but a one-off search
+// button is already selected, the heuristic result should not steal the
+// selection from the one-off button.
+add_task(async function oneOffRemainsSelected() {
+ // First, add a provider that adds a heuristic result on a delay. Both this
+ // provider and the one below have a high priority so that only they are used
+ // during the test.
+ let engine = await Services.search.getDefault();
+ let heuristicResult = new UrlbarResult(
+ UrlbarUtils.RESULT_TYPE.SEARCH,
+ UrlbarUtils.RESULT_SOURCE.SEARCH,
+ {
+ suggestion: "test",
+ engine: engine.name,
+ }
+ );
+ heuristicResult.heuristic = true;
+ let heuristicProvider = new UrlbarTestUtils.TestProvider({
+ results: [heuristicResult],
+ name: "heuristicProvider",
+ priority: Infinity,
+ addTimeout: 500,
+ });
+ UrlbarProvidersManager.registerProvider(heuristicProvider);
+
+ // Second, add another provider that adds a non-heuristic result immediately
+ // with suggestedIndex = 1.
+ let nonHeuristicResult = makeTipResult();
+ nonHeuristicResult.suggestedIndex = 1;
+ let nonHeuristicProvider = new UrlbarTestUtils.TestProvider({
+ results: [nonHeuristicResult],
+ name: "nonHeuristicProvider",
+ priority: Infinity,
+ });
+ UrlbarProvidersManager.registerProvider(nonHeuristicProvider);
+
+ // Do a search but don't wait for it to finish.
+ const win = await BrowserTestUtils.openNewBrowserWindow();
+ let searchPromise = UrlbarTestUtils.promiseAutocompleteResultPopup({
+ value: "test",
+ window: win,
+ });
+
+ // When the view opens, press the up arrow key to select the one-off search
+ // settings button. There's no point in selecting instead the non-heuristic
+ // result because once we do that, the search is canceled, and the heuristic
+ // result will never be added.
+ await UrlbarTestUtils.promisePopupOpen(win, () => {});
+ EventUtils.synthesizeKey("KEY_ArrowUp", {}, win);
+
+ // Wait for the search to finish.
+ await searchPromise;
+
+ // The first result should be the heuristic.
+ let actualHeuristic = await UrlbarTestUtils.getDetailsOfResultAt(win, 0);
+ Assert.equal(actualHeuristic.type, UrlbarUtils.RESULT_TYPE.SEARCH);
+
+ // Check the second result for good measure.
+ let actualNonHeuristic = await UrlbarTestUtils.getDetailsOfResultAt(win, 1);
+ Assert.equal(actualNonHeuristic.type, UrlbarUtils.RESULT_TYPE.TIP);
+
+ // No result should be selected.
+ Assert.equal(UrlbarTestUtils.getSelectedElement(win), null);
+ Assert.equal(UrlbarTestUtils.getSelectedElementIndex(win), -1);
+
+ // The one-off settings button should be selected.
+ Assert.equal(
+ win.gURLBar.view.oneOffSearchButtons.selectedButton,
+ win.gURLBar.view.oneOffSearchButtons.settingsButton
+ );
+
+ await UrlbarTestUtils.promisePopupClose(win);
+ UrlbarProvidersManager.unregisterProvider(heuristicProvider);
+ UrlbarProvidersManager.unregisterProvider(nonHeuristicProvider);
+ await BrowserTestUtils.closeWindow(win);
+});
+
+function makeTipResult() {
+ return new UrlbarResult(
+ UrlbarUtils.RESULT_TYPE.TIP,
+ UrlbarUtils.RESULT_SOURCE.OTHER_LOCAL,
+ {
+ helpUrl: "http://example.com/",
+ type: "test",
+ titleL10n: { id: "urlbar-search-tips-confirm" },
+ buttons: [
+ {
+ url: "http://example.com/",
+ l10n: { id: "urlbar-search-tips-confirm" },
+ },
+ ],
+ }
+ );
+}