diff options
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.html | 66 |
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> |