Skip to content

Commit 563e4e9

Browse files
strakerWilcoFiers
andauthored
feat(required-attr): require aria-checked for checkbox-like and radio-like roles (#3785)
Co-authored-by: Wilco Fiers <WilcoFiers@users.noreply.github.com>
1 parent d1cbf6f commit 563e4e9

3 files changed

Lines changed: 13 additions & 30 deletions

File tree

lib/standards/aria-roles.js

Lines changed: 8 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -79,13 +79,10 @@ const ariaRoles = {
7979
},
8080
checkbox: {
8181
type: 'widget',
82-
// Note: since the checkbox role has an implicit
83-
// aria-checked value it is not required to be added by
84-
// the user
85-
//
8682
// Note: aria-required is not in the 1.1 spec but is
8783
// consistently supported in ATs and was added in 1.2
88-
allowedAttrs: ['aria-checked', 'aria-readonly', 'aria-required'],
84+
requiredAttrs: ['aria-checked'],
85+
allowedAttrs: ['aria-readonly', 'aria-required'],
8986
superclassRole: ['input'],
9087
accessibleNameRequired: true,
9188
nameFromContent: true,
@@ -370,12 +367,8 @@ const ariaRoles = {
370367
menuitemcheckbox: {
371368
type: 'widget',
372369
requiredContext: ['menu', 'menubar', 'group'],
373-
allowedAttrs: [
374-
'aria-checked',
375-
'aria-posinset',
376-
'aria-readonly',
377-
'aria-setsize'
378-
],
370+
requiredAttrs: ['aria-checked'],
371+
allowedAttrs: ['aria-posinset', 'aria-readonly', 'aria-setsize'],
379372
superclassRole: ['checkbox', 'menuitem'],
380373
accessibleNameRequired: true,
381374
nameFromContent: true,
@@ -384,12 +377,8 @@ const ariaRoles = {
384377
menuitemradio: {
385378
type: 'widget',
386379
requiredContext: ['menu', 'menubar', 'group'],
387-
allowedAttrs: [
388-
'aria-checked',
389-
'aria-posinset',
390-
'aria-readonly',
391-
'aria-setsize'
392-
],
380+
requiredAttrs: ['aria-checked'],
381+
allowedAttrs: ['aria-posinset', 'aria-readonly', 'aria-setsize'],
393382
superclassRole: ['menuitemcheckbox', 'radio'],
394383
accessibleNameRequired: true,
395384
nameFromContent: true,
@@ -465,18 +454,10 @@ const ariaRoles = {
465454
},
466455
radio: {
467456
type: 'widget',
468-
// Note: since the radio role has an implicit
469-
// aria-check value it is not required to be added by
470-
// the user
471-
//
472457
// Note: aria-required is not in the 1.1 or 1.2 specs but is
473458
// consistently supported in ATs on the individual radio element
474-
allowedAttrs: [
475-
'aria-checked',
476-
'aria-posinset',
477-
'aria-setsize',
478-
'aria-required'
479-
],
459+
requiredAttrs: ['aria-checked'],
460+
allowedAttrs: ['aria-posinset', 'aria-setsize', 'aria-required'],
480461
superclassRole: ['input'],
481462
accessibleNameRequired: true,
482463
nameFromContent: true,

test/integration/rules/aria-required-attr/required-attr.html

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -44,8 +44,8 @@
4444
>
4545
ok
4646
</div>
47-
<span role="radio" id="pass6">I am BLUE!</span>
48-
<span role="radio" id="pass7" aria-checked="false">I am RED!</span>
47+
<span role="radio" id="pass6" aria-checked="false">I am RED!</span>
48+
<span role="radio" id="pass7" aria-checked="true">I am GREEN!</span>
4949
<span role="radio" id="pass8" aria-checked="true">I am GREEN!</span>
5050
<input type="number" role="spinbutton" id="pass9" value="10" />
5151
<input type="number" role="spinbutton" id="pass10" />
@@ -57,4 +57,5 @@
5757
<div role="slider" id="violation2">fail</div>
5858
<div role="heading" id="violation3">fail</div>
5959
<div role="combobox" id="violation4">fail</div>
60-
<div role="separator" id="violation5" tabindex="0"></div>
60+
<span role="radio" id="violation5">I am BLUE!</span>
61+
<div role="separator" id="violation6" tabindex="0"></div>

test/integration/rules/aria-required-attr/required-attr.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
["#violation3"],
88
["#violation4"],
99
["#violation5"],
10+
["#violation6"],
1011
["#comboboxWithOwns"]
1112
],
1213
"passes": [

0 commit comments

Comments
 (0)