| Summary: | unhandledrejection event doesn't fire across realms | ||
|---|---|---|---|
| Product: | WebKit | Reporter: | Timothy Gu <timothygu99> |
| Component: | WebCore JavaScript | Assignee: | Nobody <webkit-unassigned> |
| Status: | NEW --- | ||
| Severity: | Normal | CC: | d, ggaren, joepeck, timothygu99 |
| Priority: | P2 | ||
| Version: | WebKit Nightly Build | ||
| Hardware: | Unspecified | ||
| OS: | Unspecified | ||
There is certainly some ambiguity in the HTML spec about what the right global object the event is fired on should be (should it be on frame? or window?) [1]. An enhanced version of reproduction case tries to handle this uncertainty by permitting both possibilities:
<iframe></iframe>
<script>
const frame = frames[0];
window.onunhandledrejection = () => { alert("Rejected!"); };
frame.onunhandledrejection = () => { alert("Rejected!"); };
frame.Promise.reject();
</script>
Yet, even in this case, the message is not shown.
As an additional data point, with this HTML sample, the "Rejected!" message is shown as soon as I try to launch Web Inspector.
[1]: https://github.com/whatwg/html/issues/958
|
With this HTML: <iframe></iframe> <script> const frame = frames[0]; frame.onunhandledrejection = () => { alert("Rejected!"); }; frame.Promise.reject(); </script> The "Rejected!" message is not shown, but it is on Chrome. ---- There is an interesting twist to this, as executing the script inside a frame.setTimeout() (which makes the entry realm [1] to Promise.reject be that of the iframe) would allow the alert to execute. The following code works: <iframe></iframe> <script> const frame = frames[0]; frame.setTimeout(() => { frame.onunhandledrejection = () => { alert("Rejected!"); }; frame.Promise.reject(); }); </script> [1]: https://html.spec.whatwg.org/multipage/webappapis.html#concept-entry-realm ---- Merely a setTimeout does not fix the problem. The following does not alert the message either: <iframe></iframe> <script> const frame = frames[0]; setTimeout(() => { frame.onunhandledrejection = () => { alert("Rejected!"); }; frame.Promise.reject(); }); </script>