browser_onbeforeunload_nested_with_delay.js (1824B)
1 "use strict"; 2 3 add_task(async function () { 4 const outer = 5 "http://mochi.test:8888/browser/docshell/test/browser/file_onbeforeunload_nested_outer.html"; 6 await BrowserTestUtils.withNewTab(outer, async browser => { 7 let inner = browser.browsingContext.children[0]; 8 9 // Install a beforeunload event handler that resolves a promise. 10 await SpecialPowers.spawn(inner, [], () => { 11 let { promise, resolve } = Promise.withResolvers(); 12 content.addEventListener( 13 "beforeunload", 14 e => { 15 e.preventDefault(); 16 resolve(); 17 }, 18 { 19 once: true, 20 } 21 ); 22 content.beforeunloadPromise = promise; 23 }); 24 25 // Get the promise for the beforeunload handler so we can wait for it. 26 let beforeunloadFired = SpecialPowers.spawn( 27 browser.browsingContext.children[0], 28 [], 29 () => { 30 return content.beforeunloadPromise; 31 } 32 ); 33 34 // Register whether a load has started. 35 let loaded = BrowserTestUtils.browserLoaded(browser).then(() => "loaded"); 36 37 // This is rather fragile, but we need to make sure we don't start a 38 // speculative load in the parent so let's give it the time to be done. 39 let timeout = new Promise(resolve => 40 // eslint-disable-next-line mozilla/no-arbitrary-setTimeout 41 setTimeout(() => resolve("timeout"), 3000) 42 ); 43 44 // Need to add some user interaction for beforeunload. 45 await BrowserTestUtils.synthesizeMouse("body", 0, 0, {}, inner, true); 46 47 // Try to start a speculative load in the parent. 48 BrowserTestUtils.startLoadingURIString(browser, "https://example.com/"); 49 50 await beforeunloadFired; 51 52 is( 53 await Promise.race([loaded, timeout]), 54 "timeout", 55 "Timed out because the load was blocked by beforeunload." 56 ); 57 }); 58 });