diff options
Diffstat (limited to 'browser/components/urlbar/tests/browser/browser_editAndEnterWithSlowQuery.js')
-rw-r--r-- | browser/components/urlbar/tests/browser/browser_editAndEnterWithSlowQuery.js | 476 |
1 files changed, 476 insertions, 0 deletions
diff --git a/browser/components/urlbar/tests/browser/browser_editAndEnterWithSlowQuery.js b/browser/components/urlbar/tests/browser/browser_editAndEnterWithSlowQuery.js new file mode 100644 index 0000000000..63e799e178 --- /dev/null +++ b/browser/components/urlbar/tests/browser/browser_editAndEnterWithSlowQuery.js @@ -0,0 +1,476 @@ +/* Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/publicdomain/zero/1.0/ */ + +// Test when a user enters a different URL than the result being selected. + +"use strict"; + +const ORIGINAL_CHUNK_RESULTS_DELAY = + UrlbarProvidersManager.CHUNK_RESULTS_DELAY_MS; + +add_setup(async function setup() { + let suggestionsEngine = await SearchTestUtils.promiseNewSearchEngine({ + url: getRootDirectory(gTestPath) + "searchSuggestionEngine.xml", + }); + await SearchTestUtils.installSearchExtension( + { + name: "Test", + keyword: "@test", + }, + { setAsDefault: true } + ); + await Services.search.moveEngine(suggestionsEngine, 0); + + registerCleanupFunction(async () => { + UrlbarProvidersManager.CHUNK_RESULTS_DELAY_MS = + ORIGINAL_CHUNK_RESULTS_DELAY; + UrlbarPrefs.clear("delay"); + }); + + await SpecialPowers.pushPrefEnv({ + set: [ + ["browser.urlbar.suggest.quickactions", false], + ["browser.urlbar.trimHttps", false], + [ + "browser.newtabpage.activity-stream.asrouter.userprefs.cfr.features", + false, + ], + ], + }); +}); + +add_task(async function test_url_type() { + const testCases = [ + { + testURL: "https://example.com/123", + displayedURL: "https://example.com/123", + trimURLs: true, + }, + { + testURL: "https://example.com/123", + displayedURL: "https://example.com/123", + trimURLs: false, + }, + { + // eslint-disable-next-line @microsoft/sdl/no-insecure-url + testURL: "http://example.com/123", + displayedURL: "example.com/123", + trimURLs: true, + }, + { + // eslint-disable-next-line @microsoft/sdl/no-insecure-url + testURL: "http://example.com/123", + // eslint-disable-next-line @microsoft/sdl/no-insecure-url + displayedURL: "http://example.com/123", + trimURLs: false, + }, + ]; + + for (const { testURL, displayedURL, trimURLs } of testCases) { + info("Setup: " + JSON.stringify({ testURL, displayedURL, trimURLs })); + await SpecialPowers.pushPrefEnv({ + set: [["browser.urlbar.trimURLs", trimURLs]], + }); + await PlacesTestUtils.addVisits([testURL]); + await PlacesFrecencyRecalculator.recalculateAnyOutdatedFrecencies(); + + info("Show results"); + await UrlbarTestUtils.promiseAutocompleteResultPopup({ + window, + value: "exa", + fireInputEvent: true, + }); + + info("Find target result"); + let targetRowIndex = await findTargetRowIndex( + result => + result.type == UrlbarUtils.RESULT_TYPE.URL && result.url == testURL + ); + + info("Select a visit suggestion"); + UrlbarTestUtils.setSelectedRowIndex(window, targetRowIndex); + Assert.equal(window.gURLBar.value, displayedURL); + + info("Change the delay time to avoid updating results"); + const DELAY = 10000; + UrlbarProvidersManager.CHUNK_RESULTS_DELAY_MS = DELAY; + UrlbarPrefs.set("delay", DELAY); + + info("Edit text on the URL bar"); + window.gURLBar.setSelectionRange( + Number.MAX_SAFE_INTEGER, + Number.MAX_SAFE_INTEGER + ); + EventUtils.synthesizeKey("KEY_Backspace"); + Assert.ok(gURLBar.valueIsTyped); + Assert.equal(UrlbarTestUtils.getSelectedRowIndex(window), targetRowIndex); + let selectedResult = UrlbarTestUtils.getSelectedRow(window).result; + Assert.equal(selectedResult.type, UrlbarUtils.RESULT_TYPE.URL); + + info("Enter before updating"); + let loadingURL = testURL.substring(0, testURL.length - 1); + let onLoad = BrowserTestUtils.browserLoaded( + gBrowser.selectedBrowser, + false, + loadingURL + ); + EventUtils.synthesizeKey("KEY_Enter"); + await onLoad; + Assert.equal(gBrowser.currentURI.spec, loadingURL); + + info("Clean up"); + await PlacesUtils.history.clear(); + UrlbarProvidersManager.CHUNK_RESULTS_DELAY_MS = + ORIGINAL_CHUNK_RESULTS_DELAY; + UrlbarPrefs.clear("delay"); + await SpecialPowers.popPrefEnv(); + } +}); + +add_task(async function test_search_type() { + info("Show results"); + await UrlbarTestUtils.promiseAutocompleteResultPopup({ + window, + value: "123", + fireInputEvent: true, + }); + await UrlbarTestUtils.enterSearchMode(window); + + info("Find target result"); + let targetRowIndex = await findTargetRowIndex( + result => + result.type == UrlbarUtils.RESULT_TYPE.SEARCH && + result.url == "http://mochi.test:8888/?terms=123foo" + ); + + info("Select a search suggestion"); + UrlbarTestUtils.setSelectedRowIndex(window, targetRowIndex); + Assert.equal(window.gURLBar.value, "123foo"); + + info("Change the delay time to avoid updating results"); + const DELAY = 10000; + UrlbarProvidersManager.CHUNK_RESULTS_DELAY_MS = DELAY; + UrlbarPrefs.set("delay", DELAY); + + info("Edit text on the URL bar"); + window.gURLBar.setSelectionRange( + Number.MAX_SAFE_INTEGER, + Number.MAX_SAFE_INTEGER + ); + EventUtils.synthesizeKey("KEY_Backspace"); + Assert.ok(gURLBar.valueIsTyped); + Assert.equal(UrlbarTestUtils.getSelectedRowIndex(window), targetRowIndex); + let selectedResult = UrlbarTestUtils.getSelectedRow(window).result; + Assert.equal(selectedResult.type, UrlbarUtils.RESULT_TYPE.SEARCH); + + info("Enter before updating"); + let loadingURL = "http://mochi.test:8888/?terms=123fo"; + let onLoad = BrowserTestUtils.browserLoaded( + gBrowser.selectedBrowser, + false, + loadingURL + ); + EventUtils.synthesizeKey("KEY_Enter"); + await onLoad; + Assert.equal(gBrowser.currentURI.spec, loadingURL); + + info("Clean up"); + await PlacesUtils.history.clear(); + UrlbarProvidersManager.CHUNK_RESULTS_DELAY_MS = ORIGINAL_CHUNK_RESULTS_DELAY; + UrlbarPrefs.clear("delay"); +}); + +add_task(async function test_keyword_type() { + info("Setup"); + await PlacesUtils.keywords.insert({ + keyword: "keyword", + url: "https://example.com/?q=%s", + }); + + info("Show results"); + await UrlbarTestUtils.promiseAutocompleteResultPopup({ + window, + value: "keyword 123", + fireInputEvent: true, + }); + + info("Find target result"); + let targetRowIndex = await findTargetRowIndex( + result => + result.type == UrlbarUtils.RESULT_TYPE.KEYWORD && + result.url == "https://example.com/?q=123" + ); + + info("Select a search suggestion"); + UrlbarTestUtils.setSelectedRowIndex(window, targetRowIndex); + Assert.equal(window.gURLBar.value, "keyword 123"); + + info("Change the delay time to avoid updating results"); + const DELAY = 10000; + UrlbarProvidersManager.CHUNK_RESULTS_DELAY_MS = DELAY; + UrlbarPrefs.set("delay", DELAY); + + info("Edit text on the URL bar"); + window.gURLBar.setSelectionRange( + Number.MAX_SAFE_INTEGER, + Number.MAX_SAFE_INTEGER + ); + EventUtils.synthesizeKey("KEY_Backspace"); + Assert.ok(gURLBar.valueIsTyped); + Assert.equal(UrlbarTestUtils.getSelectedRowIndex(window), targetRowIndex); + let selectedResult = UrlbarTestUtils.getSelectedRow(window).result; + Assert.equal(selectedResult.type, UrlbarUtils.RESULT_TYPE.KEYWORD); + + info("Enter before updating"); + let loadingURL = "https://example.com/?q=12"; + let onLoad = BrowserTestUtils.browserLoaded( + gBrowser.selectedBrowser, + false, + loadingURL + ); + EventUtils.synthesizeKey("KEY_Enter"); + await onLoad; + Assert.equal(gBrowser.currentURI.spec, loadingURL); + + info("Clean up"); + await PlacesUtils.history.clear(); + await PlacesUtils.keywords.remove("keyword"); + UrlbarProvidersManager.CHUNK_RESULTS_DELAY_MS = ORIGINAL_CHUNK_RESULTS_DELAY; + UrlbarPrefs.clear("delay"); +}); + +add_task(async function test_dynamic_type() { + info("Setup"); + await SpecialPowers.pushPrefEnv({ + set: [["browser.urlbar.unitConversion.enabled", true]], + }); + + info("Show results"); + await UrlbarTestUtils.promiseAutocompleteResultPopup({ + window, + value: "12 cm to mm", + fireInputEvent: true, + }); + + info("Find target result"); + let targetRowIndex = await findTargetRowIndex( + result => result.type == UrlbarUtils.RESULT_TYPE.DYNAMIC + ); + + info("Select a dynamic suggestion"); + UrlbarTestUtils.setSelectedRowIndex(window, targetRowIndex); + Assert.equal(window.gURLBar.value, "12 cm to mm"); + + info("Change the delay time to avoid updating results"); + const DELAY = 10000; + UrlbarProvidersManager.CHUNK_RESULTS_DELAY_MS = DELAY; + UrlbarPrefs.set("delay", DELAY); + + info("Edit text on the URL bar"); + window.gURLBar.setSelectionRange( + Number.MAX_SAFE_INTEGER, + Number.MAX_SAFE_INTEGER + ); + EventUtils.synthesizeKey("KEY_Backspace"); + Assert.ok(gURLBar.valueIsTyped); + Assert.equal(UrlbarTestUtils.getSelectedRowIndex(window), targetRowIndex); + let selectedResult = UrlbarTestUtils.getSelectedRow(window).result; + Assert.equal(selectedResult.type, UrlbarUtils.RESULT_TYPE.DYNAMIC); + + info("Enter before updating"); + // TODO: We need to show the dynamic result with different word here. + let loadingURL = "https://example.com/?q=12+cm+to+m"; + let onLoad = BrowserTestUtils.browserLoaded( + gBrowser.selectedBrowser, + false, + loadingURL + ); + EventUtils.synthesizeKey("KEY_Enter"); + await onLoad; + Assert.equal(gBrowser.currentURI.spec, loadingURL); + + info("Clean up"); + await PlacesUtils.history.clear(); + await SpecialPowers.popPrefEnv(); + UrlbarProvidersManager.CHUNK_RESULTS_DELAY_MS = ORIGINAL_CHUNK_RESULTS_DELAY; + UrlbarPrefs.clear("delay"); +}); + +add_task(async function test_omnibox_type() { + info("Setup"); + let extension = ExtensionTestUtils.loadExtension({ + manifest: { + permissions: ["tabs"], + omnibox: { + keyword: "omnibox", + }, + }, + background() { + /* global browser */ + browser.omnibox.setDefaultSuggestion({ + description: "doit", + }); + browser.omnibox.onInputEntered.addListener(text => { + browser.tabs.update({ url: `https://example.com/${text}` }); + }); + browser.omnibox.onInputChanged.addListener((text, suggest) => { + suggest([]); + }); + }, + }); + await extension.startup(); + + info("Show results"); + await UrlbarTestUtils.promiseAutocompleteResultPopup({ + window, + value: "omnibox 123", + fireInputEvent: true, + }); + + info("Find target result"); + let targetRowIndex = await findTargetRowIndex( + result => result.type == UrlbarUtils.RESULT_TYPE.OMNIBOX + ); + + info("Select an omnibox suggestion"); + UrlbarTestUtils.setSelectedRowIndex(window, targetRowIndex); + Assert.equal(window.gURLBar.value, "omnibox 123"); + + info("Change the delay time to avoid updating results"); + const DELAY = 10000; + UrlbarProvidersManager.CHUNK_RESULTS_DELAY_MS = DELAY; + UrlbarPrefs.set("delay", DELAY); + + info("Edit text on the URL bar"); + window.gURLBar.setSelectionRange( + Number.MAX_SAFE_INTEGER, + Number.MAX_SAFE_INTEGER + ); + EventUtils.synthesizeKey("KEY_Backspace"); + Assert.ok(gURLBar.valueIsTyped); + Assert.equal(UrlbarTestUtils.getSelectedRowIndex(window), targetRowIndex); + let selectedResult = UrlbarTestUtils.getSelectedRow(window).result; + Assert.equal(selectedResult.type, UrlbarUtils.RESULT_TYPE.OMNIBOX); + Assert.ok(selectedResult.heuristic); + + info("Enter before updating"); + // As this result is heuristic, should pick as it is. + let loadingURL = "https://example.com/123"; + let onLoad = BrowserTestUtils.browserLoaded( + gBrowser.selectedBrowser, + false, + loadingURL + ); + EventUtils.synthesizeKey("KEY_Enter"); + await onLoad; + Assert.equal(gBrowser.currentURI.spec, loadingURL); + + info("Clean up"); + await PlacesUtils.history.clear(); + await extension.unload(); + UrlbarProvidersManager.CHUNK_RESULTS_DELAY_MS = ORIGINAL_CHUNK_RESULTS_DELAY; + UrlbarPrefs.clear("delay"); +}); + +add_task(async function test_heuristic() { + const testCases = [ + { + testResult: new UrlbarResult( + UrlbarUtils.RESULT_TYPE.URL, + UrlbarUtils.RESULT_SOURCE.OTHER_LOCAL, + { url: "https://example.com/123" } + ), + loadingURL: "https://example.com/123", + displayedValue: "https://example.com/123", + }, + { + testResult: new UrlbarResult( + UrlbarUtils.RESULT_TYPE.SEARCH, + UrlbarUtils.RESULT_SOURCE.SEARCH, + { + engine: Services.search.defaultEngine.name, + query: "heuristic_search", + } + ), + loadingURL: "https://example.com/?q=heuristic_search", + displayedValue: "heuristic_search", + }, + ]; + + for (const { testResult, loadingURL, displayedValue } of testCases) { + info("Setup: " + JSON.stringify(testResult)); + testResult.heuristic = true; + let provider = new UrlbarTestUtils.TestProvider({ + results: [testResult], + name: "TestProviderHeuristic", + priority: Infinity, + }); + UrlbarProvidersManager.registerProvider(provider); + + info("Show results"); + await UrlbarTestUtils.promiseAutocompleteResultPopup({ + window, + value: "any query", + fireInputEvent: true, + }); + + info("Select a visit suggestion"); + const targetRowIndex = 0; + UrlbarTestUtils.setSelectedRowIndex(window, targetRowIndex); + Assert.equal(window.gURLBar.value, displayedValue); + + info("Change the delay time to avoid updating results"); + const DELAY = 10000; + UrlbarProvidersManager.CHUNK_RESULTS_DELAY_MS = DELAY; + UrlbarPrefs.set("delay", DELAY); + + info("Edit text on the URL bar"); + window.gURLBar.setSelectionRange( + Number.MAX_SAFE_INTEGER, + Number.MAX_SAFE_INTEGER + ); + EventUtils.synthesizeKey("KEY_Backspace"); + Assert.ok(gURLBar.valueIsTyped); + Assert.equal(UrlbarTestUtils.getSelectedRowIndex(window), targetRowIndex); + let selectedResult = UrlbarTestUtils.getSelectedRow(window).result; + Assert.equal(selectedResult, testResult); + Assert.equal( + window.gURLBar.value, + displayedValue.substring(0, displayedValue.length - 1) + ); + + info("Enter before updating"); + let spy = sinon.spy(UrlbarUtils, "getHeuristicResultFor"); + let onLoad = BrowserTestUtils.browserLoaded( + gBrowser.selectedBrowser, + false, + loadingURL + ); + EventUtils.synthesizeKey("KEY_Enter"); + await onLoad; + Assert.equal(gBrowser.currentURI.spec, loadingURL); + spy.restore(); + Assert.ok(!spy.called, "getHeuristicResultFor should not be called"); + + info("Clean up"); + UrlbarProvidersManager.unregisterProvider(provider); + UrlbarProvidersManager.CHUNK_RESULTS_DELAY_MS = + ORIGINAL_CHUNK_RESULTS_DELAY; + UrlbarPrefs.clear("delay"); + } +}); + +async function findTargetRowIndex(finder) { + for ( + let i = 0, count = UrlbarTestUtils.getResultCount(window); + i < count; + i++ + ) { + let result = await UrlbarTestUtils.getDetailsOfResultAt(window, i); + if (finder(result)) { + return i; + } + } + + throw new Error("Target not found"); +} |