Skip to content

Commit 0d05525

Browse files
committedJul 15, 2024
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 whatwg#1293.
1 parent 7c494e5 commit 0d05525

File tree

1 file changed

+30
-4
lines changed

1 file changed

+30
-4
lines changed
 

‎dom.bs

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

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

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

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

0 commit comments

Comments
 (0)