From 95d37dd794dc8552d731fabf45244b260da53d8f Mon Sep 17 00:00:00 2001 From: Gabe <41127686+Zidious@users.noreply.github.com> Date: Fri, 24 Sep 2021 16:33:16 +0100 Subject: [PATCH] fix: check for hidden elements on `aria-errormessage` (#3156) * add visible checks and tests * fix typo * enable screenreader on isVisible * add tests * revert playground * add aria-hidden tests * add test and clean up * fix test to pass if aria-invalid is false on hidden element --- lib/checks/aria/aria-errormessage-evaluate.js | 10 ++- lib/checks/aria/aria-errormessage.json | 3 +- test/checks/aria/errormessage.js | 88 +++++++++++++++++++ .../aria-valid-attr-value.html | 69 +++++++++++++++ .../aria-valid-attr-value.json | 12 ++- 5 files changed, 178 insertions(+), 4 deletions(-) diff --git a/lib/checks/aria/aria-errormessage-evaluate.js b/lib/checks/aria/aria-errormessage-evaluate.js index 6986efdb78..bacb1c9c7c 100644 --- a/lib/checks/aria/aria-errormessage-evaluate.js +++ b/lib/checks/aria/aria-errormessage-evaluate.js @@ -1,7 +1,7 @@ import standards from '../../standards'; import { idrefs } from '../../commons/dom'; import { tokenList } from '../../core/utils'; - +import { isVisible } from '../../commons/dom'; /** * Check if `aria-errormessage` references an element that also uses a technique to announce the message (aria-live, aria-describedby, etc.). * @@ -55,6 +55,13 @@ function ariaErrormessageEvaluate(node, options, virtualNode) { } if (idref) { + if (!isVisible(idref, true)) { + this.data({ + messageKey: 'hidden', + values: tokenList(attr) + }); + return false; + } return ( idref.getAttribute('role') === 'alert' || idref.getAttribute('aria-live') === 'assertive' || @@ -62,6 +69,7 @@ function ariaErrormessageEvaluate(node, options, virtualNode) { tokenList(virtualNode.attr('aria-describedby')).indexOf(attr) > -1 ); } + return; } diff --git a/lib/checks/aria/aria-errormessage.json b/lib/checks/aria/aria-errormessage.json index ce672a591c..84901729af 100644 --- a/lib/checks/aria/aria-errormessage.json +++ b/lib/checks/aria/aria-errormessage.json @@ -7,7 +7,8 @@ "pass": "aria-errormessage exists and references elements visible to screen readers that use a supported aria-errormessage technique", "fail": { "singular": "aria-errormessage value `${data.values}` must use a technique to announce the message (e.g., aria-live, aria-describedby, role=alert, etc.)", - "plural": "aria-errormessage values `${data.values}` must use a technique to announce the message (e.g., aria-live, aria-describedby, role=alert, etc.)" + "plural": "aria-errormessage values `${data.values}` must use a technique to announce the message (e.g., aria-live, aria-describedby, role=alert, etc.)", + "hidden": "aria-errormessage value `${data.values}` cannot reference a hidden element" }, "incomplete": { "singular": "ensure aria-errormessage value `${data.values}` references an existing element", diff --git a/test/checks/aria/errormessage.js b/test/checks/aria/errormessage.js index 1fc42bcb92..e54f44ffed 100644 --- a/test/checks/aria/errormessage.js +++ b/test/checks/aria/errormessage.js @@ -144,6 +144,94 @@ describe('aria-errormessage', function() { ); }); + it('should return false when hidden attribute is used', function() { + var vNode = queryFixture( + '' + + '