Skip to content

AX: Add client-side accessibility testing support to enable writing site isolation tests#57372

Closed
minorninth wants to merge 1 commit intoWebKit:mainfrom
minorninth:eng/AX-Add-client-side-accessibility-testing-support-to-enable-writing-site-isolation-tests
Closed

AX: Add client-side accessibility testing support to enable writing site isolation tests#57372
minorninth wants to merge 1 commit intoWebKit:mainfrom
minorninth:eng/AX-Add-client-side-accessibility-testing-support-to-enable-writing-site-isolation-tests

Conversation

@minorninth
Copy link
Contributor

@minorninth minorninth commented Jan 28, 2026

02562b9

AX: Add client-side accessibility testing support to enable writing site isolation tests
rdar://169048334
https://bugs.webkit.org/show_bug.cgi?id=306382

Reviewed by NOBODY (OOPS!).

Enables using Mac client-side accessibility APIs
(e.g. AXUIElementCopyAttributeValue, used by clients like VoiceOver),
in accessibility layout tests, which will allow us to test that
accessibility APIs work correctly across site isolation boundaries.

This adds a new subclass of AccessibilityUIElement, used to represent
each element in an accessibility layout test. When this class is
chosen, the client-side accessibility API is used to explore the
accessibility tree, rather than calling accessibility APIs in WebCore
directly.

This can't be done from the web content process due to sandboxing,
so instead we send an IPC to the main WebKitTestRunner process and
have it call the APIs there. Each AXUIElement is stored in a map and
represented by an opaque token.

Because the JavaScript API is blocked on an IPC to the main process,
and the main process's accessibility call blocks on an IPC to the
web content process, this only works if isolated tree mode is enabled,
because that uses a secondary accessibility thread.

This initial patch just starts with a very simple layout test to
demonstrate usage, and we will follow up with site isolation tests.

Test: accessibility/mac/client/button.html

* LayoutTests/accessibility/mac/client/README.md: Added.
* LayoutTests/accessibility/mac/client/button-expected.txt: Added.
* LayoutTests/accessibility/mac/client/button.html: Added.
* LayoutTests/platform/mac/TestExpectations:
* Source/WebCore/testing/js/WebCoreTestSupport.cpp:
(WebCoreTestSupport::setAccessibilityIsolatedTreeEnabled):
* Source/WebCore/testing/js/WebCoreTestSupport.h:
* Source/WebKit/UIProcess/API/Cocoa/WKWebView.mm:
(-[WKWebView _remoteAccessibilityChildToken]):
* Source/WebKit/UIProcess/API/Cocoa/WKWebViewPrivate.h:
* Source/WebKit/UIProcess/mac/WebViewImpl.h:
* Source/WebKit/UIProcess/mac/WebViewImpl.mm:
(WebKit::WebViewImpl::remoteAccessibilityChildToken):
* Tools/WebKitTestRunner/Configurations/WebKitTestRunner-internal.entitlements:
* Tools/WebKitTestRunner/InjectedBundle/AccessibilityController.cpp:
(WTR::AccessibilityController::setClientAccessibilityMode):
(WTR::AccessibilityController::rootElement):
(WTR::AccessibilityController::platformInitializeClientAccessibility):
* Tools/WebKitTestRunner/InjectedBundle/AccessibilityController.h:
(WTR::AccessibilityController::clientAccessibilityModeEnabled const):
* Tools/WebKitTestRunner/InjectedBundle/AccessibilityUIElement.cpp:
* Tools/WebKitTestRunner/InjectedBundle/Bindings/AccessibilityController.idl:
* Tools/WebKitTestRunner/InjectedBundle/mac/AccessibilityControllerMac.mm:
(WTR::AccessibilityController::updateIsolatedTreeMode):
(WTR::AccessibilityController::platformInitializeClientAccessibility):
* Tools/WebKitTestRunner/InjectedBundle/mac/AccessibilityUIElementClientMac.h: Added.
* Tools/WebKitTestRunner/InjectedBundle/mac/AccessibilityUIElementClientMac.mm: Added.
(WTR::axGetRoot):
(WTR::axCopyAttributeValueAsString):
(WTR::axCopyAttributeValueAsElementArray):
(WTR::AccessibilityUIElementClientMac::create):
(WTR::AccessibilityUIElementClientMac::createForUIProcess):
(WTR::AccessibilityUIElementClientMac::AccessibilityUIElementClientMac):
(WTR::AccessibilityUIElementClientMac::~AccessibilityUIElementClientMac):
(WTR::AccessibilityUIElementClientMac::platformUIElement):
(WTR::AccessibilityUIElementClientMac::isValid const):
(WTR::AccessibilityUIElementClientMac::role):
(WTR::AccessibilityUIElementClientMac::title):
(WTR::AccessibilityUIElementClientMac::description):
(WTR::AccessibilityUIElementClientMac::stringValue):
(WTR::AccessibilityUIElementClientMac::getChildren const):
(WTR::AccessibilityUIElementClientMac::getChildrenInRange const):
(WTR::AccessibilityUIElementClientMac::childrenCount):
(WTR::AccessibilityUIElementClientMac::childAtIndex):
* Tools/WebKitTestRunner/TestController.cpp:
* Tools/WebKitTestRunner/TestController.h:
* Tools/WebKitTestRunner/TestInvocation.cpp:
(WTR::TestInvocation::didReceiveSynchronousMessageFromInjectedBundle):
* Tools/WebKitTestRunner/WebKitTestRunner.xcodeproj/project.pbxproj:
* Tools/WebKitTestRunner/mac/TestControllerMac.mm:
(WTR::TestController::getRemoteAccessibilityToken):
(WTR::TestController::initializeWebProcessAccessibility):

