Source code
Revision control
Copy as Markdown
Other Tools
Test Info: Warnings
- This test gets skipped with pattern: !sessionHistoryInParent
- Manifest: docshell/test/navigation/mochitest.toml
<html>
<head>
<title>
Test that ensures beforeunload is fired when session-history-in-parent is enabled
</title>
<script src="/tests/SimpleTest/SimpleTest.js"></script>
<link rel="stylesheet" href="/tests/SimpleTest/test.css"/>
</head>
<script defer>
SimpleTest.waitForExplicitFinish();
/*
* This test ensures beforeunload is fired on the current page
* when it is entering BFCache, and the next page is not coming out
* from BFCache, but coming from session history.
*
* (1) The controller page opens a new window, and page A is loaded there.
* (2) Page A then navigates to page B, and a beforeunload event
* listener is registered on page B.
* (3) Page B then navigates back to page A, and the beforeunload handler
* should send a message to the controller page.
* (4) Page A then navigates back to page B to check if page B has
* been successfully added to BFCache.
*/
SimpleTest.enableLegacyUnpartitionedStorage().then( () => {
var bc = new BroadcastChannel("ship_beforeunload");
var pageshowCount = 0;
var beforeUnloadFired = false;
bc.onmessage = function(event) {
if (event.data.type == "pageshow") {
++pageshowCount;
if (pageshowCount == 1) {
bc.postMessage({action: "navigate_to_page_b", blockBFCache: true});
} else if (pageshowCount == 2) {
ok(!event.data.persisted, "?page B shouldn't in BFCache because it's the first navigation");
bc.postMessage({action: "register_beforeunload",
loadNextPageFromSessionHistory: true});
} else if (pageshowCount == 3) {
ok(!event.data.persisted, "navigated back to page A that was session history but not in BFCache");
ok(beforeUnloadFired, "beforeUnload should be fired on page B");
bc.postMessage({action: "back_to_page_b", forwardNavigateToPageB: true});
} else if (pageshowCount == 4) {
ok(event.data.persisted, "page B has been successfully added to BFCache");
bc.postMessage({action: "close"});
SimpleTest.finish();
}
} else if (event.data == "beforeunload_fired") {
beforeUnloadFired = true;
}
}
SpecialPowers.pushPrefEnv({"set": [
["fission.bfcacheInParent", true],
["docshell.shistory.bfcache.ship_allow_beforeunload_listeners", true]
]},
function() {
window.open("file_ship_beforeunload_fired.html", "", "noopener");
}
);
});
</script>
<body></body>
</html>