Title: [245585] trunk
Revision
245585
Author
[email protected]
Date
2019-05-21 10:50:37 -0700 (Tue, 21 May 2019)

Log Message

[macOS] Compatibility mouse events aren't prevented by calling preventDefault() on pointerdown
https://bugs.webkit.org/show_bug.cgi?id=198072
<rdar://problem/50983361>

Reviewed by Dean Jackson.

LayoutTests/imported/w3c:

Mark the WPT test progression after fixing this bug.

* web-platform-tests/pointerevents/pointerevent_suppress_compat_events_on_click-expected.txt:

Source/WebCore:

The Pointer Events spec says that "compatibility" mouse events, which means all mouse events save for "click",
should not be dispatched for a given pointer if preventDefault() was called during the dispatch of the "pointerdown"
event. Additionally, calling preventDefault() during the dispatch of "pointerup" has no effect.

* dom/Element.cpp:
(WebCore::Element::dispatchMouseEvent):
* page/PointerCaptureController.cpp:
(WebCore::PointerCaptureController::preventsCompatibilityMouseEventsForIdentifier):
(WebCore::PointerCaptureController::pointerEventWasDispatched):
* page/PointerCaptureController.h:

Modified Paths

Diff

Modified: trunk/LayoutTests/imported/w3c/ChangeLog (245584 => 245585)


--- trunk/LayoutTests/imported/w3c/ChangeLog	2019-05-21 17:49:28 UTC (rev 245584)
+++ trunk/LayoutTests/imported/w3c/ChangeLog	2019-05-21 17:50:37 UTC (rev 245585)
@@ -1,5 +1,17 @@
 2019-05-21  Antoine Quint  <[email protected]>
 
+        [macOS] Compatibility mouse events aren't prevented by calling preventDefault() on pointerdown
+        https://bugs.webkit.org/show_bug.cgi?id=198072
+        <rdar://problem/50983361>
+
+        Reviewed by Dean Jackson.
+
+        Mark the WPT test progression after fixing this bug.
+
+        * web-platform-tests/pointerevents/pointerevent_suppress_compat_events_on_click-expected.txt:
+
+2019-05-21  Antoine Quint  <[email protected]>
+
         [Pointer Events] Do not dispatch pointermove events when the pointer is not down in WPT testdriver
         https://bugs.webkit.org/show_bug.cgi?id=198071
 

Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/pointerevents/pointerevent_suppress_compat_events_on_click-expected.txt (245584 => 245585)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/pointerevents/pointerevent_suppress_compat_events_on_click-expected.txt	2019-05-21 17:49:28 UTC (rev 245584)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/pointerevents/pointerevent_suppress_compat_events_on_click-expected.txt	2019-05-21 17:50:37 UTC (rev 245585)
@@ -10,11 +10,11 @@
 Done
 The following pointer types were detected: mouse.
 
-The following events were logged: mouseup@target0, click@target0, mousedown@target1, mouseup@target1, click@target1.
+The following events were logged: click@target0, mousedown@target1, mouseup@target1, click@target1.
 
 
 PASS Suppress compat mouse events on click 
 PASS primary pointer pointerdown@target0 
 PASS primary pointer pointerdown@target1 
-FAIL Event log assert_equals: expected "click@target0, mousedown@target1, mouseup@target1, click@target1" but got "mouseup@target0, click@target0, mousedown@target1, mouseup@target1, click@target1"
+PASS Event log 
 

Modified: trunk/Source/WebCore/ChangeLog (245584 => 245585)


--- trunk/Source/WebCore/ChangeLog	2019-05-21 17:49:28 UTC (rev 245584)
+++ trunk/Source/WebCore/ChangeLog	2019-05-21 17:50:37 UTC (rev 245585)
@@ -1,3 +1,22 @@
+2019-05-21  Antoine Quint  <[email protected]>
+
+        [macOS] Compatibility mouse events aren't prevented by calling preventDefault() on pointerdown
+        https://bugs.webkit.org/show_bug.cgi?id=198072
+        <rdar://problem/50983361>
+
+        Reviewed by Dean Jackson.
+
+        The Pointer Events spec says that "compatibility" mouse events, which means all mouse events save for "click",
+        should not be dispatched for a given pointer if preventDefault() was called during the dispatch of the "pointerdown"
+        event. Additionally, calling preventDefault() during the dispatch of "pointerup" has no effect.
+
+        * dom/Element.cpp:
+        (WebCore::Element::dispatchMouseEvent):
+        * page/PointerCaptureController.cpp:
+        (WebCore::PointerCaptureController::preventsCompatibilityMouseEventsForIdentifier):
+        (WebCore::PointerCaptureController::pointerEventWasDispatched):
+        * page/PointerCaptureController.h:
+
 2019-05-21  Antti Koivisto  <[email protected]>
 
         RTL/overflow scroll tests fail with async overflow enabled

Modified: trunk/Source/WebCore/dom/Element.cpp (245584 => 245585)


