From 1a5132c4401e54125a6b9015cdcfa76d22933c60 Mon Sep 17 00:00:00 2001 From: Kris Maglione Date: Mon, 24 Oct 2022 22:47:51 +0000 Subject: [PATCH] Bug 1775925: Split up browser_onbeforeunload.js somewhat. r=nika This splits the parent-triggered and child-triggered unload attempts into separate tests. I could also split the tests for each subframe level into separate tests, but let's see how this does for now. Differential Revision: https://phabricator.services.mozilla.com/D159228 --- docshell/test/browser/browser.ini | 9 ++- .../browser/browser_onbeforeunload_frame.js | 45 +++++++++++++++ .../browser/browser_onbeforeunload_parent.js | 48 ++++++++++++++++ ...load.js => head_browser_onbeforeunload.js} | 55 ------------------- 4 files changed, 97 insertions(+), 60 deletions(-) create mode 100644 docshell/test/browser/browser_onbeforeunload_frame.js create mode 100644 docshell/test/browser/browser_onbeforeunload_parent.js rename docshell/test/browser/{browser_onbeforeunload.js => head_browser_onbeforeunload.js} (82%) diff --git a/docshell/test/browser/browser.ini b/docshell/test/browser/browser.ini index a07b9eda868d..5f2db1f8c244 100644 --- a/docshell/test/browser/browser.ini +++ b/docshell/test/browser/browser.ini @@ -167,11 +167,10 @@ support-files = [browser_loadURI_postdata.js] [browser_multiple_pushState.js] https_first_disabled = true -[browser_onbeforeunload.js] -skip-if = - tsan # Bug 1683730 - os == 'linux' && socketprocess_networking && fission && debug # Bug 1686597; high frequency intermittent - os == 'linux' && bits == 64 && asan # Bug 1773830 +[browser_onbeforeunload_frame.js] +support-files = head_browser_onbeforeunload.js +[browser_onbeforeunload_parent.js] +support-files = head_browser_onbeforeunload.js [browser_onbeforeunload_navigation.js] skip-if = (os == 'win' && !debug) # bug 1300351 [browser_onunload_stop.js] diff --git a/docshell/test/browser/browser_onbeforeunload_frame.js b/docshell/test/browser/browser_onbeforeunload_frame.js new file mode 100644 index 000000000000..0cc4e900c367 --- /dev/null +++ b/docshell/test/browser/browser_onbeforeunload_frame.js @@ -0,0 +1,45 @@ +"use strict"; + +// We need to test a lot of permutations here, and there isn't any sensible way +// to split them up or run them faster. +requestLongerTimeout(6); + +Services.scriptloader.loadSubScript( + getRootDirectory(gTestPath) + "head_browser_onbeforeunload.js", + this +); + +add_task(async function() { + await SpecialPowers.pushPrefEnv({ + set: [["dom.require_user_interaction_for_beforeunload", false]], + }); + + for (let actions of PERMUTATIONS) { + info( + `Testing frame actions: [${actions.map(action => + ACTION_NAMES.get(action) + )}]` + ); + + for (let startIdx = 0; startIdx < FRAMES.length; startIdx++) { + info(`Testing content reload from frame ${startIdx}`); + + await doTest(actions, startIdx, (tab, frames) => { + return SpecialPowers.spawn(frames[startIdx], [], () => { + let eventLoopSpun = false; + SpecialPowers.Services.tm.dispatchToMainThread(() => { + eventLoopSpun = true; + }); + + content.location.reload(); + + return { eventLoopSpun }; + }); + }); + } + } +}); + +add_task(async function cleanup() { + await TabPool.cleanup(); +}); diff --git a/docshell/test/browser/browser_onbeforeunload_parent.js b/docshell/test/browser/browser_onbeforeunload_parent.js new file mode 100644 index 000000000000..79cf815734b7 --- /dev/null +++ b/docshell/test/browser/browser_onbeforeunload_parent.js @@ -0,0 +1,48 @@ +"use strict"; + +// We need to test a lot of permutations here, and there isn't any sensible way +// to split them up or run them faster. +requestLongerTimeout(6); + +Services.scriptloader.loadSubScript( + getRootDirectory(gTestPath) + "head_browser_onbeforeunload.js", + this +); + +add_task(async function() { + await SpecialPowers.pushPrefEnv({ + set: [["dom.require_user_interaction_for_beforeunload", false]], + }); + + for (let actions of PERMUTATIONS) { + info( + `Testing frame actions: [${actions.map(action => + ACTION_NAMES.get(action) + )}]` + ); + + info(`Testing tab close from parent process`); + await doTest(actions, -1, (tab, frames) => { + let eventLoopSpun = false; + Services.tm.dispatchToMainThread(() => { + eventLoopSpun = true; + }); + + BrowserTestUtils.removeTab(tab); + + let result = { eventLoopSpun }; + + // Make an extra couple of trips through the event loop to give us time + // to process SpecialPowers.spawn responses before resolving. + return new Promise(resolve => { + executeSoon(() => { + executeSoon(() => resolve(result)); + }); + }); + }); + } +}); + +add_task(async function cleanup() { + await TabPool.cleanup(); +}); diff --git a/docshell/test/browser/browser_onbeforeunload.js b/docshell/test/browser/head_browser_onbeforeunload.js similarity index 82% rename from docshell/test/browser/browser_onbeforeunload.js rename to docshell/test/browser/head_browser_onbeforeunload.js index 6df6e13f7918..9bebe6117ee0 100644 --- a/docshell/test/browser/browser_onbeforeunload.js +++ b/docshell/test/browser/head_browser_onbeforeunload.js @@ -273,58 +273,3 @@ async function doTest(actions, startIdx, navigate) { is(result.event, "unload", "Should have seen unload event"); } } - -add_task(async function() { - await SpecialPowers.pushPrefEnv({ - set: [["dom.require_user_interaction_for_beforeunload", false]], - }); - - for (let actions of PERMUTATIONS) { - info( - `Testing frame actions: [${actions.map(action => - ACTION_NAMES.get(action) - )}]` - ); - - for (let startIdx = 0; startIdx < FRAMES.length; startIdx++) { - info(`Testing content reload from frame ${startIdx}`); - - await doTest(actions, startIdx, (tab, frames) => { - return SpecialPowers.spawn(frames[startIdx], [], () => { - let eventLoopSpun = false; - SpecialPowers.Services.tm.dispatchToMainThread(() => { - eventLoopSpun = true; - }); - - content.location.reload(); - - return { eventLoopSpun }; - }); - }); - } - - info(`Testing tab close from parent process`); - await doTest(actions, -1, (tab, frames) => { - let eventLoopSpun = false; - Services.tm.dispatchToMainThread(() => { - eventLoopSpun = true; - }); - - BrowserTestUtils.removeTab(tab); - - let result = { eventLoopSpun }; - - // Make an extra couple of trips through the event loop to give us time - // to process SpecialPowers.spawn responses before resolving. - return new Promise(resolve => { - executeSoon(() => { - executeSoon(() => resolve(result)); - }); - }); - }); - } -}); - -add_task(async function cleanup() { - await TabPool.cleanup(); -});