⚠ Archived content — this site is no longer maintained.   Current WebKit documentation is at docs.webkit.org.

Changeset 245699 in webkit


Ignore:
Timestamp:
May 23, 2019, 11:13:56 AM (7 years ago)
Author:
commit-queue@webkit.org
Message:

[Pointer Events] Compatibility mouse events can only be prevented while the pointer is pressed
https://bugs.webkit.org/show_bug.cgi?id=198178

Patch by Antoine Quint <Antoine Quint> on 2019-05-23
Reviewed by Dean Jackson.

Source/WebCore:

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:

LayoutTests:

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.
Location:
trunk
Files:
2 added
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r245695 r245699  
     12019-05-23  Antoine Quint  <graouts@apple.com>
     2
     3        [Pointer Events] Compatibility mouse events can only be prevented while the pointer is pressed
     4        https://bugs.webkit.org/show_bug.cgi?id=198178
     5
     6        Reviewed by Dean Jackson.
     7
     8        Add a test that listens "mousemove" events and checks it is not dispatched after preventDefault() is called when handling
     9         "pointerdown" but it is dispatched after releasing the mouse pointer and moving it again.
     10
     11        * pointerevents/mouse/compatibility-mouse-events-prevention-mouse-released-expected.txt: Added.
     12        * pointerevents/mouse/compatibility-mouse-events-prevention-mouse-released.html: Added.
     13
    1142019-05-23  Antoine Quint  <graouts@apple.com>
    215
  • trunk/Source/WebCore/ChangeLog

    r245695 r245699  
     12019-05-23  Antoine Quint  <graouts@apple.com>
     2
     3        [Pointer Events] Compatibility mouse events can only be prevented while the pointer is pressed
     4        https://bugs.webkit.org/show_bug.cgi?id=198178
     5
     6        Reviewed by Dean Jackson.
     7
     8        Test: pointerevents/mouse/compatibility-mouse-events-prevention-mouse-released.html
     9
     10        The Pointer Events spec, in https://www.w3.org/TR/pointerevents/#compatibility-mapping-with-mouse-events, says that "Mouse events
     11        can only be prevented when the pointer is down. Hovering pointers (e.g. a mouse with no buttons pressed) cannot have their mouse
     12        events prevented." We now track whether the pointer is pressed and clear the preventsCompatibilityMouseEvents when the pointer is
     13        moved and it is not pressed.
     14
     15        * page/PointerCaptureController.cpp:
     16        (WebCore::PointerCaptureController::pointerEventWasDispatched):
     17        * page/PointerCaptureController.h:
     18
    1192019-05-23  Antoine Quint  <graouts@apple.com>
    220
  • trunk/Source/WebCore/page/PointerCaptureController.cpp

    r245639 r245699  
    265265        // Pointer Capture steps to fire lostpointercapture if necessary.
    266266        // https://w3c.github.io/pointerevents/#implicit-release-of-pointer-capture
    267         if (event.type() == eventNames().pointerupEvent)
     267        if (event.type() == eventNames().pointerupEvent) {
    268268            capturingData.pendingTargetOverride = nullptr;
     269            capturingData.pointerIsPressed = false;
     270        }
     271
     272        // If a mouse pointer has moved while it isn't pressed, make sure we reset the preventsCompatibilityMouseEvents flag since
     273        // we could otherwise prevent compatibility mouse events while those are only supposed to be prevented while the pointer is pressed.
     274        if (event.type() == eventNames().pointermoveEvent && capturingData.pointerType == PointerEvent::mousePointerType() && !capturingData.pointerIsPressed)
     275            capturingData.preventsCompatibilityMouseEvents = false;
    269276
    270277        // If the pointer event dispatched was pointerdown and the event was canceled, then set the PREVENT MOUSE EVENT flag for this pointerType.
    271278        // https://www.w3.org/TR/pointerevents/#mapping-for-devices-that-support-hover
    272         if (event.type() == eventNames().pointerdownEvent)
     279        if (event.type() == eventNames().pointerdownEvent) {
    273280            capturingData.preventsCompatibilityMouseEvents = event.defaultPrevented();
     281            capturingData.pointerIsPressed = true;
     282        }
    274283    }
    275284
  • trunk/Source/WebCore/page/PointerCaptureController.h

    r245639 r245699  
    6767        bool isPrimary { false };
    6868        bool preventsCompatibilityMouseEvents { false };
     69        bool pointerIsPressed { false };
    6970    };
    7071
Note: See TracChangeset for help on using the changeset viewer.