summaryrefslogtreecommitdiffstats
path: root/dom/tests/browser/browser_sessionStorage_navigation.js
diff options
context:
space:
mode:
Diffstat (limited to 'dom/tests/browser/browser_sessionStorage_navigation.js')
-rw-r--r--dom/tests/browser/browser_sessionStorage_navigation.js271
1 files changed, 271 insertions, 0 deletions
diff --git a/dom/tests/browser/browser_sessionStorage_navigation.js b/dom/tests/browser/browser_sessionStorage_navigation.js
new file mode 100644
index 0000000000..8598969dc8
--- /dev/null
+++ b/dom/tests/browser/browser_sessionStorage_navigation.js
@@ -0,0 +1,271 @@
+"use strict";
+
+const DIRPATH = getRootDirectory(gTestPath).replace(
+ "chrome://mochitests/content/",
+ ""
+);
+const PATH = DIRPATH + "file_empty.html";
+
+const ORIGIN1 = "https://example.com";
+const ORIGIN2 = "https://example.org";
+const URL1 = `${ORIGIN1}/${PATH}`;
+const URL2 = `${ORIGIN2}/${PATH}`;
+const URL1_WITH_COOP_COEP = `${ORIGIN1}/${DIRPATH}file_coop_coep.html`;
+
+add_task(async function () {
+ await BrowserTestUtils.withNewTab(URL1, async function (browser) {
+ const key = "key";
+ const value = "value";
+
+ info(
+ `Verifying sessionStorage is preserved after navigating to a ` +
+ `cross-origin site and then navigating back`
+ );
+
+ await SpecialPowers.pushPrefEnv({
+ set: [
+ [
+ "privacy.partition.always_partition_third_party_non_cookie_storage",
+ false,
+ ],
+ ],
+ });
+
+ BrowserTestUtils.startLoadingURIString(browser, URL1);
+ await BrowserTestUtils.browserLoaded(browser);
+
+ await SpecialPowers.spawn(
+ browser,
+ [ORIGIN1, key, value],
+ async (ORIGIN, key, value) => {
+ is(content.window.origin, ORIGIN, `Navigate to ${ORIGIN} as expected`);
+
+ let value1 = content.window.sessionStorage.getItem(key);
+ is(
+ value1,
+ null,
+ `SessionStorage for ${key} in ${content.window.origin} is null ` +
+ `since it's the first visit`
+ );
+
+ content.window.sessionStorage.setItem(key, value);
+
+ let value2 = content.window.sessionStorage.getItem(key);
+ is(
+ value2,
+ value,
+ `SessionStorage for ${key} in ${content.window.origin} is set ` +
+ `correctly`
+ );
+ }
+ );
+
+ BrowserTestUtils.startLoadingURIString(browser, URL2);
+ await BrowserTestUtils.browserLoaded(browser);
+
+ await SpecialPowers.spawn(
+ browser,
+ [ORIGIN2, key, value],
+ async (ORIGIN, key, value) => {
+ is(content.window.origin, ORIGIN, `Navigate to ${ORIGIN} as expected`);
+
+ let value1 = content.window.sessionStorage.getItem(key);
+ is(
+ value1,
+ null,
+ `SessionStorage for ${key} in ${content.window.origin} is null ` +
+ `since it's the first visit`
+ );
+ }
+ );
+
+ BrowserTestUtils.startLoadingURIString(browser, URL1);
+ await BrowserTestUtils.browserLoaded(browser);
+
+ await SpecialPowers.spawn(
+ browser,
+ [ORIGIN1, key, value],
+ async (ORIGIN, key, value) => {
+ is(content.window.origin, ORIGIN, `Navigate to ${ORIGIN} as expected`);
+
+ let value1 = content.window.sessionStorage.getItem(key);
+ is(
+ value1,
+ value,
+ `SessionStorage for ${key} in ${content.window.origin} is preserved`
+ );
+ }
+ );
+
+ info(`Verifying sessionStorage is preserved for ${URL1} after navigating`);
+
+ BrowserTestUtils.startLoadingURIString(browser, URL2);
+ await BrowserTestUtils.browserLoaded(browser);
+
+ await SpecialPowers.spawn(
+ browser,
+ [ORIGIN2, ORIGIN1, URL1, key, value],
+ async (ORIGIN, iframeORIGIN, iframeURL, key, value) => {
+ is(content.window.origin, ORIGIN, `Navigate to ${ORIGIN} as expected`);
+
+ let iframe = content.document.createElement("iframe");
+ iframe.src = iframeURL;
+ content.document.body.appendChild(iframe);
+ await ContentTaskUtils.waitForEvent(iframe, "load");
+
+ await content.SpecialPowers.spawn(
+ iframe,
+ [iframeORIGIN, key, value],
+ async function (ORIGIN, key, value) {
+ is(
+ content.window.origin,
+ ORIGIN,
+ `Navigate to ${ORIGIN} as expected`
+ );
+
+ // Bug 1746646: Make mochitests work with TCP enabled (cookieBehavior = 5)
+ // Acquire storage access permission here so that the iframe has
+ // first-party access to the sessionStorage. Without this, it is
+ // isolated and this test will always fail
+ SpecialPowers.wrap(content.document).notifyUserGestureActivation();
+ await SpecialPowers.addPermission(
+ "storageAccessAPI",
+ true,
+ content.window.location.href
+ );
+ await SpecialPowers.wrap(content.document).requestStorageAccess();
+
+ let value1 = content.window.sessionStorage.getItem(key);
+ is(
+ value1,
+ value,
+ `SessionStorage for ${key} in ${content.window.origin} is ` +
+ `preserved`
+ );
+ }
+ );
+ }
+ );
+
+ info(`Verifying SSCache is loaded to the content process only once`);
+
+ BrowserTestUtils.startLoadingURIString(browser, URL1);
+ await BrowserTestUtils.browserLoaded(browser);
+
+ await SpecialPowers.spawn(
+ browser,
+ [ORIGIN1, URL1, key, value],
+ async (ORIGIN, iframeURL, key, value) => {
+ is(content.window.origin, ORIGIN, `Navigate to ${ORIGIN} as expected`);
+
+ let iframe = content.document.createElement("iframe");
+ iframe.src = iframeURL;
+ content.document.body.appendChild(iframe);
+ await ContentTaskUtils.waitForEvent(iframe, "load");
+
+ await content.SpecialPowers.spawn(
+ iframe,
+ [ORIGIN, key, value],
+ async function (ORIGIN, key, value) {
+ is(
+ content.window.origin,
+ ORIGIN,
+ `Load an iframe to ${ORIGIN} as expected`
+ );
+
+ let value1 = content.window.sessionStorage.getItem(key);
+ is(
+ value1,
+ value,
+ `SessionStorage for ${key} in ${content.window.origin} is ` +
+ `preserved.`
+ );
+
+ // When we are here, it means we didn't hit the assertion for
+ // ensuring a SSCache can only be loaded on the content process
+ // once.
+ }
+ );
+ }
+ );
+
+ info(
+ `Verifying the sessionStorage for a tab shares between ` +
+ `cross-origin-isolated and non cross-origin-isolated environments`
+ );
+ const anotherKey = `anotherKey`;
+ const anotherValue = `anotherValue;`;
+
+ BrowserTestUtils.startLoadingURIString(browser, URL1_WITH_COOP_COEP);
+ await BrowserTestUtils.browserLoaded(browser);
+
+ await SpecialPowers.spawn(
+ browser,
+ [ORIGIN1, key, value, anotherKey, anotherValue],
+ async (ORIGIN, key, value, anotherKey, anotherValue) => {
+ is(content.window.origin, ORIGIN, `Navigate to ${ORIGIN} as expected`);
+ ok(
+ content.window.crossOriginIsolated,
+ `The window is cross-origin-isolated.`
+ );
+
+ let value1 = content.window.sessionStorage.getItem(key);
+ is(
+ value1,
+ value,
+ `SessionStorage for ${key} in ${content.window.origin} was ` +
+ `propagated to COOP+COEP process correctly.`
+ );
+
+ let value2 = content.window.sessionStorage.getItem(anotherKey);
+ is(
+ value2,
+ null,
+ `SessionStorage for ${anotherKey} in ${content.window.origin} ` +
+ `hasn't been set yet.`
+ );
+
+ content.window.sessionStorage.setItem(anotherKey, anotherValue);
+
+ let value3 = content.window.sessionStorage.getItem(anotherKey);
+ is(
+ value3,
+ anotherValue,
+ `SessionStorage for ${anotherKey} in ${content.window.origin} ` +
+ `was set as expected.`
+ );
+ }
+ );
+
+ BrowserTestUtils.startLoadingURIString(browser, URL1);
+ await BrowserTestUtils.browserLoaded(browser);
+
+ await SpecialPowers.spawn(
+ browser,
+ [ORIGIN1, key, value, anotherKey, anotherValue],
+ async (ORIGIN, key, value, anotherKey, anotherValue) => {
+ is(content.window.origin, ORIGIN, `Navigate to ${ORIGIN} as expected`);
+ ok(
+ !content.window.crossOriginIsolated,
+ `The window is not cross-origin-isolated.`
+ );
+
+ let value1 = content.window.sessionStorage.getItem(key);
+ is(
+ value1,
+ value,
+ `SessionStorage for ${key} in ${content.window.origin} is ` +
+ `preserved.`
+ );
+
+ let value2 = content.window.sessionStorage.getItem(anotherKey);
+ is(
+ value2,
+ anotherValue,
+ `SessionStorage for ${anotherKey} in ${content.window.origin} was ` +
+ `propagated to non-COOP+COEP process correctly.`
+ );
+ }
+ );
+ });
+});