Skip to content

Commit 0b5f3aa

Browse files
authored
Mark dependent abort signals as aborted before firing events
The assert in 4.2.1 of "create a dependent abort signal" fails when creating a dependent signal while dispatching abort events or running abort algorithms if abort had not yet been propagated to one of the sources. This fix splits "signal abort" into two phases: first, set the abort reason on the signal being aborted and all of its unaborted dependents; next, run the abort algorithms and dispatch events for the signal and those same dependents. Note that: 1. Dependent signals do not themselves have dependent signals, which means it's unnecessary to recursively call "signal abort" 2. This approach retains the existing event dispatch order, while ensuring the abort state is synced before any JS runs This fixes #1293.
1 parent 054356d commit 0b5f3aa

File tree

1 file changed

+30
-4
lines changed

1 file changed

+30
-4
lines changed

dom.bs

Lines changed: 30 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2034,16 +2034,42 @@ an optional <var>reason</var>:
20342034
<li><p>Set <var>signal</var>'s [=AbortSignal/abort reason=] to <var>reason</var> if it is given;
20352035
otherwise to a new "{{AbortError!!exception}}" {{DOMException}}.
20362036

2037+
<li><p>Let <var>dependentSignalsToAbort</var> be a new <a for=/>list</a>.
2038+
2039+
<li>
2040+
<p><a for=set>For each</a> <var>dependentSignal</var> of <var>signal</var>'s
2041+
[=AbortSignal/dependent signals=]:
2042+
2043+
<ol>
2044+
<li>
2045+
<p>If <var>dependentSignal</var> is not [=AbortSignal/aborted=], then:
2046+
2047+
<ol>
2048+
<li><p>Set <var>dependentSignal</var>'s [=AbortSignal/abort reason=] to <var>signal</var>'s
2049+
[=AbortSignal/abort reason=].
2050+
2051+
<li><p><a for=list>Append</a> <var>dependentSignal</var> to
2052+
<var>dependentSignalsToAbort</var>.
2053+
</ol>
2054+
</ol>
2055+
2056+
<li><p><a>Run the abort steps</a> for <var>signal</var>.
2057+
2058+
<li><p><a for=set>For each</a> <var>dependentSignal</var> of <var>dependentSignalsToAbort</var>,
2059+
<a>run the abort steps</a> for <var>dependentSignal</var>.
2060+
</ol>
2061+
</div>
2062+
2063+
<div algorithm>
2064+
<p>To <dfn>run the abort steps</dfn> for an {{AbortSignal}} <var>signal</var>:
2065+
2066+
<ol>
20372067
<li><p><a for=set>For each</a> <var>algorithm</var> of <var>signal</var>'s
20382068
[=AbortSignal/abort algorithms=]: run <var>algorithm</var>.
20392069

20402070
<li><p><a for=set>Empty</a> <var>signal</var>'s <a for=AbortSignal>abort algorithms</a>.
20412071

20422072
<li><p>[=Fire an event=] named {{AbortSignal/abort}} at <var>signal</var>.
2043-
2044-
<li><p><a for=set>For each</a> <var>dependentSignal</var> of <var>signal</var>'s
2045-
[=AbortSignal/dependent signals=], [=AbortSignal/signal abort=] on <var>dependentSignal</var> with
2046-
<var>signal</var>'s [=AbortSignal/abort reason=].
20472073
</ol>
20482074
</div>
20492075

0 commit comments

Comments
 (0)