axe-core 4.1.2-canary.ec00dc7 → 4.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (640) hide show
  1. package/CHANGELOG.md +0 -46
  2. package/CONTRIBUTING.md +57 -112
  3. package/README.md +50 -59
  4. package/axe.d.ts +281 -282
  5. package/axe.js +678 -1285
  6. package/axe.min.js +2 -2
  7. package/bower.json +38 -44
  8. package/doc/API.md +133 -178
  9. package/doc/check-message-template.md +3 -3
  10. package/doc/check-options.md +25 -25
  11. package/doc/developer-guide.md +48 -48
  12. package/doc/examples/chrome-debugging-protocol/axe-cdp.js +56 -56
  13. package/doc/examples/chrome-debugging-protocol/package.json +9 -9
  14. package/doc/examples/html-handlebars.md +52 -52
  15. package/doc/examples/jasmine/karma.conf.js +15 -15
  16. package/doc/examples/jasmine/package.json +19 -19
  17. package/doc/examples/jasmine/spec/a11y.js +29 -29
  18. package/doc/examples/jest_react/link.js +3 -3
  19. package/doc/examples/jest_react/link.test.js +15 -15
  20. package/doc/examples/jest_react/package.json +26 -26
  21. package/doc/examples/jest_react/test-helpers.js +12 -12
  22. package/doc/examples/jsdom/package.json +13 -13
  23. package/doc/examples/mocha/karma.conf.js +15 -15
  24. package/doc/examples/mocha/package.json +20 -20
  25. package/doc/examples/phantomjs/axe-phantom.js +36 -36
  26. package/doc/examples/phantomjs/package.json +17 -17
  27. package/doc/examples/puppeteer/axe-puppeteer.js +37 -37
  28. package/doc/examples/puppeteer/package.json +11 -11
  29. package/doc/examples/qunit/package.json +19 -19
  30. package/doc/examples/test-examples.js +22 -22
  31. package/doc/plugins.md +64 -64
  32. package/doc/projects.md +9 -13
  33. package/doc/rule-descriptions.md +100 -104
  34. package/doc/rule-development.md +2 -2
  35. package/doc/standards-object.md +8 -14
  36. package/lib/checks/aria/abstractrole-evaluate.js +8 -8
  37. package/lib/checks/aria/abstractrole.json +12 -12
  38. package/lib/checks/aria/aria-allowed-attr-evaluate.js +25 -24
  39. package/lib/checks/aria/aria-allowed-attr.json +12 -12
  40. package/lib/checks/aria/aria-allowed-role-evaluate.js +21 -21
  41. package/lib/checks/aria/aria-allowed-role.json +20 -20
  42. package/lib/checks/aria/aria-errormessage-evaluate.js +30 -38
  43. package/lib/checks/aria/aria-errormessage.json +16 -16
  44. package/lib/checks/aria/aria-hidden-body-evaluate.js +1 -1
  45. package/lib/checks/aria/aria-hidden-body.json +9 -9
  46. package/lib/checks/aria/aria-required-attr-evaluate.js +34 -34
  47. package/lib/checks/aria/aria-required-attr.json +12 -12
  48. package/lib/checks/aria/aria-required-children-evaluate.js +103 -108
  49. package/lib/checks/aria/aria-required-children.json +30 -30
  50. package/lib/checks/aria/aria-required-parent-evaluate.js +65 -72
  51. package/lib/checks/aria/aria-required-parent.json +12 -12
  52. package/lib/checks/aria/aria-roledescription-evaluate.js +9 -9
  53. package/lib/checks/aria/aria-roledescription.json +21 -21
  54. package/lib/checks/aria/aria-unsupported-attr-evaluate.js +20 -17
  55. package/lib/checks/aria/aria-unsupported-attr.json +9 -9
  56. package/lib/checks/aria/aria-valid-attr-evaluate.js +20 -20
  57. package/lib/checks/aria/aria-valid-attr-value-evaluate.js +71 -82
  58. package/lib/checks/aria/aria-valid-attr-value.json +17 -17
  59. package/lib/checks/aria/aria-valid-attr.json +13 -13
  60. package/lib/checks/aria/fallbackrole-evaluate.js +1 -1
  61. package/lib/checks/aria/fallbackrole.json +9 -9
  62. package/lib/checks/aria/has-global-aria-attribute-evaluate.js +5 -5
  63. package/lib/checks/aria/has-global-aria-attribute.json +12 -12
  64. package/lib/checks/aria/has-widget-role-evaluate.js +6 -6
  65. package/lib/checks/aria/has-widget-role.json +10 -10
  66. package/lib/checks/aria/invalidrole-evaluate.js +12 -12
  67. package/lib/checks/aria/invalidrole.json +12 -12
  68. package/lib/checks/aria/is-element-focusable-evaluate.js +1 -1
  69. package/lib/checks/aria/is-element-focusable.json +9 -9
  70. package/lib/checks/aria/no-implicit-explicit-label-evaluate.js +18 -20
  71. package/lib/checks/aria/no-implicit-explicit-label.json +9 -9
  72. package/lib/checks/aria/unsupportedrole-evaluate.js +2 -2
  73. package/lib/checks/aria/unsupportedrole.json +9 -9
  74. package/lib/checks/aria/valid-scrollable-semantics-evaluate.js +23 -23
  75. package/lib/checks/aria/valid-scrollable-semantics.json +10 -10
  76. package/lib/checks/color/color-contrast-evaluate.js +164 -164
  77. package/lib/checks/color/color-contrast.json +40 -40
  78. package/lib/checks/color/link-in-text-block-evaluate.js +70 -70
  79. package/lib/checks/color/link-in-text-block.json +17 -17
  80. package/lib/checks/forms/autocomplete-appropriate-evaluate.js +68 -68
  81. package/lib/checks/forms/autocomplete-appropriate.json +9 -9
  82. package/lib/checks/forms/autocomplete-valid-evaluate.js +2 -2
  83. package/lib/checks/forms/autocomplete-valid.json +9 -9
  84. package/lib/checks/generic/README.md +5 -5
  85. package/lib/checks/generic/attr-non-space-content-evaluate.js +20 -20
  86. package/lib/checks/generic/has-descendant-after.js +10 -10
  87. package/lib/checks/generic/has-descendant-evaluate.js +12 -12
  88. package/lib/checks/generic/has-text-content-evaluate.js +5 -5
  89. package/lib/checks/generic/matches-definition-evaluate.js +1 -1
  90. package/lib/checks/generic/page-no-duplicate-after.js +2 -2
  91. package/lib/checks/generic/page-no-duplicate-evaluate.js +29 -29
  92. package/lib/checks/keyboard/accesskeys-after.js +19 -19
  93. package/lib/checks/keyboard/accesskeys-evaluate.js +5 -5
  94. package/lib/checks/keyboard/accesskeys.json +10 -10
  95. package/lib/checks/keyboard/focusable-content-evaluate.js +13 -13
  96. package/lib/checks/keyboard/focusable-content.json +9 -9
  97. package/lib/checks/keyboard/focusable-disabled-evaluate.js +30 -30
  98. package/lib/checks/keyboard/focusable-disabled.json +9 -9
  99. package/lib/checks/keyboard/focusable-element-evaluate.js +41 -41
  100. package/lib/checks/keyboard/focusable-element.json +9 -9
  101. package/lib/checks/keyboard/focusable-modal-open-evaluate.js +11 -11
  102. package/lib/checks/keyboard/focusable-modal-open.json +9 -9
  103. package/lib/checks/keyboard/focusable-no-name-evaluate.js +10 -10
  104. package/lib/checks/keyboard/focusable-no-name.json +10 -10
  105. package/lib/checks/keyboard/focusable-not-tabbable-evaluate.js +30 -30
  106. package/lib/checks/keyboard/focusable-not-tabbable.json +9 -9
  107. package/lib/checks/keyboard/landmark-is-top-level-evaluate.js +17 -22
  108. package/lib/checks/keyboard/landmark-is-top-level.json +9 -9
  109. package/lib/checks/keyboard/page-has-heading-one.json +13 -13
  110. package/lib/checks/keyboard/page-has-main.json +13 -13
  111. package/lib/checks/keyboard/page-no-duplicate-banner.json +14 -14
  112. package/lib/checks/keyboard/page-no-duplicate-contentinfo.json +14 -14
  113. package/lib/checks/keyboard/page-no-duplicate-main.json +13 -13
  114. package/lib/checks/keyboard/tabindex-evaluate.js +5 -5
  115. package/lib/checks/keyboard/tabindex.json +9 -9
  116. package/lib/checks/label/alt-space-value-evaluate.js +3 -3
  117. package/lib/checks/label/alt-space-value.json +9 -9
  118. package/lib/checks/label/duplicate-img-label-evaluate.js +12 -12
  119. package/lib/checks/label/duplicate-img-label.json +12 -12
  120. package/lib/checks/label/explicit-evaluate.js +20 -25
  121. package/lib/checks/label/explicit.json +10 -10
  122. package/lib/checks/label/help-same-as-label-evaluate.js +17 -17
  123. package/lib/checks/label/help-same-as-label.json +10 -10
  124. package/lib/checks/label/hidden-explicit-label-evaluate.js +15 -21
  125. package/lib/checks/label/hidden-explicit-label.json +10 -10
  126. package/lib/checks/label/implicit-evaluate.js +9 -9
  127. package/lib/checks/label/implicit.json +10 -10
  128. package/lib/checks/label/label-content-name-mismatch-evaluate.js +42 -42
  129. package/lib/checks/label/label-content-name-mismatch.json +13 -13
  130. package/lib/checks/label/multiple-label-evaluate.js +32 -32
  131. package/lib/checks/label/multiple-label.json +9 -9
  132. package/lib/checks/label/title-only-evaluate.js +4 -4
  133. package/lib/checks/label/title-only.json +9 -9
  134. package/lib/checks/landmarks/landmark-is-unique-after.js +20 -20
  135. package/lib/checks/landmarks/landmark-is-unique-evaluate.js +6 -6
  136. package/lib/checks/landmarks/landmark-is-unique.json +10 -10
  137. package/lib/checks/language/has-lang-evaluate.js +25 -25
  138. package/lib/checks/language/has-lang.json +15 -15
  139. package/lib/checks/language/valid-lang-evaluate.js +25 -25
  140. package/lib/checks/language/valid-lang.json +12 -12
  141. package/lib/checks/language/xml-lang-mismatch-evaluate.js +3 -3
  142. package/lib/checks/language/xml-lang-mismatch.json +9 -9
  143. package/lib/checks/lists/dlitem-evaluate.js +19 -19
  144. package/lib/checks/lists/dlitem.json +9 -9
  145. package/lib/checks/lists/listitem-evaluate.js +17 -17
  146. package/lib/checks/lists/listitem.json +12 -12
  147. package/lib/checks/lists/only-dlitems-evaluate.js +44 -44
  148. package/lib/checks/lists/only-dlitems.json +9 -9
  149. package/lib/checks/lists/only-listitems-evaluate.js +56 -56
  150. package/lib/checks/lists/only-listitems.json +12 -12
  151. package/lib/checks/lists/structured-dlitems-evaluate.js +20 -20
  152. package/lib/checks/lists/structured-dlitems.json +9 -9
  153. package/lib/checks/media/caption-evaluate.js +6 -6
  154. package/lib/checks/media/caption.json +9 -9
  155. package/lib/checks/media/frame-tested-evaluate.js +20 -20
  156. package/lib/checks/media/frame-tested.json +13 -13
  157. package/lib/checks/media/no-autoplay-audio-evaluate.js +81 -81
  158. package/lib/checks/media/no-autoplay-audio.json +13 -13
  159. package/lib/checks/mobile/css-orientation-lock-evaluate.js +250 -250
  160. package/lib/checks/mobile/css-orientation-lock.json +13 -13
  161. package/lib/checks/mobile/meta-viewport-large.json +13 -13
  162. package/lib/checks/mobile/meta-viewport-scale-evaluate.js +56 -56
  163. package/lib/checks/mobile/meta-viewport.json +12 -12
  164. package/lib/checks/navigation/header-present.json +13 -13
  165. package/lib/checks/navigation/heading-order-after.js +11 -134
  166. package/lib/checks/navigation/heading-order-evaluate.js +13 -51
  167. package/lib/checks/navigation/heading-order.json +10 -10
  168. package/lib/checks/navigation/identical-links-same-purpose-after.js +86 -86
  169. package/lib/checks/navigation/identical-links-same-purpose-evaluate.js +23 -23
  170. package/lib/checks/navigation/identical-links-same-purpose.json +10 -10
  171. package/lib/checks/navigation/internal-link-present-evaluate.js +4 -4
  172. package/lib/checks/navigation/internal-link-present.json +9 -9
  173. package/lib/checks/navigation/landmark.json +12 -12
  174. package/lib/checks/navigation/meta-refresh-evaluate.js +3 -3
  175. package/lib/checks/navigation/meta-refresh.json +9 -9
  176. package/lib/checks/navigation/p-as-heading-evaluate.js +72 -72
  177. package/lib/checks/navigation/p-as-heading.json +28 -28
  178. package/lib/checks/navigation/region-evaluate.js +73 -73
  179. package/lib/checks/navigation/region.json +12 -12
  180. package/lib/checks/navigation/skip-link-evaluate.js +5 -5
  181. package/lib/checks/navigation/skip-link.json +10 -10
  182. package/lib/checks/navigation/unique-frame-title-after.js +8 -8
  183. package/lib/checks/navigation/unique-frame-title-evaluate.js +3 -3
  184. package/lib/checks/navigation/unique-frame-title.json +10 -10
  185. package/lib/checks/parsing/duplicate-id-active.json +10 -10
  186. package/lib/checks/parsing/duplicate-id-after.js +8 -8
  187. package/lib/checks/parsing/duplicate-id-aria.json +10 -10
  188. package/lib/checks/parsing/duplicate-id-evaluate.js +15 -15
  189. package/lib/checks/parsing/duplicate-id.json +10 -10
  190. package/lib/checks/shared/aria-label-evaluate.js +1 -1
  191. package/lib/checks/shared/aria-label.json +9 -9
  192. package/lib/checks/shared/aria-labelledby-evaluate.js +5 -5
  193. package/lib/checks/shared/aria-labelledby.json +10 -10
  194. package/lib/checks/shared/avoid-inline-spacing-evaluate.js +10 -10
  195. package/lib/checks/shared/avoid-inline-spacing.json +15 -15
  196. package/lib/checks/shared/button-has-visible-text.json +10 -10
  197. package/lib/checks/shared/doc-has-title-evaluate.js +2 -2
  198. package/lib/checks/shared/doc-has-title.json +9 -9
  199. package/lib/checks/shared/exists-evaluate.js +1 -1
  200. package/lib/checks/shared/exists.json +9 -9
  201. package/lib/checks/shared/has-alt-evaluate.js +5 -5
  202. package/lib/checks/shared/has-alt.json +9 -9
  203. package/lib/checks/shared/has-visible-text.json +10 -10
  204. package/lib/checks/shared/is-on-screen-evaluate.js +2 -2
  205. package/lib/checks/shared/is-on-screen.json +9 -9
  206. package/lib/checks/shared/non-empty-alt.json +15 -15
  207. package/lib/checks/shared/non-empty-if-present-evaluate.js +13 -13
  208. package/lib/checks/shared/non-empty-if-present.json +12 -12
  209. package/lib/checks/shared/non-empty-placeholder.json +15 -15
  210. package/lib/checks/shared/non-empty-title.json +15 -15
  211. package/lib/checks/shared/non-empty-value.json +15 -15
  212. package/lib/checks/shared/presentational-role-evaluate.js +29 -29
  213. package/lib/checks/shared/presentational-role.json +14 -14
  214. package/lib/checks/shared/role-none.json +17 -17
  215. package/lib/checks/shared/role-presentation.json +17 -17
  216. package/lib/checks/shared/svg-non-empty-title-evaluate.js +20 -24
  217. package/lib/checks/shared/svg-non-empty-title.json +13 -13
  218. package/lib/checks/tables/caption-faked-evaluate.js +8 -8
  219. package/lib/checks/tables/caption-faked.json +9 -9
  220. package/lib/checks/tables/html5-scope-evaluate.js +4 -4
  221. package/lib/checks/tables/html5-scope.json +9 -9
  222. package/lib/checks/tables/same-caption-summary-evaluate.js +6 -6
  223. package/lib/checks/tables/same-caption-summary.json +9 -9
  224. package/lib/checks/tables/scope-value-evaluate.js +2 -2
  225. package/lib/checks/tables/scope-value.json +12 -12
  226. package/lib/checks/tables/td-has-header-evaluate.js +21 -21
  227. package/lib/checks/tables/td-has-header.json +9 -9
  228. package/lib/checks/tables/td-headers-attr-evaluate.js +48 -48
  229. package/lib/checks/tables/td-headers-attr.json +10 -10
  230. package/lib/checks/tables/th-has-data-cells-evaluate.js +64 -64
  231. package/lib/checks/tables/th-has-data-cells.json +10 -10
  232. package/lib/checks/visibility/hidden-content-evaluate.js +28 -28
  233. package/lib/checks/visibility/hidden-content.json +10 -10
  234. package/lib/commons/aria/allowed-attr.js +12 -12
  235. package/lib/commons/aria/arialabel-text.js +7 -7
  236. package/lib/commons/aria/arialabelledby-text.js +41 -41
  237. package/lib/commons/aria/get-accessible-refs.js +41 -41
  238. package/lib/commons/aria/get-element-unallowed-roles.js +69 -69
  239. package/lib/commons/aria/get-explicit-role.js +14 -14
  240. package/lib/commons/aria/get-owned-virtual.js +14 -14
  241. package/lib/commons/aria/get-role-type.js +5 -5
  242. package/lib/commons/aria/get-role.js +89 -89
  243. package/lib/commons/aria/get-roles-by-type.js +1 -1
  244. package/lib/commons/aria/get-roles-with-name-from-contents.js +1 -1
  245. package/lib/commons/aria/implicit-nodes.js +6 -6
  246. package/lib/commons/aria/implicit-role.js +32 -32
  247. package/lib/commons/aria/is-accessible-ref.js +1 -1
  248. package/lib/commons/aria/is-aria-role-allowed-on-element.js +12 -12
  249. package/lib/commons/aria/is-unsupported-role.js +2 -2
  250. package/lib/commons/aria/is-valid-role.js +6 -6
  251. package/lib/commons/aria/label-virtual.js +24 -24
  252. package/lib/commons/aria/label.js +2 -2
  253. package/lib/commons/aria/lookup-table.js +2395 -2395
  254. package/lib/commons/aria/named-from-contents.js +19 -19
  255. package/lib/commons/aria/required-attr.js +5 -5
  256. package/lib/commons/aria/required-context.js +5 -5
  257. package/lib/commons/aria/required-owned.js +5 -5
  258. package/lib/commons/aria/validate-attr-value.js +40 -44
  259. package/lib/commons/aria/validate-attr.js +2 -2
  260. package/lib/commons/color/center-point-of-rect.js +15 -15
  261. package/lib/commons/color/color.js +224 -224
  262. package/lib/commons/color/element-has-image.js +14 -14
  263. package/lib/commons/color/element-is-distinct.js +56 -55
  264. package/lib/commons/color/filtered-rect-stack.js +32 -32
  265. package/lib/commons/color/flatten-colors.js +6 -6
  266. package/lib/commons/color/get-background-color.js +40 -40
  267. package/lib/commons/color/get-background-stack.js +71 -71
  268. package/lib/commons/color/get-contrast.js +9 -9
  269. package/lib/commons/color/get-foreground-color.js +34 -34
  270. package/lib/commons/color/get-own-background-color.js +7 -7
  271. package/lib/commons/color/get-rect-stack.js +14 -14
  272. package/lib/commons/color/get-text-shadow-colors.js +87 -87
  273. package/lib/commons/color/has-valid-contrast-ratio.js +10 -10
  274. package/lib/commons/color/incomplete-data.js +37 -37
  275. package/lib/commons/dom/find-elms-in-context.js +11 -11
  276. package/lib/commons/dom/find-up-virtual.js +31 -31
  277. package/lib/commons/dom/find-up.js +1 -1
  278. package/lib/commons/dom/focus-disabled.js +13 -13
  279. package/lib/commons/dom/get-composed-parent.js +14 -14
  280. package/lib/commons/dom/get-element-by-reference.js +18 -18
  281. package/lib/commons/dom/get-element-coordinates.js +12 -12
  282. package/lib/commons/dom/get-element-stack.js +10 -10
  283. package/lib/commons/dom/get-rect-stack.js +427 -427
  284. package/lib/commons/dom/get-scroll-offset.js +17 -17
  285. package/lib/commons/dom/get-tabbable-elements.js +9 -9
  286. package/lib/commons/dom/get-text-element-stack.js +49 -64
  287. package/lib/commons/dom/get-viewport-size.js +19 -19
  288. package/lib/commons/dom/has-content-virtual.js +29 -29
  289. package/lib/commons/dom/has-content.js +2 -2
  290. package/lib/commons/dom/idrefs.js +15 -15
  291. package/lib/commons/dom/inserted-into-focus-order.js +6 -6
  292. package/lib/commons/dom/is-focusable.js +12 -16
  293. package/lib/commons/dom/is-hidden-with-css.js +47 -47
  294. package/lib/commons/dom/is-html5.js +5 -5
  295. package/lib/commons/dom/is-in-text-block.js +74 -74
  296. package/lib/commons/dom/is-modal-open.js +78 -78
  297. package/lib/commons/dom/is-natively-focusable.js +22 -22
  298. package/lib/commons/dom/is-node.js +1 -1
  299. package/lib/commons/dom/is-offscreen.js +43 -43
  300. package/lib/commons/dom/is-opaque.js +4 -4
  301. package/lib/commons/dom/is-skip-link.js +27 -27
  302. package/lib/commons/dom/is-visible.js +147 -147
  303. package/lib/commons/dom/is-visual-content.js +33 -33
  304. package/lib/commons/dom/reduce-to-elements-below-floating.js +18 -18
  305. package/lib/commons/dom/shadow-elements-from-point.js +29 -29
  306. package/lib/commons/dom/url-props-from-attribute.js +100 -100
  307. package/lib/commons/dom/visually-contains.js +77 -77
  308. package/lib/commons/dom/visually-overlaps.js +29 -29
  309. package/lib/commons/forms/is-aria-combobox.js +2 -2
  310. package/lib/commons/forms/is-aria-listbox.js +2 -2
  311. package/lib/commons/forms/is-aria-range.js +2 -2
  312. package/lib/commons/forms/is-aria-textbox.js +2 -2
  313. package/lib/commons/forms/is-disabled.js +20 -20
  314. package/lib/commons/forms/is-native-select.js +3 -3
  315. package/lib/commons/forms/is-native-textbox.js +17 -17
  316. package/lib/commons/index.js +9 -9
  317. package/lib/commons/matches/attributes.js +4 -4
  318. package/lib/commons/matches/condition.js +1 -1
  319. package/lib/commons/matches/explicit-role.js +1 -1
  320. package/lib/commons/matches/from-definition.js +30 -30
  321. package/lib/commons/matches/from-function.js +12 -12
  322. package/lib/commons/matches/from-primative.js +20 -20
  323. package/lib/commons/matches/implicit-role.js +1 -1
  324. package/lib/commons/matches/matches.js +1 -1
  325. package/lib/commons/matches/node-name.js +4 -4
  326. package/lib/commons/matches/properties.js +4 -4
  327. package/lib/commons/matches/semantic-role.js +1 -1
  328. package/lib/commons/standards/get-aria-roles-by-type.js +3 -3
  329. package/lib/commons/standards/get-aria-roles-supporting-name-from-content.js +8 -8
  330. package/lib/commons/standards/get-element-spec.js +42 -42
  331. package/lib/commons/standards/get-elements-by-content-type.js +15 -15
  332. package/lib/commons/standards/get-global-aria-attrs.js +8 -8
  333. package/lib/commons/standards/implicit-html-roles.js +140 -140
  334. package/lib/commons/table/get-all-cells.js +16 -16
  335. package/lib/commons/table/get-cell-position.js +15 -15
  336. package/lib/commons/table/get-headers.js +65 -72
  337. package/lib/commons/table/get-scope.js +42 -42
  338. package/lib/commons/table/is-column-header.js +1 -1
  339. package/lib/commons/table/is-data-cell.js +10 -10
  340. package/lib/commons/table/is-data-table.js +176 -176
  341. package/lib/commons/table/is-header.js +8 -8
  342. package/lib/commons/table/is-row-header.js +1 -1
  343. package/lib/commons/table/to-grid.js +20 -31
  344. package/lib/commons/table/traverse.js +55 -55
  345. package/lib/commons/text/accessible-text-virtual.js +90 -90
  346. package/lib/commons/text/accessible-text.js +2 -2
  347. package/lib/commons/text/form-control-value.js +112 -113
  348. package/lib/commons/text/has-unicode.js +17 -17
  349. package/lib/commons/text/index.js +4 -4
  350. package/lib/commons/text/is-human-interpretable.js +34 -34
  351. package/lib/commons/text/is-icon-ligature.js +194 -194
  352. package/lib/commons/text/is-valid-autocomplete.js +104 -104
  353. package/lib/commons/text/label-text.js +39 -39
  354. package/lib/commons/text/label-virtual.js +26 -26
  355. package/lib/commons/text/label.js +2 -2
  356. package/lib/commons/text/native-element-type.js +97 -97
  357. package/lib/commons/text/native-text-alternative.js +19 -19
  358. package/lib/commons/text/native-text-methods.js +113 -113
  359. package/lib/commons/text/remove-unicode.js +15 -15
  360. package/lib/commons/text/sanitize.js +8 -8
  361. package/lib/commons/text/subtree-text.js +89 -47
  362. package/lib/commons/text/title-text.js +14 -14
  363. package/lib/commons/text/unicode.js +56 -56
  364. package/lib/commons/text/unsupported.js +1 -1
  365. package/lib/commons/text/visible-text-nodes.js +12 -12
  366. package/lib/commons/text/visible-virtual.js +21 -21
  367. package/lib/commons/text/visible.js +2 -2
  368. package/lib/core/base/audit.js +613 -613
  369. package/lib/core/base/cache.js +22 -22
  370. package/lib/core/base/check-result.js +20 -20
  371. package/lib/core/base/check.js +132 -132
  372. package/lib/core/base/context.js +175 -179
  373. package/lib/core/base/metadata-function-map.js +167 -179
  374. package/lib/core/base/rule-result.js +25 -25
  375. package/lib/core/base/rule.js +473 -475
  376. package/lib/core/base/virtual-node/abstract-virtual-node.js +33 -37
  377. package/lib/core/base/virtual-node/serial-virtual-node.js +76 -85
  378. package/lib/core/base/virtual-node/virtual-node.js +151 -177
  379. package/lib/core/constants.js +50 -50
  380. package/lib/core/core.js +7 -11
  381. package/lib/core/imports/index.js +14 -14
  382. package/lib/core/index.js +21 -19
  383. package/lib/core/log.js +4 -4
  384. package/lib/core/public/cleanup.js +43 -41
  385. package/lib/core/public/configure.js +112 -112
  386. package/lib/core/public/get-rules.js +19 -19
  387. package/lib/core/public/load.js +49 -47
  388. package/lib/core/public/plugins.js +24 -22
  389. package/lib/core/public/reporter.js +12 -12
  390. package/lib/core/public/reset.js +6 -6
  391. package/lib/core/public/run-rules.js +76 -61
  392. package/lib/core/public/run-virtual-rule.js +42 -47
  393. package/lib/core/public/run.js +154 -154
  394. package/lib/core/reporters/helpers/failure-summary.js +22 -22
  395. package/lib/core/reporters/helpers/get-environment-data.js +29 -29
  396. package/lib/core/reporters/helpers/incomplete-fallback-msg.js +3 -3
  397. package/lib/core/reporters/helpers/index.js +8 -8
  398. package/lib/core/reporters/helpers/process-aggregate.js +69 -69
  399. package/lib/core/reporters/na.js +16 -16
  400. package/lib/core/reporters/no-passes.js +12 -12
  401. package/lib/core/reporters/raw-env.js +9 -9
  402. package/lib/core/reporters/raw.js +24 -24
  403. package/lib/core/reporters/v1.js +23 -23
  404. package/lib/core/reporters/v2.js +13 -13
  405. package/lib/core/utils/aggregate-checks.js +63 -63
  406. package/lib/core/utils/aggregate-node-results.js +44 -44
  407. package/lib/core/utils/aggregate-result.js +24 -24
  408. package/lib/core/utils/aggregate.js +6 -6
  409. package/lib/core/utils/are-styles-set.js +14 -14
  410. package/lib/core/utils/assert.js +3 -3
  411. package/lib/core/utils/check-helper.js +23 -23
  412. package/lib/core/utils/clone.js +18 -18
  413. package/lib/core/utils/closest.js +12 -12
  414. package/lib/core/utils/collect-results-from-frames.js +45 -63
  415. package/lib/core/utils/contains.js +29 -29
  416. package/lib/core/utils/css-parser.js +0 -1
  417. package/lib/core/utils/deep-merge.js +18 -18
  418. package/lib/core/utils/dq-element.js +88 -88
  419. package/lib/core/utils/element-matches.js +29 -29
  420. package/lib/core/utils/escape-selector.js +63 -63
  421. package/lib/core/utils/extend-meta-data.js +11 -11
  422. package/lib/core/utils/finalize-result.js +13 -15
  423. package/lib/core/utils/find-by.js +3 -3
  424. package/lib/core/utils/get-all-checks.js +5 -5
  425. package/lib/core/utils/get-ancestry.js +16 -16
  426. package/lib/core/utils/get-base-lang.js +7 -7
  427. package/lib/core/utils/get-check-message.js +9 -9
  428. package/lib/core/utils/get-check-option.js +26 -26
  429. package/lib/core/utils/get-flattened-tree.js +88 -88
  430. package/lib/core/utils/get-friendly-uri-end.js +87 -87
  431. package/lib/core/utils/get-node-attributes.js +9 -10
  432. package/lib/core/utils/get-node-from-tree.js +2 -2
  433. package/lib/core/utils/get-root-node.js +6 -6
  434. package/lib/core/utils/get-scroll-state.js +26 -26
  435. package/lib/core/utils/get-scroll.js +26 -26
  436. package/lib/core/utils/get-selector.js +256 -256
  437. package/lib/core/utils/get-shadow-selector.js +19 -19
  438. package/lib/core/utils/get-stylesheet-factory.js +32 -32
  439. package/lib/core/utils/get-xpath.js +65 -65
  440. package/lib/core/utils/index.js +3 -6
  441. package/lib/core/utils/inject-style.js +24 -24
  442. package/lib/core/utils/is-hidden.js +41 -41
  443. package/lib/core/utils/is-html-element.js +122 -122
  444. package/lib/core/utils/is-node-in-context.js +24 -24
  445. package/lib/core/utils/is-shadow-root.js +28 -28
  446. package/lib/core/utils/is-xhtml.js +4 -4
  447. package/lib/core/utils/matches.js +170 -176
  448. package/lib/core/utils/memoize.js +7 -7
  449. package/lib/core/utils/merge-results.js +91 -91
  450. package/lib/core/utils/node-sorter.js +11 -11
  451. package/lib/core/utils/parse-crossorigin-stylesheet.js +41 -41
  452. package/lib/core/utils/parse-sameorigin-stylesheet.js +70 -70
  453. package/lib/core/utils/parse-stylesheet.js +41 -41
  454. package/lib/core/utils/performance-timer.js +112 -112
  455. package/lib/core/utils/pollyfills.js +263 -263
  456. package/lib/core/utils/preload-cssom.js +134 -134
  457. package/lib/core/utils/preload-media.js +42 -42
  458. package/lib/core/utils/preload.js +110 -110
  459. package/lib/core/utils/process-message.js +43 -45
  460. package/lib/core/utils/publish-metadata.js +68 -68
  461. package/lib/core/utils/query-selector-all-filter.js +77 -79
  462. package/lib/core/utils/query-selector-all.js +1 -1
  463. package/lib/core/utils/queue.js +113 -113
  464. package/lib/core/utils/respondable.js +218 -119
  465. package/lib/core/utils/rule-should-run.js +53 -53
  466. package/lib/core/utils/select.js +54 -54
  467. package/lib/core/utils/send-command-to-frame.js +43 -43
  468. package/lib/core/utils/set-scroll-state.js +7 -7
  469. package/lib/core/utils/to-array.js +1 -1
  470. package/lib/core/utils/token-list.js +4 -4
  471. package/lib/core/utils/unique-array.js +3 -3
  472. package/lib/core/utils/uuid.js +161 -170
  473. package/lib/core/utils/valid-input-type.js +25 -25
  474. package/lib/core/utils/valid-langs.js +30 -30
  475. package/lib/misc/any-failure-summary.json +4 -4
  476. package/lib/misc/incomplete-fallback.json +1 -1
  477. package/lib/misc/none-failure-summary.json +4 -4
  478. package/lib/rules/accesskeys.json +11 -11
  479. package/lib/rules/area-alt.json +20 -20
  480. package/lib/rules/aria-allowed-attr-matches.js +13 -11
  481. package/lib/rules/aria-allowed-attr.json +10 -10
  482. package/lib/rules/aria-allowed-role-matches.js +6 -6
  483. package/lib/rules/aria-allowed-role.json +12 -12
  484. package/lib/rules/aria-command-name.json +16 -16
  485. package/lib/rules/aria-dialog-name.json +11 -11
  486. package/lib/rules/aria-has-attr-matches.js +10 -10
  487. package/lib/rules/aria-hidden-body.json +12 -12
  488. package/lib/rules/aria-hidden-focus-matches.js +8 -8
  489. package/lib/rules/aria-hidden-focus.json +16 -16
  490. package/lib/rules/aria-input-field-name.json +11 -11
  491. package/lib/rules/aria-meter-name.json +11 -11
  492. package/lib/rules/aria-progressbar-name.json +11 -11
  493. package/lib/rules/aria-required-attr.json +10 -10
  494. package/lib/rules/aria-required-children.json +10 -11
  495. package/lib/rules/aria-required-parent.json +10 -11
  496. package/lib/rules/aria-roledescription.json +10 -10
  497. package/lib/rules/aria-roles.json +11 -11
  498. package/lib/rules/aria-toggle-field-name.json +16 -16
  499. package/lib/rules/aria-tooltip-name.json +16 -16
  500. package/lib/rules/aria-treeitem-name.json +16 -16
  501. package/lib/rules/aria-valid-attr-value.json +10 -10
  502. package/lib/rules/aria-valid-attr.json +10 -10
  503. package/lib/rules/audio-caption.json +18 -18
  504. package/lib/rules/autocomplete-matches.js +50 -50
  505. package/lib/rules/autocomplete-valid.json +10 -10
  506. package/lib/rules/avoid-inline-spacing.json +10 -10
  507. package/lib/rules/blink.json +17 -17
  508. package/lib/rules/button-name.json +24 -24
  509. package/lib/rules/bypass-matches.js +7 -7
  510. package/lib/rules/bypass.json +18 -19
  511. package/lib/rules/color-contrast-matches.js +137 -145
  512. package/lib/rules/color-contrast.json +11 -11
  513. package/lib/rules/css-orientation-lock.json +11 -11
  514. package/lib/rules/data-table-large-matches.js +10 -10
  515. package/lib/rules/data-table-matches.js +1 -1
  516. package/lib/rules/definition-list.json +11 -11
  517. package/lib/rules/dlitem.json +11 -11
  518. package/lib/rules/document-title.json +11 -11
  519. package/lib/rules/duplicate-id-active-matches.js +6 -6
  520. package/lib/rules/duplicate-id-active.json +12 -12
  521. package/lib/rules/duplicate-id-aria-matches.js +1 -1
  522. package/lib/rules/duplicate-id-aria.json +12 -12
  523. package/lib/rules/duplicate-id-misc-matches.js +8 -8
  524. package/lib/rules/duplicate-id.json +12 -12
  525. package/lib/rules/empty-heading.json +17 -17
  526. package/lib/rules/focus-order-semantics.json +11 -11
  527. package/lib/rules/form-field-multiple-labels.json +11 -11
  528. package/lib/rules/frame-tested.json +10 -10
  529. package/lib/rules/frame-title-has-text-matches.js +2 -2
  530. package/lib/rules/frame-title-unique.json +11 -11
  531. package/lib/rules/frame-title.json +22 -22
  532. package/lib/rules/heading-matches.js +14 -14
  533. package/lib/rules/heading-order.json +11 -11
  534. package/lib/rules/hidden-content.json +11 -11
  535. package/lib/rules/html-has-lang.json +11 -11
  536. package/lib/rules/html-lang-valid.json +10 -10
  537. package/lib/rules/html-namespace-matches.js +1 -1
  538. package/lib/rules/html-xml-lang-mismatch.json +11 -11
  539. package/lib/rules/identical-links-same-purpose-matches.js +9 -9
  540. package/lib/rules/identical-links-same-purpose.json +12 -12
  541. package/lib/rules/image-alt.json +24 -24
  542. package/lib/rules/img-redundant-alt.json +10 -10
  543. package/lib/rules/input-button-name.json +24 -24
  544. package/lib/rules/input-image-alt.json +18 -18
  545. package/lib/rules/inserted-into-focus-order-matches.js +1 -1
  546. package/lib/rules/is-initiator-matches.js +1 -1
  547. package/lib/rules/label-content-name-mismatch-matches.js +38 -38
  548. package/lib/rules/label-content-name-mismatch.json +10 -10
  549. package/lib/rules/label-matches.js +10 -10
  550. package/lib/rules/label-title-only.json +11 -11
  551. package/lib/rules/label.json +27 -27
  552. package/lib/rules/landmark-banner-is-top-level.json +11 -11
  553. package/lib/rules/landmark-complementary-is-top-level.json +10 -10
  554. package/lib/rules/landmark-contentinfo-is-top-level.json +11 -11
  555. package/lib/rules/landmark-has-body-context-matches.js +6 -6
  556. package/lib/rules/landmark-main-is-top-level.json +10 -10
  557. package/lib/rules/landmark-no-duplicate-banner.json +10 -10
  558. package/lib/rules/landmark-no-duplicate-contentinfo.json +10 -10
  559. package/lib/rules/landmark-no-duplicate-main.json +10 -10
  560. package/lib/rules/landmark-one-main.json +10 -10
  561. package/lib/rules/landmark-unique-matches.js +36 -36
  562. package/lib/rules/landmark-unique.json +11 -11
  563. package/lib/rules/layout-table-matches.js +2 -1
  564. package/lib/rules/link-in-text-block-matches.js +12 -12
  565. package/lib/rules/link-in-text-block.json +12 -12
  566. package/lib/rules/link-name.json +23 -23
  567. package/lib/rules/list.json +11 -11
  568. package/lib/rules/listitem.json +11 -11
  569. package/lib/rules/marquee.json +11 -11
  570. package/lib/rules/meta-refresh.json +18 -18
  571. package/lib/rules/meta-viewport-large.json +11 -11
  572. package/lib/rules/meta-viewport.json +11 -11
  573. package/lib/rules/no-autoplay-audio-matches.js +16 -16
  574. package/lib/rules/no-autoplay-audio.json +13 -13
  575. package/lib/rules/no-empty-role-matches.js +7 -7
  576. package/lib/rules/no-explicit-name-required-matches.js +9 -9
  577. package/lib/rules/no-naming-method-matches.js +12 -12
  578. package/lib/rules/no-role-matches.js +1 -1
  579. package/lib/rules/not-html-matches.js +2 -2
  580. package/lib/rules/object-alt.json +22 -22
  581. package/lib/rules/p-as-heading-matches.js +14 -14
  582. package/lib/rules/p-as-heading.json +11 -11
  583. package/lib/rules/page-has-heading-one.json +10 -10
  584. package/lib/rules/presentation-role-conflict.json +10 -10
  585. package/lib/rules/region.json +10 -10
  586. package/lib/rules/role-img-alt.json +18 -18
  587. package/lib/rules/scope-attr-valid.json +10 -10
  588. package/lib/rules/scrollable-region-focusable-matches.js +59 -59
  589. package/lib/rules/scrollable-region-focusable.json +10 -10
  590. package/lib/rules/select-name.json +25 -25
  591. package/lib/rules/server-side-image-map.json +16 -16
  592. package/lib/rules/skip-link-matches.js +1 -1
  593. package/lib/rules/skip-link.json +11 -11
  594. package/lib/rules/svg-img-alt.json +23 -23
  595. package/lib/rules/svg-namespace-matches.js +10 -10
  596. package/lib/rules/tabindex.json +10 -10
  597. package/lib/rules/table-duplicate-name.json +10 -10
  598. package/lib/rules/table-fake-caption.json +18 -18
  599. package/lib/rules/td-has-header.json +18 -18
  600. package/lib/rules/td-headers-attr.json +10 -10
  601. package/lib/rules/th-has-data-cells.json +11 -11
  602. package/lib/rules/valid-lang.json +11 -11
  603. package/lib/rules/video-caption.json +17 -17
  604. package/lib/rules/window-is-top-matches.js +3 -3
  605. package/lib/rules/xml-lang-mismatch-matches.js +6 -6
  606. package/lib/standards/aria-attrs.js +195 -204
  607. package/lib/standards/aria-roles.js +781 -812
  608. package/lib/standards/css-colors.js +148 -148
  609. package/lib/standards/dpub-roles.js +213 -214
  610. package/lib/standards/html-elms.js +912 -914
  611. package/lib/standards/index.js +16 -18
  612. package/locales/de.json +572 -909
  613. package/package.json +151 -174
  614. package/sri-history.json +1 -5
  615. package/typings/axe-core/axe-core-tests.ts +144 -144
  616. package/.eslintrc.js +0 -111
  617. package/lib/checks/aria/aria-prohibited-attr-evaluate.js +0 -67
  618. package/lib/checks/aria/aria-prohibited-attr.json +0 -12
  619. package/lib/checks/keyboard/frame-focusable-content.json +0 -12
  620. package/lib/checks/keyboard/no-focusable-content-evaluate.js +0 -35
  621. package/lib/checks/keyboard/no-focusable-content.json +0 -12
  622. package/lib/core/public/setup.js +0 -20
  623. package/lib/core/public/teardown.js +0 -21
  624. package/lib/core/utils/filter-html-attrs.js +0 -75
  625. package/lib/core/utils/get-rule.js +0 -17
  626. package/lib/core/utils/respondable/assert-window.js +0 -21
  627. package/lib/core/utils/respondable/callback-store.js +0 -36
  628. package/lib/core/utils/respondable/message-id.js +0 -22
  629. package/lib/core/utils/respondable/message-parser.js +0 -109
  630. package/lib/core/utils/respondable/post.js +0 -32
  631. package/lib/rules/aria-required-children-matches.js +0 -8
  632. package/lib/rules/aria-required-parent-matches.js +0 -8
  633. package/lib/rules/aria-text.json +0 -12
  634. package/lib/rules/empty-table-header.json +0 -13
  635. package/lib/rules/frame-focusable-content-matches.js +0 -9
  636. package/lib/rules/frame-focusable-content.json +0 -13
  637. package/lib/rules/nested-interactive-matches.js +0 -13
  638. package/lib/rules/nested-interactive.json +0 -12
  639. package/lib/standards/graphics-roles.js +0 -22
  640. package/locales/pl.json +0 -911
