fix(standards): update aria-errormessage and aria-details to be idrefs - #5157
Conversation
chutchins25
left a comment
There was a problem hiding this comment.
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.
WilcoFiers
left a comment
There was a problem hiding this comment.
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.
We already have that. It was added in the pr I linked above. As for adding a test for |
Didn't realize that. Fair enough!
Yes I think that'd be good. |
chutchins25
left a comment
There was a problem hiding this comment.
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.
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 🤖 🎉
This is in the current WAI-ARIA 1.3 draft and both attributes were changed to
idrefstypes. 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-errormessagecheck 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.