Skip to content

Commit 54997e4

Browse files
pietervfacebook-github-bot
authored andcommitted
Cleanup accessibility checks (#44885)
Summary: Pull Request resolved: #44885 Cleanup accessibility related props checks to ensure we are doing the minimal amount of work. e.g. reduce duplicate `null` checks and shift checks to conditional branches that use them. Changelog: [Internal] Reviewed By: javache Differential Revision: D58390430 fbshipit-source-id: f2c8989b6520cda9f14f9a04cd4fd6e126c501fd
1 parent b44e3f6 commit 54997e4

File tree

3 files changed

+75
-60
lines changed

3 files changed

+75
-60
lines changed

packages/react-native/Libraries/Components/View/ViewAccessibility.js

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -136,11 +136,11 @@ export type AccessibilityActionEvent = SyntheticEvent<
136136
>;
137137

138138
export type AccessibilityState = {
139-
disabled?: boolean,
140-
selected?: boolean,
139+
disabled?: ?boolean,
140+
selected?: ?boolean,
141141
checked?: ?boolean | 'mixed',
142-
busy?: boolean,
143-
expanded?: boolean,
142+
busy?: ?boolean,
143+
expanded?: ?boolean,
144144
...
145145
};
146146

packages/react-native/Libraries/Text/Text.js

Lines changed: 67 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -61,33 +61,38 @@ const Text: React.AbstractComponent<
6161

6262
const [isHighlighted, setHighlighted] = useState(false);
6363

64-
let _accessibilityState;
64+
const _accessibilityLabel = ariaLabel ?? accessibilityLabel;
65+
66+
let _accessibilityState: ?TextProps['accessibilityState'] =
67+
accessibilityState;
6568
if (
66-
accessibilityState != null ||
6769
ariaBusy != null ||
6870
ariaChecked != null ||
6971
ariaDisabled != null ||
7072
ariaExpanded != null ||
7173
ariaSelected != null
7274
) {
73-
_accessibilityState = {
74-
busy: ariaBusy ?? accessibilityState?.busy,
75-
checked: ariaChecked ?? accessibilityState?.checked,
76-
disabled: ariaDisabled ?? accessibilityState?.disabled,
77-
expanded: ariaExpanded ?? accessibilityState?.expanded,
78-
selected: ariaSelected ?? accessibilityState?.selected,
79-
};
75+
if (_accessibilityState != null) {
76+
_accessibilityState = {
77+
busy: ariaBusy ?? _accessibilityState.busy,
78+
checked: ariaChecked ?? _accessibilityState.checked,
79+
disabled: ariaDisabled ?? _accessibilityState.disabled,
80+
expanded: ariaExpanded ?? _accessibilityState.expanded,
81+
selected: ariaSelected ?? _accessibilityState.selected,
82+
};
83+
} else {
84+
_accessibilityState = {
85+
busy: ariaBusy,
86+
checked: ariaChecked,
87+
disabled: ariaDisabled,
88+
expanded: ariaExpanded,
89+
selected: ariaSelected,
90+
};
91+
}
8092
}
8193

82-
const _disabled =
83-
restProps.disabled != null
84-
? restProps.disabled
85-
: _accessibilityState?.disabled;
86-
87-
const nativeTextAccessibilityState =
88-
_disabled !== _accessibilityState?.disabled
89-
? {..._accessibilityState, disabled: _disabled}
90-
: _accessibilityState;
94+
const _accessibilityStateDisabled = _accessibilityState?.disabled;
95+
const _disabled = restProps.disabled ?? _accessibilityStateDisabled;
9196

9297
const isPressable =
9398
(onPress != null ||
@@ -190,7 +195,6 @@ const Text: React.AbstractComponent<
190195
: processColor(restProps.selectionColor);
191196

192197
let style = restProps.style;
193-
194198
if (__DEV__) {
195199
if (PressabilityDebug.isEnabled() && onPress != null) {
196200
style = [restProps.style, {color: 'magenta'}];
@@ -205,13 +209,6 @@ const Text: React.AbstractComponent<
205209
numberOfLines = 0;
206210
}
207211

208-
const hasTextAncestor = useContext(TextAncestor);
209-
210-
const _accessible = Platform.select({
211-
ios: accessible !== false,
212-
default: accessible,
213-
});
214-
215212
let _selectable = restProps.selectable;
216213

217214
const processedStyle = flattenStyle(style);
@@ -236,41 +233,59 @@ const Text: React.AbstractComponent<
236233
}
237234
}
238235

239-
const _hasOnPressOrOnLongPress =
240-
props.onPress != null || props.onLongPress != null;
236+
const _nativeID = id ?? nativeID;
237+
238+
const hasTextAncestor = useContext(TextAncestor);
239+
if (hasTextAncestor) {
240+
return (
241+
<NativeVirtualText
242+
{...restProps}
243+
{...eventHandlersForText}
244+
accessibilityLabel={_accessibilityLabel}
245+
accessibilityState={_accessibilityState}
246+
isHighlighted={isHighlighted}
247+
isPressable={isPressable}
248+
nativeID={_nativeID}
249+
numberOfLines={numberOfLines}
250+
ref={forwardedRef}
251+
selectable={_selectable}
252+
selectionColor={selectionColor}
253+
style={processedStyle}
254+
/>
255+
);
256+
}
257+
258+
// If the disabled prop and accessibilityState.disabled are out of sync but not both in
259+
// falsy states we need to update the accessibilityState object to use the disabled prop.
260+
if (
261+
_disabled !== _accessibilityStateDisabled &&
262+
((_disabled != null && _disabled !== false) ||
263+
(_accessibilityStateDisabled != null &&
264+
_accessibilityStateDisabled !== false))
265+
) {
266+
_accessibilityState = {..._accessibilityState, disabled: _disabled};
267+
}
268+
269+
const _accessible = Platform.select({
270+
ios: accessible !== false,
271+
android:
272+
accessible == null ? onPress != null || onLongPress != null : accessible,
273+
default: accessible,
274+
});
241275

242-
return hasTextAncestor ? (
243-
<NativeVirtualText
244-
{...restProps}
245-
{...eventHandlersForText}
246-
accessibilityLabel={ariaLabel ?? accessibilityLabel}
247-
accessibilityState={_accessibilityState}
248-
isHighlighted={isHighlighted}
249-
isPressable={isPressable}
250-
nativeID={id ?? nativeID}
251-
numberOfLines={numberOfLines}
252-
ref={forwardedRef}
253-
selectable={_selectable}
254-
selectionColor={selectionColor}
255-
style={processedStyle}
256-
/>
257-
) : (
276+
return (
258277
<TextAncestor.Provider value={true}>
259278
<NativeText
260279
{...restProps}
261280
{...eventHandlersForText}
262-
accessibilityLabel={ariaLabel ?? accessibilityLabel}
263-
accessibilityState={nativeTextAccessibilityState}
264-
accessible={
265-
accessible == null && Platform.OS === 'android'
266-
? _hasOnPressOrOnLongPress
267-
: _accessible
268-
}
281+
accessibilityLabel={_accessibilityLabel}
282+
accessibilityState={_accessibilityState}
283+
accessible={_accessible}
269284
allowFontScaling={allowFontScaling !== false}
270285
disabled={_disabled}
271286
ellipsizeMode={ellipsizeMode ?? 'tail'}
272287
isHighlighted={isHighlighted}
273-
nativeID={id ?? nativeID}
288+
nativeID={_nativeID}
274289
numberOfLines={numberOfLines}
275290
ref={forwardedRef}
276291
selectable={_selectable}

packages/react-native/Libraries/__tests__/__snapshots__/public-api-test.js.snap

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3595,11 +3595,11 @@ export type AccessibilityActionEvent = SyntheticEvent<
35953595
$ReadOnly<{ actionName: string, ... }>,
35963596
>;
35973597
export type AccessibilityState = {
3598-
disabled?: boolean,
3599-
selected?: boolean,
3598+
disabled?: ?boolean,
3599+
selected?: ?boolean,
36003600
checked?: ?boolean | \\"mixed\\",
3601-
busy?: boolean,
3602-
expanded?: boolean,
3601+
busy?: ?boolean,
3602+
expanded?: ?boolean,
36033603
...
36043604
};
36053605
export type AccessibilityValue = $ReadOnly<{|

0 commit comments

Comments
 (0)