| <!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> |