Skip to content

Commit 64bfea6

Browse files
jessebeachljharb
authored andcommittedJun 14, 2023
[Fix] isNonInteractiveElement: Upgrade aria-query to 5.3.0 and axobject-query to 3.2.1
1 parent 1271153 commit 64bfea6

9 files changed

+54
-46
lines changed
 

‎__mocks__/genInteractives.js

+10-5
Original file line numberDiff line numberDiff line change
@@ -45,14 +45,13 @@ const interactiveElementsMap = {
4545
'input[type="time"]': [{ prop: 'type', value: 'time' }],
4646
'input[type="url"]': [{ prop: 'type', value: 'url' }],
4747
'input[type="week"]': [{ prop: 'type', value: 'week' }],
48-
link: [{ prop: 'href', value: '#' }],
4948
menuitem: [],
5049
option: [],
5150
select: [],
5251
// Whereas ARIA makes a distinction between cell and gridcell, the AXObject
5352
// treats them both as CellRole and since gridcell is interactive, we consider
5453
// cell interactive as well.
55-
// td: [],
54+
td: [],
5655
th: [],
5756
tr: [],
5857
textarea: [],
@@ -61,34 +60,38 @@ const interactiveElementsMap = {
6160

6261
const nonInteractiveElementsMap: {[string]: Array<{[string]: string}>} = {
6362
abbr: [],
63+
address: [],
6464
aside: [],
6565
article: [],
6666
blockquote: [],
67-
body: [],
6867
br: [],
6968
caption: [],
69+
code: [],
7070
dd: [],
71+
del: [],
7172
details: [],
7273
dfn: [],
7374
dialog: [],
7475
dir: [],
7576
dl: [],
7677
dt: [],
78+
em: [],
7779
fieldset: [],
7880
figcaption: [],
7981
figure: [],
8082
footer: [],
8183
form: [],
82-
frame: [],
8384
h1: [],
8485
h2: [],
8586
h3: [],
8687
h4: [],
8788
h5: [],
8889
h6: [],
8990
hr: [],
91+
html: [],
9092
iframe: [],
9193
img: [],
94+
ins: [],
9295
label: [],
9396
legend: [],
9497
li: [],
@@ -107,9 +110,11 @@ const nonInteractiveElementsMap: {[string]: Array<{[string]: string}>} = {
107110
ruby: [],
108111
'section[aria-label]': [{ prop: 'aria-label' }],
109112
'section[aria-labelledby]': [{ prop: 'aria-labelledby' }],
113+
strong: [],
114+
sub: [],
115+
sup: [],
110116
table: [],
111117
tbody: [],
112-
td: [],
113118
tfoot: [],
114119
thead: [],
115120
time: [],

‎__tests__/src/rules/control-has-associated-label-test.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,6 @@ const alwaysValid = [
156156
{ code: '<section />' },
157157
{ code: '<table />' },
158158
{ code: '<tbody />' },
159-
{ code: '<td />' },
160159
{ code: '<tfoot />' },
161160
{ code: '<thead />' },
162161
{ code: '<time />' },
@@ -261,6 +260,7 @@ const neverValid = [
261260
{ code: '<area href="#" />', errors: [expectedError] },
262261
{ code: '<menuitem />', errors: [expectedError] },
263262
{ code: '<option />', errors: [expectedError] },
263+
{ code: '<td />', errors: [expectedError] },
264264
{ code: '<th />', errors: [expectedError] },
265265
// Interactive Roles
266266
{ code: '<div role="button" />', errors: [expectedError] },

‎__tests__/src/rules/no-interactive-element-to-noninteractive-role-test.js

+1
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,7 @@ const alwaysValid = [
169169
{ code: '<style role="button" />;' },
170170
{ code: '<sub role="button" />;' },
171171
{ code: '<summary role="button" />;' },
172+
{ code: '<summary role="listitem" />;' },
172173
{ code: '<sup role="button" />;' },
173174
{ code: '<th role="button" />;' },
174175
{ code: '<time role="button" />;' },

‎__tests__/src/rules/no-noninteractive-element-interactions-test.js

+12-12
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,6 @@ const alwaysValid = [
7676
{ code: '<tr onClick={() => {}} />;' },
7777
/* HTML elements with neither an interactive or non-interactive valence (static) */
7878
{ code: '<acronym onClick={() => {}} />;' },
79-
{ code: '<address onClick={() => {}} />;' },
8079
{ code: '<applet onClick={() => {}} />;' },
8180
{ code: '<audio onClick={() => {}} />;' },
8281
{ code: '<b onClick={() => {}} />;' },
@@ -86,16 +85,15 @@ const alwaysValid = [
8685
{ code: '<big onClick={() => {}} />;' },
8786
{ code: '<blink onClick={() => {}} />;' },
8887
{ code: '<body onLoad={() => {}} />;' },
88+
{ code: '<body onClick={() => {}} />;' },
8989
{ code: '<canvas onClick={() => {}} />;' },
9090
{ code: '<center onClick={() => {}} />;' },
9191
{ code: '<cite onClick={() => {}} />;' },
92-
{ code: '<code onClick={() => {}} />;' },
9392
{ code: '<col onClick={() => {}} />;' },
9493
{ code: '<colgroup onClick={() => {}} />;' },
9594
{ code: '<content onClick={() => {}} />;' },
9695
{ code: '<data onClick={() => {}} />;' },
9796
{ code: '<datalist onClick={() => {}} />;' },
98-
{ code: '<del onClick={() => {}} />;' },
9997
{ code: '<div />;' },
10098
{ code: '<div className="foo" />;' },
10199
{ code: '<div className="foo" {...props} />;' },
@@ -106,7 +104,6 @@ const alwaysValid = [
106104
{ code: '<div onClick={() => void 0} {...props} />;' },
107105
{ code: '<div onClick={null} />;' },
108106
{ code: '<div onKeyUp={() => void 0} aria-hidden={false} />;' },
109-
{ code: '<em onClick={() => {}} />;' },
110107
{ code: '<embed onClick={() => {}} />;' },
111108
{ code: '<font onClick={() => {}} />;' },
112109
{ code: '<font onSubmit={() => {}} />;' },
@@ -120,11 +117,11 @@ const alwaysValid = [
120117
</form>
121118
`,
122119
},
120+
{ code: '<frame onClick={() => {}} />;' },
123121
{ code: '<frameset onClick={() => {}} />;' },
124122
{ code: '<head onClick={() => {}} />;' },
125123
{ code: '<header onClick={() => {}} />;' },
126124
{ code: '<hgroup onClick={() => {}} />;' },
127-
{ code: '<html onClick={() => {}} />;' },
128125
{ code: '<i onClick={() => {}} />;' },
129126
{ code: '<iframe onLoad={() => {}} />;' },
130127
{
@@ -152,7 +149,6 @@ const alwaysValid = [
152149
/>
153150
`,
154151
},
155-
{ code: '<ins onClick={() => {}} />;' },
156152
{ code: '<kbd onClick={() => {}} />;' },
157153
{ code: '<keygen onClick={() => {}} />;' },
158154
{ code: '<link onClick={() => {}} />;' },
@@ -177,11 +173,9 @@ const alwaysValid = [
177173
{ code: '<spacer onClick={() => {}} />;' },
178174
{ code: '<span onClick={() => {}} />;' },
179175
{ code: '<strike onClick={() => {}} />;' },
180-
{ code: '<strong onClick={() => {}} />;' },
181176
{ code: '<style onClick={() => {}} />;' },
182-
{ code: '<sub onClick={() => {}} />;' },
183177
{ code: '<summary onClick={() => {}} />;' },
184-
{ code: '<sup onClick={() => {}} />;' },
178+
{ code: '<td onClick={() => {}} />;' },
185179
{ code: '<th onClick={() => {}} />;' },
186180
{ code: '<title onClick={() => {}} />;' },
187181
{ code: '<track onClick={() => {}} />;' },
@@ -285,33 +279,37 @@ const alwaysValid = [
285279
const neverValid = [
286280
/* HTML elements with an inherent, non-interactive role */
287281
{ code: '<main onClick={() => void 0} />;', errors: [expectedError] },
282+
{ code: '<address onClick={() => {}} />;', errors: [expectedError] },
288283
{ code: '<article onClick={() => {}} />;', errors: [expectedError] },
289284
{ code: '<aside onClick={() => {}} />;', errors: [expectedError] },
290285
{ code: '<blockquote onClick={() => {}} />;', errors: [expectedError] },
291-
{ code: '<body onClick={() => {}} />;', errors: [expectedError] },
292286
{ code: '<br onClick={() => {}} />;', errors: [expectedError] },
293287
{ code: '<caption onClick={() => {}} />;', errors: [expectedError] },
288+
{ code: '<code onClick={() => {}} />;', errors: [expectedError] },
294289
{ code: '<dd onClick={() => {}} />;', errors: [expectedError] },
290+
{ code: '<del onClick={() => {}} />;', errors: [expectedError] },
295291
{ code: '<details onClick={() => {}} />;', errors: [expectedError] },
296292
{ code: '<dfn onClick={() => {}} />;', errors: [expectedError] },
297293
{ code: '<dl onClick={() => {}} />;', errors: [expectedError] },
298294
{ code: '<dir onClick={() => {}} />;', errors: [expectedError] },
299295
{ code: '<dt onClick={() => {}} />;', errors: [expectedError] },
296+
{ code: '<em onClick={() => {}} />;', errors: [expectedError] },
300297
{ code: '<fieldset onClick={() => {}} />;', errors: [expectedError] },
301298
{ code: '<figcaption onClick={() => {}} />;', errors: [expectedError] },
302299
{ code: '<figure onClick={() => {}} />;', errors: [expectedError] },
303300
{ code: '<footer onClick={() => {}} />;', errors: [expectedError] },
304301
{ code: '<form onClick={() => {}} />;', errors: [expectedError] },
305-
{ code: '<frame onClick={() => {}} />;', errors: [expectedError] },
306302
{ code: '<h1 onClick={() => {}} />;', errors: [expectedError] },
307303
{ code: '<h2 onClick={() => {}} />;', errors: [expectedError] },
308304
{ code: '<h3 onClick={() => {}} />;', errors: [expectedError] },
309305
{ code: '<h4 onClick={() => {}} />;', errors: [expectedError] },
310306
{ code: '<h5 onClick={() => {}} />;', errors: [expectedError] },
311307
{ code: '<h6 onClick={() => {}} />;', errors: [expectedError] },
312308
{ code: '<hr onClick={() => {}} />;', errors: [expectedError] },
309+
{ code: '<html onClick={() => {}} />;', errors: [expectedError] },
313310
{ code: '<iframe onClick={() => {}} />;', errors: [expectedError] },
314311
{ code: '<img onClick={() => {}} />;', errors: [expectedError] },
312+
{ code: '<ins onClick={() => {}} />;', errors: [expectedError] },
315313
{ code: '<label onClick={() => {}} />;', errors: [expectedError] },
316314
{ code: '<legend onClick={() => {}} />;', errors: [expectedError] },
317315
{ code: '<li onClick={() => {}} />;', errors: [expectedError] },
@@ -329,9 +327,11 @@ const neverValid = [
329327
{ code: '<ruby onClick={() => {}} />;', errors: [expectedError] },
330328
{ code: '<section onClick={() => {}} aria-label="Aardvark" />;', errors: [expectedError] },
331329
{ code: '<section onClick={() => {}} aria-labelledby="js_1" />;', errors: [expectedError] },
330+
{ code: '<strong onClick={() => {}} />;', errors: [expectedError] },
331+
{ code: '<sub onClick={() => {}} />;', errors: [expectedError] },
332+
{ code: '<sup onClick={() => {}} />;', errors: [expectedError] },
332333
{ code: '<table onClick={() => {}} />;', errors: [expectedError] },
333334
{ code: '<tbody onClick={() => {}} />;', errors: [expectedError] },
334-
{ code: '<td onClick={() => {}} />;', errors: [expectedError] },
335335
{ code: '<tfoot onClick={() => {}} />;', errors: [expectedError] },
336336
{ code: '<thead onClick={() => {}} />;', errors: [expectedError] },
337337
{ code: '<time onClick={() => {}} />;', errors: [expectedError] },

‎__tests__/src/rules/no-noninteractive-element-to-interactive-role-test.js

+12-14
Original file line numberDiff line numberDiff line change
@@ -153,7 +153,6 @@ const alwaysValid = [
153153
{ code: '<tr role="listitem" />;' },
154154
/* HTML elements with neither an interactive or non-interactive valence (static) */
155155
{ code: '<acronym role="button" />;' },
156-
{ code: '<address role="button" />;' },
157156
{ code: '<applet role="button" />;' },
158157
{ code: '<audio role="button" />;' },
159158
{ code: '<b role="button" />;' },
@@ -165,13 +164,11 @@ const alwaysValid = [
165164
{ code: '<canvas role="button" />;' },
166165
{ code: '<center role="button" />;' },
167166
{ code: '<cite role="button" />;' },
168-
{ code: '<code role="button" />;' },
169167
{ code: '<col role="button" />;' },
170168
{ code: '<colgroup role="button" />;' },
171169
{ code: '<content role="button" />;' },
172170
{ code: '<data role="button" />;' },
173171
{ code: '<datalist role="button" />;' },
174-
{ code: '<del role="button" />;' },
175172
{ code: '<div role="button" />;' },
176173
{ code: '<div className="foo" role="button" />;' },
177174
{ code: '<div className="foo" {...props} role="button" />;' },
@@ -181,16 +178,13 @@ const alwaysValid = [
181178
{ code: '<div role={undefined} role="button" />;' },
182179
{ code: '<div {...props} role="button" />;' },
183180
{ code: '<div onKeyUp={() => void 0} aria-hidden={false} role="button" />;' },
184-
{ code: '<em role="button" />;' },
185181
{ code: '<embed role="button" />;' },
186182
{ code: '<font role="button" />;' },
187183
{ code: '<frameset role="button" />;' },
188184
{ code: '<head role="button" />;' },
189185
{ code: '<header role="button" />;' },
190186
{ code: '<hgroup role="button" />;' },
191-
{ code: '<html role="button" />;' },
192187
{ code: '<i role="button" />;' },
193-
{ code: '<ins role="button" />;' },
194188
{ code: '<kbd role="button" />;' },
195189
{ code: '<keygen role="button" />;' },
196190
{ code: '<link role="button" />;' },
@@ -213,11 +207,10 @@ const alwaysValid = [
213207
{ code: '<spacer role="button" />;' },
214208
{ code: '<span role="button" />;' },
215209
{ code: '<strike role="button" />;' },
216-
{ code: '<strong role="button" />;' },
217210
{ code: '<style role="button" />;' },
218-
{ code: '<sub role="button" />;' },
219211
{ code: '<summary role="button" />;' },
220-
{ code: '<sup role="button" />;' },
212+
{ code: '<td role="button" />;' },
213+
{ code: '<td role="menuitem" />;' },
221214
{ code: '<th role="button" />;' },
222215
{ code: '<title role="button" />;' },
223216
{ code: '<track role="button" />;' },
@@ -285,6 +278,7 @@ const alwaysValid = [
285278
{ code: '<area role="listitem" />;' },
286279
{ code: '<article role="listitem" />;' },
287280
{ code: '<article role="listitem" />;' },
281+
{ code: '<body role="button" />;' },
288282
{ code: '<dd role="listitem" />;' },
289283
{ code: '<dfn role="listitem" />;' },
290284
{ code: '<dt role="listitem" />;' },
@@ -358,34 +352,38 @@ const neverValid = [
358352
/* HTML elements with an inherent non-interactive role, assigned an
359353
* interactive role. */
360354
{ code: '<main role="button" />;', errors: [expectedError] },
355+
{ code: '<address role="button" />;', errors: [expectedError] },
361356
{ code: '<article role="button" />;', errors: [expectedError] },
362357
{ code: '<article role="button" />;', errors: [expectedError] },
363358
{ code: '<aside role="button" />;', errors: [expectedError] },
364359
{ code: '<blockquote role="button" />;', errors: [expectedError] },
365-
{ code: '<body role="button" />;', errors: [expectedError] },
366360
{ code: '<br role="button" />;', errors: [expectedError] },
367361
{ code: '<caption role="button" />;', errors: [expectedError] },
362+
{ code: '<code role="button" />;', errors: [expectedError] },
368363
{ code: '<dd role="button" />;', errors: [expectedError] },
364+
{ code: '<del role="button" />;', errors: [expectedError] },
369365
{ code: '<details role="button" />;', errors: [expectedError] },
370366
{ code: '<dir role="button" />;', errors: [expectedError] },
371367
{ code: '<dl role="button" />;', errors: [expectedError] },
372368
{ code: '<dfn role="button" />;', errors: [expectedError] },
373369
{ code: '<dt role="button" />;', errors: [expectedError] },
370+
{ code: '<em role="button" />;', errors: [expectedError] },
374371
{ code: '<fieldset role="button" />;', errors: [expectedError] },
375372
{ code: '<figcaption role="button" />;', errors: [expectedError] },
376373
{ code: '<figure role="button" />;', errors: [expectedError] },
377374
{ code: '<footer role="button" />;', errors: [expectedError] },
378375
{ code: '<form role="button" />;', errors: [expectedError] },
379-
{ code: '<frame role="button" />;', errors: [expectedError] },
380376
{ code: '<h1 role="button" />;', errors: [expectedError] },
381377
{ code: '<h2 role="button" />;', errors: [expectedError] },
382378
{ code: '<h3 role="button" />;', errors: [expectedError] },
383379
{ code: '<h4 role="button" />;', errors: [expectedError] },
384380
{ code: '<h5 role="button" />;', errors: [expectedError] },
385381
{ code: '<h6 role="button" />;', errors: [expectedError] },
386382
{ code: '<hr role="button" />;', errors: [expectedError] },
383+
{ code: '<html role="button" />;', errors: [expectedError] },
387384
{ code: '<iframe role="button" />;', errors: [expectedError] },
388385
{ code: '<img role="button" />;', errors: [expectedError] },
386+
{ code: '<ins role="button" />;', errors: [expectedError] },
389387
{ code: '<label role="button" />;', errors: [expectedError] },
390388
{ code: '<legend role="button" />;', errors: [expectedError] },
391389
{ code: '<li role="button" />;', errors: [expectedError] },
@@ -400,9 +398,11 @@ const neverValid = [
400398
{ code: '<pre role="button" />;', errors: [expectedError] },
401399
{ code: '<progress role="button" />;', errors: [expectedError] },
402400
{ code: '<ruby role="button" />;', errors: [expectedError] },
401+
{ code: '<strong role="button" />;', errors: [expectedError] },
402+
{ code: '<sub role="button" />;', errors: [expectedError] },
403+
{ code: '<sup role="button" />;', errors: [expectedError] },
403404
{ code: '<table role="button" />;', errors: [expectedError] },
404405
{ code: '<tbody role="button" />;', errors: [expectedError] },
405-
{ code: '<td role="button" />;', errors: [expectedError] },
406406
{ code: '<tfoot role="button" />;', errors: [expectedError] },
407407
{ code: '<thead role="button" />;', errors: [expectedError] },
408408
{ code: '<time role="button" />;', errors: [expectedError] },
@@ -418,7 +418,6 @@ const neverValid = [
418418
{ code: '<fieldset role="menuitem" />;', errors: [expectedError] },
419419
{ code: '<figure role="menuitem" />;', errors: [expectedError] },
420420
{ code: '<form role="menuitem" />;', errors: [expectedError] },
421-
{ code: '<frame role="menuitem" />;', errors: [expectedError] },
422421
{ code: '<h1 role="menuitem" />;', errors: [expectedError] },
423422
{ code: '<h2 role="menuitem" />;', errors: [expectedError] },
424423
{ code: '<h3 role="menuitem" />;', errors: [expectedError] },
@@ -433,7 +432,6 @@ const neverValid = [
433432
{ code: '<section role="button" aria-label="Aardvark" />;', errors: [expectedError] },
434433
{ code: '<table role="menuitem" />;', errors: [expectedError] },
435434
{ code: '<tbody role="menuitem" />;', errors: [expectedError] },
436-
{ code: '<td role="menuitem" />;', errors: [expectedError] },
437435
{ code: '<tfoot role="menuitem" />;', errors: [expectedError] },
438436
{ code: '<thead role="menuitem" />;', errors: [expectedError] },
439437
/* Custom components */

‎__tests__/src/rules/no-static-element-interactions-test.js

+12-12
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,6 @@ const alwaysValid = [
8484
{ code: '<audio onClick={() => {}} />;' },
8585
{ code: '<form onClick={() => {}} />;' },
8686
{ code: '<form onSubmit={() => {}} />;' },
87-
{ code: '<link onClick={() => {}} href="#" />;' },
8887
/* HTML elements attributed with an interactive role */
8988
{ code: '<div role="button" onClick={() => {}} />;' },
9089
{ code: '<div role="checkbox" onClick={() => {}} />;' },
@@ -110,35 +109,39 @@ const alwaysValid = [
110109
{ code: '<div role="presentation" onClick={() => {}} />;' },
111110
{ code: '<div role="presentation" onKeyDown={() => {}} />;' },
112111
/* HTML elements with an inherent, non-interactive role */
112+
{ code: '<address onClick={() => {}} />;' },
113113
{ code: '<article onClick={() => {}} />;' },
114114
{ code: '<article onDblClick={() => void 0} />;' },
115115
{ code: '<aside onClick={() => {}} />;' },
116116
{ code: '<blockquote onClick={() => {}} />;' },
117-
{ code: '<body onClick={() => {}} />;' },
118117
{ code: '<br onClick={() => {}} />;' },
119118
{ code: '<canvas onClick={() => {}} />;' },
120119
{ code: '<caption onClick={() => {}} />;' },
120+
{ code: '<code onClick={() => {}} />;' },
121121
{ code: '<details onClick={() => {}} />;' },
122122
{ code: '<dd onClick={() => {}} />;' },
123+
{ code: '<del onClick={() => {}} />;' },
123124
{ code: '<dfn onClick={() => {}} />;' },
124125
{ code: '<dir onClick={() => {}} />;' },
125126
{ code: '<dl onClick={() => {}} />;' },
126127
{ code: '<dt onClick={() => {}} />;' },
128+
{ code: '<em onClick={() => {}} />;' },
127129
{ code: '<embed onClick={() => {}} />;' },
128130
{ code: '<fieldset onClick={() => {}} />;' },
129131
{ code: '<figcaption onClick={() => {}} />;' },
130132
{ code: '<figure onClick={() => {}} />;' },
131133
{ code: '<footer onClick={() => {}} />;' },
132-
{ code: '<frame onClick={() => {}} />;' },
133134
{ code: '<h1 onClick={() => {}} />;' },
134135
{ code: '<h2 onClick={() => {}} />;' },
135136
{ code: '<h3 onClick={() => {}} />;' },
136137
{ code: '<h4 onClick={() => {}} />;' },
137138
{ code: '<h5 onClick={() => {}} />;' },
138139
{ code: '<h6 onClick={() => {}} />;' },
139140
{ code: '<hr onClick={() => {}} />;' },
141+
{ code: '<html onClick={() => {}} />;' },
140142
{ code: '<iframe onClick={() => {}} />;' },
141143
{ code: '<img onClick={() => {}} />;' },
144+
{ code: '<ins onClick={() => {}} />;' },
142145
{ code: '<label onClick={() => {}} />;' },
143146
{ code: '<legend onClick={() => {}} />;' },
144147
{ code: '<li onClick={() => {}} />;' },
@@ -157,6 +160,9 @@ const alwaysValid = [
157160
{ code: '<ruby onClick={() => {}} />;' },
158161
{ code: '<section onClick={() => {}} aria-label="Aa" />;' },
159162
{ code: '<section onClick={() => {}} aria-labelledby="js_1" />;' },
163+
{ code: '<strong onClick={() => {}} />;' },
164+
{ code: '<sub onClick={() => {}} />;' },
165+
{ code: '<sup onClick={() => {}} />;' },
160166
{ code: '<table onClick={() => {}} />;' },
161167
{ code: '<tbody onClick={() => {}} />;' },
162168
{ code: '<tfoot onClick={() => {}} />;' },
@@ -287,34 +293,31 @@ const neverValid = [
287293
{ code: '<a tabIndex="0" onClick={() => void 0} />', errors: [expectedError] },
288294
{ code: '<area onClick={() => {}} />;', errors: [expectedError] },
289295
{ code: '<acronym onClick={() => {}} />;', errors: [expectedError] },
290-
{ code: '<address onClick={() => {}} />;', errors: [expectedError] },
291296
{ code: '<applet onClick={() => {}} />;', errors: [expectedError] },
292297
{ code: '<b onClick={() => {}} />;', errors: [expectedError] },
293298
{ code: '<base onClick={() => {}} />;', errors: [expectedError] },
294299
{ code: '<bdi onClick={() => {}} />;', errors: [expectedError] },
295300
{ code: '<bdo onClick={() => {}} />;', errors: [expectedError] },
296301
{ code: '<big onClick={() => {}} />;', errors: [expectedError] },
297302
{ code: '<blink onClick={() => {}} />;', errors: [expectedError] },
303+
{ code: '<body onClick={() => {}} />;', errors: [expectedError] },
298304
{ code: '<center onClick={() => {}} />;', errors: [expectedError] },
299305
{ code: '<cite onClick={() => {}} />;', errors: [expectedError] },
300-
{ code: '<code onClick={() => {}} />;', errors: [expectedError] },
301306
{ code: '<col onClick={() => {}} />;', errors: [expectedError] },
302307
{ code: '<colgroup onClick={() => {}} />;', errors: [expectedError] },
303308
{ code: '<content onClick={() => {}} />;', errors: [expectedError] },
304309
{ code: '<data onClick={() => {}} />;', errors: [expectedError] },
305-
{ code: '<del onClick={() => {}} />;', errors: [expectedError] },
306310
{ code: '<div onClick={() => {}} />;', errors: [expectedError] },
307-
{ code: '<em onClick={() => {}} />;', errors: [expectedError] },
308311
{ code: '<font onClick={() => {}} />;', errors: [expectedError] },
312+
{ code: '<frame onClick={() => {}} />;', errors: [expectedError] },
309313
{ code: '<frameset onClick={() => {}} />;', errors: [expectedError] },
310314
{ code: '<head onClick={() => {}} />;', errors: [expectedError] },
311315
{ code: '<header onClick={() => {}} />;', errors: [expectedError] },
312316
{ code: '<hgroup onClick={() => {}} />;', errors: [expectedError] },
313-
{ code: '<html onClick={() => {}} />;', errors: [expectedError] },
314317
{ code: '<i onClick={() => {}} />;', errors: [expectedError] },
315-
{ code: '<ins onClick={() => {}} />;', errors: [expectedError] },
316318
{ code: '<kbd onClick={() => {}} />;', errors: [expectedError] },
317319
{ code: '<keygen onClick={() => {}} />;', errors: [expectedError] },
320+
{ code: '<link onClick={() => {}} href="#" />;', errors: [expectedError] },
318321
{ code: '<map onClick={() => {}} />;', errors: [expectedError] },
319322
{ code: '<meta onClick={() => {}} />;', errors: [expectedError] },
320323
{ code: '<noembed onClick={() => {}} />;', errors: [expectedError] },
@@ -335,10 +338,7 @@ const neverValid = [
335338
{ code: '<spacer onClick={() => {}} />;', errors: [expectedError] },
336339
{ code: '<span onClick={() => {}} />;', errors: [expectedError] },
337340
{ code: '<strike onClick={() => {}} />;', errors: [expectedError] },
338-
{ code: '<strong onClick={() => {}} />;', errors: [expectedError] },
339341
{ code: '<style onClick={() => {}} />;', errors: [expectedError] },
340-
{ code: '<sub onClick={() => {}} />;', errors: [expectedError] },
341-
{ code: '<sup onClick={() => {}} />;', errors: [expectedError] },
342342
{ code: '<summary onClick={() => {}} />;', errors: [expectedError] },
343343
{ code: '<title onClick={() => {}} />;', errors: [expectedError] },
344344
{ code: '<track onClick={() => {}} />;', errors: [expectedError] },

‎__tests__/src/rules/prefer-tag-over-role-test.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ ruleTester.run('element-role', rule, {
3838
errors: [
3939
expectedError(
4040
'link',
41-
'<a href=...>, <area href=...>, or <link href=...>',
41+
'<a href=...>, or <area href=...>',
4242
),
4343
],
4444
},

‎package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@
7575
"license": "MIT",
7676
"dependencies": {
7777
"@babel/runtime": "^7.22.10",
78-
"aria-query": "=5.1.3",
78+
"aria-query": "^5.3.0",
7979
"array-includes": "^3.1.6",
8080
"array.prototype.flatmap": "^1.3.1",
8181
"ast-types-flow": "^0.0.7",

‎src/util/isNonInteractiveElement.js

+4
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,10 @@ const nonInteractiveRoles = new Set(roleKeys
3131
// This role is meant to have no semantic value.
3232
// @see https://www.w3.org/TR/wai-aria-1.2/#generic
3333
&& name !== 'generic'
34+
// Whereas ARIA makes a distinction between cell and gridcell, the AXObject
35+
// treats them both as CellRole and since gridcell is interactive, we consider
36+
// cell interactive as well.
37+
&& name !== 'cell'
3438
&& !role.superClass.some((classes) => includes(classes, 'widget'))
3539
);
3640
}).concat(

0 commit comments

Comments
 (0)
Please sign in to comment.