diff --git a/src/compiler/compile/nodes/Element.ts b/src/compiler/compile/nodes/Element.ts index 65000b9b5d..352d31a3db 100644 --- a/src/compiler/compile/nodes/Element.ts +++ b/src/compiler/compile/nodes/Element.ts @@ -599,6 +599,20 @@ export default class Element extends Node { }); } } + + if (handlers_map.has('mouseover') && !handlers_map.has('focus')) { + component.warn(this, { + code: 'a11y-mouse-events-have-key-events', + message: 'A11y: on:mouseover must be accompanied by on:focus' + }); + } + + if (handlers_map.has('mouseout') && !handlers_map.has('blur')) { + component.warn(this, { + code: 'a11y-mouse-events-have-key-events', + message: 'A11y: on:mouseout must be accompanied by on:blur' + }); + } } validate_bindings_foreign() { diff --git a/test/validator/samples/a11y-mouse-events-have-key-events/input.svelte b/test/validator/samples/a11y-mouse-events-have-key-events/input.svelte new file mode 100644 index 0000000000..22de04f38a --- /dev/null +++ b/test/validator/samples/a11y-mouse-events-have-key-events/input.svelte @@ -0,0 +1,15 @@ + + +
void 0} /> +
void 0} on:focus={() => void 0} /> +
void 0} {...otherProps} /> +
void 0} /> +
void 0} on:blur={() => void 0} /> +
void 0} {...otherProps} /> diff --git a/test/validator/samples/a11y-mouse-events-have-key-events/warnings.json b/test/validator/samples/a11y-mouse-events-have-key-events/warnings.json new file mode 100644 index 0000000000..b3fe15feee --- /dev/null +++ b/test/validator/samples/a11y-mouse-events-have-key-events/warnings.json @@ -0,0 +1,62 @@ +[ + { + "code": "a11y-mouse-events-have-key-events", + "end": { + "character": 272, + "column": 35, + "line": 10 + }, + "message": "A11y: on:mouseover must be accompanied by on:focus", + "pos": 237, + "start": { + "character": 237, + "column": 0, + "line": 10 + } + }, + { + "code": "a11y-mouse-events-have-key-events", + "end": { + "character": 384, + "column": 51, + "line": 12 + }, + "message": "A11y: on:mouseover must be accompanied by on:focus", + "pos": 333, + "start": { + "character": 333, + "column": 0, + "line": 12 + } + }, + { + "code": "a11y-mouse-events-have-key-events", + "end": { + "character": 419, + "column": 34, + "line": 13 + }, + "message": "A11y: on:mouseout must be accompanied by on:blur", + "pos": 385, + "start": { + "character": 385, + "column": 0, + "line": 13 + } + }, + { + "code": "a11y-mouse-events-have-key-events", + "end": { + "character": 528, + "column": 50, + "line": 15 + }, + "message": "A11y: on:mouseout must be accompanied by on:blur", + "pos": 478, + "start": { + "character": 478, + "column": 0, + "line": 15 + } + } +] \ No newline at end of file