Skip to content

Commit a50e6fb

Browse files
madhav23bansalfacebook-github-bot
authored andcommitted
Feat/role to accessibility role mapping (facebook#34538)
Summary: This adds role alias for accessibilityRole, it unifies role and accessibilityRole as requested on facebook#34424 ## Changelog [General][Added] - Added role alias for accessibilityRole. Pull Request resolved: facebook#34538 Test Plan: ```js <View role="slider" style={[ { marginTop: 5, borderWidth: 1, borderRadius: 5, padding: 5, }, this.state.showBorder ? { borderStyle: 'dotted', } : null, ]}> <Text style={{fontSize: 11}}>Dotted border style</Text> </View> ``` Reviewed By: cipolleschi Differential Revision: D39169722 Pulled By: jacdebug fbshipit-source-id: cbcbda5ff900c18509b9f3c88e145a3f8700c78d
1 parent 9c05f42 commit a50e6fb

File tree

3 files changed

+154
-1
lines changed

3 files changed

+154
-1
lines changed

Libraries/Components/View/View.js

Lines changed: 81 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,15 +29,95 @@ const View: React.AbstractComponent<
2929
React.ElementRef<typeof ViewNativeComponent>,
3030
> = React.forwardRef(
3131
(
32-
{tabIndex, focusable, style, pointerEvents, ...otherProps}: ViewProps,
32+
{
33+
tabIndex,
34+
focusable,
35+
role,
36+
accessibilityRole,
37+
pointerEvents,
38+
style,
39+
...otherProps
40+
}: ViewProps,
3341
forwardedRef,
3442
) => {
43+
// Map role values to AccessibilityRole values
44+
const roleToAccessibilityRoleMapping = {
45+
alert: 'alert',
46+
alertdialog: undefined,
47+
application: undefined,
48+
article: undefined,
49+
banner: undefined,
50+
button: 'button',
51+
cell: undefined,
52+
checkbox: 'checkbox',
53+
columnheader: undefined,
54+
combobox: 'combobox',
55+
complementary: undefined,
56+
contentinfo: undefined,
57+
definition: undefined,
58+
dialog: undefined,
59+
directory: undefined,
60+
document: undefined,
61+
feed: undefined,
62+
figure: undefined,
63+
form: undefined,
64+
grid: 'grid',
65+
group: undefined,
66+
heading: 'header',
67+
img: 'image',
68+
link: 'link',
69+
list: 'list',
70+
listitem: undefined,
71+
log: undefined,
72+
main: undefined,
73+
marquee: undefined,
74+
math: undefined,
75+
menu: 'menu',
76+
menubar: 'menubar',
77+
menuitem: 'menuitem',
78+
meter: undefined,
79+
navigation: undefined,
80+
none: 'none',
81+
note: undefined,
82+
presentation: 'none',
83+
progressbar: 'progressbar',
84+
radio: 'radio',
85+
radiogroup: 'radiogroup',
86+
region: undefined,
87+
row: undefined,
88+
rowgroup: undefined,
89+
rowheader: undefined,
90+
scrollbar: 'scrollbar',
91+
searchbox: 'search',
92+
separator: undefined,
93+
slider: 'adjustable',
94+
spinbutton: 'spinbutton',
95+
status: undefined,
96+
summary: 'summary',
97+
switch: 'switch',
98+
tab: 'tab',
99+
table: undefined,
100+
tablist: 'tablist',
101+
tabpanel: undefined,
102+
term: undefined,
103+
timer: 'timer',
104+
toolbar: 'toolbar',
105+
tooltip: undefined,
106+
tree: undefined,
107+
treegrid: undefined,
108+
treeitem: undefined,
109+
};
110+
35111
const flattendStyle = flattenStyle(style);
36112
const newPointerEvents = pointerEvents || flattendStyle?.pointerEvents;
113+
37114
return (
38115
<TextAncestor.Provider value={false}>
39116
<ViewNativeComponent
40117
focusable={tabIndex !== undefined ? !tabIndex : focusable}
118+
accessibilityRole={
119+
role ? roleToAccessibilityRoleMapping[role] : accessibilityRole
120+
}
41121
{...otherProps}
42122
style={style}
43123
pointerEvents={newPointerEvents}

Libraries/Components/View/ViewAccessibility.js

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,73 @@ export type AccessibilityRole =
4646
| 'toolbar'
4747
| 'grid';
4848

49+
// Role types for web
50+
export type Role =
51+
| 'alert'
52+
| 'alertdialog'
53+
| 'application'
54+
| 'article'
55+
| 'banner'
56+
| 'button'
57+
| 'cell'
58+
| 'checkbox'
59+
| 'columnheader'
60+
| 'combobox'
61+
| 'complementary'
62+
| 'contentinfo'
63+
| 'definition'
64+
| 'dialog'
65+
| 'directory'
66+
| 'document'
67+
| 'feed'
68+
| 'figure'
69+
| 'form'
70+
| 'grid'
71+
| 'group'
72+
| 'heading'
73+
| 'img'
74+
| 'link'
75+
| 'list'
76+
| 'listitem'
77+
| 'log'
78+
| 'main'
79+
| 'marquee'
80+
| 'math'
81+
| 'menu'
82+
| 'menubar'
83+
| 'menuitem'
84+
| 'meter'
85+
| 'navigation'
86+
| 'none'
87+
| 'note'
88+
| 'presentation'
89+
| 'progressbar'
90+
| 'radio'
91+
| 'radiogroup'
92+
| 'region'
93+
| 'row'
94+
| 'rowgroup'
95+
| 'rowheader'
96+
| 'scrollbar'
97+
| 'searchbox'
98+
| 'separator'
99+
| 'slider'
100+
| 'spinbutton'
101+
| 'status'
102+
| 'summary'
103+
| 'switch'
104+
| 'tab'
105+
| 'table'
106+
| 'tablist'
107+
| 'tabpanel'
108+
| 'term'
109+
| 'timer'
110+
| 'toolbar'
111+
| 'tooltip'
112+
| 'tree'
113+
| 'treegrid'
114+
| 'treeitem';
115+
49116
// the info associated with an accessibility action
50117
export type AccessibilityActionInfo = $ReadOnly<{
51118
name: string,

Libraries/Components/View/ViewPropTypes.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import type {EdgeInsetsOrSizeProp} from '../../StyleSheet/EdgeInsetsPropType';
2323
import type {Node} from 'react';
2424
import type {ViewStyleProp} from '../../StyleSheet/StyleSheet';
2525
import type {
26+
Role,
2627
AccessibilityRole,
2728
AccessibilityState,
2829
AccessibilityValue,
@@ -466,6 +467,11 @@ export type ViewProps = $ReadOnly<{|
466467
*/
467468
accessibilityRole?: ?AccessibilityRole,
468469

470+
/**
471+
* Alias for accessibilityRole
472+
*/
473+
role?: ?Role,
474+
469475
/**
470476
* Indicates to accessibility services that UI Component is in a specific State.
471477
*/

0 commit comments

Comments
 (0)