Changeset 246729 in webkit


Ignore:
Timestamp:
Jun 24, 2019 3:45:34 AM (5 years ago)
Author:
graouts@webkit.org
Message:

[Pointer Events] Respect pointer capture when dispatching mouse boundary events and updating :hover
https://bugs.webkit.org/show_bug.cgi?id=198999
<rdar://problem/51979477>

Unreviewed.

Rolling back all changes made for this bug (r246728 + r246716 + r246674) as it regressed one test
(imported/w3c/web-platform-tests/pointerevents/pointerevent_mouse_pointercapture_in_frame.html).

LayoutTests/imported/w3c:

  • web-platform-tests/pointerevents/pointerevent_boundary_events_at_implicit_release_hoverable_pointers-expected.txt:
  • web-platform-tests/pointerevents/pointerevent_click_during_capture-expected.txt:
  • web-platform-tests/pointerevents/pointerevent_mouse_capture_change_hover-expected.txt:
  • web-platform-tests/pointerevents/pointerevent_setpointercapture_relatedtarget-expected.txt:

Source/WebCore:

  • dom/Document.cpp:

(WebCore::Document::prepareMouseEvent):
(WebCore::Document::updateHoverActiveState):

  • page/EventHandler.cpp:

(WebCore::EventHandler::handleMousePressEvent):
(WebCore::EventHandler::handleMouseMoveEvent):
(WebCore::EventHandler::handleMouseReleaseEvent):
(WebCore::EventHandler::setCapturingMouseEventsElement):

  • page/EventHandler.h:
  • page/PointerCaptureController.cpp:

(WebCore::PointerCaptureController::releasePointerCapture):
(WebCore::PointerCaptureController::hasPointerCapture):
(WebCore::PointerCaptureController::dispatchEventForTouchAtIndex):
(WebCore::PointerCaptureController::dispatchEvent):
(WebCore::PointerCaptureController::processPendingPointerCapture):
(WebCore::PointerCaptureController::pointerCaptureElement): Deleted.

  • page/PointerCaptureController.h:
  • rendering/HitTestRequest.h:

(WebCore::HitTestRequest::includesAllElementsUnderPoint const):
(WebCore::HitTestRequest::pointerCaptureElementChanged const): Deleted.

LayoutTests:

  • platform/mac-highsierra-wk1/imported/w3c/web-platform-tests/pointerevents/pointerevent_mouse_capture_change_hover-expected.txt: Added.
  • platform/mac-highsierra/imported/w3c/web-platform-tests/pointerevents/pointerevent_mouse_capture_change_hover-expected.txt: Added.
  • platform/mac-wk1/imported/w3c/web-platform-tests/pointerevents/pointerevent_boundary_events_at_implicit_release_hoverable_pointers-expected.txt:
  • platform/mac-wk1/imported/w3c/web-platform-tests/pointerevents/pointerevent_click_during_capture-expected.txt: Removed.
  • platform/mac-wk1/imported/w3c/web-platform-tests/pointerevents/pointerevent_mouse_pointercapture_in_frame-expected.txt: Added.
  • platform/mac-wk1/imported/w3c/web-platform-tests/pointerevents/pointerevent_setpointercapture_relatedtarget-expected.txt:
