Branch: refs/heads/main
Home: https://github.com/WebKit/WebKit
Commit: d1e06d2a87ccd6b80151aaff291392769453ab0a
https://github.com/WebKit/WebKit/commit/d1e06d2a87ccd6b80151aaff291392769453ab0a
Author: Abrar Rahman Protyasha <[email protected]>
Date: 2026-03-19 (Thu, 19 Mar 2026)
Changed paths:
M Source/WebKit/Configurations/WebKit.xcconfig
M Source/WebKit/DerivedSources-output.xcfilelist
M Source/WebKit/DerivedSources.make
M Source/WebKit/Modules/Internal/module.modulemap
M Source/WebKit/Platform/spi/mac/AppKitSPI.h
M Source/WebKit/PlatformMac.cmake
M Source/WebKit/SourcesCocoa.txt
M Source/WebKit/UIProcess/API/Cocoa/WKWebViewInternal.h
M Source/WebKit/UIProcess/API/mac/WKWebViewMac.mm
M Source/WebKit/UIProcess/PDF/WKPDFHUDView.h
M Source/WebKit/UIProcess/PDF/WKPDFHUDView.mm
A Source/WebKit/UIProcess/PDF/WKPDFHUDView.swift
M Source/WebKit/UIProcess/PageClient.h
M Source/WebKit/UIProcess/WebPageProxy.h
M Source/WebKit/UIProcess/WebPageProxy.messages.in
M Source/WebKit/UIProcess/ios/WKScrollViewTrackingTapGestureRecognizer.mm
M Source/WebKit/UIProcess/mac/PageClientImplMac.h
M Source/WebKit/UIProcess/mac/PageClientImplMac.mm
M Source/WebKit/UIProcess/mac/WKAppKitGestureController.mm
M Source/WebKit/UIProcess/mac/WebPageProxyMac.mm
M Source/WebKit/UIProcess/mac/WebViewImpl.h
M Source/WebKit/UIProcess/mac/WebViewImpl.mm
M Source/WebKit/WebKit.xcodeproj/project.pbxproj
M Source/WebKit/WebProcess/Plugins/PDF/UnifiedPDF/UnifiedPDFPlugin.mm
M Source/WebKit/WebProcess/WebPage/Cocoa/WebPageCocoa.mm
M Source/WebKit/WebProcess/WebPage/WebPage.h
M Source/WebKit/WebProcess/WebPage/mac/WebPageMac.mm
Log Message:
-----------
[macOS] PDF HUD is not accessible to VoiceOver
https://bugs.webkit.org/show_bug.cgi?id=309494
rdar://172084494
Reviewed by Aditya Keerthi.
Currently, VoiceOver cannot discover the zoom/save/preview buttons on
the HUD, since WKPDFHUDView renders its buttons as raw CALayers with
manual hit testing, coordinate conversion, and event forwarding.
Just on this merit, and ignoring the other shortcomings of the HUD (no
liquid glass adoption, double opacity application, etc.), the HUD
deserves a redesign with NSButton subviews.
This patch sets out to do just that. We rewrite WKPDFHUDView to move
away from the manual CALayer-based approach introduced in 229023@main.
Instead, we adopt NSButton for each of the four actions on the HUD.
These buttons are placed in an appropriate container view (glass effect
or visual effect) and are also horizontally spaced out (maintains status
quo, and incidentally following Apple's liquid glass design guidelines).
Since Swift/C++ interop is unavailable on macOS downlevels, we split the
implementation to keep C++ types out of the Swift file. The header
(WKPDFHUDView.h) declares a pure ObjC interface with uint64_t
identifiers, following the WKMouseDeviceObserver pattern. A new
WKPDFHUDView.mm provides a (Cpp) category that reconstructs C++
ObjectIdentifier types and routes PDF actions through new WKWebView
plumbing (_pdfZoomIn:frameIdentifier:, etc.). This ensures the Swift
implementation only deals with ObjC-compatible types and can build on
all supported platforms.
* Source/WebKit/Configurations/WebKit.xcconfig:
* Source/WebKit/DerivedSources-output.xcfilelist:
* Source/WebKit/DerivedSources.make:
* Source/WebKit/Modules/Internal/module.modulemap:
Add WKPDFHUDView as a module to WebKit_Internal.
* Source/WebKit/PlatformMac.cmake:
* Source/WebKit/SourcesCocoa.txt:
* Source/WebKit/UIProcess/API/Cocoa/WKWebViewInternal.h:
* Source/WebKit/UIProcess/API/mac/WKWebViewMac.mm:
(-[WKWebView _pdfZoomIn:frameIdentifier:]):
(-[WKWebView _pdfZoomOut:frameIdentifier:]):
(-[WKWebView _pdfOpenWithPreview:frameIdentifier:]):
(-[WKWebView _pdfSaveToPDF:frameIdentifier:]):
* Source/WebKit/UIProcess/PDF/WKPDFHUDView.h:
Remove the mouseUp/Down forwarding API since this is no longer
necessary. Provide a designated initializer for Swift.
* Source/WebKit/UIProcess/PDF/WKPDFHUDView.mm:
ObjC++ bridge implementing the (Cpp) category. Reconstructs C++
ObjectIdentifier types from stored uint64_t values and calls
through WKWebView's PDF action methods.
(-[WKPDFHUDView performPDFZoomIn]):
(-[WKPDFHUDView performPDFZoomOut]):
(-[WKPDFHUDView performPDFOpenWithPreview]):
(-[WKPDFHUDView performPDFSaveToPDF]):
(isInRecoveryOS): Deleted.
(-[WKPDFHUDView initWithFrame:pluginIdentifier:frameIdentifier:page:]): Deleted.
(-[WKPDFHUDView dealloc]): Deleted.
(-[WKPDFHUDView layout]): Deleted.
(-[WKPDFHUDView setDeviceScaleFactor:]): Deleted.
(-[WKPDFHUDView _hideTimerFired]): Deleted.
(-[WKPDFHUDView _setVisible:]): Deleted.
(-[WKPDFHUDView hitTest:]): Deleted.
(-[WKPDFHUDView mouseMoved:]): Deleted.
(-[WKPDFHUDView handleMouseDown:]): Deleted.
(-[WKPDFHUDView handleMouseUp:]): Deleted.
(-[WKPDFHUDView _controlIndexForEvent:]): Deleted.
(-[WKPDFHUDView _controlForEvent:]): Deleted.
(-[WKPDFHUDView _layerForEvent:]): Deleted.
(-[WKPDFHUDView _performActionForControl:]): Deleted.
(-[WKPDFHUDView _loadIconImages]): Deleted.
(-[WKPDFHUDView _pinIconImagesToSize:]): Deleted.
(-[WKPDFHUDView _setupLayer:]): Deleted.
(-[WKPDFHUDView _redrawLayer]): Deleted.
(-[WKPDFHUDView _imageForControlName:]): Deleted.
(-[WKPDFHUDView _setLayerOpacity:]): Deleted.
* Source/WebKit/UIProcess/PDF/WKPDFHUDView.swift: Added.
This is a drop-in Swift implementation of WKPDFHUDView. We try to
maintain as much of the behavior from the earlier iteration as possible.
For Liquid Glass platforms, we contain the HUD buttons in a pill-like
glass effect view. For downlevels, this pill instead is a continuous
rounded rect visual effect view.
We introduce some more infrastructure for hiding/showing the HUD now,
because we would like to un-hide the HUD on clicks -- refer to
WKPDFHUDView.show.
(isInRecoveryOS):
(WKPDFHUDView.pluginIdentifier):
(WKPDFHUDView.frameIdentifier):
(WKPDFHUDView.webView):
(WKPDFHUDView.barView):
(WKPDFHUDView.stackView):
(WKPDFHUDView.zoomOutButton):
(WKPDFHUDView.zoomInButton):
(WKPDFHUDView.separatorView):
(WKPDFHUDView.openInPreviewButton):
(WKPDFHUDView.saveButton):
(WKPDFHUDView.isBarVisible):
(WKPDFHUDView.mouseMovedToHUD):
(WKPDFHUDView.initialHideTimerFired):
(WKPDFHUDView.hideTimerTask):
(WKPDFHUDView.hideTimerWorkItem):
(WKPDFHUDView.show):
(WKPDFHUDView._performAction(forTesting:)):
(WKPDFHUDView.layout):
(WKPDFHUDView.hitTest(_:)):
(WKPDFHUDView.mouseMoved(with:)):
(WKPDFHUDView.zoomOutAction):
(WKPDFHUDView.zoomInAction):
(WKPDFHUDView.openInPreviewAction):
(WKPDFHUDView.saveAction):
(WKPDFHUDView.setBarVisible(_:)):
(WKPDFHUDView.resetHideTimer):
(WKPDFHUDView.hideTimerFired):
(WKPDFHUDView.makeBarView):
(WKPDFHUDView.makeButton(_:accessibilityLabel:isPrivateSymbol:)):
(WKPDFHUDView.makeSeparator):
* Source/WebKit/UIProcess/PageClient.h:
* Source/WebKit/UIProcess/WebPageProxy.h:
* Source/WebKit/UIProcess/WebPageProxy.messages.in:
* Source/WebKit/UIProcess/mac/PageClientImplMac.h:
* Source/WebKit/UIProcess/mac/PageClientImplMac.mm:
(WebKit::PageClientImpl::isViewVisible const):
Expose this inner helper method across PageClient and WebViewImpl, so
that WKAppKitGestureController can hit test for HUDs following clicks.
(WebKit::PageClientImpl::showPDFHUD):
(WebKit::PageClientImpl::isViewVisible): Deleted.
* Source/WebKit/UIProcess/mac/WKAppKitGestureController.mm:
(-[WKAppKitGestureController singleClickGestureRecognized:]):
* Source/WebKit/UIProcess/mac/WebPageProxyMac.mm:
(WebKit::WebPageProxy::showPDFHUD):
* Source/WebKit/UIProcess/mac/WebViewImpl.h:
* Source/WebKit/UIProcess/mac/WebViewImpl.mm:
(WebKit::WebViewImpl::createPDFHUD):
(WebKit::WebViewImpl::showPDFHUD):
(WebKit::WebViewImpl::hitTestPDFHUD):
(WebKit::WebViewImpl::isPointOnPDFHUD):
(WebKit::WebViewImpl::isViewVisible):
(WebKit::WebViewImpl::windowDidChangeBackingProperties):
(WebKit::WebViewImpl::mouseMoved):
(WebKit::WebViewImpl::mouseDown):
(WebKit::WebViewImpl::mouseUp):
* Source/WebKit/WebKit.xcodeproj/project.pbxproj:
* Source/WebKit/WebProcess/Plugins/PDF/UnifiedPDF/UnifiedPDFPlugin.mm:
(WebKit::UnifiedPDFPlugin::handleSyntheticClick):
* Source/WebKit/WebProcess/WebPage/Cocoa/WebPageCocoa.mm:
* Source/WebKit/WebProcess/WebPage/WebPage.h:
* Source/WebKit/WebProcess/WebPage/mac/WebPageMac.mm:
(WebKit::WebPage::showPDFHUD):
Canonical link: https://commits.webkit.org/309541@main
To unsubscribe from these emails, change your notification settings at
https://github.com/WebKit/WebKit/settings/notifications