diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-05-15 03:35:49 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-05-15 03:35:49 +0000 |
commit | d8bbc7858622b6d9c278469aab701ca0b609cddf (patch) | |
tree | eff41dc61d9f714852212739e6b3738b82a2af87 /docshell/test/browser/browser_onbeforeunload_nested_with_delay.js | |
parent | Releasing progress-linux version 125.0.3-1~progress7.99u1. (diff) | |
download | firefox-d8bbc7858622b6d9c278469aab701ca0b609cddf.tar.xz firefox-d8bbc7858622b6d9c278469aab701ca0b609cddf.zip |
Merging upstream version 126.0.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'docshell/test/browser/browser_onbeforeunload_nested_with_delay.js')
-rw-r--r-- | docshell/test/browser/browser_onbeforeunload_nested_with_delay.js | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/docshell/test/browser/browser_onbeforeunload_nested_with_delay.js b/docshell/test/browser/browser_onbeforeunload_nested_with_delay.js new file mode 100644 index 0000000000..409c73d0b7 --- /dev/null +++ b/docshell/test/browser/browser_onbeforeunload_nested_with_delay.js @@ -0,0 +1,58 @@ +"use strict"; + +add_task(async function () { + const outer = + "http://mochi.test:8888/browser/docshell/test/browser/file_onbeforeunload_nested_outer.html"; + await BrowserTestUtils.withNewTab(outer, async browser => { + let inner = browser.browsingContext.children[0]; + + // Install a beforeunload event handler that resolves a promise. + await SpecialPowers.spawn(inner, [], () => { + let { promise, resolve } = Promise.withResolvers(); + content.addEventListener( + "beforeunload", + e => { + e.preventDefault(); + resolve(); + }, + { + once: true, + } + ); + content.beforeunloadPromise = promise; + }); + + // Get the promise for the beforeunload handler so we can wait for it. + let beforeunloadFired = SpecialPowers.spawn( + browser.browsingContext.children[0], + [], + () => { + return content.beforeunloadPromise; + } + ); + + // Register whether a load has started. + let loaded = BrowserTestUtils.browserLoaded(browser).then(() => "loaded"); + + // This is rather fragile, but we need to make sure we don't start a + // speculative load in the parent so let's give it the time to be done. + let timeout = new Promise(resolve => + // eslint-disable-next-line mozilla/no-arbitrary-setTimeout + setTimeout(() => resolve("timeout"), 3000) + ); + + // Need to add some user interaction for beforeunload. + await BrowserTestUtils.synthesizeMouse("body", 0, 0, {}, inner, true); + + // Try to start a speculative load in the parent. + BrowserTestUtils.startLoadingURIString(browser, "https://example.com/"); + + await beforeunloadFired; + + is( + await Promise.race([loaded, timeout]), + "timeout", + "Timed out because the load was blocked by beforeunload." + ); + }); +}); |