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
@@ -14,201 +14,201 @@ import cache from '../../core/base/cache';
14
14
  * @return {Boolean}
15
15
  */
16
16
  function isIconLigature(
17
- textVNode,
18
- differenceThreshold = 0.15,
19
- occuranceThreshold = 3
17
+ textVNode,
18
+ differenceThreshold = 0.15,
19
+ occuranceThreshold = 3
20
20
  ) {
21
- /**
22
- * Determine if the visible text is a ligature by comparing the
23
- * first letters image data to the entire strings image data.
24
- * If the two images are significantly different (typical set to 5%
25
- * statistical significance, but we'll be using a slightly higher value
26
- * of 15% to help keep the size of the canvas down) then we know the text
27
- * has been replaced by a ligature.
28
- *
29
- * Example:
30
- * If a text node was the string "File", looking at just the first
31
- * letter "F" would produce the following image:
32
- *
33
- * ┌─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┐
34
- * │ │ │█│█│█│█│█│█│█│█│█│█│█│ │ │
35
- * ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
36
- * │ │ │█│█│█│█│█│█│█│█│█│█│█│ │ │
37
- * ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
38
- * │ │ │█│█│ │ │ │ │ │ │ │ │ │ │ │
39
- * ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
40
- * │ │ │█│█│ │ │ │ │ │ │ │ │ │ │ │
41
- * ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
42
- * │ │ │█│█│█│█│█│█│█│ │ │ │ │ │ │
43
- * ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
44
- * │ │ │█│█│█│█│█│█│█│ │ │ │ │ │ │
45
- * ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
46
- * │ │ │█│█│ │ │ │ │ │ │ │ │ │ │ │
47
- * ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
48
- * │ │ │█│█│ │ │ │ │ │ │ │ │ │ │ │
49
- * ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
50
- * │ │ │█│█│ │ │ │ │ │ │ │ │ │ │ │
51
- * └─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┘
52
- *
53
- * But if the entire string "File" produced an image which had at least
54
- * a 15% difference in pixels, we would know that the string was replaced
55
- * by a ligature:
56
- *
57
- * ┌─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┐
58
- * │ │█│█│█│█│█│█│█│█│█│█│ │ │ │ │
59
- * ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
60
- * │ │█│ │ │ │ │ │ │ │ │█│█│ │ │ │
61
- * ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
62
- * │ │█│ │█│█│█│█│█│█│ │█│ │█│ │ │
63
- * ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
64
- * │ │█│ │ │ │ │ │ │ │ │█│█│█│█│ │
65
- * ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
66
- * │ │█│ │█│█│█│█│█│█│ │ │ │ │█│ │
67
- * ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
68
- * │ │█│ │ │ │ │ │ │ │ │ │ │ │█│ │
69
- * ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
70
- * │ │█│ │█│█│█│█│█│█│█│█│█│ │█│ │
71
- * ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
72
- * │ │█│ │ │ │ │ │ │ │ │ │ │ │█│ │
73
- * ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
74
- * │ │█│█│█│█│█│█│█│█│█│█│█│█│█│ │
75
- * └─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┘
76
- */
77
- const nodeValue = textVNode.actualNode.nodeValue.trim();
78
-
79
- // text with unicode or non-bmp letters cannot be ligature icons
80
- if (
81
- !sanitize(nodeValue) ||
82
- hasUnicode(nodeValue, { emoji: true, nonBmp: true })
83
- ) {
84
- return false;
85
- }
86
-
87
- if (!cache.get('canvasContext')) {
88
- cache.set(
89
- 'canvasContext',
90
- document.createElement('canvas').getContext('2d')
91
- );
92
- }
93
- const canvasContext = cache.get('canvasContext');
94
- const canvas = canvasContext.canvas;
95
-
96
- // keep track of each font encountered and the number of times it shows up
97
- // as a ligature.
98
- if (!cache.get('fonts')) {
99
- cache.set('fonts', {});
100
- }
101
- const fonts = cache.get('fonts');
102
-
103
- const style = window.getComputedStyle(textVNode.parent.actualNode);
104
- const fontFamily = style.getPropertyValue('font-family');
105
-
106
- if (!fonts[fontFamily]) {
107
- fonts[fontFamily] = {
108
- occurances: 0,
109
- numLigatures: 0
110
- };
111
- }
112
- const font = fonts[fontFamily];
113
-
114
- // improve the performance by only comparing the image data of a font
115
- // a certain number of times
116
- if (font.occurances >= occuranceThreshold) {
117
- // if the font has always been a ligature assume it's a ligature font
118
- if (font.numLigatures / font.occurances === 1) {
119
- return true;
120
- }
121
- // inversely, if it's never been a ligature assume it's not a ligature font
122
- else if (font.numLigatures === 0) {
123
- return false;
124
- }
125
-
126
- // we could theoretically get into an odd middle ground scenario in which
127
- // the font family is being used as normal text sometimes and as icons
128
- // other times. in these cases we would need to always check the text
129
- // to know if it's an icon or not
130
- }
131
- font.occurances++;
132
-
133
- // 30px was chosen to account for common ligatures in normal fonts
134
- // such as fi, ff, ffi. If a ligature would add a single column of
135
- // pixels to a 30x30 grid, it would not meet the statistical significance
136
- // threshold of 15% (30x30 = 900; 30/900 = 3.333%). this also allows for
137
- // more than 1 column differences (60/900 = 6.666%) and things like
138
- // extending the top of the f in the fi ligature.
139
- let fontSize = 30;
140
- let fontStyle = `${fontSize}px ${fontFamily}`;
141
-
142
- // set the size of the canvas to the width of the first letter
143
- canvasContext.font = fontStyle;
144
- const firstChar = nodeValue.charAt(0);
145
- let width = canvasContext.measureText(firstChar).width;
146
-
147
- // ensure font meets the 30px width requirement (30px font-size doesn't
148
- // necessarily mean its 30px wide when drawn)
149
- if (width < 30) {
150
- const diff = 30 / width;
151
- width *= diff;
152
- fontSize *= diff;
153
- fontStyle = `${fontSize}px ${fontFamily}`;
154
- }
155
- canvas.width = width;
156
- canvas.height = fontSize;
157
-
158
- // changing the dimensions of a canvas resets all properties (include font)
159
- // and clears it
160
- canvasContext.font = fontStyle;
161
- canvasContext.textAlign = 'left';
162
- canvasContext.textBaseline = 'top';
163
- canvasContext.fillText(firstChar, 0, 0);
164
- const compareData = new Uint32Array(
165
- canvasContext.getImageData(0, 0, width, fontSize).data.buffer
166
- );
167
-
168
- // if the font doesn't even have character data for a single char then
169
- // it has to be an icon ligature (e.g. Material Icon)
170
- if (!compareData.some(pixel => pixel)) {
171
- font.numLigatures++;
172
- return true;
173
- }
174
-
175
- canvasContext.clearRect(0, 0, width, fontSize);
176
- canvasContext.fillText(nodeValue, 0, 0);
177
- const compareWith = new Uint32Array(
178
- canvasContext.getImageData(0, 0, width, fontSize).data.buffer
179
- );
180
-
181
- // calculate the number of differences between the first letter and the
182
- // entire string, ignoring color differences
183
- const differences = compareData.reduce((diff, pixel, i) => {
184
- if (pixel === 0 && compareWith[i] === 0) {
185
- return diff;
186
- }
187
- if (pixel !== 0 && compareWith[i] !== 0) {
188
- return diff;
189
- }
190
- return ++diff;
191
- }, 0);
192
-
193
- // calculate the difference between the width of each character and the
194
- // combined with of all characters
195
- const expectedWidth = nodeValue.split('').reduce((width, char) => {
196
- return width + canvasContext.measureText(char).width;
197
- }, 0);
198
- const actualWidth = canvasContext.measureText(nodeValue).width;
199
-
200
- const pixelDifference = differences / compareData.length;
201
- const sizeDifference = 1 - actualWidth / expectedWidth;
202
-
203
- if (
204
- pixelDifference >= differenceThreshold &&
205
- sizeDifference >= differenceThreshold
206
- ) {
207
- font.numLigatures++;
208
- return true;
209
- }
210
-
211
- return false;
21
+ /**
22
+ * Determine if the visible text is a ligature by comparing the
23
+ * first letters image data to the entire strings image data.
24
+ * If the two images are significantly different (typical set to 5%
25
+ * statistical significance, but we'll be using a slightly higher value
26
+ * of 15% to help keep the size of the canvas down) then we know the text
27
+ * has been replaced by a ligature.
28
+ *
29
+ * Example:
30
+ * If a text node was the string "File", looking at just the first
31
+ * letter "F" would produce the following image:
32
+ *
33
+ * ┌─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┐
34
+ * │ │ │█│█│█│█│█│█│█│█│█│█│█│ │ │
35
+ * ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
36
+ * │ │ │█│█│█│█│█│█│█│█│█│█│█│ │ │
37
+ * ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
38
+ * │ │ │█│█│ │ │ │ │ │ │ │ │ │ │ │
39
+ * ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
40
+ * │ │ │█│█│ │ │ │ │ │ │ │ │ │ │ │
41
+ * ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
42
+ * │ │ │█│█│█│█│█│█│█│ │ │ │ │ │ │
43
+ * ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
44
+ * │ │ │█│█│█│█│█│█│█│ │ │ │ │ │ │
45
+ * ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
46
+ * │ │ │█│█│ │ │ │ │ │ │ │ │ │ │ │
47
+ * ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
48
+ * │ │ │█│█│ │ │ │ │ │ │ │ │ │ │ │
49
+ * ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
50
+ * │ │ │█│█│ │ │ │ │ │ │ │ │ │ │ │
51
+ * └─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┘
52
+ *
53
+ * But if the entire string "File" produced an image which had at least
54
+ * a 15% difference in pixels, we would know that the string was replaced
55
+ * by a ligature:
56
+ *
57
+ * ┌─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┐
58
+ * │ │█│█│█│█│█│█│█│█│█│█│ │ │ │ │
59
+ * ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
60
+ * │ │█│ │ │ │ │ │ │ │ │█│█│ │ │ │
61
+ * ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
62
+ * │ │█│ │█│█│█│█│█│█│ │█│ │█│ │ │
63
+ * ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
64
+ * │ │█│ │ │ │ │ │ │ │ │█│█│█│█│ │
65
+ * ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
66
+ * │ │█│ │█│█│█│█│█│█│ │ │ │ │█│ │
67
+ * ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
68
+ * │ │█│ │ │ │ │ │ │ │ │ │ │ │█│ │
69
+ * ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
70
+ * │ │█│ │█│█│█│█│█│█│█│█│█│ │█│ │
71
+ * ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
72
+ * │ │█│ │ │ │ │ │ │ │ │ │ │ │█│ │
73
+ * ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
74
+ * │ │█│█│█│█│█│█│█│█│█│█│█│█│█│ │
75
+ * └─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┘
76
+ */
77
+ const nodeValue = textVNode.actualNode.nodeValue.trim();
78
+
79
+ // text with unicode or non-bmp letters cannot be ligature icons
80
+ if (
81
+ !sanitize(nodeValue) ||
82
+ hasUnicode(nodeValue, { emoji: true, nonBmp: true })
83
+ ) {
84
+ return false;
85
+ }
86
+
87
+ if (!cache.get('canvasContext')) {
88
+ cache.set(
89
+ 'canvasContext',
90
+ document.createElement('canvas').getContext('2d')
91
+ );
92
+ }
93
+ const canvasContext = cache.get('canvasContext');
94
+ const canvas = canvasContext.canvas;
95
+
96
+ // keep track of each font encountered and the number of times it shows up
97
+ // as a ligature.
98
+ if (!cache.get('fonts')) {
99
+ cache.set('fonts', {});
100
+ }
101
+ const fonts = cache.get('fonts');
102
+
103
+ const style = window.getComputedStyle(textVNode.parent.actualNode);
104
+ const fontFamily = style.getPropertyValue('font-family');
105
+
106
+ if (!fonts[fontFamily]) {
107
+ fonts[fontFamily] = {
108
+ occurances: 0,
109
+ numLigatures: 0
110
+ };
111
+ }
112
+ const font = fonts[fontFamily];
113
+
114
+ // improve the performance by only comparing the image data of a font
115
+ // a certain number of times
116
+ if (font.occurances >= occuranceThreshold) {
117
+ // if the font has always been a ligature assume it's a ligature font
118
+ if (font.numLigatures / font.occurances === 1) {
119
+ return true;
120
+ }
121
+ // inversely, if it's never been a ligature assume it's not a ligature font
122
+ else if (font.numLigatures === 0) {
123
+ return false;
124
+ }
125
+
126
+ // we could theoretically get into an odd middle ground scenario in which
127
+ // the font family is being used as normal text sometimes and as icons
128
+ // other times. in these cases we would need to always check the text
129
+ // to know if it's an icon or not
130
+ }
131
+ font.occurances++;
132
+
133
+ // 30px was chosen to account for common ligatures in normal fonts
134
+ // such as fi, ff, ffi. If a ligature would add a single column of
135
+ // pixels to a 30x30 grid, it would not meet the statistical significance
136
+ // threshold of 15% (30x30 = 900; 30/900 = 3.333%). this also allows for
137
+ // more than 1 column differences (60/900 = 6.666%) and things like
138
+ // extending the top of the f in the fi ligature.
139
+ let fontSize = 30;
140
+ let fontStyle = `${fontSize}px ${fontFamily}`;
141
+
142
+ // set the size of the canvas to the width of the first letter
143
+ canvasContext.font = fontStyle;
144
+ const firstChar = nodeValue.charAt(0);
145
+ let width = canvasContext.measureText(firstChar).width;
146
+
147
+ // ensure font meets the 30px width requirement (30px font-size doesn't
148
+ // necessarily mean its 30px wide when drawn)
149
+ if (width < 30) {
150
+ const diff = 30 / width;
151
+ width *= diff;
152
+ fontSize *= diff;
153
+ fontStyle = `${fontSize}px ${fontFamily}`;
154
+ }
155
+ canvas.width = width;
156
+ canvas.height = fontSize;
157
+
158
+ // changing the dimensions of a canvas resets all properties (include font)
159
+ // and clears it
160
+ canvasContext.font = fontStyle;
161
+ canvasContext.textAlign = 'left';
162
+ canvasContext.textBaseline = 'top';
163
+ canvasContext.fillText(firstChar, 0, 0);
164
+ const compareData = new Uint32Array(
165
+ canvasContext.getImageData(0, 0, width, fontSize).data.buffer
166
+ );
167
+
168
+ // if the font doesn't even have character data for a single char then
169
+ // it has to be an icon ligature (e.g. Material Icon)
170
+ if (!compareData.some(pixel => pixel)) {
171
+ font.numLigatures++;
172
+ return true;
173
+ }
174
+
175
+ canvasContext.clearRect(0, 0, width, fontSize);
176
+ canvasContext.fillText(nodeValue, 0, 0);
177
+ const compareWith = new Uint32Array(
178
+ canvasContext.getImageData(0, 0, width, fontSize).data.buffer
179
+ );
180
+
181
+ // calculate the number of differences between the first letter and the
182
+ // entire string, ignoring color differences
183
+ const differences = compareData.reduce((diff, pixel, i) => {
184
+ if (pixel === 0 && compareWith[i] === 0) {
185
+ return diff;
186
+ }
187
+ if (pixel !== 0 && compareWith[i] !== 0) {
188
+ return diff;
189
+ }
190
+ return ++diff;
191
+ }, 0);
192
+
193
+ // calculate the difference between the width of each character and the
194
+ // combined with of all characters
195
+ const expectedWidth = nodeValue.split('').reduce((width, char) => {
196
+ return width + canvasContext.measureText(char).width;
197
+ }, 0);
198
+ const actualWidth = canvasContext.measureText(nodeValue).width;
199
+
200
+ const pixelDifference = differences / compareData.length;
201
+ const sizeDifference = 1 - actualWidth / expectedWidth;
202
+
203
+ if (
204
+ pixelDifference >= differenceThreshold &&
205
+ sizeDifference >= differenceThreshold
206
+ ) {
207
+ font.numLigatures++;
208
+ return true;
209
+ }
210
+
211
+ return false;
212
212
  }