02562b9

Misc iOS, visionOS, tvOS & watchOS macOS Linux Windows
✅ 🧪 style ❌ 🛠 ios 🛠 mac ✅ 🛠 wpe 🛠 win
✅ 🧪 bindings ❌ 🛠 ios-sim ✅ 🛠 mac-AS-debug 🧪 wpe-wk2 🧪 win-tests
✅ 🧪 webkitperl ❌ 🧪 ios-wk2 🧪 api-mac 🧪 api-wpe
❌ 🧪 ios-wk2-wpt 🧪 api-mac-debug ✅ 🛠 wpe-libwebrtc
❌ 🧪 api-ios 🧪 mac-wk1 ✅ 🛠 gtk
❌ 🛠 vision 🧪 mac-wk2 🧪 gtk-wk2
🛠 vision-sim 🧪 mac-AS-debug-wk2 🧪 api-gtk
⏳ 🧪 vision-wk2 🧪 mac-wk2-stress 🛠 playstation
✅ 🛠 tv 🧪 mac-intel-wk2
🛠 tv-sim 🛠 mac-safer-cpp
🛠 watch
🛠 watch-sim

@minorninth minorninth self-assigned this Jan 28, 2026
@minorninth minorninth added the Accessibility For bugs related to accessibility. label Jan 28, 2026
@minorninth minorninth force-pushed the eng/AX-Add-client-side-accessibility-testing-support-to-enable-writing-site-isolation-tests branch from 428a278 to 369e552 Compare January 28, 2026 03:30
@webkit-ews-buildbot webkit-ews-buildbot added the merging-blocked Applied to prevent a change from being merged label Jan 28, 2026
@minorninth minorninth removed the merging-blocked Applied to prevent a change from being merged label Jan 28, 2026
@minorninth minorninth force-pushed the eng/AX-Add-client-side-accessibility-testing-support-to-enable-writing-site-isolation-tests branch from 369e552 to fb2bcbb Compare January 28, 2026 06:55
@webkit-ews-buildbot webkit-ews-buildbot added the merging-blocked Applied to prevent a change from being merged label Jan 28, 2026
@minorninth minorninth removed the merging-blocked Applied to prevent a change from being merged label Jan 29, 2026
@minorninth minorninth force-pushed the eng/AX-Add-client-side-accessibility-testing-support-to-enable-writing-site-isolation-tests branch from fb2bcbb to 6a328e5 Compare January 29, 2026 04:11
@minorninth minorninth force-pushed the eng/AX-Add-client-side-accessibility-testing-support-to-enable-writing-site-isolation-tests branch from 6a328e5 to 48905e9 Compare January 29, 2026 06:11
@webkit-ews-buildbot webkit-ews-buildbot added the merging-blocked Applied to prevent a change from being merged label Jan 29, 2026
@minorninth minorninth removed the merging-blocked Applied to prevent a change from being merged label Jan 29, 2026
@minorninth minorninth force-pushed the eng/AX-Add-client-side-accessibility-testing-support-to-enable-writing-site-isolation-tests branch from 48905e9 to f1a7865 Compare January 29, 2026 17:01
@minorninth minorninth force-pushed the eng/AX-Add-client-side-accessibility-testing-support-to-enable-writing-site-isolation-tests branch from f1a7865 to feb5172 Compare January 29, 2026 18:24
@webkit-ews-buildbot webkit-ews-buildbot added the merging-blocked Applied to prevent a change from being merged label Jan 29, 2026
@minorninth minorninth removed the merging-blocked Applied to prevent a change from being merged label Jan 30, 2026
@minorninth minorninth force-pushed the eng/AX-Add-client-side-accessibility-testing-support-to-enable-writing-site-isolation-tests branch from feb5172 to 0bd9215 Compare January 30, 2026 17:00
…ite isolation tests

rdar://169048334
https://bugs.webkit.org/show_bug.cgi?id=306382

Reviewed by NOBODY (OOPS!).

Enables using Mac client-side accessibility APIs
(e.g. AXUIElementCopyAttributeValue, used by clients like VoiceOver),
in accessibility layout tests, which will allow us to test that
accessibility APIs work correctly across site isolation boundaries.

This adds a new subclass of AccessibilityUIElement, used to represent
each element in an accessibility layout test. When this class is
chosen, the client-side accessibility API is used to explore the
accessibility tree, rather than calling accessibility APIs in WebCore
directly.

