74 lines
2.9 KiB
JavaScript
74 lines
2.9 KiB
JavaScript
// META: script=/common/get-host-info.sub.js
|
|
// META: script=/common/utils.js
|
|
// META: script=/common/dispatcher/dispatcher.js
|
|
// META: script=/html/cross-origin-embedder-policy/credentialless/resources/common.js
|
|
// META: script=./resources/common.js
|
|
|
|
// This test verifies the behavior of the initial empty document nested inside
|
|
// credentialless iframes.
|
|
//
|
|
// The following tree of frames and documents is used:
|
|
// A
|
|
// ├──B (credentialless)
|
|
// │ └──D (initial empty document)
|
|
// └──C (control)
|
|
// └──E (initial empty document)
|
|
//
|
|
// Storage used for D and E must be different.
|
|
promise_test(async test => {
|
|
const iframe_B = newIframeCredentialless(origin);
|
|
const iframe_C = newIframe(origin);
|
|
|
|
// Create iframe_D and store a value in localStorage.
|
|
const key_D = token();
|
|
const value_D = "value_D";
|
|
const queue_B = token();
|
|
send(iframe_B, `
|
|
const iframe_D = document.createElement("iframe");
|
|
document.body.appendChild(iframe_D);
|
|
iframe_D.contentWindow.localStorage.setItem("${key_D}","${value_D}");
|
|
send("${queue_B}", "Done");
|
|
`);
|
|
|
|
// Create iframe_E and store a value in localStorage.
|
|
const key_E = token();
|
|
const value_E = "value_E";
|
|
const queue_C = token();
|
|
send(iframe_C, `
|
|
const iframe_E = document.createElement("iframe");
|
|
document.body.appendChild(iframe_E);
|
|
iframe_E.contentWindow.localStorage.setItem("${key_E}","${value_E}");
|
|
send("${queue_C}", "Done");
|
|
`);
|
|
|
|
assert_equals(await receive(queue_B), "Done");
|
|
assert_equals(await receive(queue_C), "Done");
|
|
|
|
// Try to load both values from both contexts:
|
|
send(iframe_B, `
|
|
const iframe_D = document.querySelector("iframe");
|
|
const value_D = iframe_D.contentWindow.localStorage.getItem("${key_D}");
|
|
const value_E = iframe_D.contentWindow.localStorage.getItem("${key_E}");
|
|
send("${queue_B}", value_D);
|
|
send("${queue_B}", value_E);
|
|
`);
|
|
send(iframe_C, `
|
|
const iframe_E = document.querySelector("iframe");
|
|
const value_D = iframe_E.contentWindow.localStorage.getItem("${key_D}");
|
|
const value_E = iframe_E.contentWindow.localStorage.getItem("${key_E}");
|
|
send("${queue_C}", value_D);
|
|
send("${queue_C}", value_E);
|
|
`);
|
|
|
|
// Verify the credentialless iframe and the normal one do not have access to
|
|
// each other.
|
|
assert_equals(await receive(queue_B), value_D, // key_D
|
|
"Credentialless iframe can access credentialless context");
|
|
assert_equals(await receive(queue_B), "", // key_E
|
|
"Credentialless iframe can't access credentialled context");
|
|
assert_equals(await receive(queue_C), "", // key_D
|
|
"Credentialled iframe can't access credentialless context");
|
|
assert_equals(await receive(queue_C), value_E, // key_E
|
|
"Credentialled iframe can access credentialled context");
|
|
}, "Local storage is correctly partitioned with regards to credentialless " +
|
|
"iframe in initial empty documents.");
|