diff --git a/src/validate/html/index.ts b/src/validate/html/index.ts index 88609d174f81..b2a190696f22 100644 --- a/src/validate/html/index.ts +++ b/src/validate/html/index.ts @@ -19,14 +19,29 @@ export default function validateHtml(validator: Validator, html: Node) { const elementStack: Node[] = []; function visit(node: Node) { - a11y(validator, node, elementStack); - if (node.type === 'Element') { if (meta.has(node.name)) { return meta.get(node.name)(validator, node, refs, refCallees); } - validateElement(validator, node, refs, refCallees, stack, elementStack); + const isComponent = + node.name === ':Self' || + node.name === ':Component' || + validator.components.has(node.name); + + validateElement( + validator, + node, + refs, + refCallees, + stack, + elementStack, + isComponent + ); + + if (!isComponent) { + a11y(validator, node, elementStack); + } } else if (node.type === 'EachBlock') { if (validator.helpers.has(node.context)) { let c = node.expression.end; diff --git a/src/validate/html/validateElement.ts b/src/validate/html/validateElement.ts index 2572fd29d40c..1156ebcea787 100644 --- a/src/validate/html/validateElement.ts +++ b/src/validate/html/validateElement.ts @@ -11,11 +11,9 @@ export default function validateElement( refs: Map, refCallees: Node[], stack: Node[], - elementStack: Node[] + elementStack: Node[], + isComponent: Boolean ) { - const isComponent = - node.name === ':Self' || node.name === ':Component' || validator.components.has(node.name); - if (isComponent) { validator.used.components.add(node.name); } diff --git a/src/validate/html/validateHead.ts b/src/validate/html/validateHead.ts index 73d100a4503a..bac56474b284 100644 --- a/src/validate/html/validateHead.ts +++ b/src/validate/html/validateHead.ts @@ -11,6 +11,6 @@ export default function validateHead(validator: Validator, node: Node, refs: Map node.children.forEach(node => { if (node.type !== 'Element') return; // TODO handle {{#if}} and friends? - validateElement(validator, node, refs, refCallees, [], []); + validateElement(validator, node, refs, refCallees, [], [], false); }); } diff --git a/test/validator/samples/a11y-not-on-components/input.html b/test/validator/samples/a11y-not-on-components/input.html new file mode 100644 index 000000000000..e6073bb742b8 --- /dev/null +++ b/test/validator/samples/a11y-not-on-components/input.html @@ -0,0 +1,9 @@ + + + + + diff --git a/test/validator/samples/a11y-not-on-components/warnings.json b/test/validator/samples/a11y-not-on-components/warnings.json new file mode 100644 index 000000000000..319a2aef8176 --- /dev/null +++ b/test/validator/samples/a11y-not-on-components/warnings.json @@ -0,0 +1,10 @@ +[ + { + "message": "A11y: Avoid using autofocus", + "loc": { + "column": 8, + "line": 2 + }, + "pos": 29 + } +]