Location:
trunk
Files:
7 added
1 deleted
16 edited
1 copied

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r246727 r246729  
     12019-06-24  Antoine Quint  <graouts@apple.com>
     2
     3        [Pointer Events] Respect pointer capture when dispatching mouse boundary events and updating :hover
     4        https://bugs.webkit.org/show_bug.cgi?id=198999
     5        <rdar://problem/51979477>
     6
     7        Unreviewed.
     8
     9        Rolling back all changes made for this bug (r246728 + r246716 + r246674) as it regressed one test
     10        (imported/w3c/web-platform-tests/pointerevents/pointerevent_mouse_pointercapture_in_frame.html).
     11
     12        * platform/mac-highsierra-wk1/imported/w3c/web-platform-tests/pointerevents/pointerevent_mouse_capture_change_hover-expected.txt: Added.
     13        * platform/mac-highsierra/imported/w3c/web-platform-tests/pointerevents/pointerevent_mouse_capture_change_hover-expected.txt: Added.
     14        * platform/mac-wk1/imported/w3c/web-platform-tests/pointerevents/pointerevent_boundary_events_at_implicit_release_hoverable_pointers-expected.txt:
     15        * platform/mac-wk1/imported/w3c/web-platform-tests/pointerevents/pointerevent_click_during_capture-expected.txt: Removed.
     16        * platform/mac-wk1/imported/w3c/web-platform-tests/pointerevents/pointerevent_mouse_pointercapture_in_frame-expected.txt: Added.
     17        * platform/mac-wk1/imported/w3c/web-platform-tests/pointerevents/pointerevent_setpointercapture_relatedtarget-expected.txt:
     18
    1192019-06-23  Fujii Hironori  <Hironori.Fujii@sony.com>
    220
  • trunk/LayoutTests/imported/w3c/ChangeLog

    r246721 r246729  
     12019-06-24  Antoine Quint  <graouts@apple.com>
     2
     3        [Pointer Events] Respect pointer capture when dispatching mouse boundary events and updating :hover
     4        https://bugs.webkit.org/show_bug.cgi?id=198999
     5        <rdar://problem/51979477>
     6
     7        Unreviewed.
     8
     9        Rolling back all changes made for this bug (r246728 + r246716 + r246674) as it regressed one test
     10        (imported/w3c/web-platform-tests/pointerevents/pointerevent_mouse_pointercapture_in_frame.html).
     11
     12        * web-platform-tests/pointerevents/pointerevent_boundary_events_at_implicit_release_hoverable_pointers-expected.txt:
     13        * web-platform-tests/pointerevents/pointerevent_click_during_capture-expected.txt:
     14        * web-platform-tests/pointerevents/pointerevent_mouse_capture_change_hover-expected.txt:
     15        * web-platform-tests/pointerevents/pointerevent_setpointercapture_relatedtarget-expected.txt:
     16
    1172019-06-23  Antoine Quint  <graouts@apple.com>
    218
  • trunk/LayoutTests/imported/w3c/web-platform-tests/pointerevents/pointerevent_boundary_events_at_implicit_release_hoverable_pointers-expected.txt

    r246674 r246729  
    77Click on the black box with mouse and do not move the mouse after or during the click.
    88
    9 FAIL mouse Event sequence at implicit release on click assert_equals: expected "pointerout@target, pointerleave@target, pointerover@capture-target, pointerenter@capture-target, gotpointercapture@capture-target, pointerup@capture-target, lostpointercapture@capture-target, pointerout@capture-target, pointerleave@capture-target, pointerover@target, pointerenter@target" but got "pointerout@target, pointerleave@target, pointerover@capture-target, pointerenter@capture-target, gotpointercapture@capture-target, pointerup@target, lostpointercapture@capture-target, pointerout@capture-target, pointerleave@capture-target, pointerover@target, pointerenter@target"
     9FAIL mouse Event sequence at implicit release on click assert_equals: expected "pointerout@target, pointerleave@target, pointerover@capture-target, pointerenter@capture-target, gotpointercapture@capture-target, pointerup@capture-target, lostpointercapture@capture-target, pointerout@capture-target, pointerleave@capture-target, pointerover@target, pointerenter@target" but got "gotpointercapture@capture-target, pointerup@capture-target, lostpointercapture@capture-target"
    1010
  • trunk/LayoutTests/imported/w3c/web-platform-tests/pointerevents/pointerevent_click_during_capture-expected.txt

    r246674 r246729  
    1010
    1111
    12 FAIL mouse click target during capture assert_equals: An element should only receive click when it is the first common ancestor of pointerdown and pointerup targets expected "pointerdown@green,gotpointercapture@blue,pointerup@blue,click@grey,lostpointercapture@blue" but got "pointerdown@green,gotpointercapture@blue,pointerup@green,lostpointercapture@blue"
     12FAIL mouse click target during capture assert_equals: An element should only receive click when it is the first common ancestor of pointerdown and pointerup targets expected "pointerdown@green,gotpointercapture@blue,pointerup@blue,click@grey,lostpointercapture@blue" but got "pointerdown@green,gotpointercapture@blue,pointerup@blue,lostpointercapture@blue"
    1313PASS Click target when pointerup/down targeted at the same element with no capture
    1414PASS Click target when pointerup/down targeted at different elements with no capture
  • trunk/LayoutTests/imported/w3c/web-platform-tests/pointerevents/pointerevent_mouse_capture_change_hover-expected.txt

    r246674 r246729  
    11
    2 PASS Mouse down and capture to green.
    3 PASS Mouse down at green and capture to blue.
    4 PASS Mouse down and capture to green, move to blue and release capture
     2FAIL Mouse down and capture to green. assert_array_equals: Received events: green received pointerover,green received pointerenter,green received pointermove,green received pointerdown,green received gotpointercapture,green received pointermove,green received pointerout,green received pointerleave,green received pointerover,green received pointerenter,green received pointermove lengths differ, expected 7 got 11
     3FAIL Mouse down at green and capture to blue. assert_array_equals: Received events: green received pointerout,green received pointerover,green received pointerenter,green received pointermove,green received pointermove,green received pointermove,green received pointermove lengths differ, expected 11 got 7
     4FAIL Mouse down and capture to green, move to blue and release capture assert_array_equals: Received events: green received pointerout,green received pointerover,green received pointerenter,green received pointermove,green received lostpointercapture,green received pointermove,green received pointerout,green received pointerleave,blue received pointerover,blue received pointerenter,blue received pointermove,blue received pointermove property 0, expected "green received pointerover" but got "green received pointerout"
    55
  • trunk/LayoutTests/imported/w3c/web-platform-tests/pointerevents/pointerevent_mouse_pointercapture_in_frame-expected.txt

    r246721 r246729  
    11
    22
    3 FAIL Test pointer capture event route across the same-origin frame: Mouse down at inner frame and set pointer capture. assert_array_equals: Received events: innerFrame received pointermove,innerFrame received pointerdown,innerFrame received gotpointercapture,innerFrame received pointermove,innerFrameDocument received pointermove,innerFrameDocument received pointerup,innerFrame received lostpointercapture property 4, expected "innerFrame received pointermove" but got "innerFrameDocument received pointermove"
    4 FAIL Test pointer capture event route across the same-origin frame: Mouse down at outer frame body and set pointer capture. assert_array_equals: Received events: outerFrame received pointermove,outerFrame received pointerdown,outerFrame received gotpointercapture,outerFrame received pointermove,innerFrame received pointerup,outerFrame received lostpointercapture property 4, expected "outerFrame received pointerup" but got "innerFrame received pointerup"
    5 FAIL Test pointer capture event route across the same-origin frame: Mouse down with set capture at inner frame, then release on next mouse move. assert_array_equals: Received events: innerFrame received pointermove,innerFrame received pointerdown,innerFrame received gotpointercapture,innerFrame received pointermove,innerFrame received lostpointercapture,innerFrameDocument received pointermove,outerFrame received pointermove,outerFrame received pointerup lengths differ, expected 7 got 8
     3PASS Test pointer capture event route across the same-origin frame: Mouse down at inner frame and set pointer capture.
     4PASS Test pointer capture event route across the same-origin frame: Mouse down at outer frame body and set pointer capture.
     5PASS Test pointer capture event route across the same-origin frame: Mouse down with set capture at inner frame, then release on next mouse move.
    66PASS Test pointercapture event route across the same-origin frame: Mouse down with set capture at outer frame, then release on next mouse move.
    77
  • trunk/LayoutTests/imported/w3c/web-platform-tests/pointerevents/pointerevent_setpointercapture_relatedtarget-expected.txt

    r246674 r246729  
    1717The following pointer types were detected: mouse.
    1818
    19 The following events were logged: pointerover@target1, pointerover@target0, gotpointercapture@target0, lostpointercapture@target0.
     19The following events were logged: pointerover@target1, gotpointercapture@target0, pointerover@target0, pointerover@target0, lostpointercapture@target0.
    2020
    2121Refresh the page to run the tests again with a different pointer type.
    2222
    2323
     24Harness Error (FAIL), message = 1 duplicate test name: "relatedTarget should not be null even when the capture is set."
     25
    2426PASS pointerover shouldn't trigger for the purple rectangle while the black rectangle has capture
    2527PASS relatedTarget should not be null even when the capture is set.
     28PASS relatedTarget should not be null even when the capture is set.
    2629
  • trunk/LayoutTests/platform/mac-wk1/imported/w3c/web-platform-tests/pointerevents/pointerevent_boundary_events_at_implicit_release_hoverable_pointers-expected.txt

    r246674 r246729  
    77Click on the black box with mouse and do not move the mouse after or during the click.
    88
    9 FAIL mouse Event sequence at implicit release on click assert_equals: expected "pointerout@target, pointerleave@target, pointerover@capture-target, pointerenter@capture-target, gotpointercapture@capture-target, pointerup@capture-target, lostpointercapture@capture-target, pointerout@capture-target, pointerleave@capture-target, pointerover@target, pointerenter@target" but got "pointerout@target, pointerleave@target, pointerover@capture-target, pointerenter@capture-target, gotpointercapture@capture-target, pointerup@target, lostpointercapture@capture-target, pointerout@capture-target, pointerleave@capture-target, pointerover@target, pointerenter@target, pointermove@target"
     9FAIL mouse Event sequence at implicit release on click assert_equals: expected "pointerout@target, pointerleave@target, pointerover@capture-target, pointerenter@capture-target, gotpointercapture@capture-target, pointerup@capture-target, lostpointercapture@capture-target, pointerout@capture-target, pointerleave@capture-target, pointerover@target, pointerenter@target" but got "gotpointercapture@capture-target, pointerup@capture-target, lostpointercapture@capture-target, pointermove@target"
    1010
  • trunk/LayoutTests/platform/mac-wk1/imported/w3c/web-platform-tests/pointerevents/pointerevent_mouse_pointercapture_in_frame-expected.txt

    r246728 r246729  
    11
    22
    3 FAIL Test pointer capture event route across the same-origin frame: Mouse down at inner frame and set pointer capture. assert_array_equals: Received events: innerFrame received pointermove,innerFrame received pointerdown,innerFrame received gotpointercapture,innerFrame received pointermove,innerFrameDocument received pointermove,innerFrameDocument received pointerup,innerFrame received lostpointercapture property 4, expected "innerFrame received pointermove" but got "innerFrameDocument received pointermove"
    4 FAIL Test pointer capture event route across the same-origin frame: Mouse down at outer frame body and set pointer capture. assert_array_equals: Received events: outerFrame received pointermove,outerFrame received pointerdown,outerFrame received gotpointercapture,outerFrame received pointermove,innerFrame received pointerup,outerFrame received lostpointercapture property 4, expected "outerFrame received pointerup" but got "innerFrame received pointerup"
    5 FAIL Test pointer capture event route across the same-origin frame: Mouse down with set capture at inner frame, then release on next mouse move. assert_array_equals: Received events: innerFrame received pointermove,innerFrame received pointerdown,innerFrame received gotpointercapture,innerFrame received pointermove,innerFrame received lostpointercapture,innerFrameDocument received pointermove,outerFrame received pointermove,outerFrame received pointerup lengths differ, expected 7 got 8
    6 PASS Test pointercapture event route across the same-origin frame: Mouse down with set capture at outer frame, then release on next mouse move.
     3FAIL Test pointer capture event route across the same-origin frame: Mouse down at inner frame and set pointer capture. assert_array_equals: Received events: innerFrame received pointermove,innerFrame received pointerdown,innerFrame received gotpointercapture,innerFrame received pointermove,innerFrame received pointermove,innerFrame received pointerup,innerFrame received lostpointercapture,outerFrame received pointermove lengths differ, expected 7 got 8
     4FAIL Test pointer capture event route across the same-origin frame: Mouse down at outer frame body and set pointer capture. assert_array_equals: Received events: outerFrame received pointermove,outerFrame received pointerdown,outerFrame received gotpointercapture,outerFrame received pointermove,outerFrame received pointerup,outerFrame received lostpointercapture,innerFrame received pointermove lengths differ, expected 6 got 7
     5FAIL Test pointer capture event route across the same-origin frame: Mouse down with set capture at inner frame, then release on next mouse move. assert_array_equals: Received events: innerFrame received pointermove,innerFrame received pointerdown,innerFrame received gotpointercapture,innerFrame received pointermove,innerFrame received lostpointercapture,innerFrameDocument received pointermove,outerFrame received pointerup,innerFrameDocument received pointermove,outerFrame received pointermove lengths differ, expected 7 got 9
     6FAIL Test pointercapture event route across the same-origin frame: Mouse down with set capture at outer frame, then release on next mouse move. assert_array_equals: Received events: outerFrame received pointermove,outerFrame received pointerdown,outerFrame received gotpointercapture,outerFrame received pointermove,outerFrame received lostpointercapture,innerFrameElement received pointermove,innerFrameElement received pointerup,innerFrame received pointermove lengths differ, expected 7 got 8
    77
  • trunk/LayoutTests/platform/mac-wk1/imported/w3c/web-platform-tests/pointerevents/pointerevent_setpointercapture_relatedtarget-expected.txt

    r246674 r246729  
    1717The following pointer types were detected: mouse.
    1818
    19 The following events were logged: pointerover@target1, pointerover@target0, gotpointercapture@target0, lostpointercapture@target0.
     19The following events were logged: pointerover@target1, gotpointercapture@target0, pointerover@target0, pointerover@target0, lostpointercapture@target0, pointerover@target0.
    2020
    2121Refresh the page to run the tests again with a different pointer type.
    2222
    2323
     24Harness Error (FAIL), message = 1 duplicate test name: "relatedTarget should not be null even when the capture is set."
     25
    2426PASS pointerover shouldn't trigger for the purple rectangle while the black rectangle has capture
    2527PASS relatedTarget should not be null even when the capture is set.
     28PASS relatedTarget should not be null even when the capture is set.
    2629
  • trunk/Source/WebCore/ChangeLog

    r246728 r246729  
     12019-06-24  Antoine Quint  <graouts@apple.com>
     2
     3        [Pointer Events] Respect pointer capture when dispatching mouse boundary events and updating :hover
     4        https://bugs.webkit.org/show_bug.cgi?id=198999
     5        <rdar://problem/51979477>
     6
     7        Unreviewed.
     8
     9        Rolling back all changes made for this bug (r246728 + r246716 + r246674) as it regressed one test
     10        (imported/w3c/web-platform-tests/pointerevents/pointerevent_mouse_pointercapture_in_frame.html).
     11
     12        * dom/Document.cpp:
     13        (WebCore::Document::prepareMouseEvent):
     14        (WebCore::Document::updateHoverActiveState):
     15        * page/EventHandler.cpp:
     16        (WebCore::EventHandler::handleMousePressEvent):
     17        (WebCore::EventHandler::handleMouseMoveEvent):
     18        (WebCore::EventHandler::handleMouseReleaseEvent):
     19        (WebCore::EventHandler::setCapturingMouseEventsElement):
     20        * page/EventHandler.h:
     21        * page/PointerCaptureController.cpp:
     22        (WebCore::PointerCaptureController::releasePointerCapture):
     23        (WebCore::PointerCaptureController::hasPointerCapture):
     24        (WebCore::PointerCaptureController::dispatchEventForTouchAtIndex):
     25        (WebCore::PointerCaptureController::dispatchEvent):
     26        (WebCore::PointerCaptureController::processPendingPointerCapture):
     27        (WebCore::PointerCaptureController::pointerCaptureElement): Deleted.
     28        * page/PointerCaptureController.h:
     29        * rendering/HitTestRequest.h:
     30        (WebCore::HitTestRequest::includesAllElementsUnderPoint const):
     31        (WebCore::HitTestRequest::pointerCaptureElementChanged const): Deleted.
     32
    1332019-06-23  Antoine Quint  <graouts@apple.com>
    234
  • trunk/Source/WebCore/dom/Document.cpp

    r246674 r246729  
    321321#endif
    322322
    323 #if ENABLE(POINTER_EVENTS)
    324 #include "PointerCaptureController.h"
    325 #endif
    326 
    327323namespace WebCore {
    328324
     
    37373733    hitTest(request, result);
    37383734
    3739     if (!request.readOnly()) {
    3740         auto targetElement = makeRefPtr(result.targetElement());
    3741 #if ENABLE(POINTER_EVENTS)
    3742         if (auto* page = this->page()) {
    3743             if (auto* captureElement = page->pointerCaptureController().pointerCaptureElement(mousePointerID))
    3744                 targetElement = captureElement;
    3745         }
    3746 #endif
    3747         updateHoverActiveState(request, targetElement.get());
    3748     }
     3735    if (!request.readOnly())
     3736        updateHoverActiveState(request, result.targetElement());
    37493737
    37503738    return MouseEventWithHitTestResults(event, result);
     
    67896777    // If the mouse is down and if this is a mouse move event, we want to restrict changes in
    67906778    // :hover/:active to only apply to elements that are in the :active chain that we froze
    6791     // at the time the mouse went down. Unless the pointer capture element was changed, in which
    6792     // case we want to invalidate the chains anyway.
    6793     bool mustBeInActiveChain = request.active() && request.move() && !request.pointerCaptureElementChanged();
     6779    // at the time the mouse went down.
     6780    bool mustBeInActiveChain = request.active() && request.move();
    67946781
    67956782    RefPtr<Element> oldHoveredElement = WTFMove(m_hoveredElement);
  • trunk/Source/WebCore/page/EventHandler.cpp

    r246674 r246729  
    128128#endif
    129129
    130 #if ENABLE(POINTER_EVENTS)
    131 #include "PointerCaptureController.h"
    132 #include "Quirks.h"
    133 #include "RuntimeEnabledFeatures.h"
    134 #endif
    135 
    136130namespace WebCore {
    137131
     
    17961790    m_frame.selection().setCaretBlinkingSuspended(true);
    17971791
    1798 #if ENABLE(POINTER_EVENTS)
    1799     bool swallowEvent = !dispatchMouseEvent(eventNames().mousedownEvent, mouseEvent.targetNode(), true, m_clickCount, platformMouseEvent, true, request, mouseEvent);
    1800 #else
    18011792    bool swallowEvent = !dispatchMouseEvent(eventNames().mousedownEvent, mouseEvent.targetNode(), true, m_clickCount, platformMouseEvent, true);
    1802 #endif
    18031793    m_capturesDragging = !swallowEvent || mouseEvent.scrollbar();
    18041794
     
    20462036        return true;
    20472037   
    2048 #if ENABLE(POINTER_EVENTS)
    2049     swallowEvent = !dispatchMouseEvent(eventNames().mousemoveEvent, mouseEvent.targetNode(), false, 0, platformMouseEvent, true, request, mouseEvent);
    2050 #else
    20512038    swallowEvent = !dispatchMouseEvent(eventNames().mousemoveEvent, mouseEvent.targetNode(), false, 0, platformMouseEvent, true);
    2052 #endif
    2053 
    20542039#if ENABLE(DRAG_SUPPORT)
    20552040    if (!swallowEvent)
     
    21542139        return !dispatchMouseEvent(eventNames().mouseupEvent, m_lastElementUnderMouse.get(), cancelable, m_clickCount, platformMouseEvent, setUnder);
    21552140    }
    2156 
    2157     bool shouldFireBoundaryEventsWithClick = true;
    2158 #if ENABLE(POINTER_EVENTS)
    2159     if (m_frame.page()->pointerCaptureController().hasPointerCapture(m_capturingMouseEventsElement.get(), mousePointerID)) {
    2160         // If we have pointer capture enabled, it will be disabled by virtue of receiving a "pointerup" event. For :active and :hover
    2161         // styles to be set correctly when prepareMouseEvent() is called below, we should already reset pointer capture.
    2162         // We must also reset m_capturingMouseEventsElement to ensure boundary mouse events are dispatched on the hit-testing target.
    2163         // Finally, the click event target may differ from the hit-testing target, so let's not dispatch boundary mouse events as part of
    2164         // dispatching the click event below.
    2165         m_frame.page()->pointerCaptureController().releasePointerCapture(m_capturingMouseEventsElement.get(), mousePointerID);
    2166         m_capturingMouseEventsElement = nullptr;
    2167         shouldFireBoundaryEventsWithClick = false;
    2168     }
    2169 #endif
    21702141
    21712142    HitTestRequest request(HitTestRequest::Release | HitTestRequest::DisallowUserAgentShadowContent);
     
    21822153
    21832154    Node* nodeToClick = targetNodeForClickEvent(m_clickNode.get(), mouseEvent.targetNode());
    2184     bool swallowClickEvent = m_clickCount > 0 && !contextMenuEvent && nodeToClick && !dispatchMouseEvent(eventNames().clickEvent, nodeToClick, true, m_clickCount, platformMouseEvent, shouldFireBoundaryEventsWithClick);
    2185 
    2186     // Since we did not dispatch boundary mouse events while dispatching the click event, since the click node would have been used,
    2187     // we need to dispatch them now accounting for the hit-testing node.
    2188     if (!shouldFireBoundaryEventsWithClick)
    2189         updateMouseEventTargetNode(mouseEvent.targetNode(), platformMouseEvent, FireMouseOverOut::Yes);
     2155    bool swallowClickEvent = m_clickCount > 0 && !contextMenuEvent && nodeToClick && !dispatchMouseEvent(eventNames().clickEvent, nodeToClick, true, m_clickCount, platformMouseEvent, true);
    21902156
    21912157    if (m_resizeLayer) {
     
    25132479void EventHandler::setCapturingMouseEventsElement(Element* element)
    25142480{
    2515     if (m_capturingMouseEventsElement == element)
    2516         return;
    2517 
    25182481    m_capturingMouseEventsElement = element;
    25192482    m_eventHandlerWillResetCapturingMouseEventsElement = false;
    2520 
    2521 #if ENABLE(POINTER_EVENTS)
    2522     // If we have a new capture element, we need to dispatch boundary mouse events.
    2523     if (element && !element->document().quirks().shouldDisablePointerEventsQuirk() && RuntimeEnabledFeatures::sharedFeatures().pointerEventsEnabled())
    2524         updateMouseEventTargetNode(element, m_mouseDown, FireMouseOverOut::Yes);
    2525 #endif
    25262483}
    25272484
     
    26462603    }
    26472604}
    2648 
    2649 #if ENABLE(POINTER_EVENTS)
    2650 bool EventHandler::dispatchMouseEvent(const AtomString& eventType, Node* targetNode, bool cancelable, int clickCount, const PlatformMouseEvent& platformMouseEvent, bool setUnder, const HitTestRequest& request, MouseEventWithHitTestResults& mouseEvent)
    2651 {
    2652     if (!RuntimeEnabledFeatures::sharedFeatures().pointerEventsEnabled() || (targetNode && targetNode->ownerDocument() && targetNode->document().quirks().shouldDisablePointerEventsQuirk()))
    2653         return dispatchMouseEvent(eventType, targetNode, cancelable, clickCount, platformMouseEvent, setUnder);
    2654 
    2655     auto& pointerCaptureController = m_frame.page()->pointerCaptureController();
    2656     auto* oldCaptureElement = pointerCaptureController.pointerCaptureElement(mousePointerID);
    2657     bool defaultPrevented = dispatchMouseEvent(eventType, targetNode, cancelable, clickCount, platformMouseEvent, setUnder);
    2658     auto* newCaptureElement = pointerCaptureController.pointerCaptureElement(mousePointerID);
    2659     if (oldCaptureElement != newCaptureElement)
    2660         mouseEvent = prepareMouseEvent(HitTestRequest(request.type() | HitTestRequest::PointerCaptureElementChanged), platformMouseEvent);
    2661     return defaultPrevented;
    2662 }
    2663 #endif
    26642605
    26652606bool EventHandler::dispatchMouseEvent(const AtomString& eventType, Node* targetNode, bool /*cancelable*/, int clickCount, const PlatformMouseEvent& platformMouseEvent, bool setUnder)
  • trunk/Source/WebCore/page/EventHandler.h

    r246674 r246729  
    414414
    415415    bool dispatchMouseEvent(const AtomString& eventType, Node* target, bool cancelable, int clickCount, const PlatformMouseEvent&, bool setUnder);
    416 #if ENABLE(POINTER_EVENTS)
    417     bool dispatchMouseEvent(const AtomString& eventType, Node* target, bool cancelable, int clickCount, const PlatformMouseEvent&, bool setUnder, const HitTestRequest&, MouseEventWithHitTestResults&);
    418 #endif
    419416
    420417#if ENABLE(DRAG_SUPPORT)
  • trunk/Source/WebCore/page/PointerCaptureController.cpp

    r246728 r246729  
    4949}
    5050
    51 Element* PointerCaptureController::pointerCaptureElement(PointerID pointerId)
    52 {
    53     auto iterator = m_activePointerIdsToCapturingData.find(pointerId);
    54     if (iterator != m_activePointerIdsToCapturingData.end())
    55         return iterator->value.pendingTargetOverride.get();
    56     return nullptr;
    57 }
    58 
    5951ExceptionOr<void> PointerCaptureController::setPointerCapture(Element* capturingTarget, PointerID pointerId)
    6052{
     
    10597
    10698    // 3. For the specified pointerId, clear the pending pointer capture target override, if set.
    107     auto& capturingData = iterator->value;
    108     capturingData.pendingTargetOverride = nullptr;
    109 
    110     // Since we may not call processPendingPointerCapture() until the dispatch of the next event,
    111     // we must reset EventHandler's capturing mouse element right now so that the next event processed
    112     // does not use it as an overriding target.
    113     if (capturingData.pointerType == PointerEvent::mousePointerType())
    114         m_page.mainFrame().eventHandler().setCapturingMouseEventsElement(nullptr);
     99    iterator->value.pendingTargetOverride = nullptr;
    115100
    116101    return { };
     
    124109    // In particular, returns true if the pending pointer capture target override for pointerId is set to the element on which this method is
    125110    // invoked, and false otherwise.
    126 
    127     if (!capturingTarget)
    128         return false;
    129111
    130112    auto iterator = m_activePointerIdsToCapturingData.find(pointerId);
     
    193175void PointerCaptureController::dispatchEventForTouchAtIndex(EventTarget& target, const PlatformTouchEvent& platformTouchEvent, unsigned index, bool isPrimary, WindowProxy& view)
    194176{
    195     auto dispatchOverOrOutEvent = [&](const String& type) {
     177    auto dispatchEvent = [&](const String& type) {
    196178        target.dispatchEvent(PointerEvent::create(type, platformTouchEvent, index, isPrimary, view));
    197179    };
     
    232214        // For input devices that do not support hover, a user agent MUST also fire a pointer event named pointerover followed by a pointer event named
    233215        // pointerenter prior to dispatching the pointerdown event.
    234         dispatchOverOrOutEvent(eventNames().pointeroverEvent);
     216        dispatchEvent(eventNames().pointeroverEvent);
    235217        dispatchEnterOrLeaveEvent(eventNames().pointerenterEvent);
    236218    }
    237219
    238     dispatchEvent(pointerEvent, &target);
     220    pointerEventWillBeDispatched(pointerEvent, &target);
     221    target.dispatchEvent(pointerEvent);
     222    pointerEventWasDispatched(pointerEvent);
    239223
    240224    if (pointerEvent->type() == eventNames().pointerupEvent) {
     
    242226        // For input devices that do not support hover, a user agent MUST also fire a pointer event named pointerout followed by a
    243227        // pointer event named pointerleave after dispatching the pointerup event.
    244         dispatchOverOrOutEvent(eventNames().pointeroutEvent);
     228        dispatchEvent(eventNames().pointeroutEvent);
    245229        dispatchEnterOrLeaveEvent(eventNames().pointerleaveEvent);
    246230    }
     
    285269void PointerCaptureController::dispatchEvent(PointerEvent& event, EventTarget* target)
    286270{
     271    auto iterator = m_activePointerIdsToCapturingData.find(event.pointerId());
     272    if (iterator != m_activePointerIdsToCapturingData.end()) {
     273        auto& capturingData = iterator->value;
     274        if (capturingData.pendingTargetOverride && capturingData.targetOverride)
     275            target = capturingData.targetOverride.get();
     276    }
     277
     278    if (!target || event.target())
     279        return;
     280
    287281    pointerEventWillBeDispatched(event, target);
    288282    target->dispatchEvent(event);
     
    408402void PointerCaptureController::processPendingPointerCapture(const PointerEvent& event)
    409403{
    410     if (m_processingPendingPointerCapture)
    411         return;
    412    
    413     m_processingPendingPointerCapture = true;
    414    
    415404    // https://w3c.github.io/pointerevents/#process-pending-pointer-capture
    416405
     
    423412    // 1. If the pointer capture target override for this pointer is set and is not equal to the pending pointer capture target override,
    424413    // then fire a pointer event named lostpointercapture at the pointer capture target override node.
    425     if (capturingData.targetOverride && capturingData.targetOverride != capturingData.pendingTargetOverride) {
    426         if (event.pointerType() == PointerEvent::mousePointerType())
    427             m_page.mainFrame().eventHandler().setCapturingMouseEventsElement(nullptr);
     414    if (capturingData.targetOverride && capturingData.targetOverride != capturingData.pendingTargetOverride)
    428415        capturingData.targetOverride->dispatchEvent(PointerEvent::createForPointerCapture(eventNames().lostpointercaptureEvent, event));
    429     }
    430416
    431417    // 2. If the pending pointer capture target override for this pointer is set and is not equal to the pointer capture target override,
    432418    // then fire a pointer event named gotpointercapture at the pending pointer capture target override.
    433     if (capturingData.pendingTargetOverride && capturingData.targetOverride != capturingData.pendingTargetOverride) {
    434         if (event.pointerType() == PointerEvent::mousePointerType())
    435             m_page.mainFrame().eventHandler().setCapturingMouseEventsElement(capturingData.pendingTargetOverride.get());
     419    if (capturingData.pendingTargetOverride && capturingData.targetOverride != capturingData.pendingTargetOverride)
    436420        capturingData.pendingTargetOverride->dispatchEvent(PointerEvent::createForPointerCapture(eventNames().gotpointercaptureEvent, event));
    437     }
    438421
    439422    // 3. Set the pointer capture target override to the pending pointer capture target override, if set. Otherwise, clear the pointer
    440423    // capture target override.
    441424    capturingData.targetOverride = capturingData.pendingTargetOverride;
    442 
    443     m_processingPendingPointerCapture = false;
    444425}
    445426
  • trunk/Source/WebCore/page/PointerCaptureController.h

    r246674 r246729  
    6161    void dispatchEvent(PointerEvent&, EventTarget*);
    6262    WEBCORE_EXPORT void cancelPointer(PointerID, const IntPoint&);
    63     Element* pointerCaptureElement(PointerID);
    6463
    6564private:
     
    8483    using PointerIdToCapturingDataMap = HashMap<int64_t, CapturingData, WTF::IntHash<int64_t>, WTF::SignedWithZeroKeyHashTraits<int64_t>>;
    8584    PointerIdToCapturingDataMap m_activePointerIdsToCapturingData;
    86     bool m_processingPendingPointerCapture { false };
    8785};
    8886
  • trunk/Source/WebCore/rendering/HitTestRequest.h

    r246674 r246729  
    4545        CollectMultipleElements = 1 << 13,
    4646        // When using list-based testing, continue hit testing even after a hit has been found.
    47         IncludeAllElementsUnderPoint = 1 << 14,
    48         // When the pointer capture target has changed, we should disregard the move and active bits when invalidating the :active and :hover chains.
    49         PointerCaptureElementChanged = 1 << 15
     47        IncludeAllElementsUnderPoint = 1 << 14
    5048    };
    5149
     
    7270    bool resultIsElementList() const { return m_requestType & CollectMultipleElements; }
    7371    bool includesAllElementsUnderPoint() const { return m_requestType & IncludeAllElementsUnderPoint; }
    74     bool pointerCaptureElementChanged() const { return m_requestType & PointerCaptureElementChanged; }
    7572
    7673    // Convenience functions
Note: See TracChangeset for help on using the changeset viewer.