WebKit Bugzilla
Attachment 370501 Details for
Bug 198178
: [Pointer Events] Compatibility mouse events can only be prevented while the pointer is pressed
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
New Account
|
Log In
Remember
[x]
|
Forgot Password
Login:
[x]
[patch]
Patch
bug-198178-20190523143924.patch (text/plain), 7.36 KB, created by
Antoine Quint
on 2019-05-23 05:39:25 PDT
(
hide
)
Description:
Patch
Filename:
MIME Type:
Creator:
Antoine Quint
Created:
2019-05-23 05:39:25 PDT
Size:
7.36 KB
patch
obsolete
>Subversion Revision: 245679 >diff --git a/Source/WebCore/ChangeLog b/Source/WebCore/ChangeLog >index a17fe395da205d1decb0f28a541aaf411e8cf03d..4cdf2e63def1fcec3ced4da226a1f05101868905 100644 >--- a/Source/WebCore/ChangeLog >+++ b/Source/WebCore/ChangeLog >@@ -1,3 +1,21 @@ >+2019-05-23 Antoine Quint <graouts@apple.com> >+ >+ [Pointer Events] Compatibility mouse events can only be prevented while the pointer is pressed >+ https://bugs.webkit.org/show_bug.cgi?id=198178 >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ Test: pointerevents/mouse/compatibility-mouse-events-prevention-mouse-released.html >+ >+ The Pointer Events spec, in https://www.w3.org/TR/pointerevents/#compatibility-mapping-with-mouse-events, says that "Mouse events >+ can only be prevented when the pointer is down. Hovering pointers (e.g. a mouse with no buttons pressed) cannot have their mouse >+ events prevented." We now track whether the pointer is pressed and clear the preventsCompatibilityMouseEvents when the pointer is >+ moved and it is not pressed. >+ >+ * page/PointerCaptureController.cpp: >+ (WebCore::PointerCaptureController::pointerEventWasDispatched): >+ * page/PointerCaptureController.h: >+ > 2019-05-22 Myles C. Maxfield <mmaxfield@apple.com> > > font-optical-sizing applies the wrong variation value >diff --git a/Source/WebCore/page/PointerCaptureController.cpp b/Source/WebCore/page/PointerCaptureController.cpp >index 6f33b7e33b22a81c9c451cbc9e891c11328997b1..94221522d1ec4076f90d230a28a6f713d768bcca 100644 >--- a/Source/WebCore/page/PointerCaptureController.cpp >+++ b/Source/WebCore/page/PointerCaptureController.cpp >@@ -264,13 +264,22 @@ void PointerCaptureController::pointerEventWasDispatched(const PointerEvent& eve > // 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) >+ if (event.type() == eventNames().pointerupEvent) { > capturingData.pendingTargetOverride = nullptr; >+ capturingData.pointerIsPressed = false; >+ } >+ >+ // If a mouse pointer has moved while it isn't pressed, make sure we reset the preventsCompatibilityMouseEvents flag since >+ // we could otherwise prevent compatibility mouse events while those are only supposed to be prevented while the pointer is pressed. >+ if (event.type() == eventNames().pointermoveEvent && capturingData.pointerType == PointerEvent::mousePointerType() && !capturingData.pointerIsPressed) >+ capturingData.preventsCompatibilityMouseEvents = false; > > // 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) >+ if (event.type() == eventNames().pointerdownEvent) { > capturingData.preventsCompatibilityMouseEvents = event.defaultPrevented(); >+ capturingData.pointerIsPressed = true; >+ } > } > > processPendingPointerCapture(event); >diff --git a/Source/WebCore/page/PointerCaptureController.h b/Source/WebCore/page/PointerCaptureController.h >index cf8cb846084c92c4a7ba8f4c377099df2c685125..0a27c79d6d689cc975fc620432097cb22747bbd5 100644 >--- a/Source/WebCore/page/PointerCaptureController.h >+++ b/Source/WebCore/page/PointerCaptureController.h >@@ -66,6 +66,7 @@ private: > bool cancelled { false }; > bool isPrimary { false }; > bool preventsCompatibilityMouseEvents { false }; >+ bool pointerIsPressed { false }; > }; > > void pointerEventWillBeDispatched(const PointerEvent&, EventTarget*); >diff --git a/LayoutTests/ChangeLog b/LayoutTests/ChangeLog >index 47453ae318256f230dadef3e0ecfe9e78400d930..d5cce30492d4577357ca57e76504b726ce9ee8d4 100644 >--- a/LayoutTests/ChangeLog >+++ b/LayoutTests/ChangeLog >@@ -1,3 +1,16 @@ >+2019-05-23 Antoine Quint <graouts@apple.com> >+ >+ [Pointer Events] Compatibility mouse events can only be prevented while the pointer is pressed >+ https://bugs.webkit.org/show_bug.cgi?id=198178 >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ Add a test that listens "mousemove" events and checks it is not dispatched after preventDefault() is called when handling >+ "pointerdown" but it is dispatched after releasing the mouse pointer and moving it again. >+ >+ * pointerevents/mouse/compatibility-mouse-events-prevention-mouse-released-expected.txt: Added. >+ * pointerevents/mouse/compatibility-mouse-events-prevention-mouse-released.html: Added. >+ > 2019-05-22 Myles C. Maxfield <mmaxfield@apple.com> > > font-optical-sizing applies the wrong variation value >diff --git a/LayoutTests/pointerevents/mouse/compatibility-mouse-events-prevention-mouse-released-expected.txt b/LayoutTests/pointerevents/mouse/compatibility-mouse-events-prevention-mouse-released-expected.txt >new file mode 100644 >index 0000000000000000000000000000000000000000..96922c6aa70b1b38859afa4e9e929d199eb1b9a4 >--- /dev/null >+++ b/LayoutTests/pointerevents/mouse/compatibility-mouse-events-prevention-mouse-released-expected.txt >@@ -0,0 +1,3 @@ >+ >+PASS Testing that calling preventDefault() when handling a "pointerdown" event only blocks events while the mouse pointer is pressed. >+ >diff --git a/LayoutTests/pointerevents/mouse/compatibility-mouse-events-prevention-mouse-released.html b/LayoutTests/pointerevents/mouse/compatibility-mouse-events-prevention-mouse-released.html >new file mode 100644 >index 0000000000000000000000000000000000000000..0e2dfb21fede955926bee56e95f8ab559a3b14ce >--- /dev/null >+++ b/LayoutTests/pointerevents/mouse/compatibility-mouse-events-prevention-mouse-released.html >@@ -0,0 +1,40 @@ >+<!DOCTYPE html> >+<html> >+<head> >+<meta charset=utf-8> >+</head> >+<body> >+<script src="../../resources/testharness.js"></script> >+<script src="../../resources/testharnessreport.js"></script> >+<script src="../utils.js"></script> >+<script> >+ >+'use strict'; >+ >+target_test((target, test) => { >+ // First, let's make sure we call preventDefault() the first time we get a pointerdown event. >+ target.addEventListener("pointerdown", event => event.preventDefault(), { once: true }); >+ >+ // Press the mouse while over the element. >+ eventSender.mouseMoveTo(50, 50); >+ eventSender.mouseDown(); >+ >+ let obtainedMouseMove = false; >+ target.addEventListener("mousemove", event => obtainedMouseMove = true, { once: true }); >+ eventSender.mouseMoveTo(60, 60); >+ assert_false(obtainedMouseMove, "The mousemove event is not fired after calling preventDefault() while handling the pointerdown event."); >+ >+ // Release the mouse. >+ eventSender.mouseUp(); >+ >+ // Now, without the mouse pressed, move the pointer over the element again. This should not prevent the mousemove event anymore since >+ // the mouse pointer is not pressed. >+ eventSender.mouseMoveTo(50, 50); >+ assert_true(obtainedMouseMove, "The mousemove event is fired after releasing the mouse."); >+ >+ test.done(); >+}, `Testing that calling preventDefault() when handling a "pointerdown" event only blocks events while the mouse pointer is pressed.`); >+ >+</script> >+</body> >+</html> >\ No newline at end of file
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Formatted Diff
|
Diff
Attachments on
bug 198178
: 370501 |
370508