Skip to content

Commit 3d1d583

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 bf133b9 commit 3d1d583

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
@@ -404,6 +404,7 @@ - (void)updateProps:(const Props::Shared &)props oldProps:(const Props::Shared &
404404
if (oldViewProps.accessibilityElementsHidden != newViewProps.accessibilityElementsHidden) {
405405
self.accessibilityElement.accessibilityElementsHidden = newViewProps.accessibilityElementsHidden;
406406
}
407+
#endif // [macOS]
407408

408409
// `accessibilityShowsLargeContentViewer`
409410
if (oldViewProps.accessibilityShowsLargeContentViewer != newViewProps.accessibilityShowsLargeContentViewer) {
@@ -427,10 +428,15 @@ - (void)updateProps:(const Props::Shared &)props oldProps:(const Props::Shared &
427428

428429
// `accessibilityTraits`
429430
if (oldViewProps.accessibilityTraits != newViewProps.accessibilityTraits) {
431+
#if !TARGET_OS_OSX // [macOS]
430432
self.accessibilityElement.accessibilityTraits =
431433
RCTUIAccessibilityTraitsFromAccessibilityTraits(newViewProps.accessibilityTraits);
434+
#else // [macOS
435+
self.accessibilityElement.accessibilityRole = RCTUIAccessibilityRoleFromAccessibilityTraits(newViewProps.accessibilityTraits);
436+
#endif // macOS]
432437
}
433438

439+
#if !TARGET_OS_OSX // [macOS]
434440
// `accessibilityState`
435441
if (oldViewProps.accessibilityState != newViewProps.accessibilityState) {
436442
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
@@ -124,7 +124,45 @@ inline UIAccessibilityTraits RCTUIAccessibilityTraitsFromAccessibilityTraits(
124124
}
125125
return result;
126126
};
127-
#endif // [macOS]
127+
#else // [macOS
128+
inline NSAccessibilityRole RCTUIAccessibilityRoleFromAccessibilityTraits(
129+
facebook::react::AccessibilityTraits accessibilityTraits)
130+
{
131+
using AccessibilityTraits = facebook::react::AccessibilityTraits;
132+
if ((accessibilityTraits & AccessibilityTraits::Button) != AccessibilityTraits::None) {
133+
return NSAccessibilityButtonRole;
134+
}
135+
if ((accessibilityTraits & AccessibilityTraits::Link) != AccessibilityTraits::None) {
136+
return NSAccessibilityLinkRole;
137+
}
138+
if ((accessibilityTraits & AccessibilityTraits::Image) != AccessibilityTraits::None) {
139+
return NSAccessibilityImageRole;
140+
}
141+
if ((accessibilityTraits & AccessibilityTraits::KeyboardKey) != AccessibilityTraits::None) {
142+
return NSAccessibilityButtonRole;
143+
}
144+
if ((accessibilityTraits & AccessibilityTraits::StaticText) != AccessibilityTraits::None) {
145+
return NSAccessibilityStaticTextRole;
146+
}
147+
if ((accessibilityTraits & AccessibilityTraits::SummaryElement) != AccessibilityTraits::None) {
148+
return NSAccessibilityStaticTextRole;
149+
}
150+
if ((accessibilityTraits & AccessibilityTraits::SearchField) != AccessibilityTraits::None) {
151+
return NSAccessibilityTextFieldRole;
152+
}
153+
if ((accessibilityTraits & AccessibilityTraits::Adjustable) != AccessibilityTraits::None) {
154+
return NSAccessibilitySliderRole;
155+
}
156+
if ((accessibilityTraits & AccessibilityTraits::Header) != AccessibilityTraits::None) {
157+
return NSAccessibilityStaticTextRole;
158+
}
159+
if ((accessibilityTraits & AccessibilityTraits::Switch) != AccessibilityTraits::None) {
160+
return NSAccessibilityCheckBoxRole;
161+
}
162+
163+
return NSAccessibilityUnknownRole;
164+
};
165+
#endif // macOS]
128166

129167
inline CATransform3D RCTCATransform3DFromTransformMatrix(const facebook::react::Transform &transformMatrix)
130168
{

0 commit comments

Comments
 (0)