128 lines
3.8 KiB
JavaScript
128 lines
3.8 KiB
JavaScript
/* 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();
|
|
});
|