Repository navigation
Infrastructure: Fix native accessibility-state projection gaps on macOS and Win32 #4346
Description
Goal
Resolve the native accessibility-state projection gaps documented by the delivered assertion/focus work, rather than treating behavior tests as native state conformance. Parent: #4275. Bug follow-up to #4255 and PR #4314.
Observed state - 2026-10-01
Current story callbacks explicitly skip two macOS native-state assertions:
- Button disabled state: the source records that RNmacOS 0.81.9 Fabric does not project
accessibilityState.disabledto AXEnabled. - TabList selected/disabled state: the source records missing AXSelected/AXEnabled projection.
The merged focus plan separately records Win32 TextInput announcing UIA IsEnabled=true when configured noneditable, nonfocusable, and accessibility-disabled.
These are native observation gaps, distinct from the verified focus exclusion, callback/selection ownership, and activation guards. This audit verified the retained skip/source evidence; it did not requalify those observations against a newer native runtime.
Reproduction
On the current supported native runtimes, inspect the real AX/UIA tree for the Button/TabList focus fixtures and disabled Input fixture, then compare enabled/selected state before and after prop/state changes. Record resolved fork versions, native tree attributes, helper identity, and actual application behavior.
Use the isolated Button and TabList native-state WDIO cases; their current macOS skip text is evidence to replace, not permission to fake the expected attributes in JavaScript.
Acceptance criteria
- Reproduce or disprove each documented gap on current macOS Fabric/Win32 Paper, with explicit native attribute and runtime evidence.
- Identify the owning component/renderer/upstream transport and implement or consume the correct native fix; preserve the intended distinction between editability, focusability, and disabled semantics.
- Native AXEnabled/AXSelected/UIA state reflects the declared public contract, including updates and selected-to-unselected transitions.
- Driver normalization remains truthful: unsupported native state is explicit, never synthesized from component-owned status text or defaulted to
false. - Remove the two macOS skips only after their real native assertions pass, and add an enabled-state regression for the affected Win32 Input contract.
- Physical activation, UIA Toggle/SelectionItem.Select, AX custom-action dispatch, and screen-reader behavior remain separately identified; state reads do not claim those actions were qualified.
- Update the focus/accessibility evidence and relevant tests/docs/changesets. If an upstream fix is required, link its issue/change and keep the blocked coverage explicit.
Evidence
- Button native disabled-state case
- TabList native selected/disabled-state case
- Executed evidence and remaining renderer limits
- Coordinate Infrastructure: Complete portable Storybook accessibility coverage and reporting #4343/Infrastructure: Qualify and require native Storybook CI coverage #4349 and Components: Accessibility conformance suite #4214, without closing native-state coverage using React prop tests.
Activity