← aria-actions reference

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.

Source: Chromium aria_relationship_attributes.idl; runtime_enabled_features.json5

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)
nullClears the reflection and removes the aria-actions content attribute
Source: WPT idl-reflection.tentative.html

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.

Source: WPT idl-reflection.tentative.html ("null by default", "FrozenArray identity", "Unresolvable IDREFs reflect to an empty list" tests)

errors and edge cases

Unresolvable IDREFsA content attribute pointing at missing IDs reflects as [] (no exception)
Cross-shadow-tree targetsFiltered 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 elementsSpec-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)
Source: WPT idl-reflection.tentative.html; 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.

Source: aria_relationship_attributes.idl; runtime_enabled_features.json5 (flag comment); M151 launch intent

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 attributeThe 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 removalRemoving the aria-actions content attribute afterwards does not clear IDL-set elements — they survive
DisconnectionA target removed from the DOM is filtered out of the getter's result (new FrozenArray); reconnecting it restores it (another new instance)
Array identityThe getter returns the same FrozenArray across reads with no intervening change; reassignment or resolution changes yield a new instance
Source: WPT idl-reflection.tentative.html

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:

BrowserariaActionsElements support
Chrome151+ on Windows, macOS, Linux (enabled by default); absent on ChromeOS and Android/WebView
EdgeNot separately reported
Firefox146+ (feature shipped; UIA mappings 148+) — jcsteh, mozilla/standards-positions #1422
SafariPrototype 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.

Source: aria_relationship_attributes.idl (Measure, CEReactions); WPT cross-shadow filtering test

references