This can't be done from the web content process due to sandboxing,
so instead we send an IPC to the main WebKitTestRunner process and
have it call the APIs there. Each AXUIElement is stored in a map and
represented by an opaque token.

Because the JavaScript API is blocked on an IPC to the main process,
and the main process's accessibility call blocks on an IPC to the
web content process, this only works if isolated tree mode is enabled,
because that uses a secondary accessibility thread.

This initial patch just starts with a very simple layout test to
demonstrate usage, and we will follow up with site isolation tests.

Test: accessibility/mac/client/button.html

* LayoutTests/accessibility/mac/client/README.md: Added.
* LayoutTests/accessibility/mac/client/button-expected.txt: Added.
* LayoutTests/accessibility/mac/client/button.html: Added.
* LayoutTests/platform/mac/TestExpectations:
* Source/WebCore/testing/js/WebCoreTestSupport.cpp:
(WebCoreTestSupport::setAccessibilityIsolatedTreeEnabled):
* Source/WebCore/testing/js/WebCoreTestSupport.h:
* Source/WebKit/UIProcess/API/Cocoa/WKWebView.mm:
(-[WKWebView _remoteAccessibilityChildToken]):
* Source/WebKit/UIProcess/API/Cocoa/WKWebViewPrivate.h:
* Source/WebKit/UIProcess/mac/WebViewImpl.h:
* Source/WebKit/UIProcess/mac/WebViewImpl.mm:
(WebKit::WebViewImpl::remoteAccessibilityChildToken):
* Tools/WebKitTestRunner/Configurations/WebKitTestRunner-internal.entitlements:
* Tools/WebKitTestRunner/InjectedBundle/AccessibilityController.cpp:
(WTR::AccessibilityController::setClientAccessibilityMode):
(WTR::AccessibilityController::rootElement):
(WTR::AccessibilityController::platformInitializeClientAccessibility):
* Tools/WebKitTestRunner/InjectedBundle/AccessibilityController.h:
(WTR::AccessibilityController::clientAccessibilityModeEnabled const):
* Tools/WebKitTestRunner/InjectedBundle/AccessibilityUIElement.cpp:
* Tools/WebKitTestRunner/InjectedBundle/Bindings/AccessibilityController.idl:
* Tools/WebKitTestRunner/InjectedBundle/mac/AccessibilityControllerMac.mm:
(WTR::AccessibilityController::updateIsolatedTreeMode):
(WTR::AccessibilityController::platformInitializeClientAccessibility):
* Tools/WebKitTestRunner/InjectedBundle/mac/AccessibilityUIElementClientMac.h: Added.
* Tools/WebKitTestRunner/InjectedBundle/mac/AccessibilityUIElementClientMac.mm: Added.
(WTR::axGetRoot):
(WTR::axCopyAttributeValueAsString):
(WTR::axCopyAttributeValueAsElementArray):
(WTR::AccessibilityUIElementClientMac::create):
(WTR::AccessibilityUIElementClientMac::createForUIProcess):
(WTR::AccessibilityUIElementClientMac::AccessibilityUIElementClientMac):
(WTR::AccessibilityUIElementClientMac::~AccessibilityUIElementClientMac):
(WTR::AccessibilityUIElementClientMac::platformUIElement):
(WTR::AccessibilityUIElementClientMac::isValid const):
(WTR::AccessibilityUIElementClientMac::role):
(WTR::AccessibilityUIElementClientMac::title):
(WTR::AccessibilityUIElementClientMac::description):
(WTR::AccessibilityUIElementClientMac::stringValue):
(WTR::AccessibilityUIElementClientMac::getChildren const):
(WTR::AccessibilityUIElementClientMac::getChildrenInRange const):
(WTR::AccessibilityUIElementClientMac::childrenCount):
(WTR::AccessibilityUIElementClientMac::childAtIndex):
* Tools/WebKitTestRunner/TestController.cpp:
* Tools/WebKitTestRunner/TestController.h:
* Tools/WebKitTestRunner/TestInvocation.cpp:
(WTR::TestInvocation::didReceiveSynchronousMessageFromInjectedBundle):
* Tools/WebKitTestRunner/WebKitTestRunner.xcodeproj/project.pbxproj:
* Tools/WebKitTestRunner/mac/TestControllerMac.mm:
(WTR::TestController::getRemoteAccessibilityToken):
(WTR::TestController::initializeWebProcessAccessibility):
@minorninth minorninth force-pushed the eng/AX-Add-client-side-accessibility-testing-support-to-enable-writing-site-isolation-tests branch from 0bd9215 to 02562b9 Compare January 30, 2026 18:03
@minorninth minorninth closed this Jan 30, 2026
@minorninth minorninth deleted the eng/AX-Add-client-side-accessibility-testing-support-to-enable-writing-site-isolation-tests branch January 30, 2026 18:05
@martadarbinyan martadarbinyan added the skip-ews Applied to prevent a change from being run on EWS label Jan 30, 2026
@minorninth
Copy link
Contributor Author

Moved to: #57568

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Accessibility For bugs related to accessibility. skip-ews Applied to prevent a change from being run on EWS

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants