Branch: refs/heads/main
  Home:   https://github.com/WebKit/WebKit
  Commit: bcb4d683f08df22b62733950b76b028832d8f142
      
https://github.com/WebKit/WebKit/commit/bcb4d683f08df22b62733950b76b028832d8f142
  Author: Abrar Rahman Protyasha <[email protected]>
  Date:   2026-10-06 (Tue, 06 Oct 2026)

  Changed paths:
    M Source/WTF/Scripts/Preferences/UnifiedWebPreferences.yaml
    M Source/WebCore/dom/Element.cpp
    M Source/WebCore/page/EventHandler.cpp
    M Source/WebCore/page/EventHandler.h
    M Source/WebCore/page/PointerCaptureController.cpp
    M Source/WebCore/page/PointerCaptureController.h
    M Source/WebCore/page/mac/EventHandlerMac.mm
    M Source/WebKit/Modules/Internal/module.modulemap
    M Source/WebKit/PlatformCocoa.cmake
    M Source/WebKit/UIProcess/WebPageProxy.cpp
    M Source/WebKit/UIProcess/WebPageProxy.h
    M Source/WebKit/UIProcess/mac/AppKitGestures/WKAppKitGestureController.mm
    A 
Source/WebKit/UIProcess/mac/AppKitGestures/WKPointerTrackingGestureRecognizer.h
    A 
Source/WebKit/UIProcess/mac/AppKitGestures/WKPointerTrackingGestureRecognizer.swift
    M Source/WebKit/UIProcess/mac/WebPageProxyMac.mm
    M Source/WebKit/WebKit.xcodeproj/project.pbxproj
    M Source/WebKit/WebProcess/WebPage/WebPage.h
    M Source/WebKit/WebProcess/WebPage/WebPage.messages.in
    M Source/WebKit/WebProcess/WebPage/mac/WebPageMac.mm
    M Tools/TestWebKitAPI/Tests/WebKit/WebPage/AppKit Gesture 
Tests/BasicAppKitGesturesTests.swift
    M Tools/TestWebKitAPI/Tests/WebKit/WebPage/AppKit Gesture 
Tests/DoubleClickGesturesTests.swift

  Log Message:
  -----------
  [AppKit Gestures] Mouse hold is not reported to web content until the press 
ends
https://bugs.webkit.org/show_bug.cgi?id=326467
rdar://186490037

Reviewed by Tim Horton.

The pointer events that web content sees for a gesture-driven long click
are derived from the mouse events synthesized for it, and the synthetic
click delivers its mouse down and mouse up together when the press ends.
A press therefore never has any duration as far as the page is concerned:
contents that recognize a long press or a press-hold from pointerdown
(map markers, "press and hold" verification widgets, etc.) never see one.

In this patch, a new passive gesture recognizer tracks the press itself
and dispatches its pointer events as the press happens. The mouse events
synthesized for a tracked click no longer derive pointer events of their
own, including those that are handled after the pointer has been released
or canceled, such as the mouse up that ends a drag. All of that state
now lives in PointerCaptureController rather than being inferred from
event tags (c.f. webkit.org/b/314881).

Tests: AppKitGesturesTests.Basic/pressAndHoldReportsPointerEventsSpanningTheHold
       
AppKitGesturesTests.Basic/singleClickWithoutPointerTrackingDerivesPointerEventsFromMouseEvents
       
AppKitGesturesTests.Basic/pressAndHoldInSubframeReportsPointerEventsSpanningTheHold
       
AppKitGesturesTests.Basic/pressAndHoldInCrossSiteSubframeReportsPointerEventsSpanningTheHold
       AppKitGesturesTests.Basic/longPressOnManipulationSurfaceIsRecognized
       
AppKitGesturesTests.Basic/clickOnManipulationSurfaceIsNotRecognizedAsLongPress
       
AppKitGesturesTests.Basic/pressReportsMovementOnlyPastClickAllowableMovement
       
AppKitGesturesTests.Basic/untrackedDragOnManipulationSurfaceStillReportsPointerMovement
       
AppKitGesturesTests.Basic/trackedDragOnManipulationSurfaceReportsPointerUpOnce
       
AppKitGesturesTests.Basic/trackedPointerMovesReportThemselvesAsCoalescedEvents
       AppKitGesturesTests.Basic/pressAndHoldThatOpensContextMenuCancelsPointer
       
AppKitGesturesTests.Basic/pointerStaysOverReleasedElementUntilNextPressElsewhere
       AppKitGesturesTests.Basic/clickLeavesPopupOfHoverActivatedControlOpen
       
AppKitGesturesTests.Basic/pressHeldAcrossNavigationDoesNotAffectMouseEventsOnNextPage
       AppKitGesturesTests.Basic/pressAndHoldCompletesPointerDrivenCaptcha
       AppKitGesturesTests.Basic/quickClickDoesNotCompletePointerDrivenCaptcha
       AppKitGesturesTests.Basic/scrollingAfterPressCancelsPointerDrivenCaptcha
       
AppKitGesturesTests.Basic/cancelingPointerDownKeepsTheHoldOnSelectableText
       
AppKitGesturesTests.Basic/pressAndHoldOnSelectableTextWithoutCancelingSelectsAWord