@@ -1,59 +1,59 @@
1
- function metaViewportScaleEvaluate(node, options, virtualNode) {
2
- const { scaleMinimum = 2, lowerBound = false } = options || {};
3
-
4
- const content = virtualNode.attr('content') || '';
5
- if (!content) {
6
- return true;
7
- }
8
-
9
- const result = content.split(/[;,]/).reduce((out, item) => {
10
- const contentValue = item.trim();
11
- if (!contentValue) {
12
- return out;
13
- }
14
-
15
- const [key, value] = contentValue.split('=');
16
- if (!key || !value) {
17
- return out;
18
- }
19
- const curatedKey = key.toLowerCase().trim();
20
- let curatedValue = value.toLowerCase().trim();
21
-
22
- // convert `yes` to `1`
23
- if (curatedKey === 'maximum-scale' && curatedValue === 'yes') {
24
- curatedValue = 1;
25
- }
26
- // when negative ignore key
27
- if (curatedKey === 'maximum-scale' && parseFloat(curatedValue) < 0) {
28
- return out;
29
- }
30
-
31
- out[curatedKey] = curatedValue;
32
- return out;
33
- }, {});
34
-
35
- if (
36
- lowerBound &&
37
- result['maximum-scale'] &&
38
- parseFloat(result['maximum-scale']) < lowerBound
39
- ) {
40
- return true;
41
- }
42
-
43
- if (!lowerBound && result['user-scalable'] === 'no') {
44
- this.data('user-scalable=no');
45
- return false;
46
- }
47
-
48
- if (
49
- result['maximum-scale'] &&
50
- parseFloat(result['maximum-scale']) < scaleMinimum
51
- ) {
52
- this.data('maximum-scale');
53
- return false;
54
- }
55
-
56
- return true;
1
+ function metaViewportScaleEvaluate(node, options) {
2
+ const { scaleMinimum = 2, lowerBound = false } = options || {};
3
+
4
+ const content = node.getAttribute('content') || '';
5
+ if (!content) {
6
+ return true;
7
+ }
8
+
9
+ const result = content.split(/[;,]/).reduce((out, item) => {
10
+ const contentValue = item.trim();
11
+ if (!contentValue) {
12
+ return out;
13
+ }
14
+
15
+ const [key, value] = contentValue.split('=');
16
+ if (!key || !value) {
17
+ return out;
18
+ }
19
+ const curatedKey = key.toLowerCase().trim();
20
+ let curatedValue = value.toLowerCase().trim();
21
+
22
+ // convert `yes` to `1`
23
+ if (curatedKey === 'maximum-scale' && curatedValue === 'yes') {
24
+ curatedValue = 1;
25
+ }
26
+ // when negative ignore key
27
+ if (curatedKey === 'maximum-scale' && parseFloat(curatedValue) < 0) {
28
+ return out;
29
+ }
30
+
31
+ out[curatedKey] = curatedValue;
32
+ return out;
33
+ }, {});
34
+
35
+ if (
36
+ lowerBound &&
37
+ result['maximum-scale'] &&
38
+ parseFloat(result['maximum-scale']) < lowerBound
39
+ ) {
40
+ return true;
41
+ }
42
+
43
+ if (!lowerBound && result['user-scalable'] === 'no') {
44
+ this.data('user-scalable=no');
45
+ return false;
46
+ }
47
+
48
+ if (
49
+ result['maximum-scale'] &&
50
+ parseFloat(result['maximum-scale']) < scaleMinimum
51
+ ) {
52
+ this.data('maximum-scale');
53
+ return false;
54
+ }
55
+
56
+ return true;
57
57
  }
58
58
 
59
59
  export default metaViewportScaleEvaluate;
@@ -1,14 +1,14 @@
1
1
  {
2
- "id": "meta-viewport",
3
- "evaluate": "meta-viewport-scale-evaluate",
4
- "options": {
5
- "scaleMinimum": 2
6
- },
7
- "metadata": {
8
- "impact": "critical",
9
- "messages": {
10
- "pass": "<meta> tag does not disable zooming on mobile devices",
11
- "fail": "${data} on <meta> tag disables zooming on mobile devices"
12
- }
13
- }
2
+ "id": "meta-viewport",
3
+ "evaluate": "meta-viewport-scale-evaluate",
4
+ "options": {
5
+ "scaleMinimum": 2
6
+ },
7
+ "metadata": {
8
+ "impact": "critical",
9
+ "messages": {
10
+ "pass": "<meta> tag does not disable zooming on mobile devices",
11
+ "fail": "${data} on <meta> tag disables zooming on mobile devices"
12
+ }
13
+ }
14
14
  }
@@ -1,15 +1,15 @@
1
1
  {
2
- "id": "header-present",
3
- "evaluate": "has-descendant-evaluate",
4
- "after": "has-descendant-after",
5
- "options": {
6
- "selector": ":is(h1, h2, h3, h4, h5, h6):not([role]), [role=heading]"
7
- },
8
- "metadata": {
9
- "impact": "serious",
10
- "messages": {
11
- "pass": "Page has a heading",
12
- "fail": "Page does not have a heading"
13
- }
14
- }
2
+ "id": "header-present",
3
+ "evaluate": "has-descendant-evaluate",
4
+ "after": "has-descendant-after",
5
+ "options": {
6
+ "selector": "h1:not([role]), h2:not([role]), h3:not([role]), h4:not([role]), h5:not([role]), h6:not([role]), [role=heading]"
7
+ },
8
+ "metadata": {
9
+ "impact": "serious",
10
+ "messages": {
11
+ "pass": "Page has a heading",
12
+ "fail": "Page does not have a heading"
13
+ }
14
+ }
15
15
  }
@@ -1,141 +1,18 @@
1
- const joinStr = ' > ';
2
-
3
- /**
4
- * Flatten an ancestry path of an iframe result into a string.
5
- */
6
- function getFramePath(ancestry, nodePath) {
7
- // remove the last path so we're only left with iframe paths
8
- ancestry = ancestry.slice(0, ancestry.length - 1);
9
-
10
- if (nodePath) {
11
- ancestry = ancestry.concat(nodePath);
12
- }
13
-
14
- return ancestry.join(joinStr);
15
- }
16
-
17
1
  function headingOrderAfter(results) {
18
- if (results.length < 2) {
19
- return results;
20
- }
21
-
22
- /**
23
- * In order to correctly return heading order results (even for
24
- * headings that may be out of the current context) we need to
25
- * construct an in-order list of all headings on the page,
26
- * including headings from iframes.
27
- *
28
- * To do this we will find all nested headingOrders (i.e. those
29
- * from iframes) and then determine where those results fit into
30
- * the top-level heading order. once we've put all the heading
31
- * orders into their proper place, we can then determine which
32
- * headings are not in the correct order.
33
- **/
34
-
35
- // start by replacing all array ancestry paths with a flat string
36
- // path
37
- let headingOrder = results[0].data.headingOrder.map(heading => {
38
- return {
39
- ...heading,
40
- ancestry: getFramePath(results[0].node.ancestry, heading.ancestry)
41
- };
42
- });
43
-
44
- // find all nested headindOrders
45
- const nestedResults = results.filter(result => {
46
- return result.data && result.data.headingOrder && result.node._fromFrame;
47
- });
48
-
49
- // update the path of nodes to include the iframe path
50
- nestedResults.forEach(result => {
51
- result.data.headingOrder = result.data.headingOrder.map(heading => {
52
- return {
53
- ...heading,
54
- ancestry: getFramePath(result.node.ancestry, heading.ancestry)
55
- };
56
- });
57
- });
58
-
59
- /**
60
- * Determine where the iframe results fit into the top-level
61
- * heading order
62
- */
63
- function getFrameIndex(result) {
64
- const path = getFramePath(result.node.ancestry);
65
- const heading = headingOrder.find(heading => {
66
- return heading.ancestry === path;
67
- });
68
- return headingOrder.indexOf(heading);
69
- }
70
-
71
- /**
72
- * Replace an iframe placeholder with its results
73
- */
74
- function replaceFrameWithResults(index, result) {
75
- headingOrder.splice(index, 1, ...result.data.headingOrder);
76
- }
77
-
78
- // replace each iframe in the top-level heading order with its
79
- // results.
80
- // since nested iframe results can appear before their parent
81
- // iframe, we will just loop over the nested results and
82
- // piece-meal replace each iframe in the top-level heading order
83
- // with their results until we no longer have results to replace
84
- let replaced = false;
85
- while (nestedResults.length) {
86
- for (let i = 0; i < nestedResults.length; ) {
87
- const nestedResult = nestedResults[i];
88
- const index = getFrameIndex(nestedResult);
89
-
90
- if (index !== -1) {
91
- replaceFrameWithResults(index, nestedResult);
92
- replaced = true;
93
-
94
- // remove the nested result from the list
95
- nestedResults.splice(i, 1);
96
- } else {
97
- i++;
98
- }
99
- }
100
-
101
- // something went wrong if we can't replace an iframe in
102
- // the top-level results
103
- if (!replaced) {
104
- throw new Error('Unable to find parent iframe of heading-order results');
105
- }
106
- }
107
-
108
- // replace the ancestry path with information about the result
109
- results.forEach(result => {
110
- const path = result.node.ancestry.join(joinStr);
111
- const heading = headingOrder.find(heading => {
112
- return heading.ancestry === path;
113
- });
114
- const index = headingOrder.indexOf(heading);
115
- headingOrder.splice(index, 1, {
116
- level: headingOrder[index].level,
117
- result
118
- });
119
- });
2
+ if (results.length < 2) {
3
+ return results;
4
+ }
120
5
 
121
- // remove any iframes that aren't in context (level == -1)
122
- headingOrder = headingOrder.filter(heading => heading.level > 0);
6
+ var prevLevel = results[0].data;
123
7
 
124
- // now make sure all headings are in the correct order
125
- for (let i = 1; i < results.length; i++) {
126
- const result = results[i];
127
- const heading = headingOrder.find(heading => {
128
- return heading.result === result;
129
- });
130
- const index = headingOrder.indexOf(heading);
131
- const currLevel = headingOrder[index].level;
132
- const prevLevel = headingOrder[index - 1].level;
133
- if (currLevel - prevLevel > 1) {
134
- result.result = false;
135
- }
136
- }
8
+ for (var i = 1; i < results.length; i++) {
9
+ if (results[i].result && results[i].data > prevLevel + 1) {
10
+ results[i].result = false;
11
+ }
12
+ prevLevel = results[i].data;
13
+ }
137
14
 
138
- return results;
15
+ return results;
139
16
  }
140
17
 
141
18
  export default headingOrderAfter;
@@ -1,58 +1,20 @@
1
- import cache from '../../core/base/cache';
2
- import { querySelectorAllFilter, getAncestry } from '../../core/utils';
3
- import { isVisible } from '../../commons/dom';
1
+ function headingOrderEvaluate(node, options, virtualNode) {
2
+ const ariaHeadingLevel = virtualNode.attr('aria-level');
3
+ const nodeName = virtualNode.props.nodeName;
4
4
 
5
- function getLevel(vNode) {
6
- const role = vNode.attr('role');
7
- if (role && role.includes('heading')) {
8
- const ariaHeadingLevel = vNode.attr('aria-level');
9
- const level = parseInt(ariaHeadingLevel, 10);
5
+ if (ariaHeadingLevel !== null) {
6
+ this.data(parseInt(ariaHeadingLevel, 10));
7
+ return true;
8
+ }
10
9
 
11
- // default aria-level for a heading is 2 if it is
12
- // not set or set to an incorrect value
13
- // @see https://www.w3.org/TR/wai-aria-1.1/#heading
14
- if (isNaN(level) || level < 1 || level > 6) {
15
- return 2;
16
- }
10
+ const headingLevel = nodeName.toUpperCase().match(/H(\d)/);
17
11
 
18
- return level;
19
- }
12
+ if (headingLevel) {
13
+ this.data(parseInt(headingLevel[1], 10));
14
+ return true;
15
+ }
20
16
 
21
- const headingLevel = vNode.props.nodeName.match(/h(\d)/);
22
- if (headingLevel) {
23
- return parseInt(headingLevel[1], 10);
24
- }
25
-
26
- return -1;
27
- }
28
-
29
- function headingOrderEvaluate() {
30
- let headingOrder = cache.get('headingOrder');
31
- if (headingOrder) {
32
- return true;
33
- }
34
-
35
- // find all headings, even ones that are outside the current
36
- // context. also need to know where iframes are so we can insert
37
- // the results of any in-context iframes into their proper order
38
- // @see https://github.com/dequelabs/axe-core/issues/728
39
- const selector = 'h1, h2, h3, h4, h5, h6, [role=heading], iframe, frame';
40
- // TODO: es-modules_tree
41
- const vNodes = querySelectorAllFilter(axe._tree[0], selector, vNode =>
42
- isVisible(vNode.actualNode, true)
43
- );
44
-
45
- headingOrder = vNodes.map(vNode => {
46
- // save the path so we can reconstruct the heading order
47
- return {
48
- ancestry: [getAncestry(vNode.actualNode)],
49
- level: getLevel(vNode)
50
- };
51
- });
52
-
53
- this.data({ headingOrder });
54
- cache.set('headingOrder', vNodes);
55
- return true;
17
+ return true;
56
18
  }
57
19
 
58
20
  export default headingOrderEvaluate;
@@ -1,12 +1,12 @@
1
1
  {
2
- "id": "heading-order",
3
- "evaluate": "heading-order-evaluate",
4
- "after": "heading-order-after",
5
- "metadata": {
6
- "impact": "moderate",
7
- "messages": {
8
- "pass": "Heading order valid",
9
- "fail": "Heading order invalid"
10
- }
11
- }
2
+ "id": "heading-order",
3
+ "evaluate": "heading-order-evaluate",
4
+ "after": "heading-order-after",
5
+ "metadata": {
6
+ "impact": "moderate",
7
+ "messages": {
8
+ "pass": "Heading order valid",
9
+ "fail": "Heading order invalid"
10
+ }
11
+ }
12
12
  }
@@ -5,102 +5,102 @@
5
5
  * @returns {Boolean}
6
6
  */
7
7
  function isIdenticalObject(a, b) {
8
- if (!a || !b) {
9
- return false;
10
- }
8
+ if (!a || !b) {
9
+ return false;
10
+ }
11
11
 
12
- const aProps = Object.getOwnPropertyNames(a);
13
- const bProps = Object.getOwnPropertyNames(b);
12
+ const aProps = Object.getOwnPropertyNames(a);
13
+ const bProps = Object.getOwnPropertyNames(b);
14
14
 
15
- if (aProps.length !== bProps.length) {
16
- return false;
17
- }
15
+ if (aProps.length !== bProps.length) {
16
+ return false;
17
+ }
18
18
 
19
- const result = aProps.every(propName => {
20
- const aValue = a[propName];
21
- const bValue = b[propName];
19
+ const result = aProps.every(propName => {
20
+ const aValue = a[propName];
21
+ const bValue = b[propName];
22
22
 
23
- if (typeof aValue !== typeof bValue) {
24
- return false;
25
- }
23
+ if (typeof aValue !== typeof bValue) {
24
+ return false;
25
+ }
26
26
 
27
- if (typeof aValue === `object` || typeof bValue === `object`) {
28
- return isIdenticalObject(aValue, bValue);
29
- }
27
+ if (typeof aValue === `object` || typeof bValue === `object`) {
28
+ return isIdenticalObject(aValue, bValue);
29
+ }
30
30
 
31
- return aValue === bValue;
32
- });
31
+ return aValue === bValue;
32
+ });
33
33
 
34
- return result;
34
+ return result;
35
35
  }
36
36
 
37
37
  function identicalLinksSamePurposeAfter(results) {
38
- /**
39
- * Skip, as no results to curate
40
- */
41
- if (results.length < 2) {
42
- return results;
43
- }
44
-
45
- /**
46
- * Filter results for which `result` is undefined & thus `data`, `relatedNodes` are undefined
47
- */
48
- const incompleteResults = results.filter(
49
- ({ result }) => result !== undefined
50
- );
51
-
52
- /**
53
- * for each result
54
- * - get other results with matching accessible name
55
- * - check if same purpose is served
56
- * - if not change `result` to `undefined`
57
- * - construct a list of unique results with relatedNodes to return
58
- */
59
- const uniqueResults = [];
60
- const nameMap = {};
61
-
62
- for (let index = 0; index < incompleteResults.length; index++) {
63
- const currentResult = incompleteResults[index];
64
-
65
- const { name, urlProps } = currentResult.data;
66
- /**
67
- * This is to avoid duplications in the `nodeMap`
68
- */
69
- if (nameMap[name]) {
70
- continue;
71
- }
72
-
73
- const sameNameResults = incompleteResults.filter(
74
- ({ data }, resultNum) => data.name === name && resultNum !== index
75
- );
76
- const isSameUrl = sameNameResults.every(({ data }) =>
77
- isIdenticalObject(data.urlProps, urlProps)
78
- );
79
-
80
- /**
81
- * when identical nodes exists but do not resolve to same url, flag result as `incomplete`
82
- */
83
- if (sameNameResults.length && !isSameUrl) {
84
- currentResult.result = undefined;
85
- }
86
-
87
- /**
88
- * -> deduplicate results (for both `pass` or `incomplete`) and add `relatedNodes` if any
89
- */
90
- currentResult.relatedNodes = [];
91
- currentResult.relatedNodes.push(
92
- ...sameNameResults.map(node => node.relatedNodes[0])
93
- );
94
-
95
- /**
96
- * Update `nodeMap` with `sameNameResults`
97
- */
98
- nameMap[name] = sameNameResults;
99
-
100
- uniqueResults.push(currentResult);
101
- }
102
-
103
- return uniqueResults;
38
+ /**
39
+ * Skip, as no results to curate
40
+ */
41
+ if (results.length < 2) {
42
+ return results;
43
+ }
44
+
45
+ /**
46
+ * Filter results for which `result` is undefined & thus `data`, `relatedNodes` are undefined
47
+ */
48
+ const incompleteResults = results.filter(
49
+ ({ result }) => result !== undefined
50
+ );
51
+
52
+ /**
53
+ * for each result
54
+ * - get other results with matching accessible name
55
+ * - check if same purpose is served
56
+ * - if not change `result` to `undefined`
57
+ * - construct a list of unique results with relatedNodes to return
58
+ */
59
+ const uniqueResults = [];
60
+ const nameMap = {};
61
+
62
+ for (let index = 0; index < incompleteResults.length; index++) {
63
+ const currentResult = incompleteResults[index];
64
+
65
+ const { name, urlProps } = currentResult.data;
66
+ /**
67
+ * This is to avoid duplications in the `nodeMap`
68
+ */
69
+ if (nameMap[name]) {
70
+ continue;
71
+ }
72
+
73
+ const sameNameResults = incompleteResults.filter(
74
+ ({ data }, resultNum) => data.name === name && resultNum !== index
75
+ );
76
+ const isSameUrl = sameNameResults.every(({ data }) =>
77
+ isIdenticalObject(data.urlProps, urlProps)
78
+ );
79
+
80
+ /**
81
+ * when identical nodes exists but do not resolve to same url, flag result as `incomplete`
82
+ */
83
+ if (sameNameResults.length && !isSameUrl) {
84
+ currentResult.result = undefined;
85
+ }
86
+
87
+ /**
88
+ * -> deduplicate results (for both `pass` or `incomplete`) and add `relatedNodes` if any
89
+ */
90
+ currentResult.relatedNodes = [];
91
+ currentResult.relatedNodes.push(
92
+ ...sameNameResults.map(node => node.relatedNodes[0])
93
+ );
94
+
95
+ /**
96
+ * Update `nodeMap` with `sameNameResults`
97
+ */
98
+ nameMap[name] = sameNameResults;
99
+
100
+ uniqueResults.push(currentResult);
101
+ }
102
+
103
+ return uniqueResults;
104
104
  }
105
105
 
106
106
  export default identicalLinksSamePurposeAfter;
@@ -4,32 +4,32 @@ import { dom, text } from '../../commons';
4
4
  * Note: `identical-links-same-purpose-after` fn, helps reconcile the results
5
5
  */
6
6
  function identicalLinksSamePurposeEvaluate(node, options, virtualNode) {
7
- const accText = text.accessibleTextVirtual(virtualNode);
8
- const name = text
9
- .sanitize(
10
- text.removeUnicode(accText, {
11
- emoji: true,
12
- nonBmp: true,
13
- punctuations: true
14
- })
15
- )
16
- .toLowerCase();
7
+ const accText = text.accessibleTextVirtual(virtualNode);
8
+ const name = text
9
+ .sanitize(
10
+ text.removeUnicode(accText, {
11
+ emoji: true,
12
+ nonBmp: true,
13
+ punctuations: true
14
+ })
15
+ )
16
+ .toLowerCase();
17
17
 
18
- if (!name) {
19
- return undefined;
20
- }
18
+ if (!name) {
19
+ return undefined;
20
+ }
21
21
 
22
- /**
23
- * Set `data` and `relatedNodes` for use in `after` fn
24
- */
25
- const afterData = {
26
- name,
27
- urlProps: dom.urlPropsFromAttribute(node, 'href')
28
- };
29
- this.data(afterData);
30
- this.relatedNodes([node]);
22
+ /**
23
+ * Set `data` and `relatedNodes` for use in `after` fn
24
+ */
25
+ const afterData = {
26
+ name,
27
+ urlProps: dom.urlPropsFromAttribute(node, 'href')
28
+ };
29
+ this.data(afterData);
30
+ this.relatedNodes([node]);
31
31
 
32
- return true;
32
+ return true;
33
33
  }
34
34
 
35
35
  export default identicalLinksSamePurposeEvaluate;