Source code

Revision control

Copy as Markdown

Other Tools

Test Info: Warnings

/* eslint-disable mozilla/no-arbitrary-setTimeout */
/* Any copyright is dedicated to the Public Domain.
/**
* 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"
);
}
});
});
});