Skip to content

Commit

Permalink
Bug 1775925: Split up browser_onbeforeunload.js somewhat. r=nika
Browse files Browse the repository at this point in the history
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
  • Loading branch information
kmaglione committed Oct 24, 2022
1 parent c4dfda1 commit 1a5132c
Show file tree
Hide file tree
Showing 4 changed files with 97 additions and 60 deletions.
9 changes: 4 additions & 5 deletions docshell/test/browser/browser.ini
Original file line number Diff line number Diff line change
Expand Up @@ -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]
Expand Down
45 changes: 45 additions & 0 deletions docshell/test/browser/browser_onbeforeunload_frame.js
Original file line number Diff line number Diff line change
@@ -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();
});
48 changes: 48 additions & 0 deletions docshell/test/browser/browser_onbeforeunload_parent.js
Original file line number Diff line number Diff line change
@@ -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();
});
Original file line number Diff line number Diff line change
Expand Up @@ -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();
});

0 comments on commit 1a5132c

Please sign in to comment.