From 39b97c3e175639546814b56bbcf8bc7c2c3ca7ef Mon Sep 17 00:00:00 2001 From: Anne van Kesteren Date: Thu, 6 Sep 2018 14:42:27 +0200 Subject: [PATCH] Fix event path iteration Instead of shoehorning all target handling into the bubbling iteration, this separates "capturing" iteration from "bubbling" iteration and the Event object's phase is set to target as appropriate in both. This also invokes the event listeners in a more natural order. Tests: ... Fixes #685. --- dom.bs | 44 ++++++++++++++++++++++++-------------------- 1 file changed, 24 insertions(+), 20 deletions(-) diff --git a/dom.bs b/dom.bs index e1db26a7..87522b8c 100644 --- a/dom.bs +++ b/dom.bs @@ -1315,22 +1315,28 @@ for discussion). clearTargetsStruct's touch target list is a node and its root is a shadow root, and false otherwise. -
  • Set event's {{Event/eventPhase}} attribute to {{Event/CAPTURING_PHASE}}. -

  • If activationTarget is non-null and activationTarget has legacy-pre-activation behavior, then run activationTarget's legacy-pre-activation behavior.

  • -

    For each struct in event's path, in reverse order: +

    For each struct in event's path, in + reverse order:

      -
    1. If struct's target is null, then invoke with - struct, event, and legacyOutputDidListenersThrowFlag if given. +

    2. If struct's target is non-null, then set + event's {{Event/eventPhase}} attribute to {{Event/AT_TARGET}}. + +

    3. Otherwise, set event's {{Event/eventPhase}} attribute to + {{Event/CAPTURING_PHASE}}. + +

    4. Invoke with struct, event, "capturing", and + legacyOutputDidListenersThrowFlag if given.

  • -

    For each struct in event's path, in order: +

    If event's {{Event/bubbles}} attribute is true, then for each + struct in event's path:

    1. If struct's target is non-null, then set @@ -1339,10 +1345,8 @@ for discussion).

    2. Otherwise, set event's {{Event/eventPhase}} attribute to {{Event/BUBBLING_PHASE}}. -

    3. If either event's {{Event/eventPhase}} attribute is {{Event/BUBBLING_PHASE}} - and event's {{Event/bubbles}} attribute is true or event's - {{Event/eventPhase}} attribute is {{Event/AT_TARGET}}, then invoke with - struct, event, and legacyOutputDidListenersThrowFlag if given. +

    4. Invoke with struct, event, "bubbling", and + legacyOutputDidListenersThrowFlag if given.

    @@ -1406,7 +1410,8 @@ for discussion).

    To invoke, given a struct, -event, and an optional legacyOutputDidListenersThrowFlag, run these steps: +event, phase, and an optional legacyOutputDidListenersThrowFlag, +run these steps:

    1. Set event's target to the target of the @@ -1432,7 +1437,7 @@ for discussion). run. Note that removal still has an effect due to the removed field.

    2. Let found be the result of running inner invoke with event, - listeners, and legacyOutputDidListenersThrowFlag if given. + listeners, phase, and legacyOutputDidListenersThrowFlag if given.

    3. If found is false and event's {{Event/isTrusted}} attribute is true, @@ -1456,7 +1461,7 @@ for discussion). "transitionend""webkitTransitionEnd" -

    4. Inner invoke with event, listeners, and +

    5. Inner invoke with event, listeners, phase, and legacyOutputDidListenersThrowFlag if given.

    6. Set event's {{Event/type}} attribute value to originalEventType. @@ -1464,7 +1469,7 @@ for discussion).

    To inner invoke, given an -event, listeners, and an optional +event, listeners, phase, and an optional legacyOutputDidListenersThrowFlag, run these steps:

      @@ -1480,13 +1485,11 @@ for discussion).
    1. Set found to true. -

    2. If event's {{Event/eventPhase}} attribute value is {{Event/CAPTURING_PHASE}} - and listener's capture is false, then - continue. +

    3. If phase is "capturing" listener's + capture is false, then continue. -

    4. If event's {{Event/eventPhase}} attribute value is {{Event/BUBBLING_PHASE}} and - listener's capture is true, then - continue. +

    5. If phase is "bubbling" and listener's + capture is true, then continue.

    6. If listener's once is true, then remove listener from event's {{Event/currentTarget}} @@ -9983,6 +9986,7 @@ Mark Miller, Martijn van der Ven, Mats Palmgren, Mounir Lamouri, +Michael Stramel, Michaelâ„¢ Smith, Mike Champion, Mike Taylor,