213
213
 
214
214
  export default isIconLigature;
@@ -1,118 +1,118 @@
1
1
  export const autocomplete = {
2
- stateTerms: ['on', 'off'],
3
- standaloneTerms: [
4
- 'name',
5
- 'honorific-prefix',
6
- 'given-name',
7
- 'additional-name',
8
- 'family-name',
9
- 'honorific-suffix',
10
- 'nickname',
11
- 'username',
12
- 'new-password',
13
- 'current-password',
14
- 'organization-title',
15
- 'organization',
16
- 'street-address',
17
- 'address-line1',
18
- 'address-line2',
19
- 'address-line3',
20
- 'address-level4',
21
- 'address-level3',
22
- 'address-level2',
23
- 'address-level1',
24
- 'country',
25
- 'country-name',
26
- 'postal-code',
27
- 'cc-name',
28
- 'cc-given-name',
29
- 'cc-additional-name',
30
- 'cc-family-name',
31
- 'cc-number',
32
- 'cc-exp',
33
- 'cc-exp-month',
34
- 'cc-exp-year',
35
- 'cc-csc',
36
- 'cc-type',
37
- 'transaction-currency',
38
- 'transaction-amount',
39
- 'language',
40
- 'bday',
41
- 'bday-day',
42
- 'bday-month',
43
- 'bday-year',
44
- 'sex',
45
- 'url',
46
- 'photo',
47
- 'one-time-code'
48
- ],
49
- qualifiers: ['home', 'work', 'mobile', 'fax', 'pager'],
50
- qualifiedTerms: [
51
- 'tel',
52
- 'tel-country-code',
53
- 'tel-national',
54
- 'tel-area-code',
55
- 'tel-local',
56
- 'tel-local-prefix',
57
- 'tel-local-suffix',
58
- 'tel-extension',
59
- 'email',
60
- 'impp'
61
- ],
62
- locations: ['billing', 'shipping']
2
+ stateTerms: ['on', 'off'],
3
+ standaloneTerms: [
4
+ 'name',
5
+ 'honorific-prefix',
6
+ 'given-name',
7
+ 'additional-name',
8
+ 'family-name',
9
+ 'honorific-suffix',
10
+ 'nickname',
11
+ 'username',
12
+ 'new-password',
13
+ 'current-password',
14
+ 'organization-title',
15
+ 'organization',
16
+ 'street-address',
17
+ 'address-line1',
18
+ 'address-line2',
19
+ 'address-line3',
20
+ 'address-level4',
21
+ 'address-level3',
22
+ 'address-level2',
23
+ 'address-level1',
24
+ 'country',
25
+ 'country-name',
26
+ 'postal-code',
27
+ 'cc-name',
28
+ 'cc-given-name',
29
+ 'cc-additional-name',
30
+ 'cc-family-name',
31
+ 'cc-number',
32
+ 'cc-exp',
33
+ 'cc-exp-month',
34
+ 'cc-exp-year',
35
+ 'cc-csc',
36
+ 'cc-type',
37
+ 'transaction-currency',
38
+ 'transaction-amount',
39
+ 'language',
40
+ 'bday',
41
+ 'bday-day',
42
+ 'bday-month',
43
+ 'bday-year',
44
+ 'sex',
45
+ 'url',
46
+ 'photo',
47
+ 'one-time-code'
48
+ ],
49
+ qualifiers: ['home', 'work', 'mobile', 'fax', 'pager'],
50
+ qualifiedTerms: [
51
+ 'tel',
52
+ 'tel-country-code',
53
+ 'tel-national',
54
+ 'tel-area-code',
55
+ 'tel-local',
56
+ 'tel-local-prefix',
57
+ 'tel-local-suffix',
58
+ 'tel-extension',
59
+ 'email',
60
+ 'impp'
61
+ ],
62
+ locations: ['billing', 'shipping']
63
63
  };
