Skip to content

feat(aria-actions): add aria-actions to allowed ARIA attributes - #5200

Merged
chutchins25 merged 2 commits into
developfrom
chut/5199-aria-actions
Jul 17, 2026
Merged

feat(aria-actions): add aria-actions to allowed ARIA attributes#5200
chutchins25 merged 2 commits into
developfrom
chut/5199-aria-actions

Conversation

@chutchins25

@chutchins25 chutchins25 commented Jul 1, 2026

Copy link
Copy Markdown
Contributor

Summary

Adds aria-actions to axe-core's known ARIA attributes so it is recognized as valid, allowed, and prohibited on the roles the spec prohibits it on — and re-enables the APG tabs-actions example that had been disabled for lack of aria-actions support.

Per the spec draft, aria-actions:

  • Value type: ID reference list → idrefs
  • Global: yes (like aria-describedby)
  • Empty allowed: yes — the spec permits aria-actions="" (the deferred-DOM case) → allowEmpty: true
  • Prohibited roles: the name-prohibited roles the spec also prohibits it on (all axe prohibitedAttrs roles except none/presentation, which the spec still permits)
  • ElementInternals reflection: ariaActionsElements

Accessibility-supported rationale

Following the Impact on ARIA decision framework:

  1. Supported by all platforms? No — shipped in WebKit and Firefox; Chromium pending.
  2. Does its use negatively impact accessibility? No — unsupported browsers simply ignore the attribute (progressive enhancement), and the spec hard-guards exposure. → allow.

Note for reviewers: the ARIA spec change is still PR #1805, not yet merged — this aligns to the two engines shipping ahead of spec approval. We can patch the config later in the unlikely event the spec shifts.

Changes

Attribute recognitionlib/standards/aria-attrs.js: add the aria-actions entry (idrefs, global, allowEmpty).

Prohibited-on-rolelib/standards/aria-roles.js: add aria-actions to prohibitedAttrs for caption, code, deletion, emphasis, insertion, mark, paragraph, strong, subscript, superscript, suggestion. Per w3c/aria#1805 these roles prohibit it; none/presentation do not, so they are left unchanged.

