From 9e94625b225a60cab529f45a3e5fc4397e8e27ee Mon Sep 17 00:00:00 2001 From: Steven Lambert <2433219+straker@users.noreply.github.com> Date: Wed, 10 Jul 2024 10:39:40 -0600 Subject: [PATCH 1/3] fix(aria-allowed-attr): allow aria-multiline=false for element with contenteditable --- lib/checks/aria/aria-allowed-attr-evaluate.js | 20 ++++++++-- test/checks/aria/aria-allowed-attr.js | 37 +++++++++++++++++++ .../rules/aria-allowed-attr/failures.html | 3 ++ .../rules/aria-allowed-attr/failures.json | 10 ++++- .../rules/aria-allowed-attr/passes.html | 1 + .../rules/aria-allowed-attr/passes.json | 3 +- 6 files changed, 69 insertions(+), 5 deletions(-) diff --git a/lib/checks/aria/aria-allowed-attr-evaluate.js b/lib/checks/aria/aria-allowed-attr-evaluate.js index ab1002eb37..59d09e7e6e 100644 --- a/lib/checks/aria/aria-allowed-attr-evaluate.js +++ b/lib/checks/aria/aria-allowed-attr-evaluate.js @@ -42,7 +42,7 @@ export default function ariaAllowedAttrEvaluate(node, options, virtualNode) { if ( validateAttr(attrName) && !allowed.includes(attrName) && - !ignoredAttrs(attrName, virtualNode.attr(attrName)) + !ignoredAttrs(attrName, virtualNode.attr(attrName), virtualNode) ) { invalid.push(attrName); } @@ -62,8 +62,22 @@ export default function ariaAllowedAttrEvaluate(node, options, virtualNode) { return false; } -function ignoredAttrs(attrName, attrValue) { +function ignoredAttrs(attrName, attrValue, vNode) { // allow aria-required=false as screen readers consistently ignore it // @see https://github.com/dequelabs/axe-core/issues/3756 - return attrName === 'aria-required' && attrValue === 'false'; + if (attrName === 'aria-required' && attrValue === 'false') { + return true; + } + + // allow aria-multiline=false when contenteditable is set + // @see https://github.com/dequelabs/axe-core/issues/4463 + if ( + attrName === 'aria-multiline' && + attrValue === 'false' && + vNode.hasAttr('contenteditable') + ) { + return true; + } + + return false; } diff --git a/test/checks/aria/aria-allowed-attr.js b/test/checks/aria/aria-allowed-attr.js index 578dd2771b..4c34a0a3ab 100644 --- a/test/checks/aria/aria-allowed-attr.js +++ b/test/checks/aria/aria-allowed-attr.js @@ -124,6 +124,43 @@ describe('aria-allowed-attr', () => { assert.deepEqual(checkContext._data, ['aria-required="true"']); }); + it('should not report on aria-multiline=false with contenteditable', () => { + const vNode = queryFixture( + '
' + ); + + assert.isTrue( + axe.testUtils + .getCheckEvaluate('aria-allowed-attr') + .call(checkContext, null, null, vNode) + ); + assert.isNull(checkContext._data); + }); + + it('should return false for unallowed aria-multiline=true and contenteditable', () => { + const vNode = queryFixture( + '
' + ); + + assert.isFalse( + axe.testUtils + .getCheckEvaluate('aria-allowed-attr') + .call(checkContext, null, null, vNode) + ); + assert.deepEqual(checkContext._data, ['aria-multiline="true"']); + }); + + it('should return false for unallowed aria-multiline=true', () => { + const vNode = queryFixture('
'); + + assert.isFalse( + axe.testUtils + .getCheckEvaluate('aria-allowed-attr') + .call(checkContext, null, null, vNode) + ); + assert.deepEqual(checkContext._data, ['aria-multiline="true"']); + }); + it('should return undefined for custom element that has no role and is not focusable', () => { const vNode = queryFixture( '' diff --git a/test/integration/rules/aria-allowed-attr/failures.html b/test/integration/rules/aria-allowed-attr/failures.html index cdb251a248..b6e320d88e 100644 --- a/test/integration/rules/aria-allowed-attr/failures.html +++ b/test/integration/rules/aria-allowed-attr/failures.html @@ -9,3 +9,6 @@ aria-orientation="horizontal" id="fail5" > + +
+
diff --git a/test/integration/rules/aria-allowed-attr/failures.json b/test/integration/rules/aria-allowed-attr/failures.json index cedecf0810..7cecf9ddd8 100644 --- a/test/integration/rules/aria-allowed-attr/failures.json +++ b/test/integration/rules/aria-allowed-attr/failures.json @@ -1,5 +1,13 @@ { "description": "aria-allowed-attr failing tests", "rule": "aria-allowed-attr", - "violations": [["#fail1"], ["#fail2"], ["#fail3"], ["#fail4"], ["#fail5"]] + "violations": [ + ["#fail1"], + ["#fail2"], + ["#fail3"], + ["#fail4"], + ["#fail5"], + ["#fail6"], + ["#fail7"] + ] } diff --git a/test/integration/rules/aria-allowed-attr/passes.html b/test/integration/rules/aria-allowed-attr/passes.html index 788e362f5f..a21c68c3b1 100644 --- a/test/integration/rules/aria-allowed-attr/passes.html +++ b/test/integration/rules/aria-allowed-attr/passes.html @@ -2172,3 +2172,4 @@ +
diff --git a/test/integration/rules/aria-allowed-attr/passes.json b/test/integration/rules/aria-allowed-attr/passes.json index 5eda613aba..0974e07250 100644 --- a/test/integration/rules/aria-allowed-attr/passes.json +++ b/test/integration/rules/aria-allowed-attr/passes.json @@ -103,6 +103,7 @@ ["#pass98"], ["#pass99"], ["#pass100"], - ["#pass101"] + ["#pass101"], + ["#pass102"] ] } From 227bdd9d79beded223466e9d681d7aa89309c897 Mon Sep 17 00:00:00 2001 From: Steven Lambert <2433219+straker@users.noreply.github.com> Date: Wed, 10 Jul 2024 10:41:28 -0600 Subject: [PATCH 2/3] additional test --- test/checks/aria/aria-allowed-attr.js | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/test/checks/aria/aria-allowed-attr.js b/test/checks/aria/aria-allowed-attr.js index 4c34a0a3ab..b25b9df4a1 100644 --- a/test/checks/aria/aria-allowed-attr.js +++ b/test/checks/aria/aria-allowed-attr.js @@ -150,6 +150,19 @@ describe('aria-allowed-attr', () => { assert.deepEqual(checkContext._data, ['aria-multiline="true"']); }); + it('should return false for unallowed aria-multiline=false', () => { + const vNode = queryFixture( + '
' + ); + + assert.isFalse( + axe.testUtils + .getCheckEvaluate('aria-allowed-attr') + .call(checkContext, null, null, vNode) + ); + assert.deepEqual(checkContext._data, ['aria-multiline="false"']); + }); + it('should return false for unallowed aria-multiline=true', () => { const vNode = queryFixture('
'); From 01fdb72c01bebec53402a18a300db3f5e38761e9 Mon Sep 17 00:00:00 2001 From: Steven Lambert <2433219+straker@users.noreply.github.com> Date: Wed, 10 Jul 2024 10:42:32 -0600 Subject: [PATCH 3/3] moar tests --- test/integration/rules/aria-allowed-attr/failures.html | 3 ++- test/integration/rules/aria-allowed-attr/failures.json | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/test/integration/rules/aria-allowed-attr/failures.html b/test/integration/rules/aria-allowed-attr/failures.html index b6e320d88e..21c84b0e50 100644 --- a/test/integration/rules/aria-allowed-attr/failures.html +++ b/test/integration/rules/aria-allowed-attr/failures.html @@ -11,4 +11,5 @@ >
-
+
+
diff --git a/test/integration/rules/aria-allowed-attr/failures.json b/test/integration/rules/aria-allowed-attr/failures.json index 7cecf9ddd8..02d9579b81 100644 --- a/test/integration/rules/aria-allowed-attr/failures.json +++ b/test/integration/rules/aria-allowed-attr/failures.json @@ -8,6 +8,7 @@ ["#fail4"], ["#fail5"], ["#fail6"], - ["#fail7"] + ["#fail7"], + ["#fail8"] ] }