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"]
]
}