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

Reply via email to