- 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*);