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/doc/rule-descriptions.md b/doc/rule-descriptions.md index c2ac904270..734d73b36b 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/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 25ca50724d..3081143edc 100644 --- a/lib/checks/forms/autocomplete-valid.json +++ b/lib/checks/forms/autocomplete-valid.json @@ -4,8 +4,9 @@ "metadata": { "impact": "serious", "messages": { - "pass": "The autocomplete attribute is correctly formatted", - "fail": "The autocomplete attribute is incorrectly formatted" + "pass": "the autocomplete attribute is correctly formatted", + "fail": "the autocomplete attribute is incorrectly formatted", + "incomplete": "the autocomplete attribute has a non-standard value. Check whether any standard value could be used instead." } }, "options": { @@ -17,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 8ca49035a2..91b4928ca7 100644 --- a/lib/commons/text/is-valid-autocomplete.js +++ b/lib/commons/text/is-valid-autocomplete.js @@ -70,7 +70,8 @@ function isValidAutocomplete( locations = [], qualifiers = [], standaloneTerms = [], - qualifiedTerms = [] + qualifiedTerms = [], + ignoredValues = [] } = {} ) { autocompleteValue = autocompleteValue.toLowerCase().trim(); @@ -117,6 +118,11 @@ function isValidAutocomplete( } const purposeTerm = autocompleteTerms[autocompleteTerms.length - 1]; + + if (ignoredValues.includes(purposeTerm)) { + return undefined; + } + return ( standaloneTerms.includes(purposeTerm) || qualifiedTerms.includes(purposeTerm) diff --git a/locales/_template.json b/locales/_template.json index e52124c82f..63b6f1d3b6 100644 --- a/locales/_template.json +++ b/locales/_template.json @@ -682,8 +682,9 @@ "fail": "The autocomplete value is inappropriate for this type of input" }, "autocomplete-valid": { - "pass": "The autocomplete attribute is correctly formatted", - "fail": "The autocomplete attribute is incorrectly formatted" + "pass": "the autocomplete attribute is correctly formatted", + "fail": "the autocomplete attribute is incorrectly formatted", + "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", diff --git a/test/checks/forms/autocomplete-valid.js b/test/checks/forms/autocomplete-valid.js index d44b0dd73c..1df38fe56e 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 ignored', 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/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'] + }) + ); + }); + }); }); diff --git a/test/integration/rules/autocomplete-valid/autocomplete-valid.html b/test/integration/rules/autocomplete-valid/autocomplete-valid.html index d68033d65f..fdb2a0f989 100644 --- a/test/integration/rules/autocomplete-valid/autocomplete-valid.html +++ b/test/integration/rules/autocomplete-valid/autocomplete-valid.html @@ -170,3 +170,10 @@ + + + + + + + diff --git a/test/integration/rules/autocomplete-valid/autocomplete-valid.json b/test/integration/rules/autocomplete-valid/autocomplete-valid.json index f1f6f4d974..110f372f3e 100644 --- a/test/integration/rules/autocomplete-valid/autocomplete-valid.json +++ b/test/integration/rules/autocomplete-valid/autocomplete-valid.json @@ -2,6 +2,13 @@ "description": "autocomplete-valid tests", "rule": "autocomplete-valid", "violations": [["#fail1"], ["#fail2"], ["#fail3"], ["#fail4"], ["#fail5"]], + "incomplete": [ + ["#incomplete1"], + ["#incomplete2"], + ["#incomplete3"], + ["#incomplete4"], + ["#incomplete5"] + ], "passes": [ ["#pass1"], ["#pass2"],