64
64
 
65
65
  function isValidAutocomplete(
66
- autocompleteValue,
67
- {
68
- looseTyped = false,
69
- stateTerms = [],
70
- locations = [],
71
- qualifiers = [],
72
- standaloneTerms = [],
73
- qualifiedTerms = []
74
- } = {}
66
+ autocompleteValue,
67
+ {
68
+ looseTyped = false,
69
+ stateTerms = [],
70
+ locations = [],
71
+ qualifiers = [],
72
+ standaloneTerms = [],
73
+ qualifiedTerms = []
74
+ } = {}
75
75
  ) {
76
- autocompleteValue = autocompleteValue.toLowerCase().trim();
77
- stateTerms = stateTerms.concat(autocomplete.stateTerms);
78
- if (stateTerms.includes(autocompleteValue) || autocompleteValue === '') {
79
- return true;
80
- }
76
+ autocompleteValue = autocompleteValue.toLowerCase().trim();
77
+ stateTerms = stateTerms.concat(autocomplete.stateTerms);
78
+ if (stateTerms.includes(autocompleteValue) || autocompleteValue === '') {
79
+ return true;
80
+ }
81
81
 
82
- qualifiers = qualifiers.concat(autocomplete.qualifiers);
83
- locations = locations.concat(autocomplete.locations);
84
- standaloneTerms = standaloneTerms.concat(autocomplete.standaloneTerms);
85
- qualifiedTerms = qualifiedTerms.concat(autocomplete.qualifiedTerms);
82
+ qualifiers = qualifiers.concat(autocomplete.qualifiers);
83
+ locations = locations.concat(autocomplete.locations);
84
+ standaloneTerms = standaloneTerms.concat(autocomplete.standaloneTerms);
85
+ qualifiedTerms = qualifiedTerms.concat(autocomplete.qualifiedTerms);
86
86
 
87
- const autocompleteTerms = autocompleteValue.split(/\s+/g);
88
- if (!looseTyped) {
89
- if (
90
- autocompleteTerms[0].length > 8 &&
91
- autocompleteTerms[0].substr(0, 8) === 'section-'
92
- ) {
93
- autocompleteTerms.shift();
94
- }
87
+ const autocompleteTerms = autocompleteValue.split(/\s+/g);
88
+ if (!looseTyped) {
89
+ if (
90
+ autocompleteTerms[0].length > 8 &&
91
+ autocompleteTerms[0].substr(0, 8) === 'section-'
92
+ ) {
93
+ autocompleteTerms.shift();
94
+ }
95
95
 
96
- if (locations.includes(autocompleteTerms[0])) {
97
- autocompleteTerms.shift();
98
- }
96
+ if (locations.includes(autocompleteTerms[0])) {
97
+ autocompleteTerms.shift();
98
+ }
99
99
 
100
- if (qualifiers.includes(autocompleteTerms[0])) {
101
- autocompleteTerms.shift();
102
- // only quantifiers allowed at this point
103
- standaloneTerms = [];
104
- }
100
+ if (qualifiers.includes(autocompleteTerms[0])) {
101
+ autocompleteTerms.shift();
102
+ // only quantifiers allowed at this point
103
+ standaloneTerms = [];
104
+ }
105
105
 
106
- if (autocompleteTerms.length !== 1) {
107
- return false;
108
- }
109
- }
106
+ if (autocompleteTerms.length !== 1) {
107
+ return false;
108
+ }
109
+ }
110
110
 
111
- const purposeTerm = autocompleteTerms[autocompleteTerms.length - 1];
112
- return (
113
- standaloneTerms.includes(purposeTerm) ||
114
- qualifiedTerms.includes(purposeTerm)
115
- );
111
+ const purposeTerm = autocompleteTerms[autocompleteTerms.length - 1];
112
+ return (
113
+ standaloneTerms.includes(purposeTerm) ||
114
+ qualifiedTerms.includes(purposeTerm)
115
+ );
116
116
  }
117
117
 
118
118
  export default isValidAutocomplete;