* Source/WTF/Scripts/Preferences/UnifiedWebPreferences.yaml:
* Source/WebCore/dom/Element.cpp:
(WebCore::dispatchPointerEventIfNeeded):
* Source/WebCore/page/EventHandler.cpp:
(WebCore::EventHandler::clear):
(WebCore::EventHandler::handleMousePressEvent):
(WebCore::EventHandler::handleMouseReleaseEvent):
* Source/WebCore/page/EventHandler.h:
* Source/WebCore/page/PointerCaptureController.cpp:
(WebCore::PointerCaptureController::hierarchyHasCapturingEventListeners):
(WebCore::PointerCaptureController::dispatchBoundaryEvents):
(WebCore::PointerCaptureController::dispatchEventForTouchAtIndex):
(WebCore::PointerCaptureController::dispatchEventForTrackedPointer):
(WebCore::PointerCaptureController::cancelTrackedPointer):
(WebCore::PointerCaptureController::mouseEventCanBelongToTrackedPointer const):
(WebCore::PointerCaptureController::mouseEventBelongsToTrackedPointer const):
(WebCore::PointerCaptureController::mouseButtonWillBePressed):
(WebCore::PointerCaptureController::mouseButtonWasReleased):
(WebCore::PointerCaptureController::cancelPointer):
(WebCore::hierarchyHasCapturingEventListeners): Deleted.
* Source/WebCore/page/PointerCaptureController.h:
(WebCore::PointerCaptureController::CapturingData::hasAnyElement const):
* Source/WebCore/page/mac/EventHandlerMac.mm:
(WebCore::mouseEventTypeForTrackedPointerEvent):
(WebCore::EventHandler::dispatchTrackedPointerEvent):
(WebCore::EventHandler::cancelTrackedPointer):
* Source/WebKit/Modules/Internal/module.modulemap:
* Source/WebKit/PlatformCocoa.cmake:
* Source/WebKit/UIProcess/WebPageProxy.cpp:
* Source/WebKit/UIProcess/WebPageProxy.h:
* Source/WebKit/UIProcess/mac/AppKitGestures/WKAppKitGestureController.mm:
(-[WKAppKitGestureController setUpGestureRecognizers]):
(-[WKAppKitGestureController setUpPointerTrackingGestureRecognizer]):
(-[WKAppKitGestureController setUpPointerDownDeferringGestureRecognizer]):
(-[WKAppKitGestureController addGesturesToWebView]):
(-[WKAppKitGestureController enableGesturesIfNeeded]):
(-[WKAppKitGestureController ensureGesturesAreNotArchived]):
(-[WKAppKitGestureController enableGestureIfNeeded:]):
(-[WKAppKitGestureController panGestureRecognized:]):
(-[WKAppKitGestureController secondaryClickGestureRecognized:]):
(-[WKAppKitGestureController _movementExceedsClickAllowableMovement:]):
(-[WKAppKitGestureController mouseTrackingGestureRecognized:]):
(-[WKAppKitGestureController 
_dispatchTrackedPointerEventWithPhase:atLocationInWindow:modifierFlags:]):
(-[WKAppKitGestureController _didDispatchPointerDown:]):
(-[WKAppKitGestureController 
_pointerTrackingShouldBeginAtLocation:modifierFlags:]):
(-[WKAppKitGestureController _cancelPointerTrackingIfNeeded]):
(-[WKAppKitGestureController 
pointerTrackingGestureRecognizer:didUpdatePressWithState:locationInWindow:modifierFlags:]):
(-[WKAppKitGestureController pointerTrackingGestureRecognized:]):
(-[WKAppKitGestureController 
deferringGestureRecognizer:shouldDeferGesturesForEventThatWillBeginAction:]):
(-[WKAppKitGestureController 
deferringGestureRecognizer:didEndActionWithEvent:]):
(-[WKAppKitGestureController didCommitLoadForMainFrame]):
(-[WKAppKitGestureController setGestureDraggingSession:]):
(-[WKAppKitGestureController reset]):
(-[WKAppKitGestureController 
gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer:]):
(-[WKAppKitGestureController gestureRecognizerShouldBegin:]):
(-[WKAppKitGestureController _gestureRecognizer:canPreventGestureRecognizer:]):
* Source/WebKit/UIProcess/mac/WebPageProxyMac.mm:
(WebKit::WebPageProxy::dispatchTrackedPointerEvent):
* Source/WebKit/WebKit.xcodeproj/project.pbxproj:
* Source/WebKit/WebProcess/WebPage/WebPage.h:
* Source/WebKit/WebProcess/WebPage/WebPage.messages.in:
* Source/WebKit/WebProcess/WebPage/mac/WebPageMac.mm:
(WebKit::WebPage::dispatchTrackedPointerEvent):
* Tools/TestWebKitAPI/Tests/WebKit/WebPage/AppKit Gesture 
Tests/BasicAppKitGesturesTests.swift:

Pointer events now precede the compatibility mouse events, and carry a
`detail` of 0.

Canonical link: https://commits.webkit.org/322861@main



To unsubscribe from these emails, change your notification settings at 
https://github.com/WebKit/WebKit/settings/notifications

Reply via email to