summaryrefslogtreecommitdiffstats
path: root/testing/web-platform/tests/html/browsers/windows/embedded-opener-remove-frame.html
diff options
context:
space:
mode:
Diffstat (limited to 'testing/web-platform/tests/html/browsers/windows/embedded-opener-remove-frame.html')
-rw-r--r--testing/web-platform/tests/html/browsers/windows/embedded-opener-remove-frame.html66
1 files changed, 66 insertions, 0 deletions
diff --git a/testing/web-platform/tests/html/browsers/windows/embedded-opener-remove-frame.html b/testing/web-platform/tests/html/browsers/windows/embedded-opener-remove-frame.html
new file mode 100644
index 0000000000..a66f52e5f6
--- /dev/null
+++ b/testing/web-platform/tests/html/browsers/windows/embedded-opener-remove-frame.html
@@ -0,0 +1,66 @@
+<!doctype html>
+<title>opener and discarded browsing contexts</title>
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<div id=log></div>
+<iframe name=matchesastring></iframe>
+<script>
+function testOpener(t, otherW, thisW, discardOtherBC, isDiscardedFromATask) {
+ assert_equals(otherW.opener, thisW, "opener before removal");
+
+ const openerDesc = Object.getOwnPropertyDescriptor(otherW, "opener"),
+ openerGet = openerDesc.get;
+
+ assert_equals(openerGet(), thisW, "opener before removal via directly invoking the getter");
+ discardOtherBC();
+ if (isDiscardedFromATask) {
+ t.step_timeout(() => {
+ testOpenerRemainder(t, otherW, openerDesc, openerGet);
+ }, 250);
+ } else {
+ testOpenerRemainder(t, otherW, openerDesc, openerGet);
+ }
+}
+
+function testOpenerRemainder(t, otherW, openerDesc, openerGet) {
+ assert_equals(otherW.opener, null, "opener after removal");
+ assert_equals(openerGet(), null, "opener after removal via directly invoking the getter");
+
+ otherW.opener = null;
+ assert_equals(openerGet(), null, "opener after setting it null via directly invoking the getter");
+ const openerDescNull = Object.getOwnPropertyDescriptor(otherW, "opener");
+ assert_not_equals(openerDescNull, openerDesc);
+ assert_object_equals(openerDescNull, openerDesc);
+
+ otherW.opener = "immaterial";
+ assert_equals(openerGet(), null, "opener after setting it \"immaterial\" via directly invoking the getter");
+ const openerDescImmaterial = Object.getOwnPropertyDescriptor(otherW, "opener");
+ assert_equals(openerDescImmaterial.value, "immaterial");
+ assert_true(openerDescImmaterial.writable);
+ assert_true(openerDescImmaterial.enumerable);
+ assert_true(openerDescImmaterial.configurable);
+
+ t.done();
+}
+
+async_test(t => {
+ const frame = document.querySelector("iframe"),
+ frameW = frame.contentWindow;
+ frame.onload = t.step_func(() => {
+ // Firefox and Chrome/Safari load differently
+ if (frame.contentWindow.location.href === "about:blank") {
+ return;
+ }
+
+ testOpener(t, frameW, window, () => frame.remove(), false);
+ });
+ window.open("/common/blank.html", "matchesastring");
+}, "opener of discarded nested browsing context");
+
+async_test(t => {
+ const popupW = window.open("/common/blank.html");
+ popupW.onload = t.step_func(() => {
+ testOpener(t, popupW, window, () => popupW.close(), true);
+ });
+}, "opener of discarded auxiliary browsing context");
+</script>