Changeset 269546 in webkit


Ignore:
Timestamp:
Nov 6, 2020 3:28:43 PM (21 months ago)
Author:
Chris Dumez
Message:

Event targets should be cleared after dispatch if target pointed to a shadow tree
https://bugs.webkit.org/show_bug.cgi?id=218638

Reviewed by Darin Adler.

LayoutTests/imported/w3c:

Rebaseline WPT tests now that more checks are passing.

  • web-platform-tests/dom/events/relatedTarget.window-expected.txt:
  • web-platform-tests/shadow-dom/event-post-dispatch-expected.txt:

Source/WebCore:

Event target & relatedTarget should be cleared after dispatch if target pointed to a shadow
tree:

Tests: fast/events/shadow-tree-resetTargets-after-move-in.html

fast/events/shadow-tree-resetTargets-after-move-out.html
fast/events/shadow-tree-resetTargets.html

  • dom/Event.h:

(WebCore::Event::setRelatedTarget):

  • dom/EventContext.cpp:

(WebCore::MouseOrFocusEventContext::handleLocalEvents const):

  • dom/EventContext.h:

(WebCore::EventContext::relatedTarget const):

  • dom/EventDispatcher.cpp:

(WebCore::isInShadowTree):
(WebCore::EventDispatcher::dispatchEvent):

  • dom/FocusEvent.h:
  • dom/MouseEvent.h:

LayoutTests:

  • fast/events/shadow-tree-resetTargets-after-move-in-expected.txt: Added.
  • fast/events/shadow-tree-resetTargets-after-move-in.html: Added.
  • fast/events/shadow-tree-resetTargets-after-move-out-expected.txt: Added.
  • fast/events/shadow-tree-resetTargets-after-move-out.html: Added.
  • fast/events/shadow-tree-resetTargets-expected.txt: Added.
  • fast/events/shadow-tree-resetTargets.html: Added.

Extend layout test coverage.

  • fast/shadow-dom/event-path-with-window.html:

Update the test to expect the the event.target is null after dispatching. Note that this test
was failing in both Firefox and Chrome before this test change, and is now passing with these
engine after the test change.

