Changeset 244423 in webkit


Ignore:
Timestamp:
Apr 18, 2019 6:31:17 AM (5 years ago)
Author:
graouts@webkit.org
Message:

[Pointer Events WPT] Unskip imported/w3c/web-platform-tests/pointerevents/pointerevent_lostpointercapture_for_disconnected_node.html
https://bugs.webkit.org/show_bug.cgi?id=197004

Reviewed by Antti Koivisto.

LayoutTests/imported/w3c:

  • web-platform-tests/pointerevents/pointerevent_lostpointercapture_for_disconnected_node-expected.txt: Added.

Source/WebCore:

We need to release pointer capture when an element that has pointer capture is disconnected from the DOM.

  • dom/Element.cpp:

(WebCore::Element::removedFromAncestor): Notify the PointerCaptureController that an element was disconnected.

  • dom/PointerEvent.cpp:

(WebCore::PointerEvent::create): Broaden createPointerCancelEvent() to take in an event type so that we may use it to create a
lostpointercapture event as well.
(WebCore::PointerEvent::createPointerCancelEvent): Deleted.

  • dom/PointerEvent.h:
  • page/PointerCaptureController.cpp:

(WebCore::PointerCaptureController::elementWasRemoved): Check whether the provided element matches one of the target overrides recorded
in the map of captured pointer IDs.
(WebCore::PointerCaptureController::pointerEventWasDispatched): This block of code was actually useless in this location, the new code
added in elementWasRemoved() performs the actions that the spec text mandates.
(WebCore::PointerCaptureController::cancelPointer): Replace the call to createPointerCancelEvent() with one to create().

  • page/PointerCaptureController.h:

LayoutTests:

  • platform/mac/TestExpectations:
