Bug 216149
| Summary: | Promises created from async functions don't resolve when document is detached. | ||
|---|---|---|---|
| Product: | WebKit | Reporter: | John-David Dalton <john.david.dalton> |
| Component: | DOM | Assignee: | Nobody <webkit-unassigned> |
| Status: | NEW | ||
| Severity: | Normal | CC: | arai.unmht, ashvayka, cyb.ai.815, emilio, fpizlo, keith_miller, webkit-bug-importer, ysuzuki |
| Priority: | P2 | Keywords: | InRadar |
| Version: | Safari Technology Preview | ||
| Hardware: | Unspecified | ||
| OS: | Unspecified | ||
John-David Dalton
The following snippet works in Chrome:
(async () => {
var i = document.createElement('iframe');
document.body.appendChild(i);
var a = i.contentWindow.eval('(async () => await 1)');
i.remove(); // someone removes the iframe
const v = await a();
console.log(v);
})();
Our use case has code that works when wired up and then someone removes the iframe and `await` no longer resolves.
| Attachments | ||
|---|---|---|
| Add attachment proposed patch, testcase, etc. |
Radar WebKit Bug Importer
<rdar://problem/68367353>
Emilio Cobos Álvarez (:emilio)
This might be a Chrome bug per spec, see: https://bugzilla.mozilla.org/show_bug.cgi?id=1663090#c3
(Though I haven't double-checked)
Yusuke Suzuki
Currently, what we should do is not fully clarified in the spec.
It is ongoing discussion. But I think forever-pending promise would make sense since we should stop execution of script, and rejecting promise can involve script execution.
https://github.com/whatwg/html/issues/2621
Tooru Fujisawa [:arai]
With the latest Safari Technology Preview (Release 220 (Safari 18.4, WebKit 20622.1.14.5)), the equivalent testcase now logs "1"
https://bug1663090.bmoattachments.org/attachment.cgi?id=9174036
Was there any change around how the promise reaction jobs in detached iframe works?
I'd like to see when and how the behavior changed.
Regarding the spec, it looks like there were a bunch of changes around how iframe and related conditions are defined,
but I cannot locate any semantic change that affects the jobs in detached iframes,
and to my understanding the expected behavior is still "the promise reaction job in the testcase is never called".
https://bugzilla.mozilla.org/show_bug.cgi?id=1663090#c16
https://bugzilla.mozilla.org/show_bug.cgi?id=1663090#c17
Tooru Fujisawa [:arai]
So it turns out this is causing inter-op issue as mentioned in https://github.com/whatwg/html/issues/11252 .
A WPT testcase for the behavior is going to be added in https://bugzilla.mozilla.org/show_bug.cgi?id=1972990 .
The testcase fails on Safari/WebKit because those promise reaction/thenable jobs in detached iframe gets executed, while the global is considered to be not-fully-active.