Location:
trunk
Files:
6 added
12 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r269532 r269546  
     12020-11-06  Chris Dumez  <cdumez@apple.com>
     2
     3        Event targets should be cleared after dispatch if target pointed to a shadow tree
     4        https://bugs.webkit.org/show_bug.cgi?id=218638
     5
     6        Reviewed by Darin Adler.
     7
     8        * fast/events/shadow-tree-resetTargets-after-move-in-expected.txt: Added.
     9        * fast/events/shadow-tree-resetTargets-after-move-in.html: Added.
     10        * fast/events/shadow-tree-resetTargets-after-move-out-expected.txt: Added.
     11        * fast/events/shadow-tree-resetTargets-after-move-out.html: Added.
     12        * fast/events/shadow-tree-resetTargets-expected.txt: Added.
     13        * fast/events/shadow-tree-resetTargets.html: Added.
     14        Extend layout test coverage.
     15
     16        * fast/shadow-dom/event-path-with-window.html:
     17        Update the test to expect the the event.target is null after dispatching. Note that this test
     18        was failing in both Firefox and Chrome before this test change, and is now passing with these
     19        engine after the test change.
     20
    1212020-11-06  Devin Rousso  <drousso@apple.com>
    222
  • trunk/LayoutTests/fast/shadow-dom/event-path-with-window.html

    r249918 r269546  
    4242        assert_array_equals(log.pathAtTargets[1], expectedPath);
    4343
    44         assert_equals(log.event.target, nodes.A1a);
     44        assert_equals(log.event.target, null);
    4545        assert_equals(log.event.currentTarget, null);
    4646    }, 'The event must propagate out of ' + mode + ' mode shadow boundaries when the composed flag is set 1');
  • trunk/LayoutTests/imported/w3c/ChangeLog

    r269531 r269546  
     12020-11-06  Chris Dumez  <cdumez@apple.com>
     2
     3        Event targets should be cleared after dispatch if target pointed to a shadow tree
     4        https://bugs.webkit.org/show_bug.cgi?id=218638
     5
     6        Reviewed by Darin Adler.
     7
     8        Rebaseline WPT tests now that more checks are passing.
     9
     10        * web-platform-tests/dom/events/relatedTarget.window-expected.txt:
     11        * web-platform-tests/shadow-dom/event-post-dispatch-expected.txt:
     12
    1132020-11-06  Yusuke Suzuki  <ysuzuki@apple.com>
    214
  • trunk/LayoutTests/imported/w3c/web-platform-tests/dom/events/relatedTarget.window-expected.txt

    r267660 r269546  
    11
    2 FAIL Reset if target pointed to a shadow tree assert_equals: expected null but got DocumentFragment node with 1 child
     2PASS Reset if target pointed to a shadow tree
    33FAIL Retarget a shadow-tree relatedTarget assert_equals: expected Element node <div><p></p></div> but got DocumentFragment node with 1 child
    4 FAIL Reset if target pointed to a shadow tree pre-dispatch assert_equals: expected null but got Element node <div></div>
     4PASS Reset if target pointed to a shadow tree pre-dispatch
    55PASS Retarget a shadow-tree relatedTarget, part 2
    66FAIL Reset targets on early return assert_equals: expected null but got Element node <div><p></p></div>
  • trunk/LayoutTests/imported/w3c/web-platform-tests/shadow-dom/event-post-dispatch-expected.txt

    r267647 r269546  
    33PASS Event properties post dispatch without ShadowRoots (composed: false).
    44PASS Event properties post dispatch with an open ShadowRoot (composed: true).
    5 FAIL Event properties post dispatch with an open ShadowRoot (composed: false). assert_equals: expected null but got Element node <div id="target"></div>
     5PASS Event properties post dispatch with an open ShadowRoot (composed: false).
    66PASS Event properties post dispatch with a closed ShadowRoot (composed: true).
    7 FAIL Event properties post dispatch with a closed ShadowRoot (composed: false). assert_equals: expected null but got Element node <div id="target"></div>
     7PASS Event properties post dispatch with a closed ShadowRoot (composed: false).
    88PASS Event properties post dispatch with nested ShadowRoots (composed: true).
    9 FAIL Event properties post dispatch with nested ShadowRoots (composed: false). assert_equals: expected null but got Element node <div id="target"></div>
    10 FAIL Event properties post dispatch with relatedTarget in the same shadow tree. (composed: true) assert_equals: expected null but got Element node <div id="target"></div>
    11 FAIL Event properties post dispatch with relatedTarget in the same shadow tree. (composed: false) assert_equals: expected null but got Element node <div id="target"></div>
     9PASS Event properties post dispatch with nested ShadowRoots (composed: false).
     10PASS Event properties post dispatch with relatedTarget in the same shadow tree. (composed: true)
     11PASS Event properties post dispatch with relatedTarget in the same shadow tree. (composed: false)
    1212PASS Event properties post dispatch with relatedTarget in the document tree and the shadow tree. (composed: true)
    13 FAIL Event properties post dispatch with relatedTarget in the document tree and the shadow tree. (composed: false) assert_equals: expected null but got Element node <div id="target"></div>
     13PASS Event properties post dispatch with relatedTarget in the document tree and the shadow tree. (composed: false)
    1414PASS Event properties post dispatch with relatedTarget in the different shadow trees. (composed: true)
    15 FAIL Event properties post dispatch with relatedTarget in the different shadow trees. (composed: false) assert_equals: expected null but got Element node <div id="target"></div>
     15PASS Event properties post dispatch with relatedTarget in the different shadow trees. (composed: false)
    1616
  • trunk/Source/WebCore/ChangeLog

    r269545 r269546  
     12020-11-06  Chris Dumez  <cdumez@apple.com>
     2
     3        Event targets should be cleared after dispatch if target pointed to a shadow tree
     4        https://bugs.webkit.org/show_bug.cgi?id=218638
     5
     6        Reviewed by Darin Adler.
     7
     8        Event target & relatedTarget should be cleared after dispatch if target pointed to a shadow
     9        tree:
     10        - https://dom.spec.whatwg.org/#concept-event-dispatch (Steps 5.10, 5.11 and 10)
     11
     12        Tests: fast/events/shadow-tree-resetTargets-after-move-in.html
     13               fast/events/shadow-tree-resetTargets-after-move-out.html
     14               fast/events/shadow-tree-resetTargets.html
     15
     16        * dom/Event.h:
     17        (WebCore::Event::setRelatedTarget):
     18        * dom/EventContext.cpp:
     19        (WebCore::MouseOrFocusEventContext::handleLocalEvents const):
     20        * dom/EventContext.h:
     21        (WebCore::EventContext::relatedTarget const):
     22        * dom/EventDispatcher.cpp:
     23        (WebCore::isInShadowTree):
     24        (WebCore::EventDispatcher::dispatchEvent):
     25        * dom/FocusEvent.h:
     26        * dom/MouseEvent.h:
     27
    1282020-11-06  Sam Weinig  <weinig@apple.com>
    229
  • trunk/Source/WebCore/dom/Event.h

    r269500 r269546  
    142142
    143143    virtual EventTarget* relatedTarget() const { return nullptr; }
    144     virtual void setRelatedTarget(EventTarget&) { }
     144    virtual void setRelatedTarget(EventTarget*) { }
    145145
    146146protected:
  • trunk/Source/WebCore/dom/EventContext.cpp

    r269500 r269546  
    7979{
    8080    if (m_relatedTarget)
    81         event.setRelatedTarget(*m_relatedTarget);
     81        event.setRelatedTarget(m_relatedTarget.get());
    8282    EventContext::handleLocalEvents(event, phase);
    8383}
  • trunk/Source/WebCore/dom/EventContext.h

    r269500 r269546  
    5353    virtual bool isTouchEventContext() const;
    5454
     55    virtual Node* relatedTarget() const { return nullptr; }
     56
    5557protected:
    5658#if ASSERT_ENABLED
     
    7072    virtual ~MouseOrFocusEventContext();
    7173
    72     Node* relatedTarget() const { return m_relatedTarget.get(); }
     74    Node* relatedTarget() const final { return m_relatedTarget.get(); }
    7375    void setRelatedTarget(Node*);
    7476
  • trunk/Source/WebCore/dom/EventDispatcher.cpp

    r236002 r269546  
    7474}
    7575
     76static bool isInShadowTree(EventTarget* target)
     77{
     78    return is<Node>(target) && downcast<Node>(*target).isInShadowTree();
     79}
     80
    7681static void dispatchEventInDOM(Event& event, const EventPath& path)
    7782{
     
    135140    EventPath eventPath { node, event };
    136141
     142    Optional<bool> shouldClearTargetsAfterDispatch;
     143    for (size_t i = eventPath.size(); i > 0; --i) {
     144        const EventContext& eventContext = eventPath.contextAt(i - 1);
     145        // FIXME: We should also set shouldClearTargetsAfterDispatch to true if an EventTarget object in eventContext's touch target list
     146        // is a node and its root is a shadow root.
     147        if (eventContext.target()) {
     148            shouldClearTargetsAfterDispatch = isInShadowTree(eventContext.target()) || isInShadowTree(eventContext.relatedTarget());
     149            break;
     150        }
     151    }
     152
    137153    ChildNodesLazySnapshot::takeChildNodesLazySnapshot();
    138154
     
    171187        event.setTarget(finalTarget);
    172188    }
     189
     190    if (shouldClearTargetsAfterDispatch.valueOr(false)) {
     191        event.setTarget(nullptr);
     192        event.setRelatedTarget(nullptr);
     193        // FIXME: We should also clear the event's touch target list.
     194    }
    173195}
    174196
  • trunk/Source/WebCore/dom/FocusEvent.h

    r250060 r269546  
    6666    bool isFocusEvent() const final;
    6767
    68     void setRelatedTarget(EventTarget& relatedTarget) final { m_relatedTarget = &relatedTarget; }
     68    void setRelatedTarget(EventTarget* relatedTarget) final { m_relatedTarget = relatedTarget; }
    6969
    7070    RefPtr<EventTarget> m_relatedTarget;
  • trunk/Source/WebCore/dom/MouseEvent.h

    r254029 r269546  
    105105    EventInterface eventInterface() const override;
    106106
    107     void setRelatedTarget(EventTarget& relatedTarget) final { m_relatedTarget = &relatedTarget; }
     107    void setRelatedTarget(EventTarget* relatedTarget) final { m_relatedTarget = relatedTarget; }
    108108
    109109    short m_button { 0 };
Note: See TracChangeset for help on using the changeset viewer.