Location:
trunk
Files:
1 added
9 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r244421 r244423  
     12019-04-18  Antoine Quint  <graouts@apple.com>
     2
     3        [Pointer Events WPT] Unskip imported/w3c/web-platform-tests/pointerevents/pointerevent_lostpointercapture_for_disconnected_node.html
     4        https://bugs.webkit.org/show_bug.cgi?id=197004
     5
     6        Reviewed by Antti Koivisto.
     7
     8        * platform/mac/TestExpectations:
     9
    1102019-04-17  Antoine Quint  <graouts@apple.com>
    211
  • trunk/LayoutTests/imported/w3c/ChangeLog

    r244421 r244423  
     12019-04-18  Antoine Quint  <graouts@apple.com>
     2
     3        [Pointer Events WPT] Unskip imported/w3c/web-platform-tests/pointerevents/pointerevent_lostpointercapture_for_disconnected_node.html
     4        https://bugs.webkit.org/show_bug.cgi?id=197004
     5
     6        Reviewed by Antti Koivisto.
     7
     8        * web-platform-tests/pointerevents/pointerevent_lostpointercapture_for_disconnected_node-expected.txt: Added.
     9
    1102019-04-17  Antoine Quint  <graouts@apple.com>
    211
  • trunk/LayoutTests/platform/mac/TestExpectations

    r244421 r244423  
    18801880imported/w3c/web-platform-tests/pointerevents/pointerlock/pointerevent_pointermove_on_chorded_mouse_button_when_locked-manual.html [ Skip ]
    18811881
    1882 webkit.org/b/197004 imported/w3c/web-platform-tests/pointerevents/pointerevent_lostpointercapture_for_disconnected_node.html [ Skip ]
    18831882webkit.org/b/197005 imported/w3c/web-platform-tests/pointerevents/pointerevent_lostpointercapture_is_first.html [ Skip ]
    18841883webkit.org/b/197008 imported/w3c/web-platform-tests/pointerevents/pointerevent_suppress_compat_events_on_drag_mouse.html [ Pass Failure ]
  • trunk/Source/WebCore/ChangeLog

    r244421 r244423  
     12019-04-18  Antoine Quint  <graouts@apple.com>
     2
     3        [Pointer Events WPT] Unskip imported/w3c/web-platform-tests/pointerevents/pointerevent_lostpointercapture_for_disconnected_node.html
     4        https://bugs.webkit.org/show_bug.cgi?id=197004
     5
     6        Reviewed by Antti Koivisto.
     7
     8        We need to release pointer capture when an element that has pointer capture is disconnected from the DOM.
     9
     10        * dom/Element.cpp:
     11        (WebCore::Element::removedFromAncestor): Notify the PointerCaptureController that an element was disconnected.
     12        * dom/PointerEvent.cpp:
     13        (WebCore::PointerEvent::create): Broaden createPointerCancelEvent() to take in an event type so that we may use it to create a
     14        lostpointercapture event as well.
     15        (WebCore::PointerEvent::createPointerCancelEvent): Deleted.
     16        * dom/PointerEvent.h:
     17        * page/PointerCaptureController.cpp:
     18        (WebCore::PointerCaptureController::elementWasRemoved): Check whether the provided element matches one of the target overrides recorded
     19        in the map of captured pointer IDs.
     20        (WebCore::PointerCaptureController::pointerEventWasDispatched): This block of code was actually useless in this location, the new code
     21        added in elementWasRemoved() performs the actions that the spec text mandates.
     22        (WebCore::PointerCaptureController::cancelPointer): Replace the call to createPointerCancelEvent() with one to create().
     23        * page/PointerCaptureController.h:
     24
    1252019-04-17  Antoine Quint  <graouts@apple.com>
    226
  • trunk/Source/WebCore/dom/Element.cpp

    r244328 r244423  
    19911991        document().page()->pointerLockController().elementRemoved(*this);
    19921992#endif
     1993#if ENABLE(POINTER_EVENTS)
     1994    if (document().page() && RuntimeEnabledFeatures::sharedFeatures().pointerEventsEnabled())
     1995        document().page()->pointerCaptureController().elementWasRemoved(*this);
     1996#endif
    19931997
    19941998    setSavedLayerScrollPosition(ScrollPosition());
  • trunk/Source/WebCore/dom/PointerEvent.cpp

    r243645 r244423  
    8585}
    8686
    87 Ref<PointerEvent> PointerEvent::createPointerCancelEvent(PointerID pointerId, const String& pointerType)
     87Ref<PointerEvent> PointerEvent::create(const String& type, PointerID pointerId, const String& pointerType)
    8888{
    89     return adoptRef(*new PointerEvent(eventNames().pointercancelEvent, CanBubble::Yes, IsCancelable::No, IsComposed::Yes, pointerId, pointerType));
     89    return adoptRef(*new PointerEvent(type, CanBubble::Yes, IsCancelable::No, IsComposed::Yes, pointerId, pointerType));
    9090}
    9191
  • trunk/Source/WebCore/dom/PointerEvent.h

    r243645 r244423  
    7474
    7575    static RefPtr<PointerEvent> create(const MouseEvent&);
    76     static Ref<PointerEvent> createPointerCancelEvent(PointerID, const String& pointerType);
     76    static Ref<PointerEvent> create(const String& type, PointerID, const String& pointerType);
    7777
    7878#if ENABLE(TOUCH_EVENTS) && PLATFORM(IOS_FAMILY)
  • trunk/Source/WebCore/page/PointerCaptureController.cpp

    r243645 r244423  
    129129}
    130130
     131void PointerCaptureController::elementWasRemoved(Element& element)
     132{
     133    for (auto& keyAndValue : m_activePointerIdsToCapturingData) {
     134        auto& capturingData = keyAndValue.value;
     135        if (capturingData.pendingTargetOverride == &element || capturingData.targetOverride == &element) {
     136            // https://w3c.github.io/pointerevents/#implicit-release-of-pointer-capture
     137            // When the pointer capture target override is no longer connected, the pending pointer capture target override and pointer capture target
     138            // override nodes SHOULD be cleared and also a PointerEvent named lostpointercapture corresponding to the captured pointer SHOULD be fired
     139            // at the document.
     140            auto pointerId = keyAndValue.key;
     141            auto pointerType = capturingData.pointerType;
     142            releasePointerCapture(&element, pointerId);
     143            element.document().enqueueDocumentEvent(PointerEvent::create(eventNames().lostpointercaptureEvent, pointerId, pointerType));
     144            return;
     145        }
     146    }
     147}
     148
    131149void PointerCaptureController::touchEndedOrWasCancelledForIdentifier(PointerID pointerId)
    132150{
     
    232250        if (event.type() == eventNames().pointerupEvent)
    233251            capturingData.pendingTargetOverride = nullptr;
    234 
    235         // When the pointer capture target override is no longer connected, the pending pointer capture target override and pointer
    236         // capture target override nodes SHOULD be cleared and also a PointerEvent named lostpointercapture corresponding to the captured
    237         // pointer SHOULD be fired at the document.
    238         if (capturingData.targetOverride && !capturingData.targetOverride->isConnected()) {
    239             capturingData.pendingTargetOverride = nullptr;
    240             capturingData.targetOverride = nullptr;
    241         }
    242252    }
    243253
     
    282292        return;
    283293
    284     auto event = PointerEvent::createPointerCancelEvent(pointerId, capturingData.pointerType);
     294    auto event = PointerEvent::create(eventNames().pointercancelEvent, pointerId, capturingData.pointerType);
    285295    target->dispatchEvent(event);
    286296    processPendingPointerCapture(WTFMove(event));
  • trunk/Source/WebCore/page/PointerCaptureController.h

    r242893 r244423  
    4747
    4848    void pointerLockWasApplied();
     49    void elementWasRemoved(Element&);
    4950
    5051#if ENABLE(TOUCH_EVENTS) && PLATFORM(IOS_FAMILY)
Note: See TracChangeset for help on using the changeset viewer.