axe-core 4.2.4 → 4.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +37 -2
- package/README.md +24 -2
- package/axe.d.ts +60 -4
- package/axe.js +1198 -830
- package/axe.min.js +2 -2
- package/locales/de.json +1 -1
- package/locales/pt_BR.json +163 -44
- package/package.json +7 -1
- package/.eslintrc.js +0 -112
- package/.prettierrc.json +0 -10
- package/CONTRIBUTING.md +0 -242
- package/bower.json +0 -40
- package/doc/API.md +0 -963
- package/doc/accessibility-supported.md +0 -37
- package/doc/act-rules-format.md +0 -37
- package/doc/aria-supported.md +0 -13
- package/doc/backwards-compatibility-doc.md +0 -94
- package/doc/check-message-template.md +0 -124
- package/doc/check-options.md +0 -437
- package/doc/code-submission-guidelines.md +0 -171
- package/doc/developer-guide.md +0 -515
- package/doc/examples/chrome-debugging-protocol/README.md +0 -13
- package/doc/examples/chrome-debugging-protocol/axe-cdp.js +0 -81
- package/doc/examples/chrome-debugging-protocol/package.json +0 -11
- package/doc/examples/html-handlebars.md +0 -164
- package/doc/examples/jasmine/README.md +0 -35
- package/doc/examples/jasmine/karma.conf.js +0 -29
- package/doc/examples/jasmine/package-lock.json +0 -1489
- package/doc/examples/jasmine/package.json +0 -21
- package/doc/examples/jasmine/spec/a11y.js +0 -36
- package/doc/examples/jest_react/README.md +0 -41
- package/doc/examples/jest_react/link.js +0 -7
- package/doc/examples/jest_react/link.test.js +0 -24
- package/doc/examples/jest_react/package-lock.json +0 -7525
- package/doc/examples/jest_react/package.json +0 -28
- package/doc/examples/jest_react/test-helpers.js +0 -21
- package/doc/examples/jsdom/package.json +0 -15
- package/doc/examples/mocha/README.md +0 -35
- package/doc/examples/mocha/karma.conf.js +0 -29
- package/doc/examples/mocha/package-lock.json +0 -1671
- package/doc/examples/mocha/package.json +0 -22
- package/doc/examples/phantomjs/README.md +0 -17
- package/doc/examples/phantomjs/axe-phantom.js +0 -53
- package/doc/examples/phantomjs/package-lock.json +0 -862
- package/doc/examples/phantomjs/package.json +0 -19
- package/doc/examples/puppeteer/README.md +0 -12
- package/doc/examples/puppeteer/axe-puppeteer.js +0 -60
- package/doc/examples/puppeteer/package.json +0 -13
- package/doc/examples/qunit/README.md +0 -37
- package/doc/examples/qunit/package-lock.json +0 -2951
- package/doc/examples/qunit/package.json +0 -21
- package/doc/examples/test-examples.js +0 -40
- package/doc/frame-messenger.md +0 -107
- package/doc/plugins.md +0 -123
- package/doc/projects.md +0 -56
- package/doc/rule-descriptions.md +0 -135
- package/doc/rule-development.md +0 -123
- package/doc/rule-proposal.md +0 -106
- package/doc/standards-object.md +0 -147
- package/lib/checks/aria/abstractrole-evaluate.js +0 -40
- package/lib/checks/aria/abstractrole.json +0 -14
- package/lib/checks/aria/aria-allowed-attr-evaluate.js +0 -58
- package/lib/checks/aria/aria-allowed-attr.json +0 -14
- package/lib/checks/aria/aria-allowed-role-evaluate.js +0 -42
- package/lib/checks/aria/aria-allowed-role.json +0 -22
- package/lib/checks/aria/aria-errormessage-evaluate.js +0 -68
- package/lib/checks/aria/aria-errormessage.json +0 -18
- package/lib/checks/aria/aria-hidden-body-evaluate.js +0 -11
- package/lib/checks/aria/aria-hidden-body.json +0 -11
- package/lib/checks/aria/aria-prohibited-attr-evaluate.js +0 -68
- package/lib/checks/aria/aria-prohibited-attr.json +0 -15
- package/lib/checks/aria/aria-required-attr-evaluate.js +0 -67
- package/lib/checks/aria/aria-required-attr.json +0 -14
- package/lib/checks/aria/aria-required-children-evaluate.js +0 -137
- package/lib/checks/aria/aria-required-children.json +0 -32
- package/lib/checks/aria/aria-required-parent-evaluate.js +0 -120
- package/lib/checks/aria/aria-required-parent.json +0 -17
- package/lib/checks/aria/aria-roledescription-evaluate.js +0 -25
- package/lib/checks/aria/aria-roledescription.json +0 -23
- package/lib/checks/aria/aria-unsupported-attr-evaluate.js +0 -53
- package/lib/checks/aria/aria-unsupported-attr.json +0 -11
- package/lib/checks/aria/aria-valid-attr-evaluate.js +0 -51
- package/lib/checks/aria/aria-valid-attr-value-evaluate.js +0 -122
- package/lib/checks/aria/aria-valid-attr-value.json +0 -19
- package/lib/checks/aria/aria-valid-attr.json +0 -15
- package/lib/checks/aria/fallbackrole-evaluate.js +0 -13
- package/lib/checks/aria/fallbackrole.json +0 -11
- package/lib/checks/aria/has-global-aria-attribute-evaluate.js +0 -11
- package/lib/checks/aria/has-global-aria-attribute.json +0 -14
- package/lib/checks/aria/has-widget-role-evaluate.js +0 -20
- package/lib/checks/aria/has-widget-role.json +0 -12
- package/lib/checks/aria/invalidrole-evaluate.js +0 -45
- package/lib/checks/aria/invalidrole.json +0 -14
- package/lib/checks/aria/is-element-focusable-evaluate.js +0 -7
- package/lib/checks/aria/is-element-focusable.json +0 -11
- package/lib/checks/aria/no-implicit-explicit-label-evaluate.js +0 -54
- package/lib/checks/aria/no-implicit-explicit-label.json +0 -11
- package/lib/checks/aria/unsupportedrole-evaluate.js +0 -15
- package/lib/checks/aria/unsupportedrole.json +0 -11
- package/lib/checks/aria/valid-scrollable-semantics-evaluate.js +0 -70
- package/lib/checks/aria/valid-scrollable-semantics.json +0 -14
- package/lib/checks/color/color-contrast-evaluate.js +0 -178
- package/lib/checks/color/color-contrast.json +0 -42
- package/lib/checks/color/link-in-text-block-evaluate.js +0 -94
- package/lib/checks/color/link-in-text-block.json +0 -19
- package/lib/checks/forms/autocomplete-appropriate-evaluate.js +0 -84
- package/lib/checks/forms/autocomplete-appropriate.json +0 -11
- package/lib/checks/forms/autocomplete-valid-evaluate.js +0 -8
- package/lib/checks/forms/autocomplete-valid.json +0 -11
- package/lib/checks/generic/README.md +0 -13
- package/lib/checks/generic/attr-non-space-content-evaluate.js +0 -28
- package/lib/checks/generic/has-descendant-after.js +0 -15
- package/lib/checks/generic/has-descendant-evaluate.js +0 -20
- package/lib/checks/generic/has-text-content-evaluate.js +0 -11
- package/lib/checks/generic/matches-definition-evaluate.js +0 -7
- package/lib/checks/generic/page-no-duplicate-after.js +0 -6
- package/lib/checks/generic/page-no-duplicate-evaluate.js +0 -42
- package/lib/checks/index.js +0 -11
- package/lib/checks/keyboard/accesskeys-after.js +0 -23
- package/lib/checks/keyboard/accesskeys-evaluate.js +0 -11
- package/lib/checks/keyboard/accesskeys.json +0 -12
- package/lib/checks/keyboard/focusable-content-evaluate.js +0 -20
- package/lib/checks/keyboard/focusable-content.json +0 -11
- package/lib/checks/keyboard/focusable-disabled-evaluate.js +0 -36
- package/lib/checks/keyboard/focusable-disabled.json +0 -11
- package/lib/checks/keyboard/focusable-element-evaluate.js +0 -47
- package/lib/checks/keyboard/focusable-element.json +0 -11
- package/lib/checks/keyboard/focusable-modal-open-evaluate.js +0 -20
- package/lib/checks/keyboard/focusable-modal-open.json +0 -11
- package/lib/checks/keyboard/focusable-no-name-evaluate.js +0 -18
- package/lib/checks/keyboard/focusable-no-name.json +0 -12
- package/lib/checks/keyboard/focusable-not-tabbable-evaluate.js +0 -36
- package/lib/checks/keyboard/focusable-not-tabbable.json +0 -11
- package/lib/checks/keyboard/frame-focusable-content.json +0 -12
- package/lib/checks/keyboard/landmark-is-top-level-evaluate.js +0 -31
- package/lib/checks/keyboard/landmark-is-top-level.json +0 -11
- package/lib/checks/keyboard/no-focusable-content-evaluate.js +0 -35
- package/lib/checks/keyboard/no-focusable-content.json +0 -12
- package/lib/checks/keyboard/page-has-heading-one.json +0 -15
- package/lib/checks/keyboard/page-has-main.json +0 -15
- package/lib/checks/keyboard/page-no-duplicate-banner.json +0 -16
- package/lib/checks/keyboard/page-no-duplicate-contentinfo.json +0 -16
- package/lib/checks/keyboard/page-no-duplicate-main.json +0 -15
- package/lib/checks/keyboard/tabindex-evaluate.js +0 -10
- package/lib/checks/keyboard/tabindex.json +0 -11
- package/lib/checks/label/alt-space-value-evaluate.js +0 -7
- package/lib/checks/label/alt-space-value.json +0 -11
- package/lib/checks/label/duplicate-img-label-evaluate.js +0 -23
- package/lib/checks/label/duplicate-img-label.json +0 -14
- package/lib/checks/label/explicit-evaluate.js +0 -34
- package/lib/checks/label/explicit.json +0 -12
- package/lib/checks/label/help-same-as-label-evaluate.js +0 -28
- package/lib/checks/label/help-same-as-label.json +0 -12
- package/lib/checks/label/hidden-explicit-label-evaluate.js +0 -30
- package/lib/checks/label/hidden-explicit-label.json +0 -12
- package/lib/checks/label/implicit-evaluate.js +0 -16
- package/lib/checks/label/implicit.json +0 -12
- package/lib/checks/label/label-content-name-mismatch-evaluate.js +0 -71
- package/lib/checks/label/label-content-name-mismatch.json +0 -15
- package/lib/checks/label/multiple-label-evaluate.js +0 -44
- package/lib/checks/label/multiple-label.json +0 -11
- package/lib/checks/label/title-only-evaluate.js +0 -11
- package/lib/checks/label/title-only.json +0 -11
- package/lib/checks/landmarks/landmark-is-unique-after.js +0 -27
- package/lib/checks/landmarks/landmark-is-unique-evaluate.js +0 -14
- package/lib/checks/landmarks/landmark-is-unique.json +0 -12
- package/lib/checks/language/has-lang-evaluate.js +0 -39
- package/lib/checks/language/has-lang.json +0 -17
- package/lib/checks/language/valid-lang-evaluate.js +0 -36
- package/lib/checks/language/valid-lang.json +0 -14
- package/lib/checks/language/xml-lang-mismatch-evaluate.js +0 -10
- package/lib/checks/language/xml-lang-mismatch.json +0 -11
- package/lib/checks/lists/dlitem-evaluate.js +0 -30
- package/lib/checks/lists/dlitem.json +0 -11
- package/lib/checks/lists/listitem-evaluate.js +0 -28
- package/lib/checks/lists/listitem.json +0 -14
- package/lib/checks/lists/only-dlitems-evaluate.js +0 -51
- package/lib/checks/lists/only-dlitems.json +0 -11
- package/lib/checks/lists/only-listitems-evaluate.js +0 -63
- package/lib/checks/lists/only-listitems.json +0 -14
- package/lib/checks/lists/structured-dlitems-evaluate.js +0 -26
- package/lib/checks/lists/structured-dlitems.json +0 -11
- package/lib/checks/media/caption-evaluate.js +0 -13
- package/lib/checks/media/caption.json +0 -11
- package/lib/checks/media/frame-tested-after.js +0 -31
- package/lib/checks/media/frame-tested-evaluate.js +0 -6
- package/lib/checks/media/frame-tested.json +0 -16
- package/lib/checks/media/no-autoplay-audio-evaluate.js +0 -97
- package/lib/checks/media/no-autoplay-audio.json +0 -15
- package/lib/checks/mobile/css-orientation-lock-evaluate.js +0 -254
- package/lib/checks/mobile/css-orientation-lock.json +0 -15
- package/lib/checks/mobile/meta-viewport-large.json +0 -15
- package/lib/checks/mobile/meta-viewport-scale-evaluate.js +0 -71
- package/lib/checks/mobile/meta-viewport.json +0 -14
- package/lib/checks/navigation/header-present.json +0 -15
- package/lib/checks/navigation/heading-order-after.js +0 -132
- package/lib/checks/navigation/heading-order-evaluate.js +0 -58
- package/lib/checks/navigation/heading-order.json +0 -13
- package/lib/checks/navigation/identical-links-same-purpose-after.js +0 -106
- package/lib/checks/navigation/identical-links-same-purpose-evaluate.js +0 -35
- package/lib/checks/navigation/identical-links-same-purpose.json +0 -12
- package/lib/checks/navigation/internal-link-present-evaluate.js +0 -10
- package/lib/checks/navigation/internal-link-present.json +0 -11
- package/lib/checks/navigation/landmark.json +0 -14
- package/lib/checks/navigation/meta-refresh-evaluate.js +0 -8
- package/lib/checks/navigation/meta-refresh.json +0 -11
- package/lib/checks/navigation/p-as-heading-evaluate.js +0 -98
- package/lib/checks/navigation/p-as-heading.json +0 -30
- package/lib/checks/navigation/region-evaluate.js +0 -106
- package/lib/checks/navigation/region.json +0 -14
- package/lib/checks/navigation/skip-link-evaluate.js +0 -11
- package/lib/checks/navigation/skip-link.json +0 -12
- package/lib/checks/navigation/unique-frame-title-after.js +0 -13
- package/lib/checks/navigation/unique-frame-title-evaluate.js +0 -9
- package/lib/checks/navigation/unique-frame-title.json +0 -12
- package/lib/checks/parsing/duplicate-id-active.json +0 -12
- package/lib/checks/parsing/duplicate-id-after.js +0 -12
- package/lib/checks/parsing/duplicate-id-aria.json +0 -12
- package/lib/checks/parsing/duplicate-id-evaluate.js +0 -24
- package/lib/checks/parsing/duplicate-id.json +0 -12
- package/lib/checks/shared/aria-label-evaluate.js +0 -8
- package/lib/checks/shared/aria-label.json +0 -11
- package/lib/checks/shared/aria-labelledby-evaluate.js +0 -12
- package/lib/checks/shared/aria-labelledby.json +0 -12
- package/lib/checks/shared/avoid-inline-spacing-evaluate.js +0 -16
- package/lib/checks/shared/avoid-inline-spacing.json +0 -17
- package/lib/checks/shared/button-has-visible-text.json +0 -12
- package/lib/checks/shared/doc-has-title-evaluate.js +0 -8
- package/lib/checks/shared/doc-has-title.json +0 -11
- package/lib/checks/shared/exists-evaluate.js +0 -5
- package/lib/checks/shared/exists.json +0 -11
- package/lib/checks/shared/has-alt-evaluate.js +0 -10
- package/lib/checks/shared/has-alt.json +0 -11
- package/lib/checks/shared/has-visible-text.json +0 -12
- package/lib/checks/shared/is-on-screen-evaluate.js +0 -8
- package/lib/checks/shared/is-on-screen.json +0 -11
- package/lib/checks/shared/non-empty-alt.json +0 -17
- package/lib/checks/shared/non-empty-if-present-evaluate.js +0 -19
- package/lib/checks/shared/non-empty-if-present.json +0 -14
- package/lib/checks/shared/non-empty-placeholder.json +0 -17
- package/lib/checks/shared/non-empty-title.json +0 -17
- package/lib/checks/shared/non-empty-value.json +0 -17
- package/lib/checks/shared/presentational-role-evaluate.js +0 -42
- package/lib/checks/shared/presentational-role.json +0 -16
- package/lib/checks/shared/role-none.json +0 -19
- package/lib/checks/shared/role-presentation.json +0 -19
- package/lib/checks/shared/svg-non-empty-title-evaluate.js +0 -33
- package/lib/checks/shared/svg-non-empty-title.json +0 -15
- package/lib/checks/tables/caption-faked-evaluate.js +0 -16
- package/lib/checks/tables/caption-faked.json +0 -11
- package/lib/checks/tables/html5-scope-evaluate.js +0 -11
- package/lib/checks/tables/html5-scope.json +0 -11
- package/lib/checks/tables/same-caption-summary-evaluate.js +0 -12
- package/lib/checks/tables/same-caption-summary.json +0 -11
- package/lib/checks/tables/scope-value-evaluate.js +0 -7
- package/lib/checks/tables/scope-value.json +0 -14
- package/lib/checks/tables/td-has-header-evaluate.js +0 -33
- package/lib/checks/tables/td-has-header.json +0 -11
- package/lib/checks/tables/td-headers-attr-evaluate.js +0 -67
- package/lib/checks/tables/td-headers-attr.json +0 -12
- package/lib/checks/tables/th-has-data-cells-evaluate.js +0 -82
- package/lib/checks/tables/th-has-data-cells.json +0 -12
- package/lib/checks/visibility/hidden-content-evaluate.js +0 -34
- package/lib/checks/visibility/hidden-content.json +0 -12
- package/lib/commons/aria/allowed-attr.js +0 -31
- package/lib/commons/aria/arialabel-text.js +0 -21
- package/lib/commons/aria/arialabelledby-text.js +0 -65
- package/lib/commons/aria/get-accessible-refs.js +0 -73
- package/lib/commons/aria/get-element-unallowed-roles.js +0 -110
- package/lib/commons/aria/get-explicit-role.js +0 -26
- package/lib/commons/aria/get-owned-virtual.js +0 -27
- package/lib/commons/aria/get-role-type.js +0 -21
- package/lib/commons/aria/get-role.js +0 -178
- package/lib/commons/aria/get-roles-by-type.js +0 -16
- package/lib/commons/aria/get-roles-with-name-from-contents.js +0 -15
- package/lib/commons/aria/implicit-nodes.js +0 -23
- package/lib/commons/aria/implicit-role.js +0 -44
- package/lib/commons/aria/index.js +0 -32
- package/lib/commons/aria/is-accessible-ref.js +0 -12
- package/lib/commons/aria/is-aria-role-allowed-on-element.js +0 -32
- package/lib/commons/aria/is-unsupported-role.js +0 -16
- package/lib/commons/aria/is-valid-role.js +0 -22
- package/lib/commons/aria/label-virtual.js +0 -46
- package/lib/commons/aria/label.js +0 -17
- package/lib/commons/aria/lookup-table.js +0 -2435
- package/lib/commons/aria/named-from-contents.js +0 -39
- package/lib/commons/aria/required-attr.js +0 -21
- package/lib/commons/aria/required-context.js +0 -21
- package/lib/commons/aria/required-owned.js +0 -21
- package/lib/commons/aria/validate-attr-value.js +0 -70
- package/lib/commons/aria/validate-attr.js +0 -16
- package/lib/commons/color/center-point-of-rect.js +0 -31
- package/lib/commons/color/color.js +0 -250
- package/lib/commons/color/element-has-image.js +0 -35
- package/lib/commons/color/element-is-distinct.js +0 -87
- package/lib/commons/color/filtered-rect-stack.js +0 -51
- package/lib/commons/color/flatten-colors.js +0 -22
- package/lib/commons/color/get-background-color.js +0 -84
- package/lib/commons/color/get-background-stack.js +0 -130
- package/lib/commons/color/get-contrast.js +0 -27
- package/lib/commons/color/get-foreground-color.js +0 -69
- package/lib/commons/color/get-own-background-color.js +0 -24
- package/lib/commons/color/get-rect-stack.js +0 -32
- package/lib/commons/color/get-text-shadow-colors.js +0 -121
- package/lib/commons/color/has-valid-contrast-ratio.js +0 -30
- package/lib/commons/color/incomplete-data.js +0 -47
- package/lib/commons/color/index.js +0 -20
- package/lib/commons/dom/find-elms-in-context.js +0 -31
- package/lib/commons/dom/find-up-virtual.js +0 -52
- package/lib/commons/dom/find-up.js +0 -20
- package/lib/commons/dom/focus-disabled.js +0 -30
- package/lib/commons/dom/get-composed-parent.js +0 -26
- package/lib/commons/dom/get-element-by-reference.js +0 -34
- package/lib/commons/dom/get-element-coordinates.js +0 -38
- package/lib/commons/dom/get-element-stack.js +0 -28
- package/lib/commons/dom/get-rect-stack.js +0 -514
- package/lib/commons/dom/get-root-node.js +0 -12
- package/lib/commons/dom/get-scroll-offset.js +0 -32
- package/lib/commons/dom/get-tabbable-elements.js +0 -26
- package/lib/commons/dom/get-text-element-stack.js +0 -89
- package/lib/commons/dom/get-viewport-size.js +0 -35
- package/lib/commons/dom/has-content-virtual.js +0 -53
- package/lib/commons/dom/has-content.js +0 -21
- package/lib/commons/dom/idrefs.js +0 -41
- package/lib/commons/dom/index.js +0 -38
- package/lib/commons/dom/inserted-into-focus-order.js +0 -24
- package/lib/commons/dom/is-focusable.js +0 -36
- package/lib/commons/dom/is-hidden-with-css.js +0 -76
- package/lib/commons/dom/is-html5.js +0 -17
- package/lib/commons/dom/is-in-text-block.js +0 -107
- package/lib/commons/dom/is-modal-open.js +0 -104
- package/lib/commons/dom/is-natively-focusable.js +0 -41
- package/lib/commons/dom/is-node.js +0 -14
- package/lib/commons/dom/is-offscreen.js +0 -66
- package/lib/commons/dom/is-opaque.js +0 -16
- package/lib/commons/dom/is-skip-link.js +0 -49
- package/lib/commons/dom/is-visible.js +0 -201
- package/lib/commons/dom/is-visual-content.js +0 -49
- package/lib/commons/dom/reduce-to-elements-below-floating.js +0 -36
- package/lib/commons/dom/shadow-elements-from-point.js +0 -47
- package/lib/commons/dom/url-props-from-attribute.js +0 -152
- package/lib/commons/dom/visually-contains.js +0 -113
- package/lib/commons/dom/visually-overlaps.js +0 -46
- package/lib/commons/forms/index.js +0 -12
- package/lib/commons/forms/is-aria-combobox.js +0 -15
- package/lib/commons/forms/is-aria-listbox.js +0 -15
- package/lib/commons/forms/is-aria-range.js +0 -17
- package/lib/commons/forms/is-aria-textbox.js +0 -15
- package/lib/commons/forms/is-disabled.js +0 -40
- package/lib/commons/forms/is-native-select.js +0 -17
- package/lib/commons/forms/is-native-textbox.js +0 -34
- package/lib/commons/index.js +0 -31
- package/lib/commons/matches/attributes.js +0 -32
- package/lib/commons/matches/condition.js +0 -20
- package/lib/commons/matches/explicit-role.js +0 -24
- package/lib/commons/matches/from-definition.js +0 -73
- package/lib/commons/matches/from-function.js +0 -40
- package/lib/commons/matches/from-primative.js +0 -44
- package/lib/commons/matches/implicit-role.js +0 -24
- package/lib/commons/matches/index.js +0 -29
- package/lib/commons/matches/matches.js +0 -39
- package/lib/commons/matches/node-name.js +0 -29
- package/lib/commons/matches/properties.js +0 -32
- package/lib/commons/matches/semantic-role.js +0 -24
- package/lib/commons/standards/get-aria-roles-by-type.js +0 -14
- package/lib/commons/standards/get-aria-roles-supporting-name-from-content.js +0 -22
- package/lib/commons/standards/get-element-spec.js +0 -54
- package/lib/commons/standards/get-elements-by-content-type.js +0 -30
- package/lib/commons/standards/get-global-aria-attrs.js +0 -22
- package/lib/commons/standards/implicit-html-roles.js +0 -186
- package/lib/commons/standards/index.js +0 -11
- package/lib/commons/table/get-all-cells.js +0 -28
- package/lib/commons/table/get-cell-position.js +0 -32
- package/lib/commons/table/get-headers.js +0 -102
- package/lib/commons/table/get-scope.js +0 -58
- package/lib/commons/table/index.js +0 -19
- package/lib/commons/table/is-column-header.js +0 -15
- package/lib/commons/table/is-data-cell.js +0 -24
- package/lib/commons/table/is-data-table.js +0 -195
- package/lib/commons/table/is-header.js +0 -26
- package/lib/commons/table/is-row-header.js +0 -15
- package/lib/commons/table/to-grid.js +0 -48
- package/lib/commons/table/traverse.js +0 -76
- package/lib/commons/text/accessible-text-virtual.js +0 -152
- package/lib/commons/text/accessible-text.js +0 -19
- package/lib/commons/text/form-control-value.js +0 -216
- package/lib/commons/text/has-unicode.js +0 -38
- package/lib/commons/text/index.js +0 -32
- package/lib/commons/text/is-human-interpretable.js +0 -54
- package/lib/commons/text/is-icon-ligature.js +0 -214
- package/lib/commons/text/is-valid-autocomplete.js +0 -118
- package/lib/commons/text/label-text.js +0 -70
- package/lib/commons/text/label-virtual.js +0 -50
- package/lib/commons/text/label.js +0 -19
- package/lib/commons/text/native-element-type.js +0 -101
- package/lib/commons/text/native-text-alternative.js +0 -46
- package/lib/commons/text/native-text-methods.js +0 -136
- package/lib/commons/text/remove-unicode.js +0 -38
- package/lib/commons/text/sanitize.js +0 -21
- package/lib/commons/text/subtree-text.js +0 -74
- package/lib/commons/text/title-text.js +0 -33
- package/lib/commons/text/unicode.js +0 -85
- package/lib/commons/text/unsupported.js +0 -5
- package/lib/commons/text/visible-text-nodes.js +0 -27
- package/lib/commons/text/visible-virtual.js +0 -46
- package/lib/commons/text/visible.js +0 -18
- package/lib/core/base/audit.js +0 -767
- package/lib/core/base/cache.js +0 -30
- package/lib/core/base/check-result.js +0 -31
- package/lib/core/base/check.js +0 -215
- package/lib/core/base/context.js +0 -280
- package/lib/core/base/metadata-function-map.js +0 -353
- package/lib/core/base/rule-result.js +0 -39
- package/lib/core/base/rule.js +0 -611
- package/lib/core/base/virtual-node/abstract-virtual-node.js +0 -43
- package/lib/core/base/virtual-node/serial-virtual-node.js +0 -117
- package/lib/core/base/virtual-node/virtual-node.js +0 -194
- package/lib/core/constants.js +0 -70
- package/lib/core/core.js +0 -91
- package/lib/core/imports/index.js +0 -39
- package/lib/core/index.js +0 -40
- package/lib/core/log.js +0 -13
- package/lib/core/public/cleanup.js +0 -51
- package/lib/core/public/configure.js +0 -134
- package/lib/core/public/frame-messenger.js +0 -5
- package/lib/core/public/get-rules.js +0 -29
- package/lib/core/public/load.js +0 -65
- package/lib/core/public/plugins.js +0 -39
- package/lib/core/public/reporter.js +0 -25
- package/lib/core/public/reset.js +0 -13
- package/lib/core/public/run-rules.js +0 -83
- package/lib/core/public/run-virtual-rule.js +0 -63
- package/lib/core/public/run.js +0 -186
- package/lib/core/public/setup.js +0 -20
- package/lib/core/public/teardown.js +0 -21
- package/lib/core/reporters/helpers/failure-summary.js +0 -33
- package/lib/core/reporters/helpers/get-environment-data.js +0 -39
- package/lib/core/reporters/helpers/incomplete-fallback-msg.js +0 -12
- package/lib/core/reporters/helpers/index.js +0 -21
- package/lib/core/reporters/helpers/process-aggregate.js +0 -110
- package/lib/core/reporters/na.js +0 -24
- package/lib/core/reporters/no-passes.js +0 -20
- package/lib/core/reporters/raw-env.js +0 -17
- package/lib/core/reporters/raw.js +0 -32
- package/lib/core/reporters/v1.js +0 -33
- package/lib/core/reporters/v2.js +0 -19
- package/lib/core/utils/aggregate-checks.js +0 -90
- package/lib/core/utils/aggregate-node-results.js +0 -65
- package/lib/core/utils/aggregate-result.js +0 -39
- package/lib/core/utils/aggregate.js +0 -21
- package/lib/core/utils/are-styles-set.js +0 -18
- package/lib/core/utils/assert.js +0 -12
- package/lib/core/utils/check-helper.js +0 -36
- package/lib/core/utils/clone.js +0 -28
- package/lib/core/utils/closest.js +0 -30
- package/lib/core/utils/collect-results-from-frames.js +0 -84
- package/lib/core/utils/contains.js +0 -46
- package/lib/core/utils/css-parser.js +0 -9
- package/lib/core/utils/deep-merge.js +0 -31
- package/lib/core/utils/dq-element.js +0 -131
- package/lib/core/utils/element-matches.js +0 -43
- package/lib/core/utils/escape-selector.js +0 -79
- package/lib/core/utils/extend-meta-data.js +0 -20
- package/lib/core/utils/filter-html-attrs.js +0 -75
- package/lib/core/utils/finalize-result.js +0 -28
- package/lib/core/utils/find-by.js +0 -16
- package/lib/core/utils/frame-messenger/assert-window.js +0 -21
- package/lib/core/utils/frame-messenger/channel-store.js +0 -23
- package/lib/core/utils/frame-messenger/create-responder.js +0 -15
- package/lib/core/utils/frame-messenger/message-handler.js +0 -72
- package/lib/core/utils/frame-messenger/message-id.js +0 -22
- package/lib/core/utils/frame-messenger/message-parser.js +0 -109
- package/lib/core/utils/frame-messenger/post-message.js +0 -54
- package/lib/core/utils/frame-messenger/process-error.js +0 -30
- package/lib/core/utils/frame-messenger.js +0 -40
- package/lib/core/utils/get-all-checks.js +0 -13
- package/lib/core/utils/get-ancestry.js +0 -31
- package/lib/core/utils/get-base-lang.js +0 -18
- package/lib/core/utils/get-check-message.js +0 -24
- package/lib/core/utils/get-check-option.js +0 -41
- package/lib/core/utils/get-flattened-tree.js +0 -151
- package/lib/core/utils/get-friendly-uri-end.js +0 -143
- package/lib/core/utils/get-node-attributes.js +0 -22
- package/lib/core/utils/get-node-from-tree.js +0 -14
- package/lib/core/utils/get-root-node.js +0 -17
- package/lib/core/utils/get-rule.js +0 -17
- package/lib/core/utils/get-scroll-state.js +0 -43
- package/lib/core/utils/get-scroll.js +0 -41
- package/lib/core/utils/get-selector.js +0 -395
- package/lib/core/utils/get-shadow-selector.js +0 -31
- package/lib/core/utils/get-standards.js +0 -6
- package/lib/core/utils/get-stylesheet-factory.js +0 -53
- package/lib/core/utils/get-xpath.js +0 -84
- package/lib/core/utils/index.js +0 -90
- package/lib/core/utils/inject-style.js +0 -33
- package/lib/core/utils/is-hidden.js +0 -55
- package/lib/core/utils/is-html-element.js +0 -137
- package/lib/core/utils/is-node-in-context.js +0 -46
- package/lib/core/utils/is-shadow-root.js +0 -40
- package/lib/core/utils/is-xhtml.js +0 -15
- package/lib/core/utils/matches.js +0 -263
- package/lib/core/utils/memoize.js +0 -22
- package/lib/core/utils/merge-results.js +0 -134
- package/lib/core/utils/node-sorter.js +0 -23
- package/lib/core/utils/parse-crossorigin-stylesheet.js +0 -66
- package/lib/core/utils/parse-sameorigin-stylesheet.js +0 -100
- package/lib/core/utils/parse-stylesheet.js +0 -75
- package/lib/core/utils/performance-timer.js +0 -126
- package/lib/core/utils/pollyfills.js +0 -347
- package/lib/core/utils/preload-cssom.js +0 -249
- package/lib/core/utils/preload-media.js +0 -70
- package/lib/core/utils/preload.js +0 -150
- package/lib/core/utils/process-message.js +0 -77
- package/lib/core/utils/publish-metadata.js +0 -109
- package/lib/core/utils/query-selector-all-filter.js +0 -104
- package/lib/core/utils/query-selector-all.js +0 -15
- package/lib/core/utils/queue.js +0 -137
- package/lib/core/utils/respondable.js +0 -108
- package/lib/core/utils/rule-should-run.js +0 -83
- package/lib/core/utils/select.js +0 -87
- package/lib/core/utils/send-command-to-frame.js +0 -65
- package/lib/core/utils/set-scroll-state.js +0 -21
- package/lib/core/utils/to-array.js +0 -10
- package/lib/core/utils/token-list.js +0 -15
- package/lib/core/utils/unique-array.js +0 -13
- package/lib/core/utils/uuid.js +0 -253
- package/lib/core/utils/valid-input-type.js +0 -35
- package/lib/core/utils/valid-langs.js +0 -105
- package/lib/intro.stub +0 -15
- package/lib/misc/any-failure-summary.json +0 -6
- package/lib/misc/incomplete-fallback.json +0 -3
- package/lib/misc/none-failure-summary.json +0 -6
- package/lib/outro.stub +0 -2
- package/lib/rules/accesskeys.json +0 -13
- package/lib/rules/area-alt.json +0 -22
- package/lib/rules/aria-allowed-attr-matches.js +0 -15
- package/lib/rules/aria-allowed-attr.json +0 -12
- package/lib/rules/aria-allowed-role-matches.js +0 -12
- package/lib/rules/aria-allowed-role.json +0 -14
- package/lib/rules/aria-command-name.json +0 -18
- package/lib/rules/aria-dialog-name.json +0 -13
- package/lib/rules/aria-has-attr-matches.js +0 -9
- package/lib/rules/aria-hidden-body.json +0 -14
- package/lib/rules/aria-hidden-focus-matches.js +0 -22
- package/lib/rules/aria-hidden-focus.json +0 -18
- package/lib/rules/aria-input-field-name.json +0 -13
- package/lib/rules/aria-meter-name.json +0 -13
- package/lib/rules/aria-progressbar-name.json +0 -13
- package/lib/rules/aria-required-attr.json +0 -12
- package/lib/rules/aria-required-children-matches.js +0 -8
- package/lib/rules/aria-required-children.json +0 -13
- package/lib/rules/aria-required-parent-matches.js +0 -8
- package/lib/rules/aria-required-parent.json +0 -13
- package/lib/rules/aria-roledescription.json +0 -12
- package/lib/rules/aria-roles.json +0 -13
- package/lib/rules/aria-text.json +0 -12
- package/lib/rules/aria-toggle-field-name.json +0 -18
- package/lib/rules/aria-tooltip-name.json +0 -18
- package/lib/rules/aria-treeitem-name.json +0 -18
- package/lib/rules/aria-valid-attr-value.json +0 -12
- package/lib/rules/aria-valid-attr.json +0 -12
- package/lib/rules/audio-caption.json +0 -20
- package/lib/rules/autocomplete-matches.js +0 -58
- package/lib/rules/autocomplete-valid.json +0 -12
- package/lib/rules/avoid-inline-spacing.json +0 -12
- package/lib/rules/blink.json +0 -19
- package/lib/rules/button-name.json +0 -26
- package/lib/rules/bypass-matches.js +0 -14
- package/lib/rules/bypass.json +0 -21
- package/lib/rules/color-contrast-matches.js +0 -156
- package/lib/rules/color-contrast.json +0 -13
- package/lib/rules/css-orientation-lock.json +0 -13
- package/lib/rules/data-table-large-matches.js +0 -17
- package/lib/rules/data-table-matches.js +0 -7
- package/lib/rules/definition-list.json +0 -13
- package/lib/rules/dlitem.json +0 -13
- package/lib/rules/document-title.json +0 -13
- package/lib/rules/duplicate-id-active-matches.js +0 -15
- package/lib/rules/duplicate-id-active.json +0 -14
- package/lib/rules/duplicate-id-aria-matches.js +0 -7
- package/lib/rules/duplicate-id-aria.json +0 -14
- package/lib/rules/duplicate-id-misc-matches.js +0 -17
- package/lib/rules/duplicate-id.json +0 -14
- package/lib/rules/empty-heading.json +0 -19
- package/lib/rules/empty-table-header.json +0 -13
- package/lib/rules/focus-order-semantics.json +0 -13
- package/lib/rules/form-field-multiple-labels.json +0 -13
- package/lib/rules/frame-focusable-content-matches.js +0 -9
- package/lib/rules/frame-focusable-content.json +0 -13
- package/lib/rules/frame-tested.json +0 -12
- package/lib/rules/frame-title-has-text-matches.js +0 -8
- package/lib/rules/frame-title-unique.json +0 -13
- package/lib/rules/frame-title.json +0 -24
- package/lib/rules/has-implicit-chromium-role-matches.js +0 -7
- package/lib/rules/heading-matches.js +0 -19
- package/lib/rules/heading-order.json +0 -13
- package/lib/rules/hidden-content.json +0 -13
- package/lib/rules/html-has-lang.json +0 -13
- package/lib/rules/html-lang-valid.json +0 -12
- package/lib/rules/html-namespace-matches.js +0 -7
- package/lib/rules/html-xml-lang-mismatch.json +0 -13
- package/lib/rules/identical-links-same-purpose-matches.js +0 -18
- package/lib/rules/identical-links-same-purpose.json +0 -14
- package/lib/rules/image-alt.json +0 -26
- package/lib/rules/img-redundant-alt.json +0 -12
- package/lib/rules/input-button-name.json +0 -26
- package/lib/rules/input-image-alt.json +0 -20
- package/lib/rules/inserted-into-focus-order-matches.js +0 -7
- package/lib/rules/is-initiator-matches.js +0 -5
- package/lib/rules/label-content-name-mismatch-matches.js +0 -52
- package/lib/rules/label-content-name-mismatch.json +0 -12
- package/lib/rules/label-matches.js +0 -15
- package/lib/rules/label-title-only.json +0 -13
- package/lib/rules/label.json +0 -29
- package/lib/rules/landmark-banner-is-top-level.json +0 -13
- package/lib/rules/landmark-complementary-is-top-level.json +0 -12
- package/lib/rules/landmark-contentinfo-is-top-level.json +0 -13
- package/lib/rules/landmark-has-body-context-matches.js +0 -13
- package/lib/rules/landmark-main-is-top-level.json +0 -12
- package/lib/rules/landmark-no-duplicate-banner.json +0 -12
- package/lib/rules/landmark-no-duplicate-contentinfo.json +0 -12
- package/lib/rules/landmark-no-duplicate-main.json +0 -12
- package/lib/rules/landmark-one-main.json +0 -12
- package/lib/rules/landmark-unique-matches.js +0 -50
- package/lib/rules/landmark-unique.json +0 -13
- package/lib/rules/layout-table-matches.js +0 -8
- package/lib/rules/link-in-text-block-matches.js +0 -21
- package/lib/rules/link-in-text-block.json +0 -14
- package/lib/rules/link-name.json +0 -25
- package/lib/rules/list.json +0 -13
- package/lib/rules/listitem.json +0 -13
- package/lib/rules/marquee.json +0 -13
- package/lib/rules/meta-refresh.json +0 -20
- package/lib/rules/meta-viewport-large.json +0 -14
- package/lib/rules/meta-viewport.json +0 -14
- package/lib/rules/nested-interactive-matches.js +0 -13
- package/lib/rules/nested-interactive.json +0 -12
- package/lib/rules/no-autoplay-audio-matches.js +0 -22
- package/lib/rules/no-autoplay-audio.json +0 -15
- package/lib/rules/no-empty-role-matches.js +0 -13
- package/lib/rules/no-explicit-name-required-matches.js +0 -22
- package/lib/rules/no-naming-method-matches.js +0 -24
- package/lib/rules/no-role-matches.js +0 -5
- package/lib/rules/not-html-matches.js +0 -5
- package/lib/rules/object-alt.json +0 -24
- package/lib/rules/p-as-heading-matches.js +0 -21
- package/lib/rules/p-as-heading.json +0 -13
- package/lib/rules/page-has-heading-one.json +0 -12
- package/lib/rules/presentation-role-conflict-matches.js +0 -7
- package/lib/rules/presentation-role-conflict.json +0 -13
- package/lib/rules/region.json +0 -12
- package/lib/rules/role-img-alt.json +0 -20
- package/lib/rules/scope-attr-valid.json +0 -12
- package/lib/rules/scrollable-region-focusable-matches.js +0 -75
- package/lib/rules/scrollable-region-focusable.json +0 -12
- package/lib/rules/select-name.json +0 -27
- package/lib/rules/server-side-image-map.json +0 -18
- package/lib/rules/skip-link-matches.js +0 -7
- package/lib/rules/skip-link.json +0 -13
- package/lib/rules/svg-img-alt.json +0 -25
- package/lib/rules/svg-namespace-matches.js +0 -18
- package/lib/rules/tabindex.json +0 -12
- package/lib/rules/table-duplicate-name.json +0 -12
- package/lib/rules/table-fake-caption.json +0 -20
- package/lib/rules/td-has-header.json +0 -20
- package/lib/rules/td-headers-attr.json +0 -12
- package/lib/rules/th-has-data-cells.json +0 -13
- package/lib/rules/valid-lang.json +0 -13
- package/lib/rules/video-caption.json +0 -19
- package/lib/rules/window-is-top-matches.js +0 -8
- package/lib/rules/xml-lang-mismatch-matches.js +0 -14
- package/lib/standards/aria-attrs.js +0 -209
- package/lib/standards/aria-roles.js +0 -835
- package/lib/standards/css-colors.js +0 -153
- package/lib/standards/dpub-roles.js +0 -219
- package/lib/standards/graphics-roles.js +0 -22
- package/lib/standards/html-elms.js +0 -933
- package/lib/standards/index.js +0 -37
- package/sri-history.json +0 -274
- package/typings/axe-core/axe-core-tests.js +0 -203
- package/typings/axe-core/axe-core-tests.ts +0 -233
|
@@ -1,143 +0,0 @@
|
|
|
1
|
-
/* eslint no-script-url:0 */
|
|
2
|
-
/**
|
|
3
|
-
* Check if a string contains mostly numbers
|
|
4
|
-
*/
|
|
5
|
-
function isMostlyNumbers(str = '') {
|
|
6
|
-
return (
|
|
7
|
-
str.length !== 0 && (str.match(/[0-9]/g) || '').length >= str.length / 2
|
|
8
|
-
);
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
/**
|
|
12
|
-
* Spit a string into an array with two pieces, at a given index
|
|
13
|
-
* @param String string to split
|
|
14
|
-
* @param Number index at which to split
|
|
15
|
-
* @return Array
|
|
16
|
-
*/
|
|
17
|
-
function splitString(str, splitIndex) {
|
|
18
|
-
return [str.substring(0, splitIndex), str.substring(splitIndex)];
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
function trimRight(str) {
|
|
22
|
-
return str.replace(/\s+$/, '');
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
/**
|
|
26
|
-
* Take a relative or absolute URL and pull it into it's indivisual pieces
|
|
27
|
-
*
|
|
28
|
-
* @param url (string)
|
|
29
|
-
* @return urlPieces
|
|
30
|
-
* .protocol The protocol used, e.g. 'https://'
|
|
31
|
-
* .domain Domain name including sub domains and TLD, e.g. 'docs.deque.com'
|
|
32
|
-
* .port The port number, e.g. ':8080'
|
|
33
|
-
* .path Path after the domain, e.g. '/home.html'
|
|
34
|
-
* .query Query string, e.g. '?user=admin&password=pass'
|
|
35
|
-
* .hash Hash / internal reference, e.g. '#footer'
|
|
36
|
-
*/
|
|
37
|
-
function uriParser(url) {
|
|
38
|
-
const original = url;
|
|
39
|
-
let protocol = '',
|
|
40
|
-
domain = '',
|
|
41
|
-
port = '',
|
|
42
|
-
path = '',
|
|
43
|
-
query = '',
|
|
44
|
-
hash = '';
|
|
45
|
-
if (url.includes('#')) {
|
|
46
|
-
[url, hash] = splitString(url, url.indexOf('#'));
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
if (url.includes('?')) {
|
|
50
|
-
[url, query] = splitString(url, url.indexOf('?'));
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
if (url.includes('://')) {
|
|
54
|
-
[protocol, url] = url.split('://');
|
|
55
|
-
[domain, url] = splitString(url, url.indexOf('/'));
|
|
56
|
-
} else if (url.substr(0, 2) === '//') {
|
|
57
|
-
url = url.substr(2);
|
|
58
|
-
[domain, url] = splitString(url, url.indexOf('/'));
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
if (domain.substr(0, 4) === 'www.') {
|
|
62
|
-
domain = domain.substr(4);
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
if (domain && domain.includes(':')) {
|
|
66
|
-
[domain, port] = splitString(domain, domain.indexOf(':'));
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
path = url; // Whatever is left, must be the path
|
|
70
|
-
return { original, protocol, domain, port, path, query, hash };
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
/**
|
|
74
|
-
* Try to, at the end of the URI, find a string that a user can identify the URI by
|
|
75
|
-
*
|
|
76
|
-
* @param uri The URI to use
|
|
77
|
-
* @param options
|
|
78
|
-
* .currentDomain The current domain name (optional)
|
|
79
|
-
* .maxLength Max length of the returned string (default: 25)
|
|
80
|
-
* @return string A portion at the end of the uri, no longer than maxLength
|
|
81
|
-
*/
|
|
82
|
-
function getFriendlyUriEnd(uri = '', options = {}) {
|
|
83
|
-
if (
|
|
84
|
-
// Skip certain URIs:
|
|
85
|
-
uri.length <= 1 || // very short
|
|
86
|
-
uri.substr(0, 5) === 'data:' || // data URIs are unreadable
|
|
87
|
-
uri.substr(0, 11) === 'javascript:' || // JS isn't a URL
|
|
88
|
-
uri.includes('?') // query strings aren't very readable either
|
|
89
|
-
) {
|
|
90
|
-
return;
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
const { currentDomain, maxLength = 25 } = options;
|
|
94
|
-
const { path, domain, hash } = uriParser(uri);
|
|
95
|
-
// Split the path at the last / that has text after it
|
|
96
|
-
const pathEnd = path.substr(
|
|
97
|
-
path.substr(0, path.length - 2).lastIndexOf('/') + 1
|
|
98
|
-
);
|
|
99
|
-
|
|
100
|
-
if (hash) {
|
|
101
|
-
if (pathEnd && (pathEnd + hash).length <= maxLength) {
|
|
102
|
-
return trimRight(pathEnd + hash);
|
|
103
|
-
} else if (
|
|
104
|
-
pathEnd.length < 2 &&
|
|
105
|
-
hash.length > 2 &&
|
|
106
|
-
hash.length <= maxLength
|
|
107
|
-
) {
|
|
108
|
-
return trimRight(hash);
|
|
109
|
-
} else {
|
|
110
|
-
return;
|
|
111
|
-
}
|
|
112
|
-
} else if (domain && domain.length < maxLength && path.length <= 1) {
|
|
113
|
-
// '' or '/'
|
|
114
|
-
return trimRight(domain + path);
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
// See if the domain should be returned
|
|
118
|
-
if (
|
|
119
|
-
path === '/' + pathEnd &&
|
|
120
|
-
domain &&
|
|
121
|
-
currentDomain &&
|
|
122
|
-
domain !== currentDomain &&
|
|
123
|
-
(domain + path).length <= maxLength
|
|
124
|
-
) {
|
|
125
|
-
return trimRight(domain + path);
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
const lastDotIndex = pathEnd.lastIndexOf('.');
|
|
129
|
-
if (
|
|
130
|
-
// Exclude very short or very long string
|
|
131
|
-
(lastDotIndex === -1 || lastDotIndex > 1) &&
|
|
132
|
-
(lastDotIndex !== -1 || pathEnd.length > 2) &&
|
|
133
|
-
pathEnd.length <= maxLength &&
|
|
134
|
-
// Exclude index files
|
|
135
|
-
!pathEnd.match(/index(\.[a-zA-Z]{2-4})?/) &&
|
|
136
|
-
// Exclude files that are likely to be database IDs
|
|
137
|
-
!isMostlyNumbers(pathEnd)
|
|
138
|
-
) {
|
|
139
|
-
return trimRight(pathEnd);
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
export default getFriendlyUriEnd;
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Return the list of attributes of a node.
|
|
3
|
-
* @method getNodeAttributes
|
|
4
|
-
* @memberof axe.utils
|
|
5
|
-
* @param {Element} node
|
|
6
|
-
* @deprecated
|
|
7
|
-
* @returns {NamedNodeMap}
|
|
8
|
-
*/
|
|
9
|
-
function getNodeAttributes(node) {
|
|
10
|
-
// eslint-disable-next-line no-restricted-syntax
|
|
11
|
-
if (node.attributes instanceof window.NamedNodeMap) {
|
|
12
|
-
// eslint-disable-next-line no-restricted-syntax
|
|
13
|
-
return node.attributes;
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
// if the attributes property is not of type NamedNodeMap then the DOM
|
|
17
|
-
// has been clobbered. E.g. <form><input name="attributes"></form>.
|
|
18
|
-
// We can clone the node to isolate it and then return the attributes
|
|
19
|
-
return node.cloneNode(false).attributes;
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
export default getNodeAttributes;
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
import cache from '../base/cache';
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Return a single node from the virtual dom tree
|
|
5
|
-
*
|
|
6
|
-
* @param {Object} vNode The flattened, virtual DOM tree
|
|
7
|
-
* @param {Node} node The HTML DOM node
|
|
8
|
-
*/
|
|
9
|
-
function getNodeFromTree(vNode, node) {
|
|
10
|
-
const el = node || vNode;
|
|
11
|
-
return cache.get('nodeMap') ? cache.get('nodeMap').get(el) : null;
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
export default getNodeFromTree;
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Return the document or document fragment (shadow DOM)
|
|
3
|
-
* @method getRootNode
|
|
4
|
-
* @memberof axe.utils
|
|
5
|
-
* @param {Element} node
|
|
6
|
-
* @returns {DocumentFragment|Document}
|
|
7
|
-
*/
|
|
8
|
-
function getRootNode(node) {
|
|
9
|
-
var doc = (node.getRootNode && node.getRootNode()) || document; // this is for backwards compatibility
|
|
10
|
-
if (doc === node) {
|
|
11
|
-
// disconnected node
|
|
12
|
-
doc = document;
|
|
13
|
-
}
|
|
14
|
-
return doc;
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
export default getRootNode;
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Get an axe rule by id.
|
|
3
|
-
* @param {String} ruelId the rule id
|
|
4
|
-
* @return {Rule}
|
|
5
|
-
*/
|
|
6
|
-
function getRule(ruleId) {
|
|
7
|
-
// TODO: es-modules_audit
|
|
8
|
-
var rule = axe._audit.rules.find(rule => rule.id === ruleId);
|
|
9
|
-
|
|
10
|
-
if (!rule) {
|
|
11
|
-
throw new Error(`Cannot find rule by id: ${ruleId}`);
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
return rule;
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
export default getRule;
|
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
import getScroll from './get-scroll';
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Create an array scroll positions from descending elements
|
|
5
|
-
*/
|
|
6
|
-
function getElmScrollRecursive(root) {
|
|
7
|
-
// Need to also get .childNodes since SVGs in IE don't have .children.
|
|
8
|
-
return Array.from(root.children || root.childNodes || []).reduce(
|
|
9
|
-
(scrolls, elm) => {
|
|
10
|
-
const scroll = getScroll(elm);
|
|
11
|
-
if (scroll) {
|
|
12
|
-
scrolls.push(scroll);
|
|
13
|
-
}
|
|
14
|
-
return scrolls.concat(getElmScrollRecursive(elm));
|
|
15
|
-
},
|
|
16
|
-
[]
|
|
17
|
-
);
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
/**
|
|
21
|
-
* Get the scroll position of all scrollable elements in a page
|
|
22
|
-
* @deprecated
|
|
23
|
-
*/
|
|
24
|
-
function getScrollState(win = window) {
|
|
25
|
-
const root = win.document.documentElement;
|
|
26
|
-
const windowScroll = [
|
|
27
|
-
win.pageXOffset !== undefined
|
|
28
|
-
? {
|
|
29
|
-
elm: win,
|
|
30
|
-
top: win.pageYOffset,
|
|
31
|
-
left: win.pageXOffset
|
|
32
|
-
}
|
|
33
|
-
: {
|
|
34
|
-
elm: root,
|
|
35
|
-
top: root.scrollTop,
|
|
36
|
-
left: root.scrollLeft
|
|
37
|
-
}
|
|
38
|
-
];
|
|
39
|
-
|
|
40
|
-
return windowScroll.concat(getElmScrollRecursive(document.body));
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
export default getScrollState;
|
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Get the scroll position of given element
|
|
3
|
-
* @method getScroll
|
|
4
|
-
* @memberof axe.utils
|
|
5
|
-
* @param {Element} node
|
|
6
|
-
* @param {buffer} (Optional) allowed negligence in overflow
|
|
7
|
-
* @returns {Object | undefined}
|
|
8
|
-
*/
|
|
9
|
-
function getScroll(elm, buffer = 0) {
|
|
10
|
-
const overflowX = elm.scrollWidth > elm.clientWidth + buffer;
|
|
11
|
-
const overflowY = elm.scrollHeight > elm.clientHeight + buffer;
|
|
12
|
-
|
|
13
|
-
/**
|
|
14
|
-
* if there is neither `overflow-x` or `overflow-y`
|
|
15
|
-
* -> return
|
|
16
|
-
*/
|
|
17
|
-
if (!(overflowX || overflowY)) {
|
|
18
|
-
return;
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
const style = window.getComputedStyle(elm);
|
|
22
|
-
const overflowXStyle = style.getPropertyValue('overflow-x');
|
|
23
|
-
const overflowYStyle = style.getPropertyValue('overflow-y');
|
|
24
|
-
const scrollableX =
|
|
25
|
-
overflowXStyle !== 'visible' && overflowXStyle !== 'hidden';
|
|
26
|
-
const scrollableY =
|
|
27
|
-
overflowYStyle !== 'visible' && overflowYStyle !== 'hidden';
|
|
28
|
-
|
|
29
|
-
/**
|
|
30
|
-
* check direction of `overflow` and `scrollable`
|
|
31
|
-
*/
|
|
32
|
-
if ((overflowX && scrollableX) || (overflowY && scrollableY)) {
|
|
33
|
-
return {
|
|
34
|
-
elm,
|
|
35
|
-
top: elm.scrollTop,
|
|
36
|
-
left: elm.scrollLeft
|
|
37
|
-
};
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
export default getScroll;
|
|
@@ -1,395 +0,0 @@
|
|
|
1
|
-
import escapeSelector from './escape-selector';
|
|
2
|
-
import getFriendlyUriEnd from './get-friendly-uri-end';
|
|
3
|
-
import getNodeAttributes from './get-node-attributes';
|
|
4
|
-
import matchesSelector from './element-matches';
|
|
5
|
-
import isXHTML from './is-xhtml';
|
|
6
|
-
import getShadowSelector from './get-shadow-selector';
|
|
7
|
-
|
|
8
|
-
let xhtml;
|
|
9
|
-
const ignoredAttributes = [
|
|
10
|
-
'class',
|
|
11
|
-
'style',
|
|
12
|
-
'id',
|
|
13
|
-
'selected',
|
|
14
|
-
'checked',
|
|
15
|
-
'disabled',
|
|
16
|
-
'tabindex',
|
|
17
|
-
'aria-checked',
|
|
18
|
-
'aria-selected',
|
|
19
|
-
'aria-invalid',
|
|
20
|
-
'aria-activedescendant',
|
|
21
|
-
'aria-busy',
|
|
22
|
-
'aria-disabled',
|
|
23
|
-
'aria-expanded',
|
|
24
|
-
'aria-grabbed',
|
|
25
|
-
'aria-pressed',
|
|
26
|
-
'aria-valuenow'
|
|
27
|
-
];
|
|
28
|
-
const MAXATTRIBUTELENGTH = 31;
|
|
29
|
-
|
|
30
|
-
/**
|
|
31
|
-
* get the attribute name and value as a string
|
|
32
|
-
* @param {Element} node The element that has the attribute
|
|
33
|
-
* @param {Attribute} at The attribute
|
|
34
|
-
* @return {String}
|
|
35
|
-
*/
|
|
36
|
-
function getAttributeNameValue(node, at) {
|
|
37
|
-
const name = at.name;
|
|
38
|
-
let atnv;
|
|
39
|
-
|
|
40
|
-
if (name.indexOf('href') !== -1 || name.indexOf('src') !== -1) {
|
|
41
|
-
const friendly = getFriendlyUriEnd(node.getAttribute(name));
|
|
42
|
-
if (friendly) {
|
|
43
|
-
const value = encodeURI(friendly);
|
|
44
|
-
if (value) {
|
|
45
|
-
atnv = escapeSelector(at.name) + '$="' + escapeSelector(value) + '"';
|
|
46
|
-
} else {
|
|
47
|
-
return;
|
|
48
|
-
}
|
|
49
|
-
} else {
|
|
50
|
-
atnv =
|
|
51
|
-
escapeSelector(at.name) +
|
|
52
|
-
'="' +
|
|
53
|
-
escapeSelector(node.getAttribute(name)) +
|
|
54
|
-
'"';
|
|
55
|
-
}
|
|
56
|
-
} else {
|
|
57
|
-
atnv = escapeSelector(name) + '="' + escapeSelector(at.value) + '"';
|
|
58
|
-
}
|
|
59
|
-
return atnv;
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
function countSort(a, b) {
|
|
63
|
-
return a.count < b.count ? -1 : a.count === b.count ? 0 : 1;
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
/**
|
|
67
|
-
* Filter the attributes
|
|
68
|
-
* @param {Attribute} The potential attribute
|
|
69
|
-
* @return {Boolean} Whether to include or exclude
|
|
70
|
-
*/
|
|
71
|
-
function filterAttributes(at) {
|
|
72
|
-
return (
|
|
73
|
-
!ignoredAttributes.includes(at.name) &&
|
|
74
|
-
at.name.indexOf(':') === -1 &&
|
|
75
|
-
(!at.value || at.value.length < MAXATTRIBUTELENGTH)
|
|
76
|
-
);
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
/**
|
|
80
|
-
* Calculate the statistics for the classes, attributes and tags on the page, using
|
|
81
|
-
* the virtual DOM tree
|
|
82
|
-
* @param {Object} domTree The root node of the virtual DOM tree
|
|
83
|
-
* @returns {Object} The statistics consisting of three maps, one for classes,
|
|
84
|
-
* one for tags and one for attributes. The map values are
|
|
85
|
-
* the counts for how many elements with that feature exist
|
|
86
|
-
*/
|
|
87
|
-
export function getSelectorData(domTree) {
|
|
88
|
-
/* eslint no-loop-func:0*/
|
|
89
|
-
|
|
90
|
-
// Initialize the return structure with the three maps
|
|
91
|
-
const data = {
|
|
92
|
-
classes: {},
|
|
93
|
-
tags: {},
|
|
94
|
-
attributes: {}
|
|
95
|
-
};
|
|
96
|
-
|
|
97
|
-
domTree = Array.isArray(domTree) ? domTree : [domTree];
|
|
98
|
-
let currentLevel = domTree.slice();
|
|
99
|
-
const stack = [];
|
|
100
|
-
while (currentLevel.length) {
|
|
101
|
-
const current = currentLevel.pop();
|
|
102
|
-
const node = current.actualNode;
|
|
103
|
-
|
|
104
|
-
if (!!node.querySelectorAll) {
|
|
105
|
-
// ignore #text nodes
|
|
106
|
-
|
|
107
|
-
// count the tag
|
|
108
|
-
const tag = node.nodeName;
|
|
109
|
-
if (data.tags[tag]) {
|
|
110
|
-
data.tags[tag]++;
|
|
111
|
-
} else {
|
|
112
|
-
data.tags[tag] = 1;
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
// count all the classes
|
|
116
|
-
if (node.classList) {
|
|
117
|
-
Array.from(node.classList).forEach(cl => {
|
|
118
|
-
const ind = escapeSelector(cl);
|
|
119
|
-
if (data.classes[ind]) {
|
|
120
|
-
data.classes[ind]++;
|
|
121
|
-
} else {
|
|
122
|
-
data.classes[ind] = 1;
|
|
123
|
-
}
|
|
124
|
-
});
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
// count all the filtered attributes
|
|
128
|
-
if (node.hasAttributes()) {
|
|
129
|
-
Array.from(getNodeAttributes(node))
|
|
130
|
-
.filter(filterAttributes)
|
|
131
|
-
.forEach(at => {
|
|
132
|
-
const atnv = getAttributeNameValue(node, at);
|
|
133
|
-
if (atnv) {
|
|
134
|
-
if (data.attributes[atnv]) {
|
|
135
|
-
data.attributes[atnv]++;
|
|
136
|
-
} else {
|
|
137
|
-
data.attributes[atnv] = 1;
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
});
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
|
-
if (current.children.length) {
|
|
144
|
-
// "recurse"
|
|
145
|
-
stack.push(currentLevel);
|
|
146
|
-
currentLevel = current.children.slice();
|
|
147
|
-
}
|
|
148
|
-
while (!currentLevel.length && stack.length) {
|
|
149
|
-
currentLevel = stack.pop();
|
|
150
|
-
}
|
|
151
|
-
}
|
|
152
|
-
return data;
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
/**
|
|
156
|
-
* Given a node and the statistics on class frequency on the page,
|
|
157
|
-
* return all its uncommon class data sorted in order of decreasing uniqueness
|
|
158
|
-
* @param {Element} node The node
|
|
159
|
-
* @param {Object} classData The map of classes to counts
|
|
160
|
-
* @return {Array} The sorted array of uncommon class data
|
|
161
|
-
*/
|
|
162
|
-
function uncommonClasses(node, selectorData) {
|
|
163
|
-
// eslint no-loop-func:false
|
|
164
|
-
const retVal = [];
|
|
165
|
-
const classData = selectorData.classes;
|
|
166
|
-
const tagData = selectorData.tags;
|
|
167
|
-
|
|
168
|
-
if (node.classList) {
|
|
169
|
-
Array.from(node.classList).forEach(cl => {
|
|
170
|
-
const ind = escapeSelector(cl);
|
|
171
|
-
if (classData[ind] < tagData[node.nodeName]) {
|
|
172
|
-
retVal.push({
|
|
173
|
-
name: ind,
|
|
174
|
-
count: classData[ind],
|
|
175
|
-
species: 'class'
|
|
176
|
-
});
|
|
177
|
-
}
|
|
178
|
-
});
|
|
179
|
-
}
|
|
180
|
-
return retVal.sort(countSort);
|
|
181
|
-
}
|
|
182
|
-
|
|
183
|
-
/**
|
|
184
|
-
* Given an element and a selector that finds that element (but possibly other sibling elements)
|
|
185
|
-
* return the :nth-child(n) pseudo selector that uniquely finds the node within its siblings
|
|
186
|
-
* @param {Element} elm The Element
|
|
187
|
-
* @param {String} selector The selector
|
|
188
|
-
* @return {String} The nth-child selector
|
|
189
|
-
*/
|
|
190
|
-
function getNthChildString(elm, selector) {
|
|
191
|
-
const siblings =
|
|
192
|
-
(elm.parentNode && Array.from(elm.parentNode.children || '')) || [];
|
|
193
|
-
const hasMatchingSiblings = siblings.find(
|
|
194
|
-
sibling => sibling !== elm && matchesSelector(sibling, selector)
|
|
195
|
-
);
|
|
196
|
-
if (hasMatchingSiblings) {
|
|
197
|
-
const nthChild = 1 + siblings.indexOf(elm);
|
|
198
|
-
return ':nth-child(' + nthChild + ')';
|
|
199
|
-
} else {
|
|
200
|
-
return '';
|
|
201
|
-
}
|
|
202
|
-
}
|
|
203
|
-
|
|
204
|
-
/**
|
|
205
|
-
* Get ID selector
|
|
206
|
-
*/
|
|
207
|
-
function getElmId(elm) {
|
|
208
|
-
if (!elm.getAttribute('id')) {
|
|
209
|
-
return;
|
|
210
|
-
}
|
|
211
|
-
const doc = (elm.getRootNode && elm.getRootNode()) || document;
|
|
212
|
-
const id = '#' + escapeSelector(elm.getAttribute('id') || '');
|
|
213
|
-
if (
|
|
214
|
-
// Don't include youtube's uid values, they change on reload
|
|
215
|
-
!id.match(/player_uid_/) &&
|
|
216
|
-
// Don't include IDs that occur more then once on the page
|
|
217
|
-
doc.querySelectorAll(id).length === 1
|
|
218
|
-
) {
|
|
219
|
-
return id;
|
|
220
|
-
}
|
|
221
|
-
}
|
|
222
|
-
|
|
223
|
-
/**
|
|
224
|
-
* Return the base CSS selector for a given element
|
|
225
|
-
* @param {HTMLElement} elm The element to get the selector for
|
|
226
|
-
* @return {String|Array<String>} Base CSS selector for the node
|
|
227
|
-
*/
|
|
228
|
-
function getBaseSelector(elm) {
|
|
229
|
-
if (typeof xhtml === 'undefined') {
|
|
230
|
-
xhtml = isXHTML(document);
|
|
231
|
-
}
|
|
232
|
-
return escapeSelector(xhtml ? elm.localName : elm.nodeName.toLowerCase());
|
|
233
|
-
}
|
|
234
|
-
|
|
235
|
-
/**
|
|
236
|
-
* Given a node and the statistics on attribute frequency on the page,
|
|
237
|
-
* return all its uncommon attribute data sorted in order of decreasing uniqueness
|
|
238
|
-
* @param {Element} node The node
|
|
239
|
-
* @param {Object} attData The map of attributes to counts
|
|
240
|
-
* @return {Array} The sorted array of uncommon attribute data
|
|
241
|
-
*/
|
|
242
|
-
function uncommonAttributes(node, selectorData) {
|
|
243
|
-
const retVal = [];
|
|
244
|
-
const attData = selectorData.attributes;
|
|
245
|
-
const tagData = selectorData.tags;
|
|
246
|
-
|
|
247
|
-
if (node.hasAttributes()) {
|
|
248
|
-
Array.from(getNodeAttributes(node))
|
|
249
|
-
.filter(filterAttributes)
|
|
250
|
-
.forEach(at => {
|
|
251
|
-
const atnv = getAttributeNameValue(node, at);
|
|
252
|
-
|
|
253
|
-
if (atnv && attData[atnv] < tagData[node.nodeName]) {
|
|
254
|
-
retVal.push({
|
|
255
|
-
name: atnv,
|
|
256
|
-
count: attData[atnv],
|
|
257
|
-
species: 'attribute'
|
|
258
|
-
});
|
|
259
|
-
}
|
|
260
|
-
});
|
|
261
|
-
}
|
|
262
|
-
return retVal.sort(countSort);
|
|
263
|
-
}
|
|
264
|
-
|
|
265
|
-
/**
|
|
266
|
-
* generates a selector fragment for an element based on the statistics of the page in
|
|
267
|
-
* which the element exists. This function takes into account the fact that selectors that
|
|
268
|
-
* use classes and tags are much faster than universal selectors. It also tries to use a
|
|
269
|
-
* unique class selector before a unique attribute selector (with the tag), followed by
|
|
270
|
-
* a selector made up of the three least common features statistically. A feature will
|
|
271
|
-
* also only be used if it is less common than the tag of the element itself.
|
|
272
|
-
*
|
|
273
|
-
* @param {Element} elm The element for which to generate a selector
|
|
274
|
-
* @param {Object} options Options for how to generate the selector
|
|
275
|
-
* @param {RootNode} doc The root node of the document or document fragment
|
|
276
|
-
* @returns {String} The selector
|
|
277
|
-
*/
|
|
278
|
-
|
|
279
|
-
function getThreeLeastCommonFeatures(elm, selectorData) {
|
|
280
|
-
let selector = '';
|
|
281
|
-
let features;
|
|
282
|
-
const clss = uncommonClasses(elm, selectorData);
|
|
283
|
-
const atts = uncommonAttributes(elm, selectorData);
|
|
284
|
-
|
|
285
|
-
if (clss.length && clss[0].count === 1) {
|
|
286
|
-
// only use the unique class
|
|
287
|
-
features = [clss[0]];
|
|
288
|
-
} else if (atts.length && atts[0].count === 1) {
|
|
289
|
-
// only use the unique attribute value
|
|
290
|
-
features = [atts[0]];
|
|
291
|
-
// if no class, add the tag
|
|
292
|
-
selector = getBaseSelector(elm);
|
|
293
|
-
} else {
|
|
294
|
-
features = clss.concat(atts);
|
|
295
|
-
// sort by least common
|
|
296
|
-
features.sort(countSort);
|
|
297
|
-
|
|
298
|
-
// select three least common features
|
|
299
|
-
features = features.slice(0, 3);
|
|
300
|
-
|
|
301
|
-
// if no class, add the tag
|
|
302
|
-
if (
|
|
303
|
-
!features.some(feat => {
|
|
304
|
-
return feat.species === 'class';
|
|
305
|
-
})
|
|
306
|
-
) {
|
|
307
|
-
// has no class
|
|
308
|
-
selector = getBaseSelector(elm);
|
|
309
|
-
} else {
|
|
310
|
-
// put the classes at the front of the selector
|
|
311
|
-
features.sort((a, b) => {
|
|
312
|
-
return a.species !== b.species && a.species === 'class'
|
|
313
|
-
? -1
|
|
314
|
-
: a.species === b.species
|
|
315
|
-
? 0
|
|
316
|
-
: 1;
|
|
317
|
-
});
|
|
318
|
-
}
|
|
319
|
-
}
|
|
320
|
-
|
|
321
|
-
// construct the return value
|
|
322
|
-
return (selector += features.reduce((val, feat) => {
|
|
323
|
-
/*eslint indent: 0*/
|
|
324
|
-
switch (feat.species) {
|
|
325
|
-
case 'class':
|
|
326
|
-
return val + '.' + feat.name;
|
|
327
|
-
case 'attribute':
|
|
328
|
-
return val + '[' + feat.name + ']';
|
|
329
|
-
}
|
|
330
|
-
return val; // should never happen
|
|
331
|
-
}, ''));
|
|
332
|
-
}
|
|
333
|
-
|
|
334
|
-
/**
|
|
335
|
-
* generates a single selector for an element
|
|
336
|
-
* @param {Element} elm The element for which to generate a selector
|
|
337
|
-
* @param {Object} options Options for how to generate the selector
|
|
338
|
-
* @param {RootNode} doc The root node of the document or document fragment
|
|
339
|
-
* @returns {String} The selector
|
|
340
|
-
*/
|
|
341
|
-
|
|
342
|
-
function generateSelector(elm, options, doc) {
|
|
343
|
-
/*eslint no-loop-func:0*/
|
|
344
|
-
// TODO: es-modules_selectorData
|
|
345
|
-
if (!axe._selectorData) {
|
|
346
|
-
throw new Error('Expect axe._selectorData to be set up');
|
|
347
|
-
}
|
|
348
|
-
const { toRoot = false } = options;
|
|
349
|
-
let selector;
|
|
350
|
-
let similar;
|
|
351
|
-
|
|
352
|
-
/**
|
|
353
|
-
* Try to find a unique selector by filtering out all the clashing
|
|
354
|
-
* nodes by adding ancestor selectors iteratively.
|
|
355
|
-
* This loop is much faster than recursing and using querySelectorAll
|
|
356
|
-
*/
|
|
357
|
-
do {
|
|
358
|
-
let features = getElmId(elm);
|
|
359
|
-
if (!features) {
|
|
360
|
-
features = getThreeLeastCommonFeatures(elm, axe._selectorData);
|
|
361
|
-
features += getNthChildString(elm, features);
|
|
362
|
-
}
|
|
363
|
-
if (selector) {
|
|
364
|
-
selector = features + ' > ' + selector;
|
|
365
|
-
} else {
|
|
366
|
-
selector = features;
|
|
367
|
-
}
|
|
368
|
-
if (!similar) {
|
|
369
|
-
similar = Array.from(doc.querySelectorAll(selector));
|
|
370
|
-
} else {
|
|
371
|
-
similar = similar.filter(item => {
|
|
372
|
-
return matchesSelector(item, selector);
|
|
373
|
-
});
|
|
374
|
-
}
|
|
375
|
-
elm = elm.parentElement;
|
|
376
|
-
} while ((similar.length > 1 || toRoot) && elm && elm.nodeType !== 11);
|
|
377
|
-
|
|
378
|
-
if (similar.length === 1) {
|
|
379
|
-
return selector;
|
|
380
|
-
} else if (selector.indexOf(' > ') !== -1) {
|
|
381
|
-
// For the odd case that document doesn't have a unique selector
|
|
382
|
-
return ':root' + selector.substring(selector.indexOf(' > '));
|
|
383
|
-
}
|
|
384
|
-
return ':root';
|
|
385
|
-
}
|
|
386
|
-
|
|
387
|
-
/**
|
|
388
|
-
* Gets a unique CSS selector
|
|
389
|
-
* @param {HTMLElement} node The element to get the selector for
|
|
390
|
-
* @param {Object} optional options
|
|
391
|
-
* @returns {String|Array<String>} Unique CSS selector for the node
|
|
392
|
-
*/
|
|
393
|
-
export default function getSelector(elm, options) {
|
|
394
|
-
return getShadowSelector(generateSelector, elm, options);
|
|
395
|
-
}
|