Skip to content

feat(commons/dom): support ARIA element internals properties - #5163

Merged
straker merged 4 commits into
developfrom
elm-internals-commons-dom
Jun 15, 2026
Merged

feat(commons/dom): support ARIA element internals properties#5163
straker merged 4 commits into
developfrom
elm-internals-commons-dom

Conversation

@straker

@straker straker commented Jun 11, 2026

Copy link
Copy Markdown
Contributor

Updates the commons/dom directory to use the new getAriaValue or hasAriaValue functions where it makes sense. Also update any uses of node.getAttribute or node.hasAttribute where it made sense as well.

Here's a report of the full directory:

  • commons/dom/focus-disabled - hasAttr(disabled), disabled (not aria-disabled) is not an ARIA prop so remains hasAttr
  • commons/dom/get-element-by-reference - looks up non-aria attrs, should still use .attr, but do we need to split the logic to handle non-aria vs aria attributes differently?
  • commons/dom/tabbable-elements - looks at tabindex, should still use .attr
  • commons/dom/has-lang-text - looks at lang attr, should still use .attr
  • commons/dom/idrefs - superceded by get-resolved-refs so won't update uses
  • Commons/dom/inserted-into-focus-order - looks at tabindex, should still use .attr
  • commons/dom/is-current-page-link - looks at href, should still use .attr (or getAttribute in this case since it has to deal with html anchor only properties)
  • commons/dom/is-focusable - tabindex, use .attr
  • commons/dom/is-in-tab-order - tabindex, use .attr
  • commons/dom/is-inert - inert, use .hasAttr
  • commons/dom/is-natively-focusable - href, use .hasAttr
  • commons/dom/is-visibile (deprecated) - no conversion
  • commons/dom/url-props-from-attribute - needs node (ownerSVGElement prop), so no conversion from getAttribute
  • commons/dom/visibility-methods - only the aria-hidden use should move to getAriaValue, others are non-aria attrs

Refs: #5142
Refs: #5043

@straker
straker requested a review from a team as a code owner June 11, 2026 21:11
straker added a commit that referenced this pull request Jun 12, 2026
…nals (#5164)

Discovered as part of the [conversion of
commons/dom](#5163).
@chutchins25 had pointed out that the `null` only check would fail if
the value was ever `undefined`, but since all browsers supported `null`
on all ARIA prop values I didn't think it was necessary. Well turns out
that when we set the internals to an object for the external api code,
the values no longer return `null` when missing but `undefined`. So need
to add the `undefined` check for those cases.

Is `chore` as we don't need to announce this fix in the changelog as the
feature hasn't be released yet
Comment thread lib/commons/aria/get-aria-value.js Outdated
value = value.trim();
}
value = lowercase ? value.toLowerCase() : value;
} else if (value instanceof window.Node) {

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.

Looking at window.Node or window.NodeList throws an error when running tests in pure node environements (e.g. npm run test:virtual-rules). Swapped the logic around here and in get-resolved-refs so that the string case is first which is the only case virtual rules should hit.

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

Assuming you confirmed aria-hidden is case insensitive everywhere, LGTM.

@straker
straker merged commit f0a12cf into develop Jun 15, 2026
23 checks passed
@straker
straker deleted the elm-internals-commons-dom branch June 15, 2026 15:21
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.

2 participants