Update WPT tests for embedded content
[WebKit-https.git] / LayoutTests / imported / w3c / web-platform-tests / html / semantics / embedded-content / the-iframe-element / src-repeated-in-ancestor.html
1 <!doctype html>
2 <meta charset="utf-8">
3 <title>Navigation should not occur when `src` matches the location of a anscestor browsing context</title>
4 <script>
5 // Avoid recursion in non-conforming browsers
6 if (parent !== window && parent.title == window.title) {
7   window.stop();
8 }
9 </script>
10 <script src="/resources/testharness.js"></script>
11 <script src="/resources/testharnessreport.js"></script>
12 <body>
13 <script>
14 /**
15  * This test uses the `beforeunload` event to detect navigation. Because that
16  * event is fired synchronously in response to "process the iframe attributes",
17  * a second "control" iframe may be used to verify cases where navigation
18  * should *not* occur. `Promise.race` ensures that tests complete as soon as
19  * possible.
20  *
21  * Although the specification dictates that the `beforeunload` event must be
22  * emitted synchronously during navigation, a number of user agents do not
23  * adhere to this requirement. WPT includes a dedicated test for synchronous
24  * emission of the event [1]. This test is authored to support non-standard
25  * behavior in order to avoid spuriously passing in those UAs.
26  *
27  * [1] https://github.com/web-platform-tests/wpt/pull/12343
28  */
29 'use strict';
30
31 function when(target, eventName) {
32   return new Promise(function(resolve, reject) {
33     target.addEventListener(eventName, function() {
34       resolve();
35     }, { once: true });
36     target.addEventListener('error', function() {
37       reject(new Error('Error while waiting for ' + eventName));
38     }, { once: true });
39   });
40 }
41
42 function init(doc, t) {
43   var iframes = [doc.createElement('iframe'), doc.createElement('iframe')];
44
45   iframes.forEach(function(iframe) {
46     iframe.src = '/common/blank.html';
47     doc.body.appendChild(iframe);
48
49     t.add_cleanup(function() {
50       iframe.parentNode.removeChild(iframe);
51     });
52   });
53
54   return Promise.all([when(iframes[0], 'load'), when(iframes[1], 'load')])
55     .then(function() { return iframes; });
56 }
57
58 // This test verifies that navigation does occur; it is intended to validate
59 // the utility functions.
60 promise_test(function(t) {
61   return init(document, t)
62     .then(function(iframes) {
63       var subjectNavigation = when(iframes[0].contentWindow, 'beforeunload');
64       var controlNavigation = when(iframes[1].contentWindow, 'beforeunload');
65
66       iframes[0].src = '/common/blank.html?2';
67       iframes[1].src = '/common/blank.html?3';
68
69       return Promise.all([subjectNavigation, controlNavigation]);
70     });
71 }, 'different path name');
72
73 promise_test(function(t) {
74   return init(document, t)
75     .then(function(iframes) {
76       var subjectNavigation = when(iframes[0].contentWindow, 'beforeunload');
77       var controlNavigation = when(iframes[1].contentWindow, 'beforeunload');
78
79       iframes[0].src = location.href;
80       iframes[1].src = '/common/blank.html?4';
81
82       return Promise.race([
83         subjectNavigation.then(function() {
84           assert_unreached('Should not navigate');
85         }),
86         controlNavigation
87       ]);
88     });
89 }, 'same path name, no document fragment');
90
91 promise_test(function(t) {
92   return init(document, t)
93     .then(function(iframes) {
94       var subjectNavigation = when(iframes[0].contentWindow, 'beforeunload');
95       var controlNavigation = when(iframes[1].contentWindow, 'beforeunload');
96
97       iframes[0].src = location.href + '#something-else';
98       iframes[1].src = '/common/blank.html?5';
99
100       return Promise.race([
101         subjectNavigation.then(function() {
102           assert_unreached('Should not navigate');
103         }),
104         controlNavigation
105       ]);
106     });
107 }, 'same path name, different document fragment');
108
109 promise_test(function(t) {
110   var intermediate = document.createElement('iframe');
111
112   document.body.appendChild(intermediate);
113
114   t.add_cleanup(function() {
115     intermediate.parentNode.removeChild(intermediate);
116   });
117   intermediate.contentDocument.open();
118   intermediate.contentDocument.write('<body></body>');
119   intermediate.contentDocument.close();
120
121   return init(intermediate.contentDocument, t)
122     .then(function(iframes) {
123       var subjectNavigation = when(iframes[0].contentWindow, 'beforeunload');
124       var controlNavigation = when(iframes[1].contentWindow, 'beforeunload');
125
126       iframes[0].src = location.href;
127       iframes[1].src = '/common/blank.html?6';
128
129       return Promise.race([
130         subjectNavigation.then(function() {
131           assert_unreached('Should not navigate');
132         }),
133         controlNavigation
134       ]);
135     });
136 }, 'same path name, no document fragement (intermediary browsing context)');
137 </script>
138 </body>