Skip to content

Commit 0af1193

Browse files
Nick LefeverSaadnajmi
authored andcommitted
[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
1 parent 2037280 commit 0af1193

File tree

2 files changed

+70
-1
lines changed

2 files changed

+70
-1
lines changed

packages/react-native/React/Fabric/RCTConversions.h

Lines changed: 55 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,15 @@ inline NSAccessibilityRole RCTUIAccessibilityRoleFromAccessibilityTraits(
136136
{
137137
using AccessibilityTraits = facebook::react::AccessibilityTraits;
138138
if ((accessibilityTraits & AccessibilityTraits::Button) != AccessibilityTraits::None) {
139+
if ((accessibilityTraits & AccessibilityTraits::Bar) != AccessibilityTraits::None) {
140+
return NSAccessibilityToolbarRole;
141+
}
142+
if ((accessibilityTraits & AccessibilityTraits::PopUp) != AccessibilityTraits::None) {
143+
return NSAccessibilityPopUpButtonRole;
144+
}
145+
if ((accessibilityTraits & AccessibilityTraits::Menu) != AccessibilityTraits::None) {
146+
return NSAccessibilityMenuButtonRole;
147+
}
139148
return NSAccessibilityButtonRole;
140149
}
141150
if ((accessibilityTraits & AccessibilityTraits::Link) != AccessibilityTraits::None) {
@@ -165,7 +174,52 @@ inline NSAccessibilityRole RCTUIAccessibilityRoleFromAccessibilityTraits(
165174
if ((accessibilityTraits & AccessibilityTraits::Switch) != AccessibilityTraits::None) {
166175
return NSAccessibilityCheckBoxRole;
167176
}
168-
177+
if ((accessibilityTraits & AccessibilityTraits::UpdatesFrequently) != AccessibilityTraits::None) {
178+
return NSAccessibilityProgressIndicatorRole;
179+
}
180+
if ((accessibilityTraits & AccessibilityTraits::ComboBox) != AccessibilityTraits::None) {
181+
return NSAccessibilityComboBoxRole;
182+
}
183+
if ((accessibilityTraits & AccessibilityTraits::Menu) != AccessibilityTraits::None) {
184+
if ((accessibilityTraits & AccessibilityTraits::Bar) != AccessibilityTraits::None) {
185+
return NSAccessibilityMenuBarRole;
186+
}
187+
if ((accessibilityTraits & AccessibilityTraits::Item) != AccessibilityTraits::None) {
188+
return NSAccessibilityMenuItemRole;
189+
}
190+
return NSAccessibilityMenuRole;
191+
}
192+
if ((accessibilityTraits & AccessibilityTraits::Radio) != AccessibilityTraits::None) {
193+
if ((accessibilityTraits & AccessibilityTraits::Group) != AccessibilityTraits::None) {
194+
return NSAccessibilityRadioGroupRole;
195+
}
196+
return NSAccessibilityRadioButtonRole;
197+
}
198+
if ((accessibilityTraits & AccessibilityTraits::ScrollBar) != AccessibilityTraits::None) {
199+
return NSAccessibilityScrollBarRole;
200+
}
201+
if ((accessibilityTraits & AccessibilityTraits::SpinButton) != AccessibilityTraits::None) {
202+
return NSAccessibilityIncrementorRole;
203+
}
204+
if ((accessibilityTraits & AccessibilityTraits::Tab) != AccessibilityTraits::None) {
205+
if ((accessibilityTraits & AccessibilityTraits::List) != AccessibilityTraits::None) {
206+
return NSAccessibilityTabGroupRole;
207+
}
208+
return NSAccessibilityButtonRole;
209+
}
210+
if ((accessibilityTraits & AccessibilityTraits::Disclosure) != AccessibilityTraits::None) {
211+
return NSAccessibilityDisclosureTriangleRole;
212+
}
213+
if ((accessibilityTraits & AccessibilityTraits::Group) != AccessibilityTraits::None) {
214+
return NSAccessibilityGroupRole;
215+
}
216+
if ((accessibilityTraits & AccessibilityTraits::List) != AccessibilityTraits::None) {
217+
return NSAccessibilityListRole;
218+
}
219+
if ((accessibilityTraits & AccessibilityTraits::Table) != AccessibilityTraits::None) {
220+
return NSAccessibilityTableRole;
221+
}
222+
169223
return NSAccessibilityUnknownRole;
170224
};
171225
#endif // macOS]

packages/react-native/ReactCommon/react/renderer/components/view/AccessibilityPrimitives.h

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,21 @@ enum class AccessibilityTraits : uint32_t {
3434
Header = (1 << 15),
3535
Switch = (1 << 16),
3636
TabBar = (1 << 17),
37+
// [macOS
38+
ComboBox = (1 << 18),
39+
Menu = (1 << 19),
40+
PopUp = (1 << 20),
41+
Bar = (1 << 21),
42+
Item = (1 << 22),
43+
Group = (1 << 23),
44+
List = (1 << 24),
45+
Tab = (1 << 25),
46+
Table = (1 << 26),
47+
Disclosure = (1 << 27),
48+
Radio = (1 << 28),
49+
ScrollBar = (1 << 29),
50+
SpinButton = (1 << 30),
51+
// macOS]
3752
};
3853

3954
constexpr enum AccessibilityTraits operator|(

0 commit comments

Comments
 (0)