diff --git a/lib/checks/aria/aria-required-attr-evaluate.js b/lib/checks/aria/aria-required-attr-evaluate.js index f10642c4c4..f623ba4be7 100644 --- a/lib/checks/aria/aria-required-attr-evaluate.js +++ b/lib/checks/aria/aria-required-attr-evaluate.js @@ -54,6 +54,11 @@ export default function ariaRequiredAttrEvaluate( ) { return true; } + // Non-normative exception for things like media player seek slider. + // Tested to work in various screen readers. + if (role === 'slider' && virtualNode.attr('aria-valuetext')?.trim()) { + return true; + } const elmSpec = getElementSpec(virtualNode); const missingAttrs = requiredAttrs.filter( diff --git a/test/checks/aria/aria-required-attr.js b/test/checks/aria/aria-required-attr.js index a18a96e42e..4aa7d3a1bb 100644 --- a/test/checks/aria/aria-required-attr.js +++ b/test/checks/aria/aria-required-attr.js @@ -49,6 +49,13 @@ describe('aria-required-attr', () => { assert.isTrue(requiredAttrCheck.apply(checkContext, params)); }); + it('passes aria-valuenow if element has aria-valuetext', () => { + const params = checkSetup( + '
' + ); + assert.isTrue(requiredAttrCheck.apply(checkContext, params)); + }); + it('passes aria-checkbox if element has checked property', () => { const params = checkSetup( '' diff --git a/test/integration/rules/aria-required-attr/required-attr.html b/test/integration/rules/aria-required-attr/required-attr.html index 79ac4b5f17..9fcd294d38 100644 --- a/test/integration/rules/aria-required-attr/required-attr.html +++ b/test/integration/rules/aria-required-attr/required-attr.html @@ -52,6 +52,13 @@
fail
+
+ ok +
fail
fail
diff --git a/test/integration/rules/aria-required-attr/required-attr.json b/test/integration/rules/aria-required-attr/required-attr.json index 8701edf2b6..0dcc6f63e4 100644 --- a/test/integration/rules/aria-required-attr/required-attr.json +++ b/test/integration/rules/aria-required-attr/required-attr.json @@ -23,6 +23,7 @@ ["#pass10"], ["#pass11"], ["#pass12"], - ["#pass13"] + ["#pass13"], + ["#pass14-aria-valuetext-slider"] ] }