From 0d05525a8e0d72cdb0acbc3ecd7c8dc4eb71902e Mon Sep 17 00:00:00 2001 From: Scott Haseley Date: Thu, 27 Jun 2024 15:24:59 -0700 Subject: [PATCH] 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. --- dom.bs | 34 ++++++++++++++++++++++++++++++---- 1 file changed, 30 insertions(+), 4 deletions(-) diff --git a/dom.bs b/dom.bs index e67515e70..a1f897820 100644 --- a/dom.bs +++ b/dom.bs @@ -2033,16 +2033,42 @@ an optional reason:
  • Set signal's [=AbortSignal/abort reason=] to reason if it is given; otherwise to a new "{{AbortError!!exception}}" {{DOMException}}. +

  • Let dependentSignalsToAbort be a new list. + +

  • +

    For each dependentSignal of signal's + [=AbortSignal/dependent signals=]: + +

      +
    1. +

      If dependentSignal is not [=AbortSignal/aborted=], then: + +

        +
      1. Set dependentSignal's [=AbortSignal/abort reason=] to signal's + [=AbortSignal/abort reason=]. + +

      2. Append dependentSignal to + dependentSignalsToAbort. +

      +
    + +
  • Run the abort steps for signal. + +

  • For each dependentSignal of dependentSignalsToAbort, + run the abort steps for dependentSignal. + + + +

    +

    To run the abort steps for an {{AbortSignal}} signal: + +

    1. For each algorithm of signal's [=AbortSignal/abort algorithms=]: run algorithm.

    2. Empty signal's abort algorithms.

    3. [=Fire an event=] named {{AbortSignal/abort}} at signal. - -

    4. For each dependentSignal of signal's - [=AbortSignal/dependent signals=], [=AbortSignal/signal abort=] on dependentSignal with - signal's [=AbortSignal/abort reason=].