summaryrefslogtreecommitdiffstats
path: root/browser/components/urlbar/tests/browser-updateResults/browser_noUpdateResultsFromOtherProviders.js
diff options
context:
space:
mode:
Diffstat (limited to 'browser/components/urlbar/tests/browser-updateResults/browser_noUpdateResultsFromOtherProviders.js')
-rw-r--r--browser/components/urlbar/tests/browser-updateResults/browser_noUpdateResultsFromOtherProviders.js128
1 files changed, 128 insertions, 0 deletions
diff --git a/browser/components/urlbar/tests/browser-updateResults/browser_noUpdateResultsFromOtherProviders.js b/browser/components/urlbar/tests/browser-updateResults/browser_noUpdateResultsFromOtherProviders.js
new file mode 100644
index 0000000000..2757cccbeb
--- /dev/null
+++ b/browser/components/urlbar/tests/browser-updateResults/browser_noUpdateResultsFromOtherProviders.js
@@ -0,0 +1,128 @@
+/* Any copyright is dedicated to the Public Domain.
+ http://creativecommons.org/publicdomain/zero/1.0/ */
+
+// This test makes sure that when the view updates itself it doesn't try to
+// update a row with a new result from a different provider. We avoid that
+// because it's a cause of results flickering.
+
+"use strict";
+
+add_task(async function test() {
+ // This slow provider is used to delay the end of the query.
+ let slowProvider = new UrlbarTestUtils.TestProvider({
+ results: [],
+ priority: 10,
+ addTimeout: 1000,
+ });
+
+ // We'll run a first query with this provider to generate results, that should
+ // be overriden by results from the second provider.
+ let firstProvider = new UrlbarTestUtils.TestProvider({
+ results: [
+ new UrlbarResult(
+ UrlbarUtils.RESULT_TYPE.URL,
+ UrlbarUtils.RESULT_SOURCE.HISTORY,
+ { url: "https://mozilla.org/c" }
+ ),
+ new UrlbarResult(
+ UrlbarUtils.RESULT_TYPE.URL,
+ UrlbarUtils.RESULT_SOURCE.HISTORY,
+ { url: "https://mozilla.org/d" }
+ ),
+ ],
+ priority: 10,
+ });
+
+ // Then we'll run a second query with this provider, the results should not
+ // immediately replace the ones from the first provider, but rather be
+ // appended, until the query is done or the stale timer elapses.
+ let secondProvider = new UrlbarTestUtils.TestProvider({
+ results: [
+ new UrlbarResult(
+ UrlbarUtils.RESULT_TYPE.URL,
+ UrlbarUtils.RESULT_SOURCE.HISTORY,
+ { url: "https://mozilla.org/c" }
+ ),
+ new UrlbarResult(
+ UrlbarUtils.RESULT_TYPE.URL,
+ UrlbarUtils.RESULT_SOURCE.HISTORY,
+ { url: "https://mozilla.org/d" }
+ ),
+ ],
+ priority: 10,
+ });
+
+ UrlbarProvidersManager.registerProvider(slowProvider);
+ UrlbarProvidersManager.registerProvider(firstProvider);
+ function cleanup() {
+ UrlbarProvidersManager.unregisterProvider(slowProvider);
+ UrlbarProvidersManager.unregisterProvider(firstProvider);
+ UrlbarProvidersManager.unregisterProvider(secondProvider);
+ }
+ registerCleanupFunction(cleanup);
+
+ // Execute the first query.
+ await UrlbarTestUtils.promiseAutocompleteResultPopup({
+ window,
+ value: "moz",
+ });
+
+ // Now run the second query but don't wait for it to finish, we want to
+ // observe the view contents along the way.
+ UrlbarProvidersManager.unregisterProvider(firstProvider);
+ UrlbarProvidersManager.registerProvider(secondProvider);
+ let hasAtLeast4Children = BrowserTestUtils.waitForMutationCondition(
+ UrlbarTestUtils.getResultsContainer(window),
+ { childList: true },
+ () => UrlbarTestUtils.getResultCount(window) == 4
+ );
+ let queryPromise = UrlbarTestUtils.promiseAutocompleteResultPopup({
+ window,
+ value: "moz",
+ });
+ await hasAtLeast4Children;
+ // At this point we have the old results marked as "stale", and the new ones.
+ Assert.equal(
+ UrlbarTestUtils.getResultCount(window),
+ 4,
+ "There should be 4 results"
+ );
+ Assert.ok(
+ UrlbarTestUtils.getRowAt(window, 0).hasAttribute("stale"),
+ "Should be stale"
+ );
+ Assert.ok(
+ UrlbarTestUtils.getRowAt(window, 1).hasAttribute("stale"),
+ "Should be stale"
+ );
+ Assert.ok(
+ !UrlbarTestUtils.getRowAt(window, 2).hasAttribute("stale"),
+ "Should not be stale"
+ );
+ Assert.ok(
+ !UrlbarTestUtils.getRowAt(window, 3).hasAttribute("stale"),
+ "Should not be stale"
+ );
+
+ // Now wait for the query end, this should remove stale results.
+ await queryPromise;
+
+ Assert.equal(
+ UrlbarTestUtils.getResultCount(window),
+ 2,
+ "There should be 2 results"
+ );
+ Assert.ok(
+ !UrlbarTestUtils.getRowAt(window, 0).hasAttribute("stale"),
+ "Should not be stale"
+ );
+ Assert.ok(
+ !UrlbarTestUtils.getRowAt(window, 1).hasAttribute("stale"),
+ "Should not be stale"
+ );
+
+ await UrlbarTestUtils.promisePopupClose(window);
+ gURLBar.handleRevert();
+
+ cleanup();
+});