v151 · idl member · element + elementinternals
ariaActionsElements
The IDL reflection of the aria-actions content attribute: a settable FrozenArray<Element>? on Element and ElementInternals that lets script assign action targets by element reference instead of by ID string, with explicit precedence, tree-scope, and lifecycle semantics.
syntax
Verbatim from Chromium's aria_relationship_attributes.idl (the AriaRelationshipAttributes mixin, included by Element and ElementInternals):
[
RuntimeEnabled=AOMAriaRelationshipProperties
] interface mixin AriaRelationshipAttributes {
[CEReactions, Measure, RuntimeEnabled=AriaActions]
attribute FrozenArray<Element>? ariaActionsElements;
// ... ariaActiveDescendantElement, ariaControlsElements, etc.
};
Element includes AriaRelationshipAttributes;
ElementInternals includes AriaRelationshipAttributes;
Both flags are stable in shipping Chrome: AOMAriaRelationshipProperties (the mixin) is status: "stable" and AriaActions (the member) is {"Win": "stable", "Mac": "stable", "Linux": "stable"} — see the runtime flag record.
inputs (setter)
The setter accepts an array of Element references, an empty array, or null (per the WPT IDL-reflection tests):
[elA, elB] | Assigns the targets in order; the getter exposes the same elements in the same order |
|---|---|
[] | Distinct from null: writes the empty string to the aria-actions content attribute as a presence flag (but note the spec's author MUST NOT for empty values on action-less elements — use null to fully unset) |
null | Clears the reflection and removes the aria-actions content attribute |
outputs (getter)
The getter returns null by default, otherwise a FrozenArray of the currently resolvable target Elements, in assignment order. Repeated reads return the same FrozenArray instance until reassignment or a DOM change that alters resolution (see lifecycle). Reading after setting the content attribute with resolvable IDREFs returns those elements; unresolvable IDREFs reflect as an empty list ([]), not null.
errors and edge cases
| Unresolvable IDREFs | A content attribute pointing at missing IDs reflects as [] (no exception) |
|---|---|
| Cross-shadow-tree targets | Filtered out: assigning an element from a shadow tree that is not an ancestor scope of the host reflects as []; same-shadow-tree targets reflect normally |
| Empty value on action-less elements | Spec-level author error: authors MUST NOT set aria-actions="" on elements that have no actions; user agents MUST NOT expose aria-actions when the author MUSTs are violated (ARIA PR #1805 preview) |
context and exposure
Exposed on Element in window contexts and on ElementInternals for custom elements (the mixin is included by both interfaces). Gated by RuntimeEnabled=AriaActions: enabled by default in Chrome 151 on Windows, macOS, and Linux; not implemented on ChromeOS or Android (the Android key is omitted from the flag record, which disables it on both Chrome for Android and Android WebView). The mixin itself is gated by AOMAriaRelationshipProperties, stable on all platforms. Feature-detect with 'ariaActionsElements' in Element.prototype before use.
ElementInternals and custom elements
On ElementInternals (obtained via this.attachInternals() inside a custom element), the member behaves identically — the WPT suite runs the full shared test set against both Element and ElementInternals reflectors. This is the path for component authors: a custom tab element can set this.internals_.ariaActionsElements = [closeButton] so the action relationship is part of the component's encapsulated accessibility semantics rather than light-DOM markup.
class ActionTab extends HTMLElement {
#internals = this.attachInternals();
connectedCallback() {
this.#internals.role = 'tab';
const close = this.querySelector('button[aria-label]');
if (close && 'ariaActionsElements' in this.#internals) {
this.#internals.ariaActionsElements = [close];
}
}
}
Source: WPT idl-reflection.tentative.html (shared tests run for both reflectors); aria_relationship_attributes.idl (ElementInternals includes)
lifecycle and state transitions
The reflection has precise, tested state semantics (all from the WPT suite):
| IDL over content attribute | The IDL setter takes precedence: setting ariaActionsElements replaces the content attribute's value with the empty-string presence flag, and the IDL-set elements win over any IDREFs previously in the attribute |
|---|---|
| Attribute removal | Removing the aria-actions content attribute afterwards does not clear IDL-set elements — they survive |
| Disconnection | A target removed from the DOM is filtered out of the getter's result (new FrozenArray); reconnecting it restores it (another new instance) |
| Array identity | The getter returns the same FrozenArray across reads with no intervening change; reassignment or resolution changes yield a new instance |
examples
const tab = document.querySelector('[role="tab"]');
const closeBtn = tab.querySelector('.close');
// Feature-detect: member is absent on ChromeOS/Android and older browsers.
if ('ariaActionsElements' in tab) {
tab.ariaActionsElements = [closeBtn];
} else {
// Fallback: ID-reference form of the content attribute.
closeBtn.id = closeBtn.id || 'close-tab-1';
tab.setAttribute('aria-actions', closeBtn.id);
}
// Read back the effective targets (order preserved, disconnected
// targets filtered out).
console.log(tab.ariaActionsElements); // FrozenArray [button.close]
// Unset entirely (removes the content attribute).
tab.ariaActionsElements = null;
A full light-DOM markup example (tab strip with per-tab close actions) is on the feature overview, and live demos are on the Chrome Platform Showcase.
compatibility
No BCD entry exists for ariaActionsElements (checked api/Element, api/ElementInternals, and api/_mixins/ARIAMixin paths, 2026-07-28); interim table from the linked primary sources:
| Browser | ariaActionsElements support |
|---|---|
| Chrome | 151+ on Windows, macOS, Linux (enabled by default); absent on ChromeOS and Android/WebView |
| Edge | Not separately reported |
| Firefox | 146+ (feature shipped; UIA mappings 148+) — jcsteh, mozilla/standards-positions #1422 |
| Safari | Prototype behind a flag — WebKit bug 306476; position thread |
security and privacy
The member is a discovery-only accessibility bridge: it exposes references between elements that already exist in the DOM to assistive technologies, with no new script-observable capability beyond reading back what was set (the Measure extended attribute in the IDL only records a use counter). Cross-shadow-tree filtering prevents a document from probing or binding actions into closed component internals it does not own. The content attribute and IDL carry no personally identifying information beyond the accessible names authors already publish; the author obligation that targets be keyboard-operable (ARIA PR #1805 preview) is an accessibility safety requirement, not a security control.
Measure, CEReactions); WPT cross-shadow filtering test