Skip to content

fix(standards): update aria-errormessage and aria-details to be idrefs - #5157

Merged
WilcoFiers merged 3 commits into
developfrom
standards-errormessage-details
Aug 5, 2026
Merged

fix(standards): update aria-errormessage and aria-details to be idrefs#5157
WilcoFiers merged 3 commits into
developfrom
standards-errormessage-details

Conversation

@straker

@straker straker commented Jun 10, 2026

Copy link
Copy Markdown
Contributor

This is in the current WAI-ARIA 1.3 draft and both attributes were changed to idrefs types. Since the AOM property is an idrefs type (returns an array) this allows us to be in sync with that for the Element Internals work.

The aria-errormessage check already accounts the attribute being an idrefs value and will incomplete if the value has more than one id, so no changes should be needed with this pr.

@straker
straker requested a review from a team as a code owner June 10, 2026 17:07

@chutchins25 chutchins25 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.

Nice — clean alignment with the ARIA 1.3 idrefs change, and the aria-errormessage analysis checks out: the aria-valid-attr-value check skips it via skipAttrs, and the dedicated aria-errormessage check handles the multi-id case independently of the standards type. One question inline about test coverage on the aria-details side.

Comment thread lib/standards/aria-attrs.js

@WilcoFiers WilcoFiers 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.

Agreed. I wouldn't mind seeing a test here. Also, can you test these actually work? I think we should still make this change if it doesn't, but we may want to consider opening an issue to add a check with a dedicated issue message for it if people use multiple IDs in aria-errormessage when it doesn't work.

@straker

straker commented Jun 17, 2026

Copy link
Copy Markdown
Contributor Author

add a check with a dedicated issue message for it if people use multiple IDs in aria-errormessage

We already have that. It was added in the pr I linked above.

As for adding a test for aria-details, we currently have no tests that test its value. Should we add one to something like aria-valid-attr-value?

@WilcoFiers

Copy link
Copy Markdown
Contributor

We already have that. It was added in the pr I linked above.

Didn't realize that. Fair enough!

As for adding a test for aria-details, we currently have no tests that test its value. Should we add one to something like aria-valid-attr-value?

Yes I think that'd be good.

@chutchins25 chutchins25 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.

Re-reviewed on c8c7a7e8. My earlier question is resolved — the new #pass194/195/196 cases cover the aria-details side, and they mirror the existing aria-controls/aria-describedby triples directly above them, so they slot into the established pattern.

I also traced every consumer of the standards type field to confirm the blast radius is what you describe: validateAttrValue (validate-attr-value.js:57) is the only place the change is observable, getAriaValue's idrefTypes already listed both, and getAccessibleRefs matches on /^idrefs?$/ — which means it was already tokenizing aria-details, so this removes a pre-existing internal inconsistency too. aria-errormessage stays in skipAttrs and its dedicated check hand-rolls tokenList + getResolvedRefs, so that half is inert today, as you said.

One thing worth surfacing for the next reviewer rather than a change request: after this change aria-errormessage="a b" fails with "Multiple IDs in aria-errormessage is not widely supported in assistive technologies", while aria-details="a b" now passes as long as one id resolves. If that asymmetry is deliberate — AT support genuinely differing between the two — no objection from me; just flagging that it's the half of @WilcoFiers' earlier question that isn't covered by the #4973 check.

@WilcoFiers
WilcoFiers merged commit fb94f8a into develop Aug 5, 2026
24 checks passed
@WilcoFiers
WilcoFiers deleted the standards-errormessage-details branch August 5, 2026 10:38
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.

3 participants