Changeset 247024 in webkit


Ignore:
Timestamp:
Jul 1, 2019 2:25:57 PM (5 years ago)
Author:
Truitt Savell
Message:

Unreviewed, rolling out r246844.

Broke 12 tests in imported/w3c/web-platform-
tests/pointerevents/

Reverted changeset:

"[Pointer Events] Respect pointer capture when dispatching
mouse boundary events and updating :hover"
https://bugs.webkit.org/show_bug.cgi?id=198999
https://trac.webkit.org/changeset/246844

Location:
trunk
Files:
15 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r247019 r247024  
     12019-07-01  Truitt Savell  <tsavell@apple.com>
     2
     3        Unreviewed, rolling out r246844.
     4
     5        Broke 12 tests in imported/w3c/web-platform-
     6        tests/pointerevents/
     7
     8        Reverted changeset:
     9
     10        "[Pointer Events] Respect pointer capture when dispatching
     11        mouse boundary events and updating :hover"
     12        https://bugs.webkit.org/show_bug.cgi?id=198999
     13        https://trac.webkit.org/changeset/246844
     14
    1152019-07-01  Truitt Savell  <tsavell@apple.com>
    216
  • trunk/LayoutTests/imported/w3c/ChangeLog

    r246844 r247024  
     12019-07-01  Truitt Savell  <tsavell@apple.com>
     2
     3        Unreviewed, rolling out r246844.
     4
     5        Broke 12 tests in imported/w3c/web-platform-
     6        tests/pointerevents/
     7
     8        Reverted changeset:
     9
     10        "[Pointer Events] Respect pointer capture when dispatching
     11        mouse boundary events and updating :hover"
     12        https://bugs.webkit.org/show_bug.cgi?id=198999
     13        https://trac.webkit.org/changeset/246844
     14
    1152019-06-26  Antoine Quint  <graouts@apple.com>
    216
  • trunk/LayoutTests/imported/w3c/web-platform-tests/pointerevents/pointerevent_boundary_events_at_implicit_release_hoverable_pointers-expected.txt

    r246844 r247024  
    11Pointer Event: Boundary event sequence at implicit capture release
     2
     3Follow the test instructions with mouse. If you don't have the device skip it.
    24
    35When a captured pointer is implicitly released after a click, the boundary events should follow the lostpointercapture event.
     
    57Click on the black box with mouse and do not move the mouse after or during the click.
    68
    7 PASS mouse Event sequence at implicit release on click
     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"
    810
  • trunk/LayoutTests/imported/w3c/web-platform-tests/pointerevents/pointerevent_mouse_capture_change_hover-expected.txt

    r246844 r247024  
    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_setpointercapture_relatedtarget-expected.txt

    r246844 r247024  
    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

    r246844 r247024  
    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@capture-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_setpointercapture_relatedtarget-expected.txt

    r246844 r247024  
    1717The following pointer types were detected: mouse.
    1818
    19 The following events were logged: pointerover@target1, pointerover@target0, gotpointercapture@target0, lostpointercapture@target0, pointerover@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

    r247023 r247024  
     12019-07-01  Truitt Savell  <tsavell@apple.com>
     2
     3        Unreviewed, rolling out r246844.
     4
     5        Broke 12 tests in imported/w3c/web-platform-
     6        tests/pointerevents/
     7
     8        Reverted changeset:
     9
     10        "[Pointer Events] Respect pointer capture when dispatching
     11        mouse boundary events and updating :hover"
     12        https://bugs.webkit.org/show_bug.cgi?id=198999
     13        https://trac.webkit.org/changeset/246844
     14
    1152019-07-01  Truitt Savell  <tsavell@apple.com>
    216
  • trunk/Source/WebCore/dom/Document.cpp

    r246938 r247024  
    321321#endif
    322322
    323 #if ENABLE(POINTER_EVENTS)
    324 #include "PointerCaptureController.h"
    325 #endif
    326 
    327323namespace WebCore {
    328324
     
    37373733    hitTest(request, result);
    37383734
    3739     auto captureElementChanged = CaptureChange::No;
    3740     if (!request.readOnly()) {
    3741         auto targetElement = makeRefPtr(result.targetElement());
    3742 #if ENABLE(POINTER_EVENTS)
    3743         if (auto* page = this->page()) {
    3744             // Before we dispatch a new mouse event, we must run the Process Pending Capture Element steps as defined
    3745             // in https://w3c.github.io/pointerevents/#process-pending-pointer-capture.
    3746             auto& pointerCaptureController = page->pointerCaptureController();
    3747             auto* previousCaptureElement = pointerCaptureController.pointerCaptureElement(this, event.pointerId());
    3748             pointerCaptureController.processPendingPointerCapture(event.pointerId());
    3749             auto* captureElement = pointerCaptureController.pointerCaptureElement(this, event.pointerId());
    3750             // If the capture element has changed while running the Process Pending Capture Element steps then
    3751             // we need to indicate that when calling updateHoverActiveState to be sure that the :active and :hover
    3752             // element chains are updated.
    3753             if (previousCaptureElement != captureElement)
    3754                 captureElementChanged = CaptureChange::Yes;
    3755             // If we have a capture element, we must target it instead of what would normally hit-test for this event.
    3756             if (captureElement)
    3757                 targetElement = captureElement;
    3758         }
    3759 #endif
    3760         updateHoverActiveState(request, targetElement.get(), captureElementChanged);
    3761     }
     3735    if (!request.readOnly())
     3736        updateHoverActiveState(request, result.targetElement());
    37623737
    37633738    return MouseEventWithHitTestResults(event, result);
     
    67666741}
    67676742
    6768 void Document::updateHoverActiveState(const HitTestRequest& request, Element* innerElement, CaptureChange captureElementChanged)
     6743void Document::updateHoverActiveState(const HitTestRequest& request, Element* innerElement)
    67696744{
    67706745    ASSERT(!request.readOnly());
     
    68056780    // If the mouse is down and if this is a mouse move event, we want to restrict changes in
    68066781    // :hover/:active to only apply to elements that are in the :active chain that we froze
    6807     // at the time the mouse went down, unless the capture element changed.
    6808     bool mustBeInActiveChain = request.active() && request.move() && captureElementChanged == CaptureChange::No;
     6782    // at the time the mouse went down.
     6783    bool mustBeInActiveChain = request.active() && request.move();
    68096784
    68106785    RefPtr<Element> oldHoveredElement = WTFMove(m_hoveredElement);
  • trunk/Source/WebCore/dom/Document.h

    r246938 r247024  
    761761    void elementInActiveChainDidDetach(Element&);
    762762
    763     enum class CaptureChange : uint8_t { Yes, No };
    764     void updateHoverActiveState(const HitTestRequest&, Element*, CaptureChange = CaptureChange::No);
     763    void updateHoverActiveState(const HitTestRequest&, Element*);
    765764
    766765    // Updates for :target (CSS3 selector).
  • trunk/Source/WebCore/dom/PointerEvent.h

    r246844 r247024  
    6262    }
    6363
    64     static Ref<PointerEvent> createForPointerCapture(const AtomString& type, PointerID pointerId, bool isPrimary, String pointerType)
     64    static Ref<PointerEvent> createForPointerCapture(const AtomString& type, const PointerEvent& pointerEvent)
    6565    {
    6666        Init initializer;
    6767        initializer.bubbles = true;
    68         initializer.pointerId = pointerId;
    69         initializer.isPrimary = isPrimary;
    70         initializer.pointerType = pointerType;
     68        initializer.pointerId = pointerEvent.pointerId();
     69        initializer.isPrimary = pointerEvent.isPrimary();
     70        initializer.pointerType = pointerEvent.pointerType();
    7171        return adoptRef(*new PointerEvent(type, WTFMove(initializer)));
    7272    }
  • trunk/Source/WebCore/page/EventHandler.cpp

    r246844 r247024  
    128128#endif
    129129
    130 #if ENABLE(POINTER_EVENTS)
    131 #include "RuntimeEnabledFeatures.h"
    132 #endif
    133 
    134130namespace WebCore {
    135131
     
    24872483}
    24882484
    2489 #if ENABLE(POINTER_EVENTS)
    2490 void EventHandler::pointerCaptureElementDidChange(Element* element)
    2491 {
    2492     if (m_capturingMouseEventsElement == element)
    2493         return;
    2494 
    2495     setCapturingMouseEventsElement(element);
    2496 
    2497     // Now that we have a new capture element, we need to dispatch boundary mouse events.
    2498     updateMouseEventTargetNode(element, m_lastPlatformMouseEvent, FireMouseOverOut::Yes);
    2499 }
    2500 #endif
    2501 
    25022485MouseEventWithHitTestResults EventHandler::prepareMouseEvent(const HitTestRequest& request, const PlatformMouseEvent& mouseEvent)
    25032486{
    2504 #if ENABLE(POINTER_EVENTS)
    2505     m_lastPlatformMouseEvent = mouseEvent;
    2506 #endif
    25072487    Ref<Frame> protectedFrame(m_frame);
    25082488    ASSERT(m_frame.document());
  • trunk/Source/WebCore/page/EventHandler.h

    r246844 r247024  
    159159
    160160    WEBCORE_EXPORT void setCapturingMouseEventsElement(Element*);
    161 #if ENABLE(POINTER_EVENTS)
    162     void pointerCaptureElementDidChange(Element*);
    163 #endif
    164161
    165162#if ENABLE(DRAG_SUPPORT)
     
    596593    WallTime m_mouseDownTimestamp;
    597594    PlatformMouseEvent m_mouseDown;
    598 #if ENABLE(POINTER_EVENTS)
    599     PlatformMouseEvent m_lastPlatformMouseEvent;
    600 #endif
    601595
    602596#if PLATFORM(COCOA)
  • trunk/Source/WebCore/page/PointerCaptureController.cpp

    r247023 r247024  
    4949}
    5050
    51 Element* PointerCaptureController::pointerCaptureElement(Document* document, PointerID pointerId)
    52 {
    53     auto iterator = m_activePointerIdsToCapturingData.find(pointerId);
    54     if (iterator != m_activePointerIdsToCapturingData.end()) {
    55         auto pointerCaptureElement = iterator->value.targetOverride;
    56         if (pointerCaptureElement && &pointerCaptureElement->document() == document)
    57             return pointerCaptureElement.get();
    58     }
    59     return nullptr;
    60 }
    61 
    6251ExceptionOr<void> PointerCaptureController::setPointerCapture(Element* capturingTarget, PointerID pointerId)
    6352{
     
    283272    // https://w3c.github.io/pointerevents/#firing-events-using-the-pointerevent-interface
    284273    // If the event is not gotpointercapture or lostpointercapture, run Process Pending Pointer Capture steps for this PointerEvent.
    285     // We only need to do this for non-mouse type since for mouse events this method will be called in Document::prepareMouseEvent().
    286     if (event.pointerType() != PointerEvent::mousePointerType())
    287         processPendingPointerCapture(event.pointerId());
     274    processPendingPointerCapture(event);
     275
     276    // If the pointer capture target override has been set for the pointer, set the target to pointer capture target override object.
     277    auto iterator = m_activePointerIdsToCapturingData.find(event.pointerId());
     278    if (iterator != m_activePointerIdsToCapturingData.end()) {
     279        auto& capturingData = iterator->value;
     280        if (capturingData.targetOverride)
     281            target = capturingData.targetOverride.get();
     282    }
    288283
    289284    pointerEventWillBeDispatched(event, target);
     
    346341        if (event.type() == eventNames().pointerupEvent) {
    347342            capturingData.pendingTargetOverride = nullptr;
    348             processPendingPointerCapture(event.pointerId());
     343            processPendingPointerCapture(event);
    349344        }
    350345
     
    405400    target->dispatchEvent(PointerEvent::create(eventNames().pointeroutEvent, pointerId, capturingData.pointerType, isPrimary));
    406401    target->dispatchEvent(PointerEvent::create(eventNames().pointerleaveEvent, pointerId, capturingData.pointerType, isPrimary));
    407     processPendingPointerCapture(pointerId);
    408 }
    409 
    410 void PointerCaptureController::processPendingPointerCapture(PointerID pointerId)
    411 {
    412     if (m_processingPendingPointerCapture)
    413         return;
    414 
    415     m_processingPendingPointerCapture = true;
    416 
    417     auto iterator = m_activePointerIdsToCapturingData.find(pointerId);
     402    processPendingPointerCapture(WTFMove(cancelEvent));
     403}
     404
     405void PointerCaptureController::processPendingPointerCapture(const PointerEvent& event)
     406{
     407    // https://w3c.github.io/pointerevents/#process-pending-pointer-capture
     408
     409    auto iterator = m_activePointerIdsToCapturingData.find(event.pointerId());
    418410    if (iterator == m_activePointerIdsToCapturingData.end())
    419411        return;
     
    424416    auto pendingTargetOverride = capturingData.pendingTargetOverride;
    425417
    426     // https://w3c.github.io/pointerevents/#process-pending-pointer-capture
    427418    // 1. If the pointer capture target override for this pointer is set and is not equal to the pending pointer capture target override,
    428419    // then fire a pointer event named lostpointercapture at the pointer capture target override node.
    429     if (capturingData.targetOverride && capturingData.targetOverride->isConnected() && capturingData.targetOverride != pendingTargetOverride) {
    430         capturingData.targetOverride->dispatchEvent(PointerEvent::createForPointerCapture(eventNames().lostpointercaptureEvent, pointerId, capturingData.isPrimary, capturingData.pointerType));
    431         if (capturingData.pointerType == PointerEvent::mousePointerType()) {
    432             if (auto* frame = capturingData.targetOverride->document().frame())
    433                 frame->eventHandler().pointerCaptureElementDidChange(nullptr);
    434         }
    435     }
     420    if (capturingData.targetOverride && capturingData.targetOverride->isConnected() && capturingData.targetOverride != pendingTargetOverride)
     421        capturingData.targetOverride->dispatchEvent(PointerEvent::createForPointerCapture(eventNames().lostpointercaptureEvent, event));
    436422
    437423    // 2. If the pending pointer capture target override for this pointer is set and is not equal to the pointer capture target override,
    438424    // then fire a pointer event named gotpointercapture at the pending pointer capture target override.
    439     if (capturingData.pendingTargetOverride && capturingData.targetOverride != pendingTargetOverride) {
    440         if (capturingData.pointerType == PointerEvent::mousePointerType()) {
    441             if (auto* frame = pendingTargetOverride->document().frame())
    442                 frame->eventHandler().pointerCaptureElementDidChange(pendingTargetOverride.get());
    443         }
    444         pendingTargetOverride->dispatchEvent(PointerEvent::createForPointerCapture(eventNames().gotpointercaptureEvent, pointerId, capturingData.isPrimary, capturingData.pointerType));
    445     }
     425    if (capturingData.pendingTargetOverride && capturingData.targetOverride != pendingTargetOverride)
     426        pendingTargetOverride->dispatchEvent(PointerEvent::createForPointerCapture(eventNames().gotpointercaptureEvent, event));
    446427
    447428    // 3. Set the pointer capture target override to the pending pointer capture target override, if set. Otherwise, clear the pointer
    448429    // capture target override.
    449430    capturingData.targetOverride = pendingTargetOverride;
    450 
    451     m_processingPendingPointerCapture = false;
    452431}
    453432
  • trunk/Source/WebCore/page/PointerCaptureController.h

    r246844 r247024  
    4242    explicit PointerCaptureController(Page&);
    4343
    44     Element* pointerCaptureElement(Document*, PointerID);
    4544    ExceptionOr<void> setPointerCapture(Element*, PointerID);
    4645    ExceptionOr<void> releasePointerCapture(Element*, PointerID);
     
    6261    void dispatchEvent(PointerEvent&, EventTarget*);
    6362    WEBCORE_EXPORT void cancelPointer(PointerID, const IntPoint&);
    64     void processPendingPointerCapture(PointerID);
    6563
    6664private:
     
    7876    void pointerEventWillBeDispatched(const PointerEvent&, EventTarget*);
    7977    void pointerEventWasDispatched(const PointerEvent&);
     78    void processPendingPointerCapture(const PointerEvent&);
    8079
    8180    Page& m_page;
     
    8483    using PointerIdToCapturingDataMap = HashMap<int64_t, CapturingData, WTF::IntHash<int64_t>, WTF::SignedWithZeroKeyHashTraits<int64_t>>;
    8584    PointerIdToCapturingDataMap m_activePointerIdsToCapturingData;
    86     bool m_processingPendingPointerCapture;
    8785};
    8886
Note: See TracChangeset for help on using the changeset viewer.