This document describes how user agents should expose semantics of web content languages to accessibility APIs. This helps users with disabilities to obtain and interact with information using assistive technologies. Documenting these mappings promotes interoperable exposure of roles, states, properties, and events implemented by accessibility APIs and helps to ensure that this information appears in a manner consistent with author intent.
This Core Accessibility API Mappings specification defines support that applies across multiple content technologies, including general keyboard navigation support and mapping of general-purpose roles, states, and properties provided in Web content via WAI-ARIA [[!WAI-ARIA]]. Other Accessibility API Mappings specifications depend on and extend this Core specification for specific technologies, including native techology features and WAI-ARIA extensions. This document updates and will eventually supercede the guidance in the WAI-ARIA 1.0 User Agent Implementation Guide [[!WAI-ARIA-IMPLEMENTATION]] W3C Recommendation. It is part of the WAI-ARIA suite described in the WAI-ARIA Overview.
This section is informative.
In traditional desktop graphical user interface (GUI) applications, components of the user interface (UI) are displayed when needed and hidden when not needed based on user interactions. Accessibility application programming interfaces (APIs) are used to communicate semantic information about the user interface to assistive technology software used by people with disabilities. These APIs constitute a contract between applications and assistive technologies, such as screen readers, magnifiers, alternate input devices, and speech command and control, to enable them to access the appropriate semantics needed to produce a usable alternative to interactive applications. For example, screen reading software for blind users can determine whether a particular UI component is a menu, button, text field, list box, etc.
In traditional static Web pages, the HTML elements provided the necessary semantic information. The user agent provides keyboard navigation but only to the HTML elements that are known to be interactive, specifically links and form elements. Assistive technologies obtain the semantic information from the Document Object Model (DOM) or, in the case of links and form elements, through the Accessibility API. In both cases, the assistive technology expects that nothing changes until a new page is loaded based on a user action.
Yet technologies such as JavaScript, Ajax, and CSS have enabled Web pages to look and behave more like interactive desktop GUI applications, without the need to reload the page with each user interaction. Developers can now re-purpose HTML elements into UI components not previously defined in HTML. For example, Javascript can be used with CSS to modify a <div>
element based on user interactions to make it look and behave like a popup menu. Unfortunately, the <div>
element does not provide the author with a vehicle to add semantic metadata that can be exposed through the DOM and mapped to Accessibility APIs. These accessibility deficiencies in traditional markup render rich Internet applications unusable by people who use assistive technologies or who rely on keyboard navigation.
The W3C Web Accessibility Initiative's (WAI) Protocols and Formats working group (PFWG) has addressed these deficiencies through several W3C standards efforts, with a focus on the Accessible Rich Internet Applications [[!WAI-ARIA]] specification.
WAI-ARIA enables rich Internet applications to have the same accessibility features as desktop GUI applications by adding metadata to markup technologies such as (X)HTML. Authors include WAI-ARIA in their markup and user agents translate the WAI-ARIA markup to the platform accessibility APIs.
For an introduction to WAI-ARIA, see the WAI-ARIA Overview. The User Agent Implementation Guide describes how WAI-ARIA roles, states, and properties should be supported in user agents using platform accessibility APIs. It is part of a set of resources that define and support the WAI-ARIA specification which includes the following documents:
The WAI-ARIA User Agent Implementation Guide begins by providing a general overview of accessibility APIs and the accessible object hierarchy known as the accessibility tree. The following sections give guidance on supporting keyboard navigation and mapping WAI-ARIA roles, states, and properties to accessibility APIs. Other sections give guidance on calculating text alternatives, mapping actions to events, event processing, special document handling procedures, and error handling.
This guide assumes that a user agent already exposes static content to assistive technology via the accessibility API on a given platform. Most of the additional work to enable WAI-ARIA can be divided into three parts:
In general, WAI-ARIA attributes should only affect how content is mapped to platform accessibility APIs. They should not affect the visual rendering of content nor behavior of mainstream desktop browsers, except when style sheets are deliberately keyed off of WAI-ARIA attributes as recommended in the specification. This allows one of the primary principles of WAI-ARIA to be upheld—that content still renders and behaves the same for the majority of users.
This document includes information for user agents specifying how to map WAI-ARIA roles, states, and properties to platform accessibility APIs. It also includes host-language specific requirements where necessary to complete the accessibility model. Examples of host languages include HTML and SVG. However, in order to provide the basic, core mappings of WAI-ARIA, discussion of host-language features are generally avoided. How host languages modify or override the core mappings is specified in separate documents.
To provide access to desktop GUI applications, assistive technologies originally used heuristic techniques to determine the meaning of the user interface and build an alternative off-screen model. For example, a row of labels displayed horizontally near the top of an application window might be a menu. Labels with a border drawn around them might be buttons. Heuristic techniques are not always accurate, however, and require assistive technologies to be updated whenever the software application is updated.
A much better technique is for the software application to provide the necessary information for interoperability with assistive technology. To meet this need, platform owners have developed specialized interfaces, called accessibility APIs, which can be used to communicate accessibility information about user interfaces to assistive technologies.
In the case of static Web pages, the Document Object Model (DOM) is used to represent the structure and state of the elements in the document being rendered by a user agent. The elements of the document are organized into a hierarchy of nodes known as the DOM tree. For traditional static Web pages, assistive technologies, such as screen readers, interact with user agents using the DOM. For UI elements that are known to be interactive, such as HTML form elements and desktop applications, assistive technologies may use platform accessibility APIs.
In the case of rich Internet applications, developers use DOM APIs to manipulate objects in the DOM tree to make them behave like interactive desktop GUI applications. In order to make a Web application understandable to assistive technologies, the user agent needs to map accessibility information from the elements in the DOM tree to the Accessibility APIs of the underlying operating system or software platform throughout the lifecycle of the application. The information needed is provided when developers use WAI-ARIA to supply semantic role, state, and property information for elements. The screen reader or other assistive technology uses the semantic information exposed via the accessibility API to provide an alternative rendering of an application that is meaningful to a user.
Accessibility APIs covered by this document are:
If user agent developers need to expose information using other accessibility APIs, it is recommended that they work closely with the developer of the platform where the API runs, and assistive technology developers on that platform.
The reason that two Linux/GNOME accessibility APIs, ATK and AT-SPI, are referenced is due to the different purposes that they serve. ATK defines an interface that is implemented by software in order to expose accessibility information, whereas AT-SPI is a desktop service that gathers accessibility information from active applications and relays it to other interested applications, usually assistive technologies.
For example, the GNOME GUI toolkit [[GTK]], implements the relevant aspects of ATK for each widget (menu, comobox, checkbox, etc.) in order that GTK widgets expose accessibility information about themselves. AT-SPI then acquires the information from applications built with GTK and makes it available to interested parties.
ATK is most relevant to implementors, wherease AT-SPI is relevant to consumers. In the context of mapping WAI-ARIA roles, states and properties, user agents are implementors and use ATK. Asisstive Technologies are consumers, and use AT-SPI.
The accessibility tree and the DOM tree are parallel structures. Roughly speaking the accessibility tree is a subset of the DOM tree. It includes the user interface objects of the user agent and the objects of the document. Accessible objects are created in the accessibility tree for every DOM element that should be exposed to an assistive technology, either because it may fire an accessibility event or because it has a property, relationship or feature which needs to be exposed. Generally if something can be trimmed out it will be, for reasons of performance and simplicity. For example, a <span>
with just a style change and no semantics may not get its own accessible object, but the style change will be exposed by other means.
This section is normative.
This specification indicates whether a section is normative or informative and the classification applies to the entire section. A statement "This section is normative" or "This section is informative" applies to all sub-sections of that section.
Normative sections provide requirements that user agents must follow for an implementation to conform to this specification. The keywords MUST, MUST NOT, REQUIRED, SHALL, SHALL NOT, SHOULD, RECOMMENDED, MAY, and OPTIONAL in this document are to be interpreted as described in Keywords for use in RFCs to indicate requirement levels [[!RFC2119]]. RFC-2119 keywords are formatted in uppercase and contained in a strong
element with class="rfc2119"
. When the keywords shown above are used, but do not share this format, they do not convey formal information in the RFC 2119 sense, and are merely explanatory, i.e., informative. As much as possible, such usages are avoided in this specification.
Informative sections provide information useful to understanding the specification. Such sections may contain examples of recommended practice, but it is not required to follow such recommendations in order to conform to this specification.
This section is normative.
This section is normative.
Enabling keyboard navigation in web applications is a necessary step toward making them accessible. User agents MUST provide a mechanism for authors to specify that any renderable element may be focusable without placing the element in a pre-defined tabbing order.
User agents MUST also provide programmatic access to all focusable elements. This allows for device-independent access, is needed to conform to the User Agent Accessibility Guidelines [[UAAG10]], and is vital for a successful implementation of WAI-ARIA.
Usable keyboard navigation in a rich Internet application is different from the tabbing paradigm among interactive elements, such as links and form controls, in a static document. In rich internet applications, the user tabs to significantly complex widgets, such as a menu or spreadsheet, and uses the arrow keys to navigate within the widget. The changes that WAI-ARIA introduces to keyboard navigation make this enhanced accessibility possible. In WAI-ARIA, any element can be keyboard focusable. In addition to host language mechanisms such as tabindex
, aria-activedescendant
provides another mechanism for keyboard operation. Most other aspects of WAI-ARIA widget development depend on keyboard navigation functioning properly.
Assistive technologies often need to set the focus. For example, voice input software, onscreen keyboards and screen readers supply their own structured navigation modes, providing additional commands for moving to elements in a page. User agents need to allow assistive technologies to set the focus. See the section titled "Handling focus changes from the Assistive Technology" for details.
The following table defines the accessibility API keyboard focus states and events used in later sections of the document.
tabindex
, the DOM focus (document.activeElement
) is in sync with the focus states and events listed in the table. aria-activedescendant
, the DOM focus is separate from the focus states and events for the MSAA, Microsoft UIA, and ATK/AT-SPI columns of the table.
An example is a single-selection listbox
that controls focus using aria-activedescendent
instead of tabindex
. The option
children are all marked with the focusable state in the accessibility API. As the user navigates from one option
child to the next, DOM focus is maintained on the listbox
parent, but the accessibility API emits a focus event and exposes the focused state for the option
child that the listbox
references as the active descendant.
MSAA | Microsoft UIA | ATK/AT-SPI | AXAPI | |
---|---|---|---|---|
Focusable state | STATE_SYSTEM_FOCUSABLE |
UIA_IsKeyboardFocusablePropertyId |
STATE_FOCUSABLE |
boolean AXFocused : the accessibilityIsAttributeSettable method returns YES . |
Focused state | STATE_SYSTEM_FOCUSED |
UIA_HasKeyboardFocusPropertyId |
STATE_FOCUSED |
boolean AXFocused |
Focus event | EVENT_OBJECT_FOCUS |
UIA_AutomationFocusChangedEventId |
object:state-changed:focused and OPTIONAL focus: |
AXFocusedUIElementChanged |
tabindex
User agents that support WAI-ARIA expand the usage of tabindex
, focus
, and blur
to allow them on all elements. Authors may add any element such as a div
, span
or img
to the default tab order by setting tabindex="0"
. In addition, any item with tabindex
equal to a negative integer is focusable via script or a mouse click, but is not part of the default tab order. This is not supported in the HTML4 specification but is in compliance with HTML5 and SVG2.
The tabindex
system provides one way to develop custom widgets which are keyboard accessible, from simple widgets like a slider
to container widgets like a menubar
, treeview
or grid
.
Refer to the Table of accessibility APIs for focus states and events for the rules in this section.
The user agent MUST do the following to enable accessible tabindex
usage on all elements:
tabindex
equals a negative integer, set the focusable state, but do not include the element in the sequential tab order.tabindex="0"
, set the focusable state and include it in the sequential tab order.tabindex
is greater than zero, set the focusable state, and include the element in the sequential tab order according to the value of the tabindex
attribute and before any elements with tabindex
either omitted or with a value of zero. See Sequential focus navigation [[HTML5]] for details. element.tabIndex
property for every element that supports the tabindex
attribute.focus()
and blur()
methods on element interfaces that support the tabindex
attribute, e.g., HTMLElement
and SVGElement
. This allows scripts to move the focus to the element.focus
, blur
, DOMFocusIn
, and DOMFocusOut
events for any element that can receive focus.keydown
event is cancelled, also cancel the keypress
event.aria-activedescendant
When implementing aria-activedescendant
as described below, the user agent keeps the DOM focus on the container element but communicates desktop focus events and states to the assistive technology as if the active descendant has focus. It is the responsibility of the user agent to ensure that keyboard events are processed at the container element that has DOM focus. Any keyboard events directed at the active descendant bubble up to the DOM element with focus, the container element, for processing.
The aria-activedescendant
property may be used to enable keyboard accessibility on WAI-ARIA elements that support this attribute. It is often a more convenient way of creating container widget keyboard navigation (where the entire widget is in the tab order just once, but the user can use other keys, typically arrow keys, to navigate to descendant items of the container).
Typically, the author will use host language semantics to put the container element in the sequential tab order (e.g., tabindex="0"
in HTML) and aria-activedescendant
to point to the ID of the currently active descendant. The author, not the user agent, is responsible for styling the currently active descendant to show it has keyboard focus. The author cannot use :focus
to style the currently active descendant since actual focus is on the container.
Refer to the Table of accessibility APIs for focus states and events for the rules in this section.
The user agent MUST do the following to implement aria-activedescendant
:
tabindex
. aria-activedescendant
which points to a valid ID.aria-activedescendant
attribute changes on an element that currently has DOM focus, remove the focused state from the previously focused object and fire an accessibility API desktop focus event on the new active descendant. If aria-activedescendant
is cleared or does not point to an element in the current document, fire a desktop focus event for the container object that had the attribute change. aria-activedescendant
attribute, apply the following accessibility API states to the target to ensure the object is accessible:
aria-activedescendant
of the container can potentially point to it. It is not absolutely necessary to check this when there is no role, because elements that would be focusable would already have the focusable state.aria-activedescendant
to match the ID of this descendant and the container widget with aria-activedescendant
has DOM focus.Assistive technologies, such as screen readers, voice input software and on-screen keyboards, might request that the keyboard focus be moved using the following accessibility APIs:
accSelect(SELFLAG_TAKEFOCUS)
RaiseAutomationEvent
AtkComponent::grab_focus
AXFocusedUIElementChanged
Refer to the Table of accessibility APIs for focus states and events for the rules in this section.
When an assistive technology requests a change of focus using one of the above APIs, user agents MUST do the following:
aria-activedescendant
attribute present, the user agent MUST set DOM focus to that ancestor. When it is not possible for the user agent to set DOM focus to the containing element with aria-activedescendant
, the user agent MAY attempt to set DOM focus to the child element itself.aria-activedescendant
attribute present, the user agent MUST set the accessibility API focused state and fire an accessibility API desktop focus event on the new active descendant.The inability to set DOM focus to the containing element indicates an author error.
This section is normative.
Where supported by the platform Accessibility API, user agents expose WAI-ARIA semantics through the standard mechanisms of the desktop accessibility API. For example, for WAI-ARIA widgets, compare how the widget is exposed in a similar desktop widget. In general most WAI-ARIA widget capabilities are exposed through the role, value, Boolean states, and relations of the accessibility API.
With respect to WAI-ARIA 1.0, accessibility APIs operate in one direction only. User agents publish WAI-ARIA information (roles, states, and properties) via an accessibility API, and an AT can acquire that information using the same API. However, the other direction is not supported. WAI-ARIA 1.0 does not define mechanisms for assistive technologies to directly modify WAI-ARIA information.
The following elements are not exposed via the accessibility API and user agents MUST NOT include them in the accessibility tree:
none
or presentation
as the first mappable role in the role attribute string, according to the rules for the none
and the presentation
role defined in Accessible Rich Internet Applications (WAI-ARIA) 1.0 [[!WAI-ARIA]]. display:none
or visibility:hidden
or HTML 5 hidden
attribute. If not already excluded from the accessibility tree per the above rules, user agents SHOULD NOT include the following elements in the accessibility tree:
aria-hidden
="true".
In other words, aria-hidden="true"
on a parent overrides aria-hidden="false"
on descendants. If not already excluded from the accessibility tree per the rules above in Excluding Elements in the Accessibility Tree, user agents MUST provide an accessible object in the accessibility tree for DOM elements that meet any of the following criteria:
aria-activedescendant
attribute that matches the implicit or explicit semantics of the required context role. In either case, the element may receive focus and need to fire a FOCUS
event.aria-hidden
="true"
. (See Excluding Elements in the Accessibility Tree for additional guidance on aria-hidden
.)aria-controls
, aria-describedby
, aria-flowto
, aria-labelledby
or aria-owns
) and are not hidden.
Text equivalents for hidden referenced objects may still be used in the name and description calculation even when not included in the accessibility tree.
User agents notify assistive technologies of state and property changes as defined in Events.
WAI-ARIA roles, states, and properties are intended to add semantic information when native host language elements with these semantics are not available, and are generally used on elements that have no native semantics of their own. They can also be used on elements that have similar but not identical semantics to the intended object (for instance, a nested list could be used to represent a tree structure). This method can be part of a fallback strategy for older browsers that have no WAI-ARIA implementation, or because native presentation of the repurposed element reduces the amount of style and/or script needed. Except for the cases outlined below, user agents MUST always use the WAI-ARIA semantics to define how it exposes the element to accessibility APIs, rather than using the host language semantics.
Host languages can have features that have implicit WAI-ARIA semantics corresponding to roles. When a WAI-ARIA role is provided that has a corresponding role in the accessibility API, user agents MUST use the semantic of the WAI-ARIA role for processing, not the native semantic, unless the role requires WAI-ARIA states and properties whose attributes are explicitly forbidden on the native element by the host language. Values for roles do not conflict in the same way as values for states and properties, and because authors are expected to have a valid reason to provide a WAI-ARIA role even on elements that would not normally be repurposed. For example, spin buttons are typically constructed from text fields (<input type="text">
) in order to get most of the default keyboard support. But, the native role, "text field", isn't correct because it doesn't properly communicate the additional features of a spin button. The author will add the WAI-ARIA role of spinbutton (<input type="text" role="spinbutton" ...>
) so that the control gets properly mapped in the accessibility API. When a WAI-ARIA role is provided that does not have a corresponding role in the accessibility API, user agents MAY expose the native semantic in addition to the WAI-ARIA role.
The above text differs slightly from the WAI-ARIA specification. The requirement for user agents to expose the WAI-ARIA role instead of the native role was intended to only apply in cases where there is a direct mapping from the WAI-ARIA role to a corresponding role in the accessibility API. The wording of the requirement is not clear in the WAI-ARIA specification, however, and has been interpreted differently by implementers. The requirement has been clarified here and an additional statement added to indicate that user agents may expose native semantics if there is not a direct mapping to a role in the accessibility API. Because there are differing implementations, authors will be advised against adding such WAI-ARIA roles to native elements that have their own semantics in the WAI-ARIA Authoring Practices Guide.
When WAI-ARIA states and properties correspond to host language features that have the same implicit WAI-ARIA semantic, it can be problematic if the values become out of sync. For example, the HTML checked
attribute and the aria-checked
attribute could have conflicting values. Therefore to prevent providing conflicting states and properties to assistive technologies, host languages will explicitly declare where the use of WAI-ARIA attributes on a host language element conflict with native attributes for that element. When a host language declares a WAI-ARIA attribute to be in direct semantic conflict with a native attribute for a given element, user agents MUST ignore the WAI-ARIA attribute and instead use the host language attribute with the same implicit semantic.
Host languages might also document features that cannot be overridden with WAI-ARIA (these are called "strong native semantics"). These can be features that have implicit WAI-ARIA semantics as well as features where the processing would be uncertain if the semantics were changed with WAI-ARIA. While conformance checkers might signal an error or warning when a WAI-ARIA role is used on elements with strong native semantics, user agents MUST still use the value of the semantic of the WAI-ARIA role when exposing the element to accessibility APIs.
Platform accessibility APIs might have features that are not in WAI-ARIA. Likewise, WAI-ARIA exposes capabilities that are not supported by accessibility APIs at the time of publication. There typically is not a one to one relationship between all WAI-ARIA attributes and platform accessibility APIs. When WAI-ARIA roles, states and properties do not directly map to an accessibility API, and there is a mechanism in the API to expose the WAI-ARIA role, states, and properties and their values, user agents MUST expose the WAI-ARIA data using that mechanism as follows:
aria-live
attribute can be exposed via an object attribute because accessibility APIs have no such property available. Specific rules for exposing object attribute name-value pairs are described throughout this document, and rules for the general cases are in State and Property Mapping.AriaRole
and AriaProperties
properties to expose semantics that are not directly supported in the control type.MSAA does not provide a mechanism for exposing attributes that do not map directly to the API and among implementers, there is no agreement on how to do it.
User agents MUST also expose the entire role string through this mechanism and MAY also expose WAI-ARIA attributes and values through this mechanism even when there is a direct mapping to an accessibility API.
Browser implementers are advised to publicly document their API methods for exposing any relevant information, so that assistive technology developers can use the API to support user features.
Platform accessibility APIs traditionally have had a finite set of predefined roles that are expected by assistive technologies on that platform and only one or two roles may be exposed. In contrast, WAI-ARIA allows multiple roles to be specified as an ordered set of space-separated valid role tokens. The additional roles are fallback roles similar to the concept of specifying multiple fonts in case the first choice font type is not supported.
The following rules describe how to expose WAI-ARIA roles using the accessibility API:
The following steps will correctly identify the applicable WAI-ARIA role:
table
to determine what platform accessibility API role to use according to the host language's role mapping. For <input type="text" role="bar">, use the platform accessibility API for a text input.none
or presentation
is applied to an element, the user agent MUST implement the rules for the none
or the presentation
role defined in Accessible Rich Internet Applications (WAI-ARIA) 1.0 [[!WAI-ARIA]]. accRole
property.xml-roles:"string"
)AriaRole
property. The AriaRole property
can also support secondary roles using a space as a separator.xml-roles:"string"
)Translators: For label text associated with the following table and its toggle buttons, see the mappingTableLabels
object in the <head>
section of this document.
WAI-ARIA Role | MSAA + IAccessible2 Role + Other IAccessible2 Features | UIA Control Type + Other Features | ATK/AT-SPI Role | AXAPI[Note 1] |
---|---|---|---|---|
alert |
ROLE_SYSTEM_ALERT The user agent SHOULD fire |
Text |
ROLE_ALERT The user agent SHOULD fire a system alert event.[Note 2] |
AXRole: AXGroup AXSubrole: AXApplicationAlert AXRoleDescription: 'alert'
The user agent SHOULD fire a system alert event.[Note 2] |
alertdialog |
ROLE_SYSTEM_DIALOG The user agent SHOULD fire |
Pane The user agent SHOULD fire a system alert event.[Note 2] |
ROLE_DIALOG The user agent SHOULD fire a system alert event.[Note 2] |
AXRole: AXGroup AXSubrole: AXApplictionAlertDialog AXRoleDescription: 'alert dialog'
The user agent SHOULD fire a system alert event.[Note 2] |
application |
ROLE_SYSTEM_APPLICATION |
|
ROLE_EMBEDDED |
AXRole: AXGroup AXSubrole: AXLandmarkApplication AXRoleDescription: 'application' |
article |
ROLE_SYSTEM_DOCUMENT + STATE_SYSTEM_READONLY
IAccessible2: Object attribute |
|
ROLE_ARTICLE + do not expose STATE_EDITABLE
Object attribute |
AXRole: AXGroup AXSubrole: AXDocumentArticle AXRoleDescription: 'article' |
banner |
IAccessible2: Object attribute xml-roles:banner |
|
ROLE_LANDMARK and object attribute xml-roles:banner |
AXRole: AXGroup AXSubrole: AXLandmarkBanner AXRoleDescription: 'banner' |
button |
ROLE_SYSTEM_PUSHBUTTON
If aria-pressed is not undefined, expose as IA2_ROLE_TOGGLE_BUTTON |
Button |
ROLE_PUSH_BUTTON
If |
If AXCheckBox AXSubrole: AXToggleButton AXRoleDescription: 'toggle button'
If AXButton AXSubrole: <nil> AXRoleDescription: 'button'
|
cell [ARIA 1.1] |
ROLE_SYSTEM_CELL . |
DateItem with TableItemControlPattern . |
ROLE_TABLE_CELL . |
AXRole: AXCell AXSubrole: <nil> AXRoleDescription: 'cell' |
checkbox |
ROLE_SYSTEM_CHECKBUTTON
IAccessible2: Object attribute |
Checkbox |
ROLE_CHECK_BOX + STATE_CHECKABLE |
AXRole: AXCheckBox AXSubrole: <nil> AXRoleDescription: 'check box' |
columnheader |
ROLE_SYSTEM_COLUMNHEADER
IAccessible2: Used to help support |
HeaderItem |
ROLE_COLUMN_HEADER |
AXRole: AXCell or AXSortButton if using aria-sort AXSubrole: <nil> AXRoleDescription: 'cell '
Parent table also implements Parent table also implements |
combobox |
ROLE_SYSTEM_COMBOBOX + STATE_SYSTEM_HASPOPUP .
If |
Combobox |
ROLE_COMBO_BOX + STATE_EXPANDABLE + STATE_HAS_POPUP |
AXRole: AXComboBox AXSubrole: <nil> AXRoleDescription: 'combo box' |
complementary |
IAccessible2: Object attribute xml-roles:complementary |
|
ROLE_LANDMARK and object attribute xml-roles: complementary |
AXRole: AXGroup AXSubrole: AXLandmarkComplementary AXRoleDescription: 'complementary' |
contentinfo |
IAccessible2: Object attribute xml-roles:contentinfo |
|
ROLE_LANDMARK and object attribute xml-roles: contentinfo |
AXRole: AXGroup AXSubrole: AXLandmarkContentInfo AXRoleDescription: 'content' |
definition |
IAccessible2: Object attribute xml-roles:definition |
|
Object attribute xml-roles:definition |
AXRole: AXGroup AXSubrole: AXDefinition AXRoleDescription: 'definition' |
dialog |
ROLE_SYSTEM_DIALOG |
Pane |
ROLE_DIALOG |
AXRole: AXGroup AXSubrole: AXApplicationDialog AXRoleDescription: 'dialog' |
directory |
ROLE_SYSTEM_LIST |
List |
ROLE_LIST |
AXRole: AXList AXSubrole: AXContentList AXRoleDescription: 'content list' |
document |
ROLE_SYSTEM_DOCUMENT + STATE_SYSTEM_READONLY |
Document |
ROLE_DOCUMENT_FRAME + do not expose STATE_EDITABLE |
AXRole: AXGroup AXSubrole: AXDocument AXRoleDescription: 'document' |
form |
IAccessible2: IA2_ROLE_FORM |
Expose as text string in AriaRole |
ROLE_FORM |
AXRole: AXGroup AXSubrole: <nil> AXRoleDescription: 'group' |
grid |
ROLE_SYSTEM_TABLE + object attribute xml-roles:grid .
IAccessible2: Use |
DataGrid with selection pattern. |
ROLE_TABLE + object attribute xml-roles:grid . |
AXRole: AXTable AXSubrole: <nil> AXRoleDescription: 'grid' |
gridcell |
ROLE_SYSTEM_CELL |
DataItem
Also requires |
ROLE_TABLE_CELL |
AXRole: AXCell AXSubrole: <nil> AXRoleDescription: 'cell' |
group |
ROLE_SYSTEM_GROUPING |
Group |
ROLE_PANEL |
AXRole: AXGroup AXSubrole: <nil> AXRoleDescription: 'group' |
heading
– The heading level is specified by the aria-level property. |
Expose as object attribute xml-roles:heading .Also, expose |
Text |
ROLE_HEADING |
AXRole: AXHeading AXSubrole: <nil> AXRoleDescription: 'heading' |
img |
ROLE_SYSTEM_GRAPHIC |
Image |
ROLE_IMAGE |
AXRole: AXImage AXSubrole: <nil> AXRoleDescription: 'image' |
link |
ROLE_SYSTEM_LINK + STATE_LINKED
Also, expose AccessibleHypertext interface |
HyperLink |
ROLE_LINK |
AXRole: AXLink AXSubrole: <nil> AXRoleDescription: 'link' |
list |
ROLE_SYSTEM_LIST + STATE_SYSTEM_READONLY |
When the |
ROLE_LIST + do not expose STATE_EDITABLE |
AXRole: AXList AXSubrole: AXContentList AXRoleDescription: 'content list' |
listbox |
ROLE_SYSTEM_LIST |
List |
ROLE_LIST_BOX .
Special case: if a |
AXRole: AXList AXSubrole: <nil> AXRoleDescription: 'list' |
listitem |
ROLE_SYSTEM_LISTITEM + STATE_SYSTEM_READONLY |
Also requires |
ROLE_LISTITEM + do not expose STATE_EDITABLE |
AXRole: AXGroup AXSubrole: <nil> AXRoleDescription: 'group' |
log |
IAccessible2: object attributes xml-roles:log ;container-live:polite;live:polite;container-live-role:log . |
|
ROLE_LOG and object attributes xml-roles:log;container-live:polite;live:polite;container-live-role:log . |
AXRole: AXGroup AXSubrole: AXApplicationLog AXRoleDescription: 'log' |
main |
IAccessible2: Object attribute xml-roles:main |
|
ROLE_LANDMARK and object attribute xml-roles:main |
AXRole: AXGroup AXSubrole: AXLandmarkMain AXRoleDescription: 'main' |
marquee |
ROLE_SYSTEM_ANIMATION + IAccessible2: object attribute xml-roles:marquee;container-live:off;live:off |
Text |
ROLE_MARQUEE + object attributes container-live:off;live:off |
AXRole: AXGroup AXSubrole: AXApplicationMarquee AXRoleDescription: 'marquee' |
math |
ROLE_SYSTEM_EQUATION |
|
ROLE_MATH |
AXRole: AXGroup AXSubrole: AXDocumentMath AXRoleDescription: 'math' |
menu |
ROLE_SYSTEM_MENUPOPUP |
Menu |
ROLE_MENU
These objects are not exposed for a submenu if there is a parent menu item spawning the submenu. Since ATK/AT-SPI allows menuitems to have menuitem children, interposing menu objects are not exposed, except for the root parent. |
AXRole: AXMenu AXSubrole: <nil> AXRoleDescription: 'menu' |
menubar |
ROLE_SYSTEM_MENUBAR |
MenuBar |
ROLE_MENU_BAR |
AXRole: AXMenuBar AXSubrole: <nil> AXRoleDescription: 'menu bar' |
menuitem |
ROLE_SYSTEM_MENUITEM |
MenuItem |
ROLE_MENU_ITEM |
If the option's parent has a group role, then role="menuitem" maps to AXMenuButton
If the option's parent has a AXRole: |
menuitemcheckbox |
ROLE_SYSTEM_CHECKBUTTON or ROLE_SYSTEM_MENUITEM
|
MenuItem + Toggle Pattern |
ROLE_CHECK_MENU_ITEM + STATE_CHECKABLE |
AXRole: AXMenuItem AXSubrole: <nil> AXRoleDescription: 'menu item '
If |
menuitemradio |
ROLE_SYSTEM_RADIOBUTTON or ROLE_SYSTEM_MENUITEM
|
MenuItem |
ROLE_RADIO_MENU_ITEM + STATE_CHECKABLE |
AXRole: AXMenuItem AXSubrole: <nil> AXRoleDescription: 'menu item '
If |
navigation |
IAccessible2: Object attribute xml-roles:navigation |
|
ROLE_LANDMARK and object attribute xml-roles:navigation |
AXRole: AXGroup AXSubrole: AXLandmarkNavigation AXRoleDescription: 'navigation' |
none [ARIA 1.1] |
If the object is in the accessibility tree, expose as For objects that have required owned descendants (e.g., a grid owns gridcells, a list owns listitems), and the descendant is in the accessibility tree, expose it as |
If the object is in the accessibility tree, expose using the For objects that have required owned descendants (e.g., a grid owns gridcells, a list owns listitems), and the descendant is in the accessibility tree, expose it using the |
If the object is in the accessibility tree, expose as For objects that have required owned descendants (e.g., a grid owns gridcells, a list owns listitems), and the descendant is in the accessibility tree, expose it as |
Not mapped. |
note |
IAccessible2: IA2_ROLE_NOTE |
|
ROLE_COMMENT |
AXRole: AXGroup AXSubrole: AXDocumentNote AXRoleDescription: 'note' |
option
– If aria-selected is undefined treat as aria-selected = "false" . |
ROLE_SYSTEM_LISTITEM
IAccessible2: If |
ListItem + Invoke pattern |
ROLE_LIST_ITEM
If Special case: if an |
AXRole: AXStaticText AXSubrole: <nil> AXRoleDescription: 'text' |
presentation |
If the object is in the accessibility tree, expose as For objects that have required owned descendants (e.g., a grid owns gridcells, a list owns listitems), and the descendant is in the accessibility tree, expose it as |
If the object is in the accessibility tree, expose using the For objects that have required owned descendants (e.g., a grid owns gridcells, a list owns listitems), and the descendant is in the accessibility tree, expose it using the |
If the object is in the accessibility tree, expose as For objects that have required owned descendants (e.g., a grid owns gridcells, a list owns listitems), and the descendant is in the accessibility tree, expose it as |
Not mapped. |
progressbar |
ROLE_SYSTEM_PROGRESSBAR + STATE_SYSTEM_READONLY |
If any of the |
ROLE_PROGRESS_BAR + do not expose STATE_EDITABLE |
AXRole: AXProgressIndicator AXSubrole: <nil> AXRoleDescription: 'progress indicator' |
radio |
ROLE_SYSTEM_RADIOBUTTON |
RadioButton |
ROLE_RADIO_BUTTON |
AXRole: AXRadioButton AXSubrole: <nil> AXRoleDescription: 'radio button' |
radiogroup |
ROLE_SYSTEM_GROUPING |
List |
ROLE_GROUPING |
AXRole: AXRadioGroup AXSubrole: <nil> AXRoleDescription: 'radio group' |
region |
(TBD) IAccessible2: Object attribute xml-roles:region |
(TBD) Expose as text string in AriaRole |
ROLE_LANDMARK and object attribute xml-roles:region |
(TBD) AXRole: AXGroup AXSubrole: AXLandmarkRegion AXRoleDescription: 'region' |
row |
ROLE_SYSTEM_ROW unless inside a tree or treegrid , in which case ROLE_SYSTEM_OUTLINEITEM
IAccessible2: Used to help support: |
Also requires |
ROLE_TABLE_ROW |
AXRole: AXRow AXSubrole: <nil> AXRoleDescription: 'row' |
rowgroup
– The rowgroup role exists to support role symmetry in HTML, and allows for the propagation of presentation inheritance on tables with an explicit presentation role applied. |
ROLE_SYSTEM_GROUPING |
group |
ROLE_PANEL |
Not mapped |
rowheader |
ROLE_SYSTEM_ROWHEADER
IAccessible2: Used to help support |
HeaderItem |
ROLE_ROW_HEADER |
AXRole: AXCell AXSubrole: <nil> AXRoleDescription: 'cell '
Parent table also implements |
scrollbar |
ROLE_SYSTEM_SCROLLBAR |
scrollbar |
ROLE_SCROLLBAR |
AXRole: AXScrollBar AXSubrole: <nil> AXRoleDescription: 'scroll bar' |
search |
|
ROLE_LANDMARK and object attribute xml-roles:search |
AXRole: AXGroup AXSubrole: AXLandmarkSearch AXRoleDescription: 'search' |
|
searchbox [ARIA 1.1] |
ROLE_SYSTEM_TEXT + object attribute text-input-type:search |
Control type/role is Edit . Localized Control Type is "search box " |
ROLE_ENTRY + STATE_SINGLE_LINE if aria-multiline is not "true" |
AXRole: AXTextField AXSubrole: AXSearchField AXRoleDescription: 'search text field' |
separator |
ROLE_SYSTEM_SEPARATOR |
Separator |
ROLE_SEPARATOR |
AXRole: AXSplitter AXSubrole: <nil> AXRoleDescription: 'splitter' |
slider |
ROLE_SYSTEM_SLIDER |
Slider |
ROLE_SLIDER |
AXRole: AXSlider AXSubrole: <nil> AXRoleDescription: 'slider' |
spinbutton |
ROLE_SYSTEM_SPINBUTTON |
Spinner |
ROLE_SPIN_BUTTON |
AXRole: AXIncrementor AXSubrole: <nil> AXRoleDescription: 'stepper' |
status |
IAccessible2: object attributes |
StatusBar |
ROLE_STATUSBAR + object attributes container-live:polite;live:polite;container-live-role:status |
AXRole: AXGroup AXSubrole: AXApplicationStatus AXRoleDescription: 'status' |
switch [ARIA 1.1] |
IA2_ROLE_TOGGLE_BUTTON + object attribute xml-roles:switch |
Control type/role is Button + Toggle Pattern. Localized Control Type is "toggleswitch ". |
ROLE_TOGGLE_BUTTON |
AXRole: AXCheckBox AXSubrole: AXSwitch AXRoleDescription: 'switch' |
tab
– If aria-selected is undefined treat as aria-selected = "false" . |
ROLE_SYSTEM_PAGETAB .
Expose |
TabItem |
ROLE_PAGE_TAB . Expose SELECTED state if focus is inside tabpanel associated with aria-labelledby . |
AXRole: AXRadioButton AXSubrole: <nil> AXRoleDescription: 'tab' |
table [ARIA 1.1] |
ROLE_SYSTEM_TABLE + object attribute xml-roles:table .
IAccessible2: Use |
DataGrid . |
ROLE_TABLE + object attribute xml-roles:table . |
AXRole: AXTable AXSubrole: <nil> AXRoleDescription: 'grid' |
tablist |
ROLE_SYSTEM_PAGETABLIST |
Tab
Also requires |
ROLE_PAGE_TAB_LIST |
AXRole: AXTabGroup AXSubrole: <nil> AXRoleDescription: 'tabgroup' |
tabpanel |
ROLE_SYSTEM_PANE or ROLE_SYSTEM_PROPERTYPAGE |
Pane |
ROLE_SCROLL_PANE |
AXRole: AXGroup AXSubrole: TabPanel AXRoleDescription: 'tab panel' |
text [ARIA 1.1] |
IA2_ROLE_TEXTFRAME |
Text control pattern |
ROLE_STATIC |
AXRole: AXStaticText AXSubrole: <nil> AXRoleDescription: 'text' |
textbox |
ROLE_SYSTEM_TEXT
|
Control type/role is Edit |
ROLE_ENTRY + STATE_SINGLE_LINE if aria-multiline is not "true" |
If If |
timer |
IAccessible2: Object attribute xml-roles:timer;container-live:off;live:off;container-live-role:timer |
Expose as text string in AriaRole |
ROLE_TIMER + object attributes container-live:off;live:off;container-live-role:timer |
AXRole: AXGroup AXSubrole: AXApplicationTimer AXRoleDescription: 'timer' |
toolbar |
ROLE_SYSTEM_TOOLBAR |
ToolBar |
ROLE_TOOL_BAR |
AXRole: AXToolbar AXSubrole: <nil> AXRoleDescription: 'toolbar' |
tooltip |
ROLE_SYSTEM_TOOLTIP |
ToolTip |
ROLE_TOOL_TIP |
AXRole: AXGroup AXSubrole: AXUserInterfaceTooltip AXRoleDescription: 'tooltip' |
tree |
ROLE_SYSTEM_OUTLINE |
Tree |
ROLE_TREE |
AXRole: AXOutline AXSubrole: <nil> AXRoleDescription: 'outline' |
treegrid |
ROLE_SYSTEM_OUTLINE
IAccessible2:
|
DataGrid |
ROLE_TREE_TABLE |
AXRole: AXTable AXSubrole: <nil> AXRoleDescription: 'table' |
treeitem |
ROLE_SYSTEM_OUTLINEITEM
IAccessible2: If |
TreeItem |
ROLE_TREE_ITEM + if aria-checked is not undefined, support STATE_CHECKABLE |
AXRole: AXRow AXSubrole: AXOutlineRow AXRoleDescription: 'outline row' |
[Note 1] User agent should return a user-presentable, localized string value for the AXRoleDescription.
[Note 2] This specification does not currently contain guidance for when user agents should fire system alert events. Some guidance may be added to the specification at a later date but it will be a recommendation (SHOULD), not a requirement (MUST).
This section describes how to expose WAI-ARIA states and object properties.
VISIBLE
/INVISIBLE
, SHOWING
/OFFSCREEN
, etc. This typically is done in the same way as for ordinary elements that do not have WAI-ARIA attributes present. The FOCUSABLE
/FOCUSED
states may be affected by aria-activedescendant
. See the rules in Controlling focus with aria-activedescendant
.aria-labelledby
attribute but the native HTML semantics must still be exposed. aria-
" prefix from the name, if the API supports it. For example, aria-foo="bar" would be exposed with a text string foo=bar
in UIA, since aria-foo
is not a currently known WAI-ARIA property. The following list specifies the accessibility APIs for exposing properties as text strings.
property:string
)AriaProperties
(property=string
) property:string
) aria-checked="true"
is specified on <div role="grid">
, it should not be exposed in MSAA implementations as STATE_SYSTEM_CHECKED
. User agents MAY expose non-relevant attributes as a text string if the API supports it as described above.none
or presentation
is applied to an element, the user agent MUST implement the rules for the none
or the presentation
role defined in Accessible Rich Internet Applications (WAI-ARIA) 1.0 [[!WAI-ARIA]]].There are a number of occurrences in the table where a given state or property is declared "Not mapped". In some cases, this occurs for the default value of the state/property, and is equivalent to its absence. User agents might find it quicker to map the value than check to see if it is the default. For computational efficiency, user agents MAY expose the state or property value if doing so is equivalent to not mapping it. These cases are marked with an asterisk.
In other cases, it is mandatory that the state/property not be mapped, since exposing it implies a related affordance. An example is aria-grabbed
. Its absence not only indicates that the accessible is not grabbed, but further defines it as not grab-able. These cases are marked as "Not mapped" without an asterisk.
Translators: For label text associated with the following table and its toggle buttons, see the mappingTableLabels
object in the <head>
section of this document.
WAI-ARIA State or Property | MSAA + IAccessible2 | UIA | ATK/AT-SPI | AXAPI |
---|---|---|---|---|
aria-activedescendant |
See Controlling focus with aria-activedescendant , Handling focus changes from the Assistive Technology, and ID Reference Error Processing in Relations. In cases, however, the focus can be transparent in an accessibility tree as it may be exposed as focus delegation from the container element to the child object that takes active focus. This is represented by an accessible object that comes with |
See Controlling focus with aria-activedescendant , Handling focus changes from the Assistive Technology, and ID Reference Error Processing in Relations. |
See Controlling focus with aria-activedescendant , Handling focus changes from the Assistive Technology, and ID Reference Error Processing in Relations. In cases, however, the focus can be transparent in an accessibility tree as it may be exposed as focus delegation from the container element to the child object that takes active focus. This is represented by an accessible object that comes with |
array AXSelectedRows contains pointer to active descendant node |
aria-atomic ="true" |
IAccessible2:
|
Expose atomic=true in AriaProperties |
Expose as object attribute Expose object attribute |
boolean AXARIAAtomic: YES |
aria-atomic ="false" (default) |
IAccessible2: Not mapped* — OPTIONAL — but if mapped:
|
Expose atomic=false in AriaProperties |
Not mapped* — OPTIONAL — but if mapped:
|
boolean AXARIAAtomic: NO |
aria-autocomplete ="inline" , "list" , or "both" |
IAccessible2:
|
Expose autocomplete=<value> in AriaProperties |
Object attribute autocomplete:<value>
Expose the |
Not mapped |
aria-autocomplete ="none" (default) |
Not mapped* | Not mapped* | Not mapped* | Not mapped* |
aria-busy ="true" (state) |
Expose the STATE_SYSTEM_BUSY state |
Expose busy=true in AriaProperties |
Expose the STATE_BUSY state |
boolean AXElementBusy: YES |
aria-busy ="false" (state) (default) |
Clear the STATE_SYSTEM_BUSY state |
Expose busy=false in AriaProperties |
Clear the STATE_BUSY state |
boolean AXElementBusy: NO |
aria-checked ="true" (state) |
Set the STATE_SYSTEM_CHECKED state
IAccessible2: Expose object attribute |
Expose as
|
Expose Set the |
AXValue: 1 |
aria-checked ="false" (state) |
Clear the STATE_SYSTEM_CHECKED state
IAccessible2: Expose object attribute |
Expose as
|
Clear the Expose
|
AXValue: 0 |
aria-checked ="mixed" (state)
– Treat as "false" for radio , menuitemradio , and switch roles. |
Set the STATE_SYSTEM_MIXED state
IAccessible2: Expose object attribute |
Expose as
|
Expose STATE_INDETERMINATE , unless on a role of radio or menuitemradio (in those cases treat as "false" )
Expose |
AXValue: 2 |
aria-checked is undefined (state)
– Treat as "false" for checkbox , menuitemcheckbox , radio , menuitemradio , and switch roles. |
Not mapped | Not mapped | Not mapped | Not mapped |
aria-controls |
IAccessible2:
|
Expose pointer to the accessible object ControllerFor property |
Expose pointer to the accessible object RELATION_CONTROLLER_FOR
Expose reverse relations as described in Relations. |
array AXLinkedUIElements contains pointers to nodes matching IDREFs |
aria-current (state) [ARIA 1.1] |
(TBD) IAccessible2:
|
Expose current=<value> in AriaProperties . |
|
TBD. |
aria-current is undefined (state) [ARIA 1.1] |
(TBD) IAccessible2: Clear |
TBD. Not mapped |
Clear |
TBD. Not mapped |
aria-describedat |
TBD | TBD | TBD | TBD |
aria-describedby |
Use in calculating the accessible Description as described in Name Computation. Expose in accDescription property.
IAccessible2: If the referenced objects are in the accessibility tree, expose pointers to them using |
Use in calculating the accessible Description as described in Name Computation. If the referenced objects are in the accessibility tree, expose pointers to the referenced accessible objects using the |
Use in calculating the accessible Description as described in Name Computation. Expose in the description property of the accessible object. If the referenced objects are in the accessibility tree, expose reverse relations as described in Relations. |
Use in calculating the accessible description as described in Name Computation and expose value as string AXHelp . |
aria-disabled ="true" (state) |
Set STATE_SYSTEM_UNAVAILABLE
Propagate to all descendants of the element with |
Set IsEnabled to "false" |
Not mapped | boolean AXEnabled: NO |
aria-disabled ="false" (state) (default) |
Clear STATE_SYSTEM_UNAVAILABLE |
Set IsEnabled to "true" |
Expose STATE_ENABLED |
boolean AXEnabled: YES |
aria-dropeffect ="copy" , "move" , "link" , "execute" , or "popup" (state) |
IAccessible2: Expose as object attribute dropeffect:<value> |
Expose dropeffect=<value> in AriaProperties |
Expose as object attribute dropeffect:<value> |
array AXDropEffects |
aria-dropeffect ="none" (state) (default) |
IAccessible2: Expose as object attribute Not mapped if not specified by the author. |
Not mapped* | Expose as object attribute Not mapped if not specified by the author. |
Not mapped* |
aria-expanded ="true" (state) |
Set STATE_SYSTEM_EXPANDED |
Expose as "expanded" in ExpandCollapseState property of ExpandCollapse Control Pattern |
Expose STATE_EXPANDABLE and STATE_EXPANDED |
boolean AXExpanded: YES |
aria-expanded ="false" (state) |
Set STATE_SYSTEM_COLLAPSED |
Expose as "collapsed" in ExpandCollapseState property of ExpandCollapse Control Pattern |
Expose STATE_EXPANDABLE |
boolean AXExpanded: NO |
aria-expanded is undefined (state) (default) |
Not mapped | Not mapped | Not mapped | Not mapped |
aria-flowto |
IAccessible2:
|
Expose a reference to the accessible object in FlowsTo property |
Expose reference to the accessible object in RELATION_FLOWS_TO
Expose reverse relations as described in Relations. |
array AXLinkedUIElements contains pointers to nodes matching IDREFs |
aria-grabbed ="true" (state) |
IAccessible2: Object attribute grabbed:true |
Expose as grabbed=true in AriaProperties |
Object attribute grabbed:true |
boolean AXGrabbed: YES |
aria-grabbed ="false" (state) |
IAccessible2: Object attribute grabbed:false |
Expose as grabbed=false in AriaProperties |
Object attribute grabbed:false |
boolean AXGrabbed: NO |
aria-grabbed is undefined (state) (default) |
Not mapped | Not mapped | Not mapped | Not mapped |
aria-haspopup ="true" (default for role combobox ) |
Expose as STATE_SYSTEM_HASPOPUP . If on a push button, change the role to ROLE_SYSTEM_BUTTONMENU . |
Expose state of the pop-up activities as "expanded" or "collapsed" in the ExpandCollapseState property in the ExpandCollapse Control Pattern. |
Expose as STATE_HAS_POPUP |
Expose AXShowMenu and AXPress actions |
aria-haspopup ="false" (default) |
Clear the HASPOPUP state. If specified on a push button, change the role to ROLE_SYSTEM_BUTTONMENU |
Not mapped* | Not mapped* | Not mapped* |
aria-hidden ="true" (state) |
See Including Elements in the Accessibility Tree. Element SHOULD NOT be exposed, unless it is focused or fires an accessibility event. If the object is exposed in the accessibility tree, map all attributes as normal, and expose object attribute |
See Including Elements in the Accessibility Tree. Element SHOULD NOT be exposed, unless it is focused or fires an accessibility event. If the object is exposed in the accessibility tree, map all attributes as normal, and expose |
See Including Elements in the Accessibility Tree. Element SHOULD NOT be exposed, unless it is focused or fires an accessibility event. If the object is exposed in the accessibility tree, map all attributes as normal, and expose object attribute |
Not exposed in AX API unless focused. If focused, expose as normal. |
aria-hidden ="false" (state) (default) |
Not mapped | Not mapped | Not mapped | Not mapped |
aria-invalid ="true" , "spelling" , or "grammar" (state) |
IAccessible2:
|
|
|
AXInvalid: <value> |
aria-invalid =<unknown value> |
IAccessible2:
|
Expose false in IsDataValidForForm property |
|
AXInvalid: true |
aria-invalid ="false" (state) (default) |
IAccessible2: Clear IA2_STATE_INVALID_ENTRY or equivalent state. |
Expose true in IsDataValidForForm property |
Not mapped* | AXInvalid: "false" |
aria-label |
Use in calculating the accessible name as described in Name Computation. Expose in accName property. |
Use in calculating the accessible name as described in Name Computation. Expose in Name property. |
Use in calculating the accessible name as described in Name Computation. Expose in the name property of the accessible object. | Calculate accessible name as described in Name Computation and expose value as Note: |
aria-labelledby |
Use in calculating the accessible name as described in Name Computation. Expose in IAccessible2: If the referenced objects are in the accessibility tree expose pointers to them using |
Use in calculating the accessible name as described in Name Computation. Expose in If the referenced objects are in the accessibility tree, expose pointers to them using the |
Use in calculating the accessible name as described in Name Computation. Expose in the name property of the accessible object. If the referenced objects are in the accessibility tree, expose pointers to them using |
If If |
aria-level |
IAccessible2:
|
Expose as level=<value> in AriaProperties .
When used on a |
Expose as object attribute level:<value> |
When used on a When used on an outline row (like a |
aria-live ="assertive" (default for role alert ) |
IAccessible2:
|
Set LiveSetting Property to "assertive" |
Expose as object attribute live:assertive and container-live:assertive .
Expose as object attribute |
AXARIALive: "assertive" |
aria-live ="polite" (default for role types log and status ) |
IAccessible2:
|
Set LiveSetting Property to "polite" |
Expose as object attribute live:polite and container-live:polite .
Expose as object attribute |
AXARIALive: "polite" |
aria-live ="off" (default) |
IAccessible2:
|
Set LiveSetting property to "off" |
Expose as object attribute live:off and container-live:off .
Expose as object attribute |
AXARIALive: "off" |
aria-modal ="true" |
IAccessible2: Set IA2_STATE_MODAL |
Set IsModal property of Window control pattern to "true" |
Set STATE_MODAL |
TBD |
aria-modal ="false" |
IAccessible2: Clear IA2_STATE_MODAL |
Set IsModal property of Window control pattern to "false" |
Clear STATE_MODAL |
TBD |
aria-multiline ="true" |
IAccessible2: Set the IA2_MULTI_LINE state and clear IA2_SINGLE_LINE |
Expose as multiline=true in AriaProperties |
Set STATE_MULTI_LINE and clear STATE_SINGLE_LINE |
See |
aria-multiline ="false" (default) |
IAccessible2: Clear the IA2_MULTI_LINE state, and set IA2_SINGLE_LINE |
Not mapped* | Set STATE_SINGLE_LINE and clear STATE_MULTI_LINE |
See |
aria-multiselectable ="true" |
Set the IAccessible2: For text elements, support the selection methods defined on the See Selection for details. |
Set See Selection for details. |
Expose See Selection for details. |
See Selection for details. |
aria-multiselectable ="false" (default) |
Clear the STATE_SYSTEM_MULTISELECTABLE state. Expose STATE_SYSTEM_EXTSELECTABLE to exactly match STATE_SYSTEM_MULTISELECTABLE .
See Selection for details. |
Not mapped* | Not mapped* | Not mapped* |
aria-orientation ="horizontal" (default) |
IAccessible2:
|
Set Orientation property to "horizontal" |
Set STATE_HORIZONTAL |
AXOrientation: AXHorizontalOrientation |
aria-orientation ="vertical" (default for role scrollbar ) |
IAccessible2:
|
Set Orientation Property to "vertical" |
Set STATE_VERTICAL |
AXOrientation: AXVerticalOrientation |
aria-owns |
The accessibility tree is not modified. IAccessible2:
If multiple |
The structure should be reflected in the accessibility tree as directed by aria-owns . Map the elements that are referenced by this property as children of the current element.
If multiple |
Expose reverse relations as described in Relations If multiple |
array AXOwns contains pointers to nodes matching IDREFs |
[ARIA 1.1] aria-placeholder |
IAccessible2: Expose as object attribute |
Expose as |
Expose as object attribute |
|
aria-posinset
– If not provided for relevant roles, user agents calculate aria-setsize and aria-posinset for each object in the container based on the number of objects in the DOM. |
IAccessible2: Expose as object attribute |
Expose as |
Expose as object attribute |
AXARIAPosInSet: <value> |
aria-pressed ="true" (state) |
Set the STATE_SYSTEM_PRESSED state.
IAccessible2: If on a button, expose the role as |
Expose as
|
Expose STATE_PRESSED .
If on a button, expose the role as |
AXValue: 1 |
aria-pressed ="mixed" (state) |
Set the STATE_SYSTEM_PRESSED state.
IAccessible2: If on a button, expose the role as |
Expose as
|
Expose STATE_INDETERMINATE /STATE_SYSTEM_MIXED .
If on a button, expose the role as |
AXValue: 2 |
aria-pressed ="false" (state) |
Clear the STATE_SYSTEM_PRESSED state
IAccessible2: If on a button, expose the role as |
Expose as
|
If on a button, expose the role as ROLE_TOGGLE_BUTTON . |
AXValue: 0 |
aria-pressed is undefined (state) (default) |
Not mapped* | Not mapped* | Not mapped* | Not mapped* |
aria-readonly ="true" |
Expose as For elements with |
Set For elements with |
For elements with |
|
aria-readonly ="false" (default) |
IAccessible2: Expose IA2_STATE_EDITABLE |
Set Value.IsReadOnly="false" |
Expose STATE_EDITABLE |
AXValue : the accessibilityIsAttributeSettable method returns YES . |
aria-relevant ="additions" , "removals" , "text" , or "all" |
IAccessible2:
|
Expose as relevant=<value> in AriaProperties |
Expose as object attribute Expose as object attribute |
AXARIARelevant: <value> |
aria-relevant ="additions text" (Default) |
IAccessible2:
|
Expose as relevant=additions text in AriaProperties |
Expose as object attribute Expose as object attribute |
AXARIARelevant: <value> |
aria-required ="true" |
IAccessible2: Expose IA2_STATE_REQUIRED |
Expose as IsrequiredForForm property. |
Expose STATE_REQUIRED |
boolean AXRequired: YES |
aria-required ="false" (default) |
Not mapped* | Not mapped* | Not mapped* | Not mapped* |
[ARIA 1.1] aria-roledescription |
Expose the description string in IAccessible2 localizedExtendedRole property. |
Localized Control Type is <value> . |
Expose the description string in object attribute roledescription:<value> . |
AXRoleDescription: '<value>' . |
aria-selected ="true" (state) |
Expose STATE_SYSTEM_SELECTED
Expose IAccessible2: If not |
Expose IsSelected property on SelectionItem Control Pattern.
The availability of the |
Expose STATE_SELECTED and STATE_SELECTABLE .
If not |
boolean AXSelected: YES |
aria-selected ="false" (state) |
Clear STATE_SYSTEM_SELECTED
Expose IAccessible2: If not |
Not mapped | Clear STATE_SELECTED and expose STATE_SELECTABLE . |
boolean AXSelected: NO |
aria-selected is undefined (state) (default)
– If role is option or tab treat as false . |
Not mapped | Not mapped | Not mapped | Not mapped |
aria-setsize
– If not provided for relevant roles, user agents calculate aria-setsize and aria-posinset for each object in the container based on the number of objects in the DOM. |
IAccessible2: Expose object attribute |
Expose as |
Expose object attribute |
AXARIASetSize: <value> |
aria-sort ="ascending", "descending" , or "other" |
IAccessible2: Expose as object attribute sort:<value> |
Expose as If on an element that maps to |
Expose as object attribute sort:<value> |
AXSortDirection: AXAscendingSortDirection | AXDescendingSortDirection | AXUnknownSortDirection |
aria-sort ="none" (default) |
IAccessible2: If specified, expose as object attribute sort:<value> |
Not mapped* | If specified, expose as object attribute sort:<value> |
Not mapped* |
aria-valuemax |
IAccessible2: Expose via AccessibleValue interface.
See Widget values for additional information |
Expose the Maximum property in RangeValue Control Pattern
See Widget values for additional information |
Expose via AccessibleValue interface.
See Widget values for additional information |
number AXMaxValue
See Widget values for additional information |
aria-valuemin |
IAccessible2: Expose via AccessibleValue interface
See Widget values for additional information |
Expose the Minimum property in RangeValue Control Pattern
See Widget values for additional information |
Expose via AccessibleValue interface
See Widget values for additional information |
number AXMinValue
See Widget values for additional information |
aria-valuenow |
If aria-valuetext is not defined, expose via IAccessible::get_accValue
IAccessible2: Expose via See Widget values for additional information |
Expose Value property in RangeValue Control Pattern
See Widget values for additional information |
Expose via AccessibleValue interface.
See Widget values for additional information |
number AXValue
See Widget values for additional information |
aria-valuetext |
Expose via IAccessible::get_accValue
IAccessible2: Expose as object attribute See Widget values for additional information |
Expose Value property in Value Control Pattern which can co-exist with RangeValue Control Pattern.
See Widget values for additional information |
Expose as object attribute valuetext:<value> See Widget values for additional information |
AXValueDescription: <value>
See Widget values for additional information |
When computing an accessible name or accessible description, user agents MUST conform to the section titled Text Alternative Computation of the Accessible Name and Description Computation and API Mappings specification.
Some WAI-ARIA roles are widgets that have a particular value within a range of values. For example progressbar
, spinbutton
, and slider
use aria-valuemin
and aria-valuemax
to specify the range of valid values, aria-valuenow
to specify the current value, and optionally aria-valuetext
to specify a text string equivalent for the current value.
If the value is not set on a control that requires value, then user agents SHOULD return an error when the current value is requested.
When assistive technology requests the current value, user agents are not required to ensure that aria-valuenow
is greater than aria-valuemin
and less than aria-valuemax
.
If an element has the aria-valuetext
property set, but not aria-valuenow
, user agents MUST expose the string value of aria-valuetext
as specified in State and Property Mapping.
Often in a GUI, there are relationships between the widgets that can be exposed programmatically to assistive technology. WAI-ARIA provides several relationship properties which are globally applicable to any element: aria-controls
, aria-describedby
, aria-flowto
, aria-labelledby
, aria-owns
, aria-posinset
, and aria-setsize
. Therefore, it is not important to check the role before computing them. User agents can simply map these relations to accessibility APIs as defined in the section titled State and Property Mapping.
User agents SHOULD ignore ID references that do not match the ID of another element in the same document.
It is the web author's responsibility to ensure that IDs are unique. If more than one element has the same ID, the user agent SHOULD use the first element found with the given ID. The behavior will be the same as getElementById
.
If the same element is specified multiple times in a single WAI-ARIA relation, user agents SHOULD return multiple pointers to the same object.
aria-activedescendant
is defined as referencing only a single ID reference. Any aria-activedescendant
value that does not match an existing IDREF exactly is an author error and will not match any element in the DOM.
A reverse relation exists when an element's ID is referenced by a property in another element. For APIs that support reverse relations, user agents MUST use the mapping defined in the following table when an element's ID is referenced by a relation property of another element and the referenced element is in the accessibility tree according to the rules in General rules for exposing WAI-ARIA semantics. All WAI-ARIA references must point to an element that is exposed as an accessible object in the accessibility tree. When the referenced object is not exposed in the accessibility tree (e.g. because it is hidden), the reference is null. aria-labelledby
and aria-described
by have an additional feature, which allows them to pull a flattened string from the referenced element to populate the name or description fields of the accessibility API. This feature is described in the Name and Description section.
WAI-ARIA Relation | IAccessible2 | ATK/AT-SPI |
---|---|---|
aria-controls references the element's ID |
IA2_RELATION_CONTROLLED_BY |
RELATION_CONTROLLED_BY |
aria-describedby references the element's ID |
IA2_RELATION_DESCRIPTION_FOR |
RELATION_DESCRIPTION_FOR |
aria-flowto references the element's ID |
IA2_RELATION_FLOW_FROM |
RELATION_FLOW-FROM |
aria-labelledby references the element's ID |
IA2_RELATION_LABEL_FOR |
RELATION_LABEL_FOR |
aria-owns references the element's ID |
IA2_RELATION_NODE_CHILD_OF/IA2_RELATION_NODE_PARENT_OF |
RELATION_NODE_CHILD_OF/RELATION_NODE_PARENT_OF |
Special case: If both aria-labelledby
and HTML <label for= … >
are used, the user agent MUST use the WAI-ARIA relation and MUST ignore the HTML label relation.
Note that aria-describedby
may reference structured or interactive information where users would want to be able to navigate to different sections of content. User agents MAY provide a way for the user to navigate to structured information referenced by aria-describedby
and assistive technology SHOULD provide such a method.
In addition to the explicit relations defined by WAI-ARIA properties, reverse relations are implied in two other situations: elements with role="treeitem"
where the ancestor does not have an aria-owns
property and descendants of elements with aria-atomic
property.
In the case of role="treeitem"
, when aria-owns
is not used, user agents SHOULD do the following where reverse relations are supported by the API:
treeitem
uses aria-level
, then walk backwards in the tree until a treeitem
is found with a lower aria-level
, then set RELATION_NODE_CHILD_OF
to that element. If the top of the tree is reached, then set RELATION_NODE_CHILD_OF
to the tree element itself.treeitem
has a role of group
, then walk backwards from the group
until an element with a role of treeitem
is found, then set RELATION_NODE_CHILD_OF
to that element.In the case of aria-atomic
, where reverse relations are supported by the API:
aria-atomic
="true"
. If found, user agents SHOULD set the RELATION_MEMBER_OF
relation to point to the ancestor that sets aria-atomic
="true"
.aria-level
, aria-posinset
, and aria-setsize
are all 1-based. When the property is not present or is "0", it indicates the property is not computed or not supported. If any of these properties are specified by the author as either "0" or a negative number, user agents SHOULD use "1" instead.
If aria-level
is not provided or inherited for an element of role treeitem
, user agents implementing IAccessible2 or ATK/AT-SPI MUST compute it by following the explicit or computed RELATION_NODE_CHILD_OF
relations.
If aria-posinset
and aria-setsize
are not provided, user agents MUST compute them as follows:
role="treeitem"
, walk the tree backward and forward until the explicit or computed level becomes less than the current item's level. Count items only if they are at the same level as the current item.aria-posinset
, include the current item and other group items if they are before the current item in the DOM. For aria-setsize
, add to that the number of items in the same group after the current item in the DOM.MSAA/IAccessible2 API mappings involve an additional function, groupPosition()
[[IAccessible2]], when aria-level
, aria-posinset
, and/or aria-setsize
are present on an element, or are computed by the user agent. When this occurs:
aria-level
is exposed in the groupLevel
parameter of groupPosition()
,aria-setsize
is exposed in the similarItemsInGroup
parameter, andaria-posinset
is exposed in the positionInGroup
parameter.As part of mapping roles to accessible objects as defined in Role Mapping, users agents expose a default action on the object.
DoDefaultAction
on an accessible object, the user agent SHOULD simulate a click on the DOM element which is mapped to that accessible object.IAccessibleAction
on an accessible object, the user agent SHOULD simulate a click on the DOM element which is mapped to that accessible object.AXPress
action on an accessible object, the user agent SHOULD simulate a click on the DOM element which is mapped to that accessible object.Authors will need to create handlers for those click events that update WAI-ARIA states and properties in the DOM accordingly, so that those updated states can be populated by the user agent in the Accessibility API.
User agents fire events for user actions, WAI-ARIA state changes, changes to document content or node visibility, changes in selection and operation of menus as defined in the following sections.
User agents MUST notify assistive technology of state changes as defined in the table below, SHOULD notify assistive technology of property changes if the accessibility API defines a change event for the property, and SHOULD NOT notify assistive technology of property changes if the accessibility API does not define a change event for the property. For example, IAccessible2 defines an event to be used when aria-activedescendant
changes. WAI-ARIA properties that are expected to change include aria-activedescendant
, aria-valuenow
, and aria-valuetext
.
See the Name and Description Change Events section of the Accessible Name and Description Computation document regarding how different accessibility APIs expose changes to accessible name and accessible description properties.
In some APIs, AT will only be notified of events to which it has subscribed.
For simplicity and performance the user agent MAY trim out change events for state or property changes that assistive technologies typically ignore, such as events that are happening in a window that does not currently have focus.
Translators: For label text associated with the following table and its toggle buttons, see the mappingTableLabels
object in the <head>
section of this document.
State or Property | MSAA + IAccessible2 event | UIA event | ATK/AT-SPI event | AXAPI Notification |
---|---|---|---|---|
aria-activedescendant |
See Controlling focus with In addition: IAccessible2: |
See Controlling focus with aria-activedescendant |
See Controlling focus with aria-activedescendant |
See Controlling focus with aria-activedescendant
In addition: |
aria-busy (state) |
EVENT_OBJECT_STATECHANGE |
PropertyChangedEvent |
object:state-changed:busy |
AXElementBusyChanged |
aria-checked (state) |
EVENT_OBJECT_STATECHANGE |
ToggleStateProperty as part of toggle pattern |
object:state-changed:checked |
AXValueChanged |
[ARIA 1.1] aria-current (state) |
(TBD) EVENT_OBJECT_STATECHANGE |
(TBD) | object:state-changed:active |
TBD |
aria-disabled (state) |
EVENT_OBJECT_STATECHANGE |
Not mapped | object:state-changed:enabled and object:state-changed:sensitive |
Not mapped |
aria-describedby |
See the Name and Description Change Events section in [[!ACCNAME-AAM]]. | See the Name and Description Change Events section in [[!ACCNAME-AAM]]. | See the Name and Description Change Events section in [[!ACCNAME-AAM]]. | See the Name and Description Change Events section in [[!ACCNAME-AAM]]. |
aria-dropeffect (property) |
IAccessible2: IA2_EVENT_OBJECT_ATTRIBUTE_CHANGED |
Not mapped | object:property-change |
Not mapped |
aria-expanded (state) |
EVENT_OBJECT_STATECHANGE |
expand /collapse pattern events |
object:state-changed:expanded |
AXRowExpanded ,AXRowCollapsed ,AXRowCountChanged |
aria-grabbed (state) |
IAccessible2: |
Not mapped | object:property-change |
Not mapped |
aria-invalid (state) |
EVENT_OBJECT_STATECHANGE |
Not mapped | object:state-changed:invalid_entry |
AXInvalidStatusChanged |
aria-label and aria-labelledby |
See the Name and Description Change Events section in [[!ACCNAME-AAM]]. | See the Name and Description Change Events section in [[!ACCNAME-AAM]]. | See the Name and Description Change Events section in [[!ACCNAME-AAM]]. | See the Name and Description Change Events section in [[!ACCNAME-AAM]]. |
aria-pressed (state) |
EVENT_OBJECT_STATECHANGE |
Not mapped | object:state-changed:pressed |
Not mapped |
aria-readonly |
EVENT_OBJECT_STATECHANGE |
Not mapped | object:state-changed:readonly |
Not mapped |
aria-required |
EVENT_OBJECT_STATECHANGE |
Not mapped | object:state-changed:required |
Not mapped |
aria-selected (state) |
See section Selection for details. | See section Selection for details. | See section Selection for details. | See section Selection for details. |
aria-valuenow |
EVENT_OBJECT_VALUECHANGE |
ValueProperty property change as part of value pattern |
object:property-change:accessible-value |
AXValueChanged |
aria-valuetext |
EVENT_OBJECT_VALUECHANGE |
Not mapped | object:property-change:accessible-value |
AXValueChanged |
Processing document changes is important regardless of WAI-ARIA. The events described in the table below are used by user agents to inform AT of changes to the DOM via the accessibility tree. For the purposes of conformance with this standard, user agents MUST implement the behavior described in this section whenever WAI-ARIA attributes are applied to dynamic content on a Web page.
Scenario | MSAA + IAccessible2 event | UIA event | ATK/AT-SPI event | AXAPI Notification |
---|---|---|---|---|
When text is removed | IAccessible2: IA2_EVENT_TEXT_REMOVED |
EVENT_OBJECT_LIVEREGIONCHANGED |
text_changed::delete |
If in a live region, AXLiveRegionChanged |
When text is inserted | IAccessible2: IA2_EVENT_TEXT_INSERTED |
EVENT_OBJECT_LIVEREGIONCHANGED |
text_changed::insert |
If in a live region, AXLiveRegionChanged |
When text is changed | IAccessible2: IA2_EVENT_TEXT_REMOVE and IA2_EVENT_TEXT_INSERTED |
EVENT_OBJECT_LIVEREGIONCHANGED |
text_changed::delete and text_changed::insert |
If in a live region, AXLiveRegionChanged |
Fire these events for node changes where the node in question is an element and has an accessible object:
Scenario | MSAA | Microsoft UIA event | ATK/AT-SPI event | AXAPI Notification |
---|---|---|---|---|
When an accessibility subtree is hidden | EVENT_OBJECT_HIDE The MSAA event called EVENT_OBJECT_DESTROY is not used because this has a history of stability issues and assistive technology avoids it. In any case, from the user's point of view, there is no difference between something that is hidden or destroyed.
|
AutomationElement..::.StructureChangedEvent |
children_changed::remove |
If in a live region, |
When an accessibility subtree is removed | EVENT_OBJECT_REORDER The MSAA event called EVENT_OBJECT_DESTROY is not used because this has a history of stability issues and assistive technology avoids it. In any case, from the user's point of view, there is no difference between something that is hidden or destroyed.
|
AutomationElement..::.StructureChangedEvent |
children_changed::remove |
If in a live region, |
When an accessibility subtree is shown | EVENT_OBJECT_SHOW |
children_changed::add |
If in a live region, |
|
When an accessibility subtree is inserted | EVENT_OBJECT_REORDER |
children_changed::add |
If in a live region, |
|
When an accessibility subtree is moved | Treat it as a removal from one place and insertion in another | Treat it as a removal from one place and insertion in another | Treat it as a removal from one place and insertion in another |
If in a live region, |
When an accessibility subtree is changed (e.g. replaceNode) | Treat it as a removal and insertion | Treat it as a removal and insertion | Treat it as a removal and insertion |
If in a live region, |
In some cases, node changes may occur where the node is not an element or has no accessible object. For example, a numbered list bullet ("12.") may have a node in the accessibility tree but not in the DOM tree. For text within a paragraph marked in HTML as <strong>
, the <strong>
element has a node in the DOM tree but may not have one in the accessibility tree. The text itself will of course be in the accessibility tree along with the identification of the range of text that is formatted as strong. If any of the changes described in the table above occur on such a node, user agents SHOULD compute and fire relevant text change events as described above.
User agents SHOULD ensure that an assistive technology, running in process can receive notification of a node being removed prior to removal. This allows an assistive technology, such as a screen reader, to refer back to the corresponding DOM node being deleted. This is important for live regions where removals are important. For example, a screen reader would want to notify a user that another user has left a chat room. The event in MSAA would be EVENT_OBJECT_HIDE
. For ATK/AT-SPI this would be children_changed::remove
. And in Mac OS X, the event is AXLiveRegionChanged
. This also requires the user agent to provide a unique ID in the accessibility API notification identifying the unique node being removed.
When firing any of the above-mentioned change events, it is very useful to provide information about whether the change was caused by user input (as opposed to a timeout initiated from the page load, etc.). This allows the assistive technology to have different rules for presenting changes from the real world as opposed to from user action. Mouse hovers are not considered explicit user input because they can occur from accidental bumps of the mouse.
To expose whether a change occurred from user input:
event-from-user-input:true
on the accessible object for the event, if the user caused the change.Exposing additional useful information about the context of the change:
RELATION_MEMBER_OF
relation on the accessible event's target accessible object SHOULD point to any ancestor with aria-atomic
="true"
(if any).container-live
, container-relevant
, container-busy
, container-atomic
object attributes SHOULD be exposed on the accessible event object, providing the computed value for the related WAI-ARIA properties. The computed value is the value of the closest ancestor. It is recommended to not expose the object attribute if the default value is used.Additional MSAA events may be necessary:
ROLE_SYSTEM_ALERT
, then an EVENT_SYSTEM_ALERT
event SHOULD be fired for the alert. The alert role has an implied value of "assertive" for the aria-live
property.There are two cases for selection:
In the single selection case, selection follows focus. User agents MUST fire the following events when aria-selected
changes:
Scenario | MSAA | Microsoft UIA | ATK/AT-SPI | AXAPI |
---|---|---|---|---|
Focus change | EVENT_OBJECT_SELECTION and EVENT_OBJECT_STATECHANGE on newly focused item. |
UIA_SelectionItem_ElementSelectedEventId on the newly focused element.
If on a |
object:selection_changed on the current container. |
AXSelectedChildrenChanged |
The multiple selection case occurs when aria-multiselectable
="true"
on an element with a role that supports that property. User agents MUST fire the following events when aria-selected
changes on a descendant, as follows:
The multiple selection case occurs when aria-multiselectable
="true"
on an element with a role that supports that property. There are several important aspects:
Selection
and SelectionItem
Control Patterns expose the selection availability, state, and methods.aria-selected
changes on a descendant, as follows:Scenario | MSAA | Microsoft UIA | ATK/AT-SPI | AXAPI |
---|---|---|---|---|
Toggle aria-selected |
EVENT_OBJECT_SELECTIONADD /EVENT_OBJECT_SELECTIONREMOVE on the item. |
SelectionItem Control Pattern :UIA_SelectionItem_ElementAddedToSelectionEventId or UIA_SelectionItem_ElementRemovedFromSelectionEventId on the current container. |
object:selection_changed on the current container. |
AXSelectedChildrenChanged |
Selection follows focus | EVENT_OBJECT_SELECTION and EVENT_OBJECT_STATECHANGE on newly focused item. |
FocusChangedEvent should be fired but individual selection event may not happen, to avoid redundancy. |
object:selection_changed on the current container. |
AXSelectedChildrenChanged |
Select or deselect many items at once | User agent MAY fire an EVENT_OBJECT_SELECTIONWITHIN . If this event is fired the other events noted above MAY be trimmed out for performance. |
For each element selected or deselected, fire SelectionItem Control Pattern: UIA_SelectionItem_ElementAddedToSelectionEventId or UIA_SelectionItem_ElementRemovedFromSelectionEventId on the current container. User agents MAY choose to fire the Selection Control Pattern Invalidated event, which indicates that the selection in a container has changed significantly and requires sending more addition and removal events than the InvalidateLimit constant permits. |
The user agent MAY fire a single object:selection_changed event on the container, vs. multiple events, for performance. |
AXSelectedChildrenChanged |
This section is normative.
This section might be removed in a future version.
Support for attribute selectors MUST include WAI-ARIA attributes. For example, .fooMenuItem[aria-haspop="true"] would select all elements with class fooMenuItem
, and WAI-ARIA property aria-haspopup
with value of true
. The presentation MUST be updated for dynamic changes to WAI-ARIA attributes. This allows authors to match styling with WAI-ARIA semantics.