--- trunk/Source/WebCore/dom/Element.cpp	2019-05-21 17:49:28 UTC (rev 245584)
+++ trunk/Source/WebCore/dom/Element.cpp	2019-05-21 17:50:37 UTC (rev 245585)
@@ -306,11 +306,14 @@
 #if ENABLE(POINTER_EVENTS) && !ENABLE(TOUCH_EVENTS)
     if (RuntimeEnabledFeatures::sharedFeatures().pointerEventsEnabled()) {
         if (auto pointerEvent = PointerEvent::create(mouseEvent)) {
-            if (auto* page = document().page())
+            if (auto* page = document().page()) {
                 page->pointerCaptureController().dispatchEvent(*pointerEvent, this);
+                if (mouseEvent->type() != eventNames().clickEvent && page->pointerCaptureController().preventsCompatibilityMouseEventsForIdentifier(pointerEvent->pointerId()))
+                    return false;
+            }
             if (pointerEvent->defaultPrevented() || pointerEvent->defaultHandled()) {
                 didNotSwallowEvent = false;
-                if (pointerEvent->type() == eventNames().pointerdownEvent || pointerEvent->type() == eventNames().pointerupEvent)
+                if (pointerEvent->type() == eventNames().pointerdownEvent)
                     return false;
             }
         }

Modified: trunk/Source/WebCore/page/PointerCaptureController.cpp (245584 => 245585)


--- trunk/Source/WebCore/page/PointerCaptureController.cpp	2019-05-21 17:49:28 UTC (rev 245584)
+++ trunk/Source/WebCore/page/PointerCaptureController.cpp	2019-05-21 17:50:37 UTC (rev 245585)
@@ -157,6 +157,12 @@
     return iterator != m_activePointerIdsToCapturingData.end() && iterator->value.cancelled;
 }
 
+bool PointerCaptureController::preventsCompatibilityMouseEventsForIdentifier(PointerID pointerId)
+{
+    auto iterator = m_activePointerIdsToCapturingData.find(pointerId);
+    return iterator != m_activePointerIdsToCapturingData.end() && iterator->value.preventsCompatibilityMouseEvents;
+}
+
 #if ENABLE(TOUCH_EVENTS) && PLATFORM(IOS_FAMILY)
 void PointerCaptureController::dispatchEventForTouchAtIndex(EventTarget& target, const PlatformTouchEvent& platformTouchEvent, unsigned index, bool isPrimary, WindowProxy& view)
 {
@@ -249,8 +255,6 @@
 
 void PointerCaptureController::pointerEventWasDispatched(const PointerEvent& event)
 {
-    // https://w3c.github.io/pointerevents/#implicit-release-of-pointer-capture
-
     auto iterator = m_activePointerIdsToCapturingData.find(event.pointerId());
     if (iterator != m_activePointerIdsToCapturingData.end()) {
         auto& capturingData = iterator->value;
@@ -259,8 +263,14 @@
         // Immediately after firing the pointerup or pointercancel events, a user agent MUST clear the pending pointer capture target
         // override for the pointerId of the pointerup or pointercancel event that was just dispatched, and then run Process Pending
         // Pointer Capture steps to fire lostpointercapture if necessary.
+        // https://w3c.github.io/pointerevents/#implicit-release-of-pointer-capture
         if (event.type() == eventNames().pointerupEvent)
             capturingData.pendingTargetOverride = nullptr;
+
+        // If the pointer event dispatched was pointerdown and the event was canceled, then set the PREVENT MOUSE EVENT flag for this pointerType.
+        // https://www.w3.org/TR/pointerevents/#mapping-for-devices-that-support-hover
+        if (event.type() == eventNames().pointerdownEvent)
+            capturingData.preventsCompatibilityMouseEvents = event.defaultPrevented();
     }
 
     processPendingPointerCapture(event);

Modified: trunk/Source/WebCore/page/PointerCaptureController.h (245584 => 245585)


--- trunk/Source/WebCore/page/PointerCaptureController.h	2019-05-21 17:49:28 UTC (rev 245584)
+++ trunk/Source/WebCore/page/PointerCaptureController.h	2019-05-21 17:50:37 UTC (rev 245585)
@@ -54,6 +54,7 @@
 
     void touchEndedOrWasCancelledForIdentifier(PointerID);
     bool hasCancelledPointerEventForIdentifier(PointerID);
+    bool preventsCompatibilityMouseEventsForIdentifier(PointerID);
     void dispatchEvent(PointerEvent&, EventTarget*);
     WEBCORE_EXPORT void cancelPointer(PointerID, const IntPoint&);
 
@@ -64,6 +65,7 @@
         String pointerType;
         bool cancelled { false };
         bool isPrimary { false };
+        bool preventsCompatibilityMouseEvents { false };
     };
 
     void pointerEventWillBeDispatched(const PointerEvent&, EventTarget*);
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to