Repository: dequelabs/axe-core Branch: develop Commit: 3af1fb77a538 Files: 1977 Total size: 5.9 MB Directory structure: gitextract_cjgil3o8/ ├── .babelrc ├── .editorconfig ├── .gitattributes ├── .github/ │ ├── CODEOWNERS │ ├── ISSUE_TEMPLATE/ │ │ ├── config.yml │ │ ├── documentation.yml │ │ ├── feature-request.yml │ │ ├── possible-bug.yml │ │ └── question.yaml │ ├── PULL_REQUEST_TEMPLATE.md │ ├── actions/ │ │ └── install-deps/ │ │ └── action.yml │ ├── axe-linter.yml │ ├── bin/ │ │ ├── determine-version.sh │ │ ├── validate-npm-deploy.sh │ │ ├── validate-package.mjs │ │ ├── wait-for-npm-ready.sh │ │ └── wait-for-workflow-success.sh │ ├── dependabot.yml │ ├── review.yml │ └── workflows/ │ ├── deploy.yml │ ├── format.yml │ ├── label-extension-linter-issues.yml │ ├── nightly-tests.yml │ ├── release.yml │ ├── semantic-pr-title.yml │ ├── sync-master-develop.yml │ ├── test.yml │ └── update-generated-files.yaml ├── .gitignore ├── .husky/ │ └── pre-commit ├── .jsdoc.json ├── .npmrc ├── .nvmrc ├── .prettierignore ├── .prettierrc.json ├── .vscode/ │ ├── extensions.json │ └── launch.json ├── CHANGELOG.md ├── CLAUDE.md ├── CONTRIBUTING.md ├── Gruntfile.js ├── LICENSE ├── LICENSE-3RD-PARTY.txt ├── README.md ├── SECURITY.md ├── axe-linter.yml ├── axe.d.ts ├── bower.json ├── build/ │ ├── build-manual.js │ ├── check-node-version.js │ ├── cherry-pick.js │ ├── configure.js │ ├── rule-generator/ │ │ ├── directories.js │ │ ├── get-answers.js │ │ ├── get-files-metadata.js │ │ └── questions.js │ ├── rule-generator.js │ ├── shared/ │ │ ├── create-file.js │ │ └── format.js │ ├── sri-update.js │ ├── tasks/ │ │ ├── add-locale.js │ │ ├── aria-supported.js │ │ ├── configure.js │ │ ├── esbuild.js │ │ ├── langs.js │ │ ├── metadata-function-map.js │ │ ├── notify.js │ │ ├── test.js │ │ ├── update-help.js │ │ └── validate.js │ └── templates.js ├── code-of-conduct.md ├── doc/ │ ├── API.md │ ├── accessibility-supported.md │ ├── act-rules-format.md │ ├── aria-supported.md │ ├── backwards-compatibility-doc.md │ ├── check-message-template.md │ ├── check-options.md │ ├── code-submission-guidelines.md │ ├── context.md │ ├── developer-guide.md │ ├── examples/ │ │ ├── chrome-debugging-protocol/ │ │ │ ├── README.md │ │ │ ├── axe-cdp.js │ │ │ └── package.json │ │ ├── code-patterns.md │ │ ├── html-handlebars.md │ │ ├── jasmine/ │ │ │ ├── README.md │ │ │ ├── karma.conf.js │ │ │ ├── package.json │ │ │ └── spec/ │ │ │ └── a11y.js │ │ ├── jest_react/ │ │ │ ├── .babelrc │ │ │ ├── README.md │ │ │ ├── link.js │ │ │ ├── link.test.js │ │ │ └── package.json │ │ ├── jsdom/ │ │ │ ├── package.json │ │ │ └── test/ │ │ │ └── a11y.js │ │ ├── mocha/ │ │ │ ├── README.md │ │ │ ├── karma.conf.js │ │ │ ├── package.json │ │ │ └── test/ │ │ │ └── a11y.js │ │ ├── pr-review-patterns.md │ │ ├── puppeteer/ │ │ │ ├── README.md │ │ │ ├── axe-puppeteer.js │ │ │ ├── package.json │ │ │ └── set-content.js │ │ ├── qunit/ │ │ │ ├── Gruntfile.js │ │ │ ├── README.md │ │ │ ├── package.json │ │ │ └── test/ │ │ │ ├── a11y.js │ │ │ └── test.html │ │ ├── rule-check-templates.md │ │ ├── test-examples.js │ │ └── test-patterns.md │ ├── frame-messenger.md │ ├── issue_impact.md │ ├── plugins.md │ ├── projects.md │ ├── pull-request-checklist.md │ ├── release-and-support.md │ ├── rule-descriptions.md │ ├── rule-development.md │ ├── rule-proposal.md │ ├── run-partial.md │ └── standards-object.md ├── eslint.config.js ├── lib/ │ ├── checks/ │ │ ├── aria/ │ │ │ ├── abstractrole-evaluate.js │ │ │ ├── abstractrole.json │ │ │ ├── aria-allowed-attr-evaluate.js │ │ │ ├── aria-allowed-attr.json │ │ │ ├── aria-allowed-role-evaluate.js │ │ │ ├── aria-allowed-role.json │ │ │ ├── aria-busy-evaluate.js │ │ │ ├── aria-busy.json │ │ │ ├── aria-conditional-attr-evaluate.js │ │ │ ├── aria-conditional-attr.json │ │ │ ├── aria-conditional-checkbox-attr-evaluate.js │ │ │ ├── aria-conditional-row-attr-evaluate.js │ │ │ ├── aria-errormessage-evaluate.js │ │ │ ├── aria-errormessage.json │ │ │ ├── aria-hidden-body-evaluate.js │ │ │ ├── aria-hidden-body.json │ │ │ ├── aria-level-evaluate.js │ │ │ ├── aria-level.json │ │ │ ├── aria-prohibited-attr-evaluate.js │ │ │ ├── aria-prohibited-attr.json │ │ │ ├── aria-required-attr-evaluate.js │ │ │ ├── aria-required-attr.json │ │ │ ├── aria-required-children-evaluate.js │ │ │ ├── aria-required-children.json │ │ │ ├── aria-required-parent-evaluate.js │ │ │ ├── aria-required-parent.json │ │ │ ├── aria-roledescription-evaluate.js │ │ │ ├── aria-roledescription.json │ │ │ ├── aria-unsupported-attr-evaluate.js │ │ │ ├── aria-unsupported-attr.json │ │ │ ├── aria-valid-attr-evaluate.js │ │ │ ├── aria-valid-attr-value-evaluate.js │ │ │ ├── aria-valid-attr-value.json │ │ │ ├── aria-valid-attr.json │ │ │ ├── braille-label-equivalent-evaluate.js │ │ │ ├── braille-label-equivalent.json │ │ │ ├── braille-roledescription-equivalent-evaluate.js │ │ │ ├── braille-roledescription-equivalent.json │ │ │ ├── deprecatedrole-evaluate.js │ │ │ ├── deprecatedrole.json │ │ │ ├── fallbackrole-evaluate.js │ │ │ ├── fallbackrole.json │ │ │ ├── has-global-aria-attribute-evaluate.js │ │ │ ├── has-global-aria-attribute.json │ │ │ ├── has-widget-role-evaluate.js │ │ │ ├── has-widget-role.json │ │ │ ├── invalidrole-evaluate.js │ │ │ ├── invalidrole.json │ │ │ ├── is-element-focusable-evaluate.js │ │ │ ├── is-element-focusable.json │ │ │ ├── no-implicit-explicit-label-evaluate.js │ │ │ ├── no-implicit-explicit-label.json │ │ │ ├── unsupportedrole-evaluate.js │ │ │ ├── unsupportedrole.json │ │ │ ├── valid-scrollable-semantics-evaluate.js │ │ │ └── valid-scrollable-semantics.json │ │ ├── color/ │ │ │ ├── color-contrast-enhanced.json │ │ │ ├── color-contrast-evaluate.js │ │ │ ├── color-contrast.json │ │ │ ├── link-in-text-block-evaluate.js │ │ │ ├── link-in-text-block-style-evaluate.js │ │ │ ├── link-in-text-block-style.json │ │ │ └── link-in-text-block.json │ │ ├── forms/ │ │ │ ├── autocomplete-appropriate-evaluate.js │ │ │ ├── autocomplete-appropriate.json │ │ │ ├── autocomplete-valid-evaluate.js │ │ │ └── autocomplete-valid.json │ │ ├── generic/ │ │ │ ├── README.md │ │ │ ├── attr-non-space-content-evaluate.js │ │ │ ├── has-descendant-after.js │ │ │ ├── has-descendant-evaluate.js │ │ │ ├── has-text-content-evaluate.js │ │ │ ├── matches-definition-evaluate.js │ │ │ ├── page-no-duplicate-after.js │ │ │ └── page-no-duplicate-evaluate.js │ │ ├── index.js │ │ ├── keyboard/ │ │ │ ├── accesskeys-after.js │ │ │ ├── accesskeys-evaluate.js │ │ │ ├── accesskeys.json │ │ │ ├── focusable-content-evaluate.js │ │ │ ├── focusable-content.json │ │ │ ├── focusable-disabled-evaluate.js │ │ │ ├── focusable-disabled.json │ │ │ ├── focusable-element-evaluate.js │ │ │ ├── focusable-element.json │ │ │ ├── focusable-modal-open-evaluate.js │ │ │ ├── focusable-modal-open.json │ │ │ ├── focusable-no-name-evaluate.js │ │ │ ├── focusable-no-name.json │ │ │ ├── focusable-not-tabbable-evaluate.js │ │ │ ├── focusable-not-tabbable.json │ │ │ ├── frame-focusable-content-evaluate.js │ │ │ ├── frame-focusable-content.json │ │ │ ├── landmark-is-top-level-evaluate.js │ │ │ ├── landmark-is-top-level.json │ │ │ ├── no-focusable-content-evaluate.js │ │ │ ├── no-focusable-content.json │ │ │ ├── page-has-heading-one.json │ │ │ ├── page-has-main.json │ │ │ ├── page-no-duplicate-banner.json │ │ │ ├── page-no-duplicate-contentinfo.json │ │ │ ├── page-no-duplicate-main.json │ │ │ ├── tabindex-evaluate.js │ │ │ └── tabindex.json │ │ ├── label/ │ │ │ ├── alt-space-value-evaluate.js │ │ │ ├── alt-space-value.json │ │ │ ├── duplicate-img-label-evaluate.js │ │ │ ├── duplicate-img-label.json │ │ │ ├── explicit-evaluate.js │ │ │ ├── explicit.json │ │ │ ├── help-same-as-label-evaluate.js │ │ │ ├── help-same-as-label.json │ │ │ ├── hidden-explicit-label-evaluate.js │ │ │ ├── hidden-explicit-label.json │ │ │ ├── implicit-evaluate.js │ │ │ ├── implicit.json │ │ │ ├── label-content-name-mismatch-evaluate.js │ │ │ ├── label-content-name-mismatch.json │ │ │ ├── multiple-label-evaluate.js │ │ │ ├── multiple-label.json │ │ │ ├── title-only-evaluate.js │ │ │ └── title-only.json │ │ ├── landmarks/ │ │ │ ├── landmark-is-unique-after.js │ │ │ ├── landmark-is-unique-evaluate.js │ │ │ └── landmark-is-unique.json │ │ ├── language/ │ │ │ ├── has-lang-evaluate.js │ │ │ ├── has-lang.json │ │ │ ├── valid-lang-evaluate.js │ │ │ ├── valid-lang.json │ │ │ ├── xml-lang-mismatch-evaluate.js │ │ │ └── xml-lang-mismatch.json │ │ ├── lists/ │ │ │ ├── dlitem-evaluate.js │ │ │ ├── dlitem.json │ │ │ ├── invalid-children-evaluate.js │ │ │ ├── listitem-evaluate.js │ │ │ ├── listitem.json │ │ │ ├── only-dlitems-evaluate.js │ │ │ ├── only-dlitems.json │ │ │ ├── only-listitems-evaluate.js │ │ │ ├── only-listitems.json │ │ │ ├── structured-dlitems-evaluate.js │ │ │ └── structured-dlitems.json │ │ ├── media/ │ │ │ ├── caption-evaluate.js │ │ │ ├── caption.json │ │ │ ├── frame-tested-after.js │ │ │ ├── frame-tested-evaluate.js │ │ │ ├── frame-tested.json │ │ │ ├── no-autoplay-audio-evaluate.js │ │ │ └── no-autoplay-audio.json │ │ ├── mobile/ │ │ │ ├── css-orientation-lock-evaluate.js │ │ │ ├── css-orientation-lock.json │ │ │ ├── meta-viewport-large.json │ │ │ ├── meta-viewport-scale-evaluate.js │ │ │ ├── meta-viewport.json │ │ │ ├── target-offset-evaluate.js │ │ │ ├── target-offset.json │ │ │ ├── target-size-evaluate.js │ │ │ └── target-size.json │ │ ├── navigation/ │ │ │ ├── header-present.json │ │ │ ├── heading-order-after.js │ │ │ ├── heading-order-evaluate.js │ │ │ ├── heading-order.json │ │ │ ├── identical-links-same-purpose-after.js │ │ │ ├── identical-links-same-purpose-evaluate.js │ │ │ ├── identical-links-same-purpose.json │ │ │ ├── internal-link-present-evaluate.js │ │ │ ├── internal-link-present.json │ │ │ ├── landmark.json │ │ │ ├── meta-refresh-evaluate.js │ │ │ ├── meta-refresh-no-exceptions.json │ │ │ ├── meta-refresh.json │ │ │ ├── p-as-heading-evaluate.js │ │ │ ├── p-as-heading.json │ │ │ ├── region-after.js │ │ │ ├── region-evaluate.js │ │ │ ├── region.json │ │ │ ├── skip-link-evaluate.js │ │ │ ├── skip-link.json │ │ │ ├── unique-frame-title-after.js │ │ │ ├── unique-frame-title-evaluate.js │ │ │ └── unique-frame-title.json │ │ ├── parsing/ │ │ │ ├── duplicate-id-active.json │ │ │ ├── duplicate-id-after.js │ │ │ ├── duplicate-id-aria.json │ │ │ ├── duplicate-id-evaluate.js │ │ │ └── duplicate-id.json │ │ ├── shared/ │ │ │ ├── aria-label-evaluate.js │ │ │ ├── aria-label.json │ │ │ ├── aria-labelledby-evaluate.js │ │ │ ├── aria-labelledby.json │ │ │ ├── avoid-inline-spacing-evaluate.js │ │ │ ├── avoid-inline-spacing.json │ │ │ ├── button-has-visible-text.json │ │ │ ├── doc-has-title-evaluate.js │ │ │ ├── doc-has-title.json │ │ │ ├── error-occurred.json │ │ │ ├── exists-evaluate.js │ │ │ ├── exists.json │ │ │ ├── has-alt-evaluate.js │ │ │ ├── has-alt.json │ │ │ ├── has-visible-text.json │ │ │ ├── important-letter-spacing.json │ │ │ ├── important-line-height.json │ │ │ ├── important-word-spacing.json │ │ │ ├── inline-style-property-evaluate.js │ │ │ ├── is-on-screen-evaluate.js │ │ │ ├── is-on-screen.json │ │ │ ├── non-empty-alt.json │ │ │ ├── non-empty-if-present-evaluate.js │ │ │ ├── non-empty-if-present.json │ │ │ ├── non-empty-placeholder.json │ │ │ ├── non-empty-title.json │ │ │ ├── non-empty-value.json │ │ │ ├── presentational-role-evaluate.js │ │ │ ├── presentational-role.json │ │ │ ├── role-none.json │ │ │ ├── role-presentation.json │ │ │ ├── svg-non-empty-title-evaluate.js │ │ │ └── svg-non-empty-title.json │ │ ├── tables/ │ │ │ ├── caption-faked-evaluate.js │ │ │ ├── caption-faked.json │ │ │ ├── html5-scope-evaluate.js │ │ │ ├── html5-scope.json │ │ │ ├── same-caption-summary-evaluate.js │ │ │ ├── same-caption-summary.json │ │ │ ├── scope-value-evaluate.js │ │ │ ├── scope-value.json │ │ │ ├── td-has-header-evaluate.js │ │ │ ├── td-has-header.json │ │ │ ├── td-headers-attr-evaluate.js │ │ │ ├── td-headers-attr.json │ │ │ ├── th-has-data-cells-evaluate.js │ │ │ └── th-has-data-cells.json │ │ └── visibility/ │ │ ├── hidden-content-evaluate.js │ │ └── hidden-content.json │ ├── commons/ │ │ ├── aria/ │ │ │ ├── allowed-attr.js │ │ │ ├── arialabel-text.js │ │ │ ├── arialabelledby-text.js │ │ │ ├── get-accessible-refs.js │ │ │ ├── get-element-unallowed-roles.js │ │ │ ├── get-explicit-role.js │ │ │ ├── get-owned-virtual.js │ │ │ ├── get-role-type.js │ │ │ ├── get-role.js │ │ │ ├── get-roles-by-type.js │ │ │ ├── get-roles-with-name-from-contents.js │ │ │ ├── implicit-nodes.js │ │ │ ├── implicit-role.js │ │ │ ├── index.js │ │ │ ├── is-accessible-ref.js │ │ │ ├── is-aria-role-allowed-on-element.js │ │ │ ├── is-combobox-popup.js │ │ │ ├── is-unsupported-role.js │ │ │ ├── is-valid-role.js │ │ │ ├── label-virtual.js │ │ │ ├── label.js │ │ │ ├── lookup-table.js │ │ │ ├── named-from-contents.js │ │ │ ├── required-attr.js │ │ │ ├── required-context.js │ │ │ ├── required-owned.js │ │ │ ├── validate-attr-value.js │ │ │ └── validate-attr.js │ │ ├── color/ │ │ │ ├── center-point-of-rect.js │ │ │ ├── color.js │ │ │ ├── element-has-image.js │ │ │ ├── element-is-distinct.js │ │ │ ├── filtered-rect-stack.js │ │ │ ├── flatten-colors.js │ │ │ ├── flatten-shadow-colors.js │ │ │ ├── get-background-color.js │ │ │ ├── get-background-stack.js │ │ │ ├── get-contrast.js │ │ │ ├── get-foreground-color.js │ │ │ ├── get-own-background-color.js │ │ │ ├── get-rect-stack.js │ │ │ ├── get-stroke-colors-from-shadows.js │ │ │ ├── get-text-shadow-colors.js │ │ │ ├── has-valid-contrast-ratio.js │ │ │ ├── incomplete-data.js │ │ │ ├── index.js │ │ │ ├── parse-text-shadows.js │ │ │ └── stacking-context.js │ │ ├── dom/ │ │ │ ├── create-grid.js │ │ │ ├── find-elms-in-context.js │ │ │ ├── find-nearby-elms.js │ │ │ ├── find-up-virtual.js │ │ │ ├── find-up.js │ │ │ ├── focus-disabled.js │ │ │ ├── get-composed-parent.js │ │ │ ├── get-element-by-reference.js │ │ │ ├── get-element-coordinates.js │ │ │ ├── get-element-stack.js │ │ │ ├── get-modal-dialog.js │ │ │ ├── get-node-grid.js │ │ │ ├── get-overflow-hidden-ancestors.js │ │ │ ├── get-rect-stack.js │ │ │ ├── get-root-node.js │ │ │ ├── get-scroll-offset.js │ │ │ ├── get-tabbable-elements.js │ │ │ ├── get-target-rects.js │ │ │ ├── get-target-size.js │ │ │ ├── get-text-element-stack.js │ │ │ ├── get-viewport-size.js │ │ │ ├── get-visible-child-text-rects.js │ │ │ ├── has-content-virtual.js │ │ │ ├── has-content.js │ │ │ ├── has-lang-text.js │ │ │ ├── idrefs.js │ │ │ ├── index.js │ │ │ ├── inserted-into-focus-order.js │ │ │ ├── is-current-page-link.js │ │ │ ├── is-focusable.js │ │ │ ├── is-hidden-for-everyone.js │ │ │ ├── is-hidden-with-css.js │ │ │ ├── is-html5.js │ │ │ ├── is-in-tab-order.js │ │ │ ├── is-in-text-block.js │ │ │ ├── is-inert.js │ │ │ ├── is-modal-open.js │ │ │ ├── is-multiline.js │ │ │ ├── is-natively-focusable.js │ │ │ ├── is-node.js │ │ │ ├── is-offscreen.js │ │ │ ├── is-opaque.js │ │ │ ├── is-skip-link.js │ │ │ ├── is-visible-on-screen.js │ │ │ ├── is-visible-to-screenreader.js │ │ │ ├── is-visible.js │ │ │ ├── is-visual-content.js │ │ │ ├── reduce-to-elements-below-floating.js │ │ │ ├── shadow-elements-from-point.js │ │ │ ├── url-props-from-attribute.js │ │ │ ├── visibility-methods.js │ │ │ ├── visually-contains.js │ │ │ ├── visually-overlaps.js │ │ │ └── visually-sort.js │ │ ├── forms/ │ │ │ ├── index.js │ │ │ ├── is-aria-combobox.js │ │ │ ├── is-aria-listbox.js │ │ │ ├── is-aria-range.js │ │ │ ├── is-aria-textbox.js │ │ │ ├── is-disabled.js │ │ │ ├── is-native-select.js │ │ │ └── is-native-textbox.js │ │ ├── index.js │ │ ├── matches/ │ │ │ ├── attributes.js │ │ │ ├── condition.js │ │ │ ├── explicit-role.js │ │ │ ├── from-definition.js │ │ │ ├── from-function.js │ │ │ ├── from-primative.js │ │ │ ├── has-accessible-name.js │ │ │ ├── implicit-role.js │ │ │ ├── index.js │ │ │ ├── matches.js │ │ │ ├── node-name.js │ │ │ ├── properties.js │ │ │ └── semantic-role.js │ │ ├── math/ │ │ │ ├── get-bounding-rect.js │ │ │ ├── get-intersection-rect.js │ │ │ ├── get-offset.js │ │ │ ├── get-rect-center.js │ │ │ ├── has-visual-overlap.js │ │ │ ├── index.js │ │ │ ├── is-point-in-rect.js │ │ │ ├── rect-has-minimum-size.js │ │ │ ├── rects-overlap.js │ │ │ └── split-rects.js │ │ ├── standards/ │ │ │ ├── get-aria-roles-by-type.js │ │ │ ├── get-aria-roles-supporting-name-from-content.js │ │ │ ├── get-element-spec.js │ │ │ ├── get-elements-by-content-type.js │ │ │ ├── get-global-aria-attrs.js │ │ │ ├── implicit-html-roles.js │ │ │ └── index.js │ │ ├── table/ │ │ │ ├── get-all-cells.js │ │ │ ├── get-cell-position.js │ │ │ ├── get-headers.js │ │ │ ├── get-scope.js │ │ │ ├── index.js │ │ │ ├── is-column-header.js │ │ │ ├── is-data-cell.js │ │ │ ├── is-data-table.js │ │ │ ├── is-header.js │ │ │ ├── is-row-header.js │ │ │ ├── to-grid.js │ │ │ └── traverse.js │ │ └── text/ │ │ ├── accessible-text-virtual.js │ │ ├── accessible-text.js │ │ ├── form-control-value.js │ │ ├── has-unicode.js │ │ ├── index.js │ │ ├── is-human-interpretable.js │ │ ├── is-icon-ligature.js │ │ ├── is-valid-autocomplete.js │ │ ├── label-text.js │ │ ├── label-virtual.js │ │ ├── label.js │ │ ├── native-element-type.js │ │ ├── native-text-alternative.js │ │ ├── native-text-methods.js │ │ ├── remove-unicode.js │ │ ├── sanitize.js │ │ ├── subtree-text.js │ │ ├── title-text.js │ │ ├── unicode.js │ │ ├── unsupported.js │ │ ├── visible-text-nodes.js │ │ ├── visible-virtual.js │ │ └── visible.js │ ├── core/ │ │ ├── _exposed-for-testing.js │ │ ├── base/ │ │ │ ├── audit.js │ │ │ ├── cache.js │ │ │ ├── check-result.js │ │ │ ├── check.js │ │ │ ├── context/ │ │ │ │ ├── create-frame-context.js │ │ │ │ ├── normalize-context.js │ │ │ │ └── parse-selector-array.js │ │ │ ├── context.js │ │ │ ├── rule-result.js │ │ │ ├── rule.js │ │ │ └── virtual-node/ │ │ │ ├── abstract-virtual-node.js │ │ │ ├── serial-virtual-node.js │ │ │ └── virtual-node.js │ │ ├── constants.js │ │ ├── core.js │ │ ├── imports/ │ │ │ ├── index.js │ │ │ └── polyfills.js │ │ ├── index.js │ │ ├── log.js │ │ ├── public/ │ │ │ ├── cleanup.js │ │ │ ├── configure.js │ │ │ ├── finish-run.js │ │ │ ├── frame-messenger.js │ │ │ ├── get-rules.js │ │ │ ├── load.js │ │ │ ├── plugins.js │ │ │ ├── reporter.js │ │ │ ├── reset.js │ │ │ ├── run/ │ │ │ │ ├── globals-setup.js │ │ │ │ └── normalize-run-params.js │ │ │ ├── run-partial.js │ │ │ ├── run-rules.js │ │ │ ├── run-virtual-rule.js │ │ │ ├── run.js │ │ │ ├── setup.js │ │ │ └── teardown.js │ │ ├── reporters/ │ │ │ ├── helpers/ │ │ │ │ ├── failure-summary.js │ │ │ │ ├── incomplete-fallback-msg.js │ │ │ │ ├── index.js │ │ │ │ └── process-aggregate.js │ │ │ ├── na.js │ │ │ ├── no-passes.js │ │ │ ├── raw-env.js │ │ │ ├── raw.js │ │ │ ├── v1.js │ │ │ └── v2.js │ │ └── utils/ │ │ ├── aggregate-checks.js │ │ ├── aggregate-node-results.js │ │ ├── aggregate-result.js │ │ ├── aggregate.js │ │ ├── are-styles-set.js │ │ ├── assert.js │ │ ├── check-helper.js │ │ ├── clone.js │ │ ├── closest.js │ │ ├── collect-results-from-frames.js │ │ ├── contains.js │ │ ├── css-parser.js │ │ ├── deep-merge.js │ │ ├── dq-element.js │ │ ├── element-matches.js │ │ ├── escape-selector.js │ │ ├── extend-meta-data.js │ │ ├── filter-html-attrs.js │ │ ├── finalize-result.js │ │ ├── find-by.js │ │ ├── frame-messenger/ │ │ │ ├── assert-window.js │ │ │ ├── channel-store.js │ │ │ ├── create-responder.js │ │ │ ├── message-handler.js │ │ │ ├── message-id.js │ │ │ ├── message-parser.js │ │ │ ├── post-message.js │ │ │ └── process-error.js │ │ ├── frame-messenger.js │ │ ├── get-all-checks.js │ │ ├── get-ancestry.js │ │ ├── get-base-lang.js │ │ ├── get-check-message.js │ │ ├── get-check-option.js │ │ ├── get-element-source.js │ │ ├── get-environment-data.js │ │ ├── get-flattened-tree.js │ │ ├── get-frame-contexts.js │ │ ├── get-friendly-uri-end.js │ │ ├── get-node-attributes.js │ │ ├── get-node-from-tree.js │ │ ├── get-root-node.js │ │ ├── get-rule.js │ │ ├── get-scroll-state.js │ │ ├── get-scroll.js │ │ ├── get-selector.js │ │ ├── get-shadow-selector.js │ │ ├── get-standards.js │ │ ├── get-stylesheet-factory.js │ │ ├── get-xpath.js │ │ ├── index.js │ │ ├── inject-style.js │ │ ├── is-array-like.js │ │ ├── is-context.js │ │ ├── is-hidden.js │ │ ├── is-html-element.js │ │ ├── is-node-in-context.js │ │ ├── is-shadow-root.js │ │ ├── is-xhtml.js │ │ ├── match-ancestry.js │ │ ├── matches.js │ │ ├── memoize.js │ │ ├── merge-results.js │ │ ├── node-lookup.js │ │ ├── node-serializer.js │ │ ├── node-sorter.js │ │ ├── normalize-run-options.js │ │ ├── object-has-own.js │ │ ├── parse-crossorigin-stylesheet.js │ │ ├── parse-sameorigin-stylesheet.js │ │ ├── parse-stylesheet.js │ │ ├── parse-tabindex.js │ │ ├── performance-timer.js │ │ ├── pollyfill-elements-from-point.js │ │ ├── preload-cssom.js │ │ ├── preload-media.js │ │ ├── preload.js │ │ ├── process-message.js │ │ ├── publish-metadata.js │ │ ├── query-selector-all-filter.js │ │ ├── query-selector-all.js │ │ ├── queue.js │ │ ├── respondable.js │ │ ├── rule-error.js │ │ ├── rule-should-run.js │ │ ├── select.js │ │ ├── selector-cache.js │ │ ├── send-command-to-frame.js │ │ ├── serialize-error.js │ │ ├── set-scroll-state.js │ │ ├── shadow-select-all.js │ │ ├── shadow-select.js │ │ ├── to-array.js │ │ ├── token-list.js │ │ ├── unique-array.js │ │ ├── uuid.js │ │ ├── valid-input-type.js │ │ └── valid-langs.js │ ├── intro.stub │ ├── misc/ │ │ ├── any-failure-summary.json │ │ ├── incomplete-fallback.json │ │ └── none-failure-summary.json │ ├── outro.stub │ ├── rules/ │ │ ├── accesskeys.json │ │ ├── area-alt.json │ │ ├── aria-allowed-attr-matches.js │ │ ├── aria-allowed-attr.json │ │ ├── aria-allowed-role-matches.js │ │ ├── aria-allowed-role.json │ │ ├── aria-braille-equivalent.json │ │ ├── aria-command-name.json │ │ ├── aria-conditional-attr.json │ │ ├── aria-deprecated-role.json │ │ ├── aria-dialog-name.json │ │ ├── aria-has-attr-matches.js │ │ ├── aria-hidden-body.json │ │ ├── aria-hidden-focus-matches.js │ │ ├── aria-hidden-focus.json │ │ ├── aria-input-field-name.json │ │ ├── aria-meter-name.json │ │ ├── aria-progressbar-name.json │ │ ├── aria-prohibited-attr.json │ │ ├── aria-required-attr.json │ │ ├── aria-required-children-matches.js │ │ ├── aria-required-children.json │ │ ├── aria-required-parent-matches.js │ │ ├── aria-required-parent.json │ │ ├── aria-roledescription.json │ │ ├── aria-roles.json │ │ ├── aria-tab-name.json │ │ ├── aria-text.json │ │ ├── aria-toggle-field-name.json │ │ ├── aria-tooltip-name.json │ │ ├── aria-treeitem-name.json │ │ ├── aria-valid-attr-value.json │ │ ├── aria-valid-attr.json │ │ ├── audio-caption.json │ │ ├── autocomplete-matches.js │ │ ├── autocomplete-valid.json │ │ ├── avoid-inline-spacing.json │ │ ├── blink.json │ │ ├── button-name.json │ │ ├── bypass-matches.js │ │ ├── bypass.json │ │ ├── color-contrast-enhanced.json │ │ ├── color-contrast-matches.js │ │ ├── color-contrast.json │ │ ├── css-orientation-lock.json │ │ ├── data-table-large-matches.js │ │ ├── data-table-matches.js │ │ ├── definition-list.json │ │ ├── dlitem.json │ │ ├── document-title.json │ │ ├── duplicate-id-active-matches.js │ │ ├── duplicate-id-active.json │ │ ├── duplicate-id-aria-matches.js │ │ ├── duplicate-id-aria.json │ │ ├── duplicate-id-misc-matches.js │ │ ├── duplicate-id.json │ │ ├── empty-heading.json │ │ ├── empty-table-header.json │ │ ├── focus-order-semantics.json │ │ ├── form-field-multiple-labels.json │ │ ├── frame-focusable-content-matches.js │ │ ├── frame-focusable-content.json │ │ ├── frame-tested.json │ │ ├── frame-title-has-text-matches.js │ │ ├── frame-title-unique.json │ │ ├── frame-title.json │ │ ├── has-implicit-chromium-role-matches.js │ │ ├── heading-matches.js │ │ ├── heading-order.json │ │ ├── hidden-content.json │ │ ├── html-has-lang.json │ │ ├── html-lang-valid.json │ │ ├── html-namespace-matches.js │ │ ├── html-xml-lang-mismatch.json │ │ ├── identical-links-same-purpose-matches.js │ │ ├── identical-links-same-purpose.json │ │ ├── image-alt.json │ │ ├── img-redundant-alt.json │ │ ├── input-button-name.json │ │ ├── input-image-alt.json │ │ ├── inserted-into-focus-order-matches.js │ │ ├── is-initiator-matches.js │ │ ├── is-visible-matches.js │ │ ├── is-visible-on-screen-matches.js │ │ ├── label-content-name-mismatch-matches.js │ │ ├── label-content-name-mismatch.json │ │ ├── label-matches.js │ │ ├── label-title-only.json │ │ ├── label.json │ │ ├── landmark-banner-is-top-level.json │ │ ├── landmark-complementary-is-top-level.json │ │ ├── landmark-contentinfo-is-top-level.json │ │ ├── landmark-has-body-context-matches.js │ │ ├── landmark-main-is-top-level.json │ │ ├── landmark-no-duplicate-banner.json │ │ ├── landmark-no-duplicate-contentinfo.json │ │ ├── landmark-no-duplicate-main.json │ │ ├── landmark-one-main.json │ │ ├── landmark-unique-matches.js │ │ ├── landmark-unique.json │ │ ├── layout-table-matches.js │ │ ├── link-in-text-block-matches.js │ │ ├── link-in-text-block.json │ │ ├── link-name.json │ │ ├── list.json │ │ ├── listitem.json │ │ ├── marquee.json │ │ ├── meta-refresh-no-exceptions.json │ │ ├── meta-refresh.json │ │ ├── meta-viewport-large.json │ │ ├── meta-viewport.json │ │ ├── nested-interactive-matches.js │ │ ├── nested-interactive.json │ │ ├── no-autoplay-audio-matches.js │ │ ├── no-autoplay-audio.json │ │ ├── no-empty-role-matches.js │ │ ├── no-explicit-name-required-matches.js │ │ ├── no-naming-method-matches.js │ │ ├── no-negative-tabindex-matches.js │ │ ├── no-role-matches.js │ │ ├── not-html-matches.js │ │ ├── object-alt.json │ │ ├── object-is-loaded-matches.js │ │ ├── p-as-heading-matches.js │ │ ├── p-as-heading.json │ │ ├── page-has-heading-one.json │ │ ├── presentation-role-conflict-matches.js │ │ ├── presentation-role-conflict.json │ │ ├── region.json │ │ ├── role-img-alt.json │ │ ├── scope-attr-valid.json │ │ ├── scrollable-region-focusable-matches.js │ │ ├── scrollable-region-focusable.json │ │ ├── select-name.json │ │ ├── server-side-image-map.json │ │ ├── skip-link-matches.js │ │ ├── skip-link.json │ │ ├── summary-interactive-matches.js │ │ ├── summary-name.json │ │ ├── svg-img-alt.json │ │ ├── svg-namespace-matches.js │ │ ├── tabindex.json │ │ ├── table-duplicate-name.json │ │ ├── table-fake-caption.json │ │ ├── table-or-grid-role-matches.js │ │ ├── target-size.json │ │ ├── td-has-header.json │ │ ├── td-headers-attr.json │ │ ├── th-has-data-cells.json │ │ ├── valid-lang.json │ │ ├── video-caption.json │ │ ├── widget-not-inline-matches.js │ │ ├── window-is-top-matches.js │ │ └── xml-lang-mismatch-matches.js │ └── standards/ │ ├── aria-attrs.js │ ├── aria-roles.js │ ├── css-colors.js │ ├── dpub-roles.js │ ├── graphics-roles.js │ ├── html-elms.js │ └── index.js ├── locales/ │ ├── README.md │ ├── _template.json │ ├── da.json │ ├── de.json │ ├── el.json │ ├── es.json │ ├── eu.json │ ├── fr.json │ ├── he.json │ ├── it.json │ ├── ja.json │ ├── ko.json │ ├── nl.json │ ├── no_NB.json │ ├── pl.json │ ├── pt_BR.json │ ├── pt_PT.json │ ├── ru.json │ ├── zh_CN.json │ └── zh_TW.json ├── package.json ├── patches/ │ └── colorjs.io+0.4.3.patch ├── sri-history.json ├── test/ │ ├── act-rules/ │ │ ├── README.md │ │ ├── act-runner.js │ │ ├── aria-attr-defined-5f99a7.spec.js │ │ ├── aria-hidden-no-focusable-content-6cfa84.spec.js │ │ ├── aria-required-context-ff89c9.spec.js │ │ ├── aria-required-id-references-in6db8.spec.js │ │ ├── aria-required-owned-element-bc4a75.spec.js │ │ ├── aria-state-or-property-permitted-5c01ea.spec.js │ │ ├── autocomplete-valid-value-73f2c2.spec.js │ │ ├── button-non-empty-accessible-name-97a4e1.spec.js │ │ ├── css-restrict-orientation-b33eff.spec.js │ │ ├── element-lang-valid-de46e4.spec.js │ │ ├── element-marked-decorative-is-not-exposed-46ca7f.spec.js │ │ ├── explicit-SVG-image-non-empty-accessible-name-7d6734.spec.js │ │ ├── form-field-non-empty-accessible-name-e086e5.spec.js │ │ ├── heading-non-empty-accessible-name-ffd0e9.spec.js │ │ ├── html-page-lang-b5c3f8.spec.js │ │ ├── html-page-lang-valid-bf051a.spec.js │ │ ├── html-page-lang-xml-lang-match-5b7ae0.spec.js │ │ ├── html-page-non-empty-title-2779a5.spec.js │ │ ├── id-value-unique-3ea0c8.spec.js │ │ ├── iframe-non-empty-accessible-name-cae760.spec.js │ │ ├── image-button-non-empty-accessible-name-59796f.spec.js │ │ ├── image-non-empty-accessible-name-23a2a8.spec.js │ │ ├── letter-spacing-not-important-24afc2.spec.js │ │ ├── line-height-not-important-78fd32.spec.js │ │ ├── link-non-empty-accessible-name-c487ae.spec.js │ │ ├── links-identical-name-equivalent-purpose-b20e66.spec.js │ │ ├── links-with-identical-names-and-context-serve-equivalent-purpose-fd3a94.spec.js │ │ ├── menuitem-non-empty-name-m6b1q3.spec.js │ │ ├── meta-viewport-b4f0c3.spec.js │ │ ├── object-has-acessible-name-8fc3b6.spec.js │ │ ├── presentational-children-no-focusable-content-307n5z.spec.js │ │ ├── role-required-states-and-properties-4e8ab6.spec.js │ │ ├── scrollable-element-keyboard-accessible-0ssw9k.spec.js │ │ ├── table-headers-attribute-refer-to-data-cells-a25f45.spec.js │ │ ├── text-contrast-afw4f7.spec.js │ │ ├── text-contrast-enhanced-09o5cg.spec.js │ │ ├── visible-label-in-accessible-name-2ee8b8.spec.js │ │ └── word-spacing-not-important-9e45ec.spec.js │ ├── aria-practices/ │ │ ├── README.md │ │ └── apg.spec.js │ ├── assets/ │ │ ├── video.webm │ │ └── webfont-attribution-license.md │ ├── checks/ │ │ ├── aria/ │ │ │ ├── aria-allowed-attr.js │ │ │ ├── aria-allowed-role.js │ │ │ ├── aria-busy.js │ │ │ ├── aria-conditional-attr.js │ │ │ ├── aria-hidden-body.js │ │ │ ├── aria-level.js │ │ │ ├── aria-prohibited-attr.js │ │ │ ├── aria-required-attr.js │ │ │ ├── aria-roledescription.js │ │ │ ├── braille-label-equivalent.js │ │ │ ├── braille-roledescription-equivalent.js │ │ │ ├── deprecatedrole.js │ │ │ ├── errormessage.js │ │ │ ├── fallbackrole.js │ │ │ ├── has-global-aria-attribute.js │ │ │ ├── has-widget-role.js │ │ │ ├── is-element-focusable.js │ │ │ ├── no-implicit-explicit-label.js │ │ │ ├── required-children.js │ │ │ ├── required-parent.js │ │ │ ├── unsupportedattr.js │ │ │ ├── unsupportedrole.js │ │ │ ├── valid-attr-value.js │ │ │ ├── valid-attr.js │ │ │ └── valid-scrollable-semantics.js │ │ ├── color/ │ │ │ ├── color-contrast.js │ │ │ ├── link-in-text-block-style.js │ │ │ └── link-in-text-block.js │ │ ├── forms/ │ │ │ ├── autocomplete-appropriate.js │ │ │ └── autocomplete-valid.js │ │ ├── keyboard/ │ │ │ ├── accesskeys.js │ │ │ ├── focusable-content.js │ │ │ ├── focusable-disabled.js │ │ │ ├── focusable-element.js │ │ │ ├── focusable-modal-open.js │ │ │ ├── focusable-no-name.js │ │ │ ├── focusable-not-tabbable.js │ │ │ ├── frame-focusable-content.js │ │ │ ├── landmark-is-top-level.js │ │ │ ├── no-focusable-content.js │ │ │ ├── page-has-elm.js │ │ │ ├── page-no-duplicate.js │ │ │ └── tabindex.js │ │ ├── label/ │ │ │ ├── alt-space-value.js │ │ │ ├── duplicate-img-label.js │ │ │ ├── explicit.js │ │ │ ├── help-same-as-label.js │ │ │ ├── hidden-explicit-label.js │ │ │ ├── implicit.js │ │ │ ├── label-content-name-mismatch.js │ │ │ ├── multiple-label.js │ │ │ └── title-only.js │ │ ├── landmarks/ │ │ │ ├── landmark-is-unique-after.js │ │ │ └── landmark-is-unique.js │ │ ├── language/ │ │ │ ├── has-lang.js │ │ │ ├── valid-lang.js │ │ │ └── xml-lang-mismatch.js │ │ ├── lists/ │ │ │ ├── dlitem.js │ │ │ ├── listitem.js │ │ │ ├── only-dlitems.js │ │ │ ├── only-listitems.js │ │ │ └── structured-dlitems.js │ │ ├── media/ │ │ │ ├── caption.js │ │ │ ├── frame-tested.js │ │ │ └── no-autoplay-audio.js │ │ ├── mobile/ │ │ │ ├── css-orientation-lock.js │ │ │ ├── meta-viewport-scale.js │ │ │ ├── target-offset.js │ │ │ └── target-size.js │ │ ├── navigation/ │ │ │ ├── header-present.js │ │ │ ├── heading-order.js │ │ │ ├── identical-links-same-purpose-after.js │ │ │ ├── identical-links-same-purpose.js │ │ │ ├── internal-link-present.js │ │ │ ├── landmark.js │ │ │ ├── meta-refresh.js │ │ │ ├── p-as-heading.js │ │ │ ├── region-after.js │ │ │ ├── region.js │ │ │ ├── skip-link.js │ │ │ ├── unique-frame-title-after.js │ │ │ └── unique-frame-title.js │ │ ├── parser/ │ │ │ └── duplicate-id.js │ │ ├── shared/ │ │ │ ├── abstractrole.js │ │ │ ├── aria-label.js │ │ │ ├── aria-labelledby.js │ │ │ ├── avoid-inline-spacing.js │ │ │ ├── button-has-visible-text.js │ │ │ ├── doc-has-title.js │ │ │ ├── exists.js │ │ │ ├── has-alt.js │ │ │ ├── has-visible-text.js │ │ │ ├── inline-style-property.js │ │ │ ├── invalidrole.js │ │ │ ├── is-on-screen.js │ │ │ ├── non-empty-alt.js │ │ │ ├── non-empty-if-present.js │ │ │ ├── non-empty-placeholder.js │ │ │ ├── non-empty-title.js │ │ │ ├── non-empty-value.js │ │ │ ├── presentational-role.js │ │ │ ├── role-none.js │ │ │ ├── role-presentation.js │ │ │ └── svg-non-empty-title.js │ │ ├── tables/ │ │ │ ├── caption-faked.js │ │ │ ├── html5-scope.js │ │ │ ├── same-caption-summary.js │ │ │ ├── scope-value.js │ │ │ ├── td-has-header.js │ │ │ ├── td-headers-attr.js │ │ │ └── th-has-data-cells.js │ │ ├── theme.css │ │ └── visibility/ │ │ └── hidden-content.js │ ├── commons/ │ │ ├── aria/ │ │ │ ├── allowed-attr.js │ │ │ ├── arialabel-text.js │ │ │ ├── arialabelledby-text.js │ │ │ ├── get-accessible-refs.js │ │ │ ├── get-element-unallowed-roles.js │ │ │ ├── get-explicit-role.js │ │ │ ├── get-owned-virtual.js │ │ │ ├── get-role-type.js │ │ │ ├── get-role.js │ │ │ ├── get-roles-by-type.js │ │ │ ├── get-roles-with-name-from-contents.js │ │ │ ├── implicit-role.js │ │ │ ├── is-accessible-ref.js │ │ │ ├── is-aria-role-allowed-on-element.js │ │ │ ├── is-combobox-popup.js │ │ │ ├── is-unsupported-role.js │ │ │ ├── is-valid-role.js │ │ │ ├── label-virtual.js │ │ │ ├── named-from-contents.js │ │ │ ├── required-attr.js │ │ │ ├── required-context.js │ │ │ ├── required-owned.js │ │ │ ├── roles.js │ │ │ ├── validate-attr-value.js │ │ │ └── validate-attr.js │ │ ├── color/ │ │ │ ├── center-point-of-rect.js │ │ │ ├── color.js │ │ │ ├── element-has-image.js │ │ │ ├── element-is-distinct.js │ │ │ ├── flatten-colors.js │ │ │ ├── get-background-color.js │ │ │ ├── get-contrast.js │ │ │ ├── get-foreground-color.js │ │ │ ├── get-own-background-color.js │ │ │ ├── get-stroke-colors-from-shadows.js │ │ │ ├── get-text-shadow-colors.js │ │ │ ├── has-valid-contrast-ratio.js │ │ │ ├── incomplete-data.js │ │ │ ├── parse-text-shadows.js │ │ │ └── stacking-context.js │ │ ├── dom/ │ │ │ ├── create-grid.js │ │ │ ├── find-elms-in-context.js │ │ │ ├── find-nearby-elms.js │ │ │ ├── find-up.js │ │ │ ├── focus-disabled.js │ │ │ ├── get-composed-parent.js │ │ │ ├── get-element-by-reference.js │ │ │ ├── get-element-coordinates.js │ │ │ ├── get-element-stack.js │ │ │ ├── get-modal-dialog.js │ │ │ ├── get-node-grid.js │ │ │ ├── get-overflow-hidden-ancestors.js │ │ │ ├── get-scroll-offset.js │ │ │ ├── get-tabbable-elements.js │ │ │ ├── get-target-rects.js │ │ │ ├── get-target-size.js │ │ │ ├── get-text-element-stack.js │ │ │ ├── get-viewport-size.js │ │ │ ├── get-visible-child-text-rects.js │ │ │ ├── has-content-virtual.js │ │ │ ├── has-lang-text.js │ │ │ ├── idrefs.js │ │ │ ├── inserted-into-focus-order.js │ │ │ ├── is-current-page-link.js │ │ │ ├── is-focusable.js │ │ │ ├── is-hidden-for-everyone.js │ │ │ ├── is-hidden-with-css.js │ │ │ ├── is-html5.js │ │ │ ├── is-in-tab-order.js │ │ │ ├── is-in-text-block.js │ │ │ ├── is-inert.js │ │ │ ├── is-modal-open.js │ │ │ ├── is-multiline.js │ │ │ ├── is-natively-focusable.js │ │ │ ├── is-node.js │ │ │ ├── is-offscreen.js │ │ │ ├── is-skip-link.js │ │ │ ├── is-visible-on-screen.js │ │ │ ├── is-visible-to-screenreader.js │ │ │ ├── is-visible.js │ │ │ ├── is-visual-content.js │ │ │ ├── shadow-elements-from-point.js │ │ │ ├── url-props-from-attribute.js │ │ │ ├── visibility-methods.js │ │ │ ├── visually-contains.js │ │ │ ├── visually-overlaps.js │ │ │ └── visually-sort.js │ │ ├── forms/ │ │ │ ├── is-aria-combobox.js │ │ │ ├── is-aria-listbox.js │ │ │ ├── is-aria-range.js │ │ │ ├── is-aria-textbox.js │ │ │ ├── is-disabled.js │ │ │ ├── is-native-select.js │ │ │ └── is-native-textbox.js │ │ ├── index.js │ │ ├── matches/ │ │ │ ├── attributes.js │ │ │ ├── condition.js │ │ │ ├── explicit-role.js │ │ │ ├── from-definition.js │ │ │ ├── from-function.js │ │ │ ├── from-primative.js │ │ │ ├── has-accessible-name.js │ │ │ ├── implicit-role.js │ │ │ ├── node-name.js │ │ │ ├── properties.js │ │ │ └── semantic-role.js │ │ ├── math/ │ │ │ ├── get-bounding-rect.js │ │ │ ├── get-intersection-rect.js │ │ │ ├── get-offset.js │ │ │ ├── get-rect-center.js │ │ │ ├── has-visual-overlap.js │ │ │ ├── is-point-in-rect.js │ │ │ ├── rect-has-minimum-size.js │ │ │ ├── rects-overlap.js │ │ │ └── split-rects.js │ │ ├── standards/ │ │ │ ├── get-aria-roles-by-type.js │ │ │ ├── get-aria-roles-supporting-name-from-content.js │ │ │ ├── get-element-spec.js │ │ │ ├── get-elements-by-content-type.js │ │ │ └── get-global-aria-attrs.js │ │ ├── table/ │ │ │ ├── get-cell-position.js │ │ │ ├── get-headers.js │ │ │ ├── get-scope.js │ │ │ ├── is-column-header.js │ │ │ ├── is-data-cell.js │ │ │ ├── is-data-table.js │ │ │ ├── is-header.js │ │ │ ├── is-row-header.js │ │ │ ├── to-grid.js │ │ │ └── traverse.js │ │ ├── text/ │ │ │ ├── accessible-text.js │ │ │ ├── form-control-value.js │ │ │ ├── is-human-interpretable.js │ │ │ ├── is-icon-ligature.js │ │ │ ├── is-valid-autocomplete.js │ │ │ ├── label-text.js │ │ │ ├── label-virtual.js │ │ │ ├── native-text-alternative.js │ │ │ ├── native-text-methods.js │ │ │ ├── sanitize.js │ │ │ ├── subtree-text.js │ │ │ ├── unicode.js │ │ │ ├── visible-text-nodes.js │ │ │ └── visible-virtual.js │ │ └── utils/ │ │ └── index.js │ ├── core/ │ │ ├── base/ │ │ │ ├── audit.js │ │ │ ├── cache.js │ │ │ ├── check-result.js │ │ │ ├── check.js │ │ │ ├── context.js │ │ │ ├── rule-result.js │ │ │ ├── rule.js │ │ │ └── virtual-node/ │ │ │ ├── abstract-virtual-node.js │ │ │ ├── serial-virtual-node.js │ │ │ └── virtual-node.js │ │ ├── constants.js │ │ ├── export.js │ │ ├── index.js │ │ ├── log.js │ │ ├── public/ │ │ │ ├── cleanup.js │ │ │ ├── configure.js │ │ │ ├── finish-run.js │ │ │ ├── frame-messenger.js │ │ │ ├── get-rules.js │ │ │ ├── load.js │ │ │ ├── plugins.js │ │ │ ├── reporter.js │ │ │ ├── reset.js │ │ │ ├── run-partial.js │ │ │ ├── run-rules.js │ │ │ ├── run-virtual-rule.js │ │ │ ├── run.js │ │ │ ├── setup.js │ │ │ └── teardown.js │ │ ├── reporters/ │ │ │ ├── helpers/ │ │ │ │ ├── 000_runfirst.js │ │ │ │ ├── failure-summary.js │ │ │ │ ├── incomplete-fallback-msg.js │ │ │ │ └── process-aggregate.js │ │ │ ├── na.js │ │ │ ├── no-passes.js │ │ │ ├── raw-env.js │ │ │ ├── raw.js │ │ │ ├── v1.js │ │ │ └── v2.js │ │ └── utils/ │ │ ├── aggregate.js │ │ ├── aggregateChecks.js │ │ ├── aggregateNodeResults.js │ │ ├── aggregateResult.js │ │ ├── are-styles-set.js │ │ ├── assert.js │ │ ├── check-helper.js │ │ ├── clone.js │ │ ├── closest.js │ │ ├── collect-results-from-frames.js │ │ ├── contains.js │ │ ├── deep-merge.js │ │ ├── dq-element.js │ │ ├── element-matches.js │ │ ├── escape-selector.js │ │ ├── extend-meta-data.js │ │ ├── filter-html-attrs.js │ │ ├── finalize-result.js │ │ ├── find-by.js │ │ ├── flattened-tree.js │ │ ├── frame-messenger/ │ │ │ ├── frame-messenger.js │ │ │ └── subscribe.js │ │ ├── get-all-checks.js │ │ ├── get-ancestry.js │ │ ├── get-base-lang.js │ │ ├── get-check-message.js │ │ ├── get-check-option.js │ │ ├── get-element-source.js │ │ ├── get-environment-data.js │ │ ├── get-frame-contexts.js │ │ ├── get-friendly-uri-end.js │ │ ├── get-node-attributes.js │ │ ├── get-root-node.js │ │ ├── get-rule.js │ │ ├── get-scroll.js │ │ ├── get-selector.js │ │ ├── get-shadow-selector.js │ │ ├── get-standards.js │ │ ├── get-stylesheet-factory.js │ │ ├── get-xpath.js │ │ ├── is-array-like.js │ │ ├── is-context.js │ │ ├── is-hidden.js │ │ ├── is-html-element.js │ │ ├── is-node-in-context.js │ │ ├── is-shadow-root.js │ │ ├── is-xhtml.js │ │ ├── matchAncestry.js │ │ ├── matches.js │ │ ├── memoize.js │ │ ├── merge-results.js │ │ ├── node-lookup.js │ │ ├── node-serializer.js │ │ ├── node-sorter.js │ │ ├── normalize-run-options.js │ │ ├── object-has-own.js │ │ ├── parse-crossorigin-stylesheet.js │ │ ├── parse-sameorigin-stylesheet.js │ │ ├── parse-tabindex.js │ │ ├── performance-timer.js │ │ ├── pollyfills.elements-from-point.js │ │ ├── preload-cssom.js │ │ ├── preload-media.js │ │ ├── preload.js │ │ ├── process-message.js │ │ ├── publish-metadata.js │ │ ├── qsa.js │ │ ├── queue.js │ │ ├── respondable.js │ │ ├── rule-error.js │ │ ├── rule-should-run.js │ │ ├── scroll-state.js │ │ ├── select.js │ │ ├── selector-cache.js │ │ ├── send-command-to-frame.js │ │ ├── serialize-error.js │ │ ├── shadow-select-all.js │ │ ├── shadow-select.js │ │ ├── to-array.js │ │ ├── token-list.js │ │ └── valid-langs.js │ ├── get-webdriver.js │ ├── integration/ │ │ ├── adapter.js │ │ ├── api/ │ │ │ └── external/ │ │ │ └── index.js │ │ ├── full/ │ │ │ ├── README.md │ │ │ ├── all-rules/ │ │ │ │ ├── all-rules.html │ │ │ │ ├── all-rules.js │ │ │ │ └── frames/ │ │ │ │ └── focusable.html │ │ │ ├── aria-hidden-body/ │ │ │ │ ├── fail.html │ │ │ │ ├── fail.js │ │ │ │ ├── frames/ │ │ │ │ │ └── frame-hidden-body.html │ │ │ │ ├── pass.html │ │ │ │ └── pass.js │ │ │ ├── aria-hidden-focus/ │ │ │ │ ├── modal.html │ │ │ │ └── modal.js │ │ │ ├── async/ │ │ │ │ ├── async.html │ │ │ │ └── async.js │ │ │ ├── bypass/ │ │ │ │ ├── aria-header.html │ │ │ │ ├── fail.html │ │ │ │ ├── fail.js │ │ │ │ ├── frames/ │ │ │ │ │ ├── level1-fail.html │ │ │ │ │ ├── level1.html │ │ │ │ │ ├── level2-a.html │ │ │ │ │ └── level2.html │ │ │ │ ├── header-iframe-fail.html │ │ │ │ ├── header-iframe-fail.js │ │ │ │ ├── header-iframe-pass.html │ │ │ │ ├── header-iframe-pass.js │ │ │ │ ├── header1.html │ │ │ │ ├── header2.html │ │ │ │ ├── pass-tests.js │ │ │ │ ├── region.html │ │ │ │ └── skip-link.html │ │ │ ├── configuration/ │ │ │ │ ├── tag-exclude.html │ │ │ │ └── tag-exclude.js │ │ │ ├── configure-options/ │ │ │ │ ├── configure-options.html │ │ │ │ └── configure-options.js │ │ │ ├── context/ │ │ │ │ ├── context.html │ │ │ │ ├── context.js │ │ │ │ ├── frames/ │ │ │ │ │ ├── level1.html │ │ │ │ │ ├── level2-a.html │ │ │ │ │ ├── level2-b.html │ │ │ │ │ └── shadow-frame.html │ │ │ │ ├── shadow-dom.html │ │ │ │ └── shadow-dom.js │ │ │ ├── contrast/ │ │ │ │ ├── blending.html │ │ │ │ ├── blending.js │ │ │ │ ├── code-highlighting.html │ │ │ │ ├── code-highlighting.js │ │ │ │ ├── memory.html │ │ │ │ ├── memory.js │ │ │ │ ├── prototype-lib-1.7.3.js │ │ │ │ ├── prototype.html │ │ │ │ ├── prototype.js │ │ │ │ ├── shadow-dom.html │ │ │ │ ├── shadow-dom.js │ │ │ │ ├── sticky-header.html │ │ │ │ └── sticky-header.js │ │ │ ├── contrast-enhanced/ │ │ │ │ ├── simple.html │ │ │ │ └── simple.js │ │ │ ├── css-orientation-lock/ │ │ │ │ ├── incomplete.html │ │ │ │ ├── incomplete.js │ │ │ │ ├── passes.html │ │ │ │ ├── passes.js │ │ │ │ ├── violations.css │ │ │ │ ├── violations.html │ │ │ │ └── violations.js │ │ │ ├── definition-list/ │ │ │ │ ├── dl-role.html │ │ │ │ ├── dl-role.js │ │ │ │ ├── dlitem-role.html │ │ │ │ └── dlitem-role.js │ │ │ ├── dialog/ │ │ │ │ ├── dialog.html │ │ │ │ └── dialog.js │ │ │ ├── document-title/ │ │ │ │ ├── document-title-fail.html │ │ │ │ ├── document-title-fail.js │ │ │ │ ├── document-title-pass.html │ │ │ │ ├── document-title-pass.js │ │ │ │ └── frames/ │ │ │ │ ├── level1.html │ │ │ │ ├── level2-a.html │ │ │ │ └── level2.html │ │ │ ├── error-occurred/ │ │ │ │ ├── error-frame.html │ │ │ │ ├── error-frame.js │ │ │ │ ├── error-occurred.html │ │ │ │ ├── error-occurred.js │ │ │ │ ├── error-ruleset.js │ │ │ │ └── frames/ │ │ │ │ └── error.html │ │ │ ├── frame-tested/ │ │ │ │ ├── frame-tested-fail.html │ │ │ │ ├── frame-tested-fail.js │ │ │ │ ├── frame-tested-incomplete.html │ │ │ │ ├── frame-tested-incomplete.js │ │ │ │ ├── frame-tested-pass.html │ │ │ │ ├── frame-tested-pass.js │ │ │ │ └── frames/ │ │ │ │ ├── nested-no-axe.html │ │ │ │ ├── no-axe.html │ │ │ │ └── with-axe.html │ │ │ ├── frame-wait-time/ │ │ │ │ ├── frame-wait-time.html │ │ │ │ ├── frame-wait-time.js │ │ │ │ └── frames/ │ │ │ │ └── frame.html │ │ │ ├── get-selector/ │ │ │ │ ├── get-selector.js │ │ │ │ └── get-selector.xhtml │ │ │ ├── heading-order/ │ │ │ │ ├── frames/ │ │ │ │ │ ├── heading.html │ │ │ │ │ └── nested-heading.html │ │ │ │ ├── no-heading-page.html │ │ │ │ ├── no-heading-page.js │ │ │ │ ├── partial-context-with-iframe-excluded.html │ │ │ │ ├── partial-context-with-iframe-excluded.js │ │ │ │ ├── partial-context-with-iframe.html │ │ │ │ ├── partial-context-with-iframe.js │ │ │ │ ├── partial-context.html │ │ │ │ └── partial-context.js │ │ │ ├── html-has-lang/ │ │ │ │ ├── frames/ │ │ │ │ │ ├── level1.html │ │ │ │ │ ├── level2-a.html │ │ │ │ │ └── level2.html │ │ │ │ ├── html-has-lang-fail-xml-lang.html │ │ │ │ ├── html-has-lang-fail-xml-lang.js │ │ │ │ ├── html-has-lang-fail.html │ │ │ │ ├── html-has-lang-fail.js │ │ │ │ ├── html-has-lang-pass-xhtml.js │ │ │ │ ├── html-has-lang-pass-xhtml.xhtml │ │ │ │ ├── html-has-lang-pass.html │ │ │ │ └── html-has-lang-pass.js │ │ │ ├── html-lang-valid/ │ │ │ │ ├── frames/ │ │ │ │ │ ├── level1.html │ │ │ │ │ ├── level2-a.html │ │ │ │ │ ├── level2-b.html │ │ │ │ │ ├── level2-c.html │ │ │ │ │ ├── level2-d.html │ │ │ │ │ ├── level2-e.html │ │ │ │ │ └── level2.html │ │ │ │ ├── html-lang-valid.html │ │ │ │ └── html-lang-valid.js │ │ │ ├── identical-links-same-purpose/ │ │ │ │ ├── frames/ │ │ │ │ │ └── level1.html │ │ │ │ ├── page.html │ │ │ │ └── page.js │ │ │ ├── incomplete/ │ │ │ │ ├── color-contrast.html │ │ │ │ ├── color-contrast.js │ │ │ │ ├── th-has-data-cells.html │ │ │ │ └── th-has-data-cells.js │ │ │ ├── is-xhtml/ │ │ │ │ ├── is-xhtml.js │ │ │ │ └── is-xhtml.xhtml │ │ │ ├── isolated-env/ │ │ │ │ ├── frames/ │ │ │ │ │ ├── focusable.html │ │ │ │ │ └── isolated.html │ │ │ │ ├── isolated-env.html │ │ │ │ └── isolated-env.js │ │ │ ├── jquery/ │ │ │ │ ├── run-include-exclude.html │ │ │ │ ├── run-include-exclude.js │ │ │ │ ├── run-object.html │ │ │ │ └── run-object.js │ │ │ ├── landmark-banner-is-top-level/ │ │ │ │ ├── frames/ │ │ │ │ │ ├── level1-fail.html │ │ │ │ │ ├── level1.html │ │ │ │ │ └── level2.html │ │ │ │ ├── landmark-banner-is-top-level-fail.html │ │ │ │ ├── landmark-banner-is-top-level-fail.js │ │ │ │ ├── landmark-banner-is-top-level-pass.html │ │ │ │ └── landmark-banner-is-top-level-pass.js │ │ │ ├── landmark-complementary-is-top-level/ │ │ │ │ ├── frames/ │ │ │ │ │ ├── level1-fail.html │ │ │ │ │ ├── level1.html │ │ │ │ │ └── level2.html │ │ │ │ ├── landmark-complementary-is-top-level-fail.html │ │ │ │ ├── landmark-complementary-is-top-level-fail.js │ │ │ │ ├── landmark-complementary-is-top-level-pass.html │ │ │ │ └── landmark-complementary-is-top-level-pass.js │ │ │ ├── landmark-contentinfo-is-top-level/ │ │ │ │ ├── frames/ │ │ │ │ │ ├── level1-fail.html │ │ │ │ │ ├── level1.html │ │ │ │ │ └── level2.html │ │ │ │ ├── landmark-contentinfo-is-top-level-fail.html │ │ │ │ ├── landmark-contentinfo-is-top-level-fail.js │ │ │ │ ├── landmark-contentinfo-is-top-level-pass.html │ │ │ │ └── landmark-contentinfo-is-top-level-pass.js │ │ │ ├── landmark-main-is-top-level/ │ │ │ │ ├── frames/ │ │ │ │ │ ├── level1-fail.html │ │ │ │ │ ├── level1.html │ │ │ │ │ ├── level2-a.html │ │ │ │ │ └── level2.html │ │ │ │ ├── landmark-main-is-top-level-fail.html │ │ │ │ ├── landmark-main-is-top-level-fail.js │ │ │ │ ├── landmark-main-is-top-level-pass.html │ │ │ │ └── landmark-main-is-top-level-pass.js │ │ │ ├── landmark-no-duplicate-banner/ │ │ │ │ ├── frames/ │ │ │ │ │ ├── level1-fail.html │ │ │ │ │ ├── level1.html │ │ │ │ │ └── level2.html │ │ │ │ ├── landmark-no-duplicate-banner-fail.html │ │ │ │ ├── landmark-no-duplicate-banner-fail.js │ │ │ │ ├── landmark-no-duplicate-banner-pass.html │ │ │ │ └── landmark-no-duplicate-banner-pass.js │ │ │ ├── landmark-no-duplicate-contentinfo/ │ │ │ │ ├── frames/ │ │ │ │ │ ├── level1-fail.html │ │ │ │ │ ├── level1.html │ │ │ │ │ └── level2.html │ │ │ │ ├── landmark-no-duplicate-contentinfo-fail.html │ │ │ │ ├── landmark-no-duplicate-contentinfo-fail.js │ │ │ │ ├── landmark-no-duplicate-contentinfo-pass.html │ │ │ │ └── landmark-no-duplicate-contentinfo-pass.js │ │ │ ├── landmark-no-duplicate-main/ │ │ │ │ ├── frames/ │ │ │ │ │ ├── level1-fail.html │ │ │ │ │ ├── level1.html │ │ │ │ │ └── level2.html │ │ │ │ ├── landmark-no-duplicate-main-fail.html │ │ │ │ ├── landmark-no-duplicate-main-fail.js │ │ │ │ ├── landmark-no-duplicate-main-pass.html │ │ │ │ └── landmark-no-duplicate-main-pass.js │ │ │ ├── landmark-one-main/ │ │ │ │ ├── frames/ │ │ │ │ │ ├── level1-fail.html │ │ │ │ │ ├── level1.html │ │ │ │ │ ├── level2-a.html │ │ │ │ │ └── level2.html │ │ │ │ ├── landmark-one-main-fail.html │ │ │ │ ├── landmark-one-main-fail.js │ │ │ │ ├── landmark-one-main-pass1.html │ │ │ │ ├── landmark-one-main-pass1.js │ │ │ │ ├── landmark-one-main-pass2.html │ │ │ │ ├── landmark-one-main-pass2.js │ │ │ │ ├── landmark-one-main-pass3.html │ │ │ │ ├── landmark-one-main-pass3.js │ │ │ │ ├── landmark-one-main-pass4.html │ │ │ │ └── landmark-one-main-pass4.js │ │ │ ├── list/ │ │ │ │ ├── li-role.html │ │ │ │ ├── li-role.js │ │ │ │ ├── list-role.html │ │ │ │ └── list-role.js │ │ │ ├── meta-refresh/ │ │ │ │ ├── meta-refresh-fail.js │ │ │ │ ├── meta-refresh-fail1.html │ │ │ │ ├── meta-refresh-inapplicable.js │ │ │ │ ├── meta-refresh-inapplicable1.html │ │ │ │ ├── meta-refresh-inapplicable2.html │ │ │ │ ├── meta-refresh-pass.js │ │ │ │ ├── meta-refresh-pass1.html │ │ │ │ └── meta-refresh-pass2.html │ │ │ ├── meta-refresh-no-exceptions/ │ │ │ │ ├── meta-refresh-fail.js │ │ │ │ ├── meta-refresh-fail1.html │ │ │ │ ├── meta-refresh-inapplicable.js │ │ │ │ ├── meta-refresh-inapplicable1.html │ │ │ │ ├── meta-refresh-inapplicable2.html │ │ │ │ ├── meta-refresh-pass.js │ │ │ │ ├── meta-refresh-pass1.html │ │ │ │ └── meta-refresh-pass2.html │ │ │ ├── no-autoplay-audio/ │ │ │ │ ├── no-autoplay-audio.html │ │ │ │ └── no-autoplay-audio.js │ │ │ ├── options-parameter/ │ │ │ │ ├── frames/ │ │ │ │ │ └── frame.html │ │ │ │ ├── options-parameter.html │ │ │ │ └── options-parameter.js │ │ │ ├── page-has-heading-one/ │ │ │ │ ├── frames/ │ │ │ │ │ ├── level1-fail.html │ │ │ │ │ ├── level1.html │ │ │ │ │ ├── level2-a.html │ │ │ │ │ └── level2.html │ │ │ │ ├── page-has-heading-one-fail.html │ │ │ │ ├── page-has-heading-one-fail.js │ │ │ │ ├── page-has-heading-one-pass1.html │ │ │ │ ├── page-has-heading-one-pass1.js │ │ │ │ ├── page-has-heading-one-pass10.html │ │ │ │ ├── page-has-heading-one-pass10.js │ │ │ │ ├── page-has-heading-one-pass2.html │ │ │ │ ├── page-has-heading-one-pass2.js │ │ │ │ ├── page-has-heading-one-pass3.html │ │ │ │ ├── page-has-heading-one-pass3.js │ │ │ │ ├── page-has-heading-one-pass4.html │ │ │ │ ├── page-has-heading-one-pass4.js │ │ │ │ ├── page-has-heading-one-pass5.html │ │ │ │ ├── page-has-heading-one-pass5.js │ │ │ │ ├── page-has-heading-one-pass6.html │ │ │ │ ├── page-has-heading-one-pass6.js │ │ │ │ ├── page-has-heading-one-pass7.html │ │ │ │ ├── page-has-heading-one-pass7.js │ │ │ │ ├── page-has-heading-one-pass8.html │ │ │ │ ├── page-has-heading-one-pass8.js │ │ │ │ ├── page-has-heading-one-pass9.html │ │ │ │ └── page-has-heading-one-pass9.js │ │ │ ├── patch/ │ │ │ │ ├── patch.html │ │ │ │ └── patch.mjs │ │ │ ├── plugin/ │ │ │ │ ├── plugin.html │ │ │ │ └── plugin.js │ │ │ ├── preload/ │ │ │ │ ├── import-non-existing-cross-origin.css │ │ │ │ ├── preload.html │ │ │ │ └── preload.js │ │ │ ├── preload-cssom/ │ │ │ │ ├── base.css │ │ │ │ ├── cyclic-cross-origin-import-1.css │ │ │ │ ├── cyclic-cross-origin-import-2.css │ │ │ │ ├── cyclic-import-1.css │ │ │ │ ├── cyclic-import-2.css │ │ │ │ ├── frames/ │ │ │ │ │ └── level1.html │ │ │ │ ├── import-non-existing-cross-origin.css │ │ │ │ ├── multiple-import-1.css │ │ │ │ ├── multiple-import-2.css │ │ │ │ ├── multiple-import-3.css │ │ │ │ ├── nested-import-1.css │ │ │ │ ├── nested-import-2.css │ │ │ │ ├── nested-import-3.css │ │ │ │ ├── preload-cssom.html │ │ │ │ └── preload-cssom.js │ │ │ ├── region/ │ │ │ │ ├── frames/ │ │ │ │ │ ├── region-fail.html │ │ │ │ │ ├── region-nested.html │ │ │ │ │ └── region.html │ │ │ │ ├── region-fail-iframe.html │ │ │ │ ├── region-fail-iframe.js │ │ │ │ ├── region-fail-nested-iframe.html │ │ │ │ ├── region-fail-nested-iframe.js │ │ │ │ ├── region-fail.html │ │ │ │ ├── region-fail.js │ │ │ │ ├── region-iframe-with-landmarks.html │ │ │ │ ├── region-iframe-within-landmark.html │ │ │ │ ├── region-pass-nested-iframe.html │ │ │ │ ├── region-pass.html │ │ │ │ └── region-pass.js │ │ │ ├── rerun/ │ │ │ │ ├── frames/ │ │ │ │ │ └── frame.html │ │ │ │ ├── rerun.html │ │ │ │ └── rerun.js │ │ │ ├── run-partial/ │ │ │ │ ├── after-method.html │ │ │ │ ├── after-method.js │ │ │ │ ├── context-size-focusable.html │ │ │ │ ├── context-size-focusable.js │ │ │ │ ├── frames/ │ │ │ │ │ ├── heading-frame-h3.html │ │ │ │ │ ├── heading-h2.html │ │ │ │ │ ├── link-nested.html │ │ │ │ │ └── link.html │ │ │ │ ├── initiator.html │ │ │ │ ├── initiator.js │ │ │ │ ├── page-level.html │ │ │ │ └── page-level.js │ │ │ ├── serializer/ │ │ │ │ ├── custom-source-serializer.js │ │ │ │ ├── frames/ │ │ │ │ │ ├── level1.html │ │ │ │ │ ├── level2-a.html │ │ │ │ │ └── level2-b.html │ │ │ │ ├── serializer.html │ │ │ │ └── serializer.js │ │ │ ├── skip-link/ │ │ │ │ ├── skip-link-fail.html │ │ │ │ ├── skip-link-fail.js │ │ │ │ ├── skip-link-pass.html │ │ │ │ └── skip-link-pass.js │ │ │ ├── strict-csp/ │ │ │ │ ├── strict-csp.html │ │ │ │ └── strict-csp.js │ │ │ ├── target-size/ │ │ │ │ ├── shadow-dom.html │ │ │ │ ├── shadow-dom.js │ │ │ │ ├── target-size.html │ │ │ │ ├── target-size.js │ │ │ │ ├── too-many-rects.html │ │ │ │ └── too-many-rects.js │ │ │ ├── test-webdriver.js │ │ │ ├── umd/ │ │ │ │ ├── mock-define.js │ │ │ │ ├── mock-module-exports.js │ │ │ │ ├── umd-define.html │ │ │ │ ├── umd-define.js │ │ │ │ ├── umd-module-exports.html │ │ │ │ ├── umd-module-exports.js │ │ │ │ ├── umd-window.html │ │ │ │ └── umd-window.js │ │ │ └── xml-lang-mismatch/ │ │ │ ├── xml-lang-mismatch.fail.js │ │ │ ├── xml-lang-mismatch.fail1.html │ │ │ ├── xml-lang-mismatch.fail2.html │ │ │ ├── xml-lang-mismatch.inapplicable.js │ │ │ ├── xml-lang-mismatch.inapplicable1.html │ │ │ ├── xml-lang-mismatch.inapplicable2.html │ │ │ ├── xml-lang-mismatch.pass.js │ │ │ ├── xml-lang-mismatch.pass1.html │ │ │ ├── xml-lang-mismatch.pass2.html │ │ │ ├── xml-lang-mismatch.pass3.html │ │ │ ├── xml-lang-mismatch.pass4.html │ │ │ └── xml-lang-mismatch.pass5.html │ │ ├── no-ui-reporter.js │ │ ├── rules/ │ │ │ ├── README.md │ │ │ ├── accesskeys/ │ │ │ │ ├── accesskeys.html │ │ │ │ ├── accesskeys.json │ │ │ │ └── frame.html │ │ │ ├── area-alt/ │ │ │ │ ├── area-alt.html │ │ │ │ └── area-alt.json │ │ │ ├── aria-allowed-attr/ │ │ │ │ ├── failures.html │ │ │ │ ├── failures.json │ │ │ │ ├── incomplete.html │ │ │ │ ├── incomplete.json │ │ │ │ ├── passes.html │ │ │ │ └── passes.json │ │ │ ├── aria-allowed-role/ │ │ │ │ ├── aria-allowed-role.html │ │ │ │ ├── aria-allowed-role.json │ │ │ │ └── dummy.html │ │ │ ├── aria-braille-equivalent/ │ │ │ │ ├── aria-braille-equivalent.html │ │ │ │ └── aria-braille-equivalent.json │ │ │ ├── aria-command-name/ │ │ │ │ ├── aria-command-name.html │ │ │ │ └── aria-command-name.json │ │ │ ├── aria-conditional-attr/ │ │ │ │ ├── aria-conditional-attr.html │ │ │ │ └── aria-conditional-attr.json │ │ │ ├── aria-deprecated-role/ │ │ │ │ ├── aria-deprecated-role.html │ │ │ │ └── aria-deprecated-role.json │ │ │ ├── aria-dialog-name/ │ │ │ │ ├── aria-dialog-name.html │ │ │ │ └── aria-dialog-name.json │ │ │ ├── aria-hidden-focus/ │ │ │ │ ├── aria-hidden-focus.html │ │ │ │ └── aria-hidden-focus.json │ │ │ ├── aria-input-field-name/ │ │ │ │ ├── aria-input-field-name.html │ │ │ │ └── aria-input-field-name.json │ │ │ ├── aria-meter-name/ │ │ │ │ ├── aria-meter-name.html │ │ │ │ └── aria-meter-name.json │ │ │ ├── aria-progressbar-name/ │ │ │ │ ├── aria-progressbar-name.html │ │ │ │ └── aria-progressbar-name.json │ │ │ ├── aria-prohibited-attr/ │ │ │ │ ├── aria-prohibited-attr.html │ │ │ │ └── aria-prohibited-attr.json │ │ │ ├── aria-required-attr/ │ │ │ │ ├── required-attr.html │ │ │ │ └── required-attr.json │ │ │ ├── aria-required-children/ │ │ │ │ ├── aria-required-children.html │ │ │ │ └── aria-required-children.json │ │ │ ├── aria-required-parent/ │ │ │ │ ├── aria-required-parent.html │ │ │ │ └── aria-required-parent.json │ │ │ ├── aria-roledescription/ │ │ │ │ ├── aria-roledescription.html │ │ │ │ └── aria-roledescription.json │ │ │ ├── aria-roles/ │ │ │ │ ├── aria-roles.html │ │ │ │ └── aria-roles.json │ │ │ ├── aria-tab-name/ │ │ │ │ ├── aria-tab-name.html │ │ │ │ └── aria-tab-name.json │ │ │ ├── aria-text/ │ │ │ │ ├── aria-text.html │ │ │ │ └── aria-text.json │ │ │ ├── aria-toggle-field-name/ │ │ │ │ ├── aria-toggle-field-name.html │ │ │ │ └── aria-toggle-field-name.json │ │ │ ├── aria-tooltip-name/ │ │ │ │ ├── aria-tooltip-name.html │ │ │ │ └── aria-tooltip-name.json │ │ │ ├── aria-treeitem-name/ │ │ │ │ ├── aria-treeitem-name.html │ │ │ │ └── aria-treeitem-name.json │ │ │ ├── aria-valid-attr/ │ │ │ │ ├── aria-valid-attr.html │ │ │ │ └── aria-valid-attr.json │ │ │ ├── aria-valid-attr-value/ │ │ │ │ ├── aria-valid-attr-value.html │ │ │ │ └── aria-valid-attr-value.json │ │ │ ├── audio-caption/ │ │ │ │ ├── audio-caption.html │ │ │ │ └── audio-caption.json │ │ │ ├── autocomplete-valid/ │ │ │ │ ├── autocomplete-valid.html │ │ │ │ └── autocomplete-valid.json │ │ │ ├── avoid-inline-spacing/ │ │ │ │ ├── avoid-inline-spacing.html │ │ │ │ └── avoid-inline-spacing.json │ │ │ ├── blink/ │ │ │ │ ├── blink.html │ │ │ │ └── blink.json │ │ │ ├── button-name/ │ │ │ │ ├── button-name.html │ │ │ │ └── button-name.json │ │ │ ├── color-contrast/ │ │ │ │ ├── color-contrast.html │ │ │ │ ├── color-contrast.json │ │ │ │ ├── text-shadows.html │ │ │ │ └── text-shadows.json │ │ │ ├── color-contrast-enhanced/ │ │ │ │ ├── color-contrast-enhanced.html │ │ │ │ └── color-contrast-enhanced.json │ │ │ ├── definition-list/ │ │ │ │ ├── definition-list.html │ │ │ │ └── definition-list.json │ │ │ ├── dlitem/ │ │ │ │ ├── dlitem.html │ │ │ │ └── dlitem.json │ │ │ ├── duplicate-id/ │ │ │ │ ├── duplicate-id.html │ │ │ │ └── duplicate-id.json │ │ │ ├── duplicate-id-active/ │ │ │ │ ├── duplicate-id-active.html │ │ │ │ └── duplicate-id-active.json │ │ │ ├── duplicate-id-aria/ │ │ │ │ ├── duplicate-id-aria.html │ │ │ │ └── duplicate-id-aria.json │ │ │ ├── empty-heading/ │ │ │ │ ├── empty-heading.html │ │ │ │ └── empty-heading.json │ │ │ ├── empty-table-header/ │ │ │ │ ├── empty-table-header.html │ │ │ │ └── empty-table-header.json │ │ │ ├── focus-order-semantics/ │ │ │ │ ├── focus-order-semantics.html │ │ │ │ └── focus-order-semantics.json │ │ │ ├── form-field-multiple-labels/ │ │ │ │ ├── form-field-multiple-labels.html │ │ │ │ └── form-field-multiple-labels.json │ │ │ ├── frame-focusable-content/ │ │ │ │ ├── frame-focusable-content.html │ │ │ │ ├── frame-focusable-content.json │ │ │ │ └── frames/ │ │ │ │ ├── focusable-negative-tabindex.html │ │ │ │ ├── focusable.html │ │ │ │ └── not-focusable.html │ │ │ ├── frame-title/ │ │ │ │ ├── frame-title.html │ │ │ │ ├── frame-title.json │ │ │ │ └── frames/ │ │ │ │ ├── level1.html │ │ │ │ ├── level1a.html │ │ │ │ ├── level2-a.html │ │ │ │ └── level2.html │ │ │ ├── frame-title-unique/ │ │ │ │ ├── frame-title-unique.html │ │ │ │ ├── frame-title-unique.json │ │ │ │ └── frames/ │ │ │ │ ├── level1.html │ │ │ │ ├── level1a.html │ │ │ │ ├── level2-a.html │ │ │ │ └── level2.html │ │ │ ├── heading-order/ │ │ │ │ ├── heading-order.html │ │ │ │ └── heading-order.json │ │ │ ├── hidden-content/ │ │ │ │ ├── hidden-content.html │ │ │ │ └── hidden-content.json │ │ │ ├── identical-links-same-purpose/ │ │ │ │ ├── identical-links-same-purpose.html │ │ │ │ └── identical-links-same-purpose.json │ │ │ ├── image-alt/ │ │ │ │ ├── image-alt.html │ │ │ │ └── image-alt.json │ │ │ ├── image-redundant-alt/ │ │ │ │ ├── image-redundant-alt.html │ │ │ │ └── image-redundant-alt.json │ │ │ ├── input-button-name/ │ │ │ │ ├── input-button-name.html │ │ │ │ └── input-button-name.json │ │ │ ├── input-image-alt/ │ │ │ │ ├── input-image-alt.html │ │ │ │ └── input-image-alt.json │ │ │ ├── label/ │ │ │ │ ├── label.html │ │ │ │ └── label.json │ │ │ ├── label-content-name-mismatch/ │ │ │ │ ├── label-content-name-mismatch.html │ │ │ │ └── label-content-name-mismatch.json │ │ │ ├── label-title-only/ │ │ │ │ ├── label-title-only.html │ │ │ │ └── label-title-only.json │ │ │ ├── landmark-unique/ │ │ │ │ ├── frame.html │ │ │ │ ├── landmark-unique-fail.html │ │ │ │ ├── landmark-unique-fail.json │ │ │ │ ├── landmark-unique-pass.html │ │ │ │ └── landmark-unique-pass.json │ │ │ ├── link-in-text-block/ │ │ │ │ ├── link-in-text-block.html │ │ │ │ └── link-in-text-block.json │ │ │ ├── link-name/ │ │ │ │ ├── link-name.html │ │ │ │ └── link-name.json │ │ │ ├── list/ │ │ │ │ ├── list.html │ │ │ │ └── list.json │ │ │ ├── listitem/ │ │ │ │ ├── listitem.html │ │ │ │ └── listitem.json │ │ │ ├── marquee/ │ │ │ │ ├── marquee.html │ │ │ │ └── marquee.json │ │ │ ├── meta-refresh/ │ │ │ │ ├── meta-refresh.html │ │ │ │ └── meta-refresh.json │ │ │ ├── meta-viewport/ │ │ │ │ ├── frames/ │ │ │ │ │ └── iframe-with-zooming-disabled.html │ │ │ │ ├── meta-viewport-fail1.html │ │ │ │ ├── meta-viewport-fail1.json │ │ │ │ ├── meta-viewport-fail2.html │ │ │ │ ├── meta-viewport-fail2.json │ │ │ │ ├── meta-viewport-pass1.html │ │ │ │ ├── meta-viewport-pass1.json │ │ │ │ ├── meta-viewport-pass2.html │ │ │ │ ├── meta-viewport-pass2.json │ │ │ │ ├── meta-viewport-pass3.html │ │ │ │ └── meta-viewport-pass3.json │ │ │ ├── meta-viewport-large/ │ │ │ │ ├── meta-viewport-large-fail1.html │ │ │ │ ├── meta-viewport-large-fail1.json │ │ │ │ ├── meta-viewport-large-fail2.html │ │ │ │ ├── meta-viewport-large-fail2.json │ │ │ │ ├── meta-viewport-large-pass1.html │ │ │ │ ├── meta-viewport-large-pass1.json │ │ │ │ ├── meta-viewport-large-pass2.html │ │ │ │ ├── meta-viewport-large-pass2.json │ │ │ │ ├── meta-viewport-large-pass3.html │ │ │ │ ├── meta-viewport-large-pass3.json │ │ │ │ ├── meta-viewport-large-pass4.html │ │ │ │ └── meta-viewport-large-pass4.json │ │ │ ├── nested-interactive/ │ │ │ │ ├── nested-interactive.html │ │ │ │ └── nested-interactive.json │ │ │ ├── object-alt/ │ │ │ │ ├── object-alt.html │ │ │ │ └── object-alt.json │ │ │ ├── p-as-heading/ │ │ │ │ ├── p-as-heading.html │ │ │ │ └── p-as-heading.json │ │ │ ├── preprocessor.js │ │ │ ├── presentation-role-conflict/ │ │ │ │ ├── presentation-role-conflict.html │ │ │ │ └── presentation-role-conflict.json │ │ │ ├── role-img-alt/ │ │ │ │ ├── role-img-alt.html │ │ │ │ └── role-img-alt.json │ │ │ ├── runner.js │ │ │ ├── scope-attr-valid/ │ │ │ │ ├── scope-attr-valid.html │ │ │ │ └── scope-attr-valid.json │ │ │ ├── scrollable-region-focusable/ │ │ │ │ ├── scrollable-region-focusable.html │ │ │ │ └── scrollable-region-focusable.json │ │ │ ├── select-name/ │ │ │ │ ├── select-name.html │ │ │ │ └── select-name.json │ │ │ ├── server-side-image-map/ │ │ │ │ ├── server-side-image-map.html │ │ │ │ └── server-side-image-map.json │ │ │ ├── summary-name/ │ │ │ │ ├── summary-name.html │ │ │ │ └── summary-name.json │ │ │ ├── svg-img-alt/ │ │ │ │ ├── svg-img-alt.html │ │ │ │ └── svg-img-alt.json │ │ │ ├── tabindex/ │ │ │ │ ├── tabindex.html │ │ │ │ └── tabindex.json │ │ │ ├── table-duplicate-name/ │ │ │ │ ├── table-duplicate-name.html │ │ │ │ └── table-duplicate-name.json │ │ │ ├── table-fake-caption/ │ │ │ │ ├── table-fake-caption.html │ │ │ │ └── table-fake-caption.json │ │ │ ├── target-size/ │ │ │ │ ├── target-size.html │ │ │ │ └── target-size.json │ │ │ ├── td-has-header/ │ │ │ │ ├── td-has-header.html │ │ │ │ └── td-has-header.json │ │ │ ├── td-headers-attr/ │ │ │ │ ├── td-headers-attr.html │ │ │ │ └── td-headers-attr.json │ │ │ ├── th-has-data-cells/ │ │ │ │ ├── th-has-data-cells.html │ │ │ │ └── th-has-data-cells.json │ │ │ ├── valid-lang/ │ │ │ │ ├── valid-lang.html │ │ │ │ └── valid-lang.json │ │ │ └── video-caption/ │ │ │ ├── video-caption.html │ │ │ └── video-caption.json │ │ └── virtual-rules/ │ │ ├── area-alt.js │ │ ├── aria-allowed-attr.js │ │ ├── aria-allowed-role.js │ │ ├── aria-braille-equivalent.js │ │ ├── aria-command-name.js │ │ ├── aria-conditional-attr.js │ │ ├── aria-dialog-name.js │ │ ├── aria-input-field-name.js │ │ ├── aria-meter-name.js │ │ ├── aria-progressbar-name.js │ │ ├── aria-prohibited-attr.js │ │ ├── aria-required-attr.js │ │ ├── aria-roledescription.js │ │ ├── aria-roles.js │ │ ├── aria-tab-name.js │ │ ├── aria-text.js │ │ ├── aria-toggle-field-name.js │ │ ├── aria-tooltip-name.js │ │ ├── aria-treeitem-name.js │ │ ├── aria-valid-attr-value.js │ │ ├── aria-valid-attr.js │ │ ├── autocomplete-valid.js │ │ ├── button-name.js │ │ ├── definition-list.js │ │ ├── empty-heading.js │ │ ├── empty-table-header.js │ │ ├── frame-title.js │ │ ├── html-has-lang.js │ │ ├── html-lang-valid.js │ │ ├── image-alt.js │ │ ├── input-button-name.js │ │ ├── input-image-alt.js │ │ ├── label.js │ │ ├── link-name.js │ │ ├── list.js │ │ ├── meta-refresh-no-exceptions.js │ │ ├── meta-refresh.js │ │ ├── meta-viewport.js │ │ ├── nested-interactive.js │ │ ├── object-alt.js │ │ ├── presentation-role-conflict.js │ │ ├── role-img-alt.js │ │ ├── select-name.js │ │ ├── summary-name.js │ │ ├── svg-img-alt.js │ │ ├── tabindex.js │ │ ├── table-duplicate-name.js │ │ └── valid-lang.js │ ├── karma.conf.js │ ├── mock/ │ │ └── frames/ │ │ ├── context.html │ │ ├── e2e.html │ │ ├── frame-frame.html │ │ ├── frame1.html │ │ ├── nested0.html │ │ ├── nested1.html │ │ ├── nested2.html │ │ ├── noHtml-config.html │ │ ├── nocode.html │ │ ├── results-timeout.html │ │ ├── rule-error.html │ │ ├── test.html │ │ ├── throwing.html │ │ ├── with-echo-axe.html │ │ ├── with-echo.html │ │ └── zombie-frame.html │ ├── node/ │ │ ├── jsdom.js │ │ ├── node.js │ │ └── package.json │ ├── playground.html │ ├── rule-matches/ │ │ ├── aria-allowed-attr-matches.js │ │ ├── aria-allowed-role-matches.js │ │ ├── aria-has-attr-matches.js │ │ ├── aria-hidden-focus-matches.js │ │ ├── aria-required-children-matches.js │ │ ├── aria-required-parent-matches.js │ │ ├── autocomplete-matches.js │ │ ├── color-contrast-matches.js │ │ ├── data-table-matches.js │ │ ├── duplicate-id-active-matches.js │ │ ├── duplicate-id-aria-matches.js │ │ ├── duplicate-id-misc-matches.js │ │ ├── frame-focusable-content-matches.js │ │ ├── frame-title-has-text-matches.js │ │ ├── has-implicit-chromium-role-matches.js │ │ ├── heading-matches.js │ │ ├── html-namespace-matches.js │ │ ├── html-xml-lang-mismatch.js │ │ ├── identical-links-same-purpose-matches.js │ │ ├── inserted-into-focus-order-matches.js │ │ ├── is-initiator-matches.js │ │ ├── is-visible-matches.js │ │ ├── is-visible-on-screen-matches.js │ │ ├── label-content-name-mismatch-matches.js │ │ ├── label-matches.js │ │ ├── landmark-has-body-context.js │ │ ├── landmark-unique-matches.js │ │ ├── layout-table-matches.js │ │ ├── link-in-text-block-matches.js │ │ ├── nested-interactive-matches.js │ │ ├── no-autoplay-audio-matches.js │ │ ├── no-empty-role-matches.js │ │ ├── no-explicit-name-required-matches.js │ │ ├── no-naming-method-matches.js │ │ ├── no-negative-tabindex.js │ │ ├── no-role-matches.js │ │ ├── object-is-loaded-matches.js │ │ ├── p-as-heading-matches.js │ │ ├── scrollable-region-focusable-matches.js │ │ ├── skip-link-matches.js │ │ ├── summary-interactive-matches.js │ │ ├── svg-namespace-matches.js │ │ ├── table-or-grid-role-matches.js │ │ └── widget-not-inline-matches.js │ ├── test-locales.js │ ├── test-rule-help-version.js │ ├── test-virtual-rules.js │ └── testutils.js ├── tsconfig.json └── typings/ └── axe-core/ └── axe-core-tests.ts ================================================ FILE CONTENTS ================================================ ================================================ FILE: .babelrc ================================================ { "presets": ["@babel/preset-env"], "plugins": [ [ "@babel/plugin-proposal-object-rest-spread", { "loose": true } ] ] } ================================================ FILE: .editorconfig ================================================ # EditorConfig is awesome: http://EditorConfig.org # top-most EditorConfig file root = true [*] end_of_line = lf insert_final_newline = true charset = utf-8 indent_style = tab trim_trailing_whitespace = true [*.json] indent_style = space indent_size = 2 [*.yml] indent_style = space indent_size = 2 [*.md] indent_style = space indent_size = 2 ================================================ FILE: .gitattributes ================================================ .npmignore merge=ours ================================================ FILE: .github/CODEOWNERS ================================================ # Reference - https://help.github.com/articles/about-code-owners/ # Complete repo * @dequelabs/axe-codeowners # Localisation locales/ja.json @mlca11y/mlca11y @dequelabs/axe-codeowners ================================================ FILE: .github/ISSUE_TEMPLATE/config.yml ================================================ contact_links: - name: Join the axe Slack Community url: https://accessibility.deque.com/axe-community about: Connect with other people passionate about digital accessibility and axe tools. ================================================ FILE: .github/ISSUE_TEMPLATE/documentation.yml ================================================ name: Improve our documentation description: Report issues in our documentation or things we could document better. labels: ['docs', 'ungroomed'] body: - type: markdown attributes: value: | Documentation reports can be made for axe-core, [axe Extension](https://www.deque.com/axe/browser-extensions/), and [axe Linter](https://marketplace.visualstudio.com/items?itemName=deque-systems.vscode-axe-linter). If you have a documentation report for one of our npm integrations (e.g. `@axe-core/webdriverjs`), please open an issue in https://github.com/dequelabs/axe-core-npm. - type: dropdown id: product attributes: label: Product description: Which product is the documentation report for? options: - axe-core - axe Extension - axe Linter validations: required: true - type: textarea id: description attributes: label: Description validations: required: true ================================================ FILE: .github/ISSUE_TEMPLATE/feature-request.yml ================================================ name: Request a feature description: Request an enhancement, improvement, or new rule. labels: ['feat', 'ungroomed'] body: - type: markdown attributes: value: | Feature requests can be made for axe-core, [axe Extension](https://www.deque.com/axe/browser-extensions/), and [axe Linter](https://marketplace.visualstudio.com/items?itemName=deque-systems.vscode-axe-linter). If you have a feature request for one of our npm integrations (e.g. `@axe-core/webdriverjs`), please open an issue in https://github.com/dequelabs/axe-core-npm. - type: dropdown id: product attributes: label: Product description: Which product is the feature for? options: - axe-core - axe Extension - axe Linter validations: required: true - type: textarea id: description attributes: label: Feature Description description: What do you wish the product did? If the feature is about adding a new rule to axe-core, please follow our [rule template](https://github.com/dequelabs/axe-core/blob/develop/doc/rule-proposal.md). validations: required: true ================================================ FILE: .github/ISSUE_TEMPLATE/possible-bug.yml ================================================ name: Report an issue description: Report a bug or an issue that you've encountered. labels: ['ungroomed'] body: - type: markdown attributes: value: | Thanks for reporting an issue to one of our products. Please provide all necessary information to reproduce the issue. Without adequate details, your issue may be closed without investigation. Issues can be reported for axe-core, [axe Extension](https://www.deque.com/axe/browser-extensions/), and [axe Linter](https://marketplace.visualstudio.com/items?itemName=deque-systems.vscode-axe-linter). If you're having an issue with one of our npm integrations (e.g. `@axe-core/webdriverjs`), please open an issue in https://github.com/dequelabs/axe-core-npm. - type: dropdown id: product attributes: label: Product description: Which product did you encounter the issue? options: - axe-core - axe Extension - axe Linter validations: required: true - type: input id: version attributes: label: Product Version description: For axe-core use `axe.version`. For axe Extension go to the settings screen in the extension. For axe Linter look at the installed extension list for the version. - type: checkboxes id: latest-axe attributes: label: Latest Version options: - label: I have tested the issue with the latest version of the product required: true - type: textarea id: description attributes: label: Issue Description description: Please include a description of the issue and a page or code snippet where it can be reproduced. value: | #### Expectation Describe what you expected the product to do. #### Actual Describe what the product actually does. #### How to Reproduce Provide a code sample or link to a webpage that reproduces the issue. Without this, your issue may be closed without investigation. #### Additional context Any thing else we should know about the issue? validations: required: true ================================================ FILE: .github/ISSUE_TEMPLATE/question.yaml ================================================ name: Ask a question description: General questions for us, the product, or why things are the way they are. labels: ['question', 'ungroomed'] body: - type: markdown attributes: value: | Questions can be asked for axe-core, [axe Extension](https://www.deque.com/axe/browser-extensions/), and [axe Linter](https://marketplace.visualstudio.com/items?itemName=deque-systems.vscode-axe-linter). If you have a question about one of our npm integrations (e.g. `@axe-core/webdriverjs`), please open an issue in https://github.com/dequelabs/axe-core-npm. - type: dropdown id: product attributes: label: Product description: Which product is the question for? options: - axe-core - axe Extension - axe Linter validations: required: true - type: textarea id: question attributes: label: Question validations: required: true ================================================ FILE: .github/PULL_REQUEST_TEMPLATE.md ================================================ << Describe the changes >> Closes: ================================================ FILE: .github/actions/install-deps/action.yml ================================================ name: 'Install Dependencies' description: 'Install OS and Project dependencies' inputs: node-version: description: 'Node.js version to install' required: false start-xvfb: description: 'If provided, this is the display number to run xvfb on. Should be in `:N` format, e.g., `:99`.' required: false nightly: description: 'If true, installs the nightly versions of browsers.' required: false outputs: chrome-path: description: 'Path to the installed Chrome binary' value: ${{ steps.setup-chrome.outputs.chrome-path }} firefox-path: description: 'Path to the installed Firefox binary' value: ${{ steps.setup-firefox.outputs.firefox-path }} chromedriver-path: description: 'Path to the installed ChromeDriver binary' value: ${{ steps.setup-chrome.outputs.chromedriver-path }} chrome-version: description: 'Version of the installed Chrome binary' value: ${{ steps.setup-chrome.outputs.chrome-version }} chromedriver-version: description: 'Version of the installed ChromeDriver binary' value: ${{ steps.setup-chrome.outputs.chromedriver-version }} firefox-version: description: 'Version of the installed Firefox binary' value: ${{ steps.setup-firefox.outputs.firefox-version }} runs: using: 'composite' steps: - name: Setup Node.js uses: actions/setup-node@2028fbc5c25fe9cf00d9f06a71cc4710d4507903 # v6.0.0 with: registry-url: 'https://registry.npmjs.org' node-version: ${{ inputs.node-version }} node-version-file: ${{ inputs.node-version == '' && '.nvmrc' || '' }} cache: npm - name: Fix Chrome Sandbox Permissions shell: bash run: | sudo chown root:root /opt/google/chrome/chrome-sandbox sudo chmod 4755 /opt/google/chrome/chrome-sandbox - name: Install Xvfb shell: bash if: ${{ inputs.start-xvfb }} run: | sudo apt-get update sudo apt-get install -y xvfb x11-xserver-utils - name: Install Google Chrome for Testing id: setup-chrome uses: browser-actions/setup-chrome@b94431e051d1c52dcbe9a7092a4f10f827795416 # v2.1.0 with: # @see https://github.com/dequelabs/axe-core/issues/5027 chrome-version: ${{ inputs.nightly == 'true' && 'beta' || 145 }} install-chromedriver: true install-dependencies: true - name: Install Firefox id: setup-firefox uses: browser-actions/setup-firefox@5914774dda97099441f02628f8d46411fcfbd208 # v1.7.0 with: firefox-version: ${{ inputs.nightly == 'true' && 'latest-nightly' || 'latest' }} - name: Install Project Dependencies shell: bash run: npm ci - name: Start Xvfb if: ${{ inputs.start-xvfb }} env: DISPLAY: ${{ inputs.start-xvfb }} shell: bash # This is the same resolution as what CircleCI used. # Maintaining it for consistency between the environments # since something may be resolution dependent. run: Xvfb "$DISPLAY" -screen 0 1280x1024x24 & ================================================ FILE: .github/axe-linter.yml ================================================ exclude: - CHANGELOG.md - test/**/* ================================================ FILE: .github/bin/determine-version.sh ================================================ #!/usr/bin/env bash set -eo pipefail echo "::group::Determining new prerelease version" NAME=$(npm pkg get name | tr -d '"') LATEST_VERSION=$(npm pkg get version | tr -d '"') SHORT_SHA=$(echo "${GITHUB_SHA}" | cut -c1-7) NEW_VERSION="$LATEST_VERSION-canary.${SHORT_SHA}" echo "Latest version in package.json: $LATEST_VERSION" echo "New prerelease version: $NEW_VERSION" echo "version=$NEW_VERSION" >> "$GITHUB_OUTPUT" echo "name=$NAME" >> "$GITHUB_OUTPUT" echo "::endgroup::" ================================================ FILE: .github/bin/validate-npm-deploy.sh ================================================ #!/usr/bin/env bash set -eo pipefail if [ -z "$PACKAGE_NAME" ] || [ -z "$VERSION" ]; then echo "::error::PACKAGE_NAME and VERSION environment variables must be set." exit 1 fi NPM_ROOT_PATH=$(npm root -g) npm install -g "${PACKAGE_NAME}@${VERSION}" || { echo "::error::✗ Failed to install package: ${PACKAGE_NAME}@${VERSION}" exit 1 } cd "$NPM_ROOT_PATH" || { echo "::error::✗ Failed to change directory to global npm root: $NPM_ROOT_PATH" exit 1 } node -pe "window={}; document={}; require('${PACKAGE_NAME}');" || { echo "::error::✗ Failed to import CommonJS module for package: ${PACKAGE_NAME}" exit 1 } cd "${NPM_ROOT_PATH}/${PACKAGE_NAME}" || { echo "::error::✗ Failed to change directory to package path: ${NPM_ROOT_PATH}/${PACKAGE_NAME}" exit 1 } types=$(node -pe "require('./package.json').types") if [ "$types" == "undefined" ] then types=$(node -pe "require('./package.json').typings") fi if [ "$types" != "undefined" ] && [ ! -f "$types" ] then echo "::error::The types file is missing" exit 1; fi echo "Types file '$types' is present in the package" ================================================ FILE: .github/bin/validate-package.mjs ================================================ #!/usr/bin/env node /** * @fileoverview Validates the package before publishing. * This script performs several checks to ensure the package * is correctly set up, including: * - Verifying the existence of files listed in `package.json`'s `files` array. * - Ensuring the package can be imported using both ESM `import` and CommonJS `require()`. * - Validating Subresource Integrity (SRI) hashes for the built files. * * The script generates a summary report compatible with * GitHub Actions, providing detailed feedback on each * validation step. * * Running this script locally has a few implications to be * aware of: * 1. It links and unlinks the package globally. So this * could impact other workspaces where current links are used. * 2. To test the step summary, set the `GITHUB_STEP_SUMMARY` * environment variable to a file path. If this file does not * exist, it will be created. */ import { resolve } from 'node:path'; import { fileURLToPath } from 'node:url'; import { createRequire } from 'node:module'; import { access, appendFile, readFile } from 'node:fs/promises'; import { execSync } from 'node:child_process'; import pkg from '../../package.json' with { type: 'json' }; const isDebug = process.env.DEBUG === 'true'; const repoRoot = resolve(import.meta.dirname, '..', '..'); /** * Start the exit code at 0 for a successful run. If any checks * fail, we increment by 1 for each failure. When every check is done, * we exit with the final exit code. * * This means our exit code informs us of how many failures happened. * * For anyone unfamiliar with exit codes in shell programs, * an exit code of `0` means success, and any non-zero exit code * means failure. * * Special note as well, in theory this _could_ go above `255`, * causing the actual exit code to wrap around back to `0` and * keep counting. But, if we have that many checks in here down * the road then all the validation will need a major refactor. */ let exitCode = 0; const missing = []; const summaryFile = process.env.GITHUB_STEP_SUMMARY; let summary = `# Package Validation
Package Name
${pkg.name}
Package Version
${pkg.version}
License
${pkg.license}
`; console.group('Package Information'); console.log('Name:', pkg.name); console.log('Version:', pkg.version); console.log('License:', pkg.license); console.groupEnd(); /** * Checks if a file or folder exists on the filesystem. * * @param {string} path - The path to check (relative to repo root) * @returns {Promise} True if the path exists, false otherwise */ const exists = async path => { const absolutePath = resolve(repoRoot, path); try { await access(absolutePath); return true; } catch { return false; } }; /** * Appends text to the GitHub Actions step summary file if it * exists. This is mostly useful for local testing where the * summary file may not be set. However if we want to set it * for testing, we can. * * Since we build the summary in chunks, this function * appends the current summary and then clears it for the * next section. * * @param {string} text - The text to append to the summary file * @returns {Promise} */ const appendToSummaryFile = async text => { if (summaryFile) { await appendFile(summaryFile, text); summary = ''; } }; /** * Verifies that all files and folders listed in the `files` * array of `package.json` exist in the repository. */ const fileExistenceCheck = async () => { summary += ` \n## File Existence Check The following results table shows the status of files and folders listed in the \`files\` array of \`package.json\`. > [!NOTE] > This check only validates the existence of files and folders > defined. It does not validate the contents. Thus a folder > could exist but be empty and still pass this check. Or > a file could exist but have incorrect syntax. | File | Status |\n|------|--------| `; console.log('Checking for existence of package files:'); for (const file of pkg.files) { if (await exists(file)) { console.info(`✓ ${file}`); summary += `| \`${file}\` | ✓ Found |\n`; } else { console.error(`✗ ${file}`); summary += `| \`${file}\` | ✗ Missing |\n`; missing.push(file); } } await appendToSummaryFile(summary); if (missing.length > 0) { await appendToSummaryFile( `\n**ERROR: Missing files: ${missing.join(', ')}**\n` ); console.error(`::error::Missing files: ${missing.join(', ')}`); exitCode++; } }; /** * Validates that the main package file can be loaded via * CommonJS require. This ensures backward compatibility * for projects using CommonJS. */ const validateCommonJS = async () => { summary += `\n## CommonJS Compatibility Check This check validates that the main package file can be loaded using CommonJS \`require()\`, ensuring backward compatibility. | File | Status | Version |\n|------|--------|--------| `; const require = createRequire(import.meta.url); console.log('Validating CommonJS compatibility:'); try { const axe = require(`${pkg.name}`); if (!axe || typeof axe !== 'object') { throw new Error('Module did not export an object'); } if (!axe.version) { throw new Error('Missing version property'); } console.info(`✓ ${pkg.name} (CommonJS)`); summary += `| \`${pkg.name}\` | ✓ CommonJS Compatible | ${axe.version} |\n`; } catch (error) { console.error(`✗ ${pkg.name} (CommonJS):`, error.message); summary += `| \`${pkg.name}\` | ✗ CommonJS Failed | Not Found |\n`; summary += `\n\`\`\`\n${error.message}\n\`\`\`\n`; exitCode++; } await appendToSummaryFile(summary); }; /** * Validates that the package and all files listed in the * `files` array of `package.json` can be imported using * ESM `import` statements. */ const validateImportable = async () => { summary += `\n## Importable Check This check attempts to import the package. As well as all defined files in the \`files\` array of \`package.json\`. > [!NOTE] > This check fails anything that resolves to \`node_modules\`, > this is because \`axe-core\` should be linked before > this is called. When \`exports\` can be added to the > package definition, then we can self reference imports and > the link will no longer be required. | File | Status | Version |\n|------|--------|--------| `; const importTargets = [...pkg.files.map(file => `${pkg.name}/${file}`)]; let anyCaught = false; console.log('Validating package files are importable:'); try { const axe = await import(pkg.name); console.info(`✓ ${pkg.name}`); if (!axe.default?.version) { throw new Error('Missing version property'); } summary += `| \`${pkg.name}\` | ✓ Importable | ${axe.default.version} |\n`; } catch { console.error(`✗ ${pkg.name}`); summary += `| \`${pkg.name}\` | ✗ Not Importable | Not Found |\n`; anyCaught = true; } for (const target of importTargets) { // Skip things that can't be imported directly // One day we can hopefully import anything as bytes to validate. // Ref: https://github.com/tc39/proposal-import-bytes if ( target.endsWith('.txt') || target.endsWith('/') || target.endsWith('.d.ts') ) { continue; } // `import.meta.resolve` is used here to determine // where the import would be resolved from, following // any symlinks. Since this package is linked, it // should never have `node_modules` in the resolved // path. It *could* happen if a dev is writing code // within a parent folder named as such, but that is // unsafe anyways. // ------------------------------------------------- // If this is ever setup to run in the post-deploy // test, then this will cause issues as that runs // from this folder specifically. if (import.meta.resolve(target).includes('node_modules')) { exitCode++; summary += `| \`${target}\` | ✗ Resolves to node_modules |\n`; console.error(`✗ ${target} resolves to node_modules`); continue; } try { let version = ''; if (target.endsWith('.json')) { const data = await import(target, { with: { type: 'json' } }); version = Object.keys(data.default).at(-1); } else { const axe = await import(target); if (!axe.default?.version) { throw new Error('Missing version property'); } version = axe.default.version; } console.info(`✓ ${target}`); summary += `| \`${target}\` | ✓ Importable | ${version} |\n`; } catch (error) { console.error(`✗ ${target}`); summary += `| \`${target}\` | ✗ Not Importable | Not Found |\n`; summary += `\n\`\`\`\n${error.message}\n\`\`\`\n`; anyCaught = true; } } if (anyCaught) { exitCode++; } await appendToSummaryFile(summary); }; /** * When a PR targets `master` or a `release-*` branch, * or these branches are pushed to, we run SRI validation. * Otherwise, it is skipped since the SRI hashes are only * updated when releasing. * * The history file is deprecated. However, until it is removed * we should be prudent and continue to validate it. */ const validateSriHashes = async () => { const currentBranch = process.env.GITHUB_REF_NAME || process.env.GITHUB_HEAD_REF || ''; if (!/^release-.+/.test(currentBranch) && currentBranch !== 'master') { console.log(`Skipping SRI validation (current branch: ${currentBranch})`); return; } summary += `\n## Subresource Integrity Check This check validates the current build against the SRI hash for the version defined in \`sri-history.json\`. | File | Status | |------|--------| `; const sriHistory = await import(`${pkg.name}/sri-history.json`, { with: { type: 'json' } }); const expectedSri = sriHistory.default[pkg.version]; // calculate the SRI hash for `axe.js` and `axe.min.js` // Using `sri-toolbox` as that is what is used in the build process const { generate } = await import('sri-toolbox'); const filesToCheck = [ { name: 'axe.js', path: fileURLToPath(import.meta.resolve(`${pkg.name}/axe.js`)) }, { name: 'axe.min.js', path: fileURLToPath(import.meta.resolve(`${pkg.name}/axe.min.js`)) } ]; const mismatches = []; for (const file of filesToCheck) { const calculatedSri = generate( { algorithms: ['sha256'] }, await readFile(file.path) ); console.log(`Expected SRI for ${file.name}:`, expectedSri[file.name]); console.log(`Calculated SRI for ${file.name}:`, calculatedSri); if (calculatedSri !== expectedSri[file.name]) { console.error(`✗ ${file.name}`); summary += `| \`${file.name}\` | ✗ Invalid SRI |\n`; mismatches.push({ name: file.name, expected: expectedSri[file.name], calculated: calculatedSri }); continue; } console.info(`✓ ${file.name}`); summary += `| \`${file.name}\` | ✓ Valid SRI |\n`; } if (mismatches.length > 0) { summary += `\n### SRI Mismatches\n\n`; for (const mismatch of mismatches) { summary += `**${mismatch.name}:**\n`; summary += `- Expected: \`${mismatch.expected}\`\n`; summary += `- Calculated: \`${mismatch.calculated}\`\n\n`; } exitCode++; } await appendToSummaryFile(summary); }; // Start running checks that don't require linking first. await fileExistenceCheck(); /** * @type {import('child_process').ExecSyncOptionsWithBufferEncoding} */ const execOptions = { cwd: repoRoot, stdio: isDebug ? 'inherit' : 'pipe', timeout: 200000 }; console.log('Creating npm link for package validation...'); try { // Link the package globally, then update the package // internally to use the linked version. // This is needed because we don't have `exports` defined // yet, so self referencing imports won't work. // We also have a circular dependency on the package. // That means if we try to resolve the import without // linking, it will resolve the version in `node_modules` // from npm. execSync('npm link', execOptions); execSync(`npm link ${pkg.name}`, execOptions); // Run any checks that require the package to reference itself. await validateCommonJS(); await validateImportable(); await validateSriHashes(); } catch (error) { console.error('Failed to create npm link:', error.message); await appendToSummaryFile(` ## Failed to create npm link
Click to expand error details \n\`\`\`\n${error.message}\n\`\`\`\n
This failure prevented running critical validation checks. Therefore the entire validation has failed. `); console.error(`Failed to create npm link: ${error.message}`); exitCode++; } console.log('Removing npm link...'); try { execSync(`npm unlink ${pkg.name}`, execOptions); execSync('npm unlink -g', execOptions); } catch (error) { // Not a hard failure if unlinking fails since all these // checks are last. As long as they completed fine, // validation is acceptable. // This is more for when running locally to test if // something goes wrong. As the developer's machine state // is impacted and they need to know about it. console.error('Failed to remove npm link:', error.message); } process.exit(exitCode); ================================================ FILE: .github/bin/wait-for-npm-ready.sh ================================================ #!/usr/bin/env bash set -eo pipefail if [ -z "$VERSION" ] || [ -z "$PACKAGE_NAME" ]; then echo "✗ ERROR: VERSION and PACKAGE_NAME environment variables must be set." exit 1 fi SLEEP_SECONDS=${SLEEP_SECONDS:-10} MAX_ATTEMPTS=${MAX_ATTEMPTS:-30} echo "::group::Waiting for ${PACKAGE_NAME}@${VERSION} to be available on npm registry..." for i in $(seq 1 "$MAX_ATTEMPTS"); do echo "Attempt $i of $MAX_ATTEMPTS..." if npm view "${PACKAGE_NAME}@${VERSION}" version > /dev/null 2>&1; then PUBLISHED_VERSION=$(npm view "${PACKAGE_NAME}@${VERSION}" version) echo "✓ Package ${PACKAGE_NAME}@${PUBLISHED_VERSION} is now available on npm!" echo "::endgroup::" exit 0 fi if [ "$i" -lt "$MAX_ATTEMPTS" ]; then echo "Package not yet available, waiting ${SLEEP_SECONDS} seconds..." sleep "$SLEEP_SECONDS" fi done echo "✗ Timeout: Package ${PACKAGE_NAME}@${VERSION} not available after $((MAX_ATTEMPTS * SLEEP_SECONDS)) seconds" echo "::endgroup::" exit 1 ================================================ FILE: .github/bin/wait-for-workflow-success.sh ================================================ #!/usr/bin/env bash # This script waits for a specified GitHub Actions workflow to complete successfully. # Debug mode can be enabled by setting the DEBUG environment variable to "true". # Exit codes are as follows: # 0 - Workflow completed successfully # 1 - Workflow completed with failure # 2 - Missing required tools on the host system # 3 - Missing required environment variables for configuration # 20 - Timeout waiting for workflow to complete set -eo pipefail if ! command -v jq &> /dev/null; then echo "::error::jq is not installed. Please install jq to use this script." exit 2 fi if ! command -v gh &> /dev/null; then echo "::error::GitHub CLI (gh) is not installed. Please install gh to use this script." exit 2 fi if [ -z "$REPOSITORY" ]; then echo "::error::REPOSITORY environment variable must be set." exit 3 fi if [ -z "$SHA" ]; then echo "::error::SHA environment variable must be set." exit 3 fi if [ -z "$WORKFLOW_NAME" ]; then echo "::error::WORKFLOW_NAME environment variable must be set." exit 3 fi if [ -z "$BRANCH" ]; then echo "::error::BRANCH environment variable must be set." exit 3 fi # When running locally for testing, this might be forgotten to get set. # Create a temp file just so there is something to write to that will get thrown away. if [ -z "$GITHUB_STEP_SUMMARY" ]; then GITHUB_STEP_SUMMARY=$(mktemp) fi echo "Waiting for '$WORKFLOW_NAME' workflow to complete for commit $SHA" # If not provided, default to 5 minutes for the job runner to time out. TIMEOUT_MINUTES=${TIMEOUT_MINUTES:-5} # Round down if given a fractional number by just removing the decimal portion. TIMEOUT_MINUTES=${TIMEOUT_MINUTES%.*} sleep_seconds=30 max_attempts=$(( (TIMEOUT_MINUTES * 60) / sleep_seconds )) attempt=0 # We *could* do `status=success` as a query parameter. But then we lose visibility # into "in-progress" for debugging purposes to at least know if it found a run # while waiting. # Ref: https://docs.github.com/en/rest/actions/workflow-runs?apiVersion=2022-11-28#list-workflow-runs-for-a-repository api_url="repos/$REPOSITORY/actions/runs?head_sha=$SHA&branch=$BRANCH&exclude_pull_requests=true&event=push" # This jq filter can seem complicated. So here is the breakdown: # 1. `.workflow_runs` - Get the array of workflow runs from the API response # 2. `sort_by(.created_at) | reverse` - Sort the runs by creation date in descending order. Since the API has no guaranteed order. # 3. `[.[] | select(.name == "'"$WORKFLOW_NAME"'")][0]` - Filter the runs to only include those with the specified workflow name. Then take the first one (most recent) # 4. `{status: .status, conclusion: .conclusion}` - Extract only the status and conclusion fields. Since we know this is the most recent run, we only care about these fields later. # 5. `select(. != null)` - Ensure that we only get a result if there is a matching workflow run jq_filter='.workflow_runs | sort_by(.created_at) | reverse | [.[] | select(.name == "'"$WORKFLOW_NAME"'")][0] | {status: .status, conclusion: .conclusion} | select(. != null)' cat >> "$GITHUB_STEP_SUMMARY" <> "$GITHUB_STEP_SUMMARY" } while [ "$attempt" -lt "$max_attempts" ]; do # Redirect errors to /dev/null to avoid unusable data in the variable in case of failure. # If we seem to be having issues in CI later, it would be valuable to setup debugging to log to $GITHUB_STEP_SUMMARY. workflow_data=$(gh api "$api_url" --jq "$jq_filter" 2>"$log_output" || echo "") if [ -z "$workflow_data" ]; then echo "Attempt $((attempt + 1))/$max_attempts - Workflow run not found yet" else status=$(echo "$workflow_data" | jq -r '.status') conclusion=$(echo "$workflow_data" | jq -r '.conclusion') echo "Attempt $((attempt + 1))/$max_attempts - Status: $status, Conclusion: $conclusion" if [ "$status" = "completed" ]; then # Write the result to the summary file function writeResultToSummary() { cat >> "$GITHUB_STEP_SUMMARY" <> "$GITHUB_STEP_SUMMARY" < [!TIP] > Re-running this workflow with debug mode enabled will capture API error logs to help diagnose issues. > [!WARNING] > This can typically indicate that GitHub Action runners are experiencing delays. > Please check the [GitHub Status Page](https://www.githubstatus.com/) for any ongoing incidents. > If the status is normal, or if it already is, wait a little bit before re-running the workflow. > [!CAUTION] > If another commit is already deployed, then do *not* re-run this deployment workflow. > Re-running this would cause an older commit to be the next tag. > If multiple deployments are failed in a row, then re-run them sequentially as the incident is resolved. EOF writeLogToSummary echo "::error::Timeout waiting for '$WORKFLOW_NAME' workflow to complete" exit 20 ================================================ FILE: .github/dependabot.yml ================================================ version: 2 updates: - package-ecosystem: 'github-actions' directory: '/' schedule: interval: 'monthly' open-pull-requests-limit: 10 commit-message: prefix: 'chore' groups: # Any updates not caught by the group config will get individual PRs gha-low-risk: update-types: - 'minor' - 'patch' cooldown: default-days: 7 - package-ecosystem: 'npm' directory: '/' schedule: interval: 'monthly' open-pull-requests-limit: 10 commit-message: prefix: 'chore' ignore: # Prevent updates to ESM-only versions - dependency-name: 'chalk' versions: ['>=5.0.0'] - dependency-name: 'execa' versions: ['>=6.0.0'] - dependency-name: 'inquirer' versions: ['>=9.0.0'] - dependency-name: 'chai' versions: ['>=5.0.0'] - dependency-name: 'conventional-commits-parser' versions: ['>=6.0.0'] # Prevent Webpack error caused by v0.11+ of esbuild # @see https://github.com/dequelabs/axe-core/issues/3771 - dependency-name: 'esbuild' versions: ['>=0.11.0'] # Prevent colorjs.io issue caused by >v0.4.3 # @see https://github.com/dequelabs/axe-core/issues/4428 - dependency-name: 'colorjs.io' versions: ['>0.4.3'] # Still need to support node 18 in our tests - dependency-name: 'glob' versions: ['>=11.0.0'] # Use node 4 types for backward compatibility - dependency-name: '@types/node' versions: ['>=5.0.0'] # Breaking change that we need to handle in its own pr first # @see https://github.com/dequelabs/axe-core/pull/4264 - dependency-name: 'css-selector-parser' versions: ['>=2.0.0'] groups: # Any updates not caught by the group config will get individual PRs npm-low-risk: update-types: - 'minor' - 'patch' cooldown: default-days: 7 ================================================ FILE: .github/review.yml ================================================ # Require that merge commits have security review performed on them. review_merges: true approve_button_tooltip: No security or PR title concerns decline_button_tooltip: Found security or PR title concerns pending_description: Pull request not yet approved for security and a correct PR title pending_summary: > Awaiting security and PR title review. To approve this pull request, please click the "Approve" button above. You may **not** review your own Pull Request. approved_description: Pull request has been reviewed and approved for security and a correct PR title approved_summary: Pull request has been approved for security and having an incorrect PR title by @${approver}. declined_description: Pull request contains security concerns or has an incorrect PR title declined_summary: Commit was reviewed and declined for security and/or an incorrect PR title by @${approver}. ================================================ FILE: .github/workflows/deploy.yml ================================================ # Do not rename this file. The name "deploy.yml" is known to # npm for trusted OIDC publishing. name: Deploy on: # Run on push and not `workflow_run` after tests finish. # Specifically because `workflow_run` only runs from the context # of the default branch, regardless of which branch triggered the tests. # That means no non-default branches could deploy. push: branches: - master - develop concurrency: group: deploy/${{ github.ref_name }} cancel-in-progress: false permissions: contents: read jobs: # Since we can't run against `workflow_run`, we have to # wait for for the Tests to succeed first before any # processing can happen. wait-for-tests: name: Wait for Tests to Pass if: github.repository_owner == 'dequelabs' runs-on: ubuntu-24.04 permissions: contents: read actions: read statuses: read timeout-minutes: 15 steps: - &checkout name: Checkout repository timeout-minutes: 2 uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0 with: persist-credentials: false - name: Wait for Tests workflow to complete timeout-minutes: 13 env: SHA: ${{ github.sha }} REPOSITORY: ${{ github.repository }} BRANCH: ${{ github.ref_name }} WORKFLOW_NAME: Tests DEBUG: ${{ runner.debug == '1' }} # One minute less than the job timeout to allow for the script to do cleanup work. TIMEOUT_MINUTES: 12 GH_TOKEN: ${{ github.token }} run: ./.github/bin/wait-for-workflow-success.sh deploy-next: name: Deploy "next" to npm needs: wait-for-tests if: ${{ github.ref_name == 'develop' }} environment: name: registry.npmjs.org permissions: contents: read id-token: write # Required for OIDC runs-on: ubuntu-24.04 outputs: version: ${{ steps.determine-version.outputs.version }} packageName: ${{ steps.determine-version.outputs.name }} steps: - *checkout - &setup-node name: Setup NodeJS uses: actions/setup-node@2028fbc5c25fe9cf00d9f06a71cc4710d4507903 # v6.0.0 with: registry-url: 'https://registry.npmjs.org' node-version-file: .nvmrc cache: npm - &install-project-deps name: Install Project Dependencies shell: bash run: npm ci - &build name: Build run: | npm run prepare npm run build - name: Determine prerelease version id: determine-version run: ./.github/bin/determine-version.sh - name: Bump version env: NEW_VERSION: ${{ steps.determine-version.outputs.version }} run: npm version "$NEW_VERSION" --no-git-tag-version --ignore-scripts - &validate-package name: Validate package is consumable env: # Ref: https://docs.github.com/en/actions/reference/workflows-and-actions/contexts#runner-context # Linting shows this context might be invalid, but it shouldn't be per docs. # Probably something missing in the schema. DEBUG: ${{ runner.debug == '1' }} run: node .github/bin/validate-package.mjs - name: Publish "next" version to npm run: npm publish --tag=next validate-next-deploy: name: Validate Next Deployment needs: deploy-next runs-on: ubuntu-24.04 steps: - *checkout - *setup-node # In theory since this is a new job now, by the time # this would kick off the package should be available. # But, to be safe in case of delays in propagation, # we'll implement a retry mechanism. - name: Wait for package to be available on npm env: VERSION: ${{ needs.deploy-next.outputs.version }} PACKAGE_NAME: ${{ needs.deploy-next.outputs.packageName }} run: ./.github/bin/wait-for-npm-ready.sh - name: Validate installation of "next" version env: PACKAGE_NAME: ${{ needs.deploy-next.outputs.packageName }} VERSION: ${{ needs.deploy-next.outputs.version }} run: ./.github/bin/validate-npm-deploy.sh prod-hold: name: Await approval to deploy to production needs: wait-for-tests if: ${{ github.ref_name == 'master' }} environment: name: production-hold runs-on: ubuntu-24.04 steps: - name: Awaiting approval to deploy to production run: echo "Approval granted to proceed to production deployment." prod-deploy: name: Deploy stable to npm needs: prod-hold if: ${{ needs.prod-hold.result == 'success' }} environment: name: registry.npmjs.org permissions: contents: read id-token: write # Required for OIDC outputs: version: ${{ steps.get-data.outputs.version }} packageName: ${{ steps.get-data.outputs.name }} runs-on: ubuntu-24.04 steps: - *checkout - *setup-node - *install-project-deps - *build - *validate-package - name: Publish stable version to npm run: npm publish - name: Get published package data id: get-data run: | VERSION=$(npm pkg get version | tr -d '"') NAME=$(npm pkg get name | tr -d '"') echo "version=$VERSION" >> $GITHUB_OUTPUT echo "name=$NAME" >> $GITHUB_OUTPUT create-github-release: name: Create GitHub Release needs: prod-deploy runs-on: ubuntu-24.04 permissions: contents: write # Required to create releases steps: - *checkout - name: Install Release Helper run: go install gopkg.in/aktau/github-release.v0@latest - name: Download Release Script run: curl https://raw.githubusercontent.com/dequelabs/attest-release-scripts/develop/src/node-github-release.sh -s -o ./node-github-release.sh - name: Make Release Script Executable run: chmod +x ./node-github-release.sh - name: Create GitHub Release env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: ./node-github-release.sh validate-deploy: name: Validate Deployment needs: prod-deploy runs-on: ubuntu-24.04 steps: - *checkout - *setup-node # In theory since this is a new job now, by the time # this would kick off the package should be available. # But, to be safe in case of delays in propagation, # we'll implement a retry mechanism. - name: Wait for package to be available on npm env: VERSION: ${{ needs.prod-deploy.outputs.version }} PACKAGE_NAME: ${{ needs.prod-deploy.outputs.packageName }} run: ./.github/bin/wait-for-npm-ready.sh - name: Validate installation of stable version env: PACKAGE_NAME: ${{ needs.prod-deploy.outputs.packageName }} VERSION: ${{ needs.prod-deploy.outputs.version }} run: ./.github/bin/validate-npm-deploy.sh ================================================ FILE: .github/workflows/format.yml ================================================ name: Formatter on: pull_request: branches: - develop jobs: prettier: # This conditional prevents running the job on PRs from forks; won't # have permissions to commit changes, so the job would fail if it ran. # PRs from forks will instead rely on failing the fmt_check job in test.yml if: github.event.pull_request.head.repo.full_name == github.repository runs-on: ubuntu-latest timeout-minutes: 5 steps: - uses: actions/checkout@v6 with: ref: ${{ github.event.pull_request.head.ref }} - name: Install dependencies run: npm ci - uses: actions/setup-node@v6 with: node-version-file: .nvmrc cache: 'npm' # Workflows are not allowed to edit workflows. As result, we need to prevent Prettier from formatting them. - name: Prevent workflows from being formatted run: echo ".github" >> .prettierignore && cat .prettierignore - run: npm run fmt # Prevent the prettierignore change from being committed. - run: git checkout .prettierignore - uses: stefanzweifel/git-auto-commit-action@04702edda442b2e678b25b537cec683a1493fcb9 # tag=v5 with: commit_message: ':robot: Automated formatting fixes' ================================================ FILE: .github/workflows/label-extension-linter-issues.yml ================================================ name: Add extension and linting labels to associated opened issues on: issues: types: [opened] jobs: label_extension_linting_issues: runs-on: ubuntu-latest permissions: issues: write steps: - name: Label Extension Issues uses: andymckay/labeler@e6c4322d0397f3240f0e7e30a33b5c5df2d39e90 # tag=1 if: contains(toJson(github.event.issue.body), '### Product\n\naxe Extension\n\n') with: add-labels: 'extension' repo-token: ${{ secrets.GITHUB_TOKEN }} - name: Label Linting Issues uses: andymckay/labeler@e6c4322d0397f3240f0e7e30a33b5c5df2d39e90 # tag=1 if: contains(toJson(github.event.issue.body), '### Product\n\naxe Linter\n\n') with: add-labels: 'linting' repo-token: ${{ secrets.GITHUB_TOKEN }} ================================================ FILE: .github/workflows/nightly-tests.yml ================================================ name: Nightly Tests on: schedule: # Runs every day at 2:17 AM UTC # Schedules should try to be offset from common times # to avoid high contention times on GitHub runners. - cron: '17 2 * * *' workflow_dispatch: env: CHROME_DEVEL_SANDBOX: /opt/google/chrome/chrome-sandbox permissions: contents: read jobs: browsers: runs-on: ubuntu-24.04 timeout-minutes: 10 env: DISPLAY: ':99' steps: - &checkout name: Checkout repository uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0 with: persist-credentials: false - name: Install Dependencies id: install-deps uses: ./.github/actions/install-deps with: nightly: 'true' start-xvfb: ${{ env.DISPLAY }} - &build name: Build id: build run: | npm run prepare npm run build - name: Run Firefox Nightly Browser Tests env: FIREFOX_NIGHTLY_BIN: ${{ steps.install-deps.outputs.firefox-path }} run: npm run test -- --browsers FirefoxNightly - name: Run Chrome Beta Browser Tests if: ${{ !cancelled() && steps.build.conclusion == 'success' }} env: CHROME_BIN: ${{ steps.install-deps.outputs.chrome-path }} CHROMEDRIVER_BIN: ${{ steps.install-deps.outputs.chromedriver-path }} run: npm run test -- --browsers Chrome act: runs-on: ubuntu-24.04 timeout-minutes: 10 steps: - *checkout - &install-deps name: Install Deps id: install-deps uses: ./.github/actions/install-deps - *build - name: Install Latest WCAG ACT Rules run: npm install w3c/wcag-act-rules#main - name: Run ACT Tests env: CHROME_BIN: ${{ steps.install-deps.outputs.chrome-path }} CHROMEDRIVER_BIN: ${{ steps.install-deps.outputs.chromedriver-path }} run: npm run test:act aria-practices: runs-on: ubuntu-24.04 timeout-minutes: 7 steps: - *checkout - *install-deps - *build - name: Install Latest W3C Aria Practices run: npm install w3c/aria-practices#main - name: Run ARIA Practices Tests env: CHROME_BIN: ${{ steps.install-deps.outputs.chrome-path }} CHROMEDRIVER_BIN: ${{ steps.install-deps.outputs.chromedriver-path }} run: npm run test:apg ================================================ FILE: .github/workflows/release.yml ================================================ name: Create release candidate on: [workflow_dispatch] jobs: create_release: name: Create release runs-on: ubuntu-latest steps: - uses: actions/checkout@v6 with: fetch-depth: 0 - uses: actions/setup-node@v6 with: node-version-file: .nvmrc cache: 'npm' - name: Run release script and open PR run: | git config user.name "API Team CI User" git config user.email "aciattestteamci@deque.com" Branch="release-$(date +%Y-%m-%d)" echo "Branch: $Branch" git checkout -b "$Branch" npm ci npm run release git push origin "$Branch" --force Version=$(jq -r .version ./package.json) echo "Version: $Version" # Get the additions to the changelog as the commit body and generate the PR url ReleaseNotes=$( git show \ --no-color \ --no-prefix \ --output-indicator-new=! CHANGELOG.md | egrep '^!' | awk -F'^[!]' '{print $2}' | sed -e 's/\n/$0A/g' ) echo "$ReleaseNotes" >> /tmp/pr.txt echo "" >> /tmp/pr.txt echo "This PR was opened by a robot :robot: :tada:" >> /tmp/pr.txt gh pr create --title "chore(release): v$Version" --body-file "/tmp/pr.txt" --base master env: GITHUB_TOKEN: ${{ secrets.PAT }} ================================================ FILE: .github/workflows/semantic-pr-title.yml ================================================ name: Semantic PR title on: pull_request: types: - opened - reopened - edited - synchronize jobs: semantic-pr-title: runs-on: ubuntu-latest steps: - uses: dequelabs/semantic-pr-title@v1 ================================================ FILE: .github/workflows/sync-master-develop.yml ================================================ name: Sync master/develop branches on: push: branches: - master jobs: create_sync_pull_request: runs-on: ubuntu-latest steps: - uses: dequelabs/action-sync-branches@v1 with: github-token: ${{ secrets.GITHUB_TOKEN }} pr-title: 'chore: merge master into develop' pr-reviewers: straker,WilcoFiers,stephenmathieson ================================================ FILE: .github/workflows/test.yml ================================================ name: Tests on: pull_request: push: branches: - master - develop - release-* # We want to group to the workflow for each branch. # Non-push events will be cancelled if a new one is started. # Push events will run sequentially. This helps ensure that # the `next` tag isn't out of sync. concurrency: group: ${{ github.workflow }}-${{ github.ref_name }} cancel-in-progress: ${{ github.event_name == 'pull_request' }} permissions: {} env: CHROME_DEVEL_SANDBOX: /opt/google/chrome/chrome-sandbox jobs: lint: runs-on: ubuntu-24.04 timeout-minutes: 10 steps: - &checkout name: Checkout repository uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0 with: persist-credentials: false - &setup-node name: Set up Node.js uses: actions/setup-node@2028fbc5c25fe9cf00d9f06a71cc4710d4507903 # v6.0.0 with: node-version-file: .nvmrc cache: 'npm' - &install-deps-directly name: Install Dependencies run: npm ci - name: Run ESLint run: npm run eslint fmt_check: runs-on: ubuntu-24.04 timeout-minutes: 10 steps: - *checkout - *setup-node - *install-deps-directly - run: npm run fmt:check build: runs-on: ubuntu-24.04 timeout-minutes: 10 steps: - *checkout - *setup-node - *install-deps-directly - &build name: Build run: | npm run prepare npm run build - uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6.0.0 with: name: axe-core path: axe.js retention-days: 1 test_chrome: runs-on: ubuntu-24.04 timeout-minutes: 10 env: DISPLAY: :99 steps: - *checkout - &install-deps-with-xvfb name: Install Deps uses: ./.github/actions/install-deps id: install-deps with: start-xvfb: ${{ env.DISPLAY }} - *build - name: Run Tests Against Chrome env: CHROME_BIN: ${{ steps.install-deps.outputs.chrome-path }} CHROMEDRIVER_BIN: ${{ steps.install-deps.outputs.chromedriver-path }} run: npm run test -- --browsers Chrome - name: Run Chrome Integration Tests env: CHROME_BIN: ${{ steps.install-deps.outputs.chrome-path }} CHROMEDRIVER_BIN: ${{ steps.install-deps.outputs.chromedriver-path }} run: npm run test:integration:chrome test_firefox: runs-on: ubuntu-24.04 timeout-minutes: 10 env: DISPLAY: :99 steps: - *checkout - *install-deps-with-xvfb - *build - name: Run Tests Against Firefox env: FIREFOX_BIN: ${{ steps.install-deps.outputs.firefox-path }} run: npm run test -- --browsers Firefox - name: Run Firefox Integration Tests env: FIREFOX_BIN: ${{ steps.install-deps.outputs.firefox-path }} run: npm run test:integration:firefox # Run examples under `doc/examples` test_examples: runs-on: ubuntu-24.04 timeout-minutes: 10 steps: - *checkout - &install-deps name: Install Deps id: install-deps uses: ./.github/actions/install-deps - *build - name: Run Tests Against Examples run: npm run test:examples test_act: runs-on: ubuntu-24.04 timeout-minutes: 10 needs: build steps: - *checkout - *install-deps - &restore-axe-build name: Restore axe build uses: actions/download-artifact@37930b1c2abaa49bbe596cd826c3c89aef350131 # v7.0.0 with: name: axe-core - name: Run ACT Tests env: CHROME_BIN: ${{ steps.install-deps.outputs.chrome-path }} CHROMEDRIVER_BIN: ${{ steps.install-deps.outputs.chromedriver-path }} run: npm run test:act test_aria_practices: runs-on: ubuntu-24.04 timeout-minutes: 10 needs: build steps: - *checkout - *install-deps - *restore-axe-build - name: Run ARIA Practices Tests env: CHROME_BIN: ${{ steps.install-deps.outputs.chrome-path }} CHROMEDRIVER_BIN: ${{ steps.install-deps.outputs.chromedriver-path }} run: npm run test:apg test_locales: runs-on: ubuntu-24.04 timeout-minutes: 10 needs: build steps: - *checkout - *install-deps - *restore-axe-build - name: Run Locale Tests run: npm run test:locales test_virtual_rules: runs-on: ubuntu-24.04 timeout-minutes: 10 needs: build steps: - *checkout - *install-deps - *restore-axe-build - name: Run Virtual Rules Tests run: npm run test:virtual-rules test_jsdom: runs-on: ubuntu-24.04 timeout-minutes: 10 needs: build steps: - *checkout - *install-deps - *restore-axe-build - name: Run jsdom Tests run: npm run test:jsdom build_api_docs: runs-on: ubuntu-24.04 timeout-minutes: 10 steps: - *checkout - *install-deps - name: Run API Docs Build run: npm run api-docs test_rule_help_version: runs-on: ubuntu-24.04 timeout-minutes: 10 if: ${{ github.ref_name == 'master' }} steps: - *checkout - *install-deps - name: Run Rule Help Version Tests run: npm run test:rule-help-version sri-validate: runs-on: ubuntu-24.04 timeout-minutes: 10 needs: build # Run on master and RC branches along with PRs targeting those branches. if: ${{ github.ref_name == 'master' || startsWith(github.ref_name, 'release-') || github.event.pull_request.base.ref == 'master' || startsWith(github.event.pull_request.base.ref, 'release-') }} steps: - *checkout - *install-deps - *restore-axe-build - name: Validate Subresource Integrity run: npm run sri-validate test_node: # The package can't be built on Node 6 anymore, but should still run there. # So we need to pull in a previous build artifact. needs: build strategy: matrix: node: - 6 - 18 - 20 - 22 - 24 runs-on: ubuntu-24.04 timeout-minutes: 10 steps: - *checkout - name: Set up Node.js uses: actions/setup-node@2028fbc5c25fe9cf00d9f06a71cc4710d4507903 # v6.0.0 with: node-version: ${{ matrix.node }} - *restore-axe-build - name: Run Node.js Tests run: npm run test:node ================================================ FILE: .github/workflows/update-generated-files.yaml ================================================ name: Update generated files on: push: branches: - develop env: BRANCH_NAME: sync-generated-files jobs: update_generated_files: runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v6 with: fetch-depth: 0 - uses: actions/setup-node@v6 with: node-version-file: .nvmrc cache: 'npm' - name: Build run: | npm ci npm run build - name: Check for changes id: changes run: | changes=$(git status --porcelain | tr -d '\n') # see https://unix.stackexchange.com/a/509498 echo $changes | grep . && echo "Changes detected" || echo "No changes" echo "changes=$changes" >> "$GITHUB_OUTPUT" - name: Check branch exists id: branchExists if: steps.changes.outputs.changes run: | exists=$(git ls-remote --heads origin $BRANCH_NAME) echo $exists | grep . && echo "Branch '$BRANCH_NAME' already exists on remote" || echo "Branch does not exists in remote" echo "exists=$exists" >> "$GITHUB_OUTPUT" - name: Create pull request if: ${{ steps.changes.outputs.changes && !steps.branchExists.outputs.exists }} run: | git status git config user.name github-actions git config user.email github-actions@github.com git add . git checkout -b $BRANCH_NAME git commit -m "chore: sync generated files" git push origin $BRANCH_NAME gh pr create --base develop --head $BRANCH_NAME --title "chore: sync generated files" --body "" env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - name: Update pull request if: ${{ steps.changes.outputs.changes && steps.branchExists.outputs.exists }} run: | git reset HEAD --hard git checkout $BRANCH_NAME npm run build git status git config user.name github-actions git config user.email github-actions@github.com git add . git commit -m "chore: sync generated files" git push origin $BRANCH_NAME env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} ================================================ FILE: .gitignore ================================================ # defaults node_modules npm-shrinkwrap.json doc/examples/*/package-lock.json .DS_Store .idea # tmp - `dev` time generated assets tmp # test - runner generated assets test/*/index.html test/integration/*/index.html !test/integration/virtual-rules/index.html # dist axe.js axe.*.js # generated src file lib/core/base/metadata-function-map.js # generated jsdoc api docs doc/api/* # ts generated file typings/axe-core/axe-core-tests.js # doc doc/rule-descriptions.*.md ================================================ FILE: .husky/pre-commit ================================================ npx grunt configure npx lint-staged ================================================ FILE: .jsdoc.json ================================================ { "tags": { "allowUnknownTags": true, "dictionaries": ["jsdoc"] }, "source": { "include": ["lib", "README.md"], "includePattern": ".js$", "excludePattern": "(node_modules/|doc/api)" }, "opts": { "destination": "./doc/api", "encoding": "utf8", "recurse": true, "template": "./node_modules/clean-jsdoc-theme" }, "plugins": ["plugins/markdown"] } ================================================ FILE: .npmrc ================================================ registry=https://registry.npmjs.org ================================================ FILE: .nvmrc ================================================ 24 ================================================ FILE: .prettierignore ================================================ node_modules/ doc/api ================================================ FILE: .prettierrc.json ================================================ { "printWidth": 80, "useTabs": false, "tabWidth": 2, "semi": true, "singleQuote": true, "trailingComma": "none", "bracketSpacing": true, "arrowParens": "avoid" } ================================================ FILE: .vscode/extensions.json ================================================ { "recommendations": ["deque-systems.vscode-axe-linter"] } ================================================ FILE: .vscode/launch.json ================================================ { "version": "0.2.0", "configurations": [ { "type": "chrome", "request": "attach", "name": "Attach to Karma test:debug", "address": "localhost", "port": 9765, // keep in sync with debugPort in karma.conf.js "webRoot": "${workspaceFolder}", "sourceMaps": true, "sourceMapPathOverrides": { "*": "${webRoot}/*", "base/*": "${webRoot}/*" } } ] } ================================================ FILE: CHANGELOG.md ================================================ # Changelog All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines. ### [4.11.1](https://github.com/dequelabs/axe-core/compare/v4.11.0...v4.11.1) (2026-01-06) ### Bug Fixes - allow shadow roots in axe.run contexts ([#4952](https://github.com/dequelabs/axe-core/issues/4952)) ([d4aee16](https://github.com/dequelabs/axe-core/commit/d4aee16494f3225e9f5065f23a9e1deccb46fc9a)), closes [#4941](https://github.com/dequelabs/axe-core/issues/4941) - color contrast fails for oklch and oklab with none ([#4959](https://github.com/dequelabs/axe-core/issues/4959)) ([8f249fd](https://github.com/dequelabs/axe-core/commit/8f249fdcffe379466fcff8ec8ac46e37b65fdbce)) - **color-contrast:** do not incomplete on textarea ([#4968](https://github.com/dequelabs/axe-core/issues/4968)) ([d271788](https://github.com/dequelabs/axe-core/commit/d27178866d4962e1157b1be435143d028873f545)), closes [#4947](https://github.com/dequelabs/axe-core/issues/4947) - **commons/color:** Match browser behavior for out-of-gamut oklch colors ([#4908](https://github.com/dequelabs/axe-core/issues/4908)) ([5036be8](https://github.com/dequelabs/axe-core/commit/5036be811e0ede4bf061ab1f970f78b7e9c7ec0c)) - don't runs rules that select `html` on nested `html` elements ([#4969](https://github.com/dequelabs/axe-core/issues/4969)) ([1e9a5c3](https://github.com/dequelabs/axe-core/commit/1e9a5c36812ff69a75f23fed3d290497f9fba37d)) - replaced luminance threshold constant 0.03928 with 0.04045 ([#4934](https://github.com/dequelabs/axe-core/issues/4934)) ([316967d](https://github.com/dequelabs/axe-core/commit/316967d50c554e71bcdf59ac945d1d5bb2f0684b)), closes [#4933](https://github.com/dequelabs/axe-core/issues/4933) - **rgaa:** adjust mapping of aria-hidden-\* and valid-lang ([#4935](https://github.com/dequelabs/axe-core/issues/4935)) ([77571f2](https://github.com/dequelabs/axe-core/commit/77571f2103a90a5703233729c78be008395f1572)) - **valid-lang:** update valid-langs for newer language codes ([#4966](https://github.com/dequelabs/axe-core/issues/4966)) ([c3f5446](https://github.com/dequelabs/axe-core/commit/c3f54464fd0995edc6619203b46b65d2984b218d)), closes [#4963](https://github.com/dequelabs/axe-core/issues/4963) ## [4.11.0](https://github.com/dequelabs/axe-core/compare/v4.10.3...v4.11.0) (2025-10-07) ### Features - add RGAA tags to rules ([#4862](https://github.com/dequelabs/axe-core/issues/4862)) ([53a925a](https://github.com/dequelabs/axe-core/commit/53a925a31bb2bf4a1584252fa7a58c0662225320)) - **aria-prohibited-attr:** add support for fallback roles ([#4325](https://github.com/dequelabs/axe-core/issues/4325)) ([62a19a9](https://github.com/dequelabs/axe-core/commit/62a19a9f753f8c49885dafbab7a2a9468eb6571d)) - **axe.d.ts:** add nodeSerializer typings ([#4551](https://github.com/dequelabs/axe-core/issues/4551)) ([a2f3a48](https://github.com/dequelabs/axe-core/commit/a2f3a485d5e02993c0f35762cd9d80a6ce4ced5f)), closes [#4093](https://github.com/dequelabs/axe-core/issues/4093) - **DqElement:** deprecate fromFrame function ([#4881](https://github.com/dequelabs/axe-core/issues/4881)) ([374c376](https://github.com/dequelabs/axe-core/commit/374c376d0b4a043e8beaa7cc9a47521314eee02c)), closes [#4093](https://github.com/dequelabs/axe-core/issues/4093) - **DqElement:** Truncate large `html` strings when the element has a large outerHTML string ([#4796](https://github.com/dequelabs/axe-core/issues/4796)) ([404a4fb](https://github.com/dequelabs/axe-core/commit/404a4fb24a156dc433ac9c70dbefe415d41ca980)), closes [#4544](https://github.com/dequelabs/axe-core/issues/4544) - **get-xpath:** return proper relative selector for id ([#4846](https://github.com/dequelabs/axe-core/issues/4846)) ([1035f9e](https://github.com/dequelabs/axe-core/commit/1035f9ef134cbfc02c91c37f881eb5759f602bf3)), closes [#4845](https://github.com/dequelabs/axe-core/issues/4845) - **i18n:** Add Portugal Portuguese translation ([#4725](https://github.com/dequelabs/axe-core/issues/4725)) ([5b6a65a](https://github.com/dequelabs/axe-core/commit/5b6a65a103188251568862f46020488cf7fd8a94)) - incomplete with node on which an error occurred ([#4863](https://github.com/dequelabs/axe-core/issues/4863)) ([32ed8da](https://github.com/dequelabs/axe-core/commit/32ed8daad1111772559f6e1cf6c8171e83c0f299)) - **locale:** Added ru locale ([#4565](https://github.com/dequelabs/axe-core/issues/4565)) ([067b01d](https://github.com/dequelabs/axe-core/commit/067b01d66db1d2c276f26743a8d13d5d60d33446)) - **tap:** some best practice rules map to RGAA ([#4895](https://github.com/dequelabs/axe-core/issues/4895)) ([bc33f4c](https://github.com/dequelabs/axe-core/commit/bc33f4cf5d4d384118c08d8be1afc0c4fc9272ec)) - **td-headers-attr:** report headers attribute referencing other elements as unsupported ([#4589](https://github.com/dequelabs/axe-core/issues/4589)) ([ec7c6c8](https://github.com/dequelabs/axe-core/commit/ec7c6c8875970388c4fe2c73147a3dd43497161e)), closes [#3987](https://github.com/dequelabs/axe-core/issues/3987) ### Bug Fixes - **aria-allowed-role:** add form to allowed roles of form element ([#4588](https://github.com/dequelabs/axe-core/issues/4588)) ([8aa47ac](https://github.com/dequelabs/axe-core/commit/8aa47ac01f9959b9d47ac24dcd2fd8c88c9279f7)), closes [/github.com/dequelabs/axe-core/blob/develop/lib/standards/html-elms.js#L264](https://github.com/dequelabs//github.com/dequelabs/axe-core/blob/develop/lib/standards/html-elms.js/issues/L264) - **aria-allowed-role:** Add math to allowed roles for img element ([#4658](https://github.com/dequelabs/axe-core/issues/4658)) ([95b6c18](https://github.com/dequelabs/axe-core/commit/95b6c184872cf70c7f54a96aa813a9e8bc2c066d)), closes [#4657](https://github.com/dequelabs/axe-core/issues/4657) - **autocomplete-valid :** Ignore readonly autocomplete field ([#4721](https://github.com/dequelabs/axe-core/issues/4721)) ([491f4ec](https://github.com/dequelabs/axe-core/commit/491f4ecdbbb79d019daa63debc03ac0efb47adf8)), closes [#4708](https://github.com/dequelabs/axe-core/issues/4708) - **autocomplete-valid:** treat values "xon" and "xoff" as non-WCAG-violations ([#4878](https://github.com/dequelabs/axe-core/issues/4878)) ([52bc611](https://github.com/dequelabs/axe-core/commit/52bc61162aa170a30a38246ade099ba3fc10cc2a)), closes [#4877](https://github.com/dequelabs/axe-core/issues/4877) - **axe.d.ts:** add typings for preload options object ([#4543](https://github.com/dequelabs/axe-core/issues/4543)) ([cfd2974](https://github.com/dequelabs/axe-core/commit/cfd297498c0e34edd5ff7e62935060bb9dda4db7)) - **button-name,input-button-name,input-img-alt:** allow label to give accessible name ([#4607](https://github.com/dequelabs/axe-core/issues/4607)) ([a9710d7](https://github.com/dequelabs/axe-core/commit/a9710d757c6ca6ee0ce5d26be3427bab54b87a7a)), closes [#4472](https://github.com/dequelabs/axe-core/issues/4472) [#3696](https://github.com/dequelabs/axe-core/issues/3696) [#3696](https://github.com/dequelabs/axe-core/issues/3696) - **captions:** fix grammar in captions check incomplete message ([#4661](https://github.com/dequelabs/axe-core/issues/4661)) ([11de515](https://github.com/dequelabs/axe-core/commit/11de515858a7c10a3d7400163fc2b834715152fc)) - **color-contrast:** do not run on elements with font-size: 0 ([#4822](https://github.com/dequelabs/axe-core/issues/4822)) ([d77c885](https://github.com/dequelabs/axe-core/commit/d77c8854c847573597eccf54c00091a4a2134cfd)), closes [#4820](https://github.com/dequelabs/axe-core/issues/4820) - consistently parse tabindex, following HTML 5 spec ([#4637](https://github.com/dequelabs/axe-core/issues/4637)) ([645a850](https://github.com/dequelabs/axe-core/commit/645a850f601f4f3f18cc4aaca399aad18a9fa5d2)), closes [#4632](https://github.com/dequelabs/axe-core/issues/4632) - **core:** measure perf for async checks ([#4609](https://github.com/dequelabs/axe-core/issues/4609)) ([7e9bacf](https://github.com/dequelabs/axe-core/commit/7e9bacf1ecb8c53404fac3eeed087e370e2a9cfa)) - fix grammar when using "alternative text" in a sentence ([#4811](https://github.com/dequelabs/axe-core/issues/4811)) ([237a586](https://github.com/dequelabs/axe-core/commit/237a5861b0fb044c885b154436696279deca7a13)), closes [#4394](https://github.com/dequelabs/axe-core/issues/4394) - **get-ancestry:** add nth-child selector for multiple siblings of shadow root ([#4606](https://github.com/dequelabs/axe-core/issues/4606)) ([1cdd6c3](https://github.com/dequelabs/axe-core/commit/1cdd6c3e698a6a4c28604448284993c4c20ca272)), closes [#4563](https://github.com/dequelabs/axe-core/issues/4563) - **get-ancestry:** don't error when there is no parent ([#4617](https://github.com/dequelabs/axe-core/issues/4617)) ([a005703](https://github.com/dequelabs/axe-core/commit/a0057039072f68bd605e8bacdca64692d57f612e)) - **locale:** fix typos in japanese (ja) locale ([#4856](https://github.com/dequelabs/axe-core/issues/4856)) ([3462cc5](https://github.com/dequelabs/axe-core/commit/3462cc57e8480334c125c38b7ecb42344b405dd4)) - **locale:** fixed typos in german (DE) locale ([#4631](https://github.com/dequelabs/axe-core/issues/4631)) ([b7736de](https://github.com/dequelabs/axe-core/commit/b7736deae9ec14a4e81182adb53be73f3cce9894)) - **locale:** proofread and updated de.json ([#4643](https://github.com/dequelabs/axe-core/issues/4643)) ([8060ada](https://github.com/dequelabs/axe-core/commit/8060ada737a23cdf68bb5b4c95b8c0e2cca45dad)) - **meta-viewport:** lower impact to moderate ([#4887](https://github.com/dequelabs/axe-core/issues/4887)) ([2f32aa5](https://github.com/dequelabs/axe-core/commit/2f32aa5bada78ffcfc965ed2b64be533263c6bd5)), closes [#4714](https://github.com/dequelabs/axe-core/issues/4714) - **no-autoplay-audio:** don't timeout for preload=none media elements ([#4684](https://github.com/dequelabs/axe-core/issues/4684)) ([cdc871e](https://github.com/dequelabs/axe-core/commit/cdc871e68f3dbc6acbfed12d3ec63ea4da1a4065)) - **performanceTimer:** throwing in axe catch clause ([#4852](https://github.com/dequelabs/axe-core/issues/4852)) ([a4ade04](https://github.com/dequelabs/axe-core/commit/a4ade04bc2ba93dcad8a24094fb0dc5edb6da8b2)), closes [/github.com/dequelabs/axe-core/blob/e7dae4ec48cbfef74de9f833fdcfb178c1002985/lib/core/base/rule.js#L297-L300](https://github.com/dequelabs//github.com/dequelabs/axe-core/blob/e7dae4ec48cbfef74de9f833fdcfb178c1002985/lib/core/base/rule.js/issues/L297-L300) - **performanceTimer:** work in frames ([#4834](https://github.com/dequelabs/axe-core/issues/4834)) ([d7dfebc](https://github.com/dequelabs/axe-core/commit/d7dfebc0271d2970c0937024ce693a771885002c)) - **rules:** Change "alternate text" to "alternative text" ([#4582](https://github.com/dequelabs/axe-core/issues/4582)) ([b03ada3](https://github.com/dequelabs/axe-core/commit/b03ada3dd3b6490bb88e366bf807b10e1a4038a4)) - **target-size:** do not treat focusable tabpanels as targets ([#4702](https://github.com/dequelabs/axe-core/issues/4702)) ([60d11f2](https://github.com/dequelabs/axe-core/commit/60d11f2d01b9e859e54a15ae0232b8b5d1c48d35)), closes [#4421](https://github.com/dequelabs/axe-core/issues/4421) [#4701](https://github.com/dequelabs/axe-core/issues/4701) - **type:** correct RuleError type ([#4893](https://github.com/dequelabs/axe-core/issues/4893)) ([d1aa8e2](https://github.com/dequelabs/axe-core/commit/d1aa8e2094031159b041a3e9cf2c796a26b3daba)) - **types:** correct raw types ([#4903](https://github.com/dequelabs/axe-core/issues/4903)) ([3eade11](https://github.com/dequelabs/axe-core/commit/3eade110a7ac173e3537e8eb18dd0db026f13c75)) ### [4.10.3](https://github.com/dequelabs/axe-core/compare/v4.10.2...v4.10.3) (2025-03-04) ### Bug Fixes - **aria-allowed-role:** Add math to allowed roles for img element ([#4658](https://github.com/dequelabs/axe-core/issues/4658)) ([f6dddd9](https://github.com/dequelabs/axe-core/commit/f6dddd905bb86d2073d760d4c1ff39996e59a4f4)), closes [#4657](https://github.com/dequelabs/axe-core/issues/4657) - **captions:** fix grammar in captions check incomplete message ([#4661](https://github.com/dequelabs/axe-core/issues/4661)) ([3ef7058](https://github.com/dequelabs/axe-core/commit/3ef7058d3a16a6898eaed718e39b34b45f9ed74f)) - consistently parse tabindex, following HTML5 spec ([#4637](https://github.com/dequelabs/axe-core/issues/4637)) ([3b0a361](https://github.com/dequelabs/axe-core/commit/3b0a3619d5e6147d8885725cce196868dac89f7f)), closes [#4632](https://github.com/dequelabs/axe-core/issues/4632) - **core:** measure perf for async checks ([#4609](https://github.com/dequelabs/axe-core/issues/4609)) ([e7dc26e](https://github.com/dequelabs/axe-core/commit/e7dc26e6cbaf9089611853805e05216b6529e1f9)) - **locale:** fixed typos in german (DE) locale ([#4631](https://github.com/dequelabs/axe-core/issues/4631)) ([0740980](https://github.com/dequelabs/axe-core/commit/07409802115c199a68f58dcaf7467e35b4867140)) - **locale:** proofread and updated de.json ([#4643](https://github.com/dequelabs/axe-core/issues/4643)) ([910cdb2](https://github.com/dequelabs/axe-core/commit/910cdb20702ce116c781d58f021adc05095ffcbb)) - **no-autoplay-audio:** don't timeout for preload=none media elements ([#4684](https://github.com/dequelabs/axe-core/issues/4684)) ([b7f1ad1](https://github.com/dequelabs/axe-core/commit/b7f1ad1ccf719b7149a5ef1805b405707a474e31)) - **target-size:** do not treat focusable tabpanels as targets ([#4702](https://github.com/dequelabs/axe-core/issues/4702)) ([67d4e4f](https://github.com/dequelabs/axe-core/commit/67d4e4f7d0d0b803b66f216ff86f401649ed024f)), closes [#4421](https://github.com/dequelabs/axe-core/issues/4421) [#4701](https://github.com/dequelabs/axe-core/issues/4701) ### [4.10.2](https://github.com/dequelabs/axe-core/compare/v4.10.1...v4.10.2) (2024-10-21) ### Bug Fixes - **get-ancestry:** don't error when there is no parent ([#4617](https://github.com/dequelabs/axe-core/issues/4617)) ([6c07102](https://github.com/dequelabs/axe-core/commit/6c07102b1d29145b8dc5f1d96229f3d0b8b38068)) ### [4.10.1](https://github.com/dequelabs/axe-core/compare/v4.10.0...v4.10.1) (2024-10-16) ### Bug Fixes - **aria-allowed-role:** add form to allowed roles of form element ([#4588](https://github.com/dequelabs/axe-core/issues/4588)) ([d462d67](https://github.com/dequelabs/axe-core/commit/d462d674bb7de0848ce2695f80b95d677c5016e0)), closes [/github.com/dequelabs/axe-core/blob/develop/lib/standards/html-elms.js#L264](https://github.com/dequelabs//github.com/dequelabs/axe-core/blob/develop/lib/standards/html-elms.js/issues/L264) - **axe.d.ts:** add typings for preload options object ([#4543](https://github.com/dequelabs/axe-core/issues/4543)) ([72e269f](https://github.com/dequelabs/axe-core/commit/72e269f1e6d6039e70e614005f04ebfd3fe5aca5)) - **button-name,input-button-name,input-img-alt:** allow label to give accessible name ([#4607](https://github.com/dequelabs/axe-core/issues/4607)) ([364eb72](https://github.com/dequelabs/axe-core/commit/364eb72bb8f20b0ffc31be24cc96cbd349c301cb)), closes [#4472](https://github.com/dequelabs/axe-core/issues/4472) [#3696](https://github.com/dequelabs/axe-core/issues/3696) [#3696](https://github.com/dequelabs/axe-core/issues/3696) - **get-ancestry:** add nth-child selector for multiple siblings of shadow root ([#4606](https://github.com/dequelabs/axe-core/issues/4606)) ([bdd94a2](https://github.com/dequelabs/axe-core/commit/bdd94a227a95cd5b9f8e2a1e0fd259ddd702810c)), closes [#4563](https://github.com/dequelabs/axe-core/issues/4563) - **rules:** Change "alternate text" to "alternative text" ([#4582](https://github.com/dequelabs/axe-core/issues/4582)) ([31e0f61](https://github.com/dequelabs/axe-core/commit/31e0f61ca871b3df86468577c449a02c8ece12f0)) ## [4.10.0](https://github.com/dequelabs/axe-core/compare/v4.9.1...v4.10.0) (2024-07-29) ### Features - **new-rule:** summary elements must have an accessible name ([#4511](https://github.com/dequelabs/axe-core/issues/4511)) ([0d8a99e](https://github.com/dequelabs/axe-core/commit/0d8a99eadd8d49e5d3ea0f11ad77be732148431e)), closes [#4510](https://github.com/dequelabs/axe-core/issues/4510) ### Bug Fixes - **aria-allowed-attr:** allow aria-multiline=false for element with contenteditable ([#4537](https://github.com/dequelabs/axe-core/issues/4537)) ([f019068](https://github.com/dequelabs/axe-core/commit/f0190685722495d00be644cabb1c9741d74acdea)) - **aria-allowed-attr:** allow aria-required=false when normally not allowed ([#4532](https://github.com/dequelabs/axe-core/issues/4532)) ([2e242e1](https://github.com/dequelabs/axe-core/commit/2e242e146929902c97e181e41fa45e656cf3eb51)) - **aria-prohibited-attr:** allow aria-label/ledby on descendants of widget ([#4541](https://github.com/dequelabs/axe-core/issues/4541)) ([07c5d91](https://github.com/dequelabs/axe-core/commit/07c5d91c658bda6bcd2743950bf70f25abd1f9ae)) - **aria-roledescription:** keep disabled with { runOnly: 'wcag2a' } ([#4526](https://github.com/dequelabs/axe-core/issues/4526)) ([5b4cb9d](https://github.com/dequelabs/axe-core/commit/5b4cb9d7992a4c07745e64708040777de64874bd)), closes [#4523](https://github.com/dequelabs/axe-core/issues/4523) - **autocomplete-valid:** incomplete for invalid but safe values ([#4500](https://github.com/dequelabs/axe-core/issues/4500)) ([e31a974](https://github.com/dequelabs/axe-core/commit/e31a974de395845c08af345f9458a8091e2b1c4b)), closes [#4492](https://github.com/dequelabs/axe-core/issues/4492) - **build:** limit locales to valid files when using the --all-lang option ([#4486](https://github.com/dequelabs/axe-core/issues/4486)) ([d3db593](https://github.com/dequelabs/axe-core/commit/d3db593991261ad44eef1c142d8a4646edde93fa)), closes [#4485](https://github.com/dequelabs/axe-core/issues/4485) - Prevent errors when loading axe in Angular + Jest ([#4456](https://github.com/dequelabs/axe-core/issues/4456)) ([3ef9353](https://github.com/dequelabs/axe-core/commit/3ef93531a574c2be76a92d59599d978714cca9d0)), closes [#4400](https://github.com/dequelabs/axe-core/issues/4400) - Minor grammatical fixes for some rules and checks ([#4499](https://github.com/dequelabs/axe-core/issues/4499)) ([11fad59](https://github.com/dequelabs/axe-core/commit/11fad598c25eadd29f35ef6be382d907057d4537)) - **landmark-unique:** follow spec, aside -> landmark ([#4469](https://github.com/dequelabs/axe-core/issues/4469)) ([e32f803](https://github.com/dequelabs/axe-core/commit/e32f8034246a92e4132dc04f6310e2b414d6d43f)), closes [#4460](https://github.com/dequelabs/axe-core/issues/4460) - **required-attr:** allow aria-valuetext on slider instead of valuenow ([#4518](https://github.com/dequelabs/axe-core/issues/4518)) ([135898b](https://github.com/dequelabs/axe-core/commit/135898b38d5eb46c42170527a0ac9add425c5c3d)), closes [#4515](https://github.com/dequelabs/axe-core/issues/4515) ### [4.9.1](https://github.com/dequelabs/axe-core/compare/v4.9.0...v4.9.1) (2024-05-06) ### Bug Fixes - Prevent errors when loading axe in a page with prototype.js - **aria-allowed-attr:** allow meter role allowed aria-\* attributes on meter element ([#4435](https://github.com/dequelabs/axe-core/issues/4435)) ([7ac6392](https://github.com/dequelabs/axe-core/commit/7ac63921e7fab21f3359dcfc8affa7585bc9c25b)) - **aria-allowed-role:** add gridcell, separator, slider and treeitem to allowed roles of button element ([#4398](https://github.com/dequelabs/axe-core/issues/4398)) ([4788bf8](https://github.com/dequelabs/axe-core/commit/4788bf8d6fd963d7b017dad950b122ffcea8d151)) - **aria-roles:** correct abstract roles (types) for aria-roles([#4421](https://github.com/dequelabs/axe-core/pull/4421)) - **aria-valid-attr-value:** aria-controls & aria-haspopup incomplete ([#4418](https://github.com/dequelabs/axe-core/pull/4418)) - fix building axe-core translation files with region locales ([#4396](https://github.com/dequelabs/axe-core/issues/4396)) ([5c318f3](https://github.com/dequelabs/axe-core/commit/5c318f3537056be5779cb53374bc6f4785947c91)), closes [#4388](https://github.com/dequelabs/axe-core/issues/4388) - **invalidrole:** allow upper and mixed case role names ([#4358](https://github.com/dequelabs/axe-core/issues/4358)) ([105016c](https://github.com/dequelabs/axe-core/commit/105016cfe9d82876cfed2ff5c656a7842c5b3761)), closes [#2695](https://github.com/dequelabs/axe-core/issues/2695) - **isVisibleOnScreen:** account for position: absolute elements inside overflow container ([#4405](https://github.com/dequelabs/axe-core/issues/4405)) ([2940f6e](https://github.com/dequelabs/axe-core/commit/2940f6ee36ba52d8cf089be2a3c8e7c516c81dd6)), closes [#4016](https://github.com/dequelabs/axe-core/issues/4016) - **label-content-name-mismatch:** better dismiss and wysiwyg symbolic text characters ([#4402](https://github.com/dequelabs/axe-core/issues/4402)) - **region:** Decorative images ignored by region rule ([#4412](https://github.com/dequelabs/axe-core/pull/4412)) - **target-size:** ignore descendant elements in shadow dom ([#4410](https://github.com/dequelabs/axe-core/issues/4410)) ([6091367](https://github.com/dequelabs/axe-core/commit/6091367a20f70e536fc7e8d77eae4fa7232bc7c0)) - **target-size:** pass for element that has nearby elements that are obscured ([#4422](https://github.com/dequelabs/axe-core/issues/4422)) ([3a90bb7](https://github.com/dequelabs/axe-core/commit/3a90bb70c8db087b2f03cc30a4aee756995c311c)), closes [#4387](https://github.com/dequelabs/axe-core/issues/4387) ## [4.9.0](https://github.com/dequelabs/axe-core/compare/v4.8.4...v4.9.0) (2024-03-25) ### Features - adding the wcag131 tag to the aria-hidden-body rule ([#4349](https://github.com/dequelabs/axe-core/issues/4349)) ([dd4c3c3](https://github.com/dequelabs/axe-core/commit/dd4c3c34a42d2b96f5495890f5c5d5e8f6ca8d32)), closes [#4315](https://github.com/dequelabs/axe-core/issues/4315) - **checks:** deprecate aria-busy check ([#4356](https://github.com/dequelabs/axe-core/issues/4356)) ([be0b555](https://github.com/dequelabs/axe-core/commit/be0b5558acfbeb6bbb176ac7fd7d8fdfb973b30b)), closes [#4347](https://github.com/dequelabs/axe-core/issues/4347) [#4340](https://github.com/dequelabs/axe-core/issues/4340) - **color:** add color channel values and luminosity, saturation, clip functions ([#4366](https://github.com/dequelabs/axe-core/issues/4366)) ([9e70199](https://github.com/dequelabs/axe-core/commit/9e7019990bbbf5182ab50c5c968143b81d216dcb)), closes [/github.com/dequelabs/axe-core/pull/4365/files#r1517706612](https://github.com/dequelabs//github.com/dequelabs/axe-core/pull/4365/files/issues/r1517706612) - **i18n:** add Greek Translations ([#3836](https://github.com/dequelabs/axe-core/issues/3836)) ([3ea9a48](https://github.com/dequelabs/axe-core/commit/3ea9a48cf88d02271db8b19651bff0415237b856)) - **i18n:** Add Italian translation ([#4344](https://github.com/dequelabs/axe-core/issues/4344)) ([de1baa9](https://github.com/dequelabs/axe-core/commit/de1baa9a9f6495f695d25d61d14ed55983dded76)) - **i18n:** Add Simplified Chinese translation ([#4379](https://github.com/dequelabs/axe-core/issues/4379)) ([bda7c8d](https://github.com/dequelabs/axe-core/commit/bda7c8d8bf5936a56c66240e1ea0373a3b769809)) - **i18n:** Add Taiwanese Mandarin translation ([#4299](https://github.com/dequelabs/axe-core/issues/4299)) ([c5e11de](https://github.com/dequelabs/axe-core/commit/c5e11de06973392b113906c05e3a3004af4c38ae)) ### Bug Fixes - Add LICENSE-3RD-PARTY.txt file ([#4304](https://github.com/dequelabs/axe-core/issues/4304)) ([daa0fe6](https://github.com/dequelabs/axe-core/commit/daa0fe677d4837c9c79bad8ee6c77aff11212339)) - add Object.values polyfill for node <=6 ([#4274](https://github.com/dequelabs/axe-core/issues/4274)) ([5eb867b](https://github.com/dequelabs/axe-core/commit/5eb867b04e174140122c62eb5c705a842a3489e1)) - **aria-required-children:** avoid confusing aria-busy message in failures ([#4347](https://github.com/dequelabs/axe-core/issues/4347)) ([591607d](https://github.com/dequelabs/axe-core/commit/591607dd829c11e2cca5beee12c75628d1a8235e)), closes [#fail13](https://github.com/dequelabs/axe-core/issues/fail13) [#4340](https://github.com/dequelabs/axe-core/issues/4340) - avoid reading element-specific node properties of non-element node types ([#4317](https://github.com/dequelabs/axe-core/issues/4317)) ([b853b18](https://github.com/dequelabs/axe-core/commit/b853b18a24dd2d1c9408705b821cc11146ae1186)), closes [#4316](https://github.com/dequelabs/axe-core/issues/4316) [#4316](https://github.com/dequelabs/axe-core/issues/4316) - **color-contrast:** handle text that is outside `overflow: hidden` ancestor ([#4357](https://github.com/dequelabs/axe-core/issues/4357)) ([bdb7300](https://github.com/dequelabs/axe-core/commit/bdb7300c67d451d3b0169707924a0c6bc4defe40)), closes [#4253](https://github.com/dequelabs/axe-core/issues/4253) - **color-contrast:** support color blend modes hue, saturation, color, luminosity ([#4365](https://github.com/dequelabs/axe-core/issues/4365)) ([7ae4761](https://github.com/dequelabs/axe-core/commit/7ae476124d60eafd28d85abf48188cd85c99543a)) - **d.ts:** RawNodesResult issues ([#4229](https://github.com/dequelabs/axe-core/issues/4229)) ([d660518](https://github.com/dequelabs/axe-core/commit/d6605181ec942bcca46e3bfe889064b3781919ca)) - **d.ts:** RunOptions.reporter can be any string ([#4218](https://github.com/dequelabs/axe-core/issues/4218)) ([e53f5c5](https://github.com/dequelabs/axe-core/commit/e53f5c5184a0e5f75db65e7929a9da84d7ee6df6)) - **i18n:** update Italian translations ([#4377](https://github.com/dequelabs/axe-core/issues/4377)) ([4d65d4b](https://github.com/dequelabs/axe-core/commit/4d65d4bf40f4ee2697e079451dd84a0155e8fb51)) - **listitem:** clarify roleNotValid message ([#4374](https://github.com/dequelabs/axe-core/issues/4374)) ([0f8a9af](https://github.com/dequelabs/axe-core/commit/0f8a9af2a82d49e7d8ff3024da0e4c485ca46d38)) - **scrollable-region-focusable:** missing wcag213 tag ([#4201](https://github.com/dequelabs/axe-core/issues/4201)) ([0080a72](https://github.com/dequelabs/axe-core/commit/0080a7255eb7f246bb7b6f53974a95b65983b83a)) - **target-size:** always pass 10x targets (avoid perf bottleneck) ([#4376](https://github.com/dequelabs/axe-core/issues/4376)) ([be327c4](https://github.com/dequelabs/axe-core/commit/be327c422f67ac657218f711b3b799567ba3aa37)) - **target-size:** do not crash for nodes with many overlapping widgets ([#4373](https://github.com/dequelabs/axe-core/issues/4373)) ([1dbea83](https://github.com/dequelabs/axe-core/commit/1dbea83d4749f9f71f263883869b076b0d42021f)), closes [#4359](https://github.com/dequelabs/axe-core/issues/4359) [#4359](https://github.com/dequelabs/axe-core/issues/4359) [#4360](https://github.com/dequelabs/axe-core/issues/4360) - **utils/get-selector:** ignore 'xmlns' attribute when generating a selector ([#4303](https://github.com/dequelabs/axe-core/issues/4303)) ([938b411](https://github.com/dequelabs/axe-core/commit/938b411bb0609b54e5c46a8e5b50c9ea4de4bdee)) ### [4.8.4](https://github.com/dequelabs/axe-core/compare/v4.8.3...v4.8.4) (2024-02-07) ### Bug Fixes - Add LICENSE-3RD-PARTY.txt file ([#4304](https://github.com/dequelabs/axe-core/issues/4304)) ([139c553](https://github.com/dequelabs/axe-core/commit/139c5535c72e926f03bb37a9ba0b7fd6b97cba8c)) - avoid reading element-specific node properties of non-element node types ([#4317](https://github.com/dequelabs/axe-core/issues/4317)) ([a2a6935](https://github.com/dequelabs/axe-core/commit/a2a69355ea5aafce14367cf967153f7958a8878c)), closes [#4316](https://github.com/dequelabs/axe-core/issues/4316) [#4316](https://github.com/dequelabs/axe-core/issues/4316) - **d.ts:** RawNodesResult issues ([#4229](https://github.com/dequelabs/axe-core/issues/4229)) ([f105266](https://github.com/dequelabs/axe-core/commit/f1052662b3b8b57d520fcbd23a3e9d4a5660a7e1)) - **d.ts:** RunOptions.reporter can be any string ([#4218](https://github.com/dequelabs/axe-core/issues/4218)) ([80de793](https://github.com/dequelabs/axe-core/commit/80de793362bbbffde85654e874942a26df0108a8)) - **utils/get-selector:** ignore 'xmlns' attribute when generating a selector ([#4303](https://github.com/dequelabs/axe-core/issues/4303)) ([8c68546](https://github.com/dequelabs/axe-core/commit/8c6854661f4613d0b7a6ba98bbfdc0c9ca61b4d1)) ### [4.8.3](https://github.com/dequelabs/axe-core/compare/v4.8.2...v4.8.3) (2023-12-18) ### Bug Fixes - add Object.values polyfill for node <=6 ([#4274](https://github.com/dequelabs/axe-core/issues/4274)) ([b39b0e6](https://github.com/dequelabs/axe-core/commit/b39b0e60b68f8c1e34dc056809a04f8ccf8f24c7)) ### [4.8.2](https://github.com/dequelabs/axe-core/compare/v4.8.1...v4.8.2) (2023-09-18) ### Bug Fixes - polyfill Object.hasOwn for node 14 ([#4152](https://github.com/dequelabs/axe-core/issues/4152)) ([c7b597b](https://github.com/dequelabs/axe-core/commit/c7b597b9ec9c74009f4ddac16d5311ee642ab352)) ### [4.8.1](https://github.com/dequelabs/axe-core/compare/v4.8.0...v4.8.1) (2023-09-08) ### Bug Fixes - **target-size:** show closest offset in message ([#4151](https://github.com/dequelabs/axe-core/issues/4151)) ([a0882f6](https://github.com/dequelabs/axe-core/commit/a0882f64610279adce39b015c7e62bf955e04a22)) ## [4.8.0](https://github.com/dequelabs/axe-core/compare/v4.7.2...v4.8.0) (2023-09-06) ### Consistent Rule Impact This release changes it so that a rule never changes what impact it reports. To facilitate this while without changing the impact on certain issues, some rules have been split. The following changes were involved: - Deprecate impact on checks; use rules instead ([#4114](https://github.com/dequelabs/axe-core/issues/4114)) ([2cc5547](https://github.com/dequelabs/axe-core/commit/2cc5547634ee783701675631ee3978129707e6f0)) - add rule aria-deprecated-role ([#4074](https://github.com/dequelabs/axe-core/issues/4074)) ([03f2771](https://github.com/dequelabs/axe-core/commit/03f2771ab43bd877b7919c29b4f5e737b5a69544)) - add rule aria-conditional-attr ([#4094](https://github.com/dequelabs/axe-core/issues/4094)) ([d417630](https://github.com/dequelabs/axe-core/commit/d417630e89a41603426c2bb545b49057f03ed8e5)) - **aria-input/toggle-field-name:** set impact always to serious ([#4095](https://github.com/dequelabs/axe-core/issues/4095)) ([e031d68](https://github.com/dequelabs/axe-core/commit/e031d68652229a80ba6ff7d02d29a50a846bfa5b)) - **aria-prohibited-attr:** add rule aria-prohibited-attr ([#4088](https://github.com/dequelabs/axe-core/issues/4088)) ([7b115d3](https://github.com/dequelabs/axe-core/commit/7b115d3a9e7256ae2c0a1d7d0f9ba791a06c8599)) - **impact:** aria-roles / aria-valid-attr-value is always "critical" ([#4112](https://github.com/dequelabs/axe-core/issues/4112)) ([5cc8041](https://github.com/dequelabs/axe-core/commit/5cc8041f74a6f015dcbca36ee7414767528277c2)) - **impact:** scope-attr-valid is always "moderate" ([#4113](https://github.com/dequelabs/axe-core/issues/4113)) ([131f552](https://github.com/dequelabs/axe-core/commit/131f5524e8c8022ace047ac6d69d779460c85fe6)) ### Other Features - deprecate & disable duplicate-id / duplicate-id-active ([#4071](https://github.com/dequelabs/axe-core/issues/4071)) ([733c45e](https://github.com/dequelabs/axe-core/commit/733c45e6a40a9f8ff6e75f7db864edff0b404ca2)) - **duplicate-id-aria:** set to review on fail and tag as wcag412 ([#4075](https://github.com/dequelabs/axe-core/issues/4075)) ([9f1a3e3](https://github.com/dequelabs/axe-core/commit/9f1a3e3cbffbe09eaf90fa254c6421fd4264cf4a)) - add EN.301.549 tags to rules ([#4063](https://github.com/dequelabs/axe-core/issues/4063)) ([de3da89](https://github.com/dequelabs/axe-core/commit/de3da897e56179d94ef8a0dc1a667b5663c489d1)) - **checks:** enable help-same-as-label, but remove from rules ([#4096](https://github.com/dequelabs/axe-core/issues/4096)) ([034038a](https://github.com/dequelabs/axe-core/commit/034038a625b390ed25b30fccc96e3fc1f384dbc1)) - **new-rule:** aria-braille-equivalent finds incorrect uses of aria-braille attributes ([#4107](https://github.com/dequelabs/axe-core/issues/4107)) ([6260a2f](https://github.com/dequelabs/axe-core/commit/6260a2f25781b465960aec0b1e7781be5496c9bd)) - **page-no-duplicate-banner/contentinfo:** deprecate options.nativeScopeFilter, take into ancestors with sectioning roles ([#4105](https://github.com/dequelabs/axe-core/issues/4105)) ([c6e07be](https://github.com/dequelabs/axe-core/commit/c6e07bec43ef1935f2afb9429e9f12a937c38f14)) ### Type Fixes & Improvements Various improvements were made to the types. Potentially the most impactful of which is that the `target` and `ancestry` property now return as `UnlabelledFrameSelector` instead of as `string[]`, which is incorrect for selectors involving shadow DOM. This may create some issues during migration for any code that has been incorrectly assuming these two properties have the `string[]` type. For more details and other type changes, see the commit itself: - **d.ts:** improve axe.d.ts types ([#4081](https://github.com/dequelabs/axe-core/issues/4081)) ([7c5f991](https://github.com/dequelabs/axe-core/commit/7c5f99143a1d97e294d21e14917f4963013fc6f8)), closes [#3966](https://github.com/dequelabs/axe-core/issues/3966) ### Bug Fixes - **access-name:** get name from header elements ([#4097](https://github.com/dequelabs/axe-core/issues/4097)) ([fbe99bf](https://github.com/dequelabs/axe-core/commit/fbe99bf87a3ebd7d6bc4b4eca7a58bbff28a5b23)) - add element semantics ([#4115](https://github.com/dequelabs/axe-core/issues/4115)) ([637bf6c](https://github.com/dequelabs/axe-core/commit/637bf6c58c3e62877511687d8a6046f8aee63f03)) - **aria-allowed-attr:** pass aria-expanded on checkbox & switch ([#4110](https://github.com/dequelabs/axe-core/issues/4110)) ([fcf76e0](https://github.com/dequelabs/axe-core/commit/fcf76e04d8534dfed75caf1f2c4a74ef4faa29ae)), closes [#3339](https://github.com/dequelabs/axe-core/issues/3339) - **aria-allowed-role:** Add doc-glossary to allowed roles for aside element ([#4083](https://github.com/dequelabs/axe-core/issues/4083)) ([6ca38f6](https://github.com/dequelabs/axe-core/commit/6ca38f65c28e9df0c429df1018b519394e22507e)) - **aria-allowed-role:** add meter to allowed roles for named img ([#4055](https://github.com/dequelabs/axe-core/issues/4055)) ([173f29d](https://github.com/dequelabs/axe-core/commit/173f29da9558a1fd0510609aacc9e4deebdf74b4)), closes [#4054](https://github.com/dequelabs/axe-core/issues/4054) - **aria-required-childen:** test visibility of grandchildren ([#4091](https://github.com/dequelabs/axe-core/issues/4091)) ([a202b69](https://github.com/dequelabs/axe-core/commit/a202b69b955b45fc10abe06059925013bede07eb)) - **aria-text:** typo in rule description ([#4131](https://github.com/dequelabs/axe-core/issues/4131)) ([85a0e9c](https://github.com/dequelabs/axe-core/commit/85a0e9c358ae78b4ceb2093dc9891d523eaf25b2)) - **aria-valid-attr-value:** allow empty value on aria-braille\* & aria-valuetext ([#4109](https://github.com/dequelabs/axe-core/issues/4109)) ([c4c3e65](https://github.com/dequelabs/axe-core/commit/c4c3e658408d89b5ccd747d5fad9031c5d3a0de0)) - avoid memory issues by doing better cleanup ([#4059](https://github.com/dequelabs/axe-core/issues/4059)) ([16c5cfa](https://github.com/dequelabs/axe-core/commit/16c5cfa66615537b2131a5a381fbed9a5336d853)) - avoid problems from element IDs that exist on object prototype ([#4060](https://github.com/dequelabs/axe-core/issues/4060)) ([8d135dd](https://github.com/dequelabs/axe-core/commit/8d135dd58ccd72393b981464f66a01e770d9cf95)) - **color-contrast:** correctly handle flex and position ([#4086](https://github.com/dequelabs/axe-core/issues/4086)) ([9d5f496](https://github.com/dequelabs/axe-core/commit/9d5f496c4ee7e95d113cdceab284fb6ca7be98e3)) - **color-contrast:** get text stoke from offset shadows ([#4079](https://github.com/dequelabs/axe-core/issues/4079)) ([13acffe](https://github.com/dequelabs/axe-core/commit/13acffe540f834f5321f9c5c124b565cec92ce06)) - **color-contrast:** ignore format unicode characters ([#4102](https://github.com/dequelabs/axe-core/issues/4102)) ([049522e](https://github.com/dequelabs/axe-core/commit/049522e3ef0676b198763e39e8c8a300c8eeb195)) - **color-contrast:** ignore zero width characters ([#4103](https://github.com/dequelabs/axe-core/issues/4103)) ([4deb0a0](https://github.com/dequelabs/axe-core/commit/4deb0a0876d574c3d7d586b27ae07d4f5be586db)) - **color-contrast:** process non-rgb color functions ([#4092](https://github.com/dequelabs/axe-core/issues/4092)) ([9634282](https://github.com/dequelabs/axe-core/commit/963428256d7a119c7b6188868eb9d4a4651a8949)) - **commons/dom/createGrid:** only add the visible, non-overflow areas of an element to the grid ([#4101](https://github.com/dequelabs/axe-core/issues/4101)) ([d77f47b](https://github.com/dequelabs/axe-core/commit/d77f47b8dd346e205b6cddb4f6ce544ef5f699e4)) - ensure reporter errors can propagate ([#4111](https://github.com/dequelabs/axe-core/issues/4111)) ([080cc1b](https://github.com/dequelabs/axe-core/commit/080cc1b5f5ed048ab435c312dec291d1b4eb4393)) - ignore stylesheets fetching style tag in jsdom ([#4138](https://github.com/dequelabs/axe-core/issues/4138)) ([d7c16a4](https://github.com/dequelabs/axe-core/commit/d7c16a481d5a5f68c1e970040e01f125b2025378)) - **jsdom:** allow axe.setup() without a global window ([#4116](https://github.com/dequelabs/axe-core/issues/4116)) ([33b0314](https://github.com/dequelabs/axe-core/commit/33b0314922762c0e562b613219b5cc96e3ce31f5)) - **target-size:** correctly calculate bounding box ([#4125](https://github.com/dequelabs/axe-core/issues/4125)) ([1494b4c](https://github.com/dequelabs/axe-core/commit/1494b4c2159fbae2a937cc7c3dc1d269915ef4d4)) - **target-size:** update to match new spacing requirements ([#4117](https://github.com/dequelabs/axe-core/issues/4117)) ([49eaa0e](https://github.com/dequelabs/axe-core/commit/49eaa0e1663724f70b2571cc7393e306bf0c7321)) - Use correct copyright year ([#4098](https://github.com/dequelabs/axe-core/issues/4098)) ([cab6a2b](https://github.com/dequelabs/axe-core/commit/cab6a2b2f012f5963d0f4294217578c790508fcc)) - **utils/clone:** don't try to clone elements from different window context ([#4072](https://github.com/dequelabs/axe-core/issues/4072)) ([55000d0](https://github.com/dequelabs/axe-core/commit/55000d066f018e4c3f2b9ec4eabf23eb1781dfbb)) ### [4.7.2](https://github.com/dequelabs/axe-core/compare/v4.7.1...v4.7.2) (2023-05-25) ### Bug Fixes - **aria-allowed-attr:** Add 'aria-required' to switch role ([#4029](https://github.com/dequelabs/axe-core/issues/4029)) ([cb51be4](https://github.com/dequelabs/axe-core/commit/cb51be4e3ed69e8e8b3725cab5ad1a4671f64c0c)), closes [#4027](https://github.com/dequelabs/axe-core/issues/4027) - **aria-allowed-attr:** allow aria-required on role=slider ([#4035](https://github.com/dequelabs/axe-core/issues/4035)) ([bb2bf60](https://github.com/dequelabs/axe-core/commit/bb2bf606d75409722c645a3b2e3240cbce7e97ef)) - **aria-required-children:** set related nodes for invalid children ([#4033](https://github.com/dequelabs/axe-core/issues/4033)) ([377f72b](https://github.com/dequelabs/axe-core/commit/377f72b16a4db5272b6c056a070e977dc0589cf5)) - **tags:** Add / correct several TTv5 tags ([#4031](https://github.com/dequelabs/axe-core/issues/4031)) ([25859dd](https://github.com/dequelabs/axe-core/commit/25859dd737e271f69e3912d69ede2a127d78caa4)) ### [4.7.1](https://github.com/dequelabs/axe-core/compare/v4.7.0...v4.7.1) (2023-05-15) ### Bug Fixes - **aria-allowed-attr:** no inconsistent aria-checked on HTML checkboxes ([#3895](https://github.com/dequelabs/axe-core/issues/3895)) ([704043e](https://github.com/dequelabs/axe-core/commit/704043e8a4b9359e871403c3b4fc294b9feee931)) - **aria-allowed-attrs:** add aria-expanded to allowed attrs for menuitemcheckbox and menuitemradio ([#3994](https://github.com/dequelabs/axe-core/issues/3994)) ([0f405c6](https://github.com/dequelabs/axe-core/commit/0f405c6da55570db2d536e2a4a5464865d73e821)) - **aria-required-children:** trigger reviewEmpty with hidden children ([#4012](https://github.com/dequelabs/axe-core/issues/4012)) ([a19b6cb](https://github.com/dequelabs/axe-core/commit/a19b6cb5252deb062f6170ab035d804742e7c1df)) - **color-contrast:** support CSS 4 color spaces ([#4020](https://github.com/dequelabs/axe-core/issues/4020)) ([65621c3](https://github.com/dequelabs/axe-core/commit/65621c339fd42798cb3ce66bac62865e62926e8c)) - **link-in-text-block:** set links with pseudo-content for review ([#4005](https://github.com/dequelabs/axe-core/issues/4005)) ([949f4f8](https://github.com/dequelabs/axe-core/commit/949f4f8dfccd018b88f929bd650dc8920ce4f6f0)) ## [4.7.0](https://github.com/dequelabs/axe-core/compare/v4.6.3...v4.7.0) (2023-04-17) ### Features - **aria-roledescription:** deprecate rule ([#3948](https://github.com/dequelabs/axe-core/issues/3948)) ([1913a9e](https://github.com/dequelabs/axe-core/commit/1913a9eaf0e669927c57d56710053303cda193f8)) - **aria-roles:** deprecate the ARIA directory role ([#3952](https://github.com/dequelabs/axe-core/issues/3952)) ([893fdd0](https://github.com/dequelabs/axe-core/commit/893fdd0901f9218d9add39c16b2e6b77227fbdcd)) - **d.ts:** setup/teardown, reporters & metadata definitions ([#3966](https://github.com/dequelabs/axe-core/issues/3966)) ([78264ee](https://github.com/dequelabs/axe-core/commit/78264ee663d528bc3fbfc9ea7dbba180259f01af)) - deprecate bower ([#3889](https://github.com/dequelabs/axe-core/issues/3889)) ([651d811](https://github.com/dequelabs/axe-core/commit/651d811f0f1d1dfc5ab899568eaeb83931011f34)) - deprecate color.filteredRectStack, color.getRectStack, and dom.visuallyContains ([#3859](https://github.com/dequelabs/axe-core/issues/3859)) ([3be2bad](https://github.com/dequelabs/axe-core/commit/3be2bad2a896e72a92fe70810500fc1ef67b7027)) - **dom.focusDisabled,dom.isVisibleForScreenreader:** support the inert attribute ([#3857](https://github.com/dequelabs/axe-core/issues/3857)) ([273c971](https://github.com/dequelabs/axe-core/commit/273c97199bd596a288378427becba672b4482678)) - **metadata:** add Trusted Tester tag ([#3986](https://github.com/dequelabs/axe-core/issues/3986)) ([1f6a2a6](https://github.com/dequelabs/axe-core/commit/1f6a2a68ac10c770091741b328de7efb2ccc6687)) - support the dialog element ([#3902](https://github.com/dequelabs/axe-core/issues/3902)) ([d4522cd](https://github.com/dequelabs/axe-core/commit/d4522cdd7a90018336098f9b2119e353bd5a71ee)) ### Bug Fixes - **aria-allowed-attrs:** allow aria-description and aria-braille\* attrs ([#3956](https://github.com/dequelabs/axe-core/issues/3956)) ([2842395](https://github.com/dequelabs/axe-core/commit/2842395f9a8990f670e7025749ff8301b68a15ae)) - **aria-input-field-name:** skip combobox popups ([#3886](https://github.com/dequelabs/axe-core/issues/3886)) ([3dcdd42](https://github.com/dequelabs/axe-core/commit/3dcdd42d9ce52817d0931aa4fea1ec2b1fc9d650)) - **aria-required-children:** allow separator in menu(bar) ([#3868](https://github.com/dequelabs/axe-core/issues/3868)) ([ec9f507](https://github.com/dequelabs/axe-core/commit/ec9f50708a233acfa4f9b851618077d6637e6582)) - **aria-required-children:** do not fail for children with aria-hidden ([#3949](https://github.com/dequelabs/axe-core/issues/3949)) ([8714d6b](https://github.com/dequelabs/axe-core/commit/8714d6ba6debec93d095f5f12385d92c55b0d4b3)) - **aria-required-children:** list elements that are not allowed ([#3951](https://github.com/dequelabs/axe-core/issues/3951)) ([cce7586](https://github.com/dequelabs/axe-core/commit/cce75869be032006dc505a2af853886943973319)) - **autocomplete-valid:** allow webauthn token ([#3866](https://github.com/dequelabs/axe-core/issues/3866)) ([fd3010f](https://github.com/dequelabs/axe-core/commit/fd3010ff74eb677d4a84198bb1ca314d54393cb7)) - **color-contrast:** correcly apply opacity to foreground color ([#3973](https://github.com/dequelabs/axe-core/issues/3973)) ([d7db279](https://github.com/dequelabs/axe-core/commit/d7db279549c443c1e2f43a6b33ebee0968c64325)) - **color-contrast:** correctly calculate contrast of flex/grid items with z-index ([#3884](https://github.com/dequelabs/axe-core/issues/3884)) ([cef96be](https://github.com/dequelabs/axe-core/commit/cef96be6740657047031c2019908822f957e6c63)) - **color-contrast:** correctly compute background color for elements with opacity ([#3944](https://github.com/dequelabs/axe-core/issues/3944)) ([c051fe8](https://github.com/dequelabs/axe-core/commit/c051fe851fb5eaa75e6dc0205c4db5e75d80f3a4)), closes [#3932](https://github.com/dequelabs/axe-core/issues/3932) - **color-contrast:** correctly compute color contrast of elements ([#3847](https://github.com/dequelabs/axe-core/issues/3847)) ([4c3a00c](https://github.com/dequelabs/axe-core/commit/4c3a00c7bd6de68b2795be37113a59d804d0a313)) - **color-contrast:** do not check contrast on elemets that are inerted ([#3894](https://github.com/dequelabs/axe-core/issues/3894)) ([da19946](https://github.com/dequelabs/axe-core/commit/da19946db610c3ab8898431645274a8a76d61a33)) - **color-contrast:** skip ligature icons ([#3867](https://github.com/dequelabs/axe-core/issues/3867)) ([9486288](https://github.com/dequelabs/axe-core/commit/948628894e3119e7f6ad45a230fbee23ffe64ef2)) - **create-grid:** correctly compute stack order for non-positioned stacking contexts ([#3930](https://github.com/dequelabs/axe-core/issues/3930)) ([8db2c24](https://github.com/dequelabs/axe-core/commit/8db2c2492d55a903b7903ed71f8b792e58dc2e8c)), closes [#3932](https://github.com/dequelabs/axe-core/issues/3932) - **css-orientation-lock:** support the css rotate property ([#3958](https://github.com/dequelabs/axe-core/issues/3958)) ([c51f8bf](https://github.com/dequelabs/axe-core/commit/c51f8bfea87b57c269e509f88d64855368a25493)) - **focus-order-semantics:** Add ARIA role article to list of valid roles for scrollable regions ([#3927](https://github.com/dequelabs/axe-core/issues/3927)) ([f029271](https://github.com/dequelabs/axe-core/commit/f0292714b94a1483f4148f3ca7206897cfb21318)) - **is-icon-ligature:** prevent canvas2d warning willReadFrequently ([#3931](https://github.com/dequelabs/axe-core/issues/3931)) ([b3c52bb](https://github.com/dequelabs/axe-core/commit/b3c52bbb6eccda67dabcbf4183d7c201a227a0ac)) - **link-in-text-block:** allow links with identical colors ([#3861](https://github.com/dequelabs/axe-core/issues/3861)) ([5f90040](https://github.com/dequelabs/axe-core/commit/5f900402470f925686a0d8b41ac01731492bbd30)) - **respondable:** work with CDP `Page.setDocumentContent` ([#3921](https://github.com/dequelabs/axe-core/issues/3921)) ([66f23e5](https://github.com/dequelabs/axe-core/commit/66f23e59b6deddd3b95035545d622d761abe5825)) - **scrollable-region-focusable:** change impact to serious ([#3959](https://github.com/dequelabs/axe-core/issues/3959)) ([e3a5c21](https://github.com/dequelabs/axe-core/commit/e3a5c211fe007736d98a16d69995318c2c651f2d)) - **scrollable-region-focusable:** skip native controls ([#3862](https://github.com/dequelabs/axe-core/issues/3862)) ([b0bdefa](https://github.com/dequelabs/axe-core/commit/b0bdefa34b85363e742ff04e319c014fe95f31f7)) ### [4.6.3](https://github.com/dequelabs/axe-core/compare/v4.6.2...v4.6.3) (2023-01-23) ### Bug Fixes - **aria-required-children:** allow separator in menu(bar) ([#3868](https://github.com/dequelabs/axe-core/issues/3868)) ([46c9499](https://github.com/dequelabs/axe-core/commit/46c9499ff46b2062098c33f2037ab31bff4fb656)) - **autocomplete-valid:** allow webauthn token ([#3866](https://github.com/dequelabs/axe-core/issues/3866)) ([a3d1b9d](https://github.com/dequelabs/axe-core/commit/a3d1b9dae840e1c6ad096895bbd3bbc19f6836f8)) - **color-contrast:** correctly compute color contrast of elements ([#3847](https://github.com/dequelabs/axe-core/issues/3847)) ([844cea1](https://github.com/dequelabs/axe-core/commit/844cea1238ccb30cc1c4d1510f2bb3d4cfbe1706)) - **color-contrast:** skip ligature icons ([#3867](https://github.com/dequelabs/axe-core/issues/3867)) ([7dfbd9a](https://github.com/dequelabs/axe-core/commit/7dfbd9a1b2c92a8aa289f42635ec93de9aa32d25)) - **link-in-text-block:** allow links with identical colors ([#3861](https://github.com/dequelabs/axe-core/issues/3861)) ([6761f36](https://github.com/dequelabs/axe-core/commit/6761f36bb7c9a2f05cea75ca88c8e0f199c032df)) - **scrollable-region-focusable:** skip native controls ([#3862](https://github.com/dequelabs/axe-core/issues/3862)) ([aaf44e9](https://github.com/dequelabs/axe-core/commit/aaf44e908337cbf81c97433f58ec05cd3b3eeded)) ### [4.6.2](https://github.com/dequelabs/axe-core/compare/v4.6.1...v4.6.2) (2022-12-23) ### Bug Fixes - **color-contrast:** fix color-contrast check when running in an extension ([#3838](https://github.com/dequelabs/axe-core/issues/3838)) ([31a3e01](https://github.com/dequelabs/axe-core/commit/31a3e01e3df2ff4ab9ae4eebe93c644ce706a200)) ### [4.6.1](https://github.com/dequelabs/axe-core/compare/v4.6.0...v4.6.1) (2022-12-14) ### Bug Fixes - **d.ts:** add optional include to ContextObject ([#3830](https://github.com/dequelabs/axe-core/issues/3830)) ([36ed242](https://github.com/dequelabs/axe-core/commit/36ed242ec152d6d9bd05889229c4d37ae25a80c0)) ## [4.6.0](https://github.com/dequelabs/axe-core/compare/v4.5.2...v4.6.0) (2022-12-12) ### Features - **aria-required-attr:** require aria-controls on combobox and aria-valuenow on focusable separator ([#3786](https://github.com/dequelabs/axe-core/issues/3786)) ([5259e88](https://github.com/dequelabs/axe-core/commit/5259e8842e49d291d35aada0fefecfde3627299f)) - **checks/label-content-name-mismatch:** deprecate occuranceThreshold option in favor of occurrenceThreshold to fix typo ([#3782](https://github.com/dequelabs/axe-core/issues/3782)) ([5026d65](https://github.com/dequelabs/axe-core/commit/5026d65b5c93ca7ad1e52881fb5379a4a75ed9a1)) - **commons:** deprecate flattenShadowColors in favor of flattenColors ([#3792](https://github.com/dequelabs/axe-core/issues/3792)) ([af49daf](https://github.com/dequelabs/axe-core/commit/af49dafcde281443823c2d878ce4de23ee573212)) - **context:** allow selecting shadow DOM nodes ([#3798](https://github.com/dequelabs/axe-core/issues/3798)) ([9e1e31b](https://github.com/dequelabs/axe-core/commit/9e1e31b253398cc2a3e840c7cb9c5527f4e4ba66)) - **list,listitem:** do not allow group as allowed parent or child ([#3784](https://github.com/dequelabs/axe-core/issues/3784)) ([d1cbf6f](https://github.com/dequelabs/axe-core/commit/d1cbf6fe20a1920649566e521c0c6668efd0d470)) - **required-attr:** require aria-checked for checkbox-like and radio-like roles ([#3785](https://github.com/dequelabs/axe-core/issues/3785)) ([563e4e9](https://github.com/dequelabs/axe-core/commit/563e4e90facc9b955c1b2395b466cd65d72bf04e)) - **utils:** new shadowSelectAll utility ([#3796](https://github.com/dequelabs/axe-core/issues/3796)) ([5865462](https://github.com/dequelabs/axe-core/commit/586546261a9523077e1710cecf1751a5e6f172e6)) ### Bug Fixes - **aria-allowed-role:** allow combobox on button, checkbox and combobox on input[type=button] ([#3354](https://github.com/dequelabs/axe-core/issues/3354)) ([ac688c0](https://github.com/dequelabs/axe-core/commit/ac688c04b70d6bcdfa13ac4d7faf824d2bc4af01)), closes [#3353](https://github.com/dequelabs/axe-core/issues/3353) - **aria-required-children:** allow menu as child of menu ([#3820](https://github.com/dequelabs/axe-core/issues/3820)) ([a6569e5](https://github.com/dequelabs/axe-core/commit/a6569e5dcad2fd32160b78fba86c988e7cb3d323)) - **color-contrast:** consider -webkit-text-stroke & -webkit-text-fill-color ([#3791](https://github.com/dequelabs/axe-core/issues/3791)) ([228daf1](https://github.com/dequelabs/axe-core/commit/228daf153b3c6e45933a2ca8feac765f942663f4)) - **color-contrast:** correctly calculate background color of text nodes with different size than their container ([#3703](https://github.com/dequelabs/axe-core/issues/3703)) ([123b83c](https://github.com/dequelabs/axe-core/commit/123b83c00f0e770dd784ce72ab1fddddf4a4961e)) - **get-role:** handle presentation role inheritance for vnodes with no parent ([#3801](https://github.com/dequelabs/axe-core/issues/3801)) ([b971caf](https://github.com/dequelabs/axe-core/commit/b971caf3eea03170c0710c5b00272fe13f65e825)) - **html-lang-valid:** only run rule when attribute has value ([#3663](https://github.com/dequelabs/axe-core/issues/3663)) ([1a7eecb](https://github.com/dequelabs/axe-core/commit/1a7eecb72c3b1c772392b7c18feee75e0f51dbcb)), closes [#3624](https://github.com/dequelabs/axe-core/issues/3624) - **metadata:** Map aria-required-children to ACT rule bc4a75 ([#3790](https://github.com/dequelabs/axe-core/issues/3790)) ([a33a523](https://github.com/dequelabs/axe-core/commit/a33a523eb4dfdc62743d78aab124e74afc98a59e)) ### [4.5.2](https://github.com/dequelabs/axe-core/compare/v4.5.1...v4.5.2) (2022-11-14) ### Bug Fixes - **aria-required-children:** allow menu and menubar to be empty ([#3770](https://github.com/dequelabs/axe-core/issues/3770)) ([d11aed8](https://github.com/dequelabs/axe-core/commit/d11aed8a04968674ff872cf832cea9252023490e)) - **create-grid:** include elements scrolled out of view in the grid ([#3773](https://github.com/dequelabs/axe-core/issues/3773)) ([a563263](https://github.com/dequelabs/axe-core/commit/a5632631c72f52a5cf38a955052f28b1a931f07c)) - do not warn when using webpack ([#3777](https://github.com/dequelabs/axe-core/issues/3777)) ([d6cef9a](https://github.com/dequelabs/axe-core/commit/d6cef9a83152256966b259881521c159b0cf21a8)) - **link-in-text-block:** don't match style or script text ([#3775](https://github.com/dequelabs/axe-core/issues/3775)) ([ab877f9](https://github.com/dequelabs/axe-core/commit/ab877f9d709205c2dadffc656f82dc631b66687b)) - prevent undefined relatedNodes from halting axe ([#3778](https://github.com/dequelabs/axe-core/issues/3778)) ([efefb18](https://github.com/dequelabs/axe-core/commit/efefb18f720590369a97c2937331f4e2e33ef6a5)) ### [4.5.1](https://github.com/dequelabs/axe-core/compare/v4.5.0...v4.5.1) (2022-11-01) ### Bug Fixes - allow axe to run in certain configurations of jsdom ([#3755](https://github.com/dequelabs/axe-core/issues/3755)) ([b74c5d4](https://github.com/dequelabs/axe-core/commit/b74c5d41c4041554c9dd1c00dfd6387cb069d1a5)) - prevent crash on jsdom when preloading CSSOM ([#3754](https://github.com/dequelabs/axe-core/issues/3754)) ([b1f0c6b](https://github.com/dequelabs/axe-core/commit/b1f0c6bba2debc6c6a106412da530975cd4ade24)) ## [4.5.0](https://github.com/dequelabs/axe-core/compare/v4.4.3...v4.5.0) (2022-10-17) ### Features #### Highlights - **new rule:** Add WCAG 2.2 target-size rule (off by default) ([#3616](https://github.com/dequelabs/axe-core/issues/3616)) ([691f1b6](https://github.com/dequelabs/axe-core/commit/691f1b69775daa8d0a620c5a1b72f06f6edc72c3)) - **new rule:** Add meta-refresh-no-exceptions (off by default, wcag2aaa) ([#3530](https://github.com/dequelabs/axe-core/issues/3530)) ([27031a8](https://github.com/dequelabs/axe-core/commit/27031a827cf273c87449971a4c6aec467e56986d)) - **identical-links-same-purpose:** Disable by default (wcag2aaa rule) ([#3615](https://github.com/dequelabs/axe-core/issues/3615)) ([a2c2d2f](https://github.com/dequelabs/axe-core/commit/a2c2d2fba67270b16f2421984650cadc91c8f928)) - **link-in-text-block:** Remove experimental and enable by default ([#3706](https://github.com/dequelabs/axe-core/issues/3706)) ([37b6e7a](https://github.com/dequelabs/axe-core/commit/37b6e7a56f7fae15553ce103787546c8927a6492)) - **i18n:** Add Norwegian Bokmål locale ([#3375](https://github.com/dequelabs/axe-core/issues/3375)) ([2886d33](https://github.com/dequelabs/axe-core/commit/2886d330d9bd7193947b6f8d650492efdd7b04ec)) - **i18n:** Add Hebrew translation ([#3438](https://github.com/dequelabs/axe-core/issues/3438)) ([b4162ed](https://github.com/dequelabs/axe-core/commit/b4162ed181d47370284e2fbbd56d4ec9b4585d69)) #### Tags and Metadata Updates Various changes of tags, for greater consistency with [ACT Rules](https://www.w3.org/WAI/standards-guidelines/act/rules/). - **area-alt:** Remove the wcag111 tag ([#3479](https://github.com/dequelabs/axe-core/issues/3479)) ([1c3cc51](https://github.com/dequelabs/axe-core/commit/1c3cc510057398bdbe2735da87bebbc2781f8e69)) - **aria-hidden-focus:** Remove the wcag131 tag ([#3477](https://github.com/dequelabs/axe-core/issues/3477)) ([36ace76](https://github.com/dequelabs/axe-core/commit/36ace76cd3b3706b19e59dc5168a77a5462e78b6)) - **empty-table-headers:** Rule is now best-practice and fails instead of incompletes ([#3427](https://github.com/dequelabs/axe-core/issues/3427)) ([0a4397d](https://github.com/dequelabs/axe-core/commit/0a4397d0998a3e3035d002e5f724cce4faf0b541)), closes [#3404](https://github.com/dequelabs/axe-core/issues/3404) - **frame-title:** Remove wcag241 tag ([#3519](https://github.com/dequelabs/axe-core/issues/3519)) ([9c6b828](https://github.com/dequelabs/axe-core/commit/9c6b828658d0a566e7b41801979e49115732bc86)) - **input-image-alt:** Add the wcag412 tag ([#3478](https://github.com/dequelabs/axe-core/issues/3478)) ([34272c6](https://github.com/dequelabs/axe-core/commit/34272c6469ff84b5aafd6ae575c5064931a62d80)) - **label,select-name:** Remove the sc131 tag ([#3476](https://github.com/dequelabs/axe-core/issues/3476)) ([7caef89](https://github.com/dequelabs/axe-core/commit/7caef89cdd0eddce7550b590eda3fb0cdc9be3ac)) - **meta-viewport:** Report as violation of wcag 1.4.4 ([#3704](https://github.com/dequelabs/axe-core/issues/3704)) ([6f7e4a9](https://github.com/dequelabs/axe-core/commit/6f7e4a9c08d0a9c8a9f74832883be9052a63684d)) - **metadata:** Update ACT tags & actIds ([#3498](https://github.com/dequelabs/axe-core/issues/3498)) ([571722b](https://github.com/dequelabs/axe-core/commit/571722bde4c2e0b84d7abdeece91a03e7b6613c8)) #### Deprecations - Deprecate Internet Explorer support ([#3644](https://github.com/dequelabs/axe-core/issues/3644)) ([11f5163](https://github.com/dequelabs/axe-core/commit/11f51632491e265136c0284cd219225627a7415f)) - Deprecate sri-history.json file ([#3646](https://github.com/dequelabs/axe-core/issues/3646)) ([6f6a89e](https://github.com/dequelabs/axe-core/commit/6f6a89e13d56acdda5dbcc74d1f2d7ba2190f0a6)) - Deprecate and replace dom.isVisible, utils.isHidden, and dom.isHiddenWithCss ([#3351](https://github.com/dequelabs/axe-core/issues/3351)) ([1ae2ac0](https://github.com/dequelabs/axe-core/commit/1ae2ac045d1f709d1695fa76886e13604d415229)) - Deprecate only-dlitems-evaluate & only-listitems-evaluate methods ([#3724](https://github.com/dequelabs/axe-core/issues/3724)) ([322e9ed](https://github.com/dequelabs/axe-core/commit/322e9edff389d407021d94a7dadf9b80e1c935de)) - Deprecate presentation-role-conflict-matchess ([#3638](https://github.com/dequelabs/axe-core/issues/3638)) ([0f02a15](https://github.com/dequelabs/axe-core/commit/0f02a1530b91dd38cbc620e358e403f5250cba4c)) - Deprecate is-visible-matches, use is-visible-on-screen-matches ([#3679](https://github.com/dequelabs/axe-core/issues/3679)) ([738dd8f](https://github.com/dequelabs/axe-core/commit/738dd8f38f241c061773b44dba3194281749eb15)) - Deprecate not-html-matches, use :not(html) instead ([#3540](https://github.com/dequelabs/axe-core/issues/3540)) ([e0010d9](https://github.com/dequelabs/axe-core/commit/e0010d9f2c4f80b41dcd1e1821de269dd5a63dac)) #### Others - **aria-roles:** Permit fallback roles ([#3683](https://github.com/dequelabs/axe-core/issues/3683)) ([5665260](https://github.com/dequelabs/axe-core/commit/5665260320543665d9df2b8620940b553bf17a19)) - **aria-required-children:** Allow aria-busy on children ([#3569](https://github.com/dequelabs/axe-core/issues/3569)) ([3618f50](https://github.com/dequelabs/axe-core/commit/3618f5017b698bfa7ebd5d36e37978ed8d2e77f9)) - **aria-required-children:** Fail for children which are not listed as required ([#3597](https://github.com/dequelabs/axe-core/issues/3597)) ([b5ceabc](https://github.com/dequelabs/axe-core/commit/b5ceabc25e4a17e8f3c114acdb1c2fe0d2ba96f3)) - **getRules:** Return actIds when set ([#3470](https://github.com/dequelabs/axe-core/issues/3470)) ([a3d5cef](https://github.com/dequelabs/axe-core/commit/a3d5cef612013ffe0db5383a4047508654444d3c)) - **is-in-tab-order:** Add isInTabOrder to commons ([#3619](https://github.com/dequelabs/axe-core/issues/3619)) ([77afe90](https://github.com/dequelabs/axe-core/commit/77afe903484343500ebe5fe6126cf6e029607f64)), closes [#3500](https://github.com/dequelabs/axe-core/issues/3500) - **list/definition-list:** Only allow required owned roles ([#3707](https://github.com/dequelabs/axe-core/issues/3707)) ([a920d35](https://github.com/dequelabs/axe-core/commit/a920d35f8d8e6f3590a01d47f20a0e3321e45a6c)) - **presentation-role-conflict:** Test img elements with empty alt ([#3717](https://github.com/dequelabs/axe-core/issues/3717)) ([ea32fa7](https://github.com/dequelabs/axe-core/commit/ea32fa794bfc72e863997dfa85a60e23a53f0cda)) ### Bug Fixes - **utils:** greatly improve the speed of querySelectorAll ([#3423](https://github.com/dequelabs/axe-core/issues/3423)) ([1cae5ea](https://github.com/dequelabs/axe-core/commit/1cae5eae49abe01e6f84c8ee18b5b0c2ff700492)) - **aria-hidden-focus:** Do not fail for focus trap bumper elements ([#3667](https://github.com/dequelabs/axe-core/issues/3667)) ([46b6658](https://github.com/dequelabs/axe-core/commit/46b6658af6ee21735b59c4c00455c13dddbce761)) - **aria-required-attr:** aria-valuenow is no longer required for spinbutton ([#3552](https://github.com/dequelabs/axe-core/issues/3552)) ([a22cf56](https://github.com/dequelabs/axe-core/commit/a22cf564be1f3e73fc21bff59ba895d34755f889)) - **aria-required-parent:** Allow nested group and presentational roles ([#3492](https://github.com/dequelabs/axe-core/issues/3492)) ([4685270](https://github.com/dequelabs/axe-core/commit/4685270af0d1f737d38a0c06b59137c967679227)) - **aria-valid-attr-value:** Report empty values as incomplete ([#3635](https://github.com/dequelabs/axe-core/issues/3635)) ([fff39db](https://github.com/dequelabs/axe-core/commit/fff39dba1408d2a11b15485191b843b0661e0790)) - **avoid-inline-spacing:** Add spacing threshold ([#3533](https://github.com/dequelabs/axe-core/issues/3533)) ([92add05](https://github.com/dequelabs/axe-core/commit/92add056355cc4106caaaf523854f82afb06e191)) - **checks/no-focusable-disable:** Don't count non-disableable elements as disabled ([#3393](https://github.com/dequelabs/axe-core/issues/3393)) ([bb8b5ca](https://github.com/dequelabs/axe-core/commit/bb8b5ca760f45755ba628ac5873350b5dc4c47d1)), closes [#2466](https://github.com/dequelabs/axe-core/issues/2466) [#2934](https://github.com/dequelabs/axe-core/issues/2934) [#2934](https://github.com/dequelabs/axe-core/issues/2934) [#3315](https://github.com/dequelabs/axe-core/issues/3315) - **checks/unsupportedrole:** Support unsupported dpub and fallback roles, add role to message ([#3395](https://github.com/dequelabs/axe-core/issues/3395)) ([3c0f10f](https://github.com/dequelabs/axe-core/commit/3c0f10f979ae1e3377dd6ef0d2b445ea5ec90eb3)), closes [#2466](https://github.com/dequelabs/axe-core/issues/2466) [#2934](https://github.com/dequelabs/axe-core/issues/2934) [#2934](https://github.com/dequelabs/axe-core/issues/2934) [#3282](https://github.com/dequelabs/axe-core/issues/3282) - **color-contrast-enhanced:** Avoid duplicates between color-contrast and color-contrast-enhanced ([#3714](https://github.com/dequelabs/axe-core/issues/3714)) ([2811f77](https://github.com/dequelabs/axe-core/commit/2811f778e1d0293148375bb4028d5ba0379f1b21)) - **color-contrast:** Correctly determine color contrast for element that exactly overlaps midpoint of node ([#3565](https://github.com/dequelabs/axe-core/issues/3565)) ([90de9aa](https://github.com/dequelabs/axe-core/commit/90de9aa241d9dbbd39ccb2714194ae3a7c0cb2ce)) - **frame-focusable-content:** don't fail for elements with negative tabindex ([#3493](https://github.com/dequelabs/axe-core/issues/3493)) ([94e75ac](https://github.com/dequelabs/axe-core/commit/94e75ac80689145297fbc2dc8298b772412c7525)) - **frame-title-unique:** Make frame-title-unique reviewOnly and WCAG412 ([#3610](https://github.com/dequelabs/axe-core/issues/3610)) ([8401b8e](https://github.com/dequelabs/axe-core/commit/8401b8e8fbf691d8252e090b13864b826c5e8591)), closes [#3487](https://github.com/dequelabs/axe-core/issues/3487) - **frame-title:** ignore frames with negative tabindex ([f61f825](https://github.com/dequelabs/axe-core/commit/f61f825843ec323fbe7ebb7096bf4c7341f10feb)) - **frame-title:** return incomplete for presentational iframe with empty title ([#3594](https://github.com/dequelabs/axe-core/issues/3594)) ([c2cfd84](https://github.com/dequelabs/axe-core/commit/c2cfd845bd1b0ff684b9cda4f7fb5f6f30fcfda7)) - **is-hidden-for-everyone:** count elements inside closed details as hidden ([#3726](https://github.com/dequelabs/axe-core/issues/3726)) ([e65e962](https://github.com/dequelabs/axe-core/commit/e65e9627cd709f6202dd2151ba39bac5a50a8fbb)) - **is-hidden-for-everyone:** support content-visibility: hidden ([#3690](https://github.com/dequelabs/axe-core/issues/3690)) ([95cf6e7](https://github.com/dequelabs/axe-core/commit/95cf6e7c3019358570b7dd7ea1206ce24a980b65)) - **is-visible-on-screen:** ignore elements hidden by overflow:hidden ([#3676](https://github.com/dequelabs/axe-core/issues/3676)) ([2935950](https://github.com/dequelabs/axe-core/commit/293595066cea9a5c18d2ed7bf4de69cbfffe1ed1)) - **label:** avoid passing labels because of an input[value] ([#3688](https://github.com/dequelabs/axe-core/issues/3688)) ([54a8116](https://github.com/dequelabs/axe-core/commit/54a8116546b056569d1551b8ea3c8b01fa7d8df5)) - **link-in-text-block:** Update rule to match current guidance, revise tests ([#3575](https://github.com/dequelabs/axe-core/issues/3575)) ([edb88ed](https://github.com/dequelabs/axe-core/commit/edb88edf48e91df87497b471e1b101842adf9e1f)) - **meta-refresh:** Add WCAG's 20-hour exception ([#3525](https://github.com/dequelabs/axe-core/issues/3525)) ([5beb6c3](https://github.com/dequelabs/axe-core/commit/5beb6c3c31936a8cb787709ef2bd11730916b5b2)) - **no-autoplay-audio:** add reviewOnFail and update tests ([#3557](https://github.com/dequelabs/axe-core/issues/3557)) ([60ec997](https://github.com/dequelabs/axe-core/commit/60ec99735b2872d7f992b379900acd25918e3f86)) - **object-alt:** ignore unloaded objects ([#3680](https://github.com/dequelabs/axe-core/issues/3680)) ([8e03e2c](https://github.com/dequelabs/axe-core/commit/8e03e2cabe628b036a48575ec84569e7e0e333ae)) - **page-has-heading-one,landmark-one-main:** do not fail if modal is open ([#3501](https://github.com/dequelabs/axe-core/issues/3501)) ([c6af316](https://github.com/dequelabs/axe-core/commit/c6af31600a804f1643d404e439391f3b810e8da5)) - **td-headers-attr:** ignore hidden cells with headers attr ([#3684](https://github.com/dequelabs/axe-core/issues/3684)) ([e0403f4](https://github.com/dequelabs/axe-core/commit/e0403f48ee86e883548cd1f40927a3b5edaeb974)) - **td-headers-attr:** ignore table elements with their role changed ([#3687](https://github.com/dequelabs/axe-core/issues/3687)) ([902d07c](https://github.com/dequelabs/axe-core/commit/902d07c8d2268dc4ab0a6573909bd348ede706b1)) - **utils.matches:** fix attribute exists selector to match empty attributes ([#3669](https://github.com/dequelabs/axe-core/issues/3669)) ([4b768ea](https://github.com/dequelabs/axe-core/commit/4b768ea2170291038be80b29f277206f21719dff)) - **valid-lang:** ignore lang on elements with no text ([#3523](https://github.com/dequelabs/axe-core/issues/3523)) ([fd85f39](https://github.com/dequelabs/axe-core/commit/fd85f3927ef85543887ff9c0bda67e46f8e9c316)) - **valid-lang:** run on aria-hidden text ([#3634](https://github.com/dequelabs/axe-core/issues/3634)) ([a0860bd](https://github.com/dequelabs/axe-core/commit/a0860bd7b5afaabf8f2aee2bd516b9015eb7b5cf)) - **video-caption:** remove excludeHidden: false ([#3554](https://github.com/dequelabs/axe-core/issues/3554)) ([a3e4bbe](https://github.com/dequelabs/axe-core/commit/a3e4bbec30fd7cf0f197fdf69d0886cd475b06c1)) ### [4.4.3](https://github.com/dequelabs/axe-core/compare/v4.4.2...v4.4.3) (2022-07-13) ### Bug Fixes - **axe.d.ts:** updates type definition for Rule to add reviewOnFail ([#3521](https://github.com/dequelabs/axe-core/issues/3521)) ([afb2478](https://github.com/dequelabs/axe-core/commit/afb247844e697475f5bf81fd7b03ed30c2c65830)) - Continue supporting Node >=4 ([#3538](https://github.com/dequelabs/axe-core/issues/3538)) ([da7923b](https://github.com/dequelabs/axe-core/commit/da7923bd5bcaa71f52f6b4e6b8eece1ea12c1c2a)), closes [#3537](https://github.com/dequelabs/axe-core/issues/3537) ### [4.4.2](https://github.com/dequelabs/axe-core/compare/v4.4.1...v4.4.2) (2022-05-12) ### Bug Fixes - **aria-hidden-focusable:** report incomplete with onfocus ([#3407](https://github.com/dequelabs/axe-core/issues/3407)) ([6755e89](https://github.com/dequelabs/axe-core/commit/6755e8961389ba2fcf87c7877737482b819a0553)) - **aria-hidden-focus:** Update rule help & description ([#3422](https://github.com/dequelabs/axe-core/issues/3422)) ([7cfb4b1](https://github.com/dequelabs/axe-core/commit/7cfb4b1c468231022838bbbe9edef69fa50de891)) - **aria-valid-attr-value:** add note about element id being in a different shadow DOM tree ([#3421](https://github.com/dequelabs/axe-core/issues/3421)) ([24f74df](https://github.com/dequelabs/axe-core/commit/24f74df8474cfd4f602cb368563955ff42cc2870)) - **color-contrast:** consistently return color contrast information in the data object for pseudo elements ([#3453](https://github.com/dequelabs/axe-core/issues/3453)) ([1a9d95e](https://github.com/dequelabs/axe-core/commit/1a9d95effeaca26e2d7cf7aa867e6a76f8cf50ad)) - **deprecatedrole,color-contrast:** fix message to properly include deprecated role, improve color-contrast pass messages ([#3387](https://github.com/dequelabs/axe-core/issues/3387)) ([650e503](https://github.com/dequelabs/axe-core/commit/650e5037dc1f8908897e834ee1ab3aa8e87ac1e7)) - **html-elms:** update role allowances for nav element ([#3402](https://github.com/dequelabs/axe-core/issues/3402)) ([8aa816a](https://github.com/dequelabs/axe-core/commit/8aa816a15fbd667ee2bf8256a984dcc8aa7c0392)), closes [#3401](https://github.com/dequelabs/axe-core/issues/3401) - **standards:** fix address typo in html-elms.js ([#3418](https://github.com/dequelabs/axe-core/issues/3418)) ([f235cc7](https://github.com/dequelabs/axe-core/commit/f235cc7069734096df8db434d4c1e68f11fcc88d)), closes [#3417](https://github.com/dequelabs/axe-core/issues/3417) ## [4.4.1](https://github.com/dequelabs/axe-core/compare/v4.4.0...v4.4.1) (2022-02-03) ### Bug Fixes - **DPUB:** deprecate endnote, rather than endnotes (plural) ([#3373](https://github.com/dequelabs/axe-core/issues/3373)) ([1ba9917](https://github.com/dequelabs/axe-core/pull/3377/commits/1ba9917801df9194092769c7c58f048884bc25fd)) - **d.ts:** correct getFrameContexts return type ([#3370](https://github.com/dequelabs/axe-core/issues/3370)) ([a1b9611](https://github.com/dequelabs/axe-core/commit/a1b96113add29756a421e3934cb089d3734dec16)) ## [4.4.0](https://github.com/dequelabs/axe-core/compare/v4.3.5...v4.4.0) (2022-01-26) ### Features - add new ARIA roles ([#3138](https://github.com/dequelabs/axe-core/issues/3138)) ([61be7e5](https://github.com/dequelabs/axe-core/commit/61be7e555152d89c6770679fd6fdac10038f7cd3)) - **aria-allowed-attr:** report violation for non-global ARIA attrs on element without role ([#3342](https://github.com/dequelabs/axe-core/issues/3342)) ([fb5d990](https://github.com/dequelabs/axe-core/commit/fb5d99005cf5e989a51b276b88ad67011cc02d49)) - **aria-allowed-attr:** report violations for non-global ARIA attributes on elements without a role ([#3102](https://github.com/dequelabs/axe-core/issues/3102)) ([87cfc0b](https://github.com/dequelabs/axe-core/commit/87cfc0b4f4d998a88a2d534438e4f2ccf9427a86)) - **color-contrast:** add support for CSS mix-blend-mode ([#3226](https://github.com/dequelabs/axe-core/issues/3226)) ([d497f40](https://github.com/dequelabs/axe-core/commit/d497f40026ba2266e31e7e8802511eb242ef0066)) - **commons:** deprecate shadowElementsFromPoint ([#3311](https://github.com/dequelabs/axe-core/issues/3311)) ([c3a7d16](https://github.com/dequelabs/axe-core/commit/c3a7d1648d0e319003f573f6b4cfe94a1a043808)) - **configure:** Deprecate branding: Object, use a string instead. ([#3278](https://github.com/dequelabs/axe-core/issues/3278)) ([1f01309](https://github.com/dequelabs/axe-core/commit/1f0130993b64e2016fcc9ea17f63f8da380de513)) - **dpub:** upgrade to DPUB 1.1 and report deprecated roles ([#3280](https://github.com/dequelabs/axe-core/issues/3280)) ([034a846](https://github.com/dequelabs/axe-core/commit/034a846cf38bff4ff5836b22c78c0f44e2cb3f6d)) - **options:** make axe.ping configurable with pingWaitTime ([#3273](https://github.com/dequelabs/axe-core/issues/3273)) ([ce4dfaf](https://github.com/dequelabs/axe-core/commit/ce4dfaff7b98c69e15290b71f76e1c523c78ed8d)) - **rule:** add new color-contrast-enhanced rule (WCAG AAA) ([#3235](https://github.com/dequelabs/axe-core/issues/3235)) ([bec20fc](https://github.com/dequelabs/axe-core/commit/bec20fcbf2f407ecab2fc6d0d829d23525989d48)), closes [#2934](https://github.com/dequelabs/axe-core/issues/2934) ### Bug Fixes - **allowed-role:** area without href can have a button or link role ([#3275](https://github.com/dequelabs/axe-core/issues/3275)) ([bf7e60a](https://github.com/dequelabs/axe-core/commit/bf7e60aad9b00844c2b18691d463d5478b53aa2a)) - **aria-allowed-attr:** check for invalid `aria-attributes` for `role="row"` ([#3160](https://github.com/dequelabs/axe-core/issues/3160)) ([cfa900d](https://github.com/dequelabs/axe-core/commit/cfa900d57265907b638dad36ba405a5b40dbde9c)) - **aria-allowed-attr:** revert violation for non-global ARIA attrs on element without role ([#3243](https://github.com/dequelabs/axe-core/issues/3243)) ([112b960](https://github.com/dequelabs/axe-core/commit/112b960ee95b6a6abfb38a15b7092d9847512f0f)) - **aria-allowed-children,aria-allowed-parent:** allow group role in listbox ([#3195](https://github.com/dequelabs/axe-core/issues/3195)) ([cb01975](https://github.com/dequelabs/axe-core/commit/cb019755d9cb52b997aae340f406ac26d0cf90e5)) - **aria-allowed-role:** allow title, aria-label and aria-labelledby on a img element with a supported role ([#3224](https://github.com/dequelabs/axe-core/issues/3224)) ([006a681](https://github.com/dequelabs/axe-core/commit/006a681395422bbd0603bab346dbdc6b38087d83)) - **aria-allowed-role:** landmark roles banner on header and contentinfo on footer to only report on top-level rule ([#3142](https://github.com/dequelabs/axe-core/issues/3142)) ([1fd4b00](https://github.com/dequelabs/axe-core/commit/1fd4b004b2543727d4a3775f355934327765baa1)) - **aria-allowed-roles:** allow role=radio on img with non-empty name ([#3320](https://github.com/dequelabs/axe-core/issues/3320)) ([accafdf](https://github.com/dequelabs/axe-core/commit/accafdfe170b8ad4b3706134d60808a614e40b00)) - **aria-allowed-roles:** update role allowances for section element ([#3238](https://github.com/dequelabs/axe-core/issues/3238)) ([99676ec](https://github.com/dequelabs/axe-core/commit/99676ece547be39d71e776a5b9cae2da41c31572)), closes [#3237](https://github.com/dequelabs/axe-core/issues/3237) - **aria-allowed-role:** Update allowed roles based on ARIA spec updates ([#3124](https://github.com/dequelabs/axe-core/issues/3124)) ([00f6efc](https://github.com/dequelabs/axe-core/commit/00f6efcd55eb0a4c56cc3ca1acc7c79e3d22f58d)) - **aria-allowed-role:** updates the allowed roles for the wbr element to none and presentation ([#3192](https://github.com/dequelabs/axe-core/issues/3192)) ([2f439b3](https://github.com/dequelabs/axe-core/commit/2f439b3fdb7e7fa3228e663c5313af0f08aa4327)), closes [#3177](https://github.com/dequelabs/axe-core/issues/3177) - **aria-prohibited-attr:** update metadata message ([#3206](https://github.com/dequelabs/axe-core/issues/3206)) ([d1a768e](https://github.com/dequelabs/axe-core/commit/d1a768eaefe6d1c95e925174bc979bc7a95ee7d9)) - **autocomplete-valid:** Allow custom autocomplete attribute values ([#3225](https://github.com/dequelabs/axe-core/issues/3225)) ([6076ee8](https://github.com/dequelabs/axe-core/commit/6076ee8a7ba7527c9886916db1eda5d90cd26259)) - **axe.configure:** do not remove newline characters from locale doT strings ([#3216](https://github.com/dequelabs/axe-core/issues/3216)) ([ea2ce17](https://github.com/dequelabs/axe-core/commit/ea2ce171fd7562e6b85471e72dddc84be23a4297)) - **axe.d.ts:** allow Node for include/exclude object ([#3338](https://github.com/dequelabs/axe-core/issues/3338)) ([e699939](https://github.com/dequelabs/axe-core/commit/e699939bfd43fcc66b357d0e7329adce6f29cd6b)) - **axe.run:** add option to increase iframe ping timeout ([#3233](https://github.com/dequelabs/axe-core/issues/3233)) ([ec937e3](https://github.com/dequelabs/axe-core/commit/ec937e3e147274cbdbba2b046a651c90623130e4)) - check for hidden elements on `aria-errormessage` ([#3156](https://github.com/dequelabs/axe-core/issues/3156)) ([95d37dd](https://github.com/dequelabs/axe-core/commit/95d37dd794dc8552d731fabf45244b260da53d8f)) - **color-contrast:** account for 0 width scroll regions with children ([#3172](https://github.com/dequelabs/axe-core/issues/3172)) ([5908f0d](https://github.com/dequelabs/axe-core/commit/5908f0d644c20e7091329bd8bbeb191837d27feb)) - **color-contrast:** account for elements that do not fill entire bounding size ([#3186](https://github.com/dequelabs/axe-core/issues/3186)) ([699697b](https://github.com/dequelabs/axe-core/commit/699697bc237b6c69050e4572ba5cfdc5f338f450)) - **color-contrast:** check bg on fg contrast for thin text-shadows ([#3350](https://github.com/dequelabs/axe-core/issues/3350)) ([d92a7e5](https://github.com/dequelabs/axe-core/commit/d92a7e527eb61e5c62a59019b024f288ebac3663)) - **color-contrast:** correctly apply page background color ([#3207](https://github.com/dequelabs/axe-core/issues/3207)) ([fbc581d](https://github.com/dequelabs/axe-core/commit/fbc581d77e457fe092ecc2b95015e667292f1a08)) - **color-contrast:** correctly compute color-contrast of truncated children ([#3203](https://github.com/dequelabs/axe-core/issues/3203)) ([ac7b2b5](https://github.com/dequelabs/axe-core/commit/ac7b2b5ec402e9de91c50ef39aefd5843f0d62bb)) - **color-contrast:** correctly handle nested scroll regions ([#3212](https://github.com/dequelabs/axe-core/issues/3212)) ([22db29c](https://github.com/dequelabs/axe-core/commit/22db29ca7e9964a8447392fba45a09057a926ab9)) - **color-contrast:** correctly work with positioned elements without z-index ([#3209](https://github.com/dequelabs/axe-core/issues/3209)) ([725a20c](https://github.com/dequelabs/axe-core/commit/725a20c91b9006e64009059f0ab9d1a0098d29df)) - **color-contrast:** inconsistency of bgOverlap message based on scroll ([#3310](https://github.com/dequelabs/axe-core/issues/3310)) ([25eff98](https://github.com/dequelabs/axe-core/commit/25eff98e698f8dd00e5efd05a9b325a5202eae9b)) - **color-contrast:** properly blend multiple alpha colors ([#3193](https://github.com/dequelabs/axe-core/issues/3193)) ([e930a70](https://github.com/dequelabs/axe-core/commit/e930a7081d4308549370f74e9d341badd9661584)) - **core:** Incomplete fallback was missing, and could cause infinite loop ([#3302](https://github.com/dequelabs/axe-core/issues/3302)) ([f23d8c8](https://github.com/dequelabs/axe-core/commit/f23d8c8e305d27c8323547731b335d2900e03239)) - **custom-elms:** Don't error on custom Element.children prop ([#3326](https://github.com/dequelabs/axe-core/issues/3326)) ([2ad92f6](https://github.com/dequelabs/axe-core/commit/2ad92f67205fd370c3ad5ba44274248c2b9fe6e5)) - **d.ts:** Add PartialResults type ([#3126](https://github.com/dequelabs/axe-core/issues/3126)) ([544b6d5](https://github.com/dequelabs/axe-core/commit/544b6d579f3eecf8e102a53a911bbce0bd53b74f)) - **get-selector:** do not URL encode or token escape attribute selectors ([#3215](https://github.com/dequelabs/axe-core/issues/3215)) ([6f7e183](https://github.com/dequelabs/axe-core/commit/6f7e183553206afa2ca21914bf388e019b4acfdc)) - **getFrameContext:** option.iframe=false always returns an empty array ([#3279](https://github.com/dequelabs/axe-core/issues/3279)) ([dfa9725](https://github.com/dequelabs/axe-core/commit/dfa9725e39b8b4bca5a1856d44ff21c9894fc958)) - greater consistency of help / description text ([#3204](https://github.com/dequelabs/axe-core/issues/3204)) ([0677565](https://github.com/dequelabs/axe-core/commit/0677565941486cf339e7267760d4e533d4a29a05)) - **is-visible:** do not error if window.Node does not exist ([#3168](https://github.com/dequelabs/axe-core/issues/3168)) ([4046087](https://github.com/dequelabs/axe-core/commit/404608773abf7b4d069a64931adf4ac7e942b663)) - **jsdoc:** typo Sting -> String ([d1cc205](https://github.com/dequelabs/axe-core/commit/d1cc205629cb159ca760b18ece1f1e9aea22ec3a)) - **label-content-name-mismatch:** account for formatting elements ([#3349](https://github.com/dequelabs/axe-core/issues/3349)) ([53a6684](https://github.com/dequelabs/axe-core/commit/53a6684a6ebef004d451ff1be63bbfe4503e9447)) - **label-title-only:** allow hidden labels ([#3183](https://github.com/dequelabs/axe-core/issues/3183)) ([cad3994](https://github.com/dequelabs/axe-core/commit/cad39949c29bc3f83863e3484feef82e89e12118)) - **listitem:** allow as child of menu ([#3286](https://github.com/dequelabs/axe-core/issues/3286)) ([4bf7d35](https://github.com/dequelabs/axe-core/commit/4bf7d35a1f283a181205bb31f8f4c64c450772ca)) - **nativeSelectValue:** update selected value on change ([#3154](https://github.com/dequelabs/axe-core/issues/3154)) ([1ee88cb](https://github.com/dequelabs/axe-core/commit/1ee88cb4bb557560f10eab136464c321d4dee81e)) - **nested-interactive/aria-text:** allow "tabindex=-1" on elements with no role ([#3165](https://github.com/dequelabs/axe-core/issues/3165)) ([0ddc00b](https://github.com/dequelabs/axe-core/commit/0ddc00bb2d0eed457d9ce8ba5cd05606ef3bdc9e)), closes [#2466](https://github.com/dequelabs/axe-core/issues/2466) [#2934](https://github.com/dequelabs/axe-core/issues/2934) [#2934](https://github.com/dequelabs/axe-core/issues/2934) - **nested-interactive:** add focusable descendants as related nodes ([#3261](https://github.com/dequelabs/axe-core/issues/3261)) ([3b2fdda](https://github.com/dequelabs/axe-core/commit/3b2fdda5ff90703dd20e9b19c4c0331a3d32cd5e)) - **nested-interactive:** add message for negative tabindex ([#3194](https://github.com/dequelabs/axe-core/issues/3194)) ([b445291](https://github.com/dequelabs/axe-core/commit/b44529130568347816fa810c959b68f980161241)), closes [#2466](https://github.com/dequelabs/axe-core/issues/2466) [#2934](https://github.com/dequelabs/axe-core/issues/2934) [/github.com/dequelabs/axe-core/issues/3163#issuecomment-949804464](https://github.com/dequelabs//github.com/dequelabs/axe-core/issues/3163/issues/issuecomment-949804464) - **nested-interactive:** update negative tabindex message to include asssistive technologies ([#3262](https://github.com/dequelabs/axe-core/issues/3262)) ([b985776](https://github.com/dequelabs/axe-core/commit/b985776b6fdb2c96f40df38cf86f7241039d4f5b)) - **p-as-heading:** `p-as-heading` rule to account for `textContent` length ([#3145](https://github.com/dequelabs/axe-core/issues/3145)) ([400a230](https://github.com/dequelabs/axe-core/commit/400a2308510246d64d37fac3db375201610cd7e7)) - **prohibited-attr:** always report incomplete if there is text in the subtree ([#3347](https://github.com/dequelabs/axe-core/issues/3347)) ([2e27dca](https://github.com/dequelabs/axe-core/commit/2e27dca551d1aee273ad8ac055f7dfd45578dad0)) - **region:** Allow skip menu buttons ([#3277](https://github.com/dequelabs/axe-core/issues/3277)) ([6b6f2e3](https://github.com/dequelabs/axe-core/commit/6b6f2e36b09f70633b36da1cbcf2bcab59edebcf)) - remove optional crypto dependency (webpack compatibility) ([#3358](https://github.com/dequelabs/axe-core/issues/3358)) ([aa9d095](https://github.com/dequelabs/axe-core/commit/aa9d0957cbe1a91d7491a27cdea643f800ec7384)) - **reporter:** Run inside isolated contexts ([#3129](https://github.com/dequelabs/axe-core/issues/3129)) ([afe6675](https://github.com/dequelabs/axe-core/commit/afe6675d2452089602dcc6c9e931987936e9a55a)) - **respondable:** avoid crashes if the data in `window.postMessage` is `null` ([#3249](https://github.com/dequelabs/axe-core/issues/3249)) ([b37b2f6](https://github.com/dequelabs/axe-core/commit/b37b2f67ac4f2204cf63be351a70cb8a680812a3)) - **scrollable-region-focusable:** treat overflow:clip as hidden ([#3304](https://github.com/dequelabs/axe-core/issues/3304)) ([ef45377](https://github.com/dequelabs/axe-core/commit/ef453771b252a04fb5854f7d4d5b10281889f395)) - Separate Level AAA rules from A and best-practices ([#3191](https://github.com/dequelabs/axe-core/issues/3191)) ([828e526](https://github.com/dequelabs/axe-core/commit/828e526fd06ee596df73f4825e750aad459ca75e)) - **skip-link:** work with absolute and relative paths ([#2875](https://github.com/dequelabs/axe-core/issues/2875)) ([ee49d3e](https://github.com/dequelabs/axe-core/commit/ee49d3e83e8c77159d22b475c7d6d801d921b114)) - **typescript:** allow passing a NodeList to ElementContext ([#3161](https://github.com/dequelabs/axe-core/issues/3161)) ([ad4b165](https://github.com/dequelabs/axe-core/commit/ad4b165a0e019cd65f70fa5d085d83cea3e7338c)) ### [4.3.5](https://github.com/dequelabs/axe-core/compare/v4.3.4...v4.3.5) (2021-10-29) ### Bug Fixes - **aria-allowed-attr:** revert violation for non-global ARIA attrs on element without role ([#3243](https://github.com/dequelabs/axe-core/issues/3243)) ([e138fd6](https://github.com/dequelabs/axe-core/commit/e138fd6a00a8da6c48a74a614adc5dae8f2044e1)) ### [4.3.4](https://github.com/dequelabs/axe-core/compare/v4.3.3...v4.3.4) (2021-10-22) ### Bug Fixes - **aria-allowed-attr:** check for invalid `aria-attributes` for `role="row"` ([#3160](https://github.com/dequelabs/axe-core/issues/3160)) ([76aa5ec](https://github.com/dequelabs/axe-core/commit/76aa5ec5ac8a311b90974f0dba9cf92594f92019)) - **aria-allowed-children,aria-allowed-parent:** allow group role in listbox ([#3195](https://github.com/dequelabs/axe-core/issues/3195)) ([d742b29](https://github.com/dequelabs/axe-core/commit/d742b299370afa23645b1292ffc15f753113e05a)) - **aria-allowed-role:** updates the allowed roles for the wbr element to none and presentation ([#3192](https://github.com/dequelabs/axe-core/issues/3192)) ([66db765](https://github.com/dequelabs/axe-core/commit/66db765a17b5dc0904fcafe83aeb7c3eb5d60c12)), closes [#3177](https://github.com/dequelabs/axe-core/issues/3177) - **aria-prohibited-attr:** update metadata message ([#3206](https://github.com/dequelabs/axe-core/issues/3206)) ([f9cf9fa](https://github.com/dequelabs/axe-core/commit/f9cf9fafe10e944be643d642cffda4fc762d0fc5)) - **axe.configure:** do not remove newline characters from locale doT strings ([#3216](https://github.com/dequelabs/axe-core/issues/3216)) ([5925898](https://github.com/dequelabs/axe-core/commit/59258984c0e52d91342040291fcc6f05ce2f135f)) - **axe.run:** add option to increase iframe ping timeout ([#3233](https://github.com/dequelabs/axe-core/issues/3233)) ([023f356](https://github.com/dequelabs/axe-core/commit/023f356ae752c559fb3788c84b1937bd2ba047ee)) - **color-contrast:** account for 0 width scroll regions with children ([#3172](https://github.com/dequelabs/axe-core/issues/3172)) ([ac913a1](https://github.com/dequelabs/axe-core/commit/ac913a11ddd8fd3b242a6ee500773c17fef77011)) - **color-contrast:** account for elements that do not fill entire bounding size ([#3186](https://github.com/dequelabs/axe-core/issues/3186)) ([84229d4](https://github.com/dequelabs/axe-core/commit/84229d41969907a62876488dc7a8f070542a9fe6)) - **color-contrast:** correctly apply page background color ([#3207](https://github.com/dequelabs/axe-core/issues/3207)) ([0ea7e1b](https://github.com/dequelabs/axe-core/commit/0ea7e1b881bb06067e98bae8ffe814605404475f)) - **color-contrast:** correctly compute color-contrast of truncated children ([#3203](https://github.com/dequelabs/axe-core/issues/3203)) ([4adb911](https://github.com/dequelabs/axe-core/commit/4adb9119a8a1cb457db81a40534db103c14bd2a1)) - **color-contrast:** correctly handle nested scroll regions ([#3212](https://github.com/dequelabs/axe-core/issues/3212)) ([80d91c0](https://github.com/dequelabs/axe-core/commit/80d91c01e46072ae8d36b952dfc264ef6f13eada)) - **color-contrast:** correctly work with positioned elements without z-index ([#3209](https://github.com/dequelabs/axe-core/issues/3209)) ([0322070](https://github.com/dequelabs/axe-core/commit/03220704c9dfa6f3af8d13800f9861e16552854b)) - greater consistency of help / description text ([#3204](https://github.com/dequelabs/axe-core/issues/3204)) ([0be12e6](https://github.com/dequelabs/axe-core/commit/0be12e62e5c0b2f1d280a7b17380281a30ae65f0)) - Separate Level AAA rules from A and best-practices ([#3191](https://github.com/dequelabs/axe-core/issues/3191)) ([7e6e6da](https://github.com/dequelabs/axe-core/commit/7e6e6da379eb2cb852a84c4ce088df7065740b61)) - **color-contrast:** properly blend multiple alpha colors ([#3193](https://github.com/dequelabs/axe-core/issues/3193)) ([5aa0441](https://github.com/dequelabs/axe-core/commit/5aa0441f2b33f8e1055ac32d981df4f796f7bb88)) - **is-visible:** do not error if window.Node does not exist ([#3168](https://github.com/dequelabs/axe-core/issues/3168)) ([cf58aea](https://github.com/dequelabs/axe-core/commit/cf58aea086a7bd590838673068d34325b4e9eef7)) - **label-title-only:** allow hidden labels ([#3183](https://github.com/dequelabs/axe-core/issues/3183)) ([ab636ef](https://github.com/dequelabs/axe-core/commit/ab636efa743ba2cbf1194b87aa27be5aba70989b)) - **nativeSelectValue:** update selected value on change ([#3154](https://github.com/dequelabs/axe-core/issues/3154)) ([ad584a1](https://github.com/dequelabs/axe-core/commit/ad584a10fc4b6c601c887835d7c879c77dc143d9)) - **p-as-heading:** `p-as-heading` rule to account for `textContent` length ([#3145](https://github.com/dequelabs/axe-core/issues/3145)) ([e0d4dc6](https://github.com/dequelabs/axe-core/commit/e0d4dc63bdd391a92f833d83b50644934deb7804)) - **typescript:** allow passing a NodeList to ElementContext ([#3161](https://github.com/dequelabs/axe-core/issues/3161)) ([5f2e517](https://github.com/dequelabs/axe-core/commit/5f2e517c0038397e12c72ef322313443c25e7907)) - check for hidden elements on `aria-errormessage` ([#3156](https://github.com/dequelabs/axe-core/issues/3156)) ([69b2e33](https://github.com/dequelabs/axe-core/commit/69b2e33b4094512f2ccfd05393b567763bba2e11)) ### [4.3.3](https://github.com/dequelabs/axe-core/compare/v4.3.2...v4.3.3) (2021-08-24) ### Bug Fixes - **aria-allowed-role:** Update allowed roles based on ARIA spec updates ([#3124](https://github.com/dequelabs/axe-core/issues/3124)) ([a1f637f](https://github.com/dequelabs/axe-core/commit/a1f637f3f5ebf0e483fd21865bd2191c24ccb87a)) - **d.ts:** Add PartialResults type ([#3126](https://github.com/dequelabs/axe-core/issues/3126)) ([5cdaf01](https://github.com/dequelabs/axe-core/commit/5cdaf012a2f09834d8b7e5f3a645a40e61d47ea9)) - **reporter:** Run inside isolated contexts ([#3129](https://github.com/dequelabs/axe-core/issues/3129)) ([98066f8](https://github.com/dequelabs/axe-core/commit/98066f8864d4ef09b4b3de12456992d3ca3207b4)) ### [4.3.2](https://github.com/dequelabs/axe-core/compare/v4.3.1...v4.3.2) (2021-07-27) ### Bug Fixes - **aria-hidden-focusable:** disabled aria-hidden fieldset should not have focusable children ([#3056](https://github.com/dequelabs/axe-core/issues/3056)) ([0865bd7](https://github.com/dequelabs/axe-core/commit/0865bd797f60da2befc52113464bc841f2cb2a47)) - **aria-required-attr:** only require aria-controls if aria-expanded=true ([#3089](https://github.com/dequelabs/axe-core/issues/3089)) ([63b6c7b](https://github.com/dequelabs/axe-core/commit/63b6c7b04c6837a313251f1621be6032933c8289)) - **aria-required-parent:** Filter out group from required parent roles if group is present ([#3084](https://github.com/dequelabs/axe-core/issues/3084)) ([1cb270c](https://github.com/dequelabs/axe-core/commit/1cb270c355338238acefd21789373f10aa4cb3ec)) - **axe.d.ts:** fix finishRun types ([#3098](https://github.com/dequelabs/axe-core/issues/3098)) ([e79c65c](https://github.com/dequelabs/axe-core/commit/e79c65cf7def687c54cc3bc249354c4eacf3e152)) - **color-contrast:** check for size before ignoring pseudo elements ([#3097](https://github.com/dequelabs/axe-core/issues/3097)) ([e0f6c0c](https://github.com/dequelabs/axe-core/commit/e0f6c0cfb8425bc0f7548c79919ac2cbd8393e83)) - **core:** stop mutating Context's input ([#3076](https://github.com/dequelabs/axe-core/issues/3076)) ([5dc34ee](https://github.com/dequelabs/axe-core/commit/5dc34eed3272409ae6486c76dad1394f1d557b5e)) - **finishRun:** handle null for failed iframe results ([#3096](https://github.com/dequelabs/axe-core/issues/3096)) ([8947099](https://github.com/dequelabs/axe-core/commit/8947099ea1113dbe1890e53c56f70e974317b144)) - **run,finishRun:** don't mutate options, set default reporter to v1 ([#3088](https://github.com/dequelabs/axe-core/issues/3088)) ([90f0b27](https://github.com/dequelabs/axe-core/commit/90f0b275a83dec38a9cae555ea1ddf9b4938b14d)) ### [4.3.1](https://github.com/dequelabs/axe-core/compare/v4.3.0...v4.3.1) (2021-07-13) ### Bug Fixes - add sri-history.json to npm bundle ([#3078](https://github.com/dequelabs/axe-core/issues/3078)) ([b525275](https://github.com/dequelabs/axe-core/commit/b52527515302dcafe6d5a8efd48c60d2d1d21a35)) ## [4.3.0](https://github.com/dequelabs/axe-core/compare/v4.2.3...v4.3.0) (2021-07-09) ### Features - **options:** accept a string for options.runOnly ([4392bc0](https://github.com/dequelabs/axe-core/commit/4392bc05fb208606fc589b261d3419b9625c6b6c)) - **runPartial:** Test without frame communication ([#3006](https://github.com/dequelabs/axe-core/issues/3006)) ([42738b5](https://github.com/dequelabs/axe-core/commit/42738b5258f058a36b00533e8c5cfdc0f1bcdbed)) - **utils:** add getFrameContexts method ([#2995](https://github.com/dequelabs/axe-core/issues/2995)) ([f478bab](https://github.com/dequelabs/axe-core/commit/f478babae453b02dec5bf4961b7a995a5964976a)) - deprecate autocomplete appropriate check ([#2917](https://github.com/dequelabs/axe-core/issues/2917)) ([1fe1487](https://github.com/dequelabs/axe-core/commit/1fe1487758fa0f1f4b7bfc1d8c18bbe397be362d)) - Remove deprecated phantomjs example ([#2913](https://github.com/dequelabs/axe-core/issues/2913)) ([4a01ffe](https://github.com/dequelabs/axe-core/commit/4a01ffe1adf009745ea12a71f4a888843dc779da)) - Support multiple languages at once in builds ([#2994](https://github.com/dequelabs/axe-core/issues/2994)) ([f18a56b](https://github.com/dequelabs/axe-core/commit/f18a56b3efafdb14989b45bfff0f94e1863b3899)) - **rule:** add ACT Rule IDs to test rule objects ([#2866](https://github.com/dequelabs/axe-core/issues/2866)) ([cc1ebf5](https://github.com/dequelabs/axe-core/commit/cc1ebf520caaf787fe73498cac0e4917d357edad)), closes [#2820](https://github.com/dequelabs/axe-core/issues/2820) ### Bug Fixes - **accText:** ignore text in embedded content elements ([#3022](https://github.com/dequelabs/axe-core/issues/3022)) ([fa4f926](https://github.com/dequelabs/axe-core/commit/fa4f926c089bec2cfca882b61b74fecac504c8e0)), closes [#3017](https://github.com/dequelabs/axe-core/issues/3017) - **aria-allowed-attr:** allow aria-posinset and aria-setsize on row elements for treegrids ([#2952](https://github.com/dequelabs/axe-core/issues/2952)) ([24e6115](https://github.com/dequelabs/axe-core/commit/24e6115adb8834b02e1e0a535a661c31caefa588)) - **aria-allowed-attr:** pass aria-label on some HTML elements ([#2935](https://github.com/dequelabs/axe-core/issues/2935)) ([d2584ed](https://github.com/dequelabs/axe-core/commit/d2584edfa7b439a5702f5b8d368253b9abe690fc)) - **aria-level:** New check for aria-level > 6 as needs review ([#3061](https://github.com/dequelabs/axe-core/issues/3061)) ([73d3ae1](https://github.com/dequelabs/axe-core/commit/73d3ae101f841c086cee89346ad66afed265097f)) - **aria-roles:** Mark as needs review if both none and presentation are used on element with no implicit role ([#2989](https://github.com/dequelabs/axe-core/issues/2989)) ([70c683c](https://github.com/dequelabs/axe-core/commit/70c683cd9844b23d62641e7063bae757a897ca38)) - **autocomplete-appropriate:** pass for autocomplete=username and type=email ([#2896](https://github.com/dequelabs/axe-core/issues/2896)) ([43394bc](https://github.com/dequelabs/axe-core/commit/43394bcd01c631f0c129f2f584d88a3a134a92a7)) - **color-contrast:** add special case for new sr-only technique ([#2985](https://github.com/dequelabs/axe-core/issues/2985)) ([d6a72f9](https://github.com/dequelabs/axe-core/commit/d6a72f9316b00eee683aed4dbf0a0fafe0661a2f)) - **color-contrast:** check for pseudo elements on element itself, not just parents ([#2980](https://github.com/dequelabs/axe-core/issues/2980)) ([9b6ccd0](https://github.com/dequelabs/axe-core/commit/9b6ccd0c2948e7036ef3984810909f59d1e65f27)) - **color-contrast-matches:** only absolutely positioned elements using clip should be not visible ([#3038](https://github.com/dequelabs/axe-core/issues/3038)) ([e93fdb1](https://github.com/dequelabs/axe-core/commit/e93fdb1f68656976d0cdfd73564f6580640be0f7)) - **combobox:** support aria 1.2 pattern for comboboxes ([#3033](https://github.com/dequelabs/axe-core/issues/3033)) ([5ab026d](https://github.com/dequelabs/axe-core/commit/5ab026d1bc9932fdf6cd2b135df32dd80051b5c9)) - **frame-tested:** run without respondable ([#2942](https://github.com/dequelabs/axe-core/issues/2942)) ([c046114](https://github.com/dequelabs/axe-core/commit/c046114e9740e3e130ad0cb98288eb77331fbb93)) - **getStandards:** Read standards from utils ([#2903](https://github.com/dequelabs/axe-core/issues/2903)) ([f1a0368](https://github.com/dequelabs/axe-core/commit/f1a036890b9befe8c1a0af388fd0f215bee6d9ae)) - **heading-order:** Prevent crash on page with iframes but no headings ([#2965](https://github.com/dequelabs/axe-core/issues/2965)) ([99e7f0c](https://github.com/dequelabs/axe-core/commit/99e7f0c2ae5758328e1299ff54a261c7e581c475)) - **heading-order:** use aria-level on headings in addition to role=header elements ([#3028](https://github.com/dequelabs/axe-core/issues/3028)) ([caccd38](https://github.com/dequelabs/axe-core/commit/caccd381d3817cc46e824d1a76e5ea888bf519bf)) - **page-no-duplicate:** don't count elements hidden from screenreaders as potential duplicates ([#3051](https://github.com/dequelabs/axe-core/issues/3051)) ([5e0098b](https://github.com/dequelabs/axe-core/commit/5e0098b0262614db20fc9d6689a5d5b95c153d8d)) - **publish-metadata:** use fail message for rules with reviewOnFail:true ([#2987](https://github.com/dequelabs/axe-core/issues/2987)) ([b6dc5f6](https://github.com/dequelabs/axe-core/commit/b6dc5f654c6c4b56217eabfd093447122890a7a2)) - **utils:** unify selecting nodes in shadow tree with shadowSelect() ([#3068](https://github.com/dequelabs/axe-core/issues/3068)) ([21681da](https://github.com/dequelabs/axe-core/commit/21681da0c8b952b5a64e17751e05686a98c6b5da)) - JS error in @axe-core/react caused by stale reference to heading ([b7094c8](https://github.com/dequelabs/axe-core/commit/b7094c8146ec816ab3d079e57f07bf0f21ce6676)) - Remove unnecessary files from npm package ([#3054](https://github.com/dequelabs/axe-core/issues/3054)) ([7600b7c](https://github.com/dequelabs/axe-core/commit/7600b7cd4a9bbb019497895d1134246d02af9763)) - **meta-viewport:** test that a user-scalable number does not prevent zoom ([b3562fb](https://github.com/dequelabs/axe-core/commit/b3562fb9fffa3152014d56a6e02a05622c10b9a9)) - **region:** contents in iframes should pass the region rule if the iframe itself is in a region ([#2949](https://github.com/dequelabs/axe-core/issues/2949)) ([43145d6](https://github.com/dequelabs/axe-core/commit/43145d6f1136c0e2c9fd9a9f3a401a68f56fe665)) - **required-parent:** Allow *item > group > *item nesting ([#2898](https://github.com/dequelabs/axe-core/issues/2898)) ([59b4a7e](https://github.com/dequelabs/axe-core/commit/59b4a7e2d939076e7aed6308ff25d1f3460d944b)) - **SerialVirtualNode:** properly handle empty string attributes ([#3042](https://github.com/dequelabs/axe-core/issues/3042)) ([dddbc0a](https://github.com/dequelabs/axe-core/commit/dddbc0ac20ffa0bc65223d392310d447b767efe9)) - **sri-history:** add backported releases ([#3004](https://github.com/dequelabs/axe-core/issues/3004)) ([6eecf34](https://github.com/dequelabs/axe-core/commit/6eecf344751e03170bd70fe076584011b5a6cacb)) - treat input with no role as textbox ([#2929](https://github.com/dequelabs/axe-core/issues/2929)) ([13d909d](https://github.com/dequelabs/axe-core/commit/13d909dd12dc40ab9ed448793aef5031e207d429)) - **types:** make `evaluate` check optional ([#2902](https://github.com/dequelabs/axe-core/issues/2902)) ([417f572](https://github.com/dequelabs/axe-core/commit/417f5724112e46f128efd5f56da9f891bf1e938c)) ### [4.2.4](https://github.com/dequelabs/axe-core/compare/v4.2.3...v4.2.4) (2021-10-22) ### Bug Fixes - **axe.run:** add option to increase iframe ping timeout ([#3233](https://github.com/dequelabs/axe-core/issues/3233)) ([99a848e](https://github.com/dequelabs/axe-core/commit/99a848e785793782b264aa55cd71f5a35c5677c9)) ### [4.2.3](https://github.com/dequelabs/axe-core/compare/v4.2.2...v4.2.3) (2021-06-22) ### Bug Fixes - **accText:** ignore text in embedded content elements ([#3022](https://github.com/dequelabs/axe-core/issues/3022)) ([8fb4635](https://github.com/dequelabs/axe-core/commit/8fb4635e01c82b80ff23994edad180dd73730a98)), closes [#3017](https://github.com/dequelabs/axe-core/issues/3017) - **color-contrast:** add special case for new sr-only technique ([#2985](https://github.com/dequelabs/axe-core/issues/2985)) ([79cbf01](https://github.com/dequelabs/axe-core/commit/79cbf0168bdb9311db2e31043ad36c20b77e39fe)) - **color-contrast:** check for pseudo elements on element itself, not just parents ([#2980](https://github.com/dequelabs/axe-core/issues/2980)) ([3122550](https://github.com/dequelabs/axe-core/commit/3122550b1beaeafaac62c81fb47bcd4290ba266a)) - **frame-tested:** run without respondable ([#2942](https://github.com/dequelabs/axe-core/issues/2942)) ([a1d725d](https://github.com/dequelabs/axe-core/commit/a1d725d5cdedc4bfd6ba69bb25aa0a1213fd63cf)) - **publish-metadata:** use fail message for rules with reviewOnFail:true ([#2987](https://github.com/dequelabs/axe-core/issues/2987)) ([00fefa9](https://github.com/dequelabs/axe-core/commit/00fefa9bfb9479279afc89b2da45e748bace77d2)) - **sri-history:** add backported releases ([#3004](https://github.com/dequelabs/axe-core/issues/3004)) ([0332e80](https://github.com/dequelabs/axe-core/commit/0332e806524ca9ca78512423a70eb80d623795eb)) ### [4.2.2](https://github.com/dequelabs/axe-core/compare/v4.2.1...v4.2.2) (2021-06-03) ### Bug Fixes - **aria-allowed-attr:** allow aria-posinset and aria-setsize on row elements for treegrids ([#2952](https://github.com/dequelabs/axe-core/issues/2952)) ([3023e69](https://github.com/dequelabs/axe-core/commit/3023e697b85c13f18f2cbb46b202400d8ce6a10d)) - **heading-order:** Prevent crash on page with iframes but no headings ([#2965](https://github.com/dequelabs/axe-core/issues/2965)) ([4b7db37](https://github.com/dequelabs/axe-core/commit/4b7db3763735891972b8a13d6622fa30a687f3cb)) - **meta-viewport:** test that a user-scalable number does not prevent zoom ([048c5c1](https://github.com/dequelabs/axe-core/commit/048c5c18c8245a43721a12237ac5f07f5b4a856b)) - JS error in @axe-core/react caused by stale reference to heading ([3afda4e](https://github.com/dequelabs/axe-core/commit/3afda4effc4a099632138c5874ab305baaa5934a)) ### [4.2.1](https://github.com/dequelabs/axe-core/compare/v4.2.0...v4.2.1) (2021-05-18) ### Bug Fixes - **aria-allowed-attr:** pass aria-label on some HTML elements ([#2935](https://github.com/dequelabs/axe-core/issues/2935)) ([695aa77](https://github.com/dequelabs/axe-core/commit/695aa7751246c0e5e786a66df7808faa7a244576)) - treat input with no role as textbox ([#2929](https://github.com/dequelabs/axe-core/issues/2929)) ([de18030](https://github.com/dequelabs/axe-core/commit/de180307fd876cfc6a1a0bdb828818a323976c81)) - **autocomplete-appropriate:** pass for autocomplete=username and type=email ([#2896](https://github.com/dequelabs/axe-core/issues/2896)) ([8b478c8](https://github.com/dequelabs/axe-core/commit/8b478c82b3362fc27df8a0087c779327e6a9d6d0)) - **getStandards:** Read standards from utils ([#2903](https://github.com/dequelabs/axe-core/issues/2903)) ([52ad4c6](https://github.com/dequelabs/axe-core/commit/52ad4c69991e433d413846c4c9778fdd863aebeb)) - **required-parent:** Allow *item > group > *item nesting ([#2898](https://github.com/dequelabs/axe-core/issues/2898)) ([3acd229](https://github.com/dequelabs/axe-core/commit/3acd229b08b806ea359e7e08e37e8721cddc5290)) - **types:** make `evaluate` check optional ([#2902](https://github.com/dequelabs/axe-core/issues/2902)) ([75fabfe](https://github.com/dequelabs/axe-core/commit/75fabfef3adeade350902f2dd18928e44fbb7cf4)) ## [4.2.0](https://github.com/dequelabs/axe-core/compare/v4.1.2...v4.2.0) (2021-04-23) ### Features - add axe.frameMessenger with configurable allowedOrigins ([#2880](https://github.com/dequelabs/axe-core/issues/2880)) ([b27bab3](https://github.com/dequelabs/axe-core/commit/b27bab3954f006e1257f7d70bd467991a2d9330e)) - **aria-allowed-attr:** add ARIA 1.2 prohibited attrs check ([#2764](https://github.com/dequelabs/axe-core/issues/2764)) ([4a77e88](https://github.com/dequelabs/axe-core/commit/4a77e881302f7db2750fa36a573fc26d123f7388)) - **empty-table-header:** new rule to flag empty table headers ([#2811](https://github.com/dequelabs/axe-core/issues/2811)) ([813ee7e](https://github.com/dequelabs/axe-core/commit/813ee7efdf77a55a1c09a3b8836007917ead91b5)) - **frame-focusable-content:** new rule to test iframes with tabindex=-1 do not have focusable content ([#2785](https://github.com/dequelabs/axe-core/issues/2785)) ([aeb044c](https://github.com/dequelabs/axe-core/commit/aeb044c26908b44490bad160add8c3e6327ce759)) - **locale:** missing translations for DE ([#2704](https://github.com/dequelabs/axe-core/issues/2704)) ([f312994](https://github.com/dequelabs/axe-core/commit/f312994a63bd239b42cf3177af9d43fc190b1d3c)) - **locale:** Polish translation ([#2677](https://github.com/dequelabs/axe-core/issues/2677)) ([c46979f](https://github.com/dequelabs/axe-core/commit/c46979ff93a8c1bd5d9d73f1b4d3edcab046582b)) - **nested-interactive:** new rule to flag nested interactive elements ([#2691](https://github.com/dequelabs/axe-core/issues/2691)) ([13a7cf1](https://github.com/dequelabs/axe-core/commit/13a7cf12ad7f3f895a4c41c50b65bf71be12ea47)) - **role-text:** add role-text rule ([#2702](https://github.com/dequelabs/axe-core/issues/2702)) ([7c05162](https://github.com/dequelabs/axe-core/commit/7c05162a3856c0f19514c9a87ca1c15aa5485b45)) - **setup/teardown:** add functions to setup and teardown axe-core internal data, deprecate axe.\_tree ([#2738](https://github.com/dequelabs/axe-core/issues/2738)) ([9d19f24](https://github.com/dequelabs/axe-core/commit/9d19f24f86f2028753ce944beeda9866b0274e7b)) - **standards:** add graphics roles ([#2761](https://github.com/dequelabs/axe-core/issues/2761)) ([22032cc](https://github.com/dequelabs/axe-core/commit/22032cc3051e74ad8c12c27039e9fb0a9f07e9d1)) - **standards/aria-roles:** add presentational children property ([#2689](https://github.com/dequelabs/axe-core/issues/2689)) ([78c239c](https://github.com/dequelabs/axe-core/commit/78c239cd6e3960e85cf900bc0fe511e3846c1c96)) - **utils.getRule:** add function to get rule by id ([#2724](https://github.com/dequelabs/axe-core/issues/2724)) ([9d0af53](https://github.com/dequelabs/axe-core/commit/9d0af53192450f442d073c13313ff1d865f68935)) - **utils/matches:** support selectors level 4 :not and :is ([#2742](https://github.com/dequelabs/axe-core/issues/2742)) ([21d9b0e](https://github.com/dequelabs/axe-core/commit/21d9b0ea4348d353dc85cacfb3fcace5eac6e4ca)) - **virtual-node:** add attrNames property which returns list of attribute names ([#2741](https://github.com/dequelabs/axe-core/issues/2741)) ([1d864b4](https://github.com/dequelabs/axe-core/commit/1d864b4600fd88b06c8b5776bf891cf9bc402b60)) ### Bug Fixes - **aria-allowed-attr:** error when generic elements use aria-label and aria-labelledy ([#2766](https://github.com/dequelabs/axe-core/issues/2766)) ([64379e1](https://github.com/dequelabs/axe-core/commit/64379e1732fac6ccb0f9f2abfb8c36e22cbba9ef)) - **aria-required-children:** allow group and rowgroup roles ([#2661](https://github.com/dequelabs/axe-core/issues/2661)) ([5a264e4](https://github.com/dequelabs/axe-core/commit/5a264e48e800bb9a783b2597e723ec9529d6d798)) - **aria-required-children:** only match for roles that require children ([#2703](https://github.com/dequelabs/axe-core/issues/2703)) ([95de169](https://github.com/dequelabs/axe-core/commit/95de1698596ab5138d553836c90c422566d0527d)) - **aria-valid-attr-value:** pass for aria-errormessage when aria-invalid is not set or false ([#2721](https://github.com/dequelabs/axe-core/issues/2721)) ([93a765c](https://github.com/dequelabs/axe-core/commit/93a765c372b29a0764872f50f044bfbabed68207)) - **aria-valid-attr-value:** report when aria-labelledby ref is not in DOM ([#2723](https://github.com/dequelabs/axe-core/issues/2723)) ([116eb06](https://github.com/dequelabs/axe-core/commit/116eb06101ea49a02dbd3e86d2f91ac51e8fe9a9)) - **aria-valid-attr-value:** return false when int type attribute uses invalid values ([#2710](https://github.com/dequelabs/axe-core/issues/2710)) ([ce9917e](https://github.com/dequelabs/axe-core/commit/ce9917e9dad91f526e9f0da99dcc347ff759e3bd)) - **bypass:** mark as needs review rather than failure ([#2818](https://github.com/dequelabs/axe-core/issues/2818)) ([bb41b3e](https://github.com/dequelabs/axe-core/commit/bb41b3e89a22a69c5cb6fbd07e808291687343e5)) - **focus-order-semantics:** allow role=tooltip to pass ([#2871](https://github.com/dequelabs/axe-core/issues/2871)) ([dc526d8](https://github.com/dequelabs/axe-core/commit/dc526d8034e2de0c4208d2c6f695f1ba53da950b)) - **heading-order:** handle iframe as first result ([#2876](https://github.com/dequelabs/axe-core/issues/2876)) ([33428d8](https://github.com/dequelabs/axe-core/commit/33428d86230064d70ec6b2a638f947d0cdb31968)) - **respondable:** Avoid message duplication with messageId ([#2816](https://github.com/dequelabs/axe-core/issues/2816)) ([4bd0acf](https://github.com/dequelabs/axe-core/commit/4bd0acf379fba2ef17679cacb70776e77e5f5e79)) - **respondable:** work on iframes in shadow DOM ([#2857](https://github.com/dequelabs/axe-core/issues/2857)) ([38cad94](https://github.com/dequelabs/axe-core/commit/38cad9451dbde52fbab0835e3c1673825c57e5b7)) - avoid 'undefined' showing in check messages ([#2779](https://github.com/dequelabs/axe-core/issues/2779)) ([3beb0b1](https://github.com/dequelabs/axe-core/commit/3beb0b1c7a4bcf599d4c10207a429e9ec38df698)) - properly translate checks when building axe.js using --lang ([#2848](https://github.com/dequelabs/axe-core/issues/2848)) ([76545b0](https://github.com/dequelabs/axe-core/commit/76545b09ed0a1204b1096ef1b1d11fe6d6d89e2a)) - **aria-required-parent:** only match for roles that require parents ([#2707](https://github.com/dequelabs/axe-core/issues/2707)) ([ce8281e](https://github.com/dequelabs/axe-core/commit/ce8281e6d45c6888d238ea33c2d39f4c67e8b267)) - **color-contrast:** account for text client rects that start outside the parent container ([#2682](https://github.com/dequelabs/axe-core/issues/2682)) ([a4e4a34](https://github.com/dequelabs/axe-core/commit/a4e4a344cea70308d0a59a04411f6da88b80b00b)) - **color-contrast-matches:** do not pass empty string to getElementById ([#2739](https://github.com/dequelabs/axe-core/issues/2739)) ([0b0fec2](https://github.com/dequelabs/axe-core/commit/0b0fec285d7df8675c8f5ecc42519f3734d70f72)) - **frame-title:** update rule description to be more descriptive ([#2735](https://github.com/dequelabs/axe-core/issues/2735)) ([159e25b](https://github.com/dequelabs/axe-core/commit/159e25b45eb22498e7ab20d31f353b182b2cd1d7)) - **heading-order:** allow partial context to pass ([#2622](https://github.com/dequelabs/axe-core/issues/2622)) ([f8baee6](https://github.com/dequelabs/axe-core/commit/f8baee68fa5220d54399a347322c6c8ac4f26cb9)) - **landmark-complementary-is-top-level:** allow aside inside main ([#2740](https://github.com/dequelabs/axe-core/issues/2740)) ([9388c96](https://github.com/dequelabs/axe-core/commit/9388c9657fdfd80b9a76961d95a2cde939413665)) - **metadata:** consistenct use of 'must' and 'should' ([#2770](https://github.com/dequelabs/axe-core/issues/2770)) ([603b612](https://github.com/dequelabs/axe-core/commit/603b612dfeb861b5fc08cf9605fed886c1d71107)) - **region:** allow role=alertdialog as region ([#2660](https://github.com/dequelabs/axe-core/issues/2660)) ([b928df7](https://github.com/dequelabs/axe-core/commit/b928df7f81bc1ed79946b472f5e71dea324a611c)) - **select-name:** fix typo in accessible name help ([#2676](https://github.com/dequelabs/axe-core/issues/2676)) ([6b916b9](https://github.com/dequelabs/axe-core/commit/6b916b908f38c465e1b319b1b8f50c1a7c9df698)) - **to-grid/get-headers:** work with rowspan=0 ([#2722](https://github.com/dequelabs/axe-core/issues/2722)) ([508190b](https://github.com/dequelabs/axe-core/commit/508190b8e20873bc98bd0efb39d37bcb1cbcd92a)) - **types:** Add noHtml option ([#2810](https://github.com/dequelabs/axe-core/issues/2810)) ([c03c826](https://github.com/dequelabs/axe-core/commit/c03c82635c6e4228b94438d00f7ff8723303918c)) - **utils:** fix warning thrown by Webpack ([#2843](https://github.com/dequelabs/axe-core/issues/2843)) ([0826177](https://github.com/dequelabs/axe-core/commit/08261778e039abae0be16d001923dcc87ce168a4)), closes [#2840](https://github.com/dequelabs/axe-core/issues/2840) - **utils:** remove attributes from source string ([#2803](https://github.com/dequelabs/axe-core/issues/2803)) ([8e8c4fa](https://github.com/dequelabs/axe-core/commit/8e8c4faddbe95f979f0c03d1d44ccd148218379b)) - add noHtml to axe.configure ([#2789](https://github.com/dequelabs/axe-core/issues/2789)) ([5c8dec8](https://github.com/dequelabs/axe-core/commit/5c8dec83a790aba273f8f921007dc7f0a0904851)) - do not allow postMessage with axe version of x.y.z ([#2790](https://github.com/dequelabs/axe-core/issues/2790)) ([5acda82](https://github.com/dequelabs/axe-core/commit/5acda82fbb61d07f5036169008a08e2e1be3d155)) ### [4.1.4](https://github.com/dequelabs/axe-core/compare/v4.1.3...v4.1.4) (2021-04-01) ### Bug Fixes - **respondable:** work on iframes in shadow DOM ([#2857](https://github.com/dequelabs/axe-core/issues/2857)) ([65cbfd0](https://github.com/dequelabs/axe-core/commit/65cbfd04edbbf48ceee2ef35f500575a4ad88afc)) - **utils:** fix warning thrown by Webpack ([#2843](https://github.com/dequelabs/axe-core/issues/2843)) ([df5d01b](https://github.com/dequelabs/axe-core/commit/df5d01b94fef43e6ca8d2fab5219f90811700405)), closes [#2840](https://github.com/dequelabs/axe-core/issues/2840) ### [4.1.3](https://github.com/dequelabs/axe-core/compare/v4.1.2...v4.1.3) (2021-03-04) ### Bug Fixes - **respondable:** Avoid message duplication with messageId ([#2816](https://github.com/dequelabs/axe-core/issues/2816)) ([9b6eb59](https://github.com/dequelabs/axe-core/commit/9b6eb5987da104398acaae60b7b7ee4e0b2d3c8f)) - **types:** Add noHtml option ([#2810](https://github.com/dequelabs/axe-core/issues/2810)) ([8bc0bae](https://github.com/dequelabs/axe-core/commit/8bc0baec5c997873daf43ff5de61ea22a8e8c896)) ### [4.1.2](https://github.com/dequelabs/axe-core/compare/v4.1.1...v4.1.2) (2021-02-08) ### Bug Fixes - add noHtml to axe.configure ([#2789](https://github.com/dequelabs/axe-core/issues/2789)) ([6e23eb0](https://github.com/dequelabs/axe-core/commit/6e23eb0839da5806da5476a5158fb6324d3ee005)) - do not allow postMessage with axe version of x.y.z ([#2790](https://github.com/dequelabs/axe-core/issues/2790)) ([8b1671d](https://github.com/dequelabs/axe-core/commit/8b1671d46dd2238284fbfe1448ef36f8fc2048e7)) ### [4.1.1](https://github.com/dequelabs/axe-core/compare/v4.1.0...v4.1.1) (2020-11-19) ### Bug Fixes - remove axios import ([#2653](https://github.com/dequelabs/axe-core/issues/2653)) ([2d20cde](https://github.com/dequelabs/axe-core/commit/2d20cdee819265f3c4efcb3ccb61da0a9a88981c)) - **color-contrast:** greatly improve color-contrast-matches speed. add aria/get-accessible-ref ([#2635](https://github.com/dequelabs/axe-core/issues/2635)) ([ba174bd](https://github.com/dequelabs/axe-core/commit/ba174bd5496d7146c1baf982cb762444cda26cff)) ## [4.1.0](https://github.com/dequelabs/axe-core/compare/v4.0.2...v4.1.0) (2020-11-13) ### Features - **new-rule:** check that treeitem role has an accessible name ([#2615](https://github.com/dequelabs/axe-core/issues/2615)) ([5e95153](https://github.com/dequelabs/axe-core/commit/5e951536a6b4f21ef4d4a849b575b5a3c1ec6b85)) - Add aria-dialog-name ([#2609](https://github.com/dequelabs/axe-core/issues/2609)) ([b0e14b0](https://github.com/dequelabs/axe-core/commit/b0e14b0bc1df221ef379bf7ea830d3ceb030787a)) - **aria-toggle-field-name:** add option role ([#2605](https://github.com/dequelabs/axe-core/issues/2605)) ([0af0551](https://github.com/dequelabs/axe-core/commit/0af0551e57c2b8347eeb9ce6550056c1888b5f4a)) - **checks:** deprecate role-none and role-presentation for presentational-role ([#2503](https://github.com/dequelabs/axe-core/issues/2503)) ([cef54a0](https://github.com/dequelabs/axe-core/commit/cef54a0fd4156f7b1e6f6ba9cb36bde060a65622)) - **get-role:** add noPresentational option ([#2549](https://github.com/dequelabs/axe-core/issues/2549)) ([4f39299](https://github.com/dequelabs/axe-core/commit/4f39299805d6e2c0fd09a1952d08c44800ca5dfc)), closes [#1792](https://github.com/dequelabs/axe-core/issues/1792) - **imports:** deprecate axios ([#2542](https://github.com/dequelabs/axe-core/issues/2542)) ([82d43a0](https://github.com/dequelabs/axe-core/commit/82d43a0593a8dc9733b97138f8e6f934ed25dea2)) - **label,select-name:** allow placeholder to pass label rule, add select-name rule ([#2448](https://github.com/dequelabs/axe-core/issues/2448)) ([1315f8e](https://github.com/dequelabs/axe-core/commit/1315f8e2fb3eb6851657be2039014e3d13127210)) - **new-rule:** ARIA links, buttons, menuitems have an accessible name ([#2571](https://github.com/dequelabs/axe-core/issues/2571)) ([9476a1f](https://github.com/dequelabs/axe-core/commit/9476a1f5170bbc85b683c6524f44f49c1835054a)) - **new-rule:** aria-tooltip-name ([#2548](https://github.com/dequelabs/axe-core/issues/2548)) ([d00f378](https://github.com/dequelabs/axe-core/commit/d00f3781fb5c9c7c7f88e6790de3741788e8ddd9)) - **new-rule:** check that meter role has an accessible name ([#2607](https://github.com/dequelabs/axe-core/issues/2607)) ([3ca2f04](https://github.com/dequelabs/axe-core/commit/3ca2f04b0f737914dda667c26f0193b7b312e6f6)) - **new-rule:** check that progressbars have an accessible name ([#2555](https://github.com/dequelabs/axe-core/issues/2555)) ([dd0b44a](https://github.com/dequelabs/axe-core/commit/dd0b44ad8aeed9e4b7b45478c62c655a6cbf10ed)) - **presentation-role-conflict:** create rule to flag elements with role conflict resolution ([#2440](https://github.com/dequelabs/axe-core/issues/2440)) ([e4edffc](https://github.com/dequelabs/axe-core/commit/e4edffc09f2305d8b4e69af266759cf32a5326f4)) - **rule-matches:** depreacte window-is-top-matches for is-intiator-matches ([#2531](https://github.com/dequelabs/axe-core/issues/2531)) ([db2be93](https://github.com/dequelabs/axe-core/commit/db2be93d07dda488f9d5ca66d193709eb41bf8cd)) - **standards:** add superclassRole to ariaRoles ([#2600](https://github.com/dequelabs/axe-core/issues/2600)) ([a5e9ce0](https://github.com/dequelabs/axe-core/commit/a5e9ce03befdc8f914f72a4eb1e49a95d6a2aa91)) - **standards:** add superclassRole to dpubRoles ([#2606](https://github.com/dequelabs/axe-core/issues/2606)) ([1b66930](https://github.com/dequelabs/axe-core/commit/1b6693092d44aa10b9d4fd093baff674a17a2d30)) - **utils:** deprecate get/set-scroll-state ([#2581](https://github.com/dequelabs/axe-core/issues/2581)) ([3c4827f](https://github.com/dequelabs/axe-core/commit/3c4827f7e3fdab4851697111bbe7cab55539bfbd)) - **valid-langs:** deprecate validLangs, add isValidLangs, reduce file size ([#2527](https://github.com/dequelabs/axe-core/issues/2527)) ([8a699ec](https://github.com/dequelabs/axe-core/commit/8a699ecba6c77f6a705d44616f1bcefd634ff89b)) ### Bug Fixes - **commons/get-text-element-stack:** account for newline characters when text is larger than container ([#2631](https://github.com/dequelabs/axe-core/issues/2631)) ([3c2429b](https://github.com/dequelabs/axe-core/commit/3c2429b4032d29cdcfd3083e46e91854dccd733b)) - Update ACT rule tags ([#2625](https://github.com/dequelabs/axe-core/issues/2625)) ([c640d4f](https://github.com/dequelabs/axe-core/commit/c640d4fc18a7625d30c6d0572e15f26c984511e4)) - **aria-errormessage:** allow aria-live="polite" on aria-errormessage target ([926b6a8](https://github.com/dequelabs/axe-core/commit/926b6a8fe7aad0444d9bc97f2e6c8564023ab58f)) - **aria-errormessage:** allow aria-live=polite on aria-errormessage target ([#2597](https://github.com/dequelabs/axe-core/issues/2597)) ([0d5cfb1](https://github.com/dequelabs/axe-core/commit/0d5cfb15941cc23d2b5065c203e9ccdc01c57b82)) - **aria-roles:** add group to menuitemradio context ([#2518](https://github.com/dequelabs/axe-core/issues/2518)) ([52b89f1](https://github.com/dequelabs/axe-core/commit/52b89f1ca67b2c04b8e96495cd6fe601e5c3eb54)) - **aria-roles:** Add WAI-ARIA 1.2 roles ([#2544](https://github.com/dequelabs/axe-core/issues/2544)) ([635b084](https://github.com/dequelabs/axe-core/commit/635b084c5460a3328118ec4f5db678deb082966b)), closes [#2107](https://github.com/dequelabs/axe-core/issues/2107) [#2107](https://github.com/dequelabs/axe-core/issues/2107) [#2107](https://github.com/dequelabs/axe-core/issues/2107) [#2107](https://github.com/dequelabs/axe-core/issues/2107) - **attr-non-space-content-evaluate:** Split no attribute and empty attribute message ([#2495](https://github.com/dequelabs/axe-core/issues/2495)) ([5f822f4](https://github.com/dequelabs/axe-core/commit/5f822f4f32ce5597e78dd7db77b8412aea1154a5)) - **audit:** updated axe.reset() to reset branding, application, and tagExcludes. ([#2537](https://github.com/dequelabs/axe-core/issues/2537)) ([828864b](https://github.com/dequelabs/axe-core/commit/828864bd9c32a6866e0e0dc6d7b263668a01497e)) - **autocomplete-valid:** allow type=tel for appropriate cc types ([#2575](https://github.com/dequelabs/axe-core/issues/2575)) ([ae21713](https://github.com/dequelabs/axe-core/commit/ae2171364bee2fe1912a9da427525be4fa99a1db)) - **checks/aria:** Mark elements missing from aria-errormessage for review ([#2550](https://github.com/dequelabs/axe-core/issues/2550)) ([8f9a035](https://github.com/dequelabs/axe-core/commit/8f9a035dca4aaa6f9fe20766d5a6f58ec1c4039c)), closes [#2460](https://github.com/dequelabs/axe-core/issues/2460) - **color-contrast:** allow small text shadows to serve as text outline ([#2627](https://github.com/dequelabs/axe-core/issues/2627)) ([432e1f3](https://github.com/dequelabs/axe-core/commit/432e1f367f1017d1c2c59d2242909852fecb0607)) - **color-contrast:** mark elements with pseudo content as needs review ([#2613](https://github.com/dequelabs/axe-core/issues/2613)) ([fcdbdbc](https://github.com/dequelabs/axe-core/commit/fcdbdbc4d7324c952d08f69607870461f707c29b)) - **color-contrast:** properly handle scrolling text ([#2619](https://github.com/dequelabs/axe-core/issues/2619)) ([984e7e2](https://github.com/dequelabs/axe-core/commit/984e7e2a96fc0cf8a1a810a17a771511225c5257)) - **docs/rules:** add missing category tags to rules metadata ([#2569](https://github.com/dequelabs/axe-core/issues/2569)) ([285c442](https://github.com/dequelabs/axe-core/commit/285c442152d8a80dd13edb9ac064ac5030199524)), closes [#2554](https://github.com/dequelabs/axe-core/issues/2554) - **explicit-label:** work with multiple labels ([#2573](https://github.com/dequelabs/axe-core/issues/2573)) ([d26f106](https://github.com/dequelabs/axe-core/commit/d26f10699d099c8a4f2aacf180862890d8dbbe18)) - **get-headers:** fix for rowspan and colspan ([#2545](https://github.com/dequelabs/axe-core/issues/2545)) ([3f02d14](https://github.com/dequelabs/axe-core/commit/3f02d14cbe3562e22762664843f8852f779be2a3)) - **heading-order:** evaluate headings from iframes in DOM order ([#2572](https://github.com/dequelabs/axe-core/issues/2572)) ([46f6628](https://github.com/dequelabs/axe-core/commit/46f6628cc710b9aaa8b872790a0b8c42032a8134)) - **implilcit-role:** use type property instead of attribute to resolve input role ([#2547](https://github.com/dequelabs/axe-core/issues/2547)) ([35e853d](https://github.com/dequelabs/axe-core/commit/35e853d91e1067b9156dfb6e89da0c7445baa86f)), closes [#2514](https://github.com/dequelabs/axe-core/issues/2514) - **link-name:** pass landmark content as link text ([#2617](https://github.com/dequelabs/axe-core/issues/2617)) ([e77992e](https://github.com/dequelabs/axe-core/commit/e77992eb1fb5e2c2365154a0f431f223e1b158ee)) - **name-rules:** ignore when explicit roles don't require a name ([#2629](https://github.com/dequelabs/axe-core/issues/2629)) ([52fb138](https://github.com/dequelabs/axe-core/commit/52fb13872f2ff477b3a32d10d1fb5c72fde3adda)) - **region:** allow role=dialog and svg elements outside regions ([#2586](https://github.com/dequelabs/axe-core/issues/2586)) ([fab58d4](https://github.com/dequelabs/axe-core/commit/fab58d4bf60a4d7b1c935b31384eecd0c57f92f5)) - **region:** treat iframes as regions ([#2614](https://github.com/dequelabs/axe-core/issues/2614)) ([936db81](https://github.com/dequelabs/axe-core/commit/936db8105b7bfa1323568ab572a1e4b0428b4566)) - **rule:** add check node to the check result object ([#2608](https://github.com/dequelabs/axe-core/issues/2608)) ([b188911](https://github.com/dequelabs/axe-core/commit/b188911613812a9aaaa95fb86606f842ee39b11a)) - **scrollable-region-focusalbe:** do not fail for combobox pattern ([#2601](https://github.com/dequelabs/axe-core/issues/2601)) ([ac71a57](https://github.com/dequelabs/axe-core/commit/ac71a574f0285eceb11960416902169f7dce030d)) - deprecate aria-form-field-name-matches for no-name-method-matches ([#2584](https://github.com/dequelabs/axe-core/issues/2584)) ([8be89e3](https://github.com/dequelabs/axe-core/commit/8be89e39883e5c421da06b1343c810502ac6e9a7)) - do not allow fallback content for objects ([#2525](https://github.com/dequelabs/axe-core/issues/2525)) ([486eafe](https://github.com/dequelabs/axe-core/commit/486eafe72ca8e1b47edd53c0142aaab415b2d2d5)) ### [4.0.2](https://github.com/dequelabs/axe-core/compare/v4.0.1...v4.0.2) (2020-09-08) ### Bug Fixes - **color-contrast:** dont error for floating element ([#2444](https://github.com/dequelabs/axe-core/issues/2444)) ([45eb746](https://github.com/dequelabs/axe-core/commit/45eb74682c8460fbd6f1de273e710b597ff01392)) - **i18n:** proofreading of the french translations ([#2485](https://github.com/dequelabs/axe-core/issues/2485)) ([ebd0407](https://github.com/dequelabs/axe-core/commit/ebd04074f556b1927c9302e3f999e4c1cbc2de9e)), closes [#2484](https://github.com/dequelabs/axe-core/issues/2484) - **implicit-role:** return gridcell for td child of grid or treegrid ([#2501](https://github.com/dequelabs/axe-core/issues/2501)) ([0553d4d](https://github.com/dequelabs/axe-core/commit/0553d4d67d59127cd67420022cd7696dea167a6a)) - **label:** pass when role none or presentation ([#2464](https://github.com/dequelabs/axe-core/issues/2464)) ([1d3c2fc](https://github.com/dequelabs/axe-core/commit/1d3c2fc28355c8476d3966d73664a2a1f4c6124d)), closes [#2458](https://github.com/dequelabs/axe-core/issues/2458) - **link-name:** fix regression where link was not named from title attribute ([#2492](https://github.com/dequelabs/axe-core/issues/2492)) ([b86c73b](https://github.com/dequelabs/axe-core/commit/b86c73b7dc61c2609afa6f384502f3c91f9a7f10)) - **required-parent:** fail if intermediate role is not the required parent ([#2494](https://github.com/dequelabs/axe-core/issues/2494)) ([522865c](https://github.com/dequelabs/axe-core/commit/522865cabbe1f4815b1f3e980018e24c062c8e5e)) - **svg-non-empty-title:** update fail message to indicate if the title element is empty or missing ([#2462](https://github.com/dequelabs/axe-core/issues/2462)) ([9598656](https://github.com/dequelabs/axe-core/commit/9598656bfac61da35f8b9f52e1fb32fcab6b484e)), closes [#2452](https://github.com/dequelabs/axe-core/issues/2452) - **valid-lang:** fail when lang attribute contains only whitespace ([#2504](https://github.com/dequelabs/axe-core/issues/2504)) ([8455a7f](https://github.com/dequelabs/axe-core/commit/8455a7f3a1aa83f487745306df0c07c39b6dc803)) ## [4.0.1](https://github.com/dequelabs/axe-core/compare/v4.0.0...v4.0.1) (2020-08-04) ### Bug Fixes - **checks**: do not normalize options for custom checks ([#2435](https://github.com/dequelabs/axe-core/issues/2435)) ([83056ad](https://github.com/dequelabs/axe-core/commit/83056ada0e50dc943a5e2829c97323a744cb3b28)) ## [4.0.0](https://github.com/dequelabs/axe-core/compare/v3.5.5...v4.0.0) (2020-07-28) ### Breaking Changes The following rules were deprecated in axe-core 3.x, and are removed in 4.0: - aria-dpub-role-fallback - checkboxgroup - layout-table - radiogroup - video-description The following checks were deprecated in axe-core 3.x, and are removed in 4.0: - aria/implicit-role-fallback - forms/fieldset - forms/group-labelledby - media/description - tables/has-caption - tables/has-summary - tables/has-th ### Features - add layout-table-matches method ([#2400](https://github.com/dequelabs/axe-core/issues/2400)) ([d7ba70f](https://github.com/dequelabs/axe-core/commit/d7ba70fc9916cedb2e977c9dc10667985c2bb4ed)) - **aria/get-roles-by-type:** deprecate in favor of standards/get-aria-roles-by-type ([#2362](https://github.com/dequelabs/axe-core/issues/2362)) ([c0c37ea](https://github.com/dequelabs/axe-core/commit/c0c37ea22f306cc93341fe25e173e3f65b6f924b)) - **aria/lookupTable, aria-allowed-attr:** deprecate aria.lookupTable and passing allowed attributes to aria-allowed-attr ([#2395](https://github.com/dequelabs/axe-core/issues/2395)) ([739d1b1](https://github.com/dequelabs/axe-core/commit/739d1b11052c93c0856e6e5d217b66e613e43f11)) - **avoid-inline-spacing:** add option for which css properties to look at ([#2244](https://github.com/dequelabs/axe-core/issues/2244)) ([93c027a](https://github.com/dequelabs/axe-core/commit/93c027ab7d081dcda401399e1cbdb5a27026c927)) - **checks:** normalize check options to alway be an object ([#2219](https://github.com/dequelabs/axe-core/issues/2219)) ([da12da7](https://github.com/dequelabs/axe-core/commit/da12da79b1e7a16887807980e03d4e8244bed560)) - **checks,rules:** remove deprecated checks and rules ([#2214](https://github.com/dequelabs/axe-core/issues/2214)) ([317545a](https://github.com/dequelabs/axe-core/commit/317545a0916a16e05263d1cedb6d9753e4ef6e19)) - **closest:** VirtualNode implementation of Element.closest. Deprecate commons.dom.findUp and commons.dom.findUpVirtual ([#2139](https://github.com/dequelabs/axe-core/issues/2139)) ([493dd22](https://github.com/dequelabs/axe-core/commit/493dd2253606189a5e475c691aa8f0dc68a8aedd)) - **color-contrast, utils:** add more options to color-contrast, add utils.deepMerge, deprecate commons.color.hasValidContrastRatio ([#2256](https://github.com/dequelabs/axe-core/issues/2256)) ([49fdb46](https://github.com/dequelabs/axe-core/commit/49fdb46cf371321760a3bdff6acc5311b4cfd158)) - **commons/aria:** deprecate getRole({ noImplicit }) for getExplicitRole() ([#2294](https://github.com/dequelabs/axe-core/issues/2294)) ([a2873ea](https://github.com/dequelabs/axe-core/commit/a2873ea41f5b264165a2fb76679ab121985bb4f2)) - **commons/standards:** create the commons/standards object for helper functions against the standards table ([#2358](https://github.com/dequelabs/axe-core/issues/2358)) ([6dce974](https://github.com/dequelabs/axe-core/commit/6dce974ee5f3095143818fbf5180d21762fe5de6)) - **duplicate-img-label:** add option for parentSelector ([#2216](https://github.com/dequelabs/axe-core/issues/2216)) ([8906806](https://github.com/dequelabs/axe-core/commit/8906806fa039ba105bea745495e91031461af445)) - **get-role:** add presentation role resolution and inheritance ([#2281](https://github.com/dequelabs/axe-core/issues/2281)) ([e207190](https://github.com/dequelabs/axe-core/commit/e2071900c462048a7455ec1f41878ab4f70b1bdd)) - **get-role:** work with standards object ([#2367](https://github.com/dequelabs/axe-core/issues/2367)) ([1b20faf](https://github.com/dequelabs/axe-core/commit/1b20faf73417fde425dadfe1ac0a359d2179c1a1)) - **globals:** deduce required window and document globals from context ([#2308](https://github.com/dequelabs/axe-core/issues/2308)) ([61bac69](https://github.com/dequelabs/axe-core/commit/61bac69877da884a9a24b040f898a67c6746984f)) - **has-descendant, page-no-duplicate:** move page-has-elm and page-no-duplicate to generic check ([#2229](https://github.com/dequelabs/axe-core/issues/2229)) ([59125a0](https://github.com/dequelabs/axe-core/commit/59125a056d4b591ee20a67be12e1c66e83ec7c25)) - **has-lang:** add option for which attributes to look at ([#2239](https://github.com/dequelabs/axe-core/issues/2239)) ([e69c46a](https://github.com/dequelabs/axe-core/commit/e69c46a49f348b8ae1fec8929e4688940b644a06)) - **has-text-content:** add generic check has-text-content ([#2234](https://github.com/dequelabs/axe-core/issues/2234)) ([60ddc65](https://github.com/dequelabs/axe-core/commit/60ddc6577b70e27e9e7fe340d163b01360035e13)) - **i18n:** add Basque (eu) translation ([#1964](https://github.com/dequelabs/axe-core/issues/1964)) ([176cf82](https://github.com/dequelabs/axe-core/commit/176cf824288a927e5e21dd64a7793251a31ef180)) - **matcher:** allow regex string to be parsed as regex ([#2324](https://github.com/dequelabs/axe-core/issues/2324)) ([321b2d1](https://github.com/dequelabs/axe-core/commit/321b2d1dbfb8f3e04847674f46ada53b19313142)) - **matches:** add explicitRole, implicitRole, and semanticRole matches functions ([#2286](https://github.com/dequelabs/axe-core/issues/2286)) ([30efbff](https://github.com/dequelabs/axe-core/commit/30efbfffc8b83ca03b4b2697e4202027826195f9)) - **matches-definition:** add generic check matches-definition ([#2233](https://github.com/dequelabs/axe-core/issues/2233)) ([20467aa](https://github.com/dequelabs/axe-core/commit/20467aa48705d4b6b98f123031431bb3ac3ee22b)) - **metadata-function-map:** add metadata function map to support check evaulate functions as an id string ([#2162](https://github.com/dequelabs/axe-core/issues/2162)) ([ec9b931](https://github.com/dequelabs/axe-core/commit/ec9b931c3123b3252e3c0afd5b059f0bbcfcc0d0)) - **non-space-content:** switch all non-empty checks to new generic check ([#2215](https://github.com/dequelabs/axe-core/issues/2215)) ([7ce7b00](https://github.com/dequelabs/axe-core/commit/7ce7b00c2d302d830bd2c0efa027d0ea3b10770c)) - **object-alt,accessible-text:** object-alt rule and accessible text to work with serial virtual nodes with children ([e8e17e4](https://github.com/dequelabs/axe-core/commit/e8e17e42c3594518ee60838749a507504a839c69)) - **options:** add ancestry CSS selector to nodes ([#2389](https://github.com/dequelabs/axe-core/issues/2389)) ([f2cccf5](https://github.com/dequelabs/axe-core/commit/f2cccf50def5b2409f5903ce325f18475c8ed79e)) - **region:** add option to match nodes as region ([#2249](https://github.com/dequelabs/axe-core/issues/2249)) ([b544554](https://github.com/dequelabs/axe-core/commit/b544554902b3aa0afb477e5e78140780f42e3405)) - **required-attrs:** deprecate options to pass more required attrs ([797ee34](https://github.com/dequelabs/axe-core/commit/797ee34e6913cc5e45d55c770127e91623cb31f7)) - **rule:** add reviewOnFail option to have rule return as needs review instead of violation ([#2235](https://github.com/dequelabs/axe-core/issues/2235)) ([bb72acd](https://github.com/dequelabs/axe-core/commit/bb72acde17e9f783ac136c30a79f14144326a7df)) - **rule:** optional impact on rules ([#2393](https://github.com/dequelabs/axe-core/issues/2393)) ([e48c1eb](https://github.com/dequelabs/axe-core/commit/e48c1eb67db6182d7048a21f935db5a9416077ec)) - **scope-value:** add options for valid scope values ([#2245](https://github.com/dequelabs/axe-core/issues/2245)) ([44269ec](https://github.com/dequelabs/axe-core/commit/44269ec6695645417dda03b26fcb04abebc15f5f)) - **standards:** add ariaRoles standard ([#2328](https://github.com/dequelabs/axe-core/issues/2328)) ([70efbc0](https://github.com/dequelabs/axe-core/commit/70efbc045448d6621c270e5cbec70fe5794d4216)) - **standards:** add dpub-roles spec ([#2332](https://github.com/dequelabs/axe-core/issues/2332)) ([7ec3185](https://github.com/dequelabs/axe-core/commit/7ec3185d55ca8fdce07c0345f5b960b39a54aba4)) - **standards:** add get-aria-roles-supporting-name-from-content and deprecate aria/get-roles-with-name-from-content ([#2363](https://github.com/dequelabs/axe-core/issues/2363)) ([240b528](https://github.com/dequelabs/axe-core/commit/240b528a3a5e5f06e29973df5a9427315496bd28)) - **standards:** add get-elements-by-content-type and implicit-html-roles ([#2375](https://github.com/dequelabs/axe-core/issues/2375)) ([f1e0848](https://github.com/dequelabs/axe-core/commit/f1e0848cb359f5912e2cf12ada02b06c079d7e21)) - add "ACT" tag for published W3C ACT rules ([#2382](https://github.com/dequelabs/axe-core/issues/2382)) ([cf11b64](https://github.com/dequelabs/axe-core/commit/cf11b646f9b883e153ff5ec8fd848a363ea6bb24)) - **standards:** add html-elms spec ([#2333](https://github.com/dequelabs/axe-core/issues/2333)) ([1d6a888](https://github.com/dequelabs/axe-core/commit/1d6a8885166007f8fec78ce853b8fef8262c522d)) - **standards:** create standards object and ariaAttrs ([#2315](https://github.com/dequelabs/axe-core/issues/2315)) ([48610de](https://github.com/dequelabs/axe-core/commit/48610de74fed473f7d87e3c01f87a46d4dec406c)) - **utils.getFlattenTree:** default to documentElement ([#2260](https://github.com/dequelabs/axe-core/issues/2260)) ([8b14ccc](https://github.com/dequelabs/axe-core/commit/8b14ccc5b1bd89892f57ff0f02de2045e7c3756f)) - **valid-lang:** add option for which attributes to look at ([#2240](https://github.com/dequelabs/axe-core/issues/2240)) ([ffee19e](https://github.com/dequelabs/axe-core/commit/ffee19e4a769d66f9c81016dce83ad654609a9df)) - update SC tags for `label` rule ([#2037](https://github.com/dequelabs/axe-core/issues/2037)) ([c7113fc](https://github.com/dequelabs/axe-core/commit/c7113fcc5d3f144e37d0204eebef701ffc844280)) ### Bug Fixes - **accessible-name-virtual:** allow subtree text to work with virtual and serial nodes ([#2346](https://github.com/dequelabs/axe-core/issues/2346)) ([67d2dca](https://github.com/dequelabs/axe-core/commit/67d2dca91af29a47e85919b049d98a5c83ec5b99)) - **api:** correct use of rules property in axe.run ([#2278](https://github.com/dequelabs/axe-core/issues/2278)) ([1fd9e11](https://github.com/dequelabs/axe-core/commit/1fd9e116598fc2c152a30651110758043fe58ffd)) - **aria-allowed-attr:** Add aria-orientation to radiogroup role ([#2322](https://github.com/dequelabs/axe-core/issues/2322)) ([5e1f922](https://github.com/dequelabs/axe-core/commit/5e1f92206134c81e5c05e907ab3fc1c223243b3d)) - **aria-allowed-attr:** allow aria-activedescendant on role=application ([#2304](https://github.com/dequelabs/axe-core/issues/2304)) ([2554f5c](https://github.com/dequelabs/axe-core/commit/2554f5cdfc7bf616b52f109adedf575c7ea65f65)) - **aria-allowed-role:** Add fieldset to allowed elements for radiogroup ([#2326](https://github.com/dequelabs/axe-core/issues/2326)) ([a5409d4](https://github.com/dequelabs/axe-core/commit/a5409d42deb69ff5982a732a7e947ce97fce9c1e)) - **aria-allowed-role:** allow role=presentation on hr ([#2300](https://github.com/dequelabs/axe-core/issues/2300)) ([b524ea9](https://github.com/dequelabs/axe-core/commit/b524ea954fdcf8fcf09b49bdbe546335ed0e46df)) - **aria-lablledby:** work with virtual and serial virtual nodes ([#2341](https://github.com/dequelabs/axe-core/issues/2341)) ([c1f3db7](https://github.com/dequelabs/axe-core/commit/c1f3db749f8de71635bc378c7cdf1a22c782429a)) - **aria-toggle-field-name:** work with virtual nodes ([#2353](https://github.com/dequelabs/axe-core/issues/2353)) ([e5fb01e](https://github.com/dequelabs/axe-core/commit/e5fb01e497c63c2deca6eebd2466faea4d9afb2a)) - **aria/allowed-attr:** work with standards object ([#2360](https://github.com/dequelabs/axe-core/issues/2360)) ([40397f5](https://github.com/dequelabs/axe-core/commit/40397f560f0bf0bcd7d80b98c4c02857cf6f2584)) - **aria/get-role-type:** work with standards object ([#2361](https://github.com/dequelabs/axe-core/issues/2361)) ([a61e314](https://github.com/dequelabs/axe-core/commit/a61e3142ba5976bde09a9cd82cc944eab5ee284b)) - **autocomplete:** allow all 'tel-\*' autocomplete values on type=tel ([#2307](https://github.com/dequelabs/axe-core/issues/2307)) ([58c8175](https://github.com/dequelabs/axe-core/commit/58c8175ce4bcfd597c1d6df4c95113d2eb753951)) - **button-name:** work with serial virtual node ([#2351](https://github.com/dequelabs/axe-core/issues/2351)) ([efa0e56](https://github.com/dequelabs/axe-core/commit/efa0e56ed8901c0d379e564cc0d4d5532b5df547)) - **bypass:** find headings in iframes ([#2310](https://github.com/dequelabs/axe-core/issues/2310)) ([7c23dbd](https://github.com/dequelabs/axe-core/commit/7c23dbd1d04d95e3bd2b56a0bd14571f906eb3d5)) - **color:** allow all valid CSS colors ([#2381](https://github.com/dequelabs/axe-core/issues/2381)) ([63d69ea](https://github.com/dequelabs/axe-core/commit/63d69ea1313d0c7dcdc4142c8de160b89082d9df)) - **color-contrast:** account for text-shadow ([#2334](https://github.com/dequelabs/axe-core/issues/2334)) ([3eb6d2c](https://github.com/dequelabs/axe-core/commit/3eb6d2ccde9dc731450c90ebe497580cb98de201)) - **color-contrast:** ignore aria-disabled labels ([#2130](https://github.com/dequelabs/axe-core/issues/2130)) ([e451b87](https://github.com/dequelabs/axe-core/commit/e451b87166b02262b5f191be1cf9fe1548047931)) - **color-contrast:** properly handle truncated text ([#2302](https://github.com/dequelabs/axe-core/issues/2302)) ([a56190c](https://github.com/dequelabs/axe-core/commit/a56190c845cc7619a38a28685c48d8ac38108ebd)) - **dlitem:** allow role=presentation on parent dl ([#2301](https://github.com/dequelabs/axe-core/issues/2301)) ([9857978](https://github.com/dequelabs/axe-core/commit/9857978a1f926b9eada8f560c9fbb1950fe8c648)) - **focusable-no-name:** work with serial virtual nodes ([#2399](https://github.com/dequelabs/axe-core/issues/2399)) ([1ef3066](https://github.com/dequelabs/axe-core/commit/1ef3066476af80a7b5cb61a8fcb113f0208d5086)) - **forms/\*:** allow all form control value checks to work with virtual nodes ([#2343](https://github.com/dequelabs/axe-core/issues/2343)) ([8ad41af](https://github.com/dequelabs/axe-core/commit/8ad41af457125a268256f84de7623a79e905f782)) - **header-present:** fail for headings with non-header role ([#2306](https://github.com/dequelabs/axe-core/issues/2306)) ([b8ffb39](https://github.com/dequelabs/axe-core/commit/b8ffb39785188dd230431f4f53825f1fe42ee3af)) - **html-namespace-matches:** work with serial virtual nodes ([#2398](https://github.com/dequelabs/axe-core/issues/2398)) ([18c22fd](https://github.com/dequelabs/axe-core/commit/18c22fd379440eb681aa18cf0b624d6b4b3cbeec)) - **implicit-roles:** add proper implicit role calculation ([#2242](https://github.com/dequelabs/axe-core/issues/2242)) ([e9dd259](https://github.com/dequelabs/axe-core/commit/e9dd2598b469fcbf936517aba33f983191301ff9)) - **input-button-name:** work with virtual nodes ([#2352](https://github.com/dequelabs/axe-core/issues/2352)) ([63ca388](https://github.com/dequelabs/axe-core/commit/63ca3881e8352fba3b71f2f76dae23a0d70a271f)) - **is-valid-autocomplete:** allow autocomplete="one-time-code" ([#2336](https://github.com/dequelabs/axe-core/issues/2336)) ([638346f](https://github.com/dequelabs/axe-core/commit/638346fc515cfa5fda1b71f5ad31f5d4436a21eb)) - **label:** work with virtual nodes ([#2354](https://github.com/dequelabs/axe-core/issues/2354)) ([44b033c](https://github.com/dequelabs/axe-core/commit/44b033c51619294a8d85c26aa6c703f57db90a59)) - **page-has-h1:** allow aria-level=1 on native headings ([#2349](https://github.com/dequelabs/axe-core/issues/2349)) ([70b10b2](https://github.com/dequelabs/axe-core/commit/70b10b29c725507b0c1b6fb0d6d4146f123e5d34)) - **rule:** allow impact to be configured ([#2426](https://github.com/dequelabs/axe-core/issues/2426)) ([f325c75](https://github.com/dequelabs/axe-core/commit/f325c755a11895cbb868de7be648461e5d81494e)) - **rule,check:** allow function ids for matches property in rule.configure ([#2423](https://github.com/dequelabs/axe-core/issues/2423)) ([3ccb781](https://github.com/dequelabs/axe-core/commit/3ccb78128469d234db22225ea93a40c6d8fef434)) - **run:** cleanup globals if set from context ([#2387](https://github.com/dequelabs/axe-core/issues/2387)) ([d5b6931](https://github.com/dequelabs/axe-core/commit/d5b6931cba857a5c787d912ee56bdd973e3742d4)) - **svg-image-alt:** work with serial virtual nodes ([#2397](https://github.com/dequelabs/axe-core/issues/2397)) ([e2537ef](https://github.com/dequelabs/axe-core/commit/e2537eff1eb4b5378d63bddf00df44347d3aa09b)) - **types:** Allow `impact` to be `null` ([#2321](https://github.com/dequelabs/axe-core/issues/2321)) ([757aacd](https://github.com/dequelabs/axe-core/commit/757aacd9716dc8a606f23807a5e8fe6a5474fbee)), closes [#2313](https://github.com/dequelabs/axe-core/issues/2313) - **types:** Make any tag allowed ([#2314](https://github.com/dequelabs/axe-core/issues/2314)) ([5d98a04](https://github.com/dequelabs/axe-core/commit/5d98a043d8bcda3a3fe032dd8205c9256c481631)), closes [#2312](https://github.com/dequelabs/axe-core/issues/2312) - **typings:** update types file ([#2425](https://github.com/dequelabs/axe-core/issues/2425)) ([0aab922](https://github.com/dequelabs/axe-core/commit/0aab922630bf72cc658dee3fb907463d718c57f1)) - **virtual-node:** default and lowercase type property ([#2350](https://github.com/dequelabs/axe-core/issues/2350)) ([f6b3484](https://github.com/dequelabs/axe-core/commit/f6b34849fd0d869448137b4d032ca69a91fa9f66)) - ensure correctly generated axe is required by `aria-supported` build step ([#2295](https://github.com/dequelabs/axe-core/issues/2295)) ([1414a9f](https://github.com/dequelabs/axe-core/commit/1414a9fd822700609024aa2cef782d63cfb0bce4)) - **aria-required-attr:** pass aria-checked for elements with checked property ([#2226](https://github.com/dequelabs/axe-core/issues/2226)) ([64318a5](https://github.com/dequelabs/axe-core/commit/64318a5bce02f05c6e6a1acf739c354b84b88082)) - **axe.d.ts:** add `element` to NodeResults ([#2211](https://github.com/dequelabs/axe-core/issues/2211)) ([2429355](https://github.com/dequelabs/axe-core/commit/242935552c1679f0c98aff8585fd39c0442d2d6e)) - **color-contrast:** mark more punctutions for review ([#2126](https://github.com/dequelabs/axe-core/issues/2126)) ([dc98afc](https://github.com/dequelabs/axe-core/commit/dc98afc841c86e4b7b771bbb1171152a151c3e5b)) - **duplicate-id:** list the duplicate id in message ([#2163](https://github.com/dequelabs/axe-core/issues/2163)) ([f5d4ff9](https://github.com/dequelabs/axe-core/commit/f5d4ff9e792b979c7f7c7cf8b3607f3969c25eb4)) - **required-children:** consider overriding descendant role(s)… ([#2131](https://github.com/dequelabs/axe-core/issues/2131)) ([e1c11dd](https://github.com/dequelabs/axe-core/commit/e1c11ddf6e001eaa593a477eb7a5cb2f3c020e6d)) - **scrollable-region-focusable:** pass for elements with contenteditable ([#2133](https://github.com/dequelabs/axe-core/issues/2133)) ([1012dfe](https://github.com/dequelabs/axe-core/commit/1012dfec29a7a69b70357211233bb350159fa83e)) - **th-has-data-cells:** fail when only cell points to different header ([2d420c3](https://github.com/dequelabs/axe-core/commit/2d420c33981231a21d375c0aa8907e0c4c7c8932)) - **types:** Add "wcag21aa" and "wcag21a" to our TS definition ([#2272](https://github.com/dequelabs/axe-core/issues/2272)) ([23674d4](https://github.com/dequelabs/axe-core/commit/23674d4403a7088996a758d0081b869516be4aea)) - **types:** Add missing properties to `Spec` ([#2273](https://github.com/dequelabs/axe-core/issues/2273)) ([c39ba9f](https://github.com/dequelabs/axe-core/commit/c39ba9ffbd3a9777660da1d7e27d2471fc4158cd)) ### [3.5.5](https://github.com/dequelabs/axe-core/compare/v3.5.4...v3.5.5) (2020-06-16) ### Bug Fixes - **aria-input-field-name:** add the missing word must to help metadata ([b0f5562](https://github.com/dequelabs/axe-core/commit/b0f5562ac2a746e8ac78f6e483e39162680f3a22)) - **color-contrast:** fix font-weight calculation for safari ([205b587](https://github.com/dequelabs/axe-core/commit/205b58709c280f00100bf24a7b6bf15da50ed0ed)) - **configure:** validate rules and checks properties ([8c91ead](https://github.com/dequelabs/axe-core/commit/8c91ead900fd3cab58f77af45cce54d02e734a8e)) - **is-visible:** return false for opacity: 0 and 0 height scrollable regions ([86ada3f](https://github.com/dequelabs/axe-core/commit/86ada3f7cef5b1fbcaad37b8acfaee93566ba8bf)) - **listitem:** do not fail for parent with role=presentation|none ([a3ddc6e](https://github.com/dequelabs/axe-core/commit/a3ddc6e1e43716b761e8bb42fba4842d88f813dc)) - **meta-viewport:** don't throw error if viewport property doesn't have a value ([2176794](https://github.com/dequelabs/axe-core/commit/2176794f8a831c8303984039e4a07b99d368b111)) ### [3.5.4](https://github.com/dequelabs/axe-core/compare/v3.5.3...v3.5.4) (2020-05-22) ### Bug Fixes - **get-element-stack:** properly calculate position of children of floated elements ([28a8c58](https://github.com/dequelabs/axe-core/commit/28a8c58b409461600da07eac164e5b0ca4744502)) ### [3.5.3](https://github.com/dequelabs/axe-core/compare/v3.5.2...v3.5.3) (2020-03-31) ### Bug Fixes - **meta-viewport:** parse negative and string values for `maximum-scale` ([#2137](https://github.com/dequelabs/axe-core/issues/2137)) ([8c92472](https://github.com/dequelabs/axe-core/commit/8c92472397676d44b333cf50ad1a9413b9783c2c)) - **respondable:** ignore reflected messages from iframes ([#2134](https://github.com/dequelabs/axe-core/issues/2134)) ([3ab9f21](https://github.com/dequelabs/axe-core/commit/3ab9f21414d8f4195ac95ffca8f0ce52258539b0)) - **header-present:** update verbiage to use heading instead of header ([#2132](https://github.com/dequelabs/axe-core/issues/2132)) ([8890063](https://github.com/dequelabs/axe-core/commit/889006397329a35a170f4a3d24c55c3c4fd758fc)) - **color-contrast:** mark more punctuations for review ([#2126](https://github.com/dequelabs/axe-core/issues/2126)) ([dc98afc](https://github.com/dequelabs/axe-core/commit/dc98afc841c86e4b7b771bbb1171152a151c3e5b)) - **unicode:** detect supplementary private use area A ([#2102](https://github.com/dequelabs/axe-core/issues/2102)) ([f1739c2](https://github.com/dequelabs/axe-core/commit/f1739c21efdf5cf6fddf425d1c72b056757f3ba1)) - **definition-list:** Mention
is allowed to group content in
([#2098](https://github.com/dequelabs/axe-core/issues/2098)) ([76b1a9f](https://github.com/dequelabs/axe-core/commit/76b1a9f7f244e43f63351c46d91fc8b27040ba98)) - **td-headers-attr:** mark as needs review if headers attr is empty ([#2096](https://github.com/dequelabs/axe-core/issues/2096)) ([699b566](https://github.com/dequelabs/axe-core/commit/699b566111cfed2a4ebeade35346a49bcb3546c7)) - **td-has-headers:** don't fail for empty headers attribute ([#2095](https://github.com/dequelabs/axe-core/issues/2095)) ([7952a37](https://github.com/dequelabs/axe-core/commit/7952a377b960c2403c8d4758a9f35ebe525549fe)) - **th-has-data-cells:** fail when data cell points to a different header ([#2094](https://github.com/dequelabs/axe-core/issues/2094)) ([d3bd416](https://github.com/dequelabs/axe-core/commit/d3bd416a3df7324231f17ff9e1e20dc6342c7aa5)) - **has-lang:** update message to indicate that xml:lang is not valid on HTML pages ([#2093](https://github.com/dequelabs/axe-core/issues/2093)) ([c3a7de2](https://github.com/dequelabs/axe-core/commit/c3a7de206baf77c0b25c8c095119393b1dc85f0f)) - **page-no-duplicate-contentinfo:** do not fail when first element is inside landmark ([#2092](https://github.com/dequelabs/axe-core/issues/2092)) ([eca7e05](https://github.com/dequelabs/axe-core/commit/eca7e05cc6ff750855bcb219833967a9d7087679)) ### [3.5.2](https://github.com/dequelabs/axe-core/compare/v3.5.1...v3.5.2) (2020-03-06) ### Bug Fixes - **aria-allowed-role:** allow role=spinbutton on input[type=tel](<[635445b](https://github.com/dequelabs/axe-core/commit/635445ba6da7bc197bcdee6fb1a9d9dc81e43941)>) - **color-contrast:** ignore form elements that move text outside of node using text-indent ([#2044](https://github.com/dequelabs/axe-core/issues/2044)) ([85cc6ab](https://github.com/dequelabs/axe-core/commit/85cc6abd7f919a7311c6da01a41853cbfd539508)) - **commons:** handle node(s) contained by SVG document when de… ([#2054](https://github.com/dequelabs/axe-core/issues/2054)) ([bf4c9bf](https://github.com/dequelabs/axe-core/commit/bf4c9bff2953b1ac7f40dbb1d0bd1986c1caa673)) - **getCheckMessage:** add API to return check message ([#2066](https://github.com/dequelabs/axe-core/issues/2066)) ([e216322](https://github.com/dequelabs/axe-core/commit/e216322183c8b064ebfd748fea785b8c2fe78b16)) - **has-lang:** fail check when `xml:lang` is used in HTML docum… ([#2053](https://github.com/dequelabs/axe-core/issues/2053)) ([e07aaea](https://github.com/dequelabs/axe-core/commit/e07aaea86bc9460a2d9f568637b4a77d33094ed6)) - **label-content-name-mismatch:** ignore non `widget` aria role(s) & do not use deprecated `lookupTable.rolesOfType` ([#2022](https://github.com/dequelabs/axe-core/issues/2022)) ([89bd84c](https://github.com/dequelabs/axe-core/commit/89bd84c4a9846dc31a660eda6b274329e7ac70b5)) - **package-lock:** change @deque/doT from agora to npm ([#2058](https://github.com/dequelabs/axe-core/issues/2058)) ([c03c0e5](https://github.com/dequelabs/axe-core/commit/c03c0e5ffc3ea1b49607355fa9d6f2e2faf0ebd1)) - **page-has-heading-one:** find screen-reader only headings ([#2065](https://github.com/dequelabs/axe-core/issues/2065)) ([f808a12](https://github.com/dequelabs/axe-core/commit/f808a12261269719534ae52c878d1700fb70053e)) - **region:** ignore direct child text nodes of body ([#2050](https://github.com/dequelabs/axe-core/issues/2050)) ([fde31d0](https://github.com/dequelabs/axe-core/commit/fde31d03d24820f681b257c4c42b98f25b2877ec)) - **skip-link:** identify as skip-link only if the link is offscreen ([#2079](https://github.com/dequelabs/axe-core/issues/2079)) ([241e1d0](https://github.com/dequelabs/axe-core/commit/241e1d0715398a39c2e502ddb781f5fc29987dde)) - check `invaildrole` fails only when all roles are invalid ([#2075](https://github.com/dequelabs/axe-core/issues/2075)) ([989b317](https://github.com/dequelabs/axe-core/commit/989b31788b08b6514dd4b606162193d4dd168be9)) - ignore empty, whitespace or undefined `role` for rule `ari… ([#2077](https://github.com/dequelabs/axe-core/issues/2077)) ([dbd3c02](https://github.com/dequelabs/axe-core/commit/dbd3c0211b05641f366dfe2fe9c2124cad9e5e3a)) - update tags for rule `area-alt` ([#2051](https://github.com/dequelabs/axe-core/issues/2051)) ([7db231f](https://github.com/dequelabs/axe-core/commit/7db231f2ff2b70a4e8e6f7aababe0871764ece96)) ### [3.5.1](https://github.com/dequelabs/axe-core/compare/v3.5.0...v3.5.1) (2020-02-12) ### Bug Fixes - **color-contrast:** parse font-weight value as number ([#2031](https://github.com/dequelabs/axe-core/issues/2031)) ([#2040](https://github.com/dequelabs/axe-core/issues/2040)) ([0bb2166](https://github.com/dequelabs/axe-core/commit/0bb21669f75b3adc0e3345c85680d437c57f94d8)) - **color-contrast:** properly pass options to check ([#2033](https://github.com/dequelabs/axe-core/issues/2033)) ([26b99c0](https://github.com/dequelabs/axe-core/commit/26b99c0a511bd6fffaaca7535d732f26b39ef46e)) - **commons:** avoid unicode regex encoding in axe.min.js ([#2024](https://github.com/dequelabs/axe-core/issues/2024)) ([ae90dc4](https://github.com/dequelabs/axe-core/commit/ae90dc47521f6047f71befcb3551686cf857208d)) - **sri-history:** correct SRI for various versions ([#2041](https://github.com/dequelabs/axe-core/issues/2041)) ([940c017](https://github.com/dequelabs/axe-core/commit/940c01708cede33e796972ce810a815ddf492ba4)) ## [3.5.0](https://github.com/dequelabs/axe-core/compare/v3.4.0...v3.5.0) (2020-02-04) ### Features - **aria-dpub-role-fallback:** depreacte aria-dpub-role-fallback and move into aria-allowed-role ([#1899](https://github.com/dequelabs/axe-core/issues/1899)) ([8e25c20](https://github.com/dequelabs/axe-core/commit/8e25c20a479b03820117c6cd349b51ce7f2e94ee)) - **aria-label:** deprecate Element arg; use virtualNode ([#1922](https://github.com/dequelabs/axe-core/issues/1922)) ([d14981c](https://github.com/dequelabs/axe-core/commit/d14981c1f67ba849f9519ee826ac646d281649c7)) - **audit:** allow runOnly option to accept an array of rules ([#1889](https://github.com/dequelabs/axe-core/issues/1889)) ([38d6a3f](https://github.com/dequelabs/axe-core/commit/38d6a3fb26c66215cca0f3df8da268b34bcb6be5)) - **color-contrast:** greatly improve performance for very large sites ([#1943](https://github.com/dequelabs/axe-core/issues/1943)) ([9ea0065](https://github.com/dequelabs/axe-core/commit/9ea006534a423b2b7df1826a40e8214c6bb1fc48)) - **core:** add preload configuration option for media files ([#1958](https://github.com/dequelabs/axe-core/issues/1958)) ([8a62649](https://github.com/dequelabs/axe-core/commit/8a626498dc9694a992e76855781e2ad1cbd4fe9b)) - **core/reporters/v1:** Add failureSummary to incomplete results ([#1972](https://github.com/dequelabs/axe-core/issues/1972)) ([c88883d](https://github.com/dequelabs/axe-core/commit/c88883d00b6578593b83f3134ebf897d22a3ba61)) - **get-element-stack:** performant api to replace document.elementsFromPoint ([#1842](https://github.com/dequelabs/axe-core/issues/1842)) ([9ae07fb](https://github.com/dequelabs/axe-core/commit/9ae07fbda36afd18a42a96d6755055006f309a4c)) - **i18n:** add Danish (da-DK) translation ([#1876](https://github.com/dequelabs/axe-core/issues/1876)) ([fb6fc41](https://github.com/dequelabs/axe-core/commit/fb6fc414246bdaf1590d367352e4bea033822639)) - **landmark-no-duplicate-\*:** add rule landmark-no-duplicate-main, don't use html as element source for all duplicate rules ([#1949](https://github.com/dequelabs/axe-core/issues/1949)) ([5ec7894](https://github.com/dequelabs/axe-core/commit/5ec7894394f8348761f5fe48ad0d09b31a27d2b2)) - **layout-table:** deprecate layout-table rule and checks ([#1885](https://github.com/dequelabs/axe-core/issues/1885)) ([d22cb30](https://github.com/dequelabs/axe-core/commit/d22cb30ad29f5d1aec089eea3544ff88f3b4f8ab)) - **matches:** use VirtualNode and deprecate HTMLElement ([#1988](https://github.com/dequelabs/axe-core/issues/1988)) ([2600a06](https://github.com/dequelabs/axe-core/commit/2600a062d65f0c079b30d6a9f2aa3b6faeea6872)) - **rule:** add color-contrast check for unicode characters, behind flags. ([#1969](https://github.com/dequelabs/axe-core/issues/1969)) ([0cd4037](https://github.com/dequelabs/axe-core/commit/0cd40373ff9a080ffcb128ce66f9eaf80f0d19b4)), closes [#1906](https://github.com/dequelabs/axe-core/issues/1906) - **rule:** identical-links-same-purpose ([#1649](https://github.com/dequelabs/axe-core/issues/1649)) ([9c73f62](https://github.com/dequelabs/axe-core/commit/9c73f62fea2be68cb555c36fc32c79f7ce2697dd)) - **rule:** no-autoplay-audio ([#1946](https://github.com/dequelabs/axe-core/issues/1946)) ([b2373cb](https://github.com/dequelabs/axe-core/commit/b2373cb9ce73a15e79aec86af7edff62c9a4e2b3)) - **svg-img-alt:** rule for when svg needs a title ([#1953](https://github.com/dequelabs/axe-core/issues/1953)) ([9491e09](https://github.com/dequelabs/axe-core/commit/9491e094fe82c4dba45eb253ed18bf0a0165197c)) - deprecate the use doT.js for messages ([#1938](https://github.com/dequelabs/axe-core/issues/1938)) ([a2ddba3](https://github.com/dequelabs/axe-core/commit/a2ddba305003db0540c093f4ad9015c8854cd98d)) ### Bug Fixes - **color-contrast:** properly pass options to check ([#2033](https://github.com/dequelabs/axe-core/issues/2033)) ([26b99c0](https://github.com/dequelabs/axe-core/commit/26b99c0a511bd6fffaaca7535d732f26b39ef46e)) - **commons:** avoid unicode regex encoding in axe.min.js ([#2024](https://github.com/dequelabs/axe-core/issues/2024)) ([ae90dc4](https://github.com/dequelabs/axe-core/commit/ae90dc47521f6047f71befcb3551686cf857208d)) - add tags with dots for wcag sc ([#1849](https://github.com/dequelabs/axe-core/issues/1849)) ([2f1ab36](https://github.com/dequelabs/axe-core/commit/2f1ab36354add65fe77be3e2831278ce37c3bbab)) - compute orientation lock from various transformation func… ([#1937](https://github.com/dequelabs/axe-core/issues/1937)) ([c987de0](https://github.com/dequelabs/axe-core/commit/c987de0ce7cfcde5a280a9d6c643879093df1bcd)) - ignores axe.ping responses that do not contain axe=true ([26cb1fb](https://github.com/dequelabs/axe-core/commit/26cb1fbdd7127c421bb7ca60e07d72385c6e2ea1)) - input[role=button][value='correct'] should pass ([#1897](https://github.com/dequelabs/axe-core/issues/1897)) ([4635fef](https://github.com/dequelabs/axe-core/commit/4635fef8bafd1c1cf916962693d0deee082266cf)) - remove heading from list of widget roles ([#1882](https://github.com/dequelabs/axe-core/issues/1882)) ([a8cbf71](https://github.com/dequelabs/axe-core/commit/a8cbf717ef3aa8b0bf09ddcb17f3a95fd2d1a64a)) - **link-name:** test role=link when there is no href ([#1921](https://github.com/dequelabs/axe-core/issues/1921)) ([6db28bc](https://github.com/dequelabs/axe-core/commit/6db28bc455b1c8937f44346aa232eacc4a1c3457)) - remove isNaN check ([#2010](https://github.com/dequelabs/axe-core/issues/2010)) ([5359b3f](https://github.com/dequelabs/axe-core/commit/5359b3f06ac051963ee61fcef417bcc20bdec55b)) - **aria-allowed-attr:** allow aria-details ([#1956](https://github.com/dequelabs/axe-core/issues/1956)) ([79e1c58](https://github.com/dequelabs/axe-core/commit/79e1c58cad4fdbd1409a0b545981c12f13252432)) - **aria-allowed-role:** allow role combobox on input tel, search, url, and email ([#1850](https://github.com/dequelabs/axe-core/issues/1850)) ([ba75961](https://github.com/dequelabs/axe-core/commit/ba759618ed8068f4eb74b6cd00f002322b20eca5)) - **aria-hidden-focus:** mark as needs review if a modal is open ([#1995](https://github.com/dequelabs/axe-core/issues/1995)) ([28a3553](https://github.com/dequelabs/axe-core/commit/28a35531b97b987e2fd1ad0beb25fbda3822fbd5)) - **aria-required-children:** allow comboboxes with more popup roles ([#1950](https://github.com/dequelabs/axe-core/issues/1950)) ([35a24c0](https://github.com/dequelabs/axe-core/commit/35a24c034520e3c6d95514e3b9d9f2ab6ca10e06)) - **aria-roles:** report error for fallback roles ([#1970](https://github.com/dequelabs/axe-core/issues/1970)) ([a1b7e08](https://github.com/dequelabs/axe-core/commit/a1b7e08f1f8e1c1caff228469cd891d0458680de)) - **aria-valid-attr-value:** mark as needs review for aria-current with invalid value ([#1998](https://github.com/dequelabs/axe-core/issues/1998)) ([39b8eae](https://github.com/dequelabs/axe-core/commit/39b8eae9d3352be4f77bef41abcb8eab268a6809)) - **axe.d.ts:** RunOnly.values should not accept a RunOnlyOption ([#1888](https://github.com/dequelabs/axe-core/issues/1888)) ([b68aa19](https://github.com/dequelabs/axe-core/commit/b68aa19500ffb57fdf370707d7614384ac239ad6)) - **build:** add lang query parameter to helpUrl when builing with a locale ([#1909](https://github.com/dequelabs/axe-core/issues/1909)) ([8c5f9ef](https://github.com/dequelabs/axe-core/commit/8c5f9efd6449f82e410eb7c6a68cfb5304fc66ae)) - **color-contrast:** improve speed and accuracy of code blocks with syntax highlighting ([#2003](https://github.com/dequelabs/axe-core/issues/2003)) ([1b6ab42](https://github.com/dequelabs/axe-core/commit/1b6ab42f72b1ea0d2ed223c6fd63b9b1e54cfa9b)) - **color-contrast:** mark as needs review for text that contains only non-BMP characters ([#2005](https://github.com/dequelabs/axe-core/issues/2005)) ([e559be0](https://github.com/dequelabs/axe-core/commit/e559be041e90951c734de4e7ad70d7299f590cf6)) - **color-contrast:** support IE extension context ([#2008](https://github.com/dequelabs/axe-core/issues/2008)) ([62e31ea](https://github.com/dequelabs/axe-core/commit/62e31ea5034871f572f8bb47dba2596fb1b13063)) - **color-contrast:** take into account parent opacity for foreground color ([#1902](https://github.com/dequelabs/axe-core/issues/1902)) ([8719700](https://github.com/dequelabs/axe-core/commit/87197005d046cc8c845764ff9107683938864c65)) - **getElementStack:** do not add hidden elements to the stack ([#1991](https://github.com/dequelabs/axe-core/issues/1991)) ([759d88d](https://github.com/dequelabs/axe-core/commit/759d88d08af059755d908794038770cc57448252)) - **is-focusable:** use tabindex attribute instead of property ([#1912](https://github.com/dequelabs/axe-core/issues/1912)) ([042a148](https://github.com/dequelabs/axe-core/commit/042a1487df76489483330274933d06fd27b842e0)) - **is-icon-ligature:** ignore whitespace characters ([#1908](https://github.com/dequelabs/axe-core/issues/1908)) ([7d2b2a6](https://github.com/dequelabs/axe-core/commit/7d2b2a6fca992e27bab36ed8ab64b7ba3385d7e5)) - **is-ligature-icon:** rename canvas to canvasContext ([#1880](https://github.com/dequelabs/axe-core/issues/1880)) ([de9885d](https://github.com/dequelabs/axe-core/commit/de9885d5708d6928fa2eb2816351879307a31a5b)) - **isFocusable:** return true for summary element and false for details element with summary child ([#1957](https://github.com/dequelabs/axe-core/issues/1957)) ([34ec2d7](https://github.com/dequelabs/axe-core/commit/34ec2d7326786347f8704786e886fc8d13dd3f9b)) - **listitem:** clarify that li elements must be contained in a list or role=list ([#1894](https://github.com/dequelabs/axe-core/issues/1894)) ([6d8cfee](https://github.com/dequelabs/axe-core/commit/6d8cfee91f0f0b5dcacba7ffb0b3d6505862e6b7)) - **locales:** fix incompeteMessageFallback to be a string rather than an object ([#1853](https://github.com/dequelabs/axe-core/issues/1853)) ([88677a9](https://github.com/dequelabs/axe-core/commit/88677a93d0ffe32d7305984314a37e623fb51153)) - **meta-viewport:** mark as a best-practice rule instead of wcag failure ([#1960](https://github.com/dequelabs/axe-core/issues/1960)) ([766f962](https://github.com/dequelabs/axe-core/commit/766f96210d05d35cab0139839db4f009b1139ce1)) - **only-listitem:** add message about invalid role on li elements ([#1954](https://github.com/dequelabs/axe-core/issues/1954)) ([c3049ab](https://github.com/dequelabs/axe-core/commit/c3049abaccff72412ec3d58fab9b386fe8a2ae5a)) - **page-has-main:** do not find hidden elements ([#2001](https://github.com/dequelabs/axe-core/issues/2001)) ([6429e60](https://github.com/dequelabs/axe-core/commit/6429e608f082db76b4cc445679b61a6e0ab8f034)) - **page-no-duplicate-main:** do not fail for duplicate hidden elements ([#2000](https://github.com/dequelabs/axe-core/issues/2000)) ([414dfb1](https://github.com/dequelabs/axe-core/commit/414dfb1c9a4ade645ce60e8918e8143fe58b3eb6)) - **preload:** reject promise `axe.utils.preload` when XHR fails ([#2009](https://github.com/dequelabs/axe-core/issues/2009)) ([b406b1f](https://github.com/dequelabs/axe-core/commit/b406b1fd09d72f9193d5b4011fa6f24bd33e3576)) - **region:** allow content in roles with implicit aria-live ([#2002](https://github.com/dequelabs/axe-core/issues/2002)) ([a8d829e](https://github.com/dequelabs/axe-core/commit/a8d829e081dabb62a5247e8956adbf7a2ef000a2)) - **region:** return outermost regionless node instead of html ([#1980](https://github.com/dequelabs/axe-core/issues/1980)) ([8d77be2](https://github.com/dequelabs/axe-core/commit/8d77be206e11537e8b509d593707c98143181bfa)) - **region-rule:** allow live regions with explicit roles ([#1999](https://github.com/dequelabs/axe-core/issues/1999)) ([b49bd95](https://github.com/dequelabs/axe-core/commit/b49bd9547b7d8ac392ebf958356f90aca7e48a38)) - **run:** throw error if axe.run is called after a run has started but not completed ([#1914](https://github.com/dequelabs/axe-core/issues/1914)) ([3252a02](https://github.com/dequelabs/axe-core/commit/3252a020ffd372e9583d39c989affd3d3b22957b)) - **server-side-image-map:** return as needs review rather than failure ([#1898](https://github.com/dequelabs/axe-core/issues/1898)) ([d544856](https://github.com/dequelabs/axe-core/commit/d5448567b23de8289443c9c314b34b3140f68c30)) - **tabindex:** don't error when tabindex property is overridden ([#1910](https://github.com/dequelabs/axe-core/issues/1910)) ([6b82a4c](https://github.com/dequelabs/axe-core/commit/6b82a4c513a1d5be78dcc54ad90a90768613b918)) - **td-has-headers:** greatly improve performance of td-has-headers rule ([#1887](https://github.com/dequelabs/axe-core/issues/1887)) ([a550309](https://github.com/dequelabs/axe-core/commit/a550309255b025cb1e63710af2142f2c02d79657)) - removes flaky test in axe Pro api check ([b2bdcd1](https://github.com/dequelabs/axe-core/commit/b2bdcd13e7623d3111f7035f2e951ff6b330132c)) - **typings:** add proper return value to getRule ([#1900](https://github.com/dequelabs/axe-core/issues/1900)) ([4d907f8](https://github.com/dequelabs/axe-core/commit/4d907f86b0152122f92cceae0b242e09aff0f49a)) - **unicode:** stop parsing escaped unicode strings ([#1997](https://github.com/dequelabs/axe-core/issues/1997)) ([7447d03](https://github.com/dequelabs/axe-core/commit/7447d03bcfd118897d8114fded1ea8a42f3da08f)) ## [3.4.2](https://github.com/dequelabs/axe-core/compare/v3.4.1...v3.4.2) (2020-02-04) ### Bug Fixes - **color-contrast:** support IE extension context ([#2008](https://github.com/dequelabs/axe-core/issues/2008)) ([cd651a0](https://github.com/dequelabs/axe-core/commit/cd651a0713fa2f4b307cc7fc2be033f8636b40d2)) - **unicode:** stop parsing escaped unicode strings ([#1997](https://github.com/dequelabs/axe-core/issues/1997)) ([523a31c](https://github.com/dequelabs/axe-core/commit/523a31c19fefd330e0b4f4c45f51d400c6f66164)) ### [3.4.1](https://github.com/dequelabs/axe-core/compare/v3.4.0...v3.4.1) (2019-12-11) ### Bug Fixes - ignores axe.ping responses that do not contain axe=true ([7d8aa42](https://github.com/dequelabs/axe-core/commit/7d8aa42)) - input[role=button][value='correct'] should pass ([#1897](https://github.com/dequelabs/axe-core/issues/1897)) ([3aba02c](https://github.com/dequelabs/axe-core/commit/3aba02c)) - remove heading from list of widget roles ([#1882](https://github.com/dequelabs/axe-core/issues/1882)) ([beb458f](https://github.com/dequelabs/axe-core/commit/beb458f)) - **listitem:** clarify that li elements must be contained in a list or role=list ([#1894](https://github.com/dequelabs/axe-core/issues/1894)) ([8fa0964](https://github.com/dequelabs/axe-core/commit/8fa0964)) - removes flaky test in axe Pro api check ([f2b3b54](https://github.com/dequelabs/axe-core/commit/f2b3b54)) - **aria-allowed-role:** allow role combobox on input tel, search, url, and email ([#1850](https://github.com/dequelabs/axe-core/issues/1850)) ([75d3c8b](https://github.com/dequelabs/axe-core/commit/75d3c8b)) - **axe.d.ts:** RunOnly.values should not accept a RunOnlyOption ([#1888](https://github.com/dequelabs/axe-core/issues/1888)) ([94b1466](https://github.com/dequelabs/axe-core/commit/94b1466)) - **build:** add lang query parameter to helpUrl when builing with a locale ([#1909](https://github.com/dequelabs/axe-core/issues/1909)) ([a2f0247](https://github.com/dequelabs/axe-core/commit/a2f0247)) - **color-contrast:** take into account parent opacity for foreground color ([#1902](https://github.com/dequelabs/axe-core/issues/1902)) ([639c41b](https://github.com/dequelabs/axe-core/commit/639c41b)) - **is-focusable:** use tabindex attribute instead of property ([#1912](https://github.com/dequelabs/axe-core/issues/1912)) ([aa5314d](https://github.com/dequelabs/axe-core/commit/aa5314d)) - **is-icon-ligature:** ignore whitespace characters ([#1908](https://github.com/dequelabs/axe-core/issues/1908)) ([77fc838](https://github.com/dequelabs/axe-core/commit/77fc838)) - **is-ligature-icon:** rename canvas to canvasContext ([#1880](https://github.com/dequelabs/axe-core/issues/1880)) ([604ba4f](https://github.com/dequelabs/axe-core/commit/604ba4f)) - **link-name:** test role=link when there is no href ([#1921](https://github.com/dequelabs/axe-core/issues/1921)) ([e839c57](https://github.com/dequelabs/axe-core/commit/e839c57)) - **locales:** fix incompeteMessageFallback to be a string rather than an object ([#1853](https://github.com/dequelabs/axe-core/issues/1853)) ([02a1d8a](https://github.com/dequelabs/axe-core/commit/02a1d8a)) - **run:** throw error if axe.run is called after a run has started but not completed ([#1914](https://github.com/dequelabs/axe-core/issues/1914)) ([290d125](https://github.com/dequelabs/axe-core/commit/290d125)) - **server-side-image-map:** return as needs review rather than failure ([#1898](https://github.com/dequelabs/axe-core/issues/1898)) ([ce73af9](https://github.com/dequelabs/axe-core/commit/ce73af9)) - **tabindex:** don't error when tabindex property is overridden ([#1910](https://github.com/dequelabs/axe-core/issues/1910)) ([e6875ee](https://github.com/dequelabs/axe-core/commit/e6875ee)) - **td-has-headers:** greatly improve performance of td-has-headers rule ([#1887](https://github.com/dequelabs/axe-core/issues/1887)) ([a588cad](https://github.com/dequelabs/axe-core/commit/a588cad)) - **typings:** add proper return value to getRule ([#1900](https://github.com/dequelabs/axe-core/issues/1900)) ([0d7c3d2](https://github.com/dequelabs/axe-core/commit/0d7c3d2)) ## [3.4.0](https://github.com/dequelabs/axe-core/compare/v3.3.2...v3.4.0) (2019-10-18) ### Bug Fixes - **aria-allowed-attr:** allow 'aria-readonly' on listbox ([#1825](https://github.com/dequelabs/axe-core/issues/1825)) ([15f5d2d](https://github.com/dequelabs/axe-core/commit/15f5d2d)) - **aria-form-field-name-matches:** don't test combobox elements when they have a child input ([#1742](https://github.com/dequelabs/axe-core/issues/1742)) ([f0be6dc](https://github.com/dequelabs/axe-core/commit/f0be6dc)) - **aria-required-children:** allow combobox to own a searchbox ([#1708](https://github.com/dequelabs/axe-core/issues/1708)) ([42158ac](https://github.com/dequelabs/axe-core/commit/42158ac)) - **aria-required-children:** allow reviewEmpty nodes to have empty children ([#1791](https://github.com/dequelabs/axe-core/issues/1791)) ([a5d727c](https://github.com/dequelabs/axe-core/commit/a5d727c)) - **aria-valid-attr-value:** fix incomplete translation message ([#1739](https://github.com/dequelabs/axe-core/issues/1739)) ([a0f3eef](https://github.com/dequelabs/axe-core/commit/a0f3eef)) - **color-contrast:** ignore nodes that don't contain text ([#1837](https://github.com/dequelabs/axe-core/issues/1837)) ([223a4bc](https://github.com/dequelabs/axe-core/commit/223a4bc)) - **color-contrast-matches:** don't check aria-disabled explicit label element ([#1741](https://github.com/dequelabs/axe-core/issues/1741)) ([5bb566f](https://github.com/dequelabs/axe-core/commit/5bb566f)) - **configure:** use translations for failure summaries ([#1808](https://github.com/dequelabs/axe-core/issues/1808)) ([5e53d7b](https://github.com/dequelabs/axe-core/commit/5e53d7b)) - **flatten-tree:** do not call deprecated getDistributedNodes ([#1729](https://github.com/dequelabs/axe-core/issues/1729)) ([46a5d11](https://github.com/dequelabs/axe-core/commit/46a5d11)) - **form-field-multiple-label:** incomplete rather than fail for multiple labels ([#1798](https://github.com/dequelabs/axe-core/issues/1798)) ([0bdaa2b](https://github.com/dequelabs/axe-core/commit/0bdaa2b)) - **get-background-color:** scroll element into view horizontally ([#1845](https://github.com/dequelabs/axe-core/issues/1845)) ([50df70a](https://github.com/dequelabs/axe-core/commit/50df70a)) - **get-selector:** don't throw error for disconnected fragment ([#1802](https://github.com/dequelabs/axe-core/issues/1802)) ([bb6591b](https://github.com/dequelabs/axe-core/commit/bb6591b)) - **label-content-name-mismatch:** ignore ligature fonts ([#1829](https://github.com/dequelabs/axe-core/issues/1829)) ([683e005](https://github.com/dequelabs/axe-core/commit/683e005)) - allows all roles on img tag with no alt attribute ([929085a](https://github.com/dequelabs/axe-core/commit/929085a)) - replace incorrect tag for meta-refresh rule ([#1844](https://github.com/dequelabs/axe-core/issues/1844)) ([754d56b](https://github.com/dequelabs/axe-core/commit/754d56b)) - update tags to wcag21aa for rule avoid-inline-spacing ([#1757](https://github.com/dequelabs/axe-core/issues/1757)) ([973d48f](https://github.com/dequelabs/axe-core/commit/973d48f)) - **label-content-name-mismatch:** ignore private space unicode ([#1822](https://github.com/dequelabs/axe-core/issues/1822)) ([b634c34](https://github.com/dequelabs/axe-core/commit/b634c34)) - **scrollable-region-focus:** ignore scrollable regions without content ([#1788](https://github.com/dequelabs/axe-core/issues/1788)) ([b36754e](https://github.com/dequelabs/axe-core/commit/b36754e)) - **utils:** Fix error in IE when getting scroll state on page with SVG elements. Closes [#525](https://github.com/dequelabs/axe-core/issues/525) ([#1820](https://github.com/dequelabs/axe-core/issues/1820)) ([9a32f6f](https://github.com/dequelabs/axe-core/commit/9a32f6f)) ### Features - **audit:** add lang query paramenter to help urls ([#1794](https://github.com/dequelabs/axe-core/issues/1794)) ([2d1c8a6](https://github.com/dequelabs/axe-core/commit/2d1c8a6)) - **configure:** accept ver property as axeVersion fallback ([#1812](https://github.com/dequelabs/axe-core/issues/1812)) ([4ebcde8](https://github.com/dequelabs/axe-core/commit/4ebcde8)) - **configure:** add axeVersion property that checks compatibility of axe.version ([#1793](https://github.com/dequelabs/axe-core/issues/1793)) ([18fb8c8](https://github.com/dequelabs/axe-core/commit/18fb8c8)) - **fieldset, group-labelledby:** deprecate fieldset and group-labelledby checks ([#1740](https://github.com/dequelabs/axe-core/issues/1740)) ([ec9b762](https://github.com/dequelabs/axe-core/commit/ec9b762)) - **i18n:** add spanish translation ([#1758](https://github.com/dequelabs/axe-core/issues/1758)) ([e9f821d](https://github.com/dequelabs/axe-core/commit/e9f821d)), closes [#1757](https://github.com/dequelabs/axe-core/issues/1757) - Add axe.utils.assert method ([2f10d24](https://github.com/dequelabs/axe-core/commit/2f10d24)) - **is-visible:** add support for clip-path techniques ([#1706](https://github.com/dequelabs/axe-core/issues/1706)) ([8ab262a](https://github.com/dequelabs/axe-core/commit/8ab262a)) - **radiogroup, checkboxgroup:** deprecate radiogroup and checkboxgroup rules ([#1640](https://github.com/dequelabs/axe-core/issues/1640)) ([6d30880](https://github.com/dequelabs/axe-core/commit/6d30880)) - Add SerialVirtualNode class ([82d01b0](https://github.com/dequelabs/axe-core/commit/82d01b0)) - pt_BR localization ([#1756](https://github.com/dequelabs/axe-core/issues/1756)) ([330e2ec](https://github.com/dequelabs/axe-core/commit/330e2ec)) - **rule:** aria-roledescription ([#1745](https://github.com/dequelabs/axe-core/issues/1745)) ([16682fd](https://github.com/dequelabs/axe-core/commit/16682fd)) - **runVirtualNode:** Allow serialised nodes [experimental](<[512d51b](https://github.com/dequelabs/axe-core/commit/512d51b)>) - **video-description:** deprecate video-description rule ([#1737](https://github.com/dequelabs/axe-core/issues/1737)) ([e91c25f](https://github.com/dequelabs/axe-core/commit/e91c25f)) ## [3.3.3](https://github.com/dequelabs/axe-core/compare/v3.3.2...v3.3.3) (2020-02-04) ### Bug Fixes - **color-contrast:** support IE extension context ([#2008](https://github.com/dequelabs/axe-core/issues/2008)) ([cd651a0](https://github.com/dequelabs/axe-core/commit/cd651a0713fa2f4b307cc7fc2be033f8636b40d2)) - **unicode:** stop parsing escaped unicode strings ([#1997](https://github.com/dequelabs/axe-core/issues/1997)) ([523a31c](https://github.com/dequelabs/axe-core/commit/523a31c19fefd330e0b4f4c45f51d400c6f66164)) ### [3.3.2](https://github.com/dequelabs/axe-core/compare/v3.3.1...v3.3.2) (2019-08-12) ### Bug Fixes - **aria-form-field-name-matches:** don't test combobox elements when they have a child input ([#1742](https://github.com/dequelabs/axe-core/issues/1742)) ([5ac278f](https://github.com/dequelabs/axe-core/commit/5ac278f)) - **aria-valid-attr-value:** fix incomplete translation message ([#1739](https://github.com/dequelabs/axe-core/issues/1739)) ([6909604](https://github.com/dequelabs/axe-core/commit/6909604)) - **flatten-tree:** do not call deprecated getDistributedNodes ([#1729](https://github.com/dequelabs/axe-core/issues/1729)) ([48ddf9d](https://github.com/dequelabs/axe-core/commit/48ddf9d)) - update tags to wcag21aa for rule avoid-inline-spacing ([#1757](https://github.com/dequelabs/axe-core/issues/1757)) ([f534a6b](https://github.com/dequelabs/axe-core/commit/f534a6b)) ## [3.3.1](https://github.com/dequelabs/axe-core/compare/v3.3.0...v3.3.1) (2019-07-23) ### Bug Fixes - **accessible-text-virtual:** sanitize attributes on start node ([#1694](https://github.com/dequelabs/axe-core/issues/1694)) ([c0bb08c](https://github.com/dequelabs/axe-core/commit/c0bb08c)) - **axe.d.ts:** add optional xpath property to NodeResult ([#1642](https://github.com/dequelabs/axe-core/issues/1642)) ([287ef9c](https://github.com/dequelabs/axe-core/commit/287ef9c)) - **get-background-color:** No longer calculate color from non-opaque overlapping element ([#1644](https://github.com/dequelabs/axe-core/issues/1644)) ([d45f81e](https://github.com/dequelabs/axe-core/commit/d45f81e)) - **get-background-color:** No longer calculate color from non-opaque overlapping elm ([f1c2310](https://github.com/dequelabs/axe-core/commit/f1c2310)) - **get-background-color:** process tbody, thead, and tfoot when getting background color ([#1653](https://github.com/dequelabs/axe-core/issues/1653)) ([e114bfd](https://github.com/dequelabs/axe-core/commit/e114bfd)) - enable running axe-core in strict CSPs ([#1707](https://github.com/dequelabs/axe-core/issues/1707)) ([cc5bd59](https://github.com/dequelabs/axe-core/commit/cc5bd59)) - **image-redundant-alt:** check for parent before calculating text ([#1705](https://github.com/dequelabs/axe-core/issues/1705)) ([1adbd02](https://github.com/dequelabs/axe-core/commit/1adbd02)) - **th-has-data-cells:** empty cells will now pass ([#1659](https://github.com/dequelabs/axe-core/issues/1659)) ([c7489ab](https://github.com/dequelabs/axe-core/commit/c7489ab)) - **types:** add new properties to RunOptions ([#1697](https://github.com/dequelabs/axe-core/issues/1697)) ([02aa36c](https://github.com/dequelabs/axe-core/commit/02aa36c)), closes [#1696](https://github.com/dequelabs/axe-core/issues/1696) - **valid-attr-value:** allow aria-describedby to return needs review ([#1671](https://github.com/dequelabs/axe-core/issues/1671)) ([2390925](https://github.com/dequelabs/axe-core/commit/2390925)) - **color-contrast:** add px unit to error messages ([#1634](https://github.com/dequelabs/axe-core/issues/1634)) ([1712e46](https://github.com/dequelabs/axe-core/commit/1712e46)) ### Tests - **examples:** do not fail tests if deque.com has violations ([#1686](https://github.com/dequelabs/axe-core/issues/1686)) ([2118360](https://github.com/dequelabs/axe-core/commit/2118360)) - ensure locale files are valid ([#1673](https://github.com/dequelabs/axe-core/issues/1673)) ([588f9b5](https://github.com/dequelabs/axe-core/commit/588f9b5)) - require new release rule help docs to be active before creating release ([#1700](https://github.com/dequelabs/axe-core/issues/1700)) ([e9f9c18](https://github.com/dequelabs/axe-core/commit/e9f9c18)) ## [3.3.0](https://github.com/dequelabs/axe-core/compare/v3.2.2...v3.3.0) (2019-07-08) ### Bug Fixes - add SC 131 to rule aria hidden focus ([#1474](https://github.com/dequelabs/axe-core/issues/1474)) ([8da9a0d](https://github.com/dequelabs/axe-core/commit/8da9a0d)) - Add treegrid as allowed parent to rowgroup ([#1435](https://github.com/dequelabs/axe-core/issues/1435)) ([94e9893](https://github.com/dequelabs/axe-core/commit/94e9893)), closes [#1386](https://github.com/dequelabs/axe-core/issues/1386) - arguments for gather function in build template ([#1605](https://github.com/dequelabs/axe-core/issues/1605)) ([753ecf4](https://github.com/dequelabs/axe-core/commit/753ecf4)) - check if property exists in cache of flattenedTree ([#1536](https://github.com/dequelabs/axe-core/issues/1536)) ([51c2e19](https://github.com/dequelabs/axe-core/commit/51c2e19)) - **aria-valid-attr-value:** allow aria-owns to pass when element is not in the DOM ([#1526](https://github.com/dequelabs/axe-core/issues/1526)) ([f835ed8](https://github.com/dequelabs/axe-core/commit/f835ed8)) - deprecate na reporter ([#1625](https://github.com/dequelabs/axe-core/issues/1625)) ([3e807f0](https://github.com/dequelabs/axe-core/commit/3e807f0)) - Exclude iframe for html-has-lang rule (Issue 1424) ([#1430](https://github.com/dequelabs/axe-core/issues/1430)) ([98b5ed2](https://github.com/dequelabs/axe-core/commit/98b5ed2)) - Include body as part of background color checks when element does not intersect ([#1520](https://github.com/dequelabs/axe-core/issues/1520)) ([55820cf](https://github.com/dequelabs/axe-core/commit/55820cf)) - make nullable impact properties have nullable types to match API docs ([#1477](https://github.com/dequelabs/axe-core/issues/1477)) ([efaed91](https://github.com/dequelabs/axe-core/commit/efaed91)) - Only load Promise polyfill if window.Promise is missing [[#1468](https://github.com/dequelabs/axe-core/issues/1468)](<[#1470](https://github.com/dequelabs/axe-core/issues/1470)>) ([1d70306](https://github.com/dequelabs/axe-core/commit/1d70306)) - Prevent error when using ` const values = value.map(v => `"${v}"`).join(' | '); return `\`<${element.nodeName} ${prop}=${values}>\``; }); }); notes.push('Supported on elements: ' + supportedElements.join(', ')); return notes; } } ); }; ================================================ FILE: build/tasks/configure.js ================================================ /*eslint-env node */ 'use strict'; const buildRules = require('../configure'); const format = require('../shared/format'); module.exports = function (grunt) { grunt.registerMultiTask( 'configure', 'Task for configuring rules and checks', function () { const done = this.async(); const options = this.options({ rules: ['lib/rules/**/*.json'], checks: ['lib/checks/**/*.json'], misc: ['lib/misc/**/*.json'], blacklist: ['metadata'], tags: '' }); this.files.forEach(function (file) { // locale will always be the 2nd to last part of the // filename and in the format of "..js" const parts = file.dest.auto.split('.'); if (parts.length > 2) { options.locale = parts[parts.length - 2]; } buildRules(grunt, options, null, function (result) { grunt.file.write(file.dest.auto, 'axe._load(' + result.auto + ');'); // Format the content so Prettier doesn't create a diff after running. // See https://github.com/dequelabs/axe-core/issues/1310. format(result.descriptions, file.dest.descriptions) .then(descriptionsContent => { grunt.file.write(file.dest.descriptions, descriptionsContent); done(); }) .catch(err => { console.error(err.message); done(false); }); }); }); } ); }; ================================================ FILE: build/tasks/esbuild.js ================================================ const { build } = require('esbuild'); const path = require('path'); module.exports = function (grunt) { grunt.registerMultiTask( 'esbuild', 'Task to run the esbuild javascript bundler', function () { const done = this.async(); const files = grunt.task.current.data.files; files.forEach(file => { const src = Array.isArray(file.src) ? file.src : [file.src]; const dest = file.dest; src.forEach(entry => { const name = path.basename(entry); if (file.cwd) { entry = path.join(file.cwd, entry); } build({ entryPoints: [entry], outfile: path.join(dest, name), minify: false, bundle: true }) .then(done) .catch(e => { grunt.fail.fatal(e); done(); }); }); }); } ); }; ================================================ FILE: build/tasks/langs.js ================================================ /*eslint-env node */ 'use strict'; var http = require('http'); module.exports = function (grunt) { function getLine(data, start) { var len = data.length; var index = start; while (index < len) { if (data.charAt(index) === '\n') { break; } index += 1; } var retVal = data.substring(start, index + 1); return retVal; } function getEntry(data, start) { var entry = []; var line; var len = data.length; var index = start; while (index < len) { line = getLine(data, index); if (line.indexOf('%') === 0) { index += line.length; // end of entry break; } index += line.length; line = line.substring(0, line.length - 1); entry.push(line); } entry.used = index - start; return entry; } function generateOutput(langs, checkPath) { var path = checkPath + '.js'; var template = [ '/* global axe */\n', '/*eslint quotes: 0*/\n', 'var langs = ' + JSON.stringify(langs, null, '\t') + ';\n\n', '/**\n', ' * Returns array of valid language codes\n', ' * @method validLangs\n', ' * @memberof axe.utils\n', ' * @instance\n', ' * @return {Array} Valid language codes\n', ' */\n', 'axe.utils.validLangs = function () {\n', "\t'use strict';\n", '\treturn langs;\n', '};\n' ].join(''); grunt.file.write(path, template); } grunt.registerMultiTask( 'langs', 'Task for generating commons language codes from IANA registry', function () { var done = this.async(); var ianaLangsURL = 'http://www.iana.org/assignments/language-subtag-registry/language-subtag-registry'; if (!this.data.check) { done(false); return; } var check = this.data.check; var langs = []; new Promise(function (resolve, reject) { var data = ''; http .get(ianaLangsURL, function (res) { res .on('data', function (chunk) { data += chunk; }) .on('end', function () { resolve(data); }); }) .on('error', function (e) { grunt.log.error('Got error: ' + e.message); reject(false); }); }) .then(function (data) { var entry = getEntry(data, 0); var pos = entry.used; while (true) { entry = getEntry(data, pos); pos += entry.used; if (!entry.used) { break; } if (entry[0] !== 'Type: language') { continue; } var lang = entry[1].replace('Subtag: ', '').trim(); langs.push(lang); } generateOutput(langs, check); }) .then(function () { done(); }) .catch(function (result) { done(result); }); } ); }; ================================================ FILE: build/tasks/metadata-function-map.js ================================================ const path = require('path').posix; const glob = require('glob'); const fs = require('fs'); function toTitleCase(str) { return str.replace(/-\w/g, txt => { return txt.charAt(1).toUpperCase() + txt.substr(2).toLowerCase(); }); } module.exports = function (grunt) { grunt.registerMultiTask( 'metadata-function-map', 'Task to generate the metadata-function-map file', function () { const files = grunt.task.current.data.files; files.forEach(file => { const src = Array.isArray(file.src) ? file.src : [file.src]; const map = {}; let outFile = '// This file is automatically generated using build/tasks/metadata-function-map.js\n'; src.forEach(globPath => { glob.sync(globPath, { posix: true }).forEach(filePath => { const relativePath = path.relative( path.dirname(file.dest), filePath ); const filename = path.basename(filePath, '.js'); const functionName = toTitleCase(filename); outFile += `import ${functionName} from '${relativePath}';\n`; map[filename] = functionName; }); }); outFile += `\nconst metadataFunctionMap = {\n`; outFile += Object.keys(map) .sort() .map(key => ` '${key}': ${map[key]}`) .join(',\n'); outFile += `\n};\n\nexport default metadataFunctionMap;`; fs.writeFileSync(file.dest, outFile, 'utf-8'); }); } ); }; ================================================ FILE: build/tasks/notify.js ================================================ const { notify } = require('node-notifier'); /*eslint-env node */ ('use strict'); module.exports = function (grunt) { grunt.registerMultiTask( 'notify', 'This task sends an OS notification when a task has completed', function () { notify(this.data); } ); }; ================================================ FILE: build/tasks/test.js ================================================ const execSync = require('child_process').execSync; const chalk = require('chalk'); /*eslint-env node */ ('use strict'); module.exports = function (grunt) { grunt.registerMultiTask( 'test', 'This task runs unit tests based on which file was changed', function () { const testFile = this.data.testFile; console.log(`${chalk.green('>>')} File "${testFile}"`); execSync(`npm run test:unit -- testFiles=${testFile}`, { stdio: 'inherit' }); } ); }; ================================================ FILE: build/tasks/update-help.js ================================================ /*eslint-env node */ 'use strict'; module.exports = function (grunt) { grunt.registerMultiTask( 'update-help', 'Task for updating Deque University helpUrls based on rule JSON files', function () { var options = this.options({ version: '1.0.0' }); var v = options.version.split('.'); v.pop(); var baseUrl = 'https://dequeuniversity.com/rules/axe/' + v.join('.') + '/'; this.files.forEach(function (f) { f.src.forEach(function (filepath) { var config = grunt.file.readJSON(filepath); config.metadata.helpUrl = baseUrl + config.id; grunt.file.write(filepath, JSON.stringify(config, null, ' ')); }); }); } ); }; ================================================ FILE: build/tasks/validate.js ================================================ /*eslint-env node */ 'use strict'; var revalidator = require('revalidator').validate, fs = require('fs'), path = require('path'); function fileExists(v, o) { if (!v.endsWith('.js')) { return true; } var file = path.resolve(path.dirname(o._path), v); var exists; try { exists = fs.existsSync(file); } catch { return false; } return exists; } function hasUniqueId() { var seen = {}; return function (v, o) { if (!seen[v]) { seen[v] = o; return true; } return false; }; } function hasMultipleOutcomes(messages) { const keys = Object.keys(messages); if (keys.length < 2) { return false; } return keys.every(key => { switch (key) { case 'pass': case 'fail': case 'incomplete': return ['string', 'object'].includes(typeof messages[key]); default: return false; } }); } function createSchemas() { var schemas = {}; schemas.tool = { properties: { id: { required: true, type: 'string', conform: hasUniqueId() }, options: { type: 'object' }, source: { type: 'string', required: true, conform: fileExists, messages: { conform: 'File does not exist' } } } }; schemas.check = { properties: { id: { required: true, type: 'string', conform: hasUniqueId() }, excludeHidden: { type: 'boolean' }, evaluate: { type: 'string', required: true, conform: fileExists, messages: { conform: 'File does not exist' } }, matches: { type: 'string', required: false, conform: fileExists, messages: { conform: 'File does not exist' } }, metadata: { type: 'object', required: true, properties: { messages: { required: true, type: 'object', conform: hasMultipleOutcomes, messages: { conform: 'Must have at least two valid messages' } }, // @deprecated: Use impact on rules instead impact: { type: 'string', enum: ['minor', 'moderate', 'serious', 'critical'] } } } } }; schemas.rule = { seen: {}, properties: { id: { required: true, type: 'string', conform: hasUniqueId() }, selector: { type: 'string' }, impact: { required: true, type: 'string', enum: ['minor', 'moderate', 'serious', 'critical'] }, excludeHidden: { type: 'boolean' }, enabled: { type: 'boolean' }, pageLevel: { type: 'boolean' }, any: { type: 'array', items: { type: ['string', 'object'], conform: function (v) { if (typeof v === 'string') { return true; } if (typeof v === 'object' && typeof v.id === 'string') { return true; } return false; }, message: 'must be a string or an object with a key of id' } }, all: { type: 'array', items: { type: ['string', 'object'], conform: function (v) { if (typeof v === 'string') { return true; } if (typeof v === 'object' && typeof v.id === 'string') { return true; } return false; }, message: 'must be a string or an object with a key of id' } }, none: { type: 'array', items: { type: ['string', 'object'], conform: function (v) { if (typeof v === 'string') { return true; } if (typeof v === 'object' && typeof v.id === 'string') { return true; } return false; }, message: 'must be a string or an object with a key of id' } }, tags: { type: 'array', items: { type: 'string' } }, actIds: { type: 'array', items: { type: 'string' } }, matches: { type: 'string', required: false, conform: fileExists, messages: { conform: 'File does not exist' } }, metadata: { type: 'object', required: true, additionalProperties: false, properties: { help: { required: true, type: 'string' }, description: { required: true, type: 'string' } } } } }; return schemas; } function validateFiles(grunt, files, schema, type) { var valid = true; files.forEach(function (f) { f.src.forEach(function (pathArg) { var file = grunt.file.readJSON(pathArg); file._path = pathArg; var result = revalidator(file, schema); if (!result.valid) { result.errors.forEach(function (err) { grunt.log.error(pathArg, err.property + ' ' + err.message); }); valid = false; } const ruleIssues = type === 'rule' ? validateRule(file) : []; if (ruleIssues.length > 0) { ruleIssues.forEach(issue => grunt.log.error(pathArg, issue)); valid = false; } if (valid) { grunt.verbose.ok(); } }); }); return valid; } module.exports = function (grunt) { grunt.registerMultiTask( 'validate', 'Task for validating API schema for checks and rules', function () { const { type } = this.options(); const schemas = createSchemas(); const schema = schemas[type]; if (!schema) { grunt.log.error( 'Please specify a valid type to validate: ' + Object.keys(schemas) ); return false; } const valid = validateFiles(grunt, this.files, schema, type); schema.seen = {}; return valid; } ); }; function validateRule({ tags, metadata }) { if (!Array.isArray(tags) || typeof metadata !== 'object') { return []; } const issues = []; const prohibitedWord = tags.includes('best-practice') ? 'must' : 'should'; const { description, help } = metadata; if (description.toLowerCase().includes(prohibitedWord)) { issues.push( `metadata.description can not contain the word '${prohibitedWord}'.` ); } if (help.toLowerCase().includes(prohibitedWord)) { issues.push(`metadata.help can not contain the word '${prohibitedWord}'.`); } issues.push(...findTagIssues(tags)); return issues; } const miscTags = ['ACT', 'experimental', 'review-item', 'deprecated']; const categories = [ 'aria', 'color', 'forms', 'keyboard', 'language', 'name-role-value', 'parsing', 'semantics', 'sensory-and-visual-cues', 'structure', 'tables', 'text-alternatives', 'time-and-media' ]; const standardsTags = [ { // Has to be first, as others rely on the WCAG level getting picked up first name: 'WCAG', standardRegex: /^wcag2(1|2)?a{1,3}(-obsolete)?$/, criterionRegex: /^wcag\d{3,4}$/ }, { name: 'Section 508', standardRegex: /^section508$/, criterionRegex: /^section508\.\d{1,2}\.[a-z]$/, wcagLevelRegex: /^wcag2aa?$/ }, { name: 'Trusted Tester', standardRegex: /^TTv5$/, criterionRegex: /^TT\d{1,3}\.[a-z]$/, wcagLevelRegex: /^wcag2aa?$/ }, { name: 'EN 301 549', standardRegex: /^EN-301-549$/, criterionRegex: /^EN-9\.[1-4]\.[1-9]\.\d{1,2}$/, wcagLevelRegex: /^wcag21?aa?$/ }, { name: 'RGAA', standardRegex: /^RGAAv4$/, criterionRegex: /^RGAA-\d{1,2}\.\d{1,2}\.\d{1,2}$/, wcagLevelRegex: /^wcag21?aa?$/ } ]; function findTagIssues(tags) { const issues = []; const catTags = tags.filter(tag => tag.startsWith('cat.')); const bestPracticeTags = tags.filter(tag => tag === 'best-practice'); // Category if (catTags.length !== 1) { issues.push(`Must have exactly one cat. tag, got ${catTags.length}`); } if (catTags.length && !categories.includes(catTags[0].slice(4))) { issues.push(`Invalid category tag: ${catTags[0]}`); } if (!startsWith(tags, catTags)) { issues.push(`Tag ${catTags[0]} must be before ${tags[0]}`); } tags = removeTags(tags, catTags); // Best practice if (bestPracticeTags.length > 1) { issues.push( `Only one best-practice tag is allowed, got ${bestPracticeTags.length}` ); } if (!startsWith(tags, bestPracticeTags)) { issues.push(`Tag ${bestPracticeTags[0]} must be before ${tags[0]}`); } tags = removeTags(tags, bestPracticeTags); const standards = {}; // WCAG, Section 508, Trusted Tester, EN 301 549 for (const { name, standardRegex, criterionRegex, wcagLevelRegex } of standardsTags) { const standardTags = tags.filter(tag => tag.match(standardRegex)); const criterionTags = tags.filter(tag => tag.match(criterionRegex)); if (!standardTags.length && !criterionTags.length) { continue; } standards[name] = { name, standardTag: standardTags[0] ?? null, criterionTags }; if (name !== 'RGAA' && bestPracticeTags.length !== 0) { issues.push(`${name} tags cannot be used along side best-practice tag`); } if (standardTags.length === 0) { issues.push(`Expected one ${name} tag, got 0`); } else if (standardTags.length > 1) { issues.push(`Expected one ${name} tag, got: ${standardTags.join(', ')}`); } if (criterionTags.length === 0) { issues.push(`Expected at least one ${name} criterion tag, got 0`); } if (wcagLevelRegex && standards.WCAG) { const wcagLevel = standards.WCAG.standardTag; if (!wcagLevel.match(wcagLevelRegex)) { issues.push(`${name} rules not allowed on ${wcagLevel}`); } } // Must have the same criteria listed if (name === 'EN 301 549') { const wcagCriteria = standards.WCAG.criterionTags.map(tag => tag.slice(4) ); const enCriteria = criterionTags.map(tag => tag.slice(5).replaceAll('.', '') ); if ( wcagCriteria.length !== enCriteria.length || !startsWith(wcagCriteria, enCriteria) ) { issues.push( `Expect WCAG and EN criteria numbers to match: ${wcagCriteria.join( ', ' )} vs ${enCriteria.join(', ')}}` ); } } tags = removeTags(tags, [...standardTags, ...criterionTags]); } // Other tags const usedMiscTags = miscTags.filter(tag => tags.includes(tag)); const unknownTags = removeTags(tags, usedMiscTags); if (unknownTags.length) { issues.push(`Invalid tags: ${unknownTags.join(', ')}`); } // At this point only misc tags are left: tags = removeTags(tags, unknownTags); if (!startsWith(tags, usedMiscTags)) { issues.push( `Tags [${tags.join(', ')}] should be sorted like [${usedMiscTags.join( ', ' )}]` ); } return issues; } function startsWith(arr1, arr2) { return arr2.every((item, i) => item === arr1[i]); } function removeTags(tags, tagsToRemove) { return tags.filter(tag => !tagsToRemove.includes(tag)); } ================================================ FILE: build/templates.js ================================================ module.exports = { evaluate: 'function (node, options, virtualNode, context) {\n<%=source%>\n}', after: 'function (results, options) {\n<%=source%>\n}', gather: 'function (context, options) {\n<%=source%>\n}', matches: 'function (node, virtualNode, context) {\n<%=source%>\n}', source: '(function () {\n<%=source%>\n}())', commons: '<%=source%>' }; ================================================ FILE: code-of-conduct.md ================================================ ## Introduction Deque is committed to providing a safe, inclusive, and welcoming virtual environment for contributors. We created this policy not because we anticipate bad behavior, but because we believe that articulating our values and obligations to one another reinforces a level of respect among contributors and because having a code of conduct provides us with clear avenues to correct our virtual culture should it ever stray from that course. ## Code of Conduct Policy We expect all contributors to Deque open-source projects to uphold the principles of this Code of Conduct. We do not tolerate disruptive or disrespectful behavior, messages, images, or interactions by any participant, in any form. We will not tolerate harassment or discrimination based on age, ancestry, color, gender identity or expression, national origin, physical or mental disability, religion, sexual orientation, or any other characteristic. ## Enforcement and Reporting Contributors asked to stop any harassing behavior are expected to comply immediately; regardless, Deque reserves the right to remove or block anyone from any repository at the discretion of Deque employees. If you have any concerns, please contact a code-owner or other Deque employee via direct message on the [axe Community Slack](https://accessibility.deque.com/axe-community) with details about the nature of the concern. ================================================ FILE: doc/API.md ================================================ # Axe JavaScript Accessibility API ## Table of Contents 1. [Section 1: Introduction](#section-1-introduction) 1. [Get Started](#getting-started) 1. [Section 2: API Reference](#section-2-api-reference) 1. [Overview](#overview) 1. [API Notes](#api-notes) 1. [API Name: axe.getRules](#api-name-axegetrules) 1. [API Name: axe.configure](#api-name-axeconfigure) 1. [API Name: axe.reset](#api-name-axereset) 1. [API Name: axe.run](#api-name-axerun) 1. [Parameters axe.run](#parameters-axerun) 1. [Context Parameter](#context-parameter) 2. [Options Parameter](#options-parameter) 3. [Callback Parameter](#callback-parameter) 1. [Return Promise](#return-promise) 1. [Error result](#error-result) 1. [Results Object](#results-object) 1. [API Name: axe.registerPlugin](#api-name-axeregisterplugin) 1. [API Name: axe.cleanup](#api-name-axecleanup) 1. [API Name: axe.setup](#api-name-axesetup) 1. [API Name: axe.teardown](#api-name-axeteardown) 1. [API Name: axe.frameMessenger](#api-name-axeframemessenger) 1. [API name: axe.runPartial / axe.finishRun](#api-name-axerunpartial--axefinishrun) 1. [Virtual DOM Utilities](#virtual-dom-utilities) 1. [API Name: axe.utils.querySelectorAll](#api-name-axeutilsqueryselectorall) 1. [API Name: axe.utils.getRule](#api-name-axeutilsgetrule) 1. [Common Functions](#common-functions) 1. [Section 3: Example Reference](#section-3-example-reference) 1. [Section 4: Performance](#section-4-performance) ## Section 1: Introduction The axe API is designed to be an improvement over the previous generation of accessibility APIs. It provides the following benefits: - Runs in any modern browser - Designed to work with existing testing infrastructure - Runs locally, no connection to a third-party server is necessary - Performs violation checking on multiple levels of nested iframes - Provides list of rules and elements that passed accessibility checking, ensuring rules have been run against entire document - Only checks rendered content to minimize false positives (that includes visually-hidden content) ### Getting Started This section gives a quick description of how to use the axe APIs to analyze web page content and return a JSON object that lists any accessibility violations found. The axe API can be used as part of a broader process that is performed on many, if not all, pages of a website. The API is used to analyze web page content and return a JSON object that lists any accessibility violations found. Here is how to get started: 1. Load page in testing system 2. Optionally, set configuration options for the JavaScript API (`axe.configure`) 3. Call analyze JavaScript API (`axe.run`) 4. Either assert against results or save them for later processing 5. Repeat for any inactive or non-rendered content after making it visible ## Section 2: API Reference ### Overview The axe APIs are provided in the JavaScript file axe.js. It must be included in the web page under test, as well as each `iframe` under test. Parameters are sent as JavaScript function parameters. Results are returned in JSON format. ### Full API Reference for Developers For a full listing of API offered by axe, clone the repository and run `npm run api-docs`. This generates `jsdoc` documentation under `doc/api` which can be viewed using the browser. ### API Notes - A Rule test is made up of sub-tests. Each sub-test is returned in an array of 'checks' - The `"helpUrl"` in the results object is a link to a broader description of the accessibility issue and suggested remediation. These links point to Deque University help pages, which do not require a login. - Axe does not test hidden regions, such as inactive menus or modal windows. To test those for accessibility, write tests that activate or render the regions visible and run the analysis again. ### Axe-core Tags Each rule in axe-core has a number of tags. These provide metadata about the rule. Each rule has one tag that indicates which WCAG version / level it belongs to, or if it doesn't, it has the `best-practice` tag. If the rule is required by WCAG, there is a tag that references the success criterion number. For example, the `wcag111` tag means a rule is required for WCAG 2 success criterion 1.1.1. The `experimental`, `ACT`, `TT`, and `section508` tags are only added to some rules. Each rule with a `section508` tag also has a tag to indicate what requirement in old Section 508 the rule is required by. For example `section508.22.a`. | Tag Name | Accessibility Standard / Purpose | | ----------------- | ----------------------------------------------------------------------------------------------------------------------------- | | `wcag2a` | WCAG 2.0 Level A | | `wcag2aa` | WCAG 2.0 Level AA | | `wcag2aaa` | WCAG 2.0 Level AAA | | `wcag21a` | WCAG 2.1 Level A | | `wcag21aa` | WCAG 2.1 Level AA | | `wcag22aa` | WCAG 2.2 Level AA | | `best-practice` | Common accessibility best practices | | `wcag2a-obsolete` | WCAG 2.0 Level A, no longer required for conformance | | `wcag***` | WCAG success criterion e.g. wcag111 maps to SC 1.1.1 | | `ACT` | W3C approved Accessibility Conformance Testing rules | | `section508` | Old Section 508 rules | | `section508.*.*` | Requirement in old Section 508 | | `TTv5` | Trusted Tester v5 rules | | `TT*.*` | Test ID in Trusted Tester | | `EN-301-549` | Rule required under [EN 301 549](https://www.etsi.org/deliver/etsi_en/301500_301599/301549/03.02.01_60/en_301549v030201p.pdf) | | `EN-9.*` | Section in EN 301 549 listing the requirement | | `RGAAv4` | Rule required under [RGAA](https://accessibilite.numerique.gouv.fr/methode/criteres-et-tests/) | | `RGAA-*.*.*` | Section in RGAA listing the requirement | | `experimental` | Cutting-edge rules, disabled by default | | `cat.*` | Category mappings used by Deque (see below) | All rules have a `cat.*` tag, which indicates what type of content it is part of. The following `cat.*` tags exist in axe-core: | Category name | | ----------------------------- | | `cat.aria` | | `cat.color` | | `cat.forms` | | `cat.keyboard` | | `cat.language` | | `cat.name-role-value` | | `cat.parsing` | | `cat.semantics` | | `cat.sensory-and-visual-cues` | | `cat.structure` | | `cat.tables` | | `cat.text-alternatives` | | `cat.time-and-media` | ### API Name: axe.getRules #### Purpose To get information on all the rules in the system. #### Description Returns a list of all rules with their ID and description #### Synopsis `axe.getRules([Tag Name 1, Tag Name 2...]);` #### Parameters - `tags` - **optional** Array of tags used to filter returned rules. If omitted, it will return all rules. See [axe-core tags](#axe-core-tags). **Returns:** Array of rules that match the input filter with each entry having a format of `{ruleId: , description: , helpUrl: , help: , tags: }` #### Example 1 In this example, we pass in the WCAG 2 A and AA tags into `axe.getRules` to retrieve only those rules. The function call returns an array of rules. **Call:** `axe.getRules(['wcag2aa', 'wcag2a']);` **Returned Data:** ```js [ { description: "Ensure elements of image maps have alternate text", help: "Active elements must have alternate text", helpUrl: "https://dequeuniversity.com/rules/axe/3.5/area-alt?application=axeAPI", ruleId: "area-alt", tags: [ "cat.text-alternatives", "wcag2a", "wcag111", "wcag244", "wcag412", "section508", "section508.22.a" ], actIds: ['c487ae'] }, { description: "Ensure ARIA attributes are allowed for an element's role", help: "Elements must only use allowed ARIA attributes", helpUrl: "https://dequeuniversity.com/rules/axe/3.5/aria-allowed-attr?application=axeAPI", ruleId: "aria-allowed-attr", tags: [ "cat.aria", "wcag2a", "wcag412" ] } … ] ``` ### API Name: axe.configure #### Purpose To configure the format of the data used by axe. This can be used to add new rules, which must be registered with the library to execute. **Important**: `axe.configure()` does not communicate configuration calls into iframes. Instead `axe.configure()` must be called with the same argument in each `frame` / `iframe` individually. #### Description User specifies the format of the JSON structure passed to the callback of `axe.run` #### Synopsis ```js axe.configure({ branding: String, reporter: 'option' | Function, checks: [Object], rules: [Object], standards: Object, locale: Object, axeVersion: String, disableOtherRules: Boolean, noHtml: Boolean }); ``` #### Parameters - `configurationOptions` - Options object; where the valid name, value pairs are: - `branding` - mixed(optional) Used to set the branding of the helpUrls - `brand` - string(optional) sets the brand string - default "axe" - `application` - string(optional) sets the application string - default "axeAPI" - `reporter` - Used to set the output format that the axe.run function will pass to the callback function. Can pass a reporter name or a custom reporter function. Valid names are: - `v1` to use the previous version's format: `axe.configure({ reporter: "v1" });` - `v2` to use the current version's format: `axe.configure({ reporter: "v2" });` - `raw` to return the raw result data without formatting: `axe.configure({ reporter: "raw" });` - `raw-env` to return the raw result data with environment data: `axe.configure({ reporter: "raw-env" });` - `no-passes` to return only violation results: `axe.configure({ reporter: "no-passes" });` - `checks` - Used to add checks to the list of checks used by rules, or to override the properties of existing checks - The checks attribute is an array of check objects - Each check object can contain the following attributes - `id` - string(required). This uniquely identifies the check. If the check already exists, this will result in any supplied check properties being overridden. The properties below that are marked required if new are optional when the check is being overridden. - `evaluate` - string(required for new). The ID of the function that implements the check's functionality. See the [`metadata-function-map`](../lib/core/base/metadata-function-map.js) file for all defined IDs. - `after` - string(optional). The ID of the function that gets called for checks that operate on a page-level basis, to process the results from the iframes. - `options` - mixed(optional). This is the options structure that is passed to the evaluate function and is intended to be used to configure checks. It is the most common property that is intended to be overridden for existing checks. - `enabled` - boolean(optional, default `true`). This is used to indicate whether the check is on or off by default. Checks that are off are not evaluated, even when included in a rule. Overriding this is a common way to disable a particular check across multiple rules. - `rules` - Used to add rules to the existing set of rules, or to override the properties of existing rules - The rules attribute is an Array of rule objects - each rule object can contain the following attributes - `id` - string(required). This uniquely identifies the rule. If the rule already exists, it will be overridden with any of the attributes supplied. The attributes below that are marked required, are only required for new rules. - `impact` - string(required). Sets the impact of that rule's results - `reviewOnFail` - boolean(option, default `false`). Override the result of a rule to return "Needs Review" rather than "Violation" if the rule fails. - `selector` - string(optional, default `*`). A [CSS selector](./developer-guide.md#supported-css-selectors) used to identify the elements that are passed into the rule for evaluation. - `excludeHidden` - boolean(optional, default `true`). This indicates whether elements that are hidden from all users are to be passed into the rule for evaluation. - `enabled` - boolean(optional, default `true`). Whether the rule is turned on. This is a common attribute for overriding. - `pageLevel` - boolean(optional, default `false`). When set to true, this rule is only applied when the entire page is tested. Results from nodes on different frames are combined into a single result. See [page level rules](#page-level-rules). - `any` - array(optional, default `[]`). This is a list of checks that, if none "pass", will generate a violation. - `all` - array(optional, default `[]`). This is a list of checks that, if any "fails", will generate a violation. - `none` - array(optional, default `[]`). This is a list of checks that, if any "pass", will generate a violation. - `tags` - array(optional, default `[]`). A list if the tags that "classify" the rule. See [axe-core tags](#axe-core-tags). - `matches` - string(optional). The ID of the filtering function that will exclude elements that match the `selector` property. See the [`metadata-function-map`](../lib/core/base/metadata-function-map.js) file for all defined IDs. - `standards` - object(optional). Used to configure the standards object. See the [Standards Object docs](./standards-object.md) for the structure of each standards object. - `disableOtherRules` - Disables all rules not included in the `rules` property. - `locale` - A locale object to apply (at runtime) to all rules and checks, in the same shape as `/locales/*.json`. - `axeVersion` - Set the compatible version of a custom rule with the current axe version. Compatible versions are all patch and minor updates that are the same as, or newer than those of the `axeVersion` property. - `noHtml` - Disables the HTML output of nodes from rules. - `allowedOrigins` - Set which origins (URL domains) will communicate test data with. See [allowedOrigins](#allowedorigins). **Returns:** Nothing **Note**: The `branding` property accepts a `string`, which sets the application. Passing it an object is deprecated as of axe-core 4.4.0, as is the `branding.brand` property. ##### Page level rules Page level rules split their evaluation into two phases. A 'data collection' phase which is done inside the 'evaluate' function and an assessment phase which is done inside the 'after' function. The evaluate function executes inside each individual frame and is responsible for collection data that is passed into the after function which inspects that data and makes a decision. Page level rules raise violations on the entire document and not on individual nodes or frames from which the data was collected. For an example of how this works, see the heading order check: - [lib/checks/navigation/heading-order.json](https://github.com/dequelabs/axe-core/blob/master/lib/checks/navigation/heading-order.json) - [lib/checks/navigation/heading-order-evaluate.js](https://github.com/dequelabs/axe-core/blob/master/lib/checks/navigation/heading-order-evaluate.js) - [lib/checks/navigation/heading-order-after.js](https://github.com/dequelabs/axe-core/blob/master/lib/checks/navigation/heading-order-after.js) ##### allowedOrigins Axe-core will only communicate results to frames of the same origin (the URL domain). To configure axe so that it exchanges results across different origins, you can configure allowedOrigins. This configuration must happen in **every frame**. For example: ```js axe.configure({ allowedOrigins: ['', 'https://deque.com'] }); ``` The `allowedOrigins` option has two wildcard options. `` always corresponds to the current domain. If you want to block all frame communication, set `allowedOrigins` to `[]`. To configure axe-core to communicate to all origins, use ``. **This is not recommended**. Because this is the only way to test iframes on `file://`, it is recommended to use a localhost server such as [http-server](https://www.npmjs.com/package/http-server) instead. Use of `allowedOrigins` is not necessary if an alternative [frameMessenger](#api-name-axeframemessenger) is used. ### API Name: axe.reset #### Purpose Reset the configuration to the default configuration. #### Description Override any previous calls to `axe.configure` and restore the configuration to the default configuration. Note: this will NOT unregister any new rules or checks that were registered but will reset the configuration back to the default configuration for everything else. #### Synopsis ```js axe.reset(); ``` #### Parameters None ### API Name: axe.run #### Purpose Analyze rendered content on the currently loaded page #### Description Runs a number of rules against the provided HTML page and returns the resulting issue list #### Synopsis ```js axe.run(context, options, (err, results) => { // ... }); ``` #### Parameters axe.run - [`context`](#context-parameter): (optional) Defines the scope of the analysis - the part of the DOM that you would like to analyze. This will typically be the `document` or a specific selector such as class name, ID, selector, etc. - [`options`](#options-parameter): (optional) Set of options that change how `axe.run` works, including what rules will run. To pass options to specific checks, use `axe.configure`. - [`callback`](#callback-parameter): (optional) The callback function which receives either null or an [error result](#error-result) as the first parameter, and the [results object](#results-object) when analysis is completed successfully, or undefined if it did not. ##### Context Parameter By default, `axe.run` will test the entire document. The context object is an optional parameter that can be used to specify which element should and which should not be tested. It can be passed one of the following: 1. An element reference that represents the portion of the document that must be analyzed - Example: To limit analysis to the `
` element: `document.getElementById("content")` 1. A NodeList such as returned by `document.querySelectorAll`. 1. A [CSS selector](./developer-guide.md#supported-css-selectors) that selects the portion(s) of the document that must be analyzed. 1. An object with `exclude` and/or `include` properties 1. An object with a `fromFrames` property 1. An object with a `fromShadowDom` property Read [context.md](context.md) for details about the context object. ###### Context Parameter Examples 1. Test the `#navBar` and all other `nav` elements and its content. ```js axe.run([`#navBar`, `nav`], (err, results) => { // ... }); ``` 2. Test everything except `.ad-banner` elements. ```js axe.run( { exclude: '.ad-banner' }, (err, results) => { // ... } ); ``` 3. Test the `form` element inside the `#payment` iframe. ```js axe.run( { fromFrames: ['iframe#payment', 'form'] }, (err, results) => { // ... } ); ``` 4. Exclude all `.commentBody` elements in each `.commentsShadowHost` shadow DOM tree. ```js axe.run( { exclude: { fromShadowDom: ['.commentsShadowHost', '.commentBody'] } }, (err, results) => { // ... } ); ``` More details on how to use the context object are described in [context.md](context.md). ##### Options Parameter The options parameter is flexible way to configure how `axe.run` operates. The different modes of operation are: - Run all rules corresponding to one of the accessibility standards - Run all rules defined in the system, except for the list of rules specified - Run a specific set of rules provided as a list of rule ids Additionally, there are a number or properties that allow configuration of different options: | Property | Default | Description | | ------------------ | :------ | :-------------------------------------------------------------------------------------------------------------------------------------- | | `runOnly` | n/a | Limit which rules are executed, based on names or tags | | `rules` | n/a | Enable or disable rules using the `enabled` property | | `reporter` | `v1` | Which reporter to use (see [Configuration](#api-name-axeconfigure)) | | `resultTypes` | n/a | Limit which result types are processed and aggregated | | `selectors` | `true` | Return CSS selector for elements, optimised for readability | | `ancestry` | `false` | Return CSS selector for elements, with all the element's ancestors | | `xpath` | `false` | Return xpath selectors for elements | | `absolutePaths` | `false` | Use absolute paths when creating element selectors | | `iframes` | `true` | Tell axe to run inside iframes | | `elementRef` | `false` | Return element references in addition to the target | | `frameWaitTime` | `60000` | How long (in milliseconds) axe waits for a response from embedded frames before timing out | | `preload` | `true` | Any additional assets (eg: cssom) to preload before running rules. [See here for configuration details](#preload-configuration-details) | | `performanceTimer` | `false` | Log rule performance metrics to the console | | `pingWaitTime` | `500` | Time before axe-core considers a frame unresponsive. [See frame messenger for details](frame-messenger.md) | ###### Options Parameter Examples 1. Run only Rules for an accessibility standard. See [axe-core tags](#axe-core-tags). To run only WCAG 2.0 Level A rules, specify `options` as: ```js axe.run( { runOnly: { type: 'tag', values: ['wcag2a'] } }, (err, results) => { // ... } ); ``` To run both WCAG 2.0 Level A and Level AA rules, you must specify both `wcag2a` and `wcag2aa`: ```js axe.run( { runOnly: { type: 'tag', values: ['wcag2a', 'wcag2aa'] } }, (err, results) => { // ... } ); ``` Alternatively, runOnly can be passed an array of tags: ```js axe.run( { runOnly: ['wcag2a', 'wcag2aa'] }, (err, results) => { // ... } ); ``` If you want to specify just one tag, you can pass in a string. ```js axe.run( { runOnly: 'wcag2a' }, (err, results) => { // ... } ); ``` 2. Run only a specified list of Rules If you only want to run certain rules, specify options as: ```js axe.run( { runOnly: { type: 'rule', values: ['ruleId1', 'ruleId2', 'ruleId3'] } }, (err, results) => { // ... } ); ``` This example will only run the rules with the id of `ruleId1`, `ruleId2`, and `ruleId3`. No other rule will run. Alternatively, runOnly can be passed an array of rules: ```js axe.run({ runOnly: ['ruleId1', 'ruleId2', 'ruleId3']; }, (err, results) => { // ... }) ``` If you want to specify just one rule, you can pass in a string. ```js axe.run( { runOnly: 'ruleId1' }, (err, results) => { // ... } ); ``` 3. Run all enabled Rules except for a list of rules The default operation for axe.run is to run all rules except for rules with the "experimental" tag. If certain rules should be disabled from being run, specify `options` as: ```js axe.run( { rules: { 'color-contrast': { enabled: false }, 'valid-lang': { enabled: false } } }, (err, results) => { // ... } ); ``` This example will disable the rules with the id of `color-contrast` and `valid-lang`. All other rules will run. The list of valid rule IDs is specified in the section below. 4. Run a modified set or rules using tags and rule enable By combining runOnly with type: tags and the rules option, a modified set can be defined. This lets you include rules with unspecified tags, and exclude rules that do have the specified tag(s). ```js axe.run( { runOnly: { type: 'tag', values: ['wcag2a'] }, rules: { 'color-contrast': { enabled: true }, 'valid-lang': { enabled: false } } }, (err, results) => { // ... } ); ``` This example includes all level A rules except for valid-lang, and in addition will include the level AA color-contrast rule. 6. Only process certain types of results The `resultTypes` option can be used to limit the number of nodes for a rule to a maximum of one. This can be useful for improving performance on very large or complicated pages when you are only interested in certain types of results. After axe has processed all rules normally, it generates a unique selector for all nodes in all rules. This process can be time consuming, especially for pages with lots of nodes. By limiting the nodes to a maximum of one for result types you are not interested in, you can greatly speed up the tail end performance of axe. Types listed in this option will cause rules that fall under those types to show all nodes. Types _not_ listed will cause rules that fall under one of the missing types to show a maximum of one node. This allows you to still see those results and inform the user of them if appropriate. ```js axe.run( { resultTypes: ['violations', 'incomplete', 'inapplicable'] }, (err, results) => { // ... } ); ``` This example will return all the nodes for all rules that fall under the "violations", "incomplete", and "inapplicable" result types. Since the "passes" type was not specified, it will return at most one node for each rule that passes. ###### Preload Configuration in Options Parameter The `preload` attribute (defaults to `true`) in options parameter, accepts a `boolean` or an `object` where an array of assets can be specified. 1. Specifying a `boolean` ```js axe.run( { preload: true }, (err, results) => { // ... } ); ``` 2. Specifying an `object` ```js axe.run( { preload: { assets: ['cssom'], timeout: 50000 } }, (err, results) => { // ... } ); ``` The `assets` attribute expects an array of preload(able) constraints to be fetched. The current set of values supported for `assets` is listed in the following table: | Asset Type | Description | | :--------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | `cssom` | This asset type preloads all CSS Stylesheets rulesets specified in the page. The stylesheets can be an external cross-domain resource, a relative stylesheet or an inline style with in the head tag of the document. If the stylesheet is an external cross-domain a network request is made. An object representing the CSS Rules from each stylesheet is made available to the checks evaluate function as `preloadedAssets` at run-time | | `media` | This asset type preloads metadata information of any HTMLMediaElement in the specified document | The `timeout` attribute in the object configuration is `optional` and has a fallback default value (10000ms). The `timeout` is essential for any network dependent assets that are preloaded, where-in if a given request takes longer than the specified/ default value, the operation is aborted. Preloading is not applicable to all rules. Even if the `preload` option is enabled, preloading steps may be skipped if no enabled rules require preloading. ##### Callback Parameter The callback parameter is a function that will be called when the asynchronous `axe.run` function completes. The callback function is passed two parameters. The first parameter will be an error thrown inside of axe if axe.run could not complete. If axe completed correctly the first parameter will be null, and the second parameter will be the results object. #### Return Promise If the callback was not defined, axe will return a Promise instead. Axe does not polyfill a Promise library however. So on systems without support for Promises this feature is not available. If you are unsure if the systems you will need axe on has Promise support we suggest you use the callback provided by axe.run instead. #### Error Result This will either be null or an object which is an instance of Error. If you are consistently receiving errors, please report this issue on the [Github issues list of Axe](https://github.com/dequelabs/axe-core/issues). #### Results Object The callback function passed in as the third parameter of `axe.run` runs on the results object. This object has four components – a `passes` array, a `violations` array, an `incomplete` array and an `inapplicable` array. The `passes` array keeps track of all the passed tests, along with detailed information on each one. This leads to more efficient testing, especially when used in conjunction with manual testing, as the user can easily find out what tests have already been passed. Similarly, the `violations` array keeps track of all the failed tests, along with detailed information on each one. The `incomplete` array (also referred to as the "review items") indicates which nodes could neither be determined to definitively pass or definitively fail. They are separated out in order that a user interface can display these to the user for manual review (hence the term "review items"). The `inapplicable` array lists all the rules for which no matching elements were found on the page. ###### `url` The URL of the page that was tested. ###### `timestamp` The date and time that analysis was completed. ###### `testEngine` The application and version that ran the audit. ###### `testEnvironment` Information about the current browser or node application that ran the audit. ###### result arrays The results of axe are grouped according to their outcome into the following arrays: - `passes`: These results indicate what elements passed the rules - `violations`: These results indicate what elements failed the rules - `inapplicable`: These results indicate which rules did not run because no matching content was found on the page. For example, with no video, those rules won't run. - `incomplete`: Also known as "needs review," these results were aborted and require further testing. This can happen either because of technical restrictions to what the rule can test, or because a JavaScript error occurred. Each object returned in these arrays have the following properties: - `description` - Text string that describes what the rule does - `help` - Help text that describes the test that was performed - `helpUrl` - URL that provides more information about the specifics of the violation. Links to a page on the Deque University site. - `id` - Unique identifier for the rule; [see the list of rules](rule-descriptions.md) - `impact` - How serious the violation is. Can be one of "minor", "moderate", "serious", or "critical" if the Rule failed or `null` if the check passed - `tags` - Array of tags that this rule is assigned. These tags can be used in the option structure to select which rules are run ([see `axe.run` parameters for more information](#parameters-axerun)). - `nodes` - Array of all elements the Rule tested - `html` - Snippet of HTML of the Element - `impact` - How serious the violation is. Can be one of "minor", "moderate", "serious", or "critical" if the test failed or `null` if the check passed - `target` - Array of either strings or Arrays of strings. If the item in the array is a string, then it is a CSS selector. If there are multiple items in the array each item corresponds to one level of iframe or frame. If there is one iframe or frame, there should be two entries in `target`. If there are three iframe levels, there should be four entries in `target`. If the item in the Array is an Array of strings, then it points to an element in a shadow DOM and each item (except the n-1th) in this array is a selector to a DOM element with a shadow DOM. The last element in the array points to the final shadow DOM node. - `any` - Array of checks that were made where at least one must have passed. Each entry in the array contains: - `id` - Unique identifier for this check. Check ids may be the same as Rule ids - `impact` - How serious this particular check is. Can be one of "minor", "moderate", "serious", or "critical". Each check that is part of a rule can have different impacts. The highest impact of all the checks that fail is reported for the rule - `message` - Description of why this check passed or failed - `data` - Additional information that is specific to the type of Check which is optional. For example, a color contrast check would include the foreground color, background color, contrast ratio, etc. - `relatedNodes` - Optional array of information about other nodes that are related to this check. For example, a duplicate id check violation would list the other selectors that had this same duplicate id. Each entry in the array contains the following information: - `target` - Array of selectors for the related node - `html` - HTML source of the related node - `all` - Array of checks that were made where all must have passed. Each entry in the array contains the same information as the 'any' array - `none` - Array of checks that were made where all must have not passed. Each entry in the array contains the same information as the 'any' array #### Example 2 In this example, we will pass the selector for the entire document, pass no options, which means all enabled rules will be run, and have a simple callback function that logs the entire results object to the console log: ```js axe.run(document, function (err, results) { if (err) throw err; console.log(results); }); ``` ###### `passes` - `passes[0]` ... - `help` - `"Elements must have sufficient color contrast"` - `helpUrl` - `"https://dequeuniversity.com/courses/html-css/visual-layout/color-contrast"` - `id` - `"color-contrast"` - `nodes` - `target[0]` - `"#js_off-canvas-wrap > .inner-wrap >.kinja-title.proxima.js_kinja-title-desktop"` - `passes[1]` ... ###### `violations` - `violations[0]` - `help` - `"