1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130
|
<!DOCTYPE html>
<meta charset="utf-8">
<title>Parent is isolated, child1 is not isolated, child1 navigates to a different site, child2 gets inserted and is isolated, child1 navigates back</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<div id="log"></div>
<script type="module">
import { insertIframe, navigateIframe, waitForIframe, sendWasmModule,
setBothDocumentDomains, sendWasmModuleBetween, accessDocumentBetween }
from "./resources/helpers.mjs";
let frameWindow1, frame1, frameWindow2;
promise_setup(async () => {
frameWindow1 = await insertIframe("{{hosts[][www]}}");
frame1 = document.querySelector("iframe");
});
// Since they're different-origin, the parent's isolation request is respected,
// as is the child's non-request. So the parent ends up in the origin-keyed
// agent cluster and the child ends up in the site-keyed one.
promise_test(async () => {
const whatHappened = await sendWasmModule(frameWindow1);
assert_equals(whatHappened, "messageerror");
}, "Before navigation: parent to child1: messageerror event must occur");
promise_test(async () => {
await setBothDocumentDomains(frameWindow1);
assert_throws_dom("SecurityError", DOMException, () => {
frameWindow1.document;
});
}, "Before navigation: parent to child1: setting document.domain must not give sync access");
// Navigate the iframe to a different site. These, of course, must not be in the
// same agent cluster.
promise_test(async () => {
await navigateIframe(frame1, "{{hosts[alt][]}}");
}, "Navigation");
// Now insert a second iframe, pointing to the same place as the first one
// originally did, but this time with origin isolation enabled. Because of the
// historical map of agent cluster keys for the browsing context group, the new
// iframe should still end up in the site-keyed agent cluster.
promise_test(async () => {
frameWindow2 = await insertIframe("{{hosts[][www]}}", "?1");
}, "Inserting a second iframe");
promise_test(async () => {
const whatHappened = await sendWasmModule(frameWindow2);
assert_equals(whatHappened, "messageerror");
}, "After navigation: parent to child2: messageerror event must occur");
promise_test(async () => {
await setBothDocumentDomains(frameWindow2);
assert_throws_dom("SecurityError", DOMException, () => {
frameWindow2.document;
});
}, "After navigation: parent to child2: setting document.domain must not give sync access");
// Now navigate the first iframe back. The resulting Document should be put in
// the site agent cluster, together with the second iframe's Document.
promise_test(async () => {
const waitPromise = waitForIframe(frame1);
history.back();
await waitPromise;
await setBothDocumentDomains(frameWindow1);
}, "Going back in history (navigating back the first iframe)");
promise_test(async () => {
const whatHappened = await sendWasmModule(frameWindow1);
assert_equals(whatHappened, "messageerror");
}, "After back: parent to child1: messageerror event must occur");
promise_test(async () => {
await setBothDocumentDomains(frameWindow2);
assert_throws_dom("SecurityError", DOMException, () => {
frameWindow1.document;
});
}, "After back: parent to child1: setting document.domain must not give sync access");
promise_test(async () => {
const whatHappened = await sendWasmModule(frameWindow2);
assert_equals(whatHappened, "messageerror");
}, "After back: parent to child2: messageerror event must occur");
promise_test(async () => {
await setBothDocumentDomains(frameWindow1);
assert_throws_dom("SecurityError", DOMException, () => {
frameWindow1.document;
});
}, "After back: parent to child2: setting document.domain must not give sync access");
promise_test(async () => {
const whatHappened = await sendWasmModuleBetween(frameWindow1, 1);
assert_equals(whatHappened, "WebAssembly.Module message received");
}, "child1 to child2: message event must occur");
promise_test(async () => {
const whatHappened = await accessDocumentBetween(frameWindow1, 1);
assert_equals(whatHappened, "accessed document successfully");
}, "child1 to child2: setting document.domain must give sync access");
promise_test(async () => {
const whatHappened = await sendWasmModuleBetween(frameWindow2, 0);
assert_equals(whatHappened, "WebAssembly.Module message received");
}, "child2 to child1: message event must occur");
promise_test(async () => {
const whatHappened = await accessDocumentBetween(frameWindow2, 0);
assert_equals(whatHappened, "accessed document successfully");
}, "child2 to child1: setting document.domain must give sync access");
</script>
|