APG test re-enable (Closes #4584) — bump aria-practices to latest main (the tabs-actions page did not exist at the previously pinned commit) and remove it from skippedPages. axe recognizes the attribute but not the authoring pattern, so aria-required-children (tabs-actions) and nested-interactive (listbox-actions) are disabled per-page pending #5215.

Review feedback — update the stale wai-aria-1.1 Source: comment to the unversioned WAI-ARIA URL; add an aria-actions="" pass case exercising allowEmpty.

Testing

  • get-global-aria-attrs, aria-prohibited-attr (check + virtual-rule), aria-valid-attr, aria-allowed-attr, aria-valid-attr-value unit + integration tests ✓
  • Full APG suite green (76 passing) ✓
  • npm run build clean; no auto-generated committed files change

Follow-ups

Closes #5199
Closes #4584

Register aria-actions as a global idrefs attribute (reflected via
ariaActionsElements) so aria-valid-attr and aria-allowed-attr don't
raise false positives on valid usage. Shipped in WebKit and Firefox;
Chromium pending.

Closes issue #5199

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Adds support for the emerging aria-actions attribute to axe-core’s ARIA standards data so it’s treated as a valid, global ARIA attribute and does not trigger aria-valid-attr / aria-allowed-attr false positives.

Changes:

  • Add aria-actions to the known ARIA attributes registry (type idrefs, global, allow-empty).
  • Update the global ARIA attributes unit test expectation to include aria-actions.
  • Extend aria-valid-attr and aria-allowed-attr integration fixtures to include passing aria-actions usage.

Reviewed changes

Copilot reviewed 5 out of 5 changed files in this pull request and generated 3 comments.

File Description
lib/standards/aria-attrs.js Registers aria-actions as a known global ARIA attribute with metadata (type/prop/allowEmpty).
test/commons/standards/get-global-aria-attrs.js Updates the asserted global attribute list to include aria-actions.
test/integration/rules/aria-allowed-attr/passes.html Adds aria-actions to passing fixtures across global-attr pass blocks.
test/integration/rules/aria-valid-attr/aria-valid-attr.{html,json} Adds a pass case for aria-actions so it’s recognized as valid.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread lib/standards/aria-attrs.js Outdated
Comment thread test/commons/standards/get-global-aria-attrs.js Outdated
Comment on lines +3 to +7
'aria-actions': {
type: 'idrefs',
prop: 'ariaActionsElements',
allowEmpty: true,
global: true

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done — added an aria-actions="" pass case (#pass193) to the aria-valid-attr-value integration fixture.

@straker

straker commented Jul 14, 2026

Copy link
Copy Markdown
Contributor

As part of this pr, we should look at reenabling the aria-practices tests we had to disable. See #4584

@WilcoFiers

Copy link
Copy Markdown
Contributor

This seems fine to me. I think we should just merge this instead of disabling an ARIA practice test.

…PG test

Prohibit aria-actions on the 11 name-prohibited roles per w3c/aria#1805, add
an allowEmpty pass case, and bump aria-practices to re-enable the tabs-actions
APG example. aria-required-children / nested-interactive don't yet support the
aria-actions pattern, so they're disabled per-page pending #5215.

Closes #4584
@chutchins25

Copy link
Copy Markdown
Contributor Author

@straker done in this PR. I bumped aria-practices to latest main (the tabs-actions page didn't exist at the previously pinned commit) and removed it from skippedPages.

One caveat worth flagging: recognizing the attribute doesn't make axe support the full authoring pattern. aria-required-children (tabs-actions) and nested-interactive (listbox-actions) still flag the action controls associated via aria-actions, so those two rules are disabled per-page in apg.spec.js for now. Real pattern support is tracked in #5215.

@chutchins25
chutchins25 marked this pull request as ready for review July 16, 2026 22:51
@chutchins25
chutchins25 requested a review from a team as a code owner July 16, 2026 22:51
@chutchins25 chutchins25 self-assigned this Jul 17, 2026
@chutchins25
chutchins25 merged commit 029655d into develop Jul 17, 2026
23 checks passed
@chutchins25
chutchins25 deleted the chut/5199-aria-actions branch July 17, 2026 13:50
WilcoFiers added a commit that referenced this pull request Aug 5, 2026
All notable changes to this project will be documented in this file. See
[commit-and-tag-version](https://github.com/absolute-version/commit-and-tag-version)
for commit guidelines.

##
[4.13.0](v4.12.1...v4.13.0)
(2026-08-05)

### Features

- **aria-actions:** add aria-actions to allowed ARIA attributes
([#5200](#5200))
([029655d](029655d)),
closes [#4584](#4584)
[#5199](#5199), references
[#5215](#5215)
[#5215](#5215)
- **aria-allowed-attr:** flag deprecated ARIA attributes as needs-review
([#5246](#5246))
([518f3cc](518f3cc)),
closes [#3341](#3341)
- **aria-prohibited-attr:** allow many elements to be named and disallow
label and body from being named
([#5259](#5259))
([d8b1ea5](d8b1ea5))
- **aria-roles:** add sectionheader and sectionfooter roles
([#5238](#5238))
([c36c109](c36c109)),
closes [#4734](#4734),
references [#4734](#4734)
- **aria/get-aria-value:** new function to get aria values of a node
([#5109](#5109))
([a7d8f3e](a7d8f3e)),
references [#5042](#5042)
- **aria/has-attr-value:** new function to check if node has aria value
([#5136](#5136))
([61f2624](61f2624)),
references [#5109](#5109)
- **aria:** support role=image as equivalent to role=img
([#5248](#5248))
([5aa8aaf](5aa8aaf)),
closes [#4656](#4656),
references [#5272](#5272)
- **checks/aria:** support ARIA element internals properties
([#5172](#5172))
([9b7f754](9b7f754))
- **checks/label:** support ARIA element internals properties
([#5170](#5170))
([21c5f8b](21c5f8b))
- **checks/navigation:** support ARIA element internals properties
([#5167](#5167))
([2c3a98f](2c3a98f))
- **commons/aria:** support ARIA element internals properties
([#5171](#5171))
([31f09e7](31f09e7))
- **commons/dom:** support ARIA element internals properties
([#5163](#5163))
([f0a12cf](f0a12cf))
- **commons/forms:** support ARIA element internals properties
([#5165](#5165))
([27a4686](27a4686))
- **commons/matches/fromPrimative:** deprecate in favor of correct
spelling ([#5270](#5270))
([31cfb2e](31cfb2e))
- **commons/text:** support ARIA element internals properties
([#5169](#5169))
([e841a33](e841a33))
- **commons/text:** support form-associated labels via element internals
([#5182](#5182))
([57cfe0a](57cfe0a)),
closes [#5045](#5045),
references [#5170](#5170)
[#5039](#5039)
[#5151](#5151)
[#5039](#5039)
- **dom/getResolvedRefs:** new function to get the resolved virtual
nodes of idrefs
([#5151](#5151))
([489cdea](489cdea)),
references [#5109](#5109)
- **element-internals:** enable ElementInternals by default
([#5284](#5284))
([2740d42](2740d42)),
closes [#5277](#5277)
- **i18n:** Add Swedish locale
([#5190](#5190))
([dcd13f2](dcd13f2)),
references [#5189](#5189)
- **matches:** add inSectioningContent, hasChild, and
isSummaryForDetails matches
([#5262](#5262))
([c47cdcd](c47cdcd))
- **rules:** support ARIA element internals properties
([#5168](#5168))
([065baf7](065baf7))
- **standards/ariaAttrs:** add caseInsensitive property for attributes
([#5224](#5224))
([bcd791c](bcd791c))

### Bug Fixes

- **aria-allowed-role:** allow roles on a non-details summary
([#5242](#5242))
([3bd9875](3bd9875)),
closes [#3911](#3911),
references [#3443](#3443)
[#3911](#3911)
- **aria-allowed-role:** restrict figure roles with child figcaption
([#5240](#5240))
([178a635](178a635)),
closes [#3443](#3443)
- **aria-prohibited-attr:** visible aria-labelledby requires review only
([#5285](#5285))
([fd6fa9f](fd6fa9f))
- **axe.d.ts:** make enabled property of RuleMetadata optional
([#5129](#5129))
([90fce18](90fce18))
- **color-contrast:** fix various stacking context bugs
([#5214](#5214))
([d5e5b04](d5e5b04)),
references [#8](#8)
[#5213](#5213)
- **gather-internals:** handle non-HTMLElement nodes
([#5161](#5161))
([06e84c3](06e84c3))
- **get-selector:** escape control characters in attribute selectors
([#5273](#5273))
([4b60ac5](4b60ac5)),
closes [#5204](#5204)
[#5204](#5204)
- **image-alt:** allow whitespace alt on presentational images
([#5218](#5218))
([c5dd0ef](c5dd0ef)),
closes [#5216](#5216)
- **landmark-unique:** exclude section/form with non-landmark roles from
landmark match
([#5085](#5085))
([c5fd013](c5fd013)),
closes [#4722](#4722)
[#5064](#5064)
- name the image role in role-img-alt and svg-img-alt metadata
([#5279](#5279))
([995a269](995a269)),
closes [#5272](#5272),
references [#5248](#5248)
[#5248](#5248)
- **standards:** update aria-errormessage and aria-details to be idrefs
([#5157](#5157))
([fb94f8a](fb94f8a))

This PR was opened by a robot 🤖 🎉
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

aria-actions support Reenable ARIA practices test for tabs-action

4 participants