Changeset 247024 in webkit
- Timestamp:
- Jul 1, 2019 2:25:57 PM (5 years ago)
- Location:
- trunk
- Files:
-
- 15 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r247019 r247024 1 2019-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 1 15 2019-07-01 Truitt Savell <tsavell@apple.com> 2 16 -
trunk/LayoutTests/imported/w3c/ChangeLog
r246844 r247024 1 2019-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 1 15 2019-06-26 Antoine Quint <graouts@apple.com> 2 16 -
trunk/LayoutTests/imported/w3c/web-platform-tests/pointerevents/pointerevent_boundary_events_at_implicit_release_hoverable_pointers-expected.txt
r246844 r247024 1 1 Pointer Event: Boundary event sequence at implicit capture release 2 3 Follow the test instructions with mouse. If you don't have the device skip it. 2 4 3 5 When a captured pointer is implicitly released after a click, the boundary events should follow the lostpointercapture event. … … 5 7 Click on the black box with mouse and do not move the mouse after or during the click. 6 8 7 PASS mouse Event sequence at implicit release on click 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 "gotpointercapture@capture-target, pointerup@capture-target, lostpointercapture@capture-target" 8 10 -
trunk/LayoutTests/imported/w3c/web-platform-tests/pointerevents/pointerevent_mouse_capture_change_hover-expected.txt
r246844 r247024 1 1 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 2 FAIL 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 3 FAIL 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 4 FAIL 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" 5 5 -
trunk/LayoutTests/imported/w3c/web-platform-tests/pointerevents/pointerevent_setpointercapture_relatedtarget-expected.txt
r246844 r247024 17 17 The following pointer types were detected: mouse. 18 18 19 The following events were logged: pointerover@target1, pointerover@target0, gotpointercapture@target0, lostpointercapture@target0.19 The following events were logged: pointerover@target1, gotpointercapture@target0, pointerover@target0, pointerover@target0, lostpointercapture@target0. 20 20 21 21 Refresh the page to run the tests again with a different pointer type. 22 22 23 23 24 Harness Error (FAIL), message = 1 duplicate test name: "relatedTarget should not be null even when the capture is set." 25 24 26 PASS pointerover shouldn't trigger for the purple rectangle while the black rectangle has capture 25 27 PASS relatedTarget should not be null even when the capture is set. 28 PASS relatedTarget should not be null even when the capture is set. 26 29 -
trunk/LayoutTests/platform/mac-wk1/imported/w3c/web-platform-tests/pointerevents/pointerevent_boundary_events_at_implicit_release_hoverable_pointers-expected.txt
r246844 r247024 7 7 Click on the black box with mouse and do not move the mouse after or during the click. 8 8 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"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 "gotpointercapture@capture-target, pointerup@capture-target, lostpointercapture@capture-target, pointermove@target" 10 10 -
trunk/LayoutTests/platform/mac-wk1/imported/w3c/web-platform-tests/pointerevents/pointerevent_setpointercapture_relatedtarget-expected.txt
r246844 r247024 17 17 The following pointer types were detected: mouse. 18 18 19 The following events were logged: pointerover@target1, pointerover@target0, gotpointercapture@target0, lostpointercapture@target0, pointerover@target0.19 The following events were logged: pointerover@target1, gotpointercapture@target0, pointerover@target0, pointerover@target0, lostpointercapture@target0, pointerover@target0. 20 20 21 21 Refresh the page to run the tests again with a different pointer type. 22 22 23 23 24 Harness Error (FAIL), message = 1 duplicate test name: "relatedTarget should not be null even when the capture is set." 25 24 26 PASS pointerover shouldn't trigger for the purple rectangle while the black rectangle has capture 25 27 PASS relatedTarget should not be null even when the capture is set. 28 PASS relatedTarget should not be null even when the capture is set. 26 29 -
trunk/Source/WebCore/ChangeLog
r247023 r247024 1 2019-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 1 15 2019-07-01 Truitt Savell <tsavell@apple.com> 2 16 -
trunk/Source/WebCore/dom/Document.cpp
r246938 r247024 321 321 #endif 322 322 323 #if ENABLE(POINTER_EVENTS)324 #include "PointerCaptureController.h"325 #endif326 327 323 namespace WebCore { 328 324 … … 3737 3733 hitTest(request, result); 3738 3734 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()); 3762 3737 3763 3738 return MouseEventWithHitTestResults(event, result); … … 6766 6741 } 6767 6742 6768 void Document::updateHoverActiveState(const HitTestRequest& request, Element* innerElement , CaptureChange captureElementChanged)6743 void Document::updateHoverActiveState(const HitTestRequest& request, Element* innerElement) 6769 6744 { 6770 6745 ASSERT(!request.readOnly()); … … 6805 6780 // If the mouse is down and if this is a mouse move event, we want to restrict changes in 6806 6781 // :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(); 6809 6784 6810 6785 RefPtr<Element> oldHoveredElement = WTFMove(m_hoveredElement); -
trunk/Source/WebCore/dom/Document.h
r246938 r247024 761 761 void elementInActiveChainDidDetach(Element&); 762 762 763 enum class CaptureChange : uint8_t { Yes, No }; 764 void updateHoverActiveState(const HitTestRequest&, Element*, CaptureChange = CaptureChange::No); 763 void updateHoverActiveState(const HitTestRequest&, Element*); 765 764 766 765 // Updates for :target (CSS3 selector). -
trunk/Source/WebCore/dom/PointerEvent.h
r246844 r247024 62 62 } 63 63 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) 65 65 { 66 66 Init initializer; 67 67 initializer.bubbles = true; 68 initializer.pointerId = pointer Id;69 initializer.isPrimary = isPrimary;70 initializer.pointerType = pointer Type;68 initializer.pointerId = pointerEvent.pointerId(); 69 initializer.isPrimary = pointerEvent.isPrimary(); 70 initializer.pointerType = pointerEvent.pointerType(); 71 71 return adoptRef(*new PointerEvent(type, WTFMove(initializer))); 72 72 } -
trunk/Source/WebCore/page/EventHandler.cpp
r246844 r247024 128 128 #endif 129 129 130 #if ENABLE(POINTER_EVENTS)131 #include "RuntimeEnabledFeatures.h"132 #endif133 134 130 namespace WebCore { 135 131 … … 2487 2483 } 2488 2484 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 #endif2501 2502 2485 MouseEventWithHitTestResults EventHandler::prepareMouseEvent(const HitTestRequest& request, const PlatformMouseEvent& mouseEvent) 2503 2486 { 2504 #if ENABLE(POINTER_EVENTS)2505 m_lastPlatformMouseEvent = mouseEvent;2506 #endif2507 2487 Ref<Frame> protectedFrame(m_frame); 2508 2488 ASSERT(m_frame.document()); -
trunk/Source/WebCore/page/EventHandler.h
r246844 r247024 159 159 160 160 WEBCORE_EXPORT void setCapturingMouseEventsElement(Element*); 161 #if ENABLE(POINTER_EVENTS)162 void pointerCaptureElementDidChange(Element*);163 #endif164 161 165 162 #if ENABLE(DRAG_SUPPORT) … … 596 593 WallTime m_mouseDownTimestamp; 597 594 PlatformMouseEvent m_mouseDown; 598 #if ENABLE(POINTER_EVENTS)599 PlatformMouseEvent m_lastPlatformMouseEvent;600 #endif601 595 602 596 #if PLATFORM(COCOA) -
trunk/Source/WebCore/page/PointerCaptureController.cpp
r247023 r247024 49 49 } 50 50 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 62 51 ExceptionOr<void> PointerCaptureController::setPointerCapture(Element* capturingTarget, PointerID pointerId) 63 52 { … … 283 272 // https://w3c.github.io/pointerevents/#firing-events-using-the-pointerevent-interface 284 273 // 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 } 288 283 289 284 pointerEventWillBeDispatched(event, target); … … 346 341 if (event.type() == eventNames().pointerupEvent) { 347 342 capturingData.pendingTargetOverride = nullptr; 348 processPendingPointerCapture(event .pointerId());343 processPendingPointerCapture(event); 349 344 } 350 345 … … 405 400 target->dispatchEvent(PointerEvent::create(eventNames().pointeroutEvent, pointerId, capturingData.pointerType, isPrimary)); 406 401 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 405 void 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()); 418 410 if (iterator == m_activePointerIdsToCapturingData.end()) 419 411 return; … … 424 416 auto pendingTargetOverride = capturingData.pendingTargetOverride; 425 417 426 // https://w3c.github.io/pointerevents/#process-pending-pointer-capture427 418 // 1. If the pointer capture target override for this pointer is set and is not equal to the pending pointer capture target override, 428 419 // 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)); 436 422 437 423 // 2. If the pending pointer capture target override for this pointer is set and is not equal to the pointer capture target override, 438 424 // 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)); 446 427 447 428 // 3. Set the pointer capture target override to the pending pointer capture target override, if set. Otherwise, clear the pointer 448 429 // capture target override. 449 430 capturingData.targetOverride = pendingTargetOverride; 450 451 m_processingPendingPointerCapture = false;452 431 } 453 432 -
trunk/Source/WebCore/page/PointerCaptureController.h
r246844 r247024 42 42 explicit PointerCaptureController(Page&); 43 43 44 Element* pointerCaptureElement(Document*, PointerID);45 44 ExceptionOr<void> setPointerCapture(Element*, PointerID); 46 45 ExceptionOr<void> releasePointerCapture(Element*, PointerID); … … 62 61 void dispatchEvent(PointerEvent&, EventTarget*); 63 62 WEBCORE_EXPORT void cancelPointer(PointerID, const IntPoint&); 64 void processPendingPointerCapture(PointerID);65 63 66 64 private: … … 78 76 void pointerEventWillBeDispatched(const PointerEvent&, EventTarget*); 79 77 void pointerEventWasDispatched(const PointerEvent&); 78 void processPendingPointerCapture(const PointerEvent&); 80 79 81 80 Page& m_page; … … 84 83 using PointerIdToCapturingDataMap = HashMap<int64_t, CapturingData, WTF::IntHash<int64_t>, WTF::SignedWithZeroKeyHashTraits<int64_t>>; 85 84 PointerIdToCapturingDataMap m_activePointerIdsToCapturingData; 86 bool m_processingPendingPointerCapture;87 85 }; 88 86
Note: See TracChangeset
for help on using the changeset viewer.