diff options
Diffstat (limited to 'testing/web-platform/tests/portals/portals-activate-while-unloading.html')
-rw-r--r-- | testing/web-platform/tests/portals/portals-activate-while-unloading.html | 70 |
1 files changed, 70 insertions, 0 deletions
diff --git a/testing/web-platform/tests/portals/portals-activate-while-unloading.html b/testing/web-platform/tests/portals/portals-activate-while-unloading.html new file mode 100644 index 0000000000..5abb164b3b --- /dev/null +++ b/testing/web-platform/tests/portals/portals-activate-while-unloading.html @@ -0,0 +1,70 @@ +<!DOCTYPE html> +<html> + <head> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> + <script src="/resources/testdriver.js"></script> + <script src="/resources/testdriver-vendor.js"></script> + <script> + function childReady() { + return new Promise((resolve) => { + window.onmessage = resolve; + }); + } + + const handlers = ['beforeunload', 'pagehide', 'unload']; + for (let handler of handlers) { + promise_test(async (test) => { + let popup; + + // Open a popup that has a portal, wait for both to be loaded. + { + await test_driver.bless('Open a popup', () => { + popup = open(`resources/portal-activate-in-handler.html?${handler}`, + '_blank'); + }); + await childReady(); + } + + // We need the exception type below to ensure the activate() call + // throws but the popup global may be gone by then so stash it here. + const exception_type = popup.DOMException; + + // Navigate the popup away. + const cur_path = popup.location.pathname; + popup.location = 'resources/blank-host.html'; + + // We need to wait until the handler is called but because of the + // nature of these handlers, we can't reliably communicate with the + // popup while they're running so we use a promise established + // earlier to wait until a time we know the portal has been activated + // and the returned promise stored on this global. + await window.handler_called_promise; + assert_not_equals(typeof(window.portal_promise), 'undefined', + 'Portal.activate() must be called'); + + // The popup should have called activate from the handler, and placed + // the promise returned from that call into this window in the + // |portal_promise| variable. We expect that this call should reject, + // however, if it does activate, it's timing dependent whether the + // handler will be run to completion so we may never fulfil the + // promise. In that case timeout and fail the test. + { + test.step_timeout(() => { + assert_unreached('Activation didn\'t fulfil.'); + }, 3000); + + await promise_rejects_dom(test, + "InvalidStateError", + exception_type, + window.portal_promise, + "Portal activation must fail."); + } + popup.close(); + }, `cannot activate portal from ${handler}`); + } + </script> + </head> + <body> + </body> +</html> |