Branch: refs/heads/main
Home: https://github.com/WebKit/WebKit
Commit: 1e4383d0fdd819260d6a9042bfdb3743d011f65b
https://github.com/WebKit/WebKit/commit/1e4383d0fdd819260d6a9042bfdb3743d011f65b
Author: Tyler Wilcock <[email protected]>
Date: 2026-05-05 (Tue, 05 May 2026)
Changed paths:
M LayoutTests/accessibility/base-select-basic-expected.txt
M LayoutTests/accessibility/base-select-basic.html
M LayoutTests/accessibility/base-select-complex-options.html
M LayoutTests/accessibility/base-select-option-press-closes-popover.html
A
LayoutTests/accessibility/ios-simulator/base-select-popover-is-sibling-expected.txt
A
LayoutTests/accessibility/ios-simulator/base-select-popover-is-sibling.html
M LayoutTests/resources/accessibility-helper.js
M Source/WebCore/accessibility/AccessibilityListBoxOption.cpp
M Source/WebCore/accessibility/AccessibilityListBoxOption.h
M Source/WebCore/accessibility/ios/WebAccessibilityObjectWrapperIOS.mm
M Tools/WebKitTestRunner/InjectedBundle/ios/AccessibilityUIElementIOS.mm
Log Message:
-----------
AX: iOS Voice Control doesn't generate actionable-numbers for base-select
option elements
https://bugs.webkit.org/show_bug.cgi?id=312805
rdar://175189776
Reviewed by Joshua Hoffman.
On iOS, isAccessibilityElement=YES elements are treated as leaves by assistive
technologies, meaning they won't recurse into their children. The base-select
popover
(Menu) was a child of the select element, which is an accessibility element, so
ATs like Voice Control could never reach the menu items inside.
This patch makes three changes:
1. Reparent the base-select popover from a child of the select to a sibling in
the iOS accessibility tree. This is done entirely in the iOS wrapper layer
(WebAccessibilityObjectWrapperIOS.mm), allowing the core accessibility tree to
match the DOM and thus keeping it simple. A new _collectAccessibilityElements:
internal method centralizes the child collection logic with a
CountOnly/Elements mode
to avoid unnecessary NSArray allocation when only the count is needed. This
avoids
re-implementing the same logic in multiple places (accessibilityElements,
accessibilityElementCount, ...).
2. Report base-select options as MenuItem role instead of ListBoxOption. The
options live inside a role="menu" popover and behave as menu items (activate
to select and dismiss), not listbox options (toggle in an always-visible list).
AccessibilityRenderObject::determineAccessibilityRole() already had this logic
but it was unreachable because
AccessibilityListBoxOption::determineAccessibilityRole()
was final and unconditionally returned ListBoxOption.
Ideally in the future, we could collapse AccessibilityListBoxOption into
AccessibilityRenderObject.
3. Add _axButtonTrait to MenuItem in the iOS accessibilityTraits so Voice
Control
recognizes menu items as actionable and generates numbered overlays for them.
Also implements AccessibilityUIElementIOS::parentElement() (was a nil stub)
using
accessibilityContainer, which is needed by the new findBaseSelectMenu() test
helper.
* LayoutTests/accessibility/base-select-basic-expected.txt:
* LayoutTests/accessibility/base-select-basic.html:
* LayoutTests/accessibility/base-select-complex-options.html:
* LayoutTests/accessibility/base-select-option-press-closes-popover.html:
*
LayoutTests/accessibility/ios-simulator/base-select-popover-is-sibling-expected.txt:
Added.
* LayoutTests/accessibility/ios-simulator/base-select-popover-is-sibling.html:
Added.
* LayoutTests/resources/accessibility-helper.js:
* Source/WebCore/accessibility/AccessibilityListBoxOption.cpp:
(WebCore::AccessibilityListBoxOption::determineAccessibilityRole):
* Source/WebCore/accessibility/AccessibilityListBoxOption.h:
* Source/WebCore/accessibility/ios/WebAccessibilityObjectWrapperIOS.mm:
(-[WebAccessibilityObjectWrapper _collectAccessibilityElements:]):
(-[WebAccessibilityObjectWrapper accessibilityElements]):
(-[WebAccessibilityObjectWrapper accessibilityElementCount]):
(-[WebAccessibilityObjectWrapper accessibilityElementAtIndex:]):
(-[WebAccessibilityObjectWrapper indexOfAccessibilityElement:]):
(-[WebAccessibilityObjectWrapper accessibilityTraits]):
* Tools/WebKitTestRunner/InjectedBundle/ios/AccessibilityUIElementIOS.mm:
(WTR::AccessibilityUIElementIOS::parentElement):
Canonical link: https://commits.webkit.org/312667@main
To unsubscribe from these emails, change your notification settings at
https://github.com/WebKit/WebKit/settings/notifications