Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
[fabric][a11y] Add role mapping for desktop specific traits
Summary:
Paper was rendering text as AXStaticText. This diff updates the `RCTParagraphComponentView` to propagate the same role in Fabric for text.

This change will allow to select UI elements based on the text contents.

Test Plan:
Use the Accessibility Inspector in Zeratul with Fabric enabled. With the changes the text elements are presented in the a11y hierarchy with AXStaticText:
 {F1162808272}

Reviewers: shawndempsey, chpurrer, #rn-desktop

Reviewed By: chpurrer

Differential Revision: https://phabricator.intern.facebook.com/D51736933

Tasks: T170938725
  • Loading branch information
Nick Lefever authored and Saadnajmi committed Aug 12, 2025
commit cabd8d27f08c3671324d1ea8fdf0aff8c41749e4
56 changes: 55 additions & 1 deletion packages/react-native/React/Fabric/RCTConversions.h
Original file line number Diff line number Diff line change
Expand Up @@ -136,6 +136,15 @@ inline NSAccessibilityRole RCTUIAccessibilityRoleFromAccessibilityTraits(
{
using AccessibilityTraits = facebook::react::AccessibilityTraits;
if ((accessibilityTraits & AccessibilityTraits::Button) != AccessibilityTraits::None) {
if ((accessibilityTraits & AccessibilityTraits::Bar) != AccessibilityTraits::None) {
return NSAccessibilityToolbarRole;
}
if ((accessibilityTraits & AccessibilityTraits::PopUp) != AccessibilityTraits::None) {
return NSAccessibilityPopUpButtonRole;
}
if ((accessibilityTraits & AccessibilityTraits::Menu) != AccessibilityTraits::None) {
return NSAccessibilityMenuButtonRole;
}
return NSAccessibilityButtonRole;
}
if ((accessibilityTraits & AccessibilityTraits::Link) != AccessibilityTraits::None) {
Expand Down Expand Up @@ -165,7 +174,52 @@ inline NSAccessibilityRole RCTUIAccessibilityRoleFromAccessibilityTraits(
if ((accessibilityTraits & AccessibilityTraits::Switch) != AccessibilityTraits::None) {
return NSAccessibilityCheckBoxRole;
}

if ((accessibilityTraits & AccessibilityTraits::UpdatesFrequently) != AccessibilityTraits::None) {
return NSAccessibilityProgressIndicatorRole;
}
if ((accessibilityTraits & AccessibilityTraits::ComboBox) != AccessibilityTraits::None) {
return NSAccessibilityComboBoxRole;
}
if ((accessibilityTraits & AccessibilityTraits::Menu) != AccessibilityTraits::None) {
if ((accessibilityTraits & AccessibilityTraits::Bar) != AccessibilityTraits::None) {
return NSAccessibilityMenuBarRole;
}
if ((accessibilityTraits & AccessibilityTraits::Item) != AccessibilityTraits::None) {
return NSAccessibilityMenuItemRole;
}
return NSAccessibilityMenuRole;
}
if ((accessibilityTraits & AccessibilityTraits::Radio) != AccessibilityTraits::None) {
if ((accessibilityTraits & AccessibilityTraits::Group) != AccessibilityTraits::None) {
return NSAccessibilityRadioGroupRole;
}
return NSAccessibilityRadioButtonRole;
}
if ((accessibilityTraits & AccessibilityTraits::ScrollBar) != AccessibilityTraits::None) {
return NSAccessibilityScrollBarRole;
}
if ((accessibilityTraits & AccessibilityTraits::SpinButton) != AccessibilityTraits::None) {
return NSAccessibilityIncrementorRole;
}
if ((accessibilityTraits & AccessibilityTraits::Tab) != AccessibilityTraits::None) {
if ((accessibilityTraits & AccessibilityTraits::List) != AccessibilityTraits::None) {
return NSAccessibilityTabGroupRole;
}
return NSAccessibilityButtonRole;
}
if ((accessibilityTraits & AccessibilityTraits::Disclosure) != AccessibilityTraits::None) {
return NSAccessibilityDisclosureTriangleRole;
}
if ((accessibilityTraits & AccessibilityTraits::Group) != AccessibilityTraits::None) {
return NSAccessibilityGroupRole;
}
if ((accessibilityTraits & AccessibilityTraits::List) != AccessibilityTraits::None) {
return NSAccessibilityListRole;
}
if ((accessibilityTraits & AccessibilityTraits::Table) != AccessibilityTraits::None) {
return NSAccessibilityTableRole;
}

return NSAccessibilityUnknownRole;
};
#endif // macOS]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,21 @@ enum class AccessibilityTraits : uint32_t {
Header = (1 << 15),
Switch = (1 << 16),
TabBar = (1 << 17),
// [macOS
ComboBox = (1 << 18),
Menu = (1 << 19),
PopUp = (1 << 20),
Bar = (1 << 21),
Item = (1 << 22),
Group = (1 << 23),
List = (1 << 24),
Tab = (1 << 25),
Table = (1 << 26),
Disclosure = (1 << 27),
Radio = (1 << 28),
ScrollBar = (1 << 29),
SpinButton = (1 << 30),
// macOS]
};

constexpr enum AccessibilityTraits operator|(
Expand Down