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