@arcaauth/eslint-plugin-jsx-a11y 6.10.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.babelrc +17 -0
- package/.eslintrc +44 -0
- package/CHANGELOG.md +774 -0
- package/LICENSE.md +8 -0
- package/README.md +423 -0
- package/__mocks__/IdentifierMock.js +15 -0
- package/__mocks__/JSXAttributeMock.js +39 -0
- package/__mocks__/JSXElementMock.js +37 -0
- package/__mocks__/JSXExpressionContainerMock.js +15 -0
- package/__mocks__/JSXSpreadAttributeMock.js +18 -0
- package/__mocks__/JSXTextMock.js +17 -0
- package/__mocks__/LiteralMock.js +17 -0
- package/__mocks__/genInteractives.js +218 -0
- package/__tests__/__util__/axeMapping.js +6 -0
- package/__tests__/__util__/helpers/getESLintCoreRule.js +9 -0
- package/__tests__/__util__/helpers/parsers.js +186 -0
- package/__tests__/__util__/parserOptionsMapper.js +53 -0
- package/__tests__/__util__/ruleOptionsMapperFactory.js +33 -0
- package/__tests__/index-test.js +40 -0
- package/__tests__/src/rules/accessible-emoji-test.js +66 -0
- package/__tests__/src/rules/alt-text-test.js +291 -0
- package/__tests__/src/rules/anchor-ambiguous-text-test.js +117 -0
- package/__tests__/src/rules/anchor-has-content-test.js +54 -0
- package/__tests__/src/rules/anchor-is-valid-test.js +532 -0
- package/__tests__/src/rules/aria-activedescendant-has-tabindex-test.js +95 -0
- package/__tests__/src/rules/aria-props-test.js +69 -0
- package/__tests__/src/rules/aria-proptypes-test.js +311 -0
- package/__tests__/src/rules/aria-role-test.js +118 -0
- package/__tests__/src/rules/aria-unsupported-elements-test.js +75 -0
- package/__tests__/src/rules/autocomplete-valid-test.js +77 -0
- package/__tests__/src/rules/click-events-have-key-events-test.js +77 -0
- package/__tests__/src/rules/control-has-associated-label-test.js +327 -0
- package/__tests__/src/rules/heading-has-content-test.js +85 -0
- package/__tests__/src/rules/html-has-lang-test.js +42 -0
- package/__tests__/src/rules/iframe-has-title-test.js +55 -0
- package/__tests__/src/rules/img-redundant-alt-test.js +137 -0
- package/__tests__/src/rules/interactive-supports-focus-test.js +267 -0
- package/__tests__/src/rules/label-has-associated-control-test.js +243 -0
- package/__tests__/src/rules/label-has-for-test.js +235 -0
- package/__tests__/src/rules/lang-test.js +59 -0
- package/__tests__/src/rules/media-has-caption-test.js +220 -0
- package/__tests__/src/rules/mouse-events-have-key-events-test.js +154 -0
- package/__tests__/src/rules/no-access-key-test.js +48 -0
- package/__tests__/src/rules/no-aria-hidden-on-focusable-test.js +44 -0
- package/__tests__/src/rules/no-autofocus-test.js +68 -0
- package/__tests__/src/rules/no-distracting-elements-test.js +51 -0
- package/__tests__/src/rules/no-interactive-element-to-noninteractive-role-test.js +405 -0
- package/__tests__/src/rules/no-noninteractive-element-interactions-test.js +502 -0
- package/__tests__/src/rules/no-noninteractive-element-to-interactive-role-test.js +500 -0
- package/__tests__/src/rules/no-noninteractive-tabindex-test.js +123 -0
- package/__tests__/src/rules/no-onchange-test.js +57 -0
- package/__tests__/src/rules/no-redundant-roles-test.js +98 -0
- package/__tests__/src/rules/no-static-element-interactions-test.js +501 -0
- package/__tests__/src/rules/prefer-tag-over-role-test.js +63 -0
- package/__tests__/src/rules/role-has-required-aria-props-test.js +134 -0
- package/__tests__/src/rules/role-supports-aria-props-test.js +570 -0
- package/__tests__/src/rules/scope-test.js +50 -0
- package/__tests__/src/rules/tabindex-no-positive-test.js +55 -0
- package/__tests__/src/util/attributesComparator-test.js +91 -0
- package/__tests__/src/util/getAccessibleChildText-test.js +174 -0
- package/__tests__/src/util/getComputedRole-test.js +71 -0
- package/__tests__/src/util/getElementType-test.js +154 -0
- package/__tests__/src/util/getExplicitRole-test.js +35 -0
- package/__tests__/src/util/getImplicitRole-test.js +25 -0
- package/__tests__/src/util/getSuggestion-test.js +33 -0
- package/__tests__/src/util/getTabIndex-test.js +85 -0
- package/__tests__/src/util/hasAccessibleChild-test.js +157 -0
- package/__tests__/src/util/implicitRoles/input-test.js +87 -0
- package/__tests__/src/util/implicitRoles/menu-test.js +20 -0
- package/__tests__/src/util/implicitRoles/menuitem-test.js +38 -0
- package/__tests__/src/util/isAbstractRole-test.js +51 -0
- package/__tests__/src/util/isContentEditable-test.js +52 -0
- package/__tests__/src/util/isDOMElement-test.js +30 -0
- package/__tests__/src/util/isDisabledElement-test.js +88 -0
- package/__tests__/src/util/isFocusable-test.js +111 -0
- package/__tests__/src/util/isInteractiveElement-test.js +104 -0
- package/__tests__/src/util/isInteractiveRole-test.js +59 -0
- package/__tests__/src/util/isNonInteractiveElement-test.js +97 -0
- package/__tests__/src/util/isNonInteractiveRole-test.js +59 -0
- package/__tests__/src/util/isNonLiteralProperty-test.js +52 -0
- package/__tests__/src/util/isSemanticRoleElement-test.js +72 -0
- package/__tests__/src/util/mayContainChildComponent-test.js +219 -0
- package/__tests__/src/util/mayHaveAccessibleLabel-test.js +256 -0
- package/__tests__/src/util/parserOptionsMapper-test.js +93 -0
- package/__tests__/src/util/schemas-test.js +35 -0
- package/docs/rules/accessible-emoji.md +30 -0
- package/docs/rules/alt-text.md +168 -0
- package/docs/rules/anchor-ambiguous-text.md +91 -0
- package/docs/rules/anchor-has-content.md +64 -0
- package/docs/rules/anchor-is-valid.md +270 -0
- package/docs/rules/aria-activedescendant-has-tabindex.md +52 -0
- package/docs/rules/aria-props.md +29 -0
- package/docs/rules/aria-proptypes.md +30 -0
- package/docs/rules/aria-role.md +51 -0
- package/docs/rules/aria-unsupported-elements.md +30 -0
- package/docs/rules/autocomplete-valid.md +49 -0
- package/docs/rules/click-events-have-key-events.md +28 -0
- package/docs/rules/control-has-associated-label.md +113 -0
- package/docs/rules/heading-has-content.md +67 -0
- package/docs/rules/html-has-lang.md +31 -0
- package/docs/rules/iframe-has-title.md +37 -0
- package/docs/rules/img-redundant-alt.md +48 -0
- package/docs/rules/interactive-supports-focus.md +156 -0
- package/docs/rules/label-has-associated-control.md +152 -0
- package/docs/rules/label-has-for.md +130 -0
- package/docs/rules/lang.md +31 -0
- package/docs/rules/media-has-caption.md +48 -0
- package/docs/rules/mouse-events-have-key-events.md +58 -0
- package/docs/rules/no-access-key.md +30 -0
- package/docs/rules/no-aria-hidden-on-focusable.md +37 -0
- package/docs/rules/no-autofocus.md +43 -0
- package/docs/rules/no-distracting-elements.md +41 -0
- package/docs/rules/no-interactive-element-to-noninteractive-role.md +73 -0
- package/docs/rules/no-noninteractive-element-interactions.md +145 -0
- package/docs/rules/no-noninteractive-element-to-interactive-role.md +76 -0
- package/docs/rules/no-noninteractive-tabindex.md +115 -0
- package/docs/rules/no-onchange.md +36 -0
- package/docs/rules/no-redundant-roles.md +46 -0
- package/docs/rules/no-static-element-interactions.md +114 -0
- package/docs/rules/prefer-tag-over-role.md +32 -0
- package/docs/rules/role-has-required-aria-props.md +31 -0
- package/docs/rules/role-supports-aria-props.md +39 -0
- package/docs/rules/scope.md +30 -0
- package/docs/rules/tabindex-no-positive.md +32 -0
- package/lib/configs/flat-config-base.js +11 -0
- package/lib/configs/legacy-config-base.js +9 -0
- package/lib/index.js +209 -0
- package/lib/rules/accessible-emoji.js +63 -0
- package/lib/rules/alt-text.js +218 -0
- package/lib/rules/anchor-ambiguous-text.js +64 -0
- package/lib/rules/anchor-has-content.js +60 -0
- package/lib/rules/anchor-is-valid.js +122 -0
- package/lib/rules/aria-activedescendant-has-tabindex.js +66 -0
- package/lib/rules/aria-props.js +59 -0
- package/lib/rules/aria-proptypes.js +114 -0
- package/lib/rules/aria-role.js +89 -0
- package/lib/rules/aria-unsupported-elements.js +64 -0
- package/lib/rules/autocomplete-valid.js +67 -0
- package/lib/rules/click-events-have-key-events.js +68 -0
- package/lib/rules/control-has-associated-label.js +103 -0
- package/lib/rules/heading-has-content.js +61 -0
- package/lib/rules/html-has-lang.js +50 -0
- package/lib/rules/iframe-has-title.js +50 -0
- package/lib/rules/img-redundant-alt.js +88 -0
- package/lib/rules/interactive-supports-focus.js +87 -0
- package/lib/rules/label-has-associated-control.js +127 -0
- package/lib/rules/label-has-for.js +150 -0
- package/lib/rules/lang.js +68 -0
- package/lib/rules/media-has-caption.js +96 -0
- package/lib/rules/mouse-events-have-key-events.js +94 -0
- package/lib/rules/no-access-key.js +43 -0
- package/lib/rules/no-aria-hidden-on-focusable.js +47 -0
- package/lib/rules/no-autofocus.js +62 -0
- package/lib/rules/no-distracting-elements.js +54 -0
- package/lib/rules/no-interactive-element-to-noninteractive-role.js +81 -0
- package/lib/rules/no-noninteractive-element-interactions.js +95 -0
- package/lib/rules/no-noninteractive-element-to-interactive-role.js +80 -0
- package/lib/rules/no-noninteractive-tabindex.js +109 -0
- package/lib/rules/no-onchange.js +52 -0
- package/lib/rules/no-redundant-roles.js +86 -0
- package/lib/rules/no-static-element-interactions.js +102 -0
- package/lib/rules/prefer-tag-over-role.js +75 -0
- package/lib/rules/role-has-required-aria-props.js +88 -0
- package/lib/rules/role-supports-aria-props.js +78 -0
- package/lib/rules/scope.js +58 -0
- package/lib/rules/tabindex-no-positive.js +53 -0
- package/lib/util/attributesComparator.js +34 -0
- package/lib/util/getAccessibleChildText.js +55 -0
- package/lib/util/getComputedRole.js +19 -0
- package/lib/util/getElementType.js +30 -0
- package/lib/util/getExplicitRole.js +27 -0
- package/lib/util/getImplicitRole.js +24 -0
- package/lib/util/getSuggestion.js +32 -0
- package/lib/util/getTabIndex.js +34 -0
- package/lib/util/hasAccessibleChild.js +30 -0
- package/lib/util/implicitRoles/a.js +17 -0
- package/lib/util/implicitRoles/area.js +17 -0
- package/lib/util/implicitRoles/article.js +13 -0
- package/lib/util/implicitRoles/aside.js +13 -0
- package/lib/util/implicitRoles/body.js +13 -0
- package/lib/util/implicitRoles/button.js +13 -0
- package/lib/util/implicitRoles/datalist.js +13 -0
- package/lib/util/implicitRoles/details.js +13 -0
- package/lib/util/implicitRoles/dialog.js +13 -0
- package/lib/util/implicitRoles/form.js +13 -0
- package/lib/util/implicitRoles/h1.js +13 -0
- package/lib/util/implicitRoles/h2.js +13 -0
- package/lib/util/implicitRoles/h3.js +13 -0
- package/lib/util/implicitRoles/h4.js +13 -0
- package/lib/util/implicitRoles/h5.js +13 -0
- package/lib/util/implicitRoles/h6.js +13 -0
- package/lib/util/implicitRoles/hr.js +13 -0
- package/lib/util/implicitRoles/img.js +31 -0
- package/lib/util/implicitRoles/index.js +82 -0
- package/lib/util/implicitRoles/input.js +38 -0
- package/lib/util/implicitRoles/li.js +13 -0
- package/lib/util/implicitRoles/link.js +17 -0
- package/lib/util/implicitRoles/menu.js +19 -0
- package/lib/util/implicitRoles/menuitem.js +28 -0
- package/lib/util/implicitRoles/meter.js +13 -0
- package/lib/util/implicitRoles/nav.js +13 -0
- package/lib/util/implicitRoles/ol.js +13 -0
- package/lib/util/implicitRoles/option.js +13 -0
- package/lib/util/implicitRoles/output.js +13 -0
- package/lib/util/implicitRoles/progress.js +13 -0
- package/lib/util/implicitRoles/section.js +13 -0
- package/lib/util/implicitRoles/select.js +13 -0
- package/lib/util/implicitRoles/tbody.js +13 -0
- package/lib/util/implicitRoles/textarea.js +13 -0
- package/lib/util/implicitRoles/tfoot.js +13 -0
- package/lib/util/implicitRoles/thead.js +13 -0
- package/lib/util/implicitRoles/ul.js +13 -0
- package/lib/util/isAbstractRole.js +23 -0
- package/lib/util/isContentEditable.js +13 -0
- package/lib/util/isDOMElement.js +15 -0
- package/lib/util/isDisabledElement.js +23 -0
- package/lib/util/isFocusable.js +23 -0
- package/lib/util/isHiddenFromScreenReader.js +26 -0
- package/lib/util/isInteractiveElement.js +116 -0
- package/lib/util/isInteractiveRole.js +54 -0
- package/lib/util/isNonInteractiveElement.js +131 -0
- package/lib/util/isNonInteractiveRole.js +55 -0
- package/lib/util/isNonLiteralProperty.js +29 -0
- package/lib/util/isPresentationRole.js +13 -0
- package/lib/util/isSemanticRoleElement.js +54 -0
- package/lib/util/mayContainChildComponent.js +50 -0
- package/lib/util/mayHaveAccessibleLabel.js +95 -0
- package/lib/util/schemas.js +52 -0
- package/package.json +120 -0
|
@@ -0,0 +1,502 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Enforce non-interactive elements have no interactive handlers.
|
|
3
|
+
* @author Ethan Cohen
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
// -----------------------------------------------------------------------------
|
|
7
|
+
// Requirements
|
|
8
|
+
// -----------------------------------------------------------------------------
|
|
9
|
+
|
|
10
|
+
import { RuleTester } from 'eslint';
|
|
11
|
+
import { configs } from '../../../src/index';
|
|
12
|
+
import parserOptionsMapper from '../../__util__/parserOptionsMapper';
|
|
13
|
+
import parsers from '../../__util__/helpers/parsers';
|
|
14
|
+
import rule from '../../../src/rules/no-noninteractive-element-interactions';
|
|
15
|
+
import ruleOptionsMapperFactory from '../../__util__/ruleOptionsMapperFactory';
|
|
16
|
+
|
|
17
|
+
// -----------------------------------------------------------------------------
|
|
18
|
+
// Tests
|
|
19
|
+
// -----------------------------------------------------------------------------
|
|
20
|
+
|
|
21
|
+
const ruleTester = new RuleTester();
|
|
22
|
+
|
|
23
|
+
const errorMessage = 'Non-interactive elements should not be assigned mouse or keyboard event listeners.';
|
|
24
|
+
|
|
25
|
+
const expectedError = {
|
|
26
|
+
message: errorMessage,
|
|
27
|
+
type: 'JSXOpeningElement',
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
const ruleName = 'no-noninteractive-element-interactions';
|
|
31
|
+
|
|
32
|
+
const alwaysValid = [
|
|
33
|
+
{ code: '<TestComponent onClick={doFoo} />' },
|
|
34
|
+
{ code: '<Button onClick={doFoo} />' },
|
|
35
|
+
{ code: '<Image onClick={() => void 0} />;' },
|
|
36
|
+
{
|
|
37
|
+
code: '<Button onClick={() => void 0} />;',
|
|
38
|
+
settings: { 'jsx-a11y': { components: { Button: 'button' } } },
|
|
39
|
+
},
|
|
40
|
+
/* All flavors of input */
|
|
41
|
+
{ code: '<input onClick={() => void 0} />' },
|
|
42
|
+
{ code: '<input type="button" onClick={() => void 0} />' },
|
|
43
|
+
{ code: '<input type="checkbox" onClick={() => void 0} />' },
|
|
44
|
+
{ code: '<input type="color" onClick={() => void 0} />' },
|
|
45
|
+
{ code: '<input type="date" onClick={() => void 0} />' },
|
|
46
|
+
{ code: '<input type="datetime" onClick={() => void 0} />' },
|
|
47
|
+
{ code: '<input type="datetime-local" onClick={() => void 0} />' },
|
|
48
|
+
{ code: '<input type="email" onClick={() => void 0} />' },
|
|
49
|
+
{ code: '<input type="file" onClick={() => void 0} />' },
|
|
50
|
+
{ code: '<input type="image" onClick={() => void 0} />' },
|
|
51
|
+
{ code: '<input type="month" onClick={() => void 0} />' },
|
|
52
|
+
{ code: '<input type="number" onClick={() => void 0} />' },
|
|
53
|
+
{ code: '<input type="password" onClick={() => void 0} />' },
|
|
54
|
+
{ code: '<input type="radio" onClick={() => void 0} />' },
|
|
55
|
+
{ code: '<input type="range" onClick={() => void 0} />' },
|
|
56
|
+
{ code: '<input type="reset" onClick={() => void 0} />' },
|
|
57
|
+
{ code: '<input type="search" onClick={() => void 0} />' },
|
|
58
|
+
{ code: '<input type="submit" onClick={() => void 0} />' },
|
|
59
|
+
{ code: '<input type="tel" onClick={() => void 0} />' },
|
|
60
|
+
{ code: '<input type="text" onClick={() => void 0} />' },
|
|
61
|
+
{ code: '<input type="time" onClick={() => void 0} />' },
|
|
62
|
+
{ code: '<input type="url" onClick={() => void 0} />' },
|
|
63
|
+
{ code: '<input type="week" onClick={() => void 0} />' },
|
|
64
|
+
{ code: '<input type="hidden" onClick={() => void 0} />' },
|
|
65
|
+
/* End all flavors of input */
|
|
66
|
+
{ code: '<a onClick={() => void 0} />' },
|
|
67
|
+
{ code: '<a onClick={() => {}} />;' },
|
|
68
|
+
{ code: '<a tabIndex="0" onClick={() => void 0} />' },
|
|
69
|
+
{ code: '<a onClick={() => void 0} href="http://x.y.z" />' },
|
|
70
|
+
{ code: '<a onClick={() => void 0} href="http://x.y.z" tabIndex="0" />' },
|
|
71
|
+
{ code: '<area onClick={() => {}} />;' },
|
|
72
|
+
{ code: '<body onClick={() => {}} />;' },
|
|
73
|
+
{ code: '<button onClick={() => void 0} className="foo" />' },
|
|
74
|
+
{ code: '<menuitem onClick={() => {}} />;' },
|
|
75
|
+
{ code: '<option onClick={() => void 0} className="foo" />' },
|
|
76
|
+
{ code: '<select onClick={() => void 0} className="foo" />' },
|
|
77
|
+
{ code: '<textarea onClick={() => void 0} className="foo" />' },
|
|
78
|
+
{ code: '<tr onClick={() => {}} />;' },
|
|
79
|
+
/* HTML elements with neither an interactive or non-interactive valence (static) */
|
|
80
|
+
{ code: '<acronym onClick={() => {}} />;' },
|
|
81
|
+
{ code: '<applet onClick={() => {}} />;' },
|
|
82
|
+
{ code: '<audio onClick={() => {}} />;' },
|
|
83
|
+
{ code: '<b onClick={() => {}} />;' },
|
|
84
|
+
{ code: '<base onClick={() => {}} />;' },
|
|
85
|
+
{ code: '<bdi onClick={() => {}} />;' },
|
|
86
|
+
{ code: '<bdo onClick={() => {}} />;' },
|
|
87
|
+
{ code: '<big onClick={() => {}} />;' },
|
|
88
|
+
{ code: '<blink onClick={() => {}} />;' },
|
|
89
|
+
{ code: '<body onLoad={() => {}} />;' },
|
|
90
|
+
{ code: '<canvas onClick={() => {}} />;' },
|
|
91
|
+
{ code: '<center onClick={() => {}} />;' },
|
|
92
|
+
{ code: '<cite onClick={() => {}} />;' },
|
|
93
|
+
{ code: '<col onClick={() => {}} />;' },
|
|
94
|
+
{ code: '<colgroup onClick={() => {}} />;' },
|
|
95
|
+
{ code: '<content onClick={() => {}} />;' },
|
|
96
|
+
{ code: '<data onClick={() => {}} />;' },
|
|
97
|
+
{ code: '<datalist onClick={() => {}} />;' },
|
|
98
|
+
{ code: '<div />;' },
|
|
99
|
+
{ code: '<div className="foo" />;' },
|
|
100
|
+
{ code: '<div className="foo" {...props} />;' },
|
|
101
|
+
{ code: '<div onClick={() => void 0} aria-hidden />;' },
|
|
102
|
+
{ code: '<div onClick={() => void 0} aria-hidden={true} />;' },
|
|
103
|
+
{ code: '<div onClick={() => void 0} />;' },
|
|
104
|
+
{ code: '<div onClick={() => void 0} role={undefined} />;' },
|
|
105
|
+
{ code: '<div onClick={() => void 0} {...props} />;' },
|
|
106
|
+
{ code: '<div onClick={null} />;' },
|
|
107
|
+
{ code: '<div onKeyUp={() => void 0} aria-hidden={false} />;' },
|
|
108
|
+
{ code: '<embed onClick={() => {}} />;' },
|
|
109
|
+
{ code: '<font onClick={() => {}} />;' },
|
|
110
|
+
{ code: '<font onSubmit={() => {}} />;' },
|
|
111
|
+
{ code: '<form onSubmit={() => {}} />;' },
|
|
112
|
+
{
|
|
113
|
+
code: `
|
|
114
|
+
<form onSubmit={this.handleSubmit.bind(this)} method="POST">
|
|
115
|
+
<button type="submit">
|
|
116
|
+
Save
|
|
117
|
+
</button>
|
|
118
|
+
</form>
|
|
119
|
+
`,
|
|
120
|
+
},
|
|
121
|
+
{ code: '<frame onClick={() => {}} />;' },
|
|
122
|
+
{ code: '<frameset onClick={() => {}} />;' },
|
|
123
|
+
{ code: '<head onClick={() => {}} />;' },
|
|
124
|
+
{ code: '<header onClick={() => {}} />;' },
|
|
125
|
+
{ code: '<hgroup onClick={() => {}} />;' },
|
|
126
|
+
{ code: '<i onClick={() => {}} />;' },
|
|
127
|
+
{ code: '<iframe onLoad={() => {}} />;' },
|
|
128
|
+
{
|
|
129
|
+
code: `
|
|
130
|
+
<iframe
|
|
131
|
+
name="embeddedExternalPayment"
|
|
132
|
+
ref="embeddedExternalPayment"
|
|
133
|
+
style={iframeStyle}
|
|
134
|
+
onLoad={this.handleLoadIframe}
|
|
135
|
+
/>
|
|
136
|
+
`,
|
|
137
|
+
},
|
|
138
|
+
{ code: '<img {...props} onError={() => {}} />;' },
|
|
139
|
+
{ code: '<img onLoad={() => {}} />;' },
|
|
140
|
+
{ code: '<img src={currentPhoto.imageUrl} onLoad={this.handleImageLoad} alt="for review" />' },
|
|
141
|
+
{
|
|
142
|
+
code: `
|
|
143
|
+
<img
|
|
144
|
+
ref={this.ref}
|
|
145
|
+
className="c-responsive-image-placeholder__image"
|
|
146
|
+
src={src}
|
|
147
|
+
alt={alt}
|
|
148
|
+
data-test-id="test-id"
|
|
149
|
+
onLoad={this.fetchCompleteImage}
|
|
150
|
+
/>
|
|
151
|
+
`,
|
|
152
|
+
},
|
|
153
|
+
{ code: '<kbd onClick={() => {}} />;' },
|
|
154
|
+
{ code: '<keygen onClick={() => {}} />;' },
|
|
155
|
+
{ code: '<link onClick={() => {}} />;' },
|
|
156
|
+
{ code: '<main onClick={null} />;' },
|
|
157
|
+
{ code: '<map onClick={() => {}} />;' },
|
|
158
|
+
{ code: '<meta onClick={() => {}} />;' },
|
|
159
|
+
{ code: '<noembed onClick={() => {}} />;' },
|
|
160
|
+
{ code: '<noscript onClick={() => {}} />;' },
|
|
161
|
+
{ code: '<object onClick={() => {}} />;' },
|
|
162
|
+
{ code: '<param onClick={() => {}} />;' },
|
|
163
|
+
{ code: '<picture onClick={() => {}} />;' },
|
|
164
|
+
{ code: '<q onClick={() => {}} />;' },
|
|
165
|
+
{ code: '<rp onClick={() => {}} />;' },
|
|
166
|
+
{ code: '<rt onClick={() => {}} />;' },
|
|
167
|
+
{ code: '<rtc onClick={() => {}} />;' },
|
|
168
|
+
{ code: '<s onClick={() => {}} />;' },
|
|
169
|
+
{ code: '<samp onClick={() => {}} />;' },
|
|
170
|
+
{ code: '<script onClick={() => {}} />;' },
|
|
171
|
+
{ code: '<section onClick={() => {}} />;' },
|
|
172
|
+
{ code: '<small onClick={() => {}} />;' },
|
|
173
|
+
{ code: '<source onClick={() => {}} />;' },
|
|
174
|
+
{ code: '<spacer onClick={() => {}} />;' },
|
|
175
|
+
{ code: '<span onClick={() => {}} />;' },
|
|
176
|
+
{ code: '<strike onClick={() => {}} />;' },
|
|
177
|
+
{ code: '<style onClick={() => {}} />;' },
|
|
178
|
+
{ code: '<summary onClick={() => {}} />;' },
|
|
179
|
+
{ code: '<th onClick={() => {}} />;' },
|
|
180
|
+
{ code: '<title onClick={() => {}} />;' },
|
|
181
|
+
{ code: '<track onClick={() => {}} />;' },
|
|
182
|
+
{ code: '<td onClick={() => {}} />;' },
|
|
183
|
+
{ code: '<tt onClick={() => {}} />;' },
|
|
184
|
+
{ code: '<u onClick={() => {}} />;' },
|
|
185
|
+
{ code: '<var onClick={() => {}} />;' },
|
|
186
|
+
{ code: '<video onClick={() => {}} />;' },
|
|
187
|
+
{ code: '<wbr onClick={() => {}} />;' },
|
|
188
|
+
{ code: '<xmp onClick={() => {}} />;' },
|
|
189
|
+
/* HTML elements attributed with an interactive role */
|
|
190
|
+
{ code: '<div role="button" onClick={() => {}} />;' },
|
|
191
|
+
{ code: '<div role="checkbox" onClick={() => {}} />;' },
|
|
192
|
+
{ code: '<div role="columnheader" onClick={() => {}} />;' },
|
|
193
|
+
{ code: '<div role="combobox" onClick={() => {}} />;' },
|
|
194
|
+
{ code: '<div role="grid" onClick={() => {}} />;' },
|
|
195
|
+
{ code: '<div role="gridcell" onClick={() => {}} />;' },
|
|
196
|
+
{ code: '<div role="link" onClick={() => {}} />;' },
|
|
197
|
+
{ code: '<div role="listbox" onClick={() => {}} />;' },
|
|
198
|
+
{ code: '<div role="menu" onClick={() => {}} />;' },
|
|
199
|
+
{ code: '<div role="menubar" onClick={() => {}} />;' },
|
|
200
|
+
{ code: '<div role="menuitem" onClick={() => {}} />;' },
|
|
201
|
+
{ code: '<div role="menuitemcheckbox" onClick={() => {}} />;' },
|
|
202
|
+
{ code: '<div role="menuitemradio" onClick={() => {}} />;' },
|
|
203
|
+
{ code: '<div role="option" onClick={() => {}} />;' },
|
|
204
|
+
{ code: '<div role="progressbar" onClick={() => {}} />;' },
|
|
205
|
+
{ code: '<div role="radio" onClick={() => {}} />;' },
|
|
206
|
+
{ code: '<div role="radiogroup" onClick={() => {}} />;' },
|
|
207
|
+
{ code: '<div role="row" onClick={() => {}} />;' },
|
|
208
|
+
{ code: '<div role="rowheader" onClick={() => {}} />;' },
|
|
209
|
+
{ code: '<div role="scrollbar" onClick={() => {}} />;' },
|
|
210
|
+
{ code: '<div role="searchbox" onClick={() => {}} />;' },
|
|
211
|
+
{ code: '<div role="slider" onClick={() => {}} />;' },
|
|
212
|
+
{ code: '<div role="spinbutton" onClick={() => {}} />;' },
|
|
213
|
+
{ code: '<div role="switch" onClick={() => {}} />;' },
|
|
214
|
+
{ code: '<div role="tab" onClick={() => {}} />;' },
|
|
215
|
+
{ code: '<div role="textbox" onClick={() => {}} />;' },
|
|
216
|
+
{ code: '<div role="treeitem" onClick={() => {}} />;' },
|
|
217
|
+
/* Presentation is a special case role that indicates intentional static semantics */
|
|
218
|
+
{ code: '<div role="presentation" onClick={() => {}} />;' },
|
|
219
|
+
/* HTML elements attributed with an abstract role */
|
|
220
|
+
{ code: '<div role="command" onClick={() => {}} />;' },
|
|
221
|
+
{ code: '<div role="composite" onClick={() => {}} />;' },
|
|
222
|
+
{ code: '<div role="input" onClick={() => {}} />;' },
|
|
223
|
+
{ code: '<div role="landmark" onClick={() => {}} />;' },
|
|
224
|
+
{ code: '<div role="range" onClick={() => {}} />;' },
|
|
225
|
+
{ code: '<div role="roletype" onClick={() => {}} />;' },
|
|
226
|
+
{ code: '<div role="sectionhead" onClick={() => {}} />;' },
|
|
227
|
+
{ code: '<div role="select" onClick={() => {}} />;' },
|
|
228
|
+
{ code: '<div role="structure" onClick={() => {}} />;' },
|
|
229
|
+
{ code: '<div role="tablist" onClick={() => {}} />;' },
|
|
230
|
+
{ code: '<div role="toolbar" onClick={() => {}} />;' },
|
|
231
|
+
{ code: '<div role="tree" onClick={() => {}} />;' },
|
|
232
|
+
{ code: '<div role="treegrid" onClick={() => {}} />;' },
|
|
233
|
+
{ code: '<div role="widget" onClick={() => {}} />;' },
|
|
234
|
+
{ code: '<div role="window" onClick={() => {}} />;' },
|
|
235
|
+
// All the possible handlers
|
|
236
|
+
{ code: '<div role="article" onCopy={() => {}} />;' },
|
|
237
|
+
{ code: '<div role="article" onCut={() => {}} />;' },
|
|
238
|
+
{ code: '<div role="article" onPaste={() => {}} />;' },
|
|
239
|
+
{ code: '<div role="article" onCompositionEnd={() => {}} />;' },
|
|
240
|
+
{ code: '<div role="article" onCompositionStart={() => {}} />;' },
|
|
241
|
+
{ code: '<div role="article" onCompositionUpdate={() => {}} />;' },
|
|
242
|
+
{ code: '<div role="article" onChange={() => {}} />;' },
|
|
243
|
+
{ code: '<div role="article" onInput={() => {}} />;' },
|
|
244
|
+
{ code: '<div role="article" onSubmit={() => {}} />;' },
|
|
245
|
+
{ code: '<div role="article" onSelect={() => {}} />;' },
|
|
246
|
+
{ code: '<div role="article" onTouchCancel={() => {}} />;' },
|
|
247
|
+
{ code: '<div role="article" onTouchEnd={() => {}} />;' },
|
|
248
|
+
{ code: '<div role="article" onTouchMove={() => {}} />;' },
|
|
249
|
+
{ code: '<div role="article" onTouchStart={() => {}} />;' },
|
|
250
|
+
{ code: '<div role="article" onScroll={() => {}} />;' },
|
|
251
|
+
{ code: '<div role="article" onWheel={() => {}} />;' },
|
|
252
|
+
{ code: '<div role="article" onAbort={() => {}} />;' },
|
|
253
|
+
{ code: '<div role="article" onCanPlay={() => {}} />;' },
|
|
254
|
+
{ code: '<div role="article" onCanPlayThrough={() => {}} />;' },
|
|
255
|
+
{ code: '<div role="article" onDurationChange={() => {}} />;' },
|
|
256
|
+
{ code: '<div role="article" onEmptied={() => {}} />;' },
|
|
257
|
+
{ code: '<div role="article" onEncrypted={() => {}} />;' },
|
|
258
|
+
{ code: '<div role="article" onEnded={() => {}} />;' },
|
|
259
|
+
{ code: '<div role="article" onLoadedData={() => {}} />;' },
|
|
260
|
+
{ code: '<div role="article" onLoadedMetadata={() => {}} />;' },
|
|
261
|
+
{ code: '<div role="article" onLoadStart={() => {}} />;' },
|
|
262
|
+
{ code: '<div role="article" onPause={() => {}} />;' },
|
|
263
|
+
{ code: '<div role="article" onPlay={() => {}} />;' },
|
|
264
|
+
{ code: '<div role="article" onPlaying={() => {}} />;' },
|
|
265
|
+
{ code: '<div role="article" onProgress={() => {}} />;' },
|
|
266
|
+
{ code: '<div role="article" onRateChange={() => {}} />;' },
|
|
267
|
+
{ code: '<div role="article" onSeeked={() => {}} />;' },
|
|
268
|
+
{ code: '<div role="article" onSeeking={() => {}} />;' },
|
|
269
|
+
{ code: '<div role="article" onStalled={() => {}} />;' },
|
|
270
|
+
{ code: '<div role="article" onSuspend={() => {}} />;' },
|
|
271
|
+
{ code: '<div role="article" onTimeUpdate={() => {}} />;' },
|
|
272
|
+
{ code: '<div role="article" onVolumeChange={() => {}} />;' },
|
|
273
|
+
{ code: '<div role="article" onWaiting={() => {}} />;' },
|
|
274
|
+
{ code: '<div role="article" onAnimationStart={() => {}} />;' },
|
|
275
|
+
{ code: '<div role="article" onAnimationEnd={() => {}} />;' },
|
|
276
|
+
{ code: '<div role="article" onAnimationIteration={() => {}} />;' },
|
|
277
|
+
{ code: '<div role="article" onTransitionEnd={() => {}} />;' },
|
|
278
|
+
];
|
|
279
|
+
|
|
280
|
+
const neverValid = [
|
|
281
|
+
/* HTML elements with an inherent, non-interactive role */
|
|
282
|
+
{ code: '<main onClick={() => void 0} />;', errors: [expectedError] },
|
|
283
|
+
{ code: '<address onClick={() => {}} />;', errors: [expectedError] },
|
|
284
|
+
{ code: '<article onClick={() => {}} />;', errors: [expectedError] },
|
|
285
|
+
{ code: '<aside onClick={() => {}} />;', errors: [expectedError] },
|
|
286
|
+
{ code: '<blockquote onClick={() => {}} />;', errors: [expectedError] },
|
|
287
|
+
{ code: '<br onClick={() => {}} />;', errors: [expectedError] },
|
|
288
|
+
{ code: '<caption onClick={() => {}} />;', errors: [expectedError] },
|
|
289
|
+
{ code: '<code onClick={() => {}} />;', errors: [expectedError] },
|
|
290
|
+
{ code: '<dd onClick={() => {}} />;', errors: [expectedError] },
|
|
291
|
+
{ code: '<del onClick={() => {}} />;', errors: [expectedError] },
|
|
292
|
+
{ code: '<details onClick={() => {}} />;', errors: [expectedError] },
|
|
293
|
+
{ code: '<dfn onClick={() => {}} />;', errors: [expectedError] },
|
|
294
|
+
{ code: '<dl onClick={() => {}} />;', errors: [expectedError] },
|
|
295
|
+
{ code: '<dir onClick={() => {}} />;', errors: [expectedError] },
|
|
296
|
+
{ code: '<dt onClick={() => {}} />;', errors: [expectedError] },
|
|
297
|
+
{ code: '<em onClick={() => {}} />;', errors: [expectedError] },
|
|
298
|
+
{ code: '<fieldset onClick={() => {}} />;', errors: [expectedError] },
|
|
299
|
+
{ code: '<figcaption onClick={() => {}} />;', errors: [expectedError] },
|
|
300
|
+
{ code: '<figure onClick={() => {}} />;', errors: [expectedError] },
|
|
301
|
+
{ code: '<footer onClick={() => {}} />;', errors: [expectedError] },
|
|
302
|
+
{ code: '<form onClick={() => {}} />;', errors: [expectedError] },
|
|
303
|
+
{ code: '<h1 onClick={() => {}} />;', errors: [expectedError] },
|
|
304
|
+
{ code: '<h2 onClick={() => {}} />;', errors: [expectedError] },
|
|
305
|
+
{ code: '<h3 onClick={() => {}} />;', errors: [expectedError] },
|
|
306
|
+
{ code: '<h4 onClick={() => {}} />;', errors: [expectedError] },
|
|
307
|
+
{ code: '<h5 onClick={() => {}} />;', errors: [expectedError] },
|
|
308
|
+
{ code: '<h6 onClick={() => {}} />;', errors: [expectedError] },
|
|
309
|
+
{ code: '<hr onClick={() => {}} />;', errors: [expectedError] },
|
|
310
|
+
{ code: '<html onClick={() => {}} />;', errors: [expectedError] },
|
|
311
|
+
{ code: '<iframe onClick={() => {}} />;', errors: [expectedError] },
|
|
312
|
+
{ code: '<img onClick={() => {}} />;', errors: [expectedError] },
|
|
313
|
+
{ code: '<ins onClick={() => {}} />;', errors: [expectedError] },
|
|
314
|
+
{ code: '<label onClick={() => {}} />;', errors: [expectedError] },
|
|
315
|
+
{ code: '<legend onClick={() => {}} />;', errors: [expectedError] },
|
|
316
|
+
{ code: '<li onClick={() => {}} />;', errors: [expectedError] },
|
|
317
|
+
{ code: '<mark onClick={() => {}} />;', errors: [expectedError] },
|
|
318
|
+
{ code: '<marquee onClick={() => {}} />;', errors: [expectedError] },
|
|
319
|
+
{ code: '<menu onClick={() => {}} />;', errors: [expectedError] },
|
|
320
|
+
{ code: '<meter onClick={() => {}} />;', errors: [expectedError] },
|
|
321
|
+
{ code: '<nav onClick={() => {}} />;', errors: [expectedError] },
|
|
322
|
+
{ code: '<ol onClick={() => {}} />;', errors: [expectedError] },
|
|
323
|
+
{ code: '<optgroup onClick={() => {}} />;', errors: [expectedError] },
|
|
324
|
+
{ code: '<output onClick={() => {}} />;', errors: [expectedError] },
|
|
325
|
+
{ code: '<p onClick={() => {}} />;', errors: [expectedError] },
|
|
326
|
+
{ code: '<pre onClick={() => {}} />;', errors: [expectedError] },
|
|
327
|
+
{ code: '<progress onClick={() => {}} />;', errors: [expectedError] },
|
|
328
|
+
{ code: '<ruby onClick={() => {}} />;', errors: [expectedError] },
|
|
329
|
+
{ code: '<section onClick={() => {}} aria-label="Aardvark" />;', errors: [expectedError] },
|
|
330
|
+
{ code: '<section onClick={() => {}} aria-labelledby="js_1" />;', errors: [expectedError] },
|
|
331
|
+
{ code: '<strong onClick={() => {}} />;', errors: [expectedError] },
|
|
332
|
+
{ code: '<sub onClick={() => {}} />;', errors: [expectedError] },
|
|
333
|
+
{ code: '<sup onClick={() => {}} />;', errors: [expectedError] },
|
|
334
|
+
{ code: '<table onClick={() => {}} />;', errors: [expectedError] },
|
|
335
|
+
{ code: '<tbody onClick={() => {}} />;', errors: [expectedError] },
|
|
336
|
+
{ code: '<tfoot onClick={() => {}} />;', errors: [expectedError] },
|
|
337
|
+
{ code: '<thead onClick={() => {}} />;', errors: [expectedError] },
|
|
338
|
+
{ code: '<time onClick={() => {}} />;', errors: [expectedError] },
|
|
339
|
+
{ code: '<ul onClick={() => {}} />;', errors: [expectedError] },
|
|
340
|
+
{ code: '<ul contentEditable="false" onClick={() => {}} />;', errors: [expectedError] },
|
|
341
|
+
{ code: '<article contentEditable onClick={() => {}} />;', errors: [expectedError] },
|
|
342
|
+
{ code: '<div contentEditable role="article" onKeyDown={() => {}} />;', errors: [expectedError] },
|
|
343
|
+
/* HTML elements attributed with a non-interactive role */
|
|
344
|
+
{ code: '<div role="alert" onClick={() => {}} />;', errors: [expectedError] },
|
|
345
|
+
{ code: '<div role="alertdialog" onClick={() => {}} />;', errors: [expectedError] },
|
|
346
|
+
{ code: '<div role="application" onClick={() => {}} />;', errors: [expectedError] },
|
|
347
|
+
{ code: '<div role="banner" onClick={() => {}} />;', errors: [expectedError] },
|
|
348
|
+
{ code: '<div role="cell" onClick={() => {}} />;', errors: [expectedError] },
|
|
349
|
+
{ code: '<div role="complementary" onClick={() => {}} />;', errors: [expectedError] },
|
|
350
|
+
{ code: '<div role="contentinfo" onClick={() => {}} />;', errors: [expectedError] },
|
|
351
|
+
{ code: '<div role="definition" onClick={() => {}} />;', errors: [expectedError] },
|
|
352
|
+
{ code: '<div role="dialog" onClick={() => {}} />;', errors: [expectedError] },
|
|
353
|
+
{ code: '<div role="directory" onClick={() => {}} />;', errors: [expectedError] },
|
|
354
|
+
{ code: '<div role="document" onClick={() => {}} />;', errors: [expectedError] },
|
|
355
|
+
{ code: '<div role="feed" onClick={() => {}} />;', errors: [expectedError] },
|
|
356
|
+
{ code: '<div role="figure" onClick={() => {}} />;', errors: [expectedError] },
|
|
357
|
+
{ code: '<div role="form" onClick={() => {}} />;', errors: [expectedError] },
|
|
358
|
+
{ code: '<div role="group" onClick={() => {}} />;', errors: [expectedError] },
|
|
359
|
+
{ code: '<div role="heading" onClick={() => {}} />;', errors: [expectedError] },
|
|
360
|
+
{ code: '<div role="img" onClick={() => {}} />;', errors: [expectedError] },
|
|
361
|
+
{ code: '<div role="list" onClick={() => {}} />;', errors: [expectedError] },
|
|
362
|
+
{ code: '<div role="listitem" onClick={() => {}} />;', errors: [expectedError] },
|
|
363
|
+
{ code: '<div role="log" onClick={() => {}} />;', errors: [expectedError] },
|
|
364
|
+
{ code: '<div role="main" onClick={() => {}} />;', errors: [expectedError] },
|
|
365
|
+
{ code: '<div role="marquee" onClick={() => {}} />;', errors: [expectedError] },
|
|
366
|
+
{ code: '<div role="math" onClick={() => {}} />;', errors: [expectedError] },
|
|
367
|
+
{ code: '<div role="navigation" onClick={() => {}} />;', errors: [expectedError] },
|
|
368
|
+
{ code: '<div role="note" onClick={() => {}} />;', errors: [expectedError] },
|
|
369
|
+
{ code: '<div role="region" onClick={() => {}} />;', errors: [expectedError] },
|
|
370
|
+
{ code: '<div role="rowgroup" onClick={() => {}} />;', errors: [expectedError] },
|
|
371
|
+
{ code: '<div role="search" onClick={() => {}} />;', errors: [expectedError] },
|
|
372
|
+
{ code: '<div role="separator" onClick={() => {}} />;', errors: [expectedError] },
|
|
373
|
+
{ code: '<div role="status" onClick={() => {}} />;', errors: [expectedError] },
|
|
374
|
+
{ code: '<div role="table" onClick={() => {}} />;', errors: [expectedError] },
|
|
375
|
+
{ code: '<div role="tabpanel" onClick={() => {}} />;', errors: [expectedError] },
|
|
376
|
+
{ code: '<div role="term" onClick={() => {}} />;', errors: [expectedError] },
|
|
377
|
+
{ code: '<div role="timer" onClick={() => {}} />;', errors: [expectedError] },
|
|
378
|
+
{ code: '<div role="tooltip" onClick={() => {}} />;', errors: [expectedError] },
|
|
379
|
+
// Handlers
|
|
380
|
+
{ code: '<div role="article" onKeyDown={() => {}} />;', errors: [expectedError] },
|
|
381
|
+
{ code: '<div role="article" onKeyPress={() => {}} />;', errors: [expectedError] },
|
|
382
|
+
{ code: '<div role="article" onKeyUp={() => {}} />;', errors: [expectedError] },
|
|
383
|
+
{ code: '<div role="article" onClick={() => {}} />;', errors: [expectedError] },
|
|
384
|
+
{ code: '<div role="article" onLoad={() => {}} />;', errors: [expectedError] },
|
|
385
|
+
{ code: '<div role="article" onError={() => {}} />;', errors: [expectedError] },
|
|
386
|
+
{ code: '<div role="article" onMouseDown={() => {}} />;', errors: [expectedError] },
|
|
387
|
+
{ code: '<div role="article" onMouseUp={() => {}} />;', errors: [expectedError] },
|
|
388
|
+
// Custom component
|
|
389
|
+
{
|
|
390
|
+
code: '<Image onClick={() => void 0} />;',
|
|
391
|
+
errors: [expectedError],
|
|
392
|
+
settings: { 'jsx-a11y': { components: { Image: 'img' } } },
|
|
393
|
+
},
|
|
394
|
+
];
|
|
395
|
+
|
|
396
|
+
const recommendedOptions = configs.recommended.rules[`jsx-a11y/${ruleName}`][1] || {};
|
|
397
|
+
ruleTester.run(`${ruleName}:recommended`, rule, {
|
|
398
|
+
valid: parsers.all([].concat(
|
|
399
|
+
...alwaysValid,
|
|
400
|
+
// All the possible handlers
|
|
401
|
+
{ code: '<div role="article" onCopy={() => {}} />;' },
|
|
402
|
+
{ code: '<div role="article" onCut={() => {}} />;' },
|
|
403
|
+
{ code: '<div role="article" onPaste={() => {}} />;' },
|
|
404
|
+
{ code: '<div role="article" onCompositionEnd={() => {}} />;' },
|
|
405
|
+
{ code: '<div role="article" onCompositionStart={() => {}} />;' },
|
|
406
|
+
{ code: '<div role="article" onCompositionUpdate={() => {}} />;' },
|
|
407
|
+
{ code: '<div role="article" onFocus={() => {}} />;' },
|
|
408
|
+
{ code: '<div role="article" onBlur={() => {}} />;' },
|
|
409
|
+
{ code: '<div role="article" onChange={() => {}} />;' },
|
|
410
|
+
{ code: '<div role="article" onInput={() => {}} />;' },
|
|
411
|
+
{ code: '<div role="article" onSubmit={() => {}} />;' },
|
|
412
|
+
{ code: '<div role="article" onContextMenu={() => {}} />;' },
|
|
413
|
+
{ code: '<div role="article" onDblClick={() => {}} />;' },
|
|
414
|
+
{ code: '<div role="article" onDoubleClick={() => {}} />;' },
|
|
415
|
+
{ code: '<div role="article" onDrag={() => {}} />;' },
|
|
416
|
+
{ code: '<div role="article" onDragEnd={() => {}} />;' },
|
|
417
|
+
{ code: '<div role="article" onDragEnter={() => {}} />;' },
|
|
418
|
+
{ code: '<div role="article" onDragExit={() => {}} />;' },
|
|
419
|
+
{ code: '<div role="article" onDragLeave={() => {}} />;' },
|
|
420
|
+
{ code: '<div role="article" onDragOver={() => {}} />;' },
|
|
421
|
+
{ code: '<div role="article" onDragStart={() => {}} />;' },
|
|
422
|
+
{ code: '<div role="article" onDrop={() => {}} />;' },
|
|
423
|
+
{ code: '<div role="article" onMouseEnter={() => {}} />;' },
|
|
424
|
+
{ code: '<div role="article" onMouseLeave={() => {}} />;' },
|
|
425
|
+
{ code: '<div role="article" onMouseMove={() => {}} />;' },
|
|
426
|
+
{ code: '<div role="article" onMouseOut={() => {}} />;' },
|
|
427
|
+
{ code: '<div role="article" onMouseOver={() => {}} />;' },
|
|
428
|
+
{ code: '<div role="article" onSelect={() => {}} />;' },
|
|
429
|
+
{ code: '<div role="article" onTouchCancel={() => {}} />;' },
|
|
430
|
+
{ code: '<div role="article" onTouchEnd={() => {}} />;' },
|
|
431
|
+
{ code: '<div role="article" onTouchMove={() => {}} />;' },
|
|
432
|
+
{ code: '<div role="article" onTouchStart={() => {}} />;' },
|
|
433
|
+
{ code: '<div role="article" onScroll={() => {}} />;' },
|
|
434
|
+
{ code: '<div role="article" onWheel={() => {}} />;' },
|
|
435
|
+
{ code: '<div role="article" onAbort={() => {}} />;' },
|
|
436
|
+
{ code: '<div role="article" onCanPlay={() => {}} />;' },
|
|
437
|
+
{ code: '<div role="article" onCanPlayThrough={() => {}} />;' },
|
|
438
|
+
{ code: '<div role="article" onDurationChange={() => {}} />;' },
|
|
439
|
+
{ code: '<div role="article" onEmptied={() => {}} />;' },
|
|
440
|
+
{ code: '<div role="article" onEncrypted={() => {}} />;' },
|
|
441
|
+
{ code: '<div role="article" onEnded={() => {}} />;' },
|
|
442
|
+
{ code: '<div role="article" onLoadedData={() => {}} />;' },
|
|
443
|
+
{ code: '<div role="article" onLoadedMetadata={() => {}} />;' },
|
|
444
|
+
{ code: '<div role="article" onLoadStart={() => {}} />;' },
|
|
445
|
+
{ code: '<div role="article" onPause={() => {}} />;' },
|
|
446
|
+
{ code: '<div role="article" onPlay={() => {}} />;' },
|
|
447
|
+
{ code: '<div role="article" onPlaying={() => {}} />;' },
|
|
448
|
+
{ code: '<div role="article" onProgress={() => {}} />;' },
|
|
449
|
+
{ code: '<div role="article" onRateChange={() => {}} />;' },
|
|
450
|
+
{ code: '<div role="article" onSeeked={() => {}} />;' },
|
|
451
|
+
{ code: '<div role="article" onSeeking={() => {}} />;' },
|
|
452
|
+
{ code: '<div role="article" onStalled={() => {}} />;' },
|
|
453
|
+
{ code: '<div role="article" onSuspend={() => {}} />;' },
|
|
454
|
+
{ code: '<div role="article" onTimeUpdate={() => {}} />;' },
|
|
455
|
+
{ code: '<div role="article" onVolumeChange={() => {}} />;' },
|
|
456
|
+
{ code: '<div role="article" onWaiting={() => {}} />;' },
|
|
457
|
+
{ code: '<div role="article" onAnimationStart={() => {}} />;' },
|
|
458
|
+
{ code: '<div role="article" onAnimationEnd={() => {}} />;' },
|
|
459
|
+
{ code: '<div role="article" onAnimationIteration={() => {}} />;' },
|
|
460
|
+
{ code: '<div role="article" onTransitionEnd={() => {}} />;' },
|
|
461
|
+
))
|
|
462
|
+
.map(ruleOptionsMapperFactory(recommendedOptions))
|
|
463
|
+
.map(parserOptionsMapper),
|
|
464
|
+
invalid: parsers.all([].concat(
|
|
465
|
+
...neverValid,
|
|
466
|
+
))
|
|
467
|
+
.map(ruleOptionsMapperFactory(recommendedOptions))
|
|
468
|
+
.map(parserOptionsMapper),
|
|
469
|
+
});
|
|
470
|
+
|
|
471
|
+
const strictOptions = configs.strict.rules[`jsx-a11y/${ruleName}`][1] || {};
|
|
472
|
+
ruleTester.run(`${ruleName}:strict`, rule, {
|
|
473
|
+
valid: parsers.all([].concat(
|
|
474
|
+
...alwaysValid,
|
|
475
|
+
))
|
|
476
|
+
.map(ruleOptionsMapperFactory(strictOptions))
|
|
477
|
+
.map(parserOptionsMapper),
|
|
478
|
+
invalid: parsers.all([].concat(
|
|
479
|
+
...neverValid,
|
|
480
|
+
// All the possible handlers
|
|
481
|
+
{ code: '<div role="article" onFocus={() => {}} />;', errors: [expectedError] },
|
|
482
|
+
{ code: '<div role="article" onBlur={() => {}} />;', errors: [expectedError] },
|
|
483
|
+
{ code: '<div role="article" onContextMenu={() => {}} />;', errors: [expectedError] },
|
|
484
|
+
{ code: '<div role="article" onDblClick={() => {}} />;', errors: [expectedError] },
|
|
485
|
+
{ code: '<div role="article" onDoubleClick={() => {}} />;', errors: [expectedError] },
|
|
486
|
+
{ code: '<div role="article" onDrag={() => {}} />;', errors: [expectedError] },
|
|
487
|
+
{ code: '<div role="article" onDragEnd={() => {}} />;', errors: [expectedError] },
|
|
488
|
+
{ code: '<div role="article" onDragEnter={() => {}} />;', errors: [expectedError] },
|
|
489
|
+
{ code: '<div role="article" onDragExit={() => {}} />;', errors: [expectedError] },
|
|
490
|
+
{ code: '<div role="article" onDragLeave={() => {}} />;', errors: [expectedError] },
|
|
491
|
+
{ code: '<div role="article" onDragOver={() => {}} />;', errors: [expectedError] },
|
|
492
|
+
{ code: '<div role="article" onDragStart={() => {}} />;', errors: [expectedError] },
|
|
493
|
+
{ code: '<div role="article" onDrop={() => {}} />;', errors: [expectedError] },
|
|
494
|
+
{ code: '<div role="article" onMouseEnter={() => {}} />;', errors: [expectedError] },
|
|
495
|
+
{ code: '<div role="article" onMouseLeave={() => {}} />;', errors: [expectedError] },
|
|
496
|
+
{ code: '<div role="article" onMouseMove={() => {}} />;', errors: [expectedError] },
|
|
497
|
+
{ code: '<div role="article" onMouseOut={() => {}} />;', errors: [expectedError] },
|
|
498
|
+
{ code: '<div role="article" onMouseOver={() => {}} />;', errors: [expectedError] },
|
|
499
|
+
))
|
|
500
|
+
.map(ruleOptionsMapperFactory(strictOptions))
|
|
501
|
+
.map(parserOptionsMapper),
|
|
502
|
+
});
|