Source code

Revision control

Copy as Markdown

Other Tools

Test Info: Warnings

// 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.");