diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-19 00:47:55 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-19 00:47:55 +0000 |
commit | 26a029d407be480d791972afb5975cf62c9360a6 (patch) | |
tree | f435a8308119effd964b339f76abb83a57c29483 /testing/web-platform/tests/html/semantics/embedded-content/the-iframe-element/src-repeated-in-ancestor.html | |
parent | Initial commit. (diff) | |
download | firefox-26a029d407be480d791972afb5975cf62c9360a6.tar.xz firefox-26a029d407be480d791972afb5975cf62c9360a6.zip |
Adding upstream version 124.0.1.upstream/124.0.1
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'testing/web-platform/tests/html/semantics/embedded-content/the-iframe-element/src-repeated-in-ancestor.html')
-rw-r--r-- | testing/web-platform/tests/html/semantics/embedded-content/the-iframe-element/src-repeated-in-ancestor.html | 138 |
1 files changed, 138 insertions, 0 deletions
diff --git a/testing/web-platform/tests/html/semantics/embedded-content/the-iframe-element/src-repeated-in-ancestor.html b/testing/web-platform/tests/html/semantics/embedded-content/the-iframe-element/src-repeated-in-ancestor.html new file mode 100644 index 0000000000..2f77dfe164 --- /dev/null +++ b/testing/web-platform/tests/html/semantics/embedded-content/the-iframe-element/src-repeated-in-ancestor.html @@ -0,0 +1,138 @@ +<!doctype html> +<meta charset="utf-8"> +<title>Navigation should not occur when `src` matches the location of a anscestor browsing context</title> +<script> +// Avoid recursion in non-conforming browsers +if (parent !== window && parent.title == window.title) { + window.stop(); +} +</script> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<body> +<script> +/** + * This test uses the `beforeunload` event to detect navigation. Because that + * event is fired synchronously in response to "process the iframe attributes", + * a second "control" iframe may be used to verify cases where navigation + * should *not* occur. `Promise.race` ensures that tests complete as soon as + * possible. + * + * Although the specification dictates that the `beforeunload` event must be + * emitted synchronously during navigation, a number of user agents do not + * adhere to this requirement. WPT includes a dedicated test for synchronous + * emission of the event [1]. This test is authored to support non-standard + * behavior in order to avoid spuriously passing in those UAs. + * + * [1] https://github.com/web-platform-tests/wpt/pull/12343 + */ +'use strict'; + +function when(target, eventName) { + return new Promise(function(resolve, reject) { + target.addEventListener(eventName, function() { + resolve(); + }, { once: true }); + target.addEventListener('error', function() { + reject(new Error('Error while waiting for ' + eventName)); + }, { once: true }); + }); +} + +function init(doc, t) { + var iframes = [doc.createElement('iframe'), doc.createElement('iframe')]; + + iframes.forEach(function(iframe) { + iframe.src = '/common/blank.html'; + doc.body.appendChild(iframe); + + t.add_cleanup(function() { + iframe.parentNode.removeChild(iframe); + }); + }); + + return Promise.all([when(iframes[0], 'load'), when(iframes[1], 'load')]) + .then(function() { return iframes; }); +} + +// This test verifies that navigation does occur; it is intended to validate +// the utility functions. +promise_test(function(t) { + return init(document, t) + .then(function(iframes) { + var subjectNavigation = when(iframes[0].contentWindow, 'beforeunload'); + var controlNavigation = when(iframes[1].contentWindow, 'beforeunload'); + + iframes[0].src = '/common/blank.html?2'; + iframes[1].src = '/common/blank.html?3'; + + return Promise.all([subjectNavigation, controlNavigation]); + }); +}, 'different path name'); + +promise_test(function(t) { + return init(document, t) + .then(function(iframes) { + var subjectNavigation = when(iframes[0].contentWindow, 'beforeunload'); + var controlNavigation = when(iframes[1].contentWindow, 'beforeunload'); + + iframes[0].src = location.href; + iframes[1].src = '/common/blank.html?4'; + + return Promise.race([ + subjectNavigation.then(function() { + assert_unreached('Should not navigate'); + }), + controlNavigation + ]); + }); +}, 'same path name, no document fragment'); + +promise_test(function(t) { + return init(document, t) + .then(function(iframes) { + var subjectNavigation = when(iframes[0].contentWindow, 'beforeunload'); + var controlNavigation = when(iframes[1].contentWindow, 'beforeunload'); + + iframes[0].src = location.href + '#something-else'; + iframes[1].src = '/common/blank.html?5'; + + return Promise.race([ + subjectNavigation.then(function() { + assert_unreached('Should not navigate'); + }), + controlNavigation + ]); + }); +}, 'same path name, different document fragment'); + +promise_test(function(t) { + var intermediate = document.createElement('iframe'); + + document.body.appendChild(intermediate); + + t.add_cleanup(function() { + intermediate.parentNode.removeChild(intermediate); + }); + intermediate.contentDocument.open(); + intermediate.contentDocument.write('<body></body>'); + intermediate.contentDocument.close(); + + return init(intermediate.contentDocument, t) + .then(function(iframes) { + var subjectNavigation = when(iframes[0].contentWindow, 'beforeunload'); + var controlNavigation = when(iframes[1].contentWindow, 'beforeunload'); + + iframes[0].src = location.href; + iframes[1].src = '/common/blank.html?6'; + + return Promise.race([ + subjectNavigation.then(function() { + assert_unreached('Should not navigate'); + }), + controlNavigation + ]); + }); +}, 'same path name, no document fragement (intermediary browsing context)'); +</script> +</body> |