Skip to content

Commit 68f9bc8

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 7e49794 commit 68f9bc8

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
@@ -413,6 +413,7 @@ - (void)updateProps:(const Props::Shared &)props oldProps:(const Props::Shared &
413413
if (oldViewProps.accessibilityElementsHidden != newViewProps.accessibilityElementsHidden) {
414414
self.accessibilityElement.accessibilityElementsHidden = newViewProps.accessibilityElementsHidden;
415415
}
416+
#endif // [macOS]
416417

417418
// `accessibilityShowsLargeContentViewer`
418419
if (oldViewProps.accessibilityShowsLargeContentViewer != newViewProps.accessibilityShowsLargeContentViewer) {
@@ -436,10 +437,15 @@ - (void)updateProps:(const Props::Shared &)props oldProps:(const Props::Shared &
436437

437438
// `accessibilityTraits`
438439
if (oldViewProps.accessibilityTraits != newViewProps.accessibilityTraits) {
440+
#if !TARGET_OS_OSX // [macOS]
439441
self.accessibilityElement.accessibilityTraits =
440442
RCTUIAccessibilityTraitsFromAccessibilityTraits(newViewProps.accessibilityTraits);
443+
#else // [macOS
444+
self.accessibilityElement.accessibilityRole = RCTUIAccessibilityRoleFromAccessibilityTraits(newViewProps.accessibilityTraits);
445+
#endif // macOS]
441446
}
442447

448+
#if !TARGET_OS_OSX // [macOS]
443449
// `accessibilityState`
444450
if (oldViewProps.accessibilityState != newViewProps.accessibilityState) {
445451
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)