| 1 | {
|
|---|
| 2 | "lang": "xyz",
|
|---|
| 3 | "rules": {
|
|---|
| 4 | "accesskeys": {
|
|---|
| 5 | "description": "Ensure every accesskey attribute value is unique",
|
|---|
| 6 | "help": "accesskey attribute value should be unique"
|
|---|
| 7 | },
|
|---|
| 8 | "area-alt": {
|
|---|
| 9 | "description": "Ensure <area> elements of image maps have alternative text",
|
|---|
| 10 | "help": "Active <area> elements must have alternative text"
|
|---|
| 11 | },
|
|---|
| 12 | "aria-allowed-attr": {
|
|---|
| 13 | "description": "Ensure an element's role supports its ARIA attributes",
|
|---|
| 14 | "help": "Elements must only use supported ARIA attributes"
|
|---|
| 15 | },
|
|---|
| 16 | "aria-allowed-role": {
|
|---|
| 17 | "description": "Ensure role attribute has an appropriate value for the element",
|
|---|
| 18 | "help": "ARIA role should be appropriate for the element"
|
|---|
| 19 | },
|
|---|
| 20 | "aria-braille-equivalent": {
|
|---|
| 21 | "description": "Ensure aria-braillelabel and aria-brailleroledescription have a non-braille equivalent",
|
|---|
| 22 | "help": "aria-braille attributes must have a non-braille equivalent"
|
|---|
| 23 | },
|
|---|
| 24 | "aria-command-name": {
|
|---|
| 25 | "description": "Ensure every ARIA button, link and menuitem has an accessible name",
|
|---|
| 26 | "help": "ARIA commands must have an accessible name"
|
|---|
| 27 | },
|
|---|
| 28 | "aria-conditional-attr": {
|
|---|
| 29 | "description": "Ensure ARIA attributes are used as described in the specification of the element's role",
|
|---|
| 30 | "help": "ARIA attributes must be used as specified for the element's role"
|
|---|
| 31 | },
|
|---|
| 32 | "aria-deprecated-role": {
|
|---|
| 33 | "description": "Ensure elements do not use deprecated roles",
|
|---|
| 34 | "help": "Deprecated ARIA roles must not be used"
|
|---|
| 35 | },
|
|---|
| 36 | "aria-dialog-name": {
|
|---|
| 37 | "description": "Ensure every ARIA dialog and alertdialog node has an accessible name",
|
|---|
| 38 | "help": "ARIA dialog and alertdialog nodes should have an accessible name"
|
|---|
| 39 | },
|
|---|
| 40 | "aria-hidden-body": {
|
|---|
| 41 | "description": "Ensure aria-hidden=\"true\" is not present on the document body.",
|
|---|
| 42 | "help": "aria-hidden=\"true\" must not be present on the document body"
|
|---|
| 43 | },
|
|---|
| 44 | "aria-hidden-focus": {
|
|---|
| 45 | "description": "Ensure aria-hidden elements are not focusable nor contain focusable elements",
|
|---|
| 46 | "help": "ARIA hidden element must not be focusable or contain focusable elements"
|
|---|
| 47 | },
|
|---|
| 48 | "aria-input-field-name": {
|
|---|
| 49 | "description": "Ensure every ARIA input field has an accessible name",
|
|---|
| 50 | "help": "ARIA input fields must have an accessible name"
|
|---|
| 51 | },
|
|---|
| 52 | "aria-meter-name": {
|
|---|
| 53 | "description": "Ensure every ARIA meter node has an accessible name",
|
|---|
| 54 | "help": "ARIA meter nodes must have an accessible name"
|
|---|
| 55 | },
|
|---|
| 56 | "aria-progressbar-name": {
|
|---|
| 57 | "description": "Ensure every ARIA progressbar node has an accessible name",
|
|---|
| 58 | "help": "ARIA progressbar nodes must have an accessible name"
|
|---|
| 59 | },
|
|---|
| 60 | "aria-prohibited-attr": {
|
|---|
| 61 | "description": "Ensure ARIA attributes are not prohibited for an element's role",
|
|---|
| 62 | "help": "Elements must only use permitted ARIA attributes"
|
|---|
| 63 | },
|
|---|
| 64 | "aria-required-attr": {
|
|---|
| 65 | "description": "Ensure elements with ARIA roles have all required ARIA attributes",
|
|---|
| 66 | "help": "Required ARIA attributes must be provided"
|
|---|
| 67 | },
|
|---|
| 68 | "aria-required-children": {
|
|---|
| 69 | "description": "Ensure elements with an ARIA role that require child roles contain them",
|
|---|
| 70 | "help": "Certain ARIA roles must contain particular children"
|
|---|
| 71 | },
|
|---|
| 72 | "aria-required-parent": {
|
|---|
| 73 | "description": "Ensure elements with an ARIA role that require parent roles are contained by them",
|
|---|
| 74 | "help": "Certain ARIA roles must be contained by particular parents"
|
|---|
| 75 | },
|
|---|
| 76 | "aria-roledescription": {
|
|---|
| 77 | "description": "Ensure aria-roledescription is only used on elements with an implicit or explicit role",
|
|---|
| 78 | "help": "aria-roledescription must be on elements with a semantic role"
|
|---|
| 79 | },
|
|---|
| 80 | "aria-roles": {
|
|---|
| 81 | "description": "Ensure all elements with a role attribute use a valid value",
|
|---|
| 82 | "help": "ARIA roles used must conform to valid values"
|
|---|
| 83 | },
|
|---|
| 84 | "aria-text": {
|
|---|
| 85 | "description": "Ensure role=\"text\" is used on elements with no focusable descendants",
|
|---|
| 86 | "help": "\"role=text\" should have no focusable descendants"
|
|---|
| 87 | },
|
|---|
| 88 | "aria-toggle-field-name": {
|
|---|
| 89 | "description": "Ensure every ARIA toggle field has an accessible name",
|
|---|
| 90 | "help": "ARIA toggle fields must have an accessible name"
|
|---|
| 91 | },
|
|---|
| 92 | "aria-tooltip-name": {
|
|---|
| 93 | "description": "Ensure every ARIA tooltip node has an accessible name",
|
|---|
| 94 | "help": "ARIA tooltip nodes must have an accessible name"
|
|---|
| 95 | },
|
|---|
| 96 | "aria-treeitem-name": {
|
|---|
| 97 | "description": "Ensure every ARIA treeitem node has an accessible name",
|
|---|
| 98 | "help": "ARIA treeitem nodes should have an accessible name"
|
|---|
| 99 | },
|
|---|
| 100 | "aria-valid-attr-value": {
|
|---|
| 101 | "description": "Ensure all ARIA attributes have valid values",
|
|---|
| 102 | "help": "ARIA attributes must conform to valid values"
|
|---|
| 103 | },
|
|---|
| 104 | "aria-valid-attr": {
|
|---|
| 105 | "description": "Ensure attributes that begin with aria- are valid ARIA attributes",
|
|---|
| 106 | "help": "ARIA attributes must conform to valid names"
|
|---|
| 107 | },
|
|---|
| 108 | "audio-caption": {
|
|---|
| 109 | "description": "Ensure <audio> elements have captions",
|
|---|
| 110 | "help": "<audio> elements must have a captions track"
|
|---|
| 111 | },
|
|---|
| 112 | "autocomplete-valid": {
|
|---|
| 113 | "description": "Ensure the autocomplete attribute is correct and suitable for the form field",
|
|---|
| 114 | "help": "autocomplete attribute must be used correctly"
|
|---|
| 115 | },
|
|---|
| 116 | "avoid-inline-spacing": {
|
|---|
| 117 | "description": "Ensure that text spacing set through style attributes can be adjusted with custom stylesheets",
|
|---|
| 118 | "help": "Inline text spacing must be adjustable with custom stylesheets"
|
|---|
| 119 | },
|
|---|
| 120 | "blink": {
|
|---|
| 121 | "description": "Ensure <blink> elements are not used",
|
|---|
| 122 | "help": "<blink> elements are deprecated and must not be used"
|
|---|
| 123 | },
|
|---|
| 124 | "button-name": {
|
|---|
| 125 | "description": "Ensure buttons have discernible text",
|
|---|
| 126 | "help": "Buttons must have discernible text"
|
|---|
| 127 | },
|
|---|
| 128 | "bypass": {
|
|---|
| 129 | "description": "Ensure each page has at least one mechanism for a user to bypass navigation and jump straight to the content",
|
|---|
| 130 | "help": "Page must have means to bypass repeated blocks"
|
|---|
| 131 | },
|
|---|
| 132 | "color-contrast-enhanced": {
|
|---|
| 133 | "description": "Ensure the contrast between foreground and background colors meets WCAG 2 AAA enhanced contrast ratio thresholds",
|
|---|
| 134 | "help": "Elements must meet enhanced color contrast ratio thresholds"
|
|---|
| 135 | },
|
|---|
| 136 | "color-contrast": {
|
|---|
| 137 | "description": "Ensure the contrast between foreground and background colors meets WCAG 2 AA minimum contrast ratio thresholds",
|
|---|
| 138 | "help": "Elements must meet minimum color contrast ratio thresholds"
|
|---|
| 139 | },
|
|---|
| 140 | "css-orientation-lock": {
|
|---|
| 141 | "description": "Ensure content is not locked to any specific display orientation, and the content is operable in all display orientations",
|
|---|
| 142 | "help": "CSS Media queries must not lock display orientation"
|
|---|
| 143 | },
|
|---|
| 144 | "definition-list": {
|
|---|
| 145 | "description": "Ensure <dl> elements are structured correctly",
|
|---|
| 146 | "help": "<dl> elements must only directly contain properly-ordered <dt> and <dd> groups, <script>, <template> or <div> elements"
|
|---|
| 147 | },
|
|---|
| 148 | "dlitem": {
|
|---|
| 149 | "description": "Ensure <dt> and <dd> elements are contained by a <dl>",
|
|---|
| 150 | "help": "<dt> and <dd> elements must be contained by a <dl>"
|
|---|
| 151 | },
|
|---|
| 152 | "document-title": {
|
|---|
| 153 | "description": "Ensure each HTML document contains a non-empty <title> element",
|
|---|
| 154 | "help": "Documents must have <title> element to aid in navigation"
|
|---|
| 155 | },
|
|---|
| 156 | "duplicate-id-active": {
|
|---|
| 157 | "description": "Ensure every id attribute value of active elements is unique",
|
|---|
| 158 | "help": "IDs of active elements must be unique"
|
|---|
| 159 | },
|
|---|
| 160 | "duplicate-id-aria": {
|
|---|
| 161 | "description": "Ensure every id attribute value used in ARIA and in labels is unique",
|
|---|
| 162 | "help": "IDs used in ARIA and labels must be unique"
|
|---|
| 163 | },
|
|---|
| 164 | "duplicate-id": {
|
|---|
| 165 | "description": "Ensure every id attribute value is unique",
|
|---|
| 166 | "help": "id attribute value must be unique"
|
|---|
| 167 | },
|
|---|
| 168 | "empty-heading": {
|
|---|
| 169 | "description": "Ensure headings have discernible text",
|
|---|
| 170 | "help": "Headings should not be empty"
|
|---|
| 171 | },
|
|---|
| 172 | "empty-table-header": {
|
|---|
| 173 | "description": "Ensure table headers have discernible text",
|
|---|
| 174 | "help": "Table header text should not be empty"
|
|---|
| 175 | },
|
|---|
| 176 | "focus-order-semantics": {
|
|---|
| 177 | "description": "Ensure elements in the focus order have a role appropriate for interactive content",
|
|---|
| 178 | "help": "Elements in the focus order should have an appropriate role"
|
|---|
| 179 | },
|
|---|
| 180 | "form-field-multiple-labels": {
|
|---|
| 181 | "description": "Ensure form field does not have multiple label elements",
|
|---|
| 182 | "help": "Form field must not have multiple label elements"
|
|---|
| 183 | },
|
|---|
| 184 | "frame-focusable-content": {
|
|---|
| 185 | "description": "Ensure <frame> and <iframe> elements with focusable content do not have tabindex=-1",
|
|---|
| 186 | "help": "Frames with focusable content must not have tabindex=-1"
|
|---|
| 187 | },
|
|---|
| 188 | "frame-tested": {
|
|---|
| 189 | "description": "Ensure <iframe> and <frame> elements contain the axe-core script",
|
|---|
| 190 | "help": "Frames should be tested with axe-core"
|
|---|
| 191 | },
|
|---|
| 192 | "frame-title-unique": {
|
|---|
| 193 | "description": "Ensure <iframe> and <frame> elements contain a unique title attribute",
|
|---|
| 194 | "help": "Frames must have a unique title attribute"
|
|---|
| 195 | },
|
|---|
| 196 | "frame-title": {
|
|---|
| 197 | "description": "Ensure <iframe> and <frame> elements have an accessible name",
|
|---|
| 198 | "help": "Frames must have an accessible name"
|
|---|
| 199 | },
|
|---|
| 200 | "heading-order": {
|
|---|
| 201 | "description": "Ensure the order of headings is semantically correct",
|
|---|
| 202 | "help": "Heading levels should only increase by one"
|
|---|
| 203 | },
|
|---|
| 204 | "hidden-content": {
|
|---|
| 205 | "description": "Inform users about hidden content.",
|
|---|
| 206 | "help": "Hidden content on the page should be analyzed"
|
|---|
| 207 | },
|
|---|
| 208 | "html-has-lang": {
|
|---|
| 209 | "description": "Ensure every HTML document has a lang attribute",
|
|---|
| 210 | "help": "<html> element must have a lang attribute"
|
|---|
| 211 | },
|
|---|
| 212 | "html-lang-valid": {
|
|---|
| 213 | "description": "Ensure the lang attribute of the <html> element has a valid value",
|
|---|
| 214 | "help": "<html> element must have a valid value for the lang attribute"
|
|---|
| 215 | },
|
|---|
| 216 | "html-xml-lang-mismatch": {
|
|---|
| 217 | "description": "Ensure that HTML elements with both valid lang and xml:lang attributes agree on the base language of the page",
|
|---|
| 218 | "help": "HTML elements with lang and xml:lang must have the same base language"
|
|---|
| 219 | },
|
|---|
| 220 | "identical-links-same-purpose": {
|
|---|
| 221 | "description": "Ensure that links with the same accessible name serve a similar purpose",
|
|---|
| 222 | "help": "Links with the same name must have a similar purpose"
|
|---|
| 223 | },
|
|---|
| 224 | "image-alt": {
|
|---|
| 225 | "description": "Ensure <img> elements have alternative text or a role of none or presentation",
|
|---|
| 226 | "help": "Images must have alternative text"
|
|---|
| 227 | },
|
|---|
| 228 | "image-redundant-alt": {
|
|---|
| 229 | "description": "Ensure image alternative is not repeated as text",
|
|---|
| 230 | "help": "Alternative text of images should not be repeated as text"
|
|---|
| 231 | },
|
|---|
| 232 | "input-button-name": {
|
|---|
| 233 | "description": "Ensure input buttons have discernible text",
|
|---|
| 234 | "help": "Input buttons must have discernible text"
|
|---|
| 235 | },
|
|---|
| 236 | "input-image-alt": {
|
|---|
| 237 | "description": "Ensure <input type=\"image\"> elements have alternative text",
|
|---|
| 238 | "help": "Image buttons must have alternative text"
|
|---|
| 239 | },
|
|---|
| 240 | "label-content-name-mismatch": {
|
|---|
| 241 | "description": "Ensure that elements labelled through their content must have their visible text as part of their accessible name",
|
|---|
| 242 | "help": "Elements must have their visible text as part of their accessible name"
|
|---|
| 243 | },
|
|---|
| 244 | "label-title-only": {
|
|---|
| 245 | "description": "Ensure that every form element has a visible label and is not solely labeled using hidden labels, or the title or aria-describedby attributes",
|
|---|
| 246 | "help": "Form elements should have a visible label"
|
|---|
| 247 | },
|
|---|
| 248 | "label": {
|
|---|
| 249 | "description": "Ensure every form element has a label",
|
|---|
| 250 | "help": "Form elements must have labels"
|
|---|
| 251 | },
|
|---|
| 252 | "landmark-banner-is-top-level": {
|
|---|
| 253 | "description": "Ensure the banner landmark is at top level",
|
|---|
| 254 | "help": "Banner landmark should not be contained in another landmark"
|
|---|
| 255 | },
|
|---|
| 256 | "landmark-complementary-is-top-level": {
|
|---|
| 257 | "description": "Ensure the complementary landmark or aside is at top level",
|
|---|
| 258 | "help": "Aside should not be contained in another landmark"
|
|---|
| 259 | },
|
|---|
| 260 | "landmark-contentinfo-is-top-level": {
|
|---|
| 261 | "description": "Ensure the contentinfo landmark is at top level",
|
|---|
| 262 | "help": "Contentinfo landmark should not be contained in another landmark"
|
|---|
| 263 | },
|
|---|
| 264 | "landmark-main-is-top-level": {
|
|---|
| 265 | "description": "Ensure the main landmark is at top level",
|
|---|
| 266 | "help": "Main landmark should not be contained in another landmark"
|
|---|
| 267 | },
|
|---|
| 268 | "landmark-no-duplicate-banner": {
|
|---|
| 269 | "description": "Ensure the document has at most one banner landmark",
|
|---|
| 270 | "help": "Document should not have more than one banner landmark"
|
|---|
| 271 | },
|
|---|
| 272 | "landmark-no-duplicate-contentinfo": {
|
|---|
| 273 | "description": "Ensure the document has at most one contentinfo landmark",
|
|---|
| 274 | "help": "Document should not have more than one contentinfo landmark"
|
|---|
| 275 | },
|
|---|
| 276 | "landmark-no-duplicate-main": {
|
|---|
| 277 | "description": "Ensure the document has at most one main landmark",
|
|---|
| 278 | "help": "Document should not have more than one main landmark"
|
|---|
| 279 | },
|
|---|
| 280 | "landmark-one-main": {
|
|---|
| 281 | "description": "Ensure the document has a main landmark",
|
|---|
| 282 | "help": "Document should have one main landmark"
|
|---|
| 283 | },
|
|---|
| 284 | "landmark-unique": {
|
|---|
| 285 | "description": "Ensure landmarks are unique",
|
|---|
| 286 | "help": "Landmarks should have a unique role or role/label/title (i.e. accessible name) combination"
|
|---|
| 287 | },
|
|---|
| 288 | "link-in-text-block": {
|
|---|
| 289 | "description": "Ensure links are distinguished from surrounding text in a way that does not rely on color",
|
|---|
| 290 | "help": "Links must be distinguishable without relying on color"
|
|---|
| 291 | },
|
|---|
| 292 | "link-name": {
|
|---|
| 293 | "description": "Ensure links have discernible text",
|
|---|
| 294 | "help": "Links must have discernible text"
|
|---|
| 295 | },
|
|---|
| 296 | "list": {
|
|---|
| 297 | "description": "Ensure that lists are structured correctly",
|
|---|
| 298 | "help": "<ul> and <ol> must only directly contain <li>, <script> or <template> elements"
|
|---|
| 299 | },
|
|---|
| 300 | "listitem": {
|
|---|
| 301 | "description": "Ensure <li> elements are used semantically",
|
|---|
| 302 | "help": "<li> elements must be contained in a <ul> or <ol>"
|
|---|
| 303 | },
|
|---|
| 304 | "marquee": {
|
|---|
| 305 | "description": "Ensure <marquee> elements are not used",
|
|---|
| 306 | "help": "<marquee> elements are deprecated and must not be used"
|
|---|
| 307 | },
|
|---|
| 308 | "meta-refresh-no-exceptions": {
|
|---|
| 309 | "description": "Ensure <meta http-equiv=\"refresh\"> is not used for delayed refresh",
|
|---|
| 310 | "help": "Delayed refresh must not be used"
|
|---|
| 311 | },
|
|---|
| 312 | "meta-refresh": {
|
|---|
| 313 | "description": "Ensure <meta http-equiv=\"refresh\"> is not used for delayed refresh",
|
|---|
| 314 | "help": "Delayed refresh under 20 hours must not be used"
|
|---|
| 315 | },
|
|---|
| 316 | "meta-viewport-large": {
|
|---|
| 317 | "description": "Ensure <meta name=\"viewport\"> can scale a significant amount",
|
|---|
| 318 | "help": "Users should be able to zoom and scale the text up to 500%"
|
|---|
| 319 | },
|
|---|
| 320 | "meta-viewport": {
|
|---|
| 321 | "description": "Ensure <meta name=\"viewport\"> does not disable text scaling and zooming",
|
|---|
| 322 | "help": "Zooming and scaling must not be disabled"
|
|---|
| 323 | },
|
|---|
| 324 | "nested-interactive": {
|
|---|
| 325 | "description": "Ensure interactive controls are not nested as they are not always announced by screen readers or can cause focus problems for assistive technologies",
|
|---|
| 326 | "help": "Interactive controls must not be nested"
|
|---|
| 327 | },
|
|---|
| 328 | "no-autoplay-audio": {
|
|---|
| 329 | "description": "Ensure <video> or <audio> elements do not autoplay audio for more than 3 seconds without a control mechanism to stop or mute the audio",
|
|---|
| 330 | "help": "<video> or <audio> elements must not play automatically"
|
|---|
| 331 | },
|
|---|
| 332 | "object-alt": {
|
|---|
| 333 | "description": "Ensure <object> elements have alternative text",
|
|---|
| 334 | "help": "<object> elements must have alternative text"
|
|---|
| 335 | },
|
|---|
| 336 | "p-as-heading": {
|
|---|
| 337 | "description": "Ensure bold, italic text and font-size is not used to style <p> elements as a heading",
|
|---|
| 338 | "help": "Styled <p> elements must not be used as headings"
|
|---|
| 339 | },
|
|---|
| 340 | "page-has-heading-one": {
|
|---|
| 341 | "description": "Ensure that the page, or at least one of its frames contains a level-one heading",
|
|---|
| 342 | "help": "Page should contain a level-one heading"
|
|---|
| 343 | },
|
|---|
| 344 | "presentation-role-conflict": {
|
|---|
| 345 | "description": "Ensure elements marked as presentational do not have global ARIA or tabindex so that all screen readers ignore them",
|
|---|
| 346 | "help": "Elements marked as presentational should be consistently ignored"
|
|---|
| 347 | },
|
|---|
| 348 | "region": {
|
|---|
| 349 | "description": "Ensure all page content is contained by landmarks",
|
|---|
| 350 | "help": "All page content should be contained by landmarks"
|
|---|
| 351 | },
|
|---|
| 352 | "role-img-alt": {
|
|---|
| 353 | "description": "Ensure [role=\"img\"] elements have alternative text",
|
|---|
| 354 | "help": "[role=\"img\"] elements must have alternative text"
|
|---|
| 355 | },
|
|---|
| 356 | "scope-attr-valid": {
|
|---|
| 357 | "description": "Ensure the scope attribute is used correctly on tables",
|
|---|
| 358 | "help": "scope attribute should be used correctly"
|
|---|
| 359 | },
|
|---|
| 360 | "scrollable-region-focusable": {
|
|---|
| 361 | "description": "Ensure elements that have scrollable content are accessible by keyboard in Safari",
|
|---|
| 362 | "help": "Scrollable region must have keyboard access"
|
|---|
| 363 | },
|
|---|
| 364 | "select-name": {
|
|---|
| 365 | "description": "Ensure select element has an accessible name",
|
|---|
| 366 | "help": "Select element must have an accessible name"
|
|---|
| 367 | },
|
|---|
| 368 | "server-side-image-map": {
|
|---|
| 369 | "description": "Ensure that server-side image maps are not used",
|
|---|
| 370 | "help": "Server-side image maps must not be used"
|
|---|
| 371 | },
|
|---|
| 372 | "skip-link": {
|
|---|
| 373 | "description": "Ensure all skip links have a focusable target",
|
|---|
| 374 | "help": "The skip-link target should exist and be focusable"
|
|---|
| 375 | },
|
|---|
| 376 | "summary-name": {
|
|---|
| 377 | "description": "Ensure summary elements have discernible text",
|
|---|
| 378 | "help": "Summary elements must have discernible text"
|
|---|
| 379 | },
|
|---|
| 380 | "svg-img-alt": {
|
|---|
| 381 | "description": "Ensure <svg> elements with an img, graphics-document or graphics-symbol role have accessible text",
|
|---|
| 382 | "help": "<svg> elements with an img role must have alternative text"
|
|---|
| 383 | },
|
|---|
| 384 | "tabindex": {
|
|---|
| 385 | "description": "Ensure tabindex attribute values are not greater than 0",
|
|---|
| 386 | "help": "Elements should not have tabindex greater than zero"
|
|---|
| 387 | },
|
|---|
| 388 | "table-duplicate-name": {
|
|---|
| 389 | "description": "Ensure the <caption> element does not contain the same text as the summary attribute",
|
|---|
| 390 | "help": "Tables should not have the same summary and caption"
|
|---|
| 391 | },
|
|---|
| 392 | "table-fake-caption": {
|
|---|
| 393 | "description": "Ensure that tables with a caption use the <caption> element.",
|
|---|
| 394 | "help": "Data or header cells must not be used to give caption to a data table."
|
|---|
| 395 | },
|
|---|
| 396 | "target-size": {
|
|---|
| 397 | "description": "Ensure touch targets have sufficient size and space",
|
|---|
| 398 | "help": "All touch targets must be 24px large, or leave sufficient space"
|
|---|
| 399 | },
|
|---|
| 400 | "td-has-header": {
|
|---|
| 401 | "description": "Ensure that each non-empty data cell in a <table> larger than 3 by 3 has one or more table headers",
|
|---|
| 402 | "help": "Non-empty <td> elements in larger <table> must have an associated table header"
|
|---|
| 403 | },
|
|---|
| 404 | "td-headers-attr": {
|
|---|
| 405 | "description": "Ensure that each cell in a table that uses the headers attribute refers only to other <th> elements in that table",
|
|---|
| 406 | "help": "Table cell headers attributes must refer to other <th> elements in the same table"
|
|---|
| 407 | },
|
|---|
| 408 | "th-has-data-cells": {
|
|---|
| 409 | "description": "Ensure that <th> elements and elements with role=columnheader/rowheader have data cells they describe",
|
|---|
| 410 | "help": "Table headers in a data table must refer to data cells"
|
|---|
| 411 | },
|
|---|
| 412 | "valid-lang": {
|
|---|
| 413 | "description": "Ensure lang attributes have valid values",
|
|---|
| 414 | "help": "lang attribute must have a valid value"
|
|---|
| 415 | },
|
|---|
| 416 | "video-caption": {
|
|---|
| 417 | "description": "Ensure <video> elements have captions",
|
|---|
| 418 | "help": "<video> elements must have captions"
|
|---|
| 419 | }
|
|---|
| 420 | },
|
|---|
| 421 | "checks": {
|
|---|
| 422 | "abstractrole": {
|
|---|
| 423 | "pass": "Abstract roles are not used",
|
|---|
| 424 | "fail": {
|
|---|
| 425 | "singular": "Abstract role cannot be directly used: ${data.values}",
|
|---|
| 426 | "plural": "Abstract roles cannot be directly used: ${data.values}"
|
|---|
| 427 | }
|
|---|
| 428 | },
|
|---|
| 429 | "aria-allowed-attr-elm": {
|
|---|
| 430 | "pass": "ARIA attributes are allowed for this element",
|
|---|
| 431 | "fail": {
|
|---|
| 432 | "singular": "ARIA attribute is not allowed on ${data.nodeName} elements: ${data.values}",
|
|---|
| 433 | "plural": "ARIA attributes are not allowed on ${data.nodeName} elements: ${data.values}"
|
|---|
| 434 | }
|
|---|
| 435 | },
|
|---|
| 436 | "aria-allowed-attr": {
|
|---|
| 437 | "pass": "ARIA attributes are used correctly for the defined role",
|
|---|
| 438 | "fail": {
|
|---|
| 439 | "singular": "ARIA attribute is not allowed: ${data.values}",
|
|---|
| 440 | "plural": "ARIA attributes are not allowed: ${data.values}"
|
|---|
| 441 | },
|
|---|
| 442 | "incomplete": "Check that there is no problem if the ARIA attribute is ignored on this element: ${data.values}"
|
|---|
| 443 | },
|
|---|
| 444 | "aria-allowed-role": {
|
|---|
| 445 | "pass": "ARIA role is allowed for given element",
|
|---|
| 446 | "fail": {
|
|---|
| 447 | "singular": "ARIA role ${data.values} is not allowed for given element",
|
|---|
| 448 | "plural": "ARIA roles ${data.values} are not allowed for given element"
|
|---|
| 449 | },
|
|---|
| 450 | "incomplete": {
|
|---|
| 451 | "singular": "ARIA role ${data.values} must be removed when the element is made visible, as it is not allowed for the element",
|
|---|
| 452 | "plural": "ARIA roles ${data.values} must be removed when the element is made visible, as they are not allowed for the element"
|
|---|
| 453 | }
|
|---|
| 454 | },
|
|---|
| 455 | "aria-busy": {
|
|---|
| 456 | "pass": "Element has an aria-busy attribute",
|
|---|
| 457 | "fail": "Element uses aria-busy=\"true\" while showing a loader"
|
|---|
| 458 | },
|
|---|
| 459 | "aria-conditional-attr": {
|
|---|
| 460 | "pass": "ARIA attribute is allowed",
|
|---|
| 461 | "fail": {
|
|---|
| 462 | "checkbox": "Remove aria-checked, or set it to \"${data.checkState}\" to match the real checkbox state",
|
|---|
| 463 | "rowSingular": "This attribute is supported with treegrid rows, but not ${data.ownerRole}: ${data.invalidAttrs}",
|
|---|
| 464 | "rowPlural": "These attributes are supported with treegrid rows, but not ${data.ownerRole}: ${data.invalidAttrs}"
|
|---|
| 465 | }
|
|---|
| 466 | },
|
|---|
| 467 | "aria-errormessage": {
|
|---|
| 468 | "pass": "aria-errormessage exists and references elements visible to screen readers that use a supported aria-errormessage technique",
|
|---|
| 469 | "fail": {
|
|---|
| 470 | "singular": "aria-errormessage value `${data.values}` must use a technique to announce the message (e.g., aria-live, aria-describedby, role=alert, etc.)",
|
|---|
| 471 | "plural": "aria-errormessage values `${data.values}` must use a technique to announce the message (e.g., aria-live, aria-describedby, role=alert, etc.)",
|
|---|
| 472 | "unsupported": "Multiple IDs in aria-errormessage is not widely supported in assistive technologies",
|
|---|
| 473 | "hidden": "aria-errormessage value `${data.values}` cannot reference a hidden element"
|
|---|
| 474 | },
|
|---|
| 475 | "incomplete": {
|
|---|
| 476 | "singular": "Ensure aria-errormessage value `${data.values}` references an existing element",
|
|---|
| 477 | "plural": "Ensure aria-errormessage values `${data.values}` reference existing elements",
|
|---|
| 478 | "idrefs": "Unable to determine if aria-errormessage element exists on the page: ${data.values}"
|
|---|
| 479 | }
|
|---|
| 480 | },
|
|---|
| 481 | "aria-hidden-body": {
|
|---|
| 482 | "pass": "No aria-hidden attribute is present on document body",
|
|---|
| 483 | "fail": "aria-hidden=true should not be present on the document body"
|
|---|
| 484 | },
|
|---|
| 485 | "aria-level": {
|
|---|
| 486 | "pass": "aria-level values are valid",
|
|---|
| 487 | "incomplete": "aria-level values greater than 6 are not supported in all screenreader and browser combinations"
|
|---|
| 488 | },
|
|---|
| 489 | "aria-prohibited-attr": {
|
|---|
| 490 | "pass": "ARIA attribute is allowed",
|
|---|
| 491 | "fail": {
|
|---|
| 492 | "hasRolePlural": "${data.prohibited} attributes cannot be used with role \"${data.role}\".",
|
|---|
| 493 | "hasRoleSingular": "${data.prohibited} attribute cannot be used with role \"${data.role}\".",
|
|---|
| 494 | "noRolePlural": "${data.prohibited} attributes cannot be used on a ${data.nodeName} with no valid role attribute.",
|
|---|
| 495 | "noRoleSingular": "${data.prohibited} attribute cannot be used on a ${data.nodeName} with no valid role attribute."
|
|---|
| 496 | },
|
|---|
| 497 | "incomplete": {
|
|---|
| 498 | "hasRoleSingular": "${data.prohibited} attribute is not well supported with role \"${data.role}\".",
|
|---|
| 499 | "hasRolePlural": "${data.prohibited} attributes are not well supported with role \"${data.role}\".",
|
|---|
| 500 | "noRoleSingular": "${data.prohibited} attribute is not well supported on a ${data.nodeName} with no valid role attribute.",
|
|---|
| 501 | "noRolePlural": "${data.prohibited} attributes are not well supported on a ${data.nodeName} with no valid role attribute."
|
|---|
| 502 | }
|
|---|
| 503 | },
|
|---|
| 504 | "aria-required-attr": {
|
|---|
| 505 | "pass": "All required ARIA attributes are present",
|
|---|
| 506 | "fail": {
|
|---|
| 507 | "singular": "Required ARIA attribute not present: ${data.values}",
|
|---|
| 508 | "plural": "Required ARIA attributes not present: ${data.values}"
|
|---|
| 509 | }
|
|---|
| 510 | },
|
|---|
| 511 | "aria-required-children": {
|
|---|
| 512 | "pass": {
|
|---|
| 513 | "default": "Required ARIA children are present",
|
|---|
| 514 | "aria-busy": "Element has an aria-busy attribute, so it is allowed to omit required children"
|
|---|
| 515 | },
|
|---|
| 516 | "fail": {
|
|---|
| 517 | "singular": "Required ARIA child role not present: ${data.values}",
|
|---|
| 518 | "plural": "Required ARIA children role not present: ${data.values}",
|
|---|
| 519 | "unallowed": "Element has children which are not allowed: ${data.values}",
|
|---|
| 520 | "aria-busy-fail": "Element has children which are not allowed: ${data.values}; Having aria-busy=\"true\" does not allow children with roles that are not allowed"
|
|---|
| 521 | },
|
|---|
| 522 | "incomplete": {
|
|---|
| 523 | "singular": "Expecting ARIA child role to be added: ${data.values}",
|
|---|
| 524 | "plural": "Expecting ARIA children role to be added: ${data.values}"
|
|---|
| 525 | }
|
|---|
| 526 | },
|
|---|
| 527 | "aria-required-parent": {
|
|---|
| 528 | "pass": "Required ARIA parent role present",
|
|---|
| 529 | "fail": {
|
|---|
| 530 | "singular": "Required ARIA parent role not present: ${data.values}",
|
|---|
| 531 | "plural": "Required ARIA parents role not present: ${data.values}"
|
|---|
| 532 | }
|
|---|
| 533 | },
|
|---|
| 534 | "aria-roledescription": {
|
|---|
| 535 | "pass": "aria-roledescription used on a supported semantic role",
|
|---|
| 536 | "incomplete": "Check that the aria-roledescription is announced by supported screen readers",
|
|---|
| 537 | "fail": "Give the element a role that supports aria-roledescription"
|
|---|
| 538 | },
|
|---|
| 539 | "aria-unsupported-attr": {
|
|---|
| 540 | "pass": "ARIA attribute is supported",
|
|---|
| 541 | "fail": "ARIA attribute is not widely supported in screen readers and assistive technologies: ${data.values}"
|
|---|
| 542 | },
|
|---|
| 543 | "aria-valid-attr-value": {
|
|---|
| 544 | "pass": "ARIA attribute values are valid",
|
|---|
| 545 | "fail": {
|
|---|
| 546 | "singular": "Invalid ARIA attribute value: ${data.values}",
|
|---|
| 547 | "plural": "Invalid ARIA attribute values: ${data.values}"
|
|---|
| 548 | },
|
|---|
| 549 | "incomplete": {
|
|---|
| 550 | "noId": "ARIA attribute element ID does not exist on the page: ${data.needsReview}",
|
|---|
| 551 | "noIdShadow": "ARIA attribute element ID does not exist on the page or is a descendant of a different shadow DOM tree: ${data.needsReview}",
|
|---|
| 552 | "ariaCurrent": "ARIA attribute value is invalid and will be treated as \"aria-current=true\": ${data.needsReview}",
|
|---|
| 553 | "idrefs": "Unable to determine if ARIA attribute element ID exists on the page: ${data.needsReview}",
|
|---|
| 554 | "empty": "ARIA attribute value is ignored while empty: ${data.needsReview}",
|
|---|
| 555 | "controlsWithinPopup": "Unable to determine if aria-controls referenced ID exists on the page while using aria-haspopup: ${data.needsReview}"
|
|---|
| 556 | }
|
|---|
| 557 | },
|
|---|
| 558 | "aria-valid-attr": {
|
|---|
| 559 | "pass": "ARIA attribute name is valid",
|
|---|
| 560 | "fail": {
|
|---|
| 561 | "singular": "Invalid ARIA attribute name: ${data.values}",
|
|---|
| 562 | "plural": "Invalid ARIA attribute names: ${data.values}"
|
|---|
| 563 | }
|
|---|
| 564 | },
|
|---|
| 565 | "braille-label-equivalent": {
|
|---|
| 566 | "pass": "aria-braillelabel is used on an element with accessible text",
|
|---|
| 567 | "fail": "aria-braillelabel is used on an element with no accessible text",
|
|---|
| 568 | "incomplete": "Unable to compute accessible text"
|
|---|
| 569 | },
|
|---|
| 570 | "braille-roledescription-equivalent": {
|
|---|
| 571 | "pass": "aria-brailleroledescription is used on an element with aria-roledescription",
|
|---|
| 572 | "fail": {
|
|---|
| 573 | "noRoleDescription": "aria-brailleroledescription is used on an element with no aria-roledescription",
|
|---|
| 574 | "emptyRoleDescription": "aria-brailleroledescription is used on an element with an empty aria-roledescription"
|
|---|
| 575 | }
|
|---|
| 576 | },
|
|---|
| 577 | "deprecatedrole": {
|
|---|
| 578 | "pass": "ARIA role is not deprecated",
|
|---|
| 579 | "fail": "The role used is deprecated: ${data}"
|
|---|
| 580 | },
|
|---|
| 581 | "fallbackrole": {
|
|---|
| 582 | "pass": "Only one role value used",
|
|---|
| 583 | "fail": "Use only one role value, since fallback roles are not supported in older browsers",
|
|---|
| 584 | "incomplete": "Use only role 'presentation' or 'none' since they are synonymous."
|
|---|
| 585 | },
|
|---|
| 586 | "has-global-aria-attribute": {
|
|---|
| 587 | "pass": {
|
|---|
| 588 | "singular": "Element has global ARIA attribute: ${data.values}",
|
|---|
| 589 | "plural": "Element has global ARIA attributes: ${data.values}"
|
|---|
| 590 | },
|
|---|
| 591 | "fail": "Element does not have global ARIA attribute"
|
|---|
| 592 | },
|
|---|
| 593 | "has-widget-role": {
|
|---|
| 594 | "pass": "Element has a widget role.",
|
|---|
| 595 | "fail": "Element does not have a widget role."
|
|---|
| 596 | },
|
|---|
| 597 | "invalidrole": {
|
|---|
| 598 | "pass": "ARIA role is valid",
|
|---|
| 599 | "fail": {
|
|---|
| 600 | "singular": "Role must be one of the valid ARIA roles: ${data.values}",
|
|---|
| 601 | "plural": "Roles must be one of the valid ARIA roles: ${data.values}"
|
|---|
| 602 | }
|
|---|
| 603 | },
|
|---|
| 604 | "is-element-focusable": {
|
|---|
| 605 | "pass": "Element is focusable.",
|
|---|
| 606 | "fail": "Element is not focusable."
|
|---|
| 607 | },
|
|---|
| 608 | "no-implicit-explicit-label": {
|
|---|
| 609 | "pass": "There is no mismatch between a <label> and accessible name",
|
|---|
| 610 | "incomplete": "Check that the <label> does not need be part of the ARIA ${data} field's name"
|
|---|
| 611 | },
|
|---|
| 612 | "unsupportedrole": {
|
|---|
| 613 | "pass": "ARIA role is supported",
|
|---|
| 614 | "fail": "The role used is not widely supported in screen readers and assistive technologies: ${data}"
|
|---|
| 615 | },
|
|---|
| 616 | "valid-scrollable-semantics": {
|
|---|
| 617 | "pass": "Element has valid semantics for an element in the focus order.",
|
|---|
| 618 | "fail": "Element has invalid semantics for an element in the focus order."
|
|---|
| 619 | },
|
|---|
| 620 | "color-contrast-enhanced": {
|
|---|
| 621 | "pass": "Element has sufficient color contrast of ${data.contrastRatio}",
|
|---|
| 622 | "fail": {
|
|---|
| 623 | "default": "Element has insufficient color contrast of ${data.contrastRatio} (foreground color: ${data.fgColor}, background color: ${data.bgColor}, font size: ${data.fontSize}, font weight: ${data.fontWeight}). Expected contrast ratio of ${data.expectedContrastRatio}",
|
|---|
| 624 | "fgOnShadowColor": "Element has insufficient color contrast of ${data.contrastRatio} between the foreground and shadow color (foreground color: ${data.fgColor}, text-shadow color: ${data.shadowColor}, font size: ${data.fontSize}, font weight: ${data.fontWeight}). Expected contrast ratio of ${data.expectedContrastRatio}",
|
|---|
| 625 | "shadowOnBgColor": "Element has insufficient color contrast of ${data.contrastRatio} between the shadow color and background color (text-shadow color: ${data.shadowColor}, background color: ${data.bgColor}, font size: ${data.fontSize}, font weight: ${data.fontWeight}). Expected contrast ratio of ${data.expectedContrastRatio}"
|
|---|
| 626 | },
|
|---|
| 627 | "incomplete": {
|
|---|
| 628 | "default": "Unable to determine contrast ratio",
|
|---|
| 629 | "bgImage": "Element's background color could not be determined due to a background image",
|
|---|
| 630 | "bgGradient": "Element's background color could not be determined due to a background gradient",
|
|---|
| 631 | "imgNode": "Element's background color could not be determined because element contains an image node",
|
|---|
| 632 | "bgOverlap": "Element's background color could not be determined because it is overlapped by another element",
|
|---|
| 633 | "fgAlpha": "Element's foreground color could not be determined because of alpha transparency",
|
|---|
| 634 | "elmPartiallyObscured": "Element's background color could not be determined because it's partially obscured by another element",
|
|---|
| 635 | "elmPartiallyObscuring": "Element's background color could not be determined because it partially overlaps other elements",
|
|---|
| 636 | "outsideViewport": "Element's background color could not be determined because it's outside the viewport",
|
|---|
| 637 | "equalRatio": "Element has a 1:1 contrast ratio with the background",
|
|---|
| 638 | "shortTextContent": "Element content is too short to determine if it is actual text content",
|
|---|
| 639 | "nonBmp": "Element content contains only non-text characters",
|
|---|
| 640 | "pseudoContent": "Element's background color could not be determined due to a pseudo element",
|
|---|
| 641 | "colorParse": "Could not parse color string ${data.colorParse}"
|
|---|
| 642 | }
|
|---|
| 643 | },
|
|---|
| 644 | "color-contrast": {
|
|---|
| 645 | "pass": {
|
|---|
| 646 | "default": "Element has sufficient color contrast of ${data.contrastRatio}",
|
|---|
| 647 | "hidden": "Element is hidden"
|
|---|
| 648 | },
|
|---|
| 649 | "fail": {
|
|---|
| 650 | "default": "Element has insufficient color contrast of ${data.contrastRatio} (foreground color: ${data.fgColor}, background color: ${data.bgColor}, font size: ${data.fontSize}, font weight: ${data.fontWeight}). Expected contrast ratio of ${data.expectedContrastRatio}",
|
|---|
| 651 | "fgOnShadowColor": "Element has insufficient color contrast of ${data.contrastRatio} between the foreground and shadow color (foreground color: ${data.fgColor}, text-shadow color: ${data.shadowColor}, font size: ${data.fontSize}, font weight: ${data.fontWeight}). Expected contrast ratio of ${data.expectedContrastRatio}",
|
|---|
| 652 | "shadowOnBgColor": "Element has insufficient color contrast of ${data.contrastRatio} between the shadow color and background color (text-shadow color: ${data.shadowColor}, background color: ${data.bgColor}, font size: ${data.fontSize}, font weight: ${data.fontWeight}). Expected contrast ratio of ${data.expectedContrastRatio}"
|
|---|
| 653 | },
|
|---|
| 654 | "incomplete": {
|
|---|
| 655 | "default": "Unable to determine contrast ratio",
|
|---|
| 656 | "bgImage": "Element's background color could not be determined due to a background image",
|
|---|
| 657 | "bgGradient": "Element's background color could not be determined due to a background gradient",
|
|---|
| 658 | "imgNode": "Element's background color could not be determined because element contains an image node",
|
|---|
| 659 | "bgOverlap": "Element's background color could not be determined because it is overlapped by another element",
|
|---|
| 660 | "complexTextShadows": "Element's contrast could not be determined because it uses complex text shadows",
|
|---|
| 661 | "fgAlpha": "Element's foreground color could not be determined because of alpha transparency",
|
|---|
| 662 | "elmPartiallyObscured": "Element's background color could not be determined because it's partially obscured by another element",
|
|---|
| 663 | "elmPartiallyObscuring": "Element's background color could not be determined because it partially overlaps other elements",
|
|---|
| 664 | "outsideViewport": "Element's background color could not be determined because it's outside the viewport",
|
|---|
| 665 | "equalRatio": "Element has a 1:1 contrast ratio with the background",
|
|---|
| 666 | "shortTextContent": "Element content is too short to determine if it is actual text content",
|
|---|
| 667 | "nonBmp": "Element content contains only non-text characters",
|
|---|
| 668 | "pseudoContent": "Element's background color could not be determined due to a pseudo element",
|
|---|
| 669 | "colorParse": "Could not parse color string ${data.colorParse}"
|
|---|
| 670 | }
|
|---|
| 671 | },
|
|---|
| 672 | "link-in-text-block-style": {
|
|---|
| 673 | "pass": "Links can be distinguished from surrounding text by visual styling",
|
|---|
| 674 | "incomplete": {
|
|---|
| 675 | "default": "Check if the link needs styling to distinguish it from nearby text",
|
|---|
| 676 | "pseudoContent": "Check if the link's pseudo style is sufficient to distinguish it from the surrounding text"
|
|---|
| 677 | },
|
|---|
| 678 | "fail": "The link has no styling (such as underline) to distinguish it from the surrounding text"
|
|---|
| 679 | },
|
|---|
| 680 | "link-in-text-block": {
|
|---|
| 681 | "pass": "Links can be distinguished from surrounding text in some way other than by color",
|
|---|
| 682 | "fail": {
|
|---|
| 683 | "fgContrast": "The link has insufficient color contrast of ${data.contrastRatio}:1 with the surrounding text. (Minimum contrast is ${data.requiredContrastRatio}:1, link text: ${data.nodeColor}, surrounding text: ${data.parentColor})",
|
|---|
| 684 | "bgContrast": "The link background has insufficient color contrast of ${data.contrastRatio} (Minimum contrast is ${data.requiredContrastRatio}:1, link background color: ${data.nodeBackgroundColor}, surrounding background color: ${data.parentBackgroundColor})"
|
|---|
| 685 | },
|
|---|
| 686 | "incomplete": {
|
|---|
| 687 | "default": "Element's foreground contrast ratio could not be determined",
|
|---|
| 688 | "bgContrast": "Element's background contrast ratio could not be determined",
|
|---|
| 689 | "bgImage": "Element's contrast ratio could not be determined due to a background image",
|
|---|
| 690 | "bgGradient": "Element's contrast ratio could not be determined due to a background gradient",
|
|---|
| 691 | "imgNode": "Element's contrast ratio could not be determined because element contains an image node",
|
|---|
| 692 | "bgOverlap": "Element's contrast ratio could not be determined because of element overlap"
|
|---|
| 693 | }
|
|---|
| 694 | },
|
|---|
| 695 | "autocomplete-appropriate": {
|
|---|
| 696 | "pass": "The autocomplete value is on an appropriate element",
|
|---|
| 697 | "fail": "The autocomplete value is inappropriate for this type of input"
|
|---|
| 698 | },
|
|---|
| 699 | "autocomplete-valid": {
|
|---|
| 700 | "pass": "the autocomplete attribute is correctly formatted",
|
|---|
| 701 | "fail": "the autocomplete attribute is incorrectly formatted",
|
|---|
| 702 | "incomplete": "the autocomplete attribute has a non-standard value. Check whether any standard value could be used instead."
|
|---|
| 703 | },
|
|---|
| 704 | "accesskeys": {
|
|---|
| 705 | "pass": "Accesskey attribute value is unique",
|
|---|
| 706 | "fail": "Document has multiple elements with the same accesskey"
|
|---|
| 707 | },
|
|---|
| 708 | "focusable-content": {
|
|---|
| 709 | "pass": "Element contains focusable elements",
|
|---|
| 710 | "fail": "Element should have focusable content"
|
|---|
| 711 | },
|
|---|
| 712 | "focusable-disabled": {
|
|---|
| 713 | "pass": "No focusable elements contained within element",
|
|---|
| 714 | "incomplete": "Check if the focusable elements immediately move the focus indicator",
|
|---|
| 715 | "fail": "Focusable content should be disabled or be removed from the DOM"
|
|---|
| 716 | },
|
|---|
| 717 | "focusable-element": {
|
|---|
| 718 | "pass": "Element is focusable",
|
|---|
| 719 | "fail": "Element should be focusable"
|
|---|
| 720 | },
|
|---|
| 721 | "focusable-modal-open": {
|
|---|
| 722 | "pass": "No focusable elements while a modal is open",
|
|---|
| 723 | "incomplete": "Check that focusable elements are not tabbable in the current state"
|
|---|
| 724 | },
|
|---|
| 725 | "focusable-no-name": {
|
|---|
| 726 | "pass": "Element is not in tab order or has accessible text",
|
|---|
| 727 | "fail": "Element is in tab order and does not have accessible text",
|
|---|
| 728 | "incomplete": "Unable to determine if element has an accessible name"
|
|---|
| 729 | },
|
|---|
| 730 | "focusable-not-tabbable": {
|
|---|
| 731 | "pass": "No focusable elements contained within element",
|
|---|
| 732 | "incomplete": "Check if the focusable elements immediately move the focus indicator",
|
|---|
| 733 | "fail": "Focusable content should have tabindex=\"-1\" or be removed from the DOM"
|
|---|
| 734 | },
|
|---|
| 735 | "frame-focusable-content": {
|
|---|
| 736 | "pass": "Element does not have focusable descendants",
|
|---|
| 737 | "fail": "Element has focusable descendants",
|
|---|
| 738 | "incomplete": "Could not determine if element has descendants"
|
|---|
| 739 | },
|
|---|
| 740 | "landmark-is-top-level": {
|
|---|
| 741 | "pass": "The ${data.role} landmark is at the top level.",
|
|---|
| 742 | "fail": "The ${data.role} landmark is contained in another landmark."
|
|---|
| 743 | },
|
|---|
| 744 | "no-focusable-content": {
|
|---|
| 745 | "pass": "Element does not have focusable descendants",
|
|---|
| 746 | "fail": {
|
|---|
| 747 | "default": "Element has focusable descendants",
|
|---|
| 748 | "notHidden": "Using a negative tabindex on an element inside an interactive control does not prevent assistive technologies from focusing the element (even with aria-hidden=\"true\")"
|
|---|
| 749 | },
|
|---|
| 750 | "incomplete": "Could not determine if element has descendants"
|
|---|
| 751 | },
|
|---|
| 752 | "page-has-heading-one": {
|
|---|
| 753 | "pass": "Page has at least one level-one heading",
|
|---|
| 754 | "fail": "Page must have a level-one heading"
|
|---|
| 755 | },
|
|---|
| 756 | "page-has-main": {
|
|---|
| 757 | "pass": "Document has at least one main landmark",
|
|---|
| 758 | "fail": "Document does not have a main landmark"
|
|---|
| 759 | },
|
|---|
| 760 | "page-no-duplicate-banner": {
|
|---|
| 761 | "pass": "Document does not have more than one banner landmark",
|
|---|
| 762 | "fail": "Document has more than one banner landmark"
|
|---|
| 763 | },
|
|---|
| 764 | "page-no-duplicate-contentinfo": {
|
|---|
| 765 | "pass": "Document does not have more than one contentinfo landmark",
|
|---|
| 766 | "fail": "Document has more than one contentinfo landmark"
|
|---|
| 767 | },
|
|---|
| 768 | "page-no-duplicate-main": {
|
|---|
| 769 | "pass": "Document does not have more than one main landmark",
|
|---|
| 770 | "fail": "Document has more than one main landmark"
|
|---|
| 771 | },
|
|---|
| 772 | "tabindex": {
|
|---|
| 773 | "pass": "Element does not have a tabindex greater than 0",
|
|---|
| 774 | "fail": "Element has a tabindex greater than 0"
|
|---|
| 775 | },
|
|---|
| 776 | "alt-space-value": {
|
|---|
| 777 | "pass": "Element has a valid alt attribute value",
|
|---|
| 778 | "fail": "Element has an alt attribute containing only a space character, which is not ignored by all screen readers"
|
|---|
| 779 | },
|
|---|
| 780 | "duplicate-img-label": {
|
|---|
| 781 | "pass": "Element does not duplicate existing text in <img> alt text",
|
|---|
| 782 | "fail": "Element contains <img> element with alt text that duplicates existing text"
|
|---|
| 783 | },
|
|---|
| 784 | "explicit-label": {
|
|---|
| 785 | "pass": "Element has an explicit <label>",
|
|---|
| 786 | "fail": "Element does not have an explicit <label>",
|
|---|
| 787 | "incomplete": "Unable to determine if form element has an explicit <label>"
|
|---|
| 788 | },
|
|---|
| 789 | "help-same-as-label": {
|
|---|
| 790 | "pass": "Help text (title or aria-describedby) does not duplicate label text",
|
|---|
| 791 | "fail": "Help text (title or aria-describedby) text is the same as the label text"
|
|---|
| 792 | },
|
|---|
| 793 | "hidden-explicit-label": {
|
|---|
| 794 | "pass": "Form element has a visible explicit <label>",
|
|---|
| 795 | "fail": "Form element has explicit <label> that is hidden",
|
|---|
| 796 | "incomplete": "Unable to determine if form element has explicit <label> that is hidden"
|
|---|
| 797 | },
|
|---|
| 798 | "implicit-label": {
|
|---|
| 799 | "pass": "Element has an implicit (wrapped) <label>",
|
|---|
| 800 | "fail": "Element does not have an implicit (wrapped) <label>",
|
|---|
| 801 | "incomplete": "Unable to determine if form element has an implicit (wrapped) <label>"
|
|---|
| 802 | },
|
|---|
| 803 | "label-content-name-mismatch": {
|
|---|
| 804 | "pass": "Element contains visible text as part of it's accessible name",
|
|---|
| 805 | "fail": "Text inside the element is not included in the accessible name"
|
|---|
| 806 | },
|
|---|
| 807 | "multiple-label": {
|
|---|
| 808 | "pass": "Form field does not have multiple label elements",
|
|---|
| 809 | "incomplete": "Multiple label elements is not widely supported in assistive technologies. Ensure the first label contains all necessary information."
|
|---|
| 810 | },
|
|---|
| 811 | "title-only": {
|
|---|
| 812 | "pass": "Form element does not solely use title attribute for its label",
|
|---|
| 813 | "fail": "Only title used to generate label for form element"
|
|---|
| 814 | },
|
|---|
| 815 | "landmark-is-unique": {
|
|---|
| 816 | "pass": "Landmarks must have a unique role or role/label/title (i.e. accessible name) combination",
|
|---|
| 817 | "fail": "The landmark must have a unique aria-label, aria-labelledby, or title to make landmarks distinguishable"
|
|---|
| 818 | },
|
|---|
| 819 | "has-lang": {
|
|---|
| 820 | "pass": "The <html> element has a lang attribute",
|
|---|
| 821 | "fail": {
|
|---|
| 822 | "noXHTML": "The xml:lang attribute is not valid on HTML pages, use the lang attribute.",
|
|---|
| 823 | "noLang": "The <html> element does not have a lang attribute"
|
|---|
| 824 | }
|
|---|
| 825 | },
|
|---|
| 826 | "valid-lang": {
|
|---|
| 827 | "pass": "Value of lang attribute is included in the list of valid languages",
|
|---|
| 828 | "fail": "Value of lang attribute not included in the list of valid languages"
|
|---|
| 829 | },
|
|---|
| 830 | "xml-lang-mismatch": {
|
|---|
| 831 | "pass": "Lang and xml:lang attributes have the same base language",
|
|---|
| 832 | "fail": "Lang and xml:lang attributes do not have the same base language"
|
|---|
| 833 | },
|
|---|
| 834 | "dlitem": {
|
|---|
| 835 | "pass": "Description list item has a <dl> parent element",
|
|---|
| 836 | "fail": "Description list item does not have a <dl> parent element"
|
|---|
| 837 | },
|
|---|
| 838 | "listitem": {
|
|---|
| 839 | "pass": "List item has a <ul>, <ol> or role=\"list\" parent element",
|
|---|
| 840 | "fail": {
|
|---|
| 841 | "default": "List item does not have a <ul>, <ol> parent element",
|
|---|
| 842 | "roleNotValid": "List item parent element has a role that is not role=\"list\""
|
|---|
| 843 | }
|
|---|
| 844 | },
|
|---|
| 845 | "only-dlitems": {
|
|---|
| 846 | "pass": "dl element only has direct children that are allowed inside; <dt>, <dd>, or <div> elements",
|
|---|
| 847 | "fail": "dl element has direct children that are not allowed: ${data.values}"
|
|---|
| 848 | },
|
|---|
| 849 | "only-listitems": {
|
|---|
| 850 | "pass": "List element only has direct children that are allowed inside <li> elements",
|
|---|
| 851 | "fail": "List element has direct children that are not allowed: ${data.values}"
|
|---|
| 852 | },
|
|---|
| 853 | "structured-dlitems": {
|
|---|
| 854 | "pass": "When not empty, element has both <dt> and <dd> elements",
|
|---|
| 855 | "fail": "When not empty, element does not have at least one <dt> element followed by at least one <dd> element"
|
|---|
| 856 | },
|
|---|
| 857 | "caption": {
|
|---|
| 858 | "pass": "The multimedia element has a captions track",
|
|---|
| 859 | "incomplete": "Check that captions are available for the element"
|
|---|
| 860 | },
|
|---|
| 861 | "frame-tested": {
|
|---|
| 862 | "pass": "The iframe was tested with axe-core",
|
|---|
| 863 | "fail": "The iframe could not be tested with axe-core",
|
|---|
| 864 | "incomplete": "The iframe still has to be tested with axe-core"
|
|---|
| 865 | },
|
|---|
| 866 | "no-autoplay-audio": {
|
|---|
| 867 | "pass": "<video> or <audio> does not output audio for more than allowed duration or has controls mechanism",
|
|---|
| 868 | "fail": "<video> or <audio> outputs audio for more than allowed duration and does not have a controls mechanism",
|
|---|
| 869 | "incomplete": "Check that the <video> or <audio> does not output audio for more than allowed duration or provides a controls mechanism"
|
|---|
| 870 | },
|
|---|
| 871 | "css-orientation-lock": {
|
|---|
| 872 | "pass": "Display is operable, and orientation lock does not exist",
|
|---|
| 873 | "fail": "CSS Orientation lock is applied, and makes display inoperable",
|
|---|
| 874 | "incomplete": "CSS Orientation lock cannot be determined"
|
|---|
| 875 | },
|
|---|
| 876 | "meta-viewport-large": {
|
|---|
| 877 | "pass": "<meta> tag does not prevent significant zooming on mobile devices",
|
|---|
| 878 | "fail": "<meta> tag limits zooming on mobile devices"
|
|---|
| 879 | },
|
|---|
| 880 | "meta-viewport": {
|
|---|
| 881 | "pass": "<meta> tag does not disable zooming on mobile devices",
|
|---|
| 882 | "fail": "${data} on <meta> tag disables zooming on mobile devices"
|
|---|
| 883 | },
|
|---|
| 884 | "target-offset": {
|
|---|
| 885 | "pass": {
|
|---|
| 886 | "default": "Target has sufficient space from its closest neighbors. Safe clickable space has a diameter of ${data.closestOffset}px which is at least ${data.minOffset}px.",
|
|---|
| 887 | "large": "Target far exceeds the minimum size of ${data.minOffset}px."
|
|---|
| 888 | },
|
|---|
| 889 | "fail": "Target has insufficient space to its closest neighbors. Safe clickable space has a diameter of ${data.closestOffset}px instead of at least ${data.minOffset}px.",
|
|---|
| 890 | "incomplete": {
|
|---|
| 891 | "default": "Element with negative tabindex has insufficient space to its closest neighbors. Safe clickable space has a diameter of ${data.closestOffset}px instead of at least ${data.minOffset}px. Is this a target?",
|
|---|
| 892 | "nonTabbableNeighbor": "Target has insufficient space to its closest neighbors. Safe clickable space has a diameter of ${data.closestOffset}px instead of at least ${data.minOffset}px. Is the neighbor a target?",
|
|---|
| 893 | "tooManyRects": "Could not get the target size because there are too many overlapping elements"
|
|---|
| 894 | }
|
|---|
| 895 | },
|
|---|
| 896 | "target-size": {
|
|---|
| 897 | "pass": {
|
|---|
| 898 | "default": "Control has sufficient size (${data.width}px by ${data.height}px, should be at least ${data.minSize}px by ${data.minSize}px)",
|
|---|
| 899 | "obscured": "Control is ignored because it is fully obscured and thus not clickable",
|
|---|
| 900 | "large": "Target far exceeds the minimum size of ${data.minSize}px."
|
|---|
| 901 | },
|
|---|
| 902 | "fail": {
|
|---|
| 903 | "default": "Target has insufficient size (${data.width}px by ${data.height}px, should be at least ${data.minSize}px by ${data.minSize}px)",
|
|---|
| 904 | "partiallyObscured": "Target has insufficient size because it is partially obscured (smallest space is ${data.width}px by ${data.height}px, should be at least ${data.minSize}px by ${data.minSize}px)"
|
|---|
| 905 | },
|
|---|
| 906 | "incomplete": {
|
|---|
| 907 | "default": "Element with negative tabindex has insufficient size (${data.width}px by ${data.height}px, should be at least ${data.minSize}px by ${data.minSize}px). Is this a target?",
|
|---|
| 908 | "contentOverflow": "Element size could not be accurately determined due to overflow content",
|
|---|
| 909 | "partiallyObscured": "Element with negative tabindex has insufficient size because it is partially obscured (smallest space is ${data.width}px by ${data.height}px, should be at least ${data.minSize}px by ${data.minSize}px). Is this a target?",
|
|---|
| 910 | "partiallyObscuredNonTabbable": "Target has insufficient size because it is partially obscured by a neighbor with negative tabindex (smallest space is ${data.width}px by ${data.height}px, should be at least ${data.minSize}px by ${data.minSize}px). Is the neighbor a target?",
|
|---|
| 911 | "tooManyRects": "Could not get the target size because there are too many overlapping elements"
|
|---|
| 912 | }
|
|---|
| 913 | },
|
|---|
| 914 | "header-present": {
|
|---|
| 915 | "pass": "Page has a heading",
|
|---|
| 916 | "fail": "Page does not have a heading"
|
|---|
| 917 | },
|
|---|
| 918 | "heading-order": {
|
|---|
| 919 | "pass": "Heading order valid",
|
|---|
| 920 | "fail": "Heading order invalid",
|
|---|
| 921 | "incomplete": "Unable to determine previous heading"
|
|---|
| 922 | },
|
|---|
| 923 | "identical-links-same-purpose": {
|
|---|
| 924 | "pass": "There are no other links with the same name, that go to a different URL",
|
|---|
| 925 | "incomplete": "Check that links have the same purpose, or are intentionally ambiguous."
|
|---|
| 926 | },
|
|---|
| 927 | "internal-link-present": {
|
|---|
| 928 | "pass": "Valid skip link found",
|
|---|
| 929 | "fail": "No valid skip link found"
|
|---|
| 930 | },
|
|---|
| 931 | "landmark": {
|
|---|
| 932 | "pass": "Page has a landmark region",
|
|---|
| 933 | "fail": "Page does not have a landmark region"
|
|---|
| 934 | },
|
|---|
| 935 | "meta-refresh-no-exceptions": {
|
|---|
| 936 | "pass": "<meta> tag does not immediately refresh the page",
|
|---|
| 937 | "fail": "<meta> tag forces timed refresh of page"
|
|---|
| 938 | },
|
|---|
| 939 | "meta-refresh": {
|
|---|
| 940 | "pass": "<meta> tag does not immediately refresh the page",
|
|---|
| 941 | "fail": "<meta> tag forces timed refresh of page (less than 20 hours)"
|
|---|
| 942 | },
|
|---|
| 943 | "p-as-heading": {
|
|---|
| 944 | "pass": "<p> elements are not styled as headings",
|
|---|
| 945 | "fail": "Heading elements should be used instead of styled <p> elements",
|
|---|
| 946 | "incomplete": "Unable to determine if <p> elements are styled as headings"
|
|---|
| 947 | },
|
|---|
| 948 | "region": {
|
|---|
| 949 | "pass": "All page content is contained by landmarks",
|
|---|
| 950 | "fail": "Some page content is not contained by landmarks"
|
|---|
| 951 | },
|
|---|
| 952 | "skip-link": {
|
|---|
| 953 | "pass": "Skip link target exists",
|
|---|
| 954 | "incomplete": "Skip link target should become visible on activation",
|
|---|
| 955 | "fail": "No skip link target"
|
|---|
| 956 | },
|
|---|
| 957 | "unique-frame-title": {
|
|---|
| 958 | "pass": "Element's title attribute is unique",
|
|---|
| 959 | "fail": "Element's title attribute is not unique"
|
|---|
| 960 | },
|
|---|
| 961 | "duplicate-id-active": {
|
|---|
| 962 | "pass": "Document has no active elements that share the same id attribute",
|
|---|
| 963 | "fail": "Document has active elements with the same id attribute: ${data}"
|
|---|
| 964 | },
|
|---|
| 965 | "duplicate-id-aria": {
|
|---|
| 966 | "pass": "Document has no elements referenced with ARIA or labels that share the same id attribute",
|
|---|
| 967 | "fail": "Document has multiple elements referenced with ARIA with the same id attribute: ${data}"
|
|---|
| 968 | },
|
|---|
| 969 | "duplicate-id": {
|
|---|
| 970 | "pass": "Document has no static elements that share the same id attribute",
|
|---|
| 971 | "fail": "Document has multiple static elements with the same id attribute: ${data}"
|
|---|
| 972 | },
|
|---|
| 973 | "aria-label": {
|
|---|
| 974 | "pass": "aria-label attribute exists and is not empty",
|
|---|
| 975 | "fail": "aria-label attribute does not exist or is empty"
|
|---|
| 976 | },
|
|---|
| 977 | "aria-labelledby": {
|
|---|
| 978 | "pass": "aria-labelledby attribute exists and references elements that are visible to screen readers",
|
|---|
| 979 | "fail": "aria-labelledby attribute does not exist, references elements that do not exist or references elements that are empty",
|
|---|
| 980 | "incomplete": "Ensure aria-labelledby references an existing element"
|
|---|
| 981 | },
|
|---|
| 982 | "avoid-inline-spacing": {
|
|---|
| 983 | "pass": "No inline styles with '!important' that affect text spacing has been specified",
|
|---|
| 984 | "fail": {
|
|---|
| 985 | "singular": "Remove '!important' from inline style ${data.values}, as overriding this is not supported by most browsers",
|
|---|
| 986 | "plural": "Remove '!important' from inline styles ${data.values}, as overriding this is not supported by most browsers"
|
|---|
| 987 | }
|
|---|
| 988 | },
|
|---|
| 989 | "button-has-visible-text": {
|
|---|
| 990 | "pass": "Element has inner text that is visible to screen readers",
|
|---|
| 991 | "fail": "Element does not have inner text that is visible to screen readers",
|
|---|
| 992 | "incomplete": "Unable to determine if element has children"
|
|---|
| 993 | },
|
|---|
| 994 | "doc-has-title": {
|
|---|
| 995 | "pass": "Document has a non-empty <title> element",
|
|---|
| 996 | "fail": "Document does not have a non-empty <title> element"
|
|---|
| 997 | },
|
|---|
| 998 | "error-occurred": {
|
|---|
| 999 | "pass": "",
|
|---|
| 1000 | "incomplete": "Axe encountered an error; test the page for this type of problem manually"
|
|---|
| 1001 | },
|
|---|
| 1002 | "exists": {
|
|---|
| 1003 | "pass": "Element does not exist",
|
|---|
| 1004 | "incomplete": "Element exists"
|
|---|
| 1005 | },
|
|---|
| 1006 | "has-alt": {
|
|---|
| 1007 | "pass": "Element has an alt attribute",
|
|---|
| 1008 | "fail": "Element does not have an alt attribute"
|
|---|
| 1009 | },
|
|---|
| 1010 | "has-visible-text": {
|
|---|
| 1011 | "pass": "Element has text that is visible to screen readers",
|
|---|
| 1012 | "fail": "Element does not have text that is visible to screen readers",
|
|---|
| 1013 | "incomplete": "Unable to determine if element has children"
|
|---|
| 1014 | },
|
|---|
| 1015 | "important-letter-spacing": {
|
|---|
| 1016 | "pass": "Letter-spacing in the style attribute is not set to !important, or meets the minimum",
|
|---|
| 1017 | "fail": "letter-spacing in the style attribute must not use !important, or be at ${data.minValue}em (current ${data.value}em)"
|
|---|
| 1018 | },
|
|---|
| 1019 | "important-line-height": {
|
|---|
| 1020 | "pass": "line-height in the style attribute is not set to !important, or meets the minimum",
|
|---|
| 1021 | "fail": "line-height in the style attribute must not use !important, or be at ${data.minValue}em (current ${data.value}em)"
|
|---|
| 1022 | },
|
|---|
| 1023 | "important-word-spacing": {
|
|---|
| 1024 | "pass": "word-spacing in the style attribute is not set to !important, or meets the minimum",
|
|---|
| 1025 | "fail": "word-spacing in the style attribute must not use !important, or be at ${data.minValue}em (current ${data.value}em)"
|
|---|
| 1026 | },
|
|---|
| 1027 | "is-on-screen": {
|
|---|
| 1028 | "pass": "Element is not visible",
|
|---|
| 1029 | "fail": "Element is visible"
|
|---|
| 1030 | },
|
|---|
| 1031 | "non-empty-alt": {
|
|---|
| 1032 | "pass": "Element has a non-empty alt attribute",
|
|---|
| 1033 | "fail": {
|
|---|
| 1034 | "noAttr": "Element has no alt attribute",
|
|---|
| 1035 | "emptyAttr": "Element has an empty alt attribute"
|
|---|
| 1036 | }
|
|---|
| 1037 | },
|
|---|
| 1038 | "non-empty-if-present": {
|
|---|
| 1039 | "pass": {
|
|---|
| 1040 | "default": "Element does not have a value attribute",
|
|---|
| 1041 | "has-label": "Element has a non-empty value attribute"
|
|---|
| 1042 | },
|
|---|
| 1043 | "fail": "Element has a value attribute and the value attribute is empty"
|
|---|
| 1044 | },
|
|---|
| 1045 | "non-empty-placeholder": {
|
|---|
| 1046 | "pass": "Element has a placeholder attribute",
|
|---|
| 1047 | "fail": {
|
|---|
| 1048 | "noAttr": "Element has no placeholder attribute",
|
|---|
| 1049 | "emptyAttr": "Element has an empty placeholder attribute"
|
|---|
| 1050 | }
|
|---|
| 1051 | },
|
|---|
| 1052 | "non-empty-title": {
|
|---|
| 1053 | "pass": "Element has a title attribute",
|
|---|
| 1054 | "fail": {
|
|---|
| 1055 | "noAttr": "Element has no title attribute",
|
|---|
| 1056 | "emptyAttr": "Element has an empty title attribute"
|
|---|
| 1057 | }
|
|---|
| 1058 | },
|
|---|
| 1059 | "non-empty-value": {
|
|---|
| 1060 | "pass": "Element has a non-empty value attribute",
|
|---|
| 1061 | "fail": {
|
|---|
| 1062 | "noAttr": "Element has no value attribute",
|
|---|
| 1063 | "emptyAttr": "Element has an empty value attribute"
|
|---|
| 1064 | }
|
|---|
| 1065 | },
|
|---|
| 1066 | "presentational-role": {
|
|---|
| 1067 | "pass": "Element's default semantics were overridden with role=\"${data.role}\"",
|
|---|
| 1068 | "fail": {
|
|---|
| 1069 | "default": "Element's default semantics were not overridden with role=\"none\" or role=\"presentation\"",
|
|---|
| 1070 | "globalAria": "Element's role is not presentational because it has a global ARIA attribute",
|
|---|
| 1071 | "focusable": "Element's role is not presentational because it is focusable",
|
|---|
| 1072 | "both": "Element's role is not presentational because it has a global ARIA attribute and is focusable",
|
|---|
| 1073 | "iframe": "Using the \"title\" attribute on an ${data.nodeName} element with a presentational role behaves inconsistently between screen readers"
|
|---|
| 1074 | }
|
|---|
| 1075 | },
|
|---|
| 1076 | "role-none": {
|
|---|
| 1077 | "pass": "Element's default semantics were overridden with role=\"none\"",
|
|---|
| 1078 | "fail": "Element's default semantics were not overridden with role=\"none\""
|
|---|
| 1079 | },
|
|---|
| 1080 | "role-presentation": {
|
|---|
| 1081 | "pass": "Element's default semantics were overridden with role=\"presentation\"",
|
|---|
| 1082 | "fail": "Element's default semantics were not overridden with role=\"presentation\""
|
|---|
| 1083 | },
|
|---|
| 1084 | "svg-non-empty-title": {
|
|---|
| 1085 | "pass": "Element has a child that is a title",
|
|---|
| 1086 | "fail": {
|
|---|
| 1087 | "noTitle": "Element has no child that is a title",
|
|---|
| 1088 | "emptyTitle": "Element child title is empty"
|
|---|
| 1089 | },
|
|---|
| 1090 | "incomplete": "Unable to determine element has a child that is a title"
|
|---|
| 1091 | },
|
|---|
| 1092 | "caption-faked": {
|
|---|
| 1093 | "pass": "The first row of a table is not used as a caption",
|
|---|
| 1094 | "fail": "The first child of the table should be a caption instead of a table cell"
|
|---|
| 1095 | },
|
|---|
| 1096 | "html5-scope": {
|
|---|
| 1097 | "pass": "Scope attribute is only used on table header elements (<th>)",
|
|---|
| 1098 | "fail": "In HTML 5, scope attributes may only be used on table header elements (<th>)"
|
|---|
| 1099 | },
|
|---|
| 1100 | "same-caption-summary": {
|
|---|
| 1101 | "pass": "Content of summary attribute and <caption> are not duplicated",
|
|---|
| 1102 | "fail": "Content of summary attribute and <caption> element are identical",
|
|---|
| 1103 | "incomplete": "Unable to determine if <table> element has a caption"
|
|---|
| 1104 | },
|
|---|
| 1105 | "scope-value": {
|
|---|
| 1106 | "pass": "Scope attribute is used correctly",
|
|---|
| 1107 | "fail": "The value of the scope attribute may only be 'row' or 'col'"
|
|---|
| 1108 | },
|
|---|
| 1109 | "td-has-header": {
|
|---|
| 1110 | "pass": "All non-empty data cells have table headers",
|
|---|
| 1111 | "fail": "Some non-empty data cells do not have table headers"
|
|---|
| 1112 | },
|
|---|
| 1113 | "td-headers-attr": {
|
|---|
| 1114 | "pass": "The headers attribute is exclusively used to refer to other header cells in the table",
|
|---|
| 1115 | "incomplete": "The headers attribute is empty",
|
|---|
| 1116 | "fail": {
|
|---|
| 1117 | "cell-header-not-in-table": "The headers attribute is not exclusively used to refer to other header cells in the table",
|
|---|
| 1118 | "cell-header-not-th": "The headers attribute must refer to header cells, not data cells",
|
|---|
| 1119 | "header-refs-self": "The element with headers attribute refers to itself"
|
|---|
| 1120 | }
|
|---|
| 1121 | },
|
|---|
| 1122 | "th-has-data-cells": {
|
|---|
| 1123 | "pass": "All table header cells refer to data cells",
|
|---|
| 1124 | "fail": "Not all table header cells refer to data cells",
|
|---|
| 1125 | "incomplete": "Table data cells are missing or empty"
|
|---|
| 1126 | },
|
|---|
| 1127 | "hidden-content": {
|
|---|
| 1128 | "pass": "All content on the page has been analyzed.",
|
|---|
| 1129 | "fail": "There were problems analyzing the content on this page.",
|
|---|
| 1130 | "incomplete": "There is hidden content on the page that was not analyzed. You will need to trigger the display of this content in order to analyze it."
|
|---|
| 1131 | }
|
|---|
| 1132 | },
|
|---|
| 1133 | "failureSummaries": {
|
|---|
| 1134 | "any": {
|
|---|
| 1135 | "failureMessage": "Fix any of the following:{{~it:value}}\n {{=value.split('\\n').join('\\n ')}}{{~}}"
|
|---|
| 1136 | },
|
|---|
| 1137 | "none": {
|
|---|
| 1138 | "failureMessage": "Fix all of the following:{{~it:value}}\n {{=value.split('\\n').join('\\n ')}}{{~}}"
|
|---|
| 1139 | }
|
|---|
| 1140 | },
|
|---|
| 1141 | "incompleteFallbackMessage": "axe couldn't tell the reason. Time to break out the element inspector!"
|
|---|
| 1142 | }
|
|---|