Add initial support for 'Cross-Origin-Options' HTTP response header
[WebKit-https.git] / LayoutTests / http / wpt / cross-origin-options / cross-origin-options-header.html
1 <!DOCTYPE html>
2 <html>
3 <head>
4 <meta charset="utf-8">
5 <title>Basic testing for Cross-Origin-Options HTTP header</title>
6 <script src="/resources/testharness.js"></script>
7 <script src="/resources/testharnessreport.js"></script>
8 <script src="/common/utils.js"></script>
9 <script src="/common/get-host-info.sub.js"></script>
10 <script src="resources/utils.js"></script>
11 </head>
12 <body>
13 <script>
14
15 // Test frame has a subframe so we expect an indexed property with index 0.
16 crossOriginPropertyNames.push('0');
17
18 function checkIframePropertyValues(w)
19 {
20     assert_equals(w.parent, window, "'parent' property value");
21     assert_equals(w.top, window, "'top' property value");
22     assert_equals(w.opener, null, "'opener' property value");
23     assert_equals(w.length, 1, "'length' property value");
24     assert_not_throwing(function() { w[0]; }, "Subframe access via index");
25     assert_equals(w['subframe'], w[0], "Subframe access by name");
26 }
27
28 function checkPopupPropertyValues(w)
29 {
30     assert_equals(w.parent, w, "'parent' property value");
31     assert_equals(w.top, w, "'top' property value");
32     assert_equals(w.opener, window, "'opener' property value");
33     assert_equals(w.length, 1, "'length' property value");
34     assert_not_throwing(function() { w[0]; }, "Subframe access via index");
35     assert_equals(w['subframe'], w[0], "Subframe access by name");
36 }
37
38 promise_test(function(test) {
39     return withIframe("serve-cross-origin-options-header.py?value=deny", true /* isCrossOrigin */).then((f) => {
40         testCrossOriginOption(f.contentWindow, "deny", true /* isCrossOrigin */);
41     });
42 }, "Cross-origin iframe with 'Cross-Origin-Options: deny' HTTP header");
43
44 promise_test(function(test) {
45     return withIframe("serve-cross-origin-options-header.py?value=allow-postmessage", true /* isCrossOrigin */).then((f) => {
46         testCrossOriginOption(f.contentWindow, "allow-postmessage", true /* isCrossOrigin */);
47     });
48 }, "Cross-origin iframe with 'Cross-Origin-Options: allow-postmessage' HTTP header");
49
50 promise_test(function(test) {
51     return withIframe("serve-cross-origin-options-header.py?value=allow", true /* isCrossOrigin */).then((f) => {
52         const w = f.contentWindow;
53         testCrossOriginOption(w, "allow", true /* isCrossOrigin */);
54
55         checkIframePropertyValues(w);
56     });
57 }, "Cross-origin iframe with 'Cross-Origin-Options: allow' HTTP header");
58
59 promise_test(function(test) {
60     return withIframe("serve-cross-origin-options-header.py?value=invalid", true /* isCrossOrigin */).then((f) => {
61         const w = f.contentWindow;
62         testCrossOriginOption(w, "allow", true /* isCrossOrigin */);
63         
64         checkIframePropertyValues(w);
65     });
66 }, "Cross-origin iframe with 'Cross-Origin-Options: invalid' HTTP header");
67
68 promise_test(function(test) {
69     return withIframe("serve-cross-origin-options-header.py?value=deny", false /* isCrossOrigin */).then((f) => {
70          const w = f.contentWindow;
71         testCrossOriginOption(w, "deny", false /* isCrossOrigin */);
72
73         checkIframePropertyValues(w);
74     });
75 }, "Same-origin iframe with 'Cross-Origin-Options: deny' HTTP header");
76
77 promise_test(function(test) {
78     return withIframe("serve-cross-origin-options-header.py?value=allow-postmessage", false /* isCrossOrigin */).then((f) => {
79          const w = f.contentWindow;
80         testCrossOriginOption(w, "allow-postmessage", false /* isCrossOrigin */);
81
82         checkIframePropertyValues(w);
83     });
84 }, "Same-origin iframe with 'Cross-Origin-Options: allow-postmessage' HTTP header");
85
86 promise_test(function(test) {
87     return withIframe("serve-cross-origin-options-header.py?value=allow", false /* isCrossOrigin */).then((f) => {
88          const w = f.contentWindow;
89         testCrossOriginOption(w, "allow", false /* isCrossOrigin */);
90
91         checkIframePropertyValues(w);
92     });
93 }, "Same-origin iframe with 'Cross-Origin-Options: allow' HTTP header");
94
95 promise_test(function(test) {
96     return withIframe("serve-cross-origin-options-header.py?value=invalid", false /* isCrossOrigin */).then((f) => {
97          const w = f.contentWindow;
98         testCrossOriginOption(w, "allow", false /* isCrossOrigin */);
99
100         checkIframePropertyValues(w);
101     });
102 }, "Same-origin iframe with 'Cross-Origin-Options: invalid' HTTP header");
103
104 promise_test(function(test) {
105     return withPopup("serve-cross-origin-options-header.py?value=deny", true /* isCrossOrigin */).then((result) => {
106         testCrossOriginOption(result.window, "deny", true /* isCrossOrigin */);
107     });
108 }, "Cross-origin popup with 'Cross-Origin-Options: deny' HTTP header");
109
110 promise_test(function(test) {
111     return withPopup("serve-cross-origin-options-header.py?value=allow-postmessage", true /* isCrossOrigin */).then((result) => {
112         testCrossOriginOption(result.window, "allow-postmessage", true /* isCrossOrigin */);
113     });
114 }, "Cross-origin popup with 'Cross-Origin-Options: allow-postmessage' HTTP header");
115
116 promise_test(function(test) {
117     return withPopup("serve-cross-origin-options-header.py?value=allow", true /* isCrossOrigin */).then((result) => {
118         const w = result.window;
119         testCrossOriginOption(w, "allow", true /* isCrossOrigin */);
120
121         checkPopupPropertyValues(w);
122     });
123 }, "Cross-origin popup with 'Cross-Origin-Options: allow' HTTP header");
124
125 promise_test(function(test) {
126     return withPopup("serve-cross-origin-options-header.py?value=invalid", true /* isCrossOrigin */).then((result) => {
127         const w = result.window;
128         testCrossOriginOption(w, "allow", true /* isCrossOrigin */);
129
130         checkPopupPropertyValues(w);
131     });
132 }, "Cross-origin popup with 'Cross-Origin-Options: invalid' HTTP header");
133
134 promise_test(function(test) {
135     return withPopup("serve-cross-origin-options-header.py?value=deny", false /* isCrossOrigin */).then((result) => {
136          const w = result.window;
137         testCrossOriginOption(w, "deny", false /* isCrossOrigin */);
138
139         checkPopupPropertyValues(w);
140     });
141 }, "Same-origin popup with 'Cross-Origin-Options: deny' HTTP header");
142
143 promise_test(function(test) {
144     return withPopup("serve-cross-origin-options-header.py?value=allow-postmessage", false /* isCrossOrigin */).then((result) => {
145          const w = result.window;
146         testCrossOriginOption(w, "allow-postmessage", false /* isCrossOrigin */);
147
148         checkPopupPropertyValues(w);
149     });
150 }, "Same-origin popup with 'Cross-Origin-Options: allow-postmessage' HTTP header");
151
152 promise_test(function(test) {
153     return withPopup("serve-cross-origin-options-header.py?value=allow", false /* isCrossOrigin */).then((result) => {
154          const w = result.window;
155         testCrossOriginOption(w, "allow", false /* isCrossOrigin */);
156
157         checkPopupPropertyValues(w);
158     });
159 }, "Same-origin popup with 'Cross-Origin-Options: allow' HTTP header");
160
161 promise_test(function(test) {
162     return withPopup("serve-cross-origin-options-header.py?value=invalid", false /* isCrossOrigin */).then((result) => {
163          const w = result.window;
164         testCrossOriginOption(w, "allow", false /* isCrossOrigin */);
165
166         checkPopupPropertyValues(w);
167     });
168 }, "Same-origin popup with 'Cross-Origin-Options: invalid' HTTP header");
169
170 </script>
171 </body>
172 </html>