diff --git a/.eslintrc.js b/.eslintrc.js index 3c3b1605709b..f49e82a5a4fb 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -1070,7 +1070,6 @@ module.exports = { "browser/components/urlbar/tests/browser/browser_urlbar_telemetry_sponsored_topsites.js", "browser/components/urlbar/tests/browser/browser_view_resultDisplay.js", "browser/components/urlbar/tests/browser/browser_view_resultTypes_display.js", - "browser/components/urlbar/tests/browser/browser_waitForLoadOrTimeout.js", "browser/components/urlbar/tests/ext/browser/browser_ext_urlbar_clearInput.js", "browser/components/urlbar/tests/quicksuggest/QuickSuggestTestUtils.jsm ", "browser/components/urlbar/tests/quicksuggest/browser/browser_quicksuggest.js", diff --git a/browser/components/urlbar/tests/browser/browser.toml b/browser/components/urlbar/tests/browser/browser.toml index fe91d4174946..e6ea7c2a7f81 100644 --- a/browser/components/urlbar/tests/browser/browser.toml +++ b/browser/components/urlbar/tests/browser/browser.toml @@ -689,11 +689,7 @@ support-files = [ fail-if = ["a11y_checks"] # Bug 1854660 clicked element may not be focusable and/or labeled skip-if = ["os == 'linux' && asan"] # Bug 1789051 -["browser_waitForLoadOrTimeout.js"] +["browser_waitForLoadStartOrTimeout.js"] https_first_disabled = true -skip-if = [ - "tsan", # Bug 1683730 - "os == 'linux' && bits == 64 && !debug", # Bug 1666092 -] ["browser_whereToOpen.js"] diff --git a/browser/components/urlbar/tests/browser/browser_searchMode_heuristic.js b/browser/components/urlbar/tests/browser/browser_searchMode_heuristic.js index bd8f00a51291..9d288d87e641 100644 --- a/browser/components/urlbar/tests/browser/browser_searchMode_heuristic.js +++ b/browser/components/urlbar/tests/browser/browser_searchMode_heuristic.js @@ -45,10 +45,9 @@ add_task(async function noResults() { ); // Press enter. Nothing should happen. - let loadPromise = waitForLoadOrTimeout(); + let promise = waitForLoadStartOrTimeout(); EventUtils.synthesizeKey("KEY_Enter"); - let loadEvent = await loadPromise; - Assert.ok(!loadEvent, "Nothing should have loaded"); + await Assert.rejects(promise, /timed out/, "Nothing should have loaded"); await UrlbarTestUtils.promisePopupClose(window); }); @@ -90,10 +89,9 @@ add_task(async function localNoHeuristic() { Assert.ok(!result.heuristic, "Result should not be heuristic"); // Press enter. Nothing should happen. - let loadPromise = waitForLoadOrTimeout(); + let promise = waitForLoadStartOrTimeout(); EventUtils.synthesizeKey("KEY_Enter"); - let loadEvent = await loadPromise; - Assert.ok(!loadEvent, "Nothing should have loaded"); + await Assert.rejects(promise, /timed out/, "Nothing should have loaded"); await UrlbarTestUtils.promisePopupClose(window); }); diff --git a/browser/components/urlbar/tests/browser/browser_waitForLoadOrTimeout.js b/browser/components/urlbar/tests/browser/browser_waitForLoadOrTimeout.js deleted file mode 100644 index 352e37b9d06d..000000000000 --- a/browser/components/urlbar/tests/browser/browser_waitForLoadOrTimeout.js +++ /dev/null @@ -1,37 +0,0 @@ -/* Any copyright is dedicated to the Public Domain. - http://creativecommons.org/publicdomain/zero/1.0/ */ - -/** - * Tests the waitForLoadOrTimeout test helper function in head.js. - */ - -"use strict"; - -add_task(async function load() { - await BrowserTestUtils.withNewTab("about:blank", async () => { - let url = "http://example.com/"; - await UrlbarTestUtils.promiseAutocompleteResultPopup({ - window, - value: url, - }); - - let loadPromise = waitForLoadOrTimeout(); - EventUtils.synthesizeKey("KEY_Enter"); - let loadEvent = await loadPromise; - - Assert.ok(loadEvent, "Page should have loaded before timeout"); - Assert.equal( - loadEvent.target.currentURI.spec, - url, - "example.com should have loaded" - ); - }); -}); - -add_task(async function timeout() { - let loadEvent = await waitForLoadOrTimeout(); - Assert.ok( - !loadEvent, - "No page should have loaded, and timeout should have fired" - ); -}); diff --git a/browser/components/urlbar/tests/browser/browser_waitForLoadStartOrTimeout.js b/browser/components/urlbar/tests/browser/browser_waitForLoadStartOrTimeout.js new file mode 100644 index 000000000000..0fc6f0739f54 --- /dev/null +++ b/browser/components/urlbar/tests/browser/browser_waitForLoadStartOrTimeout.js @@ -0,0 +1,33 @@ +/* Any copyright is dedicated to the Public Domain. + http://creativecommons.org/publicdomain/zero/1.0/ */ + +/** + * Tests the waitForLoadStartOrTimeout test helper function in head.js. + */ + +"use strict"; + +add_task(async function load() { + await BrowserTestUtils.withNewTab("about:blank", async () => { + let url = "https://example.com/"; + await UrlbarTestUtils.promiseAutocompleteResultPopup({ + window, + value: url, + }); + + let loadPromise = waitForLoadStartOrTimeout(); + EventUtils.synthesizeKey("KEY_Enter"); + let uri = await loadPromise; + info("Page should have loaded before timeout"); + + Assert.equal(uri.spec, url, "example.com should have loaded"); + }); +}); + +add_task(async function timeout() { + await Assert.rejects( + waitForLoadStartOrTimeout(), + /timed out/, + "Should have timed out" + ); +}); diff --git a/browser/components/urlbar/tests/browser/head.js b/browser/components/urlbar/tests/browser/head.js index b825b0d862b6..b200d88e6f23 100644 --- a/browser/components/urlbar/tests/browser/head.js +++ b/browser/components/urlbar/tests/browser/head.js @@ -52,37 +52,36 @@ async function selectAndPaste(str, win = window) { } /** - * Waits for a load in any browser or a timeout, whichever comes first. + * Waits for a load starting in any browser or a timeout, whichever comes first. * * @param {window} win * The top-level browser window to listen in. * @param {number} timeoutMs * The timeout in ms. - * @returns {event|null} - * If a load event was detected before the timeout fired, then the event is - * returned. event.target will be the browser in which the load occurred. If - * the timeout fired before a load was detected, null is returned. + * @returns {Promise} resolved to the loading uri in case of load, rejected in + * case of timeout. */ -async function waitForLoadOrTimeout(win = window, timeoutMs = 1000) { - let event; +function waitForLoadStartOrTimeout(win = window, timeoutMs = 1000) { let listener; let timeout; - let eventName = "BrowserTestUtils:ContentEvent:load"; - try { - event = await Promise.race([ - new Promise(resolve => { - listener = resolve; - win.addEventListener(eventName, listener, true); - }), - new Promise(resolve => { - timeout = win.setTimeout(resolve, timeoutMs); - }), - ]); - } finally { - win.removeEventListener(eventName, listener, true); + return Promise.race([ + new Promise(resolve => { + listener = { + onStateChange(browser, webprogress, request, flags, status) { + if (flags & Ci.nsIWebProgressListener.STATE_START) { + resolve(request.QueryInterface(Ci.nsIChannel).URI); + } + }, + }; + win.gBrowser.addTabsProgressListener(listener); + }), + new Promise((resolve, reject) => { + timeout = win.setTimeout(() => reject("timed out"), timeoutMs); + }), + ]).finally(() => { + win.gBrowser.removeTabsProgressListener(listener); win.clearTimeout(timeout); - } - return event || null; + }); } /**