From 1515f725b49146860b8904f356d55dbcb30bb284 Mon Sep 17 00:00:00 2001 From: Ava Gaiety W Date: Tue, 11 Jun 2024 13:05:42 -0500 Subject: [PATCH 1/6] fix(autocomplete-valid): incomplete for invalid but safe values autocomplete="text" incompletes Refs: #4492 --- lib/checks/forms/autocomplete-valid-evaluate.js | 2 +- lib/checks/forms/autocomplete-valid.json | 3 ++- lib/commons/text/is-valid-autocomplete.js | 8 +++++++- locales/_template.json | 3 ++- test/checks/forms/autocomplete-valid.js | 5 +++++ .../rules/autocomplete-valid/autocomplete-valid.html | 3 +++ .../rules/autocomplete-valid/autocomplete-valid.json | 1 + 7 files changed, 21 insertions(+), 4 deletions(-) diff --git a/lib/checks/forms/autocomplete-valid-evaluate.js b/lib/checks/forms/autocomplete-valid-evaluate.js index 8139dc64dd..8e80aa06fb 100644 --- a/lib/checks/forms/autocomplete-valid-evaluate.js +++ b/lib/checks/forms/autocomplete-valid-evaluate.js @@ -1,6 +1,6 @@ import { isValidAutocomplete } from '../../commons/text'; -function autocompleteValidEvaluate(node, options, virtualNode) { +function autocompleteValidEvaluate(_node, options, virtualNode) { const autocomplete = virtualNode.attr('autocomplete') || ''; return isValidAutocomplete(autocomplete, options); } diff --git a/lib/checks/forms/autocomplete-valid.json b/lib/checks/forms/autocomplete-valid.json index 0906e4b89a..43cc04358c 100644 --- a/lib/checks/forms/autocomplete-valid.json +++ b/lib/checks/forms/autocomplete-valid.json @@ -5,7 +5,8 @@ "impact": "serious", "messages": { "pass": "the autocomplete attribute is correctly formatted", - "fail": "the autocomplete attribute is incorrectly formatted" + "fail": "the autocomplete attribute is incorrectly formatted", + "incomplete": "the autocomplete attribute is incorrect but safe to use" } }, "options": { diff --git a/lib/commons/text/is-valid-autocomplete.js b/lib/commons/text/is-valid-autocomplete.js index 8ca49035a2..2ad0b4f6d6 100644 --- a/lib/commons/text/is-valid-autocomplete.js +++ b/lib/commons/text/is-valid-autocomplete.js @@ -59,7 +59,8 @@ export const autocomplete = { 'email', 'impp' ], - locations: ['billing', 'shipping'] + locations: ['billing', 'shipping'], + invalidButSafe: ['text'] }; function isValidAutocomplete( @@ -117,6 +118,11 @@ function isValidAutocomplete( } const purposeTerm = autocompleteTerms[autocompleteTerms.length - 1]; + + if (autocomplete.invalidButSafe.includes(purposeTerm)) { + return undefined; + } + return ( standaloneTerms.includes(purposeTerm) || qualifiedTerms.includes(purposeTerm) diff --git a/locales/_template.json b/locales/_template.json index 9aa84b106a..b9ab7bbdef 100644 --- a/locales/_template.json +++ b/locales/_template.json @@ -683,7 +683,8 @@ }, "autocomplete-valid": { "pass": "the autocomplete attribute is correctly formatted", - "fail": "the autocomplete attribute is incorrectly formatted" + "fail": "the autocomplete attribute is incorrectly formatted", + "incomplete": "the autocomplete attribute is incorrect but safe to use" }, "accesskeys": { "pass": "Accesskey attribute value is unique", diff --git a/test/checks/forms/autocomplete-valid.js b/test/checks/forms/autocomplete-valid.js index d44b0dd73c..f6ce08dcc3 100644 --- a/test/checks/forms/autocomplete-valid.js +++ b/test/checks/forms/autocomplete-valid.js @@ -21,6 +21,11 @@ describe('autocomplete-valid', function () { assert.isFalse(evaluate.apply(checkContext, params)); }); + it('returns undefined (incomplete) if autocomplete is not valid but safe', function () { + var params = checkSetup(''); + assert.isUndefined(evaluate.apply(checkContext, params)); + }); + it('uses options to change what is valid autocomplete', function () { var options = { stateTerms: ['foo'] }; var params = checkSetup( diff --git a/test/integration/rules/autocomplete-valid/autocomplete-valid.html b/test/integration/rules/autocomplete-valid/autocomplete-valid.html index d68033d65f..b73d75ef2c 100644 --- a/test/integration/rules/autocomplete-valid/autocomplete-valid.html +++ b/test/integration/rules/autocomplete-valid/autocomplete-valid.html @@ -170,3 +170,6 @@ + + + diff --git a/test/integration/rules/autocomplete-valid/autocomplete-valid.json b/test/integration/rules/autocomplete-valid/autocomplete-valid.json index f1f6f4d974..885682b0b3 100644 --- a/test/integration/rules/autocomplete-valid/autocomplete-valid.json +++ b/test/integration/rules/autocomplete-valid/autocomplete-valid.json @@ -2,6 +2,7 @@ "description": "autocomplete-valid tests", "rule": "autocomplete-valid", "violations": [["#fail1"], ["#fail2"], ["#fail3"], ["#fail4"], ["#fail5"]], + "incomplete": [["#incomplete1"]], "passes": [ ["#pass1"], ["#pass2"], From 1b59fdf32cc1325d7cc60a41a1909a95af0b911a Mon Sep 17 00:00:00 2001 From: Ava Gaiety W Date: Tue, 11 Jun 2024 13:39:28 -0500 Subject: [PATCH 2/6] added additional common safe but invalid --- doc/rule-descriptions.md | 8 ++++---- lib/commons/text/is-valid-autocomplete.js | 2 +- .../rules/autocomplete-valid/autocomplete-valid.html | 4 ++++ .../rules/autocomplete-valid/autocomplete-valid.json | 8 +++++++- 4 files changed, 16 insertions(+), 6 deletions(-) diff --git a/doc/rule-descriptions.md b/doc/rule-descriptions.md index 75787363d5..0b941ae991 100644 --- a/doc/rule-descriptions.md +++ b/doc/rule-descriptions.md @@ -77,10 +77,10 @@ ## WCAG 2.1 Level A & AA Rules -| Rule ID | Description | Impact | Tags | Issue Type | ACT Rules | -| :----------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------------- | :------ | :-------------------------------------------------------------- | :--------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------- | -| [autocomplete-valid](https://dequeuniversity.com/rules/axe/4.9/autocomplete-valid?application=RuleDescription) | Ensure the autocomplete attribute is correct and suitable for the form field | Serious | cat.forms, wcag21aa, wcag135, EN-301-549, EN-9.1.3.5, ACT | failure | [73f2c2](https://act-rules.github.io/rules/73f2c2) | -| [avoid-inline-spacing](https://dequeuniversity.com/rules/axe/4.9/avoid-inline-spacing?application=RuleDescription) | Ensure that text spacing set through style attributes can be adjusted with custom stylesheets | Serious | cat.structure, wcag21aa, wcag1412, EN-301-549, EN-9.1.4.12, ACT | failure | [24afc2](https://act-rules.github.io/rules/24afc2), [9e45ec](https://act-rules.github.io/rules/9e45ec), [78fd32](https://act-rules.github.io/rules/78fd32) | +| Rule ID | Description | Impact | Tags | Issue Type | ACT Rules | +| :----------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------------- | :------ | :-------------------------------------------------------------- | :------------------------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------- | +| [autocomplete-valid](https://dequeuniversity.com/rules/axe/4.9/autocomplete-valid?application=RuleDescription) | Ensure the autocomplete attribute is correct and suitable for the form field | Serious | cat.forms, wcag21aa, wcag135, EN-301-549, EN-9.1.3.5, ACT | failure, needs review | [73f2c2](https://act-rules.github.io/rules/73f2c2) | +| [avoid-inline-spacing](https://dequeuniversity.com/rules/axe/4.9/avoid-inline-spacing?application=RuleDescription) | Ensure that text spacing set through style attributes can be adjusted with custom stylesheets | Serious | cat.structure, wcag21aa, wcag1412, EN-301-549, EN-9.1.4.12, ACT | failure | [24afc2](https://act-rules.github.io/rules/24afc2), [9e45ec](https://act-rules.github.io/rules/9e45ec), [78fd32](https://act-rules.github.io/rules/78fd32) | ## WCAG 2.2 Level A & AA Rules diff --git a/lib/commons/text/is-valid-autocomplete.js b/lib/commons/text/is-valid-autocomplete.js index 2ad0b4f6d6..116550e783 100644 --- a/lib/commons/text/is-valid-autocomplete.js +++ b/lib/commons/text/is-valid-autocomplete.js @@ -60,7 +60,7 @@ export const autocomplete = { 'impp' ], locations: ['billing', 'shipping'], - invalidButSafe: ['text'] + invalidButSafe: ['text', 'pronouns', 'gender', 'message', 'content'] }; function isValidAutocomplete( diff --git a/test/integration/rules/autocomplete-valid/autocomplete-valid.html b/test/integration/rules/autocomplete-valid/autocomplete-valid.html index b73d75ef2c..00b8aeb233 100644 --- a/test/integration/rules/autocomplete-valid/autocomplete-valid.html +++ b/test/integration/rules/autocomplete-valid/autocomplete-valid.html @@ -173,3 +173,7 @@ + + + + diff --git a/test/integration/rules/autocomplete-valid/autocomplete-valid.json b/test/integration/rules/autocomplete-valid/autocomplete-valid.json index 885682b0b3..110f372f3e 100644 --- a/test/integration/rules/autocomplete-valid/autocomplete-valid.json +++ b/test/integration/rules/autocomplete-valid/autocomplete-valid.json @@ -2,7 +2,13 @@ "description": "autocomplete-valid tests", "rule": "autocomplete-valid", "violations": [["#fail1"], ["#fail2"], ["#fail3"], ["#fail4"], ["#fail5"]], - "incomplete": [["#incomplete1"]], + "incomplete": [ + ["#incomplete1"], + ["#incomplete2"], + ["#incomplete3"], + ["#incomplete4"], + ["#incomplete5"] + ], "passes": [ ["#pass1"], ["#pass2"], From b7c4dc9622d83c7367a3ef2530dc5f27c1e9ff0f Mon Sep 17 00:00:00 2001 From: "Ava (Gaiety)" <165677673+gaiety-deque@users.noreply.github.com> Date: Thu, 13 Jun 2024 08:32:11 -0500 Subject: [PATCH 3/6] Update lib/checks/forms/autocomplete-valid.json Co-authored-by: Wilco Fiers --- lib/checks/forms/autocomplete-valid.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/checks/forms/autocomplete-valid.json b/lib/checks/forms/autocomplete-valid.json index 43cc04358c..34c174af82 100644 --- a/lib/checks/forms/autocomplete-valid.json +++ b/lib/checks/forms/autocomplete-valid.json @@ -6,7 +6,7 @@ "messages": { "pass": "the autocomplete attribute is correctly formatted", "fail": "the autocomplete attribute is incorrectly formatted", - "incomplete": "the autocomplete attribute is incorrect but safe to use" + "incomplete": "check that this invalid autocomplete attribute does not necessary for accessibility" } }, "options": { From 59018e8afc9960100b057e06db1c05f7d8432017 Mon Sep 17 00:00:00 2001 From: Ava Gaiety W Date: Thu, 13 Jun 2024 08:44:11 -0500 Subject: [PATCH 4/6] changed description to ignoredValues --- lib/commons/text/is-valid-autocomplete.js | 4 ++-- locales/_template.json | 2 +- test/checks/forms/autocomplete-valid.js | 2 +- .../rules/autocomplete-valid/autocomplete-valid.html | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/lib/commons/text/is-valid-autocomplete.js b/lib/commons/text/is-valid-autocomplete.js index 116550e783..0d34988efb 100644 --- a/lib/commons/text/is-valid-autocomplete.js +++ b/lib/commons/text/is-valid-autocomplete.js @@ -60,7 +60,7 @@ export const autocomplete = { 'impp' ], locations: ['billing', 'shipping'], - invalidButSafe: ['text', 'pronouns', 'gender', 'message', 'content'] + ignoredValues: ['text', 'pronouns', 'gender', 'message', 'content'] }; function isValidAutocomplete( @@ -119,7 +119,7 @@ function isValidAutocomplete( const purposeTerm = autocompleteTerms[autocompleteTerms.length - 1]; - if (autocomplete.invalidButSafe.includes(purposeTerm)) { + if (autocomplete.ignoredValues.includes(purposeTerm)) { return undefined; } diff --git a/locales/_template.json b/locales/_template.json index b9ab7bbdef..c6796332c9 100644 --- a/locales/_template.json +++ b/locales/_template.json @@ -684,7 +684,7 @@ "autocomplete-valid": { "pass": "the autocomplete attribute is correctly formatted", "fail": "the autocomplete attribute is incorrectly formatted", - "incomplete": "the autocomplete attribute is incorrect but safe to use" + "incomplete": "check that this invalid autocomplete attribute does not necessary for accessibility" }, "accesskeys": { "pass": "Accesskey attribute value is unique", diff --git a/test/checks/forms/autocomplete-valid.js b/test/checks/forms/autocomplete-valid.js index f6ce08dcc3..1df38fe56e 100644 --- a/test/checks/forms/autocomplete-valid.js +++ b/test/checks/forms/autocomplete-valid.js @@ -21,7 +21,7 @@ describe('autocomplete-valid', function () { assert.isFalse(evaluate.apply(checkContext, params)); }); - it('returns undefined (incomplete) if autocomplete is not valid but safe', function () { + it('returns undefined (incomplete) if autocomplete is ignored', function () { var params = checkSetup(''); assert.isUndefined(evaluate.apply(checkContext, params)); }); diff --git a/test/integration/rules/autocomplete-valid/autocomplete-valid.html b/test/integration/rules/autocomplete-valid/autocomplete-valid.html index 00b8aeb233..fdb2a0f989 100644 --- a/test/integration/rules/autocomplete-valid/autocomplete-valid.html +++ b/test/integration/rules/autocomplete-valid/autocomplete-valid.html @@ -171,7 +171,7 @@ - + From 1d5d63fc872ce4e3a226ab61832160657ab6ea79 Mon Sep 17 00:00:00 2001 From: Steven Lambert <2433219+straker@users.noreply.github.com> Date: Mon, 17 Jun 2024 14:33:37 -0600 Subject: [PATCH 5/6] check options --- doc/check-options.md | 47 +++++++++++++++++++++++ lib/checks/forms/autocomplete-valid.json | 5 ++- lib/commons/text/is-valid-autocomplete.js | 8 ++-- locales/_template.json | 2 +- 4 files changed, 55 insertions(+), 7 deletions(-) diff --git a/doc/check-options.md b/doc/check-options.md index 0ca3b53814..d35e9575a2 100644 --- a/doc/check-options.md +++ b/doc/check-options.md @@ -10,6 +10,7 @@ - [aria-required-children](#aria-required-children) - [aria-required-parent](#aria-required-parent) - [aria-roledescription](#aria-roledescription) + - [autocomplete-valid](#autocomplete-valid) - [color-contrast](#color-contrast) - [page-has-heading-one](#page-has-heading-one) - [page-has-main](#page-has-main) @@ -237,6 +238,52 @@ Previously supported properties `validTreeRowAttrs` is no longer available. `inv +### autocomplete-valid + + + + + + + + + + + + + + + + + + + + + +
OptionDefaultDescription
+ stateTerms + +
[
+  'none',
+  'false',
+  'true',
+  'disabled',
+  'enabled',
+  'undefined',
+  'null',
+]
+
List of allowed autocomplete state terms other than "on" and "off."
+ ignoredValues + +
[
+  'text',
+  'pronouns',
+  'gender',
+  'message',
+  'content'
+]
+
List of autocomplete values that are technically invalid but will be ignored as they may not necessarily cause accessibility problems
+ ### color-contrast | Option | Default | Description | diff --git a/lib/checks/forms/autocomplete-valid.json b/lib/checks/forms/autocomplete-valid.json index 34c174af82..3081143edc 100644 --- a/lib/checks/forms/autocomplete-valid.json +++ b/lib/checks/forms/autocomplete-valid.json @@ -6,7 +6,7 @@ "messages": { "pass": "the autocomplete attribute is correctly formatted", "fail": "the autocomplete attribute is incorrectly formatted", - "incomplete": "check that this invalid autocomplete attribute does not necessary for accessibility" + "incomplete": "the autocomplete attribute has a non-standard value. Check whether any standard value could be used instead." } }, "options": { @@ -18,6 +18,7 @@ "enabled", "undefined", "null" - ] + ], + "ignoredValues": ["text", "pronouns", "gender", "message", "content"] } } diff --git a/lib/commons/text/is-valid-autocomplete.js b/lib/commons/text/is-valid-autocomplete.js index 0d34988efb..91b4928ca7 100644 --- a/lib/commons/text/is-valid-autocomplete.js +++ b/lib/commons/text/is-valid-autocomplete.js @@ -59,8 +59,7 @@ export const autocomplete = { 'email', 'impp' ], - locations: ['billing', 'shipping'], - ignoredValues: ['text', 'pronouns', 'gender', 'message', 'content'] + locations: ['billing', 'shipping'] }; function isValidAutocomplete( @@ -71,7 +70,8 @@ function isValidAutocomplete( locations = [], qualifiers = [], standaloneTerms = [], - qualifiedTerms = [] + qualifiedTerms = [], + ignoredValues = [] } = {} ) { autocompleteValue = autocompleteValue.toLowerCase().trim(); @@ -119,7 +119,7 @@ function isValidAutocomplete( const purposeTerm = autocompleteTerms[autocompleteTerms.length - 1]; - if (autocomplete.ignoredValues.includes(purposeTerm)) { + if (ignoredValues.includes(purposeTerm)) { return undefined; } diff --git a/locales/_template.json b/locales/_template.json index c6796332c9..ed8a6902ea 100644 --- a/locales/_template.json +++ b/locales/_template.json @@ -684,7 +684,7 @@ "autocomplete-valid": { "pass": "the autocomplete attribute is correctly formatted", "fail": "the autocomplete attribute is incorrectly formatted", - "incomplete": "check that this invalid autocomplete attribute does not necessary for accessibility" + "incomplete": "the autocomplete attribute has a non-standard value. Check whether any standard value could be used instead." }, "accesskeys": { "pass": "Accesskey attribute value is unique", From 8f1be344707354a35a797daf509efc287a22eaeb Mon Sep 17 00:00:00 2001 From: Steven Lambert <2433219+straker@users.noreply.github.com> Date: Mon, 17 Jun 2024 14:35:04 -0600 Subject: [PATCH 6/6] add test --- test/commons/text/is-valid-autocomplete.js | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/test/commons/text/is-valid-autocomplete.js b/test/commons/text/is-valid-autocomplete.js index e9f4a4ddc7..d32a846ad5 100644 --- a/test/commons/text/is-valid-autocomplete.js +++ b/test/commons/text/is-valid-autocomplete.js @@ -206,4 +206,14 @@ describe('text.isValidAutocomplete', () => { ); }); }); + + describe('options.ignoredValues', () => { + it('returns undefined if value is invalid and ignored', () => { + assert.isUndefined( + isValidAutocomplete('bad-term', { + ignoredValues: ['bad-term'] + }) + ); + }); + }); });