Skip to content

Commit eedccb9

Browse files
Nick LefeverSaadnajmi
authored andcommitted
[fabric][a11y] Add role mapping for common 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/D51736931 Tasks: T170938725
1 parent 319b0f9 commit eedccb9

File tree

2 files changed

+45
-1
lines changed

2 files changed

+45
-1
lines changed

packages/react-native/React/Fabric/Mounting/ComponentViews/View/RCTViewComponentView.mm

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -424,6 +424,7 @@ - (void)updateProps:(const Props::Shared &)props oldProps:(const Props::Shared &
424424
if (oldViewProps.accessibilityElementsHidden != newViewProps.accessibilityElementsHidden) {
425425
self.accessibilityElement.accessibilityElementsHidden = newViewProps.accessibilityElementsHidden;
426426
}
427+
#endif // [macOS]
427428

428429
// `accessibilityShowsLargeContentViewer`
429430
if (oldViewProps.accessibilityShowsLargeContentViewer != newViewProps.accessibilityShowsLargeContentViewer) {
@@ -447,10 +448,15 @@ - (void)updateProps:(const Props::Shared &)props oldProps:(const Props::Shared &
447448

448449
// `accessibilityTraits`
449450
if (oldViewProps.accessibilityTraits != newViewProps.accessibilityTraits) {
451+
#if !TARGET_OS_OSX // [macOS]
450452
self.accessibilityElement.accessibilityTraits =
451453
RCTUIAccessibilityTraitsFromAccessibilityTraits(newViewProps.accessibilityTraits);
454+
#else // [macOS
455+
self.accessibilityElement.accessibilityRole = RCTUIAccessibilityRoleFromAccessibilityTraits(newViewProps.accessibilityTraits);
456+
#endif // macOS]
452457
}
453458

459+
#if !TARGET_OS_OSX // [macOS]
454460
// `accessibilityState`
455461
if (oldViewProps.accessibilityState != newViewProps.accessibilityState) {
456462
self.accessibilityTraits &= ~(UIAccessibilityTraitNotEnabled | UIAccessibilityTraitSelected);

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

Lines changed: 39 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,45 @@ inline UIAccessibilityTraits RCTUIAccessibilityTraitsFromAccessibilityTraits(
130130
}
131131
return result;
132132
};
133-
#endif // [macOS]
133+
#else // [macOS
134+
inline NSAccessibilityRole RCTUIAccessibilityRoleFromAccessibilityTraits(
135+
facebook::react::AccessibilityTraits accessibilityTraits)
136+
{
137+
using AccessibilityTraits = facebook::react::AccessibilityTraits;
138+
if ((accessibilityTraits & AccessibilityTraits::Button) != AccessibilityTraits::None) {
139+
return NSAccessibilityButtonRole;
140+
}
141+
if ((accessibilityTraits & AccessibilityTraits::Link) != AccessibilityTraits::None) {
142+
return NSAccessibilityLinkRole;
143+
}
144+
if ((accessibilityTraits & AccessibilityTraits::Image) != AccessibilityTraits::None) {
145+
return NSAccessibilityImageRole;
146+
}
147+
if ((accessibilityTraits & AccessibilityTraits::KeyboardKey) != AccessibilityTraits::None) {
148+
return NSAccessibilityButtonRole;
149+
}
150+
if ((accessibilityTraits & AccessibilityTraits::StaticText) != AccessibilityTraits::None) {
151+
return NSAccessibilityStaticTextRole;
152+
}
153+
if ((accessibilityTraits & AccessibilityTraits::SummaryElement) != AccessibilityTraits::None) {
154+
return NSAccessibilityStaticTextRole;
155+
}
156+
if ((accessibilityTraits & AccessibilityTraits::SearchField) != AccessibilityTraits::None) {
157+
return NSAccessibilityTextFieldRole;
158+
}
159+
if ((accessibilityTraits & AccessibilityTraits::Adjustable) != AccessibilityTraits::None) {
160+
return NSAccessibilitySliderRole;
161+
}
162+
if ((accessibilityTraits & AccessibilityTraits::Header) != AccessibilityTraits::None) {
163+
return NSAccessibilityStaticTextRole;
164+
}
165+
if ((accessibilityTraits & AccessibilityTraits::Switch) != AccessibilityTraits::None) {
166+
return NSAccessibilityCheckBoxRole;
167+
}
168+
169+
return NSAccessibilityUnknownRole;
170+
};
171+
#endif // macOS]
134172

135173
inline CATransform3D RCTCATransform3DFromTransformMatrix(const facebook::react::Transform &transformMatrix)
136174
{

0 commit comments

Comments
 (0)