Bug 1790666 - Propagate session storage across COOP switches without SHIP, r=smaug,asuth

With non-SHIP Desktop we would propagate the session storage across
process switches using session restore, so the internal propagation was
diabled. However, android's session restore has no handling for session
storage, meaning that all session storage is discarded.

This changes the logic to always use the internal propagation, even when
SHIP is disabled.

Differential Revision: https://phabricator.services.mozilla.com/D188647
This commit is contained in:
Nika Layzell 2023-09-20 20:01:32 +00:00
Родитель 492a011ad0
Коммит 23df3cab6b
5 изменённых файлов: 74 добавлений и 3 удалений

Просмотреть файл

@ -381,9 +381,7 @@ void CanonicalBrowsingContext::ReplacedBy(
aNewContext->SetChildSHistory(childSHistory);
}
if (mozilla::SessionHistoryInParent()) {
BackgroundSessionStorageManager::PropagateManager(Id(), aNewContext->Id());
}
BackgroundSessionStorageManager::PropagateManager(Id(), aNewContext->Id());
// Transfer the ownership of the priority active status from the old context
// to the new context.

Просмотреть файл

@ -0,0 +1,12 @@
<!DOCTYPE html>
<html>
<body>
<script>
addEventListener("load", () => {
let bc = new BroadcastChannel("testChannel");
bc.postMessage(sessionStorage.getItem("testItem"));
window.close();
});
</script>
</body>
</html>

Просмотреть файл

@ -0,0 +1 @@
Cross-Origin-Opener-Policy: same-origin

Просмотреть файл

@ -264,3 +264,7 @@ support-files =
file_ship_beforeunload_fired.html
skip-if = !sessionHistoryInParent
[test_open_javascript_noopener.html]
[test_sessionstorage_across_coop.html]
support-files =
file_sessionstorage_across_coop.html
file_sessionstorage_across_coop.html^headers^

Просмотреть файл

@ -0,0 +1,56 @@
<!DOCTYPE HTML>
<html>
<!--
https://bugzilla.mozilla.org/show_bug.cgi?id=1790666
-->
<head>
<title>Test for Bug 1790666</title>
<script src="/tests/SimpleTest/SimpleTest.js"></script>
<link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
</head>
<body>
<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1790666">Mozilla Bug 1790666</a>
<p id="display"></p>
<div id="content" style="display: none">
</div>
<pre id="test">
<script type="application/javascript">
async function singleTest(testValue, description) {
info(`Starting test: ${description}`);
let bc = new BroadcastChannel("testChannel");
let promise = new Promise(resolve => {
bc.addEventListener("message", event => {
info(`received message from testChannel: ${event.data}`);
resolve(event.data);
}, { once: true });
});
info("Opening pop-up");
let popup = window.open("", "_blank");
popup.sessionStorage.setItem("testItem", testValue);
info("Navigating pop-up to COOP page");
popup.location = new URL("file_sessionstorage_across_coop.html", window.location);
let newValue = await promise;
is(newValue, testValue, "Value matches expected value");
}
add_task(async function() {
// Cross-Origin-Opener-Policy is only supported in secure contexts, so
// make the test a secure context.
await SpecialPowers.pushPrefEnv({
"set": [["dom.securecontext.allowlist", "mochi.test"]],
});
await singleTest("short test value", "short test value");
let longValue = "A".repeat(SpecialPowers.getIntPref("browser.sessionstore.dom_storage_limit") * 2);
await singleTest(longValue, "long test value");
});
</script>
</pre>
</body>
</html>