File: going-back.sub.https.html

package info (click to toggle)
firefox-esr 78.15.0esr-1~deb11u1
  • links: PTS, VCS
  • area: main
  • in suites: bullseye
  • size: 3,301,156 kB
  • sloc: cpp: 5,665,905; javascript: 4,798,386; ansic: 2,878,233; python: 977,004; asm: 270,347; xml: 181,456; java: 111,756; sh: 72,926; makefile: 21,819; perl: 13,380; cs: 4,725; yacc: 4,565; objc: 3,026; pascal: 1,787; lex: 1,720; ada: 1,681; exp: 505; php: 436; lisp: 260; awk: 152; ruby: 103; csh: 80; sed: 53; sql: 45
file content (130 lines) | stat: -rw-r--r-- 4,694 bytes parent folder | download | duplicates (4)
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>