testilo 3.2.0 → 3.4.0
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/README.md +33 -3
- package/compare.js +8 -8
- package/package.json +1 -1
- package/procs/compare/cp0/index.html +10 -5
- package/procs/compare/cp0/index.js +2 -4
- package/procs/compare/cp1/index.html +46 -0
- package/procs/compare/cp1/index.js +71 -0
- package/procs/digest/dp10a/index.html +3 -3
- package/procs/digest/dp10b/index.html +74 -0
- package/procs/digest/dp10b/index.js +130 -0
- package/procs/digest/dp10c/index.html +55 -0
- package/procs/digest/dp10c/index.js +129 -0
- package/procs/score/sp10b.js +507 -0
- package/procs/score/sp10c.js +465 -0
- package/reports/comparative/railsites.html +47 -0
- package/reports/comparative/style.css +4 -0
- package/reports/digested/35k1r-railpass.html +1130 -844
- package/reports/digested/3aee6-eurail.html +36233 -0
- package/reports/digested/dp10a/35k1r-railpass.html +9302 -0
- package/reports/digested/dp10a/3aee6-eurail.html +35782 -0
- package/reports/digested/style.css +2 -2
- package/reports/raw/3aee6-eurail.json +35250 -0
- package/reports/scored/35k1r-railpass.json +559 -175
- package/reports/scored/3aee6-eurail.json +35957 -0
- package/score.js +1 -1
- package/scoring/data/duplications.json +22 -22
- package/scoring/data/groups.json +335 -0
- package/scoring/data/packageRules/alfa.tsv +82 -0
- package/scoring/data/packageRules/axe.js +390 -0
- package/scoring/data/packageRules/ibm.tsv +159 -0
- package/scoring/data/packageRules/tenon.tsv +14 -0
- package/scoring/data/packageRules/wave.json +1617 -0
- package/scoring/data/packageRules/wave.tsv +55 -0
- package/scoring/data/testGroups.json +1067 -0
- package/scoring/{data → procs}/correlation.js +0 -0
- package/scoring/{data → procs}/dupCounts.js +0 -0
- package/scoring/procs/groups.js +61 -0
- package/scoring/{data → procs}/packageData.js +0 -0
- package/scoring/{data → procs}/packageIssues.js +0 -0
- package/scoring/procs/regroup.js +39 -0
- package/reports/comparative/35k1r-.html +0 -41
package/score.js
CHANGED
|
@@ -30,7 +30,7 @@ const score = async () => {
|
|
|
30
30
|
const reportJSON = await fs
|
|
31
31
|
.readFile(`${reportDirRawAbs}/${fileName}`, 'utf8');
|
|
32
32
|
const report = JSON.parse(reportJSON);
|
|
33
|
-
scorer(report);
|
|
33
|
+
await scorer(report);
|
|
34
34
|
report.score.scoreProcID = scoreProcID;
|
|
35
35
|
const scoredReportJSON = JSON.stringify(report, null, 2);
|
|
36
36
|
await fs.writeFile(`${__dirname}/${reportDirScored}/${fileName}`, `${scoredReportJSON}\n`);
|
|
@@ -1,75 +1,75 @@
|
|
|
1
1
|
{
|
|
2
2
|
"aatt_alfa": {
|
|
3
|
-
"e:F77": {
|
|
3
|
+
"e:F77 Duplicate id attribute value": {
|
|
4
4
|
"r3": "0.89 (253)"
|
|
5
5
|
},
|
|
6
|
-
"e:H36": {
|
|
6
|
+
"e:H36 Image submit button missing an alt attribute": {
|
|
7
7
|
"r28": "0.98 (6)"
|
|
8
8
|
},
|
|
9
|
-
"e:H37": {
|
|
9
|
+
"e:H37 Img element missing an alt attribute": {
|
|
10
10
|
"r2": "0.72 (221)"
|
|
11
11
|
},
|
|
12
|
-
"e:H57": {
|
|
12
|
+
"e:H57 lang attribute of the document element": {
|
|
13
13
|
"r4": "0.81 (66)"
|
|
14
14
|
},
|
|
15
|
-
"e:H58": {
|
|
15
|
+
"e:H58 change in language is marked": {
|
|
16
16
|
"r7": "0.82 (5)"
|
|
17
17
|
},
|
|
18
|
-
"w:G141": {
|
|
18
|
+
"w:G141 heading structure is not logically nested": {
|
|
19
19
|
"r53": "0.89 (427)"
|
|
20
20
|
},
|
|
21
|
-
"w:H98": {
|
|
21
|
+
"w:H98 autocomplete attribute": {
|
|
22
22
|
"r10": "0.95 (3)"
|
|
23
23
|
}
|
|
24
24
|
},
|
|
25
25
|
"aatt_axe": {
|
|
26
|
-
"e:H36": {
|
|
26
|
+
"e:H36 Image submit button missing an alt attribute": {
|
|
27
27
|
"input-image-alt": "0.98 (6)"
|
|
28
28
|
},
|
|
29
|
-
"e:H57": {
|
|
29
|
+
"e:H57 lang attribute of the document element": {
|
|
30
30
|
"html-has-lang": "0.73 (75)"
|
|
31
31
|
},
|
|
32
|
-
"e:H58": {
|
|
32
|
+
"e:H58 change in language is marked": {
|
|
33
33
|
"valid-lang": "0.82 (5)"
|
|
34
34
|
},
|
|
35
|
-
"w:G141": {
|
|
35
|
+
"w:G141 heading structure is not logically nested": {
|
|
36
36
|
"heading-order": "0.79 (515)"
|
|
37
37
|
}
|
|
38
38
|
},
|
|
39
39
|
"aatt_ibm": {
|
|
40
|
-
"e:ARIA6+H53": {
|
|
40
|
+
"e:ARIA6+H53 Object elements must contain a text alternative": {
|
|
41
41
|
"v:WCAG20_Object_HasText": "1.00 (6)"
|
|
42
42
|
},
|
|
43
|
-
"e:H24": {
|
|
43
|
+
"e:H24 Area element in an image map missing an alt attribute": {
|
|
44
44
|
"v:WCAG20_Area_HasAlt": "0.79 (4)"
|
|
45
45
|
},
|
|
46
|
-
"e:H36": {
|
|
46
|
+
"e:H36 Image submit button missing an alt attribute": {
|
|
47
47
|
"v:WCAG20_Input_ExplicitLabelImage": "0.98 (6)"
|
|
48
48
|
}
|
|
49
49
|
},
|
|
50
50
|
"aatt_wave": {
|
|
51
|
-
"e:G1+G123+G124": {
|
|
51
|
+
"e:G1+G123+G124 common navigation elements can be bypassed": {
|
|
52
52
|
"a:link_internal_broken": "0.94 (109)"
|
|
53
53
|
},
|
|
54
|
-
"e:H24": {
|
|
54
|
+
"e:H24 Area element in an image map missing an alt attribute": {
|
|
55
55
|
"e:alt_area_missing": "0.73 (5)"
|
|
56
56
|
},
|
|
57
|
-
"e:H36": {
|
|
57
|
+
"e:H36 Image submit button missing an alt attribute": {
|
|
58
58
|
"e:alt_input_missing": "0.91 (7)"
|
|
59
59
|
},
|
|
60
|
-
"e:H37": {
|
|
60
|
+
"e:H37 Img element missing an alt attribute": {
|
|
61
61
|
"e:alt_missing": "0.75 (274)"
|
|
62
62
|
},
|
|
63
|
-
"e:H57": {
|
|
63
|
+
"e:H57 lang attribute of the document element": {
|
|
64
64
|
"e:language_missing": "0.72 (85)"
|
|
65
65
|
},
|
|
66
|
-
"w:G141": {
|
|
66
|
+
"w:G141 heading structure is not logically nested": {
|
|
67
67
|
"a:heading_skipped": "0.85 (535)"
|
|
68
68
|
},
|
|
69
|
-
"w:G90": {
|
|
69
|
+
"w:G90 event handler functionality is available through the keyboard": {
|
|
70
70
|
"a:event_handler": "0.76 (109)"
|
|
71
71
|
},
|
|
72
|
-
"w:H44": {
|
|
72
|
+
"w:H44 label for attribute bad ID": {
|
|
73
73
|
"a:label_orphaned": "0.71 (67)"
|
|
74
74
|
}
|
|
75
75
|
},
|
|
@@ -0,0 +1,335 @@
|
|
|
1
|
+
{
|
|
2
|
+
"duplicateID": {
|
|
3
|
+
"aatt": ["e:F77 Duplicate id attribute value"],
|
|
4
|
+
"alfa": ["r3 Element ID is not unique"],
|
|
5
|
+
"axe": ["duplicate-id ID attribute value must be unique"],
|
|
6
|
+
"ibm": [
|
|
7
|
+
"RPT_Elem_UniqueId Element id attribute values must be unique within a document"
|
|
8
|
+
]
|
|
9
|
+
},
|
|
10
|
+
"imageInputNoText": {
|
|
11
|
+
"aatt": ["e:H36 Image submit button missing an alt attribute"],
|
|
12
|
+
"alfa": ["r28 Image input element has no accessible name"],
|
|
13
|
+
"axe": ["input-image-alt Image buttons must have alternate text"],
|
|
14
|
+
"ibm": [
|
|
15
|
+
"v:WCAG20_Input_ExplicitLabelImage Input element of type image should have a text alternative"
|
|
16
|
+
],
|
|
17
|
+
"wave": ["e:alt_input_missing Image button missing alternative text"]
|
|
18
|
+
},
|
|
19
|
+
"imageNoText": {
|
|
20
|
+
"aatt": ["e:H37 Img element missing an alt attribute"],
|
|
21
|
+
"alfa": ["r2 Image has no accessible name"],
|
|
22
|
+
"axe": ["image-alt Images must have alternate text"],
|
|
23
|
+
"ibm": [
|
|
24
|
+
"v:WCAG20_Img_HasAlt Images must have an alt attribute if they convey meaning, or alt=\"\" if decorative"
|
|
25
|
+
],
|
|
26
|
+
"wave": ["e:alt_missing Missing alternative text"]
|
|
27
|
+
},
|
|
28
|
+
"pageLanguage": {
|
|
29
|
+
"aatt": ["e:H57 Lang attribute of the document element"],
|
|
30
|
+
"alfa": ["r4 Lang attribute missing, empty, or only whitespace"],
|
|
31
|
+
"axe": ["html-has-lang Html element must have a lang attribute"],
|
|
32
|
+
"ibm": [
|
|
33
|
+
"WCAG20_Html_HasLang Page detected as HTML, but has no lang attribute"
|
|
34
|
+
],
|
|
35
|
+
"wave": ["e:language_missing Language missing or invalid"]
|
|
36
|
+
},
|
|
37
|
+
"pageLanguageBad": {
|
|
38
|
+
"alfa": ["r5 Lang attribute has no valid primary language tag"],
|
|
39
|
+
"axe": [
|
|
40
|
+
"html-lang-valid Html element must have a valid value for the lang attribute"
|
|
41
|
+
],
|
|
42
|
+
"ibm": [
|
|
43
|
+
"v:WCAG20_Elem_Lang_Valid Lang attribute does not include a valid primary language"
|
|
44
|
+
]
|
|
45
|
+
},
|
|
46
|
+
"languageChange": {
|
|
47
|
+
"aatt": ["e:H58 Change in language is not marked"],
|
|
48
|
+
"alfa": ["r7 Lang attribute has no valid primary language subtag"],
|
|
49
|
+
"axe": ["valid-lang Lang attribute must have a valid value"]
|
|
50
|
+
},
|
|
51
|
+
"headingStructure": {
|
|
52
|
+
"aatt": ["w:G141 Heading structure is not logically nested"],
|
|
53
|
+
"alfa": ["r53 Heading skips one or more levels"],
|
|
54
|
+
"axe": ["heading-order Heading levels should only increase by one"],
|
|
55
|
+
"tenon": ["155 These headings are not structured in a hierarchical manner"],
|
|
56
|
+
"wave": ["a:heading_skipped Skipped heading level"]
|
|
57
|
+
},
|
|
58
|
+
"objectNoText": {
|
|
59
|
+
"aatt": ["e:ARIA6+H53 Object elements must contain a text alternative"],
|
|
60
|
+
"axe": ["object-alt Object elements must have alternate text"],
|
|
61
|
+
"ibm": [
|
|
62
|
+
"v:WCAG20_Object_HasText Object elements must have a text alternative"
|
|
63
|
+
],
|
|
64
|
+
"wave": ["a:plugin An unidentified plugin is present"]
|
|
65
|
+
},
|
|
66
|
+
"imageMapAreaNoText": {
|
|
67
|
+
"aatt": ["e:H24 Area element in an image map missing an alt attribute"],
|
|
68
|
+
"axe": ["area-alt Active area elements must have alternate text"],
|
|
69
|
+
"ibm": [
|
|
70
|
+
"v:HAAC_Img_UsemapAlt Image map or child area has no text alternative",
|
|
71
|
+
"v:WCAG20_Area_HasAlt Area element in an image map has no text alternative"
|
|
72
|
+
],
|
|
73
|
+
"wave": ["e:alt_area_missing Image map area missing alternative text"]
|
|
74
|
+
},
|
|
75
|
+
"eventKeyboard": {
|
|
76
|
+
"aatt": ["w:G90 Event handler functionality not available by keyboard"],
|
|
77
|
+
"wave": ["a:event_handler Device-dependent event handler"]
|
|
78
|
+
},
|
|
79
|
+
"labelForBadID": {
|
|
80
|
+
"aatt": ["w:H44 Label for attribute is bad ID"],
|
|
81
|
+
"wave": ["a:label_orphaned Orphaned form label"]
|
|
82
|
+
},
|
|
83
|
+
"linkNoText": {
|
|
84
|
+
"alfa": ["r11 Link has no accessible name"],
|
|
85
|
+
"axe": ["link-name Links must have discernible text"],
|
|
86
|
+
"ibm": ["v:WCAG20_A_HasText Hyperlinks must have a text description"],
|
|
87
|
+
"tenon": ["57 Link has no text inside it"],
|
|
88
|
+
"wave": ["e:link_empty Link contains no text"]
|
|
89
|
+
},
|
|
90
|
+
"linkTextsSame": {
|
|
91
|
+
"tenon": ["98 These links have the same text but different destinations"]
|
|
92
|
+
},
|
|
93
|
+
"linkPair": {
|
|
94
|
+
"wave": ["a:link_redundant Adjacent links go to same URL"]
|
|
95
|
+
},
|
|
96
|
+
"linkForcesNewWindow": {
|
|
97
|
+
"tenon": ["218 Link opens in a new window without user control"]
|
|
98
|
+
},
|
|
99
|
+
"buttonNoText": {
|
|
100
|
+
"alfa": ["r12 Button has no accessible name"],
|
|
101
|
+
"axe": ["aria-command-name ARIA commands must have an accessible name"],
|
|
102
|
+
"wave": ["e:button_empty Button is empty or has no value text"]
|
|
103
|
+
},
|
|
104
|
+
"parentMissing": {
|
|
105
|
+
"alfa": [
|
|
106
|
+
"r42 Element is not owned by an element of its required context role"
|
|
107
|
+
],
|
|
108
|
+
"axe": [
|
|
109
|
+
"aria-required-parent Certain ARIA roles must be contained by particular parents"
|
|
110
|
+
]
|
|
111
|
+
},
|
|
112
|
+
"svgImageNoText": {
|
|
113
|
+
"alfa": ["r43 SVG image element has no accessible name"],
|
|
114
|
+
"axe": [
|
|
115
|
+
"svg-img-alt SVG elements with an img role must have an alternative text"
|
|
116
|
+
]
|
|
117
|
+
},
|
|
118
|
+
"metaBansZoom": {
|
|
119
|
+
"alfa": ["r47 Meta element restricts zooming"],
|
|
120
|
+
"axe": ["meta-viewport Zooming and scaling should not be disabled"]
|
|
121
|
+
},
|
|
122
|
+
"childMissing": {
|
|
123
|
+
"alfa": ["r68 Element owns no elements as required by its semantic role"],
|
|
124
|
+
"axe": [
|
|
125
|
+
"aria-required-children Certain ARIA roles must contain particular children"
|
|
126
|
+
]
|
|
127
|
+
},
|
|
128
|
+
"leadingFrozen": {
|
|
129
|
+
"alfa": [
|
|
130
|
+
"r93 Style attribute with !important prevents adjusting line height"
|
|
131
|
+
],
|
|
132
|
+
"axe": [
|
|
133
|
+
"avoid-inline-spacing Inline text spacing must be adjustable with custom stylesheets"
|
|
134
|
+
]
|
|
135
|
+
},
|
|
136
|
+
"noLeading": {
|
|
137
|
+
"alfa": ["r73 Paragraphs of text have insufficient line height"]
|
|
138
|
+
},
|
|
139
|
+
"leadingClipsText": {
|
|
140
|
+
"tenon": [
|
|
141
|
+
"144 Line height insufficent to properly display computed font size"
|
|
142
|
+
]
|
|
143
|
+
},
|
|
144
|
+
"iframeNoText": {
|
|
145
|
+
"alfa": ["r13 Iframe has no accessible name"],
|
|
146
|
+
"axe": ["frame-title Frames must have an accessible name"],
|
|
147
|
+
"ibm": [
|
|
148
|
+
"v:WCAG20_Frame_HasTitle Inline frames must have a unique, non-empty title attribute"
|
|
149
|
+
]
|
|
150
|
+
},
|
|
151
|
+
"roleBad": {
|
|
152
|
+
"axe": [
|
|
153
|
+
"aria-allowed-role ARIA role should be appropriate for the element"
|
|
154
|
+
],
|
|
155
|
+
"ibm": [
|
|
156
|
+
"v:aria_semantics_role ARIA roles must be valid for the element to which they are assigned"
|
|
157
|
+
],
|
|
158
|
+
"testaro": ["role Nonexistent or implicit-overriding role"]
|
|
159
|
+
},
|
|
160
|
+
"roleMissingAttribute": {
|
|
161
|
+
"axe": ["aria-required-attr Required ARIA attributes must be provided"],
|
|
162
|
+
"ibm": [
|
|
163
|
+
"v:Rpt_Aria_RequiredProperties ARIA role on an element must have required attributes"
|
|
164
|
+
]
|
|
165
|
+
},
|
|
166
|
+
"roleBadAttribute": {
|
|
167
|
+
"alfa": ["r20 Aria- attribute is not defined"],
|
|
168
|
+
"axe": ["aria-valid-attr ARIA attributes must conform to valid names"],
|
|
169
|
+
"ibm": [
|
|
170
|
+
"v:Rpt_Aria_ValidProperty ARIA attributes must be valid for the role"
|
|
171
|
+
]
|
|
172
|
+
},
|
|
173
|
+
"autocompleteBad": {
|
|
174
|
+
"aatt": ["w:H98 Autocomplete attribute wrong"],
|
|
175
|
+
"alfa": ["r10 Autocomplete attribute has no valid value"],
|
|
176
|
+
"axe": ["autocomplete-valid Autocomplete attribute must be used correctly"],
|
|
177
|
+
"ibm": [
|
|
178
|
+
"v:WCAG21_Input_Autocomplete Autocomplete attribute token(s) must be appropriate for the input form field"
|
|
179
|
+
]
|
|
180
|
+
},
|
|
181
|
+
"contrastAA": {
|
|
182
|
+
"alfa": ["r69 Text outside widget has subminimum contrast"],
|
|
183
|
+
"axe": ["color-contrast Elements must have sufficient color contrast"],
|
|
184
|
+
"ibm": [
|
|
185
|
+
"v:IBMA_Color_Contrast_WCAG2AA Contrast ratio of text with background must meet WCAG 2.1 AA"
|
|
186
|
+
],
|
|
187
|
+
"wave": ["c:contrast Very low contrast"]
|
|
188
|
+
},
|
|
189
|
+
"contrastAAA": {
|
|
190
|
+
"alfa": ["r66 Text contrast less than AAA requires"],
|
|
191
|
+
"tenon": ["95 Element has insufficient color contrast (Level AAA)"]
|
|
192
|
+
},
|
|
193
|
+
"contrastRisk": {
|
|
194
|
+
"aatt": [
|
|
195
|
+
"w:F24 Inline background color needs complementary foreground color",
|
|
196
|
+
"w:G18 Contrast adequacy not determinable"
|
|
197
|
+
]
|
|
198
|
+
},
|
|
199
|
+
"headingEmpty": {
|
|
200
|
+
"axe": ["empty-heading Headings should not be empty"],
|
|
201
|
+
"ibm": [
|
|
202
|
+
"v:RPT_Header_HasContent Heading elements must provide descriptive text"
|
|
203
|
+
],
|
|
204
|
+
"wave": ["e:heading_empty Empty heading"]
|
|
205
|
+
},
|
|
206
|
+
"imageTextRedundant": {
|
|
207
|
+
"axe": [
|
|
208
|
+
"image-redundant-alt Text of buttons and links should not be repeated in the image alternative"
|
|
209
|
+
],
|
|
210
|
+
"ibm": [
|
|
211
|
+
"v:WCAG20_Img_LinkTextNotRedundant Text alternative for image within link should not repeat link text or adjacent link text"
|
|
212
|
+
]
|
|
213
|
+
},
|
|
214
|
+
"linkTitleRedundant": {
|
|
215
|
+
"tenon": [
|
|
216
|
+
"79 Link has a title attribute that is the same as the text inside the link"
|
|
217
|
+
]
|
|
218
|
+
},
|
|
219
|
+
"pageTitle": {
|
|
220
|
+
"axe": ["document-title Documents must contain a title element"],
|
|
221
|
+
"wave": ["e:title_invalid Missing or uninformative page title"]
|
|
222
|
+
},
|
|
223
|
+
"h1Missing": {
|
|
224
|
+
"axe": ["page-has-heading-one Page should contain a level-one heading"],
|
|
225
|
+
"wave": ["a:h1_missing Missing first level heading"]
|
|
226
|
+
},
|
|
227
|
+
"pseudoHeadingRisk": {
|
|
228
|
+
"aatt": ["w:H42 Heading coding should be used if intended as a heading"]
|
|
229
|
+
},
|
|
230
|
+
"pseudoLinkRisk": {
|
|
231
|
+
"tenon": ["129 CSS underline on text that is not a link"]
|
|
232
|
+
},
|
|
233
|
+
"pseudoListRisk": {
|
|
234
|
+
"aatt": ["w:H48 Navigation links should be coded as list"]
|
|
235
|
+
},
|
|
236
|
+
"selectNoText": {
|
|
237
|
+
"aatt": [
|
|
238
|
+
"w:H91 Select element has no value available to an accessibility API"
|
|
239
|
+
],
|
|
240
|
+
"axe": ["select-name Select element must have an accessible name"],
|
|
241
|
+
"wave": ["a:select_missing_label Select missing label"]
|
|
242
|
+
},
|
|
243
|
+
"selectFlatRisk": {
|
|
244
|
+
"aatt": [
|
|
245
|
+
"w:H85 If selection list contains groups of related options, they should be grouped with optgroup"
|
|
246
|
+
]
|
|
247
|
+
},
|
|
248
|
+
"ariaReferenceBad": {
|
|
249
|
+
"ibm": [
|
|
250
|
+
"v:Rpt_Aria_ValidIdRef ARIA property must reference non-empty unique id of visible element"
|
|
251
|
+
],
|
|
252
|
+
"wave": ["e:aria_reference_broken Broken ARIA reference"]
|
|
253
|
+
},
|
|
254
|
+
"accessKeyDuplicate": {
|
|
255
|
+
"ibm": [
|
|
256
|
+
"v:WCAG20_Elem_UniqueAccessKey Accesskey attribute values on each element must be unique for the page"
|
|
257
|
+
],
|
|
258
|
+
"wave": ["a:accesskey Accesskey"]
|
|
259
|
+
},
|
|
260
|
+
"fieldSetMissing": {
|
|
261
|
+
"ibm": [
|
|
262
|
+
"v:WCAG20_Input_RadioChkInFieldSet Input is in a different group than another with the name"
|
|
263
|
+
],
|
|
264
|
+
"testaro": [
|
|
265
|
+
"radioSet No or invalid grouping of radio buttons in fieldsets"
|
|
266
|
+
],
|
|
267
|
+
"wave": ["a:fieldset_missing Missing fieldset"]
|
|
268
|
+
},
|
|
269
|
+
"nameValue": {
|
|
270
|
+
"aatt": [
|
|
271
|
+
"e:F68 Form control wrongly labeled or unlabeled",
|
|
272
|
+
"e:H91 Missing name or value of form control or link"
|
|
273
|
+
],
|
|
274
|
+
"wave": ["e:label_missing Missing form label"]
|
|
275
|
+
},
|
|
276
|
+
"targetSize": {
|
|
277
|
+
"tenon": [
|
|
278
|
+
"152 Actionable element is smaller than the minimum required size"
|
|
279
|
+
]
|
|
280
|
+
},
|
|
281
|
+
"visibleBulk": {
|
|
282
|
+
"testaro": ["bulk Count of visible elements as a multiple of 300"]
|
|
283
|
+
},
|
|
284
|
+
"activeEmbedding": {
|
|
285
|
+
"testaro": ["embAc Active elements embedded in links or buttons"]
|
|
286
|
+
},
|
|
287
|
+
"tabFocusability": {
|
|
288
|
+
"testaro": [
|
|
289
|
+
"focAll Discrepancy between elements that should be and that are Tab-focusable"
|
|
290
|
+
]
|
|
291
|
+
},
|
|
292
|
+
"focusIndication": {
|
|
293
|
+
"alfa": ["r65 Element in sequential focus order has no visible focus"],
|
|
294
|
+
"testaro": [
|
|
295
|
+
"focInd Focused element displaying no or nostandard focus indicator"
|
|
296
|
+
]
|
|
297
|
+
},
|
|
298
|
+
"allCaps": {
|
|
299
|
+
"tenon": ["153 Long string of text is in all caps"]
|
|
300
|
+
},
|
|
301
|
+
"textBeyondLandmarks": {
|
|
302
|
+
"alfa": ["r57 Perceivable text content not included in any landmark"]
|
|
303
|
+
},
|
|
304
|
+
"focusableOperable": {
|
|
305
|
+
"testaro": [
|
|
306
|
+
"focOp Operable elements that cannot be Tab-focused and vice versa"
|
|
307
|
+
]
|
|
308
|
+
},
|
|
309
|
+
"hoverSurprise": {
|
|
310
|
+
"testaro": ["hover Content changes caused by hovering"]
|
|
311
|
+
},
|
|
312
|
+
"labelClash": {
|
|
313
|
+
"testaro": ["labClash Incompatible label types"]
|
|
314
|
+
},
|
|
315
|
+
"linkUnderlines": {
|
|
316
|
+
"testaro": ["linkUl Non-underlined inline links"]
|
|
317
|
+
},
|
|
318
|
+
"menuNavigation": {
|
|
319
|
+
"testaro": [
|
|
320
|
+
"menuNav Nonstandard keyboard navigation among focusable menu items"
|
|
321
|
+
]
|
|
322
|
+
},
|
|
323
|
+
"tabNavigation": {
|
|
324
|
+
"testaro": ["tabNav Nonstandard keyboard navigation among tabs"]
|
|
325
|
+
},
|
|
326
|
+
"spontaneousMotion": {
|
|
327
|
+
"testaro": ["motion Change of visible content not requested by user"]
|
|
328
|
+
},
|
|
329
|
+
"inconsistentStyles": {
|
|
330
|
+
"testaro": ["styleDiff Heading, link, and button style inconsistencies"]
|
|
331
|
+
},
|
|
332
|
+
"zIndexNotZero": {
|
|
333
|
+
"testaro": ["zIndex Layering with nondefault z-index values"]
|
|
334
|
+
}
|
|
335
|
+
}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
er62 The link is not distinguishable from the surrounding text
|
|
2
|
+
er65 The element does not have a visible focus indicator
|
|
3
|
+
er87 The document has no valid tabbable descendants or its first one is invalid
|
|
4
|
+
r1 The document has no valid title element
|
|
5
|
+
r10 The autocomplete attribute does not have a valid value
|
|
6
|
+
r109 The lang attribute does not match the document language
|
|
7
|
+
r11 The link does not have an accessible name
|
|
8
|
+
r12 The button does not have an accessible name
|
|
9
|
+
r13 The iframe does not have an accessible name
|
|
10
|
+
r14 The visible text content of the element is not included within its accessible name
|
|
11
|
+
r15 The iframe elements do not embed the same or equivalent resources
|
|
12
|
+
r16 The element does not have all required states and properties
|
|
13
|
+
r17 The element is either tabbable or has tabbable descendants
|
|
14
|
+
r18 The attribute is not allowed for the element on which it is specified
|
|
15
|
+
r19 The attribute does not have a valid value
|
|
16
|
+
r2 The image does not have an accessible name
|
|
17
|
+
r20 The attribute is not defined
|
|
18
|
+
r21 The element does not have a valid role
|
|
19
|
+
r22 The video element does not have captions
|
|
20
|
+
r25 The visual information of the video element is not available through audio
|
|
21
|
+
r27 The video element has no text alternative for its audio content
|
|
22
|
+
r28 The input type=image element does not have an accessible name
|
|
23
|
+
r3 The element does not have a unique ID
|
|
24
|
+
r30 The audio element does not have a text alternative
|
|
25
|
+
r32 The video element does not have an audio track that describes its
|
|
26
|
+
r35 The video element does not have an alternative
|
|
27
|
+
r37 The video element does not have an audio description
|
|
28
|
+
r38 The video element does not have an audio or text alternative
|
|
29
|
+
r39 The accessible name of the ${name} element does not describe its purpose
|
|
30
|
+
r4 The lang attribute is either missing, empty, or only whitespace
|
|
31
|
+
r40 The region does not have an accessible name
|
|
32
|
+
r41 The links do not resolve to the same or equivalent resources
|
|
33
|
+
r42 The element is not owned by an element of its required context role
|
|
34
|
+
r43 The ${target} element does not have an accessible name
|
|
35
|
+
r44 The element is locked in orientation
|
|
36
|
+
r45 The headers attribute has an invalid reference
|
|
37
|
+
r46 The header cell is not assigned to any cell
|
|
38
|
+
r47 The meta element restricts the ability to zoom
|
|
39
|
+
r48 The total duration of audio output of the ${name} element exceeds
|
|
40
|
+
r49 An audio element has no valid mechanism to pause or stop
|
|
41
|
+
r5 The lang attribute does not have a valid primary language tag
|
|
42
|
+
r50 The total duration of the autoplaying audio output of the element lasts
|
|
43
|
+
r53 The heading skips one or more levels
|
|
44
|
+
r54 The assertive region is not atomic
|
|
45
|
+
r55 Some role has the same name and different content
|
|
46
|
+
r56 Some ${role} have the same name.`, role, errors));
|
|
47
|
+
r57 The text is not included in a landmark region
|
|
48
|
+
r59 The document does not have a heading element
|
|
49
|
+
r6 The lang and xml:lang attributes do not have matching primary language subtags
|
|
50
|
+
r60 The grouping elements have an accessible name
|
|
51
|
+
r61 The document does not start with a level 1 heading
|
|
52
|
+
r62 The link is not distinguishable from the surrounding text
|
|
53
|
+
r63 The object element does not have an accessible name
|
|
54
|
+
r64 The heading does not have an accessible name
|
|
55
|
+
r65 The element does not have a visible focus indicator
|
|
56
|
+
r66 Text outside widget has enhanced contrast
|
|
57
|
+
r67 The element is marked as decorative but is exposed
|
|
58
|
+
r68 The element owns no elements as required by its semantic role
|
|
59
|
+
r69 Text outside widget has minimum contrast
|
|
60
|
+
r7 The lang attribute does not have a valid primary language subtag
|
|
61
|
+
r70 The document contains deprecated elements
|
|
62
|
+
r71 The text of the paragraph is justified
|
|
63
|
+
r72 The text of the paragraph is uppercased
|
|
64
|
+
r73 The line height of the paragraph is less than 1.5 or invalid
|
|
65
|
+
r74 The font size is specified using an absolute unit
|
|
66
|
+
r75 The font size is smaller than 9 pixels
|
|
67
|
+
r76 The header element is not a semantic header
|
|
68
|
+
r77 The cell is not assigned to any header cell
|
|
69
|
+
r78 There is no content between this heading and the next
|
|
70
|
+
r79 The element has no required hidden, figure, code, kbd, or samp ancestor
|
|
71
|
+
r8 The form field does not have an accessible name
|
|
72
|
+
r80 The line height is specified using an absolute unit
|
|
73
|
+
r81 The links do not resolve to the same or equivalent resources
|
|
74
|
+
r82 An error indicator fails to identify the form field or cause of error
|
|
75
|
+
r83 The text is clipped
|
|
76
|
+
r84 The scrollable element is not reachable through keyboard navigation
|
|
77
|
+
r85 The text of the paragraph is all italic
|
|
78
|
+
r86 The element is marked as decorative but is exposed
|
|
79
|
+
r87 The first tabbable element in the document is invalid on nonexistent
|
|
80
|
+
r90 The element has tabbable descendants
|
|
81
|
+
r94 The menuitem does not have an accessible name
|
|
82
|
+
r95 The iframe contains some interactive element
|