ARIA 1.1 Testing Wiki Pages
Introduction
Assumptions about Testing ARIA 1.1 Features
- For new, non-global properties: We need a test for each role that supports that new property.
- Rationale: We cannot assume that user agents use our taxonomy programmatically in their implementations. Thus for non-global properties, there's an excellent chance t we won't get the implementation "for free"; instead, user agents will likely have to add new support on a per-role basis.
- For new, global properties: We just need to test one representative role, plus any role for which there is special/custom behavior related to that property.
- Rationale: Global properties without role-specific special/custom behavior is something we can assume user agents will not be implementing on a per-role basis. Thus because the implementation itself is likely to be global, exhaustive testing is not needed.
- For new roles: We just need to test non-global properties supported on those roles.
- Rationale: See rationales 1 and 2 above.
Overview
- The following testable statements are the tests needed for exiting ARIA 1.1 Candidate Recommendation
- These statements are based on ARIA 1.1 Change Log
- The wiki format for test cases is based on Fred Esch's work on SVG test cases
- That format has been extended to allow for improved readability and increased ability to ensure test automation works seamlessly across all platforms that support it. The format in use in this file is:
=== UNIQUE NAME FOR THE TEST ===
* List documenting purpose of test
; // name of thing(s) being tested (can be used as name of test case)
<pre>
if given
<element>some HTML fragment
</element>
then CONDITIONS FOR TEST
</pre>
{| class="wikitable"
#### OPTIONAL
|-
|colspan=5|element ELEMENT_ID
|-
|colspan=5|attribute ELEMENT_ID:ATTR_NAME set "value"
|-
|colspan=5|attribute ELEMENT_ID:ATTR_OTHER_NAME clear
####
|-
|rowspan=NUMBER OF CONDITIONS|NAME OF API
|TEST CLASS
|TEST TYPE
|ASSERTION TYPE
|VALUE
... etc...
|}
- "NAME OF API" is one of (MSAA, AXAPI, UIA, IAccessible2, or ATK)
- "TEST CLASS" is one of (property, result, event, or TBD (to be determined))
- "TEST TYPE" is dependent upon "TEST CLASS"
- PROPERTY then one of (name, description, childCount, role, subrole, parentID, relations, states, controlPatterns, interfaces, or objectAttributes)
- RESULT then an expression or method call (e.g., atk_selection_clear_selection())
- EVENT @@@TODO@@@
- ASSERTION TYPE is one of (is, isNot, contains, doesNotContain, isType, isAny)
- VALUE is the value or values to evaluate using ASSERTION TYPE. If multiple values, enclose in brackets and separate with commas (e.g. [value1, value2, value3])
The TEST CLASS of event is special in that the each occurrence of the TEST TYPE type establishes a context for the next event rows in the table. Each subsequent event row is an assertion about an event of the type referenced in that first special row. That context continues until the end of the table, until a row that is NOT an event assertion, or until a row that is an event but with a TEST TYPE of type.
There can be more than one element being tested in an assertion table. When there is, each group of assertions should begin with a row specifying that ID.
NOTE: All of these things are extensible. The list of PROPERTY values, for example, will surely need to be expanded over time as additional platform ATTAs are implemented.
Example (Dont Generate)
When the selected item changes in a listbox, ATK/AT-SPI2 expects the following:
- object:selection-changed emitted by the listbox
- object:state-changed:selected, with detail1 = 0 emitted by the item(s) which became unselected
- object:state-changed:selected, with detail1 = 1 emitted by the item(s) which became selected
To test this, we could use the following markup and table:
<div id="test" role="listbox" tabindex="0" aria-activedescendant="item1" >
<div id="item1" role="option" aria-selected="true">First</div>
<div id="item2" role="option" aria-selected="false">Second</div>
</div>
attribute item1:aria-selected "false"
|
attribute item2:aria-selected "true"
|
attribute item2:aria-hidden none
|
element test
|
ATK
|
event
|
type
|
is
|
object:selection-changed
|
element item1
|
ATK
|
property
|
states
|
doesNotContain
|
STATE_SELECTED
|
event
|
type
|
is
|
object:state-changed:selected
|
event
|
detail1
|
is
|
0
|
element item2
|
ATK
|
property
|
states
|
contains
|
STATE_SELECTED
|
event
|
type
|
is
|
object:state-changed:selected
|
event
|
detail1
|
is
|
1
|
The first two rows in the above table specify that both ARIA properties should be changed before proceeding with the test assertions, i.e. as a single step. The rows that follow identify the element being tested, any expected changes to accessible properties, and the expected accessibility events that element should emit.
aria-activedescendant (HAS NOTES)
In ARIA 1.1, aria-activedescendant became a supported property of application. It also became a supported property of searchbox as a consequence of the creation of a new role which subclasses textbox.
Documentation:
NOTE 1: aria-activedescendant is an attribute that has exposure and associated events. The test below includes both. In fact, it begins with the change. Joanie thinks it might be worthwhile to separate tests for exposure and tests for changes/events because the latter does not necessarily happen as a direct consequence of the former.
NOTE 2: Another change related to application occurred in ARIA 1.1, namely application is no longer a landmark. Joanie does not believe any mappings will change as a result, but if mappings were to change the change would almost certainly be platform-role-related. Since the test below for the property includes role information, we should have sufficient coverage for both changes.
application activedescendant
if given
<div id='test' tabindex="0" aria-activedescendant="bob" role='application'>
<div id='bob' role='group'>Hello world</div>
</div>
then role:application, aria-activedescendant: bob
event test:focus
|
element test
|
ATK
|
property
|
role
|
is
|
ROLE_EMBEDDED
|
property
|
states
|
doesNotContain
|
STATE_FOCUSED
|
property
|
states
|
contains
|
STATE_FOCUSABLE
|
AXAPI
|
property
|
AXRole
|
is
|
AXGroup
|
property
|
AXSubrole
|
is
|
AXWebApplication
|
property
|
AXRoleDescription
|
is
|
web application
|
property
|
AXFocused
|
is
|
false
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_APPLICATION
|
property
|
states
|
doesNotContain
|
STATE_SYSTEM_FOCUSED
|
property
|
states
|
contains
|
STATE_SYSTEM_FOCUSABLE
|
UIA
|
property
|
ControlType
|
is
|
Pane
|
property
|
LocalizedControlType
|
is
|
application
|
property
|
IUIAutomationElement.UIA_IsKeyboardFocusablePropertyId
|
is
|
true
|
property
|
IUIAutomationElement.UIA_HasKeyboardFocusPropertyId
|
is
|
false
|
element bob
|
MSAA
|
property
|
states
|
contains
|
STATE_SYSTEM_FOCUSED
|
property
|
states
|
contains
|
STATE_SYSTEM_FOCUSABLE
|
ATK
|
property
|
states
|
contains
|
STATE_FOCUSED
|
property
|
states
|
contains
|
STATE_FOCUSABLE
|
UIA
|
property
|
IUIAutomationElement.UIA_IsKeyboardFocusablePropertyId
|
is
|
true
|
property
|
IUIAutomationElement.UIA_HasKeyboardFocusPropertyId
|
is
|
true
|
AXAPI
|
property
|
AXFocused
|
is
|
true
|
result
|
AXUIElementIsAttributeSettable(AXFocused)
|
is
|
true
|
application activedescendant value changes
if given
<div id='test' tabindex="0" role='application'>
<div id='bob' role='group'>Hello world</div>
</div>
then role:application, aria-activedescendant: bob generates a state change event
event test:focus
|
attribute test:aria-activedescendant "bob"
|
element test
|
ATK
|
property
|
role
|
is
|
ROLE_EMBEDDED
|
property
|
states
|
doesNotContain
|
STATE_FOCUSED
|
property
|
states
|
contains
|
STATE_FOCUSABLE
|
AXAPI
|
property
|
AXRole
|
is
|
AXGroup
|
property
|
AXSubrole
|
is
|
AXWebApplication
|
property
|
AXRoleDescription
|
is
|
web application
|
property
|
AXFocused
|
is
|
false
|
result
|
AXUIElementIsAttributeSettable(AXFocused)
|
is
|
true
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_APPLICATION
|
property
|
states
|
doesNotContain
|
STATE_SYSTEM_FOCUSED
|
property
|
states
|
contains
|
STATE_SYSTEM_FOCUSABLE
|
IAccessible2
|
event
|
type
|
is
|
EVENT_OBJECT_FOCUS
|
UIA
|
property
|
ControlType
|
is
|
Pane
|
property
|
LocalizedControlType
|
is
|
application
|
property
|
IUIAutomationElement.UIA_IsKeyboardFocusablePropertyId
|
is
|
true
|
property
|
IUIAutomationElement.UIA_HasKeyboardFocusPropertyId
|
is
|
false
|
element bob
|
MSAA
|
property
|
states
|
contains
|
STATE_SYSTEM_FOCUSED
|
property
|
states
|
contains
|
STATE_SYSTEM_FOCUSABLE
|
event
|
type
|
is
|
EVENT_OBJECT_FOCUS
|
ATK
|
property
|
states
|
contains
|
STATE_FOCUSED
|
property
|
states
|
contains
|
STATE_FOCUSABLE
|
event
|
type
|
is
|
object:state-changed:focused
|
event
|
detail1
|
is
|
1
|
UIA
|
property
|
IUIAutomationElement.UIA_IsKeyboardFocusablePropertyId
|
is
|
true
|
property
|
IUIAutomationElement.UIA_HasKeyboardFocusPropertyId
|
is
|
true
|
event
|
type
|
is
|
UIA_AutomationFocusChangedEventId
|
AXAPI
|
property
|
AXFocused
|
is
|
true
|
result
|
AXUIElementIsAttributeSettable(AXFocused)
|
is
|
true
|
event
|
type
|
is
|
AXFocusedUIElementChanged
|
searchbox activedescendant
if given
<div id='test' tabindex="0" aria-activedescendant="bob" role='searchbox'>
<div id='bob' role='group'>Hello world</div>
</div>
then role:searchbox, aria-activedescendant: bob
event test:focus
|
element test
|
ATK
|
property
|
role
|
is
|
ROLE_ENTRY
|
property
|
states
|
contains
|
STATE_SINGLE_LINE
|
property
|
interfaces
|
contains
|
EditableText
|
property
|
states
|
doesNotContain
|
STATE_FOCUSED
|
property
|
states
|
contains
|
STATE_FOCUSABLE
|
AXAPI
|
property
|
AXRole
|
is
|
AXTextField
|
property
|
AXSubrole
|
is
|
AXSearchField
|
property
|
AXRoleDescription
|
is
|
search text field
|
property
|
AXFocused
|
is
|
false
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_TEXT
|
property
|
states
|
doesNotContain
|
STATE_SYSTEM_FOCUSED
|
property
|
states
|
contains
|
STATE_SYSTEM_FOCUSABLE
|
IAccessible2
|
property
|
objectAttributes
|
contains
|
text-input-type:search
|
UIA
|
property
|
ControlType
|
is
|
Edit
|
property
|
LocalizedControlType
|
is
|
search box
|
property
|
IUIAutomationElement.UIA_IsKeyboardFocusablePropertyId
|
is
|
true
|
property
|
IUIAutomationElement.UIA_HasKeyboardFocusPropertyId
|
is
|
false
|
element bob
|
MSAA
|
property
|
states
|
contains
|
STATE_SYSTEM_FOCUSED
|
property
|
states
|
contains
|
STATE_SYSTEM_FOCUSABLE
|
ATK
|
property
|
states
|
contains
|
STATE_FOCUSED
|
property
|
states
|
contains
|
STATE_FOCUSABLE
|
UIA
|
property
|
IUIAutomationElement.UIA_IsKeyboardFocusablePropertyId
|
is
|
true
|
property
|
IUIAutomationElement.UIA_HasKeyboardFocusPropertyId
|
is
|
true
|
AXAPI
|
property
|
AXFocused
|
is
|
true
|
result
|
AXUIElementIsAttributeSettable(AXFocused)
|
is
|
true
|
searchbox activedescendant value changes
if given
<div id='test' tabindex="0" role='searchbox'>
<div id='bob' role='group'>Hello world</div>
</div>
then role:searchbox, aria-activedescendant: bob
event test:focus
|
attribute test:aria-activedescendant "bob"
|
element test
|
ATK
|
property
|
role
|
is
|
ROLE_ENTRY
|
property
|
states
|
contains
|
STATE_SINGLE_LINE
|
property
|
interfaces
|
contains
|
EditableText
|
property
|
states
|
doesNotContain
|
STATE_FOCUSED
|
property
|
states
|
contains
|
STATE_FOCUSABLE
|
AXAPI
|
property
|
AXRole
|
is
|
AXTextField
|
property
|
AXSubrole
|
is
|
AXSearchField
|
property
|
AXRoleDescription
|
is
|
search text field
|
property
|
AXFocused
|
is
|
false
|
result
|
AXUIElementIsAttributeSettable(AXFocused)
|
is
|
true
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_TEXT
|
property
|
states
|
doesNotContain
|
STATE_SYSTEM_FOCUSED
|
property
|
states
|
contains
|
STATE_SYSTEM_FOCUSABLE
|
IAccessible2
|
property
|
objectAttributes
|
contains
|
text-input-type:search
|
event
|
type
|
is
|
EVENT_OBJECT_FOCUS
|
UIA
|
property
|
ControlType
|
is
|
Edit
|
property
|
LocalizedControlType
|
is
|
search box
|
property
|
IUIAutomationElement.UIA_IsKeyboardFocusablePropertyId
|
is
|
true
|
property
|
IUIAutomationElement.UIA_HasKeyboardFocusPropertyId
|
is
|
false
|
element bob
|
MSAA
|
property
|
states
|
contains
|
STATE_SYSTEM_FOCUSED
|
property
|
states
|
contains
|
STATE_SYSTEM_FOCUSABLE
|
event
|
type
|
is
|
EVENT_OBJECT_FOCUS
|
ATK
|
property
|
states
|
contains
|
STATE_FOCUSED
|
property
|
states
|
contains
|
STATE_FOCUSABLE
|
event
|
type
|
is
|
object:state-changed:focused
|
event
|
detail1
|
is
|
1
|
UIA
|
property
|
IUIAutomationElement.UIA_IsKeyboardFocusablePropertyId
|
is
|
true
|
property
|
IUIAutomationElement.UIA_HasKeyboardFocusPropertyId
|
is
|
true
|
event
|
type
|
is
|
UIA_AutomationFocusChangedEventId
|
AXAPI
|
property
|
AXFocused
|
is
|
true
|
result
|
AXUIElementIsAttributeSettable(AXFocused)
|
is
|
true
|
event
|
type
|
is
|
AXFocusedUIElementChanged
|
aria-autocomplete
In ARIA 1.1, aria-autocomplete became a supported property of searchbox as a consequence of the creation of a new role which subclasses textbox.
Documentation:
searchbox autocomplete inline
if given
<div id="test" role="searchbox" aria-autocomplete="inline"></div>
then for the element with id="test" expose role="searchbox" and autocomplete="inline"
ATK
|
property
|
role
|
is
|
ROLE_ENTRY
|
property
|
objectAttributes
|
contains
|
autocomplete:inline
|
property
|
states
|
contains
|
STATE_SUPPORTS_AUTOCOMPLETION
|
AXAPI
|
property
|
AXRole
|
is
|
AXTextField
|
property
|
AXSubrole
|
is
|
AXSearchField
|
property
|
AXRoleDescription
|
is
|
search text field
|
property
|
autocomplete
|
is
|
<nil>
|
UIA
|
property
|
ControlType
|
is
|
Edit
|
property
|
LocalizedControlType
|
is
|
search box
|
property
|
autocomplete
|
is
|
inline
|
IAccessible2
|
property
|
role
|
is
|
ROLE_SYSTEM_TEXT
|
property
|
objectAttributes
|
contains
|
text-input-type:search
|
property
|
objectAttributes
|
contains
|
autocomplete:inline
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_TEXT
|
searchbox autocomplete list
if given
<div id="test" role="searchbox" aria-autocomplete="list"></div>
then for the element with id="test" expose role="searchbox" and autocomplete="list"
ATK
|
property
|
role
|
is
|
ROLE_ENTRY
|
property
|
objectAttributes
|
contains
|
autocomplete:list
|
property
|
states
|
contains
|
STATE_SUPPORTS_AUTOCOMPLETION
|
AXAPI
|
property
|
AXRole
|
is
|
AXTextField
|
property
|
AXSubrole
|
is
|
AXSearchField
|
property
|
AXRoleDescription
|
is
|
search text field
|
property
|
autocomplete
|
is
|
<nil>
|
UIA
|
property
|
ControlType
|
is
|
Edit
|
property
|
LocalizedControlType
|
is
|
search box
|
property
|
autocomplete
|
is
|
list
|
IAccessible2
|
property
|
role
|
is
|
ROLE_SYSTEM_TEXT
|
property
|
objectAttributes
|
contains
|
text-input-type:search
|
property
|
objectAttributes
|
contains
|
autocomplete:list
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_TEXT
|
searchbox autocomplete both
if given
<div id="test" role="searchbox" aria-autocomplete="both"></div>
then for the element with id="test" expose role="searchbox" and autocomplete="both"
ATK
|
property
|
role
|
is
|
ROLE_ENTRY
|
property
|
objectAttributes
|
contains
|
autocomplete:both
|
property
|
states
|
contains
|
STATE_SUPPORTS_AUTOCOMPLETION
|
AXAPI
|
property
|
AXRole
|
is
|
AXTextField
|
property
|
AXSubrole
|
is
|
AXSearchField
|
property
|
AXRoleDescription
|
is
|
search text field
|
property
|
autocomplete
|
is
|
<nil>
|
UIA
|
property
|
ControlType
|
is
|
Edit
|
property
|
LocalizedControlType
|
is
|
search box
|
property
|
autocomplete
|
is
|
both
|
IAccessible2
|
property
|
role
|
is
|
ROLE_SYSTEM_TEXT
|
property
|
objectAttributes
|
contains
|
text-input-type:search
|
property
|
objectAttributes
|
contains
|
autocomplete:both
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_TEXT
|
searchbox autocomplete none
if given
<div id="test" role="searchbox" aria-autocomplete="none"></div>
then for the element with id="test" expose role="searchbox" and autocomplete="none"
ATK
|
property
|
role
|
is
|
ROLE_ENTRY
|
property
|
objectAttributes
|
contains
|
autocomplete:none
|
property
|
states
|
doesNotContain
|
STATE_SUPPORTS_AUTOCOMPLETION
|
AXAPI
|
property
|
AXRole
|
is
|
AXTextField
|
property
|
AXSubrole
|
is
|
AXSearchField
|
property
|
AXRoleDescription
|
is
|
search text field
|
property
|
autocomplete
|
is
|
<nil>
|
UIA
|
property
|
ControlType
|
is
|
Edit
|
property
|
LocalizedControlType
|
is
|
search box
|
property
|
autocomplete
|
is
|
none
|
IAccessible2
|
property
|
role
|
is
|
ROLE_SYSTEM_TEXT
|
property
|
objectAttributes
|
contains
|
text-input-type:search
|
property
|
objectAttributes
|
contains
|
autocomplete:none
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_TEXT
|
searchbox autocomplete unspecified
if given
<div id="test" role="searchbox"></div>
then for the element with id="test" expose role="searchbox" and autocomplete="none"
ATK
|
property
|
role
|
is
|
ROLE_ENTRY
|
property
|
states
|
doesNotContain
|
STATE_SUPPORTS_AUTOCOMPLETION
|
AXAPI
|
property
|
AXRole
|
is
|
AXTextField
|
property
|
AXSubrole
|
is
|
AXSearchField
|
property
|
AXRoleDescription
|
is
|
search text field
|
property
|
autocomplete
|
is
|
<nil>
|
UIA
|
property
|
ControlType
|
is
|
Edit
|
property
|
LocalizedControlType
|
is
|
search box
|
property
|
autocomplete
|
is
|
|
IAccessible2
|
property
|
role
|
is
|
ROLE_SYSTEM_TEXT
|
property
|
objectAttributes
|
contains
|
text-input-type:search
|
property
|
objectAttributes
|
contains
|
autocomplete:none
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_TEXT
|
aria-busy
In ARIA 1.1, aria-busy is (more clearly) applicable to all elements. Note that this technically was the case for 1.0. But the text in 1.0 implies busy was intended for live regions, so testing is desired to ensure correct exposure when used by authors on elements which are not live regions -- especially given the new normative requirement that "authors MUST set aria-busy to true if changes to a rendered widget would result in that widget missing required owned elements during the update process."
NOTE: Some of the tests in this section include mappings related to selection. While those mappings are presumably correct, they seem irrelevant to support for (and testing of) aria-busy. Joanie believes tests for a specific change should be limited to those things which are directly related to the ARIA 1.1 change being tested.
Documentation:
grid busy true
if given
<div role="grid" aria-busy="true" id="test">
<div role="row">
<div role="columnheader">shoes</div>
<div role="columnheader">shirts</div>
</div>
<div role="row">
<div role="gridcell">loafers</div>
<div role="gridcell">polo</div>
</div>
<div role="row">
<div role="gridcell">laced</div>
<div role="gridcell">rugby</div>
</div>
</div>
then expose aria-busy="true" and role "grid" on the element with id="test"
ATK
|
property
|
role
|
is
|
ROLE_TABLE
|
property
|
objectAttributes
|
contains
|
xml-roles:grid
|
property
|
interfaces
|
contains
|
Table
|
result
|
atk_selection_clear_selection()
|
is
|
false
|
property
|
states
|
contains
|
STATE_BUSY
|
AXAPI
|
property
|
AXRole
|
is
|
AXTable
|
property
|
AXSubrole
|
is
|
<nil>
|
property
|
AXRoleDescription
|
is
|
table
|
property
|
AXElementBusy
|
is
|
true
|
IAccessible2
|
property
|
objectAttributes
|
contains
|
xml-roles:grid
|
property
|
interfaces
|
contains
|
IAccessibleTable2
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_TABLE
|
property
|
states
|
contains
|
STATE_SYSTEM_BUSY
|
UIA
|
property
|
ControlType
|
is
|
DataGrid
|
property
|
interfaces
|
contains
|
selection pattern
|
result
|
AriaProperties.busy
|
is
|
true
|
grid busy false
if given
<div role="grid" aria-busy="false" id="test">
<div role="row">
<div role="columnheader">shoes</div>
<div role="columnheader">shirts</div>
</div>
<div role="row">
<div role="gridcell">loafers</div>
<div role="gridcell">polo</div>
</div>
<div role="row">
<div role="gridcell">laced</div>
<div role="gridcell">rugby</div>
</div>
</div>
then expose aria-busy="false" and role "grid" on the element with id="test"
ATK
|
property
|
role
|
is
|
ROLE_TABLE
|
property
|
objectAttributes
|
contains
|
xml-roles:grid
|
property
|
interfaces
|
contains
|
Table
|
property
|
interfaces
|
contains
|
Selection
|
result
|
atk_selection_clear_selection()
|
is
|
false
|
property
|
states
|
doesNotContain
|
STATE_BUSY
|
AXAPI
|
property
|
AXRole
|
is
|
AXTable
|
property
|
AXSubrole
|
is
|
<nil>
|
property
|
AXRoleDescription
|
is
|
table
|
property
|
AXElementBusy
|
is
|
false
|
IAccessible2
|
property
|
objectAttributes
|
contains
|
xml-roles:grid
|
property
|
interfaces
|
contains
|
IAccessibleTable2
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_TABLE
|
property
|
states
|
doesNotContain
|
STATE_SYSTEM_BUSY
|
UIA
|
property
|
ControlType
|
is
|
DataGrid
|
property
|
interfaces
|
contains
|
selection pattern
|
result
|
AriaProperties.busy
|
is
|
false
|
grid busy value changes
if given
<div role="grid" aria-busy="false" id="test">
<div role="row">
<div role="columnheader">shoes</div>
<div role="columnheader">shirts</div>
</div>
<div role="row">
<div role="gridcell">loafers</div>
<div role="gridcell">polo</div>
</div>
<div role="row">
<div role="gridcell">laced</div>
<div role="gridcell">rugby</div>
</div>
</div>
then set aria-busy="true" expose aria-busy="true" and role "grid" on the element with id="test" and notify the assistive technology of the aria-busy state change.
attribute test:aria-busy "true"
|
element test
|
ATK
|
event
|
type
|
is
|
object:state-changed:busy
|
event
|
detail1
|
is
|
1
|
property
|
role
|
is
|
ROLE_TABLE
|
property
|
objectAttributes
|
contains
|
xml-roles:grid
|
property
|
interfaces
|
contains
|
Table
|
property
|
interfaces
|
contains
|
Selection
|
result
|
atk_selection_clear_selection()
|
is
|
false
|
property
|
states
|
contains
|
STATE_BUSY
|
AXAPI
|
event
|
type
|
is
|
AXElementBusyChanged
|
property
|
AXRole
|
is
|
AXTable
|
property
|
AXSubrole
|
is
|
<nil>
|
property
|
AXRoleDescription
|
is
|
table
|
property
|
AXElementBusy
|
is
|
true
|
IAccessible2
|
property
|
objectAttributes
|
contains
|
xml-roles:grid
|
property
|
interfaces
|
contains
|
IAccessibleTable2
|
MSAA
|
event
|
type
|
is
|
EVENT_OBJECT_STATECHANGE
|
property
|
role
|
is
|
ROLE_SYSTEM_TABLE
|
property
|
states
|
contains
|
STATE_SYSTEM_BUSY
|
UIA
|
event
|
type
|
is
|
PropertyChangedEvent
|
property
|
ControlType
|
is
|
DataGrid
|
property
|
interfaces
|
contains
|
selection pattern
|
result
|
AriaProperties.busy
|
is
|
true
|
listbox busy true
if given
<ul role="listbox" aria-busy="true" id="test">
<li role="option">option 1</li>
<li role="option">option 2</li>
</ul>
then expose aria-busy="true" and role "listbox" on the element with id="test"
element test
|
ATK
|
property
|
role
|
is
|
ROLE_LIST_BOX
|
property
|
states
|
contains
|
STATE_BUSY
|
AXAPI
|
property
|
AXRole
|
is
|
AXList
|
property
|
AXSubrole
|
is
|
<nil>
|
property
|
AXRoleDescription
|
is
|
list
|
property
|
AXElementBusy
|
is
|
true
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_LISTBOX
|
property
|
states
|
contains
|
STATE_SYSTEM_BUSY
|
UIA
|
property
|
ControlType
|
is
|
List
|
result
|
AriaProperties.busy
|
is
|
true
|
listbox busy false
if given
<ul role="listbox" aria-busy="false" id="test">
<li role="option">option 1</li>
<li role="option">option 2</li>
</ul>
then expose aria-busy="false" and role "listbox" on the element with id="test"
ATK
|
property
|
role
|
is
|
ROLE_LIST_BOX
|
property
|
interfaces
|
contains
|
Selection
|
result
|
atk_selection_clear_selection()
|
is
|
false
|
property
|
states
|
doesNotContain
|
STATE_BUSY
|
AXAPI
|
property
|
AXRole
|
is
|
AXList
|
property
|
AXSubrole
|
is
|
<nil>
|
property
|
AXRoleDescription
|
is
|
list
|
property
|
AXElementBusy
|
is
|
false
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_LISTBOX
|
property
|
states
|
doesNotContain
|
STATE_SYSTEM_BUSY
|
UIA
|
property
|
ControlType
|
is
|
List
|
result
|
AriaProperties.busy
|
is
|
false
|
if given
<div role="menubar" aria-busy="true" id="test">
<div role="menuitem">File</div>
<div role="menuitem">Edit</div>
<div role="menuitem">View</div>
</div>
then expose aria-busy="true" and role "menubar" on the element with id="test"
ATK
|
property
|
role
|
is
|
ROLE_MENU_BAR
|
property
|
objectAttributes
|
contains
|
xml-roles:menubar
|
property
|
states
|
contains
|
STATE_BUSY
|
AXAPI
|
property
|
AXRole
|
is
|
AXMenuBar
|
property
|
AXSubrole
|
is
|
<nil>
|
property
|
AXRoleDescription
|
is
|
menu bar
|
property
|
AXElementBusy
|
is
|
true
|
IAccessible2
|
property
|
objectAttributes
|
contains
|
xml-roles:menubar
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_MENUBAR
|
property
|
states
|
contains
|
STATE_SYSTEM_BUSY
|
UIA
|
property
|
ControlType
|
is
|
MenuBar
|
property
|
interfaces
|
contains
|
selection pattern
|
result
|
AriaProperties.busy
|
is
|
true
|
if given
<div role="menubar" aria-busy="false" id="test">
<div role="menuitem">File</div>
<div role="menuitem">Edit</div>
<div role="menuitem">View</div>
</div>
then expose aria-busy="false" and role "menubar" on the element with id="test"
ATK
|
property
|
role
|
is
|
ROLE_MENU_BAR
|
property
|
objectAttributes
|
contains
|
xml-roles:menubar
|
property
|
states
|
doesNotContain
|
STATE_BUSY
|
AXAPI
|
property
|
AXRole
|
is
|
AXMenuBar
|
property
|
AXSubrole
|
is
|
<nil>
|
property
|
AXRoleDescription
|
is
|
menu bar
|
property
|
AXElementBusy
|
is
|
false
|
IAccessible2
|
property
|
objectAttributes
|
contains
|
xml-roles:menubar
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_MENUBAR
|
property
|
states
|
doesNotContain
|
STATE_SYSTEM_BUSY
|
UIA
|
property
|
ControlType
|
is
|
MenuBar
|
property
|
interfaces
|
contains
|
selection pattern
|
property
|
AriaProperties.busy
|
is
|
false
|
aria-checked
In ARIA 1.1, aria-checked was added as a required property of the (new) switch role.
The spec states: "The mixed value is invalid, and user agents MUST treat a mixed value as equivalent to false for this role."
Documentation:
switch checked true
if given
<div id='test' role='switch' aria-checked='true' tabindex='0'>power</div>
then expose aria-checked="true" and role "switch" on the element with id="test"
ATK
|
property
|
role
|
is
|
ROLE_TOGGLE_BUTTON
|
property
|
states
|
contains
|
STATE_CHECKABLE
|
property
|
states
|
contains
|
STATE_CHECKED
|
AXAPI
|
property
|
AXRole
|
is
|
AXCheckBox
|
property
|
AXSubrole
|
is
|
AXSwitch
|
property
|
AXRoleDescription
|
is
|
switch
|
property
|
AXValue
|
is
|
1
|
MSAA
|
property
|
states
|
contains
|
STATE_SYSTEM_CHECKED
|
IAccessible2
|
property
|
role
|
is
|
IA2_ROLE_TOGGLE_BUTTON
|
property
|
objectAttributes
|
contains
|
xml-roles:switch
|
property
|
objectAttributes
|
contains
|
checkable:true
|
UIA
|
property
|
ControlType
|
is
|
Button
|
property
|
controlPatterns
|
contains
|
Toggle
|
property
|
LocalizedControlType
|
is
|
toggleswitch
|
property
|
Toggle.ToggleState
|
is
|
On
|
switch checked false
if given
<div id='test' role='switch' aria-checked='false' tabindex='0' class='switch'>power</div>
then expose aria-checked="false" and role "switch" on the element with id="test"
ATK
|
property
|
role
|
is
|
ROLE_TOGGLE_BUTTON
|
property
|
states
|
contains
|
STATE_CHECKABLE
|
property
|
states
|
doesNotContain
|
STATE_CHECKED
|
AXAPI
|
property
|
AXRole
|
is
|
AXCheckBox
|
property
|
AXSubrole
|
is
|
AXSwitch
|
property
|
AXRoleDescription
|
is
|
switch
|
property
|
AXValue
|
is
|
0
|
IAccessible2
|
property
|
role
|
is
|
IA2_ROLE_TOGGLE_BUTTON
|
property
|
objectAttributes
|
contains
|
xml-roles:switch
|
property
|
objectAttributes
|
contains
|
checkable:true
|
UIA
|
property
|
ControlType
|
is
|
Button
|
property
|
LocalizedControlType
|
is
|
toggleswitch
|
property
|
Toggle.ToggleState
|
is
|
Off
|
switch checked mixed
The spec states: "The mixed value is invalid, and user agents MUST treat a mixed value as equivalent to false for this role."
if given
<div id='test' role='switch' aria-checked='mixed' tabindex='0' class='switch'>power</div>
then expose the element with id="test" as if aria-checked were false.
ATK
|
property
|
role
|
is
|
ROLE_TOGGLE_BUTTON
|
property
|
states
|
contains
|
STATE_CHECKABLE
|
property
|
states
|
doesNotContain
|
STATE_INDETERMINATE
|
property
|
states
|
doesNotContain
|
STATE_CHECKED
|
AXAPI
|
property
|
AXRole
|
is
|
AXCheckBox
|
property
|
AXSubrole
|
is
|
AXSwitch
|
property
|
AXRoleDescription
|
is
|
switch
|
property
|
AXValue
|
is
|
0
|
IAccessible2
|
property
|
role
|
is
|
IA2_ROLE_TOGGLE_BUTTON
|
property
|
objectAttributes
|
contains
|
xml-roles:switch
|
property
|
objectAttributes
|
contains
|
checkable:true
|
UIA
|
property
|
ControlType
|
is
|
Button
|
property
|
LocalizedControlType
|
is
|
toggleswitch
|
property
|
Toggle.ToggleState
|
is
|
Off
|
switch checked undefined
if given
<div id='test' role='switch' tabindex='0' class='switch'>power</div>
then expose aria-checked="false" and role "switch" on the element with id="test"
ATK
|
property
|
role
|
is
|
ROLE_TOGGLE_BUTTON
|
property
|
states
|
contains
|
STATE_CHECKABLE
|
property
|
states
|
doesNotContain
|
STATE_CHECKED
|
AXAPI
|
property
|
AXRole
|
is
|
AXCheckBox
|
property
|
AXSubrole
|
is
|
AXSwitch
|
property
|
AXRoleDescription
|
is
|
switch
|
property
|
AXValue
|
is
|
0
|
IAccessible2
|
property
|
role
|
is
|
IA2_ROLE_TOGGLE_BUTTON
|
property
|
objectAttributes
|
contains
|
xml-roles:switch
|
property
|
objectAttributes
|
contains
|
checkable:true
|
UIA
|
property
|
ControlType
|
is
|
Button
|
property
|
LocalizedControlType
|
is
|
toggleswitch
|
property
|
Toggle.ToggleState
|
is
|
Off
|
switch checked value changes
If given
<div id='test' role='switch' aria-checked='false' tabindex='0' class='switch'>power</div>
then set aria-checked="true" and expose aria-checked="true" and role "switch" on the element with id="test and notify the aria-checked state has changed
attribute test:aria-checked "true"
|
element test
|
ATK
|
property
|
role
|
is
|
ROLE_TOGGLE_BUTTON
|
property
|
states
|
contains
|
STATE_CHECKABLE
|
property
|
states
|
contains
|
STATE_CHECKED
|
event
|
type
|
is
|
object:state-changed:checked
|
event
|
detail1
|
is
|
1
|
AXAPI
|
event
|
type
|
is
|
AXValueChanged
|
property
|
AXRole
|
is
|
AXCheckBox
|
property
|
AXSubrole
|
is
|
AXSwitch
|
property
|
AXRoleDescription
|
is
|
switch
|
property
|
AXValue
|
is
|
1
|
MSAA
|
event
|
type
|
is
|
EVENT_OBJECT_STATECHANGE
|
IAccessible2
|
property
|
role
|
is
|
IA2_ROLE_TOGGLE_BUTTON
|
property
|
objectAttributes
|
contains
|
xml-roles:switch
|
property
|
objectAttributes
|
contains
|
checkable:true
|
UIA
|
property
|
ControlType
|
is
|
Button
|
property
|
LocalizedControlType
|
is
|
toggleswitch
|
property
|
Toggle.ToggleState
|
is
|
On
|
event
|
type
|
is
|
TogglePattern.ToggleStateProperty
|
aria-colcount and aria-rowcount
The aria-colcount and aria-rowcount properties were added during ARIA 1.1. They are supported on table, grid, and treegrid, and have a value type of integer. The value should reflect the total number of columns and rows respectively. In addition, -1 provides a means for authors to indicate that the total number is unknown and should not be calculated by the user agent.
Documentation:
table colcount 8
if given
<div role="table" id="test" aria-colcount="8">
<div role="row">
<div role="cell" aria-colindex="4">test cell</div>
</div>
</div>
then expose aria-colcount="8" on the element with id="test"
ATK
|
property
|
role
|
is
|
ROLE_TABLE
|
property
|
objectAttributes
|
contains
|
colcount:8
|
result
|
atk_table_get_n_columns()
|
is
|
8
|
AXAPI
|
property
|
AXRole
|
is
|
AXTable
|
property
|
AXARIAColumnCount
|
is
|
8
|
IAccessible2
|
property
|
interfaces
|
contains
|
IAccessibleTable2
|
property
|
objectAttributes
|
contains
|
colcount:8
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_TABLE
|
UIA
|
property
|
ControlType
|
is
|
Table
|
property
|
Table.ColumnCount
|
is
|
8
|
grid colcount 8
if given
<div role="grid" id="test" aria-colcount="8">
<div role="row">
<div role="gridcell" aria-colindex="4">test cell</div>
</div>
</div>
then expose aria-colcount="8" on the element with id="test"
ATK
|
property
|
role
|
is
|
ROLE_TABLE
|
property
|
objectAttributes
|
contains
|
xml-roles:grid
|
property
|
objectAttributes
|
contains
|
colcount:8
|
result
|
atk_table_get_n_columns()
|
is
|
8
|
AXAPI
|
property
|
AXRole
|
is
|
AXTable
|
property
|
AXARIAColumnCount
|
is
|
8
|
IAccessible2
|
property
|
role
|
is
|
ROLE_SYSTEM_TABLE
|
property
|
interfaces
|
contains
|
IAccessibleTable2
|
property
|
objectAttributes
|
contains
|
xml-roles:grid
|
property
|
objectAttributes
|
contains
|
colcount:8
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_TABLE
|
UIA
|
property
|
ControlType
|
is
|
DataGrid
|
property
|
DataGrid.ColumnCount
|
is
|
8
|
treegrid colcount 8
if given
<div id="test" role="treegrid" aria-colcount="8">
<div role="row">
<div role="cell" aria-colindex="4">test cell</div>
</div>
</div>
then expose aria-colcount="8" on the element with id="test"
ATK
|
property
|
role
|
is
|
ROLE_TREE_TABLE
|
property
|
objectAttributes
|
contains
|
colcount:8
|
result
|
atk_table_get_n_columns()
|
is
|
8
|
AXAPI
|
property
|
AXRole
|
is
|
AXTable
|
property
|
AXARIAColumnCount
|
is
|
8
|
IAccessible2
|
property
|
role
|
is
|
ROLE_SYSTEM_OUTLINE
|
property
|
interfaces
|
contains
|
IAccessibleTable2
|
property
|
objectAttributes
|
contains
|
colcount:8
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_OUTLINE
|
UIA
|
property
|
ControlType
|
is
|
DataGrid
|
property
|
DataGrid.ColumnCount
|
is
|
8
|
table colcount -1
if given
<div role="table" id="test" aria-colcount="-1">
<div role="row">
<div role="cell" aria-colindex="4" >test cell</div>
</div>
</div>
then the value exposed for colcount should be not calculated by the user agent
ATK
|
property
|
role
|
is
|
ROLE_TABLE
|
property
|
objectAttributes
|
contains
|
colcount:-1
|
result
|
atk_table_get_n_columns()
|
is
|
-1
|
AXAPI
|
property
|
AXRole
|
is
|
AXTable
|
property
|
AXARIAColumnCount
|
is
|
-1
|
IAccessible2
|
property
|
role
|
is
|
ROLE_SYSTEM_TABLE
|
property
|
interfaces
|
contains
|
IAccessibleTable2
|
property
|
objectAttributes
|
contains
|
colcount:-1
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_TABLE
|
UIA
|
property
|
ControlType
|
is
|
Table
|
property
|
Table.ColumnCount
|
is
|
-1
|
table rowcount 3
if given
<div role='table' id='test' aria-rowcount='3' aria-colcount='2'>
<div role='row'>
<span role='cell'>cheese</span>
</div>
</div>
then expose aria-rowcount="3" on the element with id="test"
ATK
|
property
|
role
|
is
|
ROLE_TABLE
|
property
|
objectAttributes
|
contains
|
rowcount:3
|
result
|
atk_table_get_n_rows()
|
is
|
3
|
AXAPI
|
property
|
AXRole
|
is
|
AXTable
|
property
|
AXARIARowCount
|
is
|
3
|
IAccessible2
|
property
|
role
|
is
|
ROLE_SYSTEM_TABLE
|
property
|
interfaces
|
contains
|
IAccessibleTable2
|
property
|
objectAttributes
|
contains
|
rowcount:3
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_TABLE
|
UIA
|
property
|
ControlType
|
is
|
Table
|
property
|
Table.RowCount
|
is
|
3
|
grid rowcount 3
if given
<div role='grid' id='test' aria-rowcount='3' aria-colcount='2'>
<div role='row'>
<span role='gridcell'>
<button>hello</button>
</span>
</div>
</div>
then expose role: grid, colcount: 2, rowcount: 3
ATK
|
property
|
role
|
is
|
ROLE_TABLE
|
property
|
objectAttributes
|
contains
|
xml-roles:grid
|
property
|
objectAttributes
|
contains
|
rowcount:3
|
result
|
atk_table_get_n_rows()
|
is
|
3
|
AXAPI
|
property
|
AXRole
|
is
|
AXTable
|
property
|
AXARIARowCount
|
is
|
3
|
IAccessible2
|
property
|
role
|
is
|
ROLE_SYSTEM_TABLE
|
property
|
interfaces
|
contains
|
IAccessibleTable2
|
property
|
objectAttributes
|
contains
|
xml-roles:grid
|
property
|
objectAttributes
|
contains
|
rowcount:3
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_TABLE
|
UIA
|
property
|
ControlType
|
is
|
DataGrid
|
property
|
DataGrid.RowCount
|
is
|
3
|
treegrid rowcount 3
if given
<div role='treegrid' id='test' aria-rowcount='3' aria-colcount='2'>
<div role='row'>
<span role='gridcell'>
<button>hello</button>
</span>
</div>
</div>
then expose role: treegrid, colcount: 2, rowcount: 3
ATK
|
property
|
role
|
is
|
ROLE_TREE_TABLE
|
property
|
objectAttributes
|
contains
|
rowcount:3
|
result
|
atk_table_get_n_rows()
|
is
|
3
|
AXAPI
|
property
|
AXRole
|
is
|
AXTable
|
property
|
AXARIARowCount
|
is
|
3
|
IAccessible2
|
property
|
role
|
is
|
ROLE_SYSTEM_OUTLINE
|
property
|
interfaces
|
contains
|
IAccessibleTable2
|
property
|
objectAttributes
|
contains
|
rowcount:3
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_OUTLINE
|
UIA
|
property
|
ControlType
|
is
|
DataGrid
|
property
|
DataGrid.RowCount
|
is
|
3
|
table rowcount -1
if given
<div role='table' id='test' aria-rowcount='-1' aria-colcount='2'>
<div role='row'>
<span role='cell'>
<button>hello</button>
</span>
</div>
</div>
then the rowcount should not be calculated by the user agent
ATK
|
property
|
role
|
is
|
ROLE_TABLE
|
property
|
objectAttributes
|
contains
|
rowcount:-1
|
result
|
atk_table_get_n_rows()
|
is
|
-1
|
AXAPI
|
property
|
AXRole
|
is
|
AXTable
|
property
|
AXARIARowCount
|
contains
|
-1
|
IAccessible2
|
property
|
role
|
is
|
ROLE_SYSTEM_TABLE
|
property
|
interfaces
|
contains
|
IAccessibleTable2
|
property
|
objectAttributes
|
contains
|
xml-roles:table
|
property
|
objectAttributes
|
contains
|
rowcount:-1
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_TABLE
|
UIA
|
property
|
ControlType
|
is
|
Table
|
property
|
Table.RowCount
|
is
|
-1
|
aria-colindex and aria-rowindex
The aria-colindex and aria-rowindex properties were added during ARIA 1.1. They are supported on cell, gridcell, columnheader, rowheader, and row and have a value type of integer.
Documentation:
cell colindex 4
if given
<div role="table">
<div role="row">
<div id="test" role="cell" aria-colindex="4" aria-colcount="8">test cell</div>
</div>
</div>
then expose aria-colindex="4" on the element with id="test"
ATK
|
property
|
role
|
is
|
ROLE_TABLE_CELL
|
property
|
objectAttributes
|
contains
|
colindex:4
|
result
|
atk_table_cell_get_position()
|
contains
|
column=3
|
AXAPI
|
property
|
AXRole
|
is
|
AXCell
|
property
|
AXARIAColumnIndex
|
is
|
4
|
IAccessible2
|
property
|
role
|
is
|
ROLE_SYSTEM_CELL
|
property
|
interfaces
|
contains
|
IAccessibleTableCell
|
property
|
objectAttributes
|
contains
|
colindex:4
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_CELL
|
UIA
|
property
|
ControlType
|
is
|
DataItem
|
property
|
TableItem.Column
|
is
|
3
|
gridcell colindex 4
if given
<div role="grid">
<div role="row">
<div id="test" role="gridcell" aria-colindex="4" aria-colcount="8">test cell</div>
</div>
</div>
then expose aria-colindex="4" on the element with id="test"
ATK
|
property
|
role
|
is
|
ROLE_TABLE_CELL
|
property
|
objectAttributes
|
contains
|
colindex:4
|
result
|
atk_table_cell_get_position()
|
contains
|
column=3
|
AXAPI
|
property
|
AXRole
|
is
|
AXCell
|
property
|
AXARIAColumnIndex
|
is
|
4
|
IAccessible2
|
property
|
role
|
is
|
ROLE_SYSTEM_CELL
|
property
|
interfaces
|
contains
|
IAccessibleTableCell
|
property
|
objectAttributes
|
contains
|
colindex:4
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_CELL
|
UIA
|
property
|
ControlType
|
is
|
DataItem
|
property
|
DataItem.Column
|
is
|
3
|
columnheader colindex 4
if given
<div role="table">
<div role="row">
<div id="test" role="columnheader" aria-colindex="4" aria-colcount="8">test cell</div>
</div>
</div>
then expose aria-colindex="4" on the element with id="test"
ATK
|
property
|
role
|
is
|
ROLE_COLUMN_HEADER
|
property
|
objectAttributes
|
contains
|
colindex:4
|
result
|
atk_table_cell_get_position()
|
contains
|
column=3
|
AXAPI
|
property
|
AXRole
|
is
|
AXCell
|
property
|
AXARIAColumnIndex
|
is
|
4
|
IAccessible2
|
property
|
role
|
is
|
ROLE_SYSTEM_COLUMNHEADER
|
property
|
interfaces
|
contains
|
IAccessibleTableCell
|
property
|
objectAttributes
|
contains
|
colindex:4
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_COLUMNHEADER
|
UIA
|
property
|
ControlType
|
is
|
HeaderItem
|
property
|
Column
|
is
|
3
|
if given
<div role="table">
<div role="row">
<div id="test" role="rowheader" aria-colindex="4" aria-colcount="8">test cell</div>
</div>
</div>
then expose aria-colindex="4" on the element with id="test"
ATK
|
property
|
role
|
is
|
ROLE_ROW_HEADER
|
property
|
objectAttributes
|
contains
|
colindex:4
|
result
|
atk_table_cell_get_position()
|
contains
|
column=3
|
AXAPI
|
property
|
AXRole
|
is
|
AXCell
|
property
|
AXARIAColumnIndex
|
is
|
4
|
IAccessible2
|
property
|
role
|
is
|
ROLE_SYSTEM_ROWHEADER
|
property
|
interfaces
|
contains
|
IAccessibleTableCell
|
property
|
objectAttributes
|
contains
|
colindex:4
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_ROWHEADER
|
UIA
|
property
|
ControlType
|
is
|
HeaderItem
|
property
|
Column
|
is
|
3
|
row colindex 4
if given
<div role="table">
<div id="test" role="row" aria-colindex="4">
<div id="cell" role="cell">test cell</div>
</div>
</div>
then expose aria-colindex="4"
element test
|
ATK
|
property
|
role
|
is
|
ROLE_TABLE_ROW
|
property
|
objectAttributes
|
contains
|
colindex:4
|
AXAPI
|
property
|
AXRole
|
is
|
AXRow
|
IAccessible2
|
property
|
role
|
is
|
ROLE_SYSTEM_ROW
|
property
|
objectAttributes
|
contains
|
colindex:4
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_ROW
|
UIA
|
property
|
ControlType
|
is
|
DataItem
|
property
|
Column
|
is
|
3
|
element cell
|
ATK
|
property
|
role
|
is
|
ROLE_TABLE_CELL
|
result
|
atk_table_cell_get_position()
|
contains
|
column=3
|
AXAPI
|
property
|
AXRole
|
is
|
AXCell
|
property
|
AXARIAColumnIndex
|
is
|
4
|
UIA
|
property
|
ControlType
|
is
|
DataItem
|
property
|
Column
|
is
|
3
|
cell rowindex 4
if given
<div role="table">
<div role="row">
<div id="test" role="cell" aria-rowindex="4">test cell</div>
</div>
</div>
then expose aria-rowindex="4" on the element with id="test"
ATK
|
property
|
role
|
is
|
ROLE_TABLE_CELL
|
property
|
objectAttributes
|
contains
|
rowindex:4
|
result
|
atk_table_cell_get_position()
|
contains
|
row=3
|
AXAPI
|
property
|
AXRole
|
is
|
AXCell
|
property
|
AXARIARowIndex
|
is
|
4
|
IAccessible2
|
property
|
role
|
is
|
ROLE_SYSTEM_CELL
|
property
|
objectAttributes
|
contains
|
rowindex:4
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_CELL
|
UIA
|
property
|
ControlType
|
is
|
DataItem
|
property
|
Row
|
is
|
3
|
gridcell rowindex 4
if given
<div role="grid">
<div role="row">
<div id="test" role="gridcell" aria-rowindex="4">test cell</div>
</div>
</div>
then expose aria-rowindex = "4" on the element with id="test"
ATK
|
property
|
role
|
is
|
ROLE_TABLE_CELL
|
property
|
objectAttributes
|
contains
|
rowindex:4
|
result
|
atk_table_cell_get_position()
|
contains
|
row=3
|
AXAPI
|
property
|
AXRole
|
is
|
AXCell
|
property
|
AXARIARowIndex
|
is
|
4
|
IAccessible2
|
property
|
role
|
is
|
ROLE_SYSTEM_CELL
|
property
|
objectAttributes
|
contains
|
rowindex:4
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_CELL
|
UIA
|
property
|
ControlType
|
is
|
DataItem
|
property
|
DataItem.Row
|
is
|
3
|
columnheader rowindex 4
if given
<div role="table">
<div role="row">
<div id="test" role="columnheader" aria-rowindex="4">test cell</div>
</div>
</div>
then expose aria-rowindex = "4" on the element with id="test"
ATK
|
property
|
role
|
is
|
ROLE_COLUMN_HEADER
|
property
|
objectAttributes
|
contains
|
rowindex:4
|
result
|
atk_table_cell_get_position()
|
contains
|
row=3
|
AXAPI
|
property
|
AXRole
|
is
|
AXCell
|
property
|
AXARIARowIndex
|
is
|
4
|
IAccessible2
|
property
|
role
|
is
|
ROLE_SYSTEM_COLUMNHEADER
|
property
|
objectAttributes
|
contains
|
rowindex:4
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_COLUMNHEADER
|
UIA
|
property
|
ControlType
|
is
|
HeaderItem
|
property
|
HeaderItem.Row
|
is
|
3
|
if given
<div role="table">
<div role="row">
<div id="test" role="rowheader" aria-rowindex="4">test cell</div>
</div>
</div>
then expose aria-rowindex = "4" on the element with id="test"
ATK
|
property
|
role
|
is
|
ROLE_ROW_HEADER
|
property
|
objectAttributes
|
contains
|
rowindex:4
|
result
|
atk_table_cell_get_position()
|
contains
|
row=3
|
AXAPI
|
property
|
AXRole
|
is
|
AXCell
|
property
|
AXARIARowIndex
|
is
|
4
|
IAccessible2
|
property
|
role
|
is
|
ROLE_SYSTEM_ROWHEADER
|
property
|
objectAttributes
|
contains
|
rowindex:4
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_ROWHEADER
|
UIA
|
property
|
ControlType
|
is
|
HeaderItem
|
property
|
HeaderItem.Row
|
is
|
3
|
row rowindex 4
if given
<div role="table">
<div id="test" role="row" aria-rowindex="4">
<div id="cell" role="cell">test cell</div>
</div>
</div>
then expose aria-rowindex = "4"
element test
|
ATK
|
property
|
role
|
is
|
ROLE_TABLE_ROW
|
property
|
objectAttributes
|
contains
|
rowindex:4
|
AXAPI
|
property
|
AXRole
|
is
|
AXRow
|
IAccessible2
|
property
|
role
|
is
|
ROLE_SYSTEM_ROW
|
property
|
objectAttributes
|
contains
|
rowindex:4
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_ROW
|
UIA
|
property
|
ControlType
|
is
|
DataItem
|
property
|
DataItem.Row
|
is
|
3
|
element cell
|
ATK
|
property
|
role
|
is
|
ROLE_TABLE_CELL
|
result
|
atk_table_cell_get_position()
|
contains
|
row=3
|
AXAPI
|
property
|
AXRole
|
is
|
AXCell
|
property
|
AXARIARowIndex
|
is
|
4
|
UIA
|
property
|
ControlType
|
is
|
DataItem
|
property
|
Row
|
is
|
3
|
aria-colspan and aria-rowspan
The aria-colspan and aria-rowspan properties were added during ARIA 1.1. They are supported on cell, gridcell, columnheader, and rowheader, and have a value type of integer.
The spec also states the following:
- "If aria-colspan is used on an element for which the host language provides an equivalent attribute, user agents must ignore the value of aria-colspan and instead expose the value of the host language's attribute to assistive technologies."
- "If aria-rowspan is used on an element for which the host language provides an equivalent attribute, user agents must ignore the value of aria-rowspan and instead expose the value of the host language's attribute to assistive technologies."
Documentation:
cell aria-colspan 2 on div
if given
<div role="table">
<div role="row">
<div id="test" role="cell" aria-colspan="2">test cell</div>
</div>
</div>
then expose aria-colspan="2" on the element with id="test"
ATK
|
property
|
role
|
is
|
ROLE_TABLE_CELL
|
property
|
objectAttributes
|
contains
|
colspan:2
|
result
|
atk_table_cell_get_row_column_span()
|
contains
|
column_span=2
|
AXAPI
|
property
|
AXRole
|
is
|
AXCell
|
property
|
AXColumnIndexRange.length
|
is
|
2
|
IAccessible2
|
property
|
role
|
is
|
ROLE_SYSTEM_CELL
|
property
|
objectAttributes
|
contains
|
colspan:2
|
property
|
interfaces
|
contains
|
IAccessibleTableCell
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_CELL
|
UIA
|
property
|
ControlType
|
is
|
DataItem
|
property
|
TableItem.ColumnSpan
|
is
|
2
|
cell aria-colspan 2 on td html colspan 3
NOTE: aria-colspan should be ignored if colspan is declared.
if given
<table>
<tr>
<td id="test" colspan="3" aria-colspan="2">test cell</td>
</tr>
</table>
then do not expose the aria-colspan value(2) on the element with id="test"
ATK
|
property
|
role
|
is
|
ROLE_TABLE_CELL
|
property
|
objectAttributes
|
doesNotContain
|
colspan:2
|
result
|
atk_table_cell_get_row_column_span()
|
doesNotContain
|
column_span=2
|
AXAPI
|
property
|
AXRole
|
is
|
AXCell
|
property
|
AXColumnIndexRange.length
|
isNot
|
2
|
IAccessible2
|
property
|
role
|
is
|
ROLE_SYSTEM_CELL
|
property
|
objectAttributes
|
doesNotContain
|
colspan:2
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_CELL
|
UIA
|
property
|
ControlType
|
is
|
DataItem
|
property
|
TableItem.ColumnSpan
|
isNot
|
2
|
cell aria-colspan 2 on td html colspan 3 with three actual columns
NOTE: aria-colspan should be ignored if colspan is declared.
NOTE: This test was added to verify exposure of colspan 3. The previous test cannot reliably be used for this purpose because the rendered table only contains one column, and adding colspan="3" on the td element won't change that. Thus the previous test can only be used to verify that the ARIA value is ignored. This test verifies that not only is the ARIA value ignored, but the value associated with the td element is exposed.
if given
<table>
<tr>
<td>1</td><td>2</td><td>3</td>
</tr>
<tr>
<td id="test" colspan="3" aria-colspan="2">test cell</td>
</tr>
</table>
then do not expose the aria-colspan value(2) on the element with id="test"
ATK
|
property
|
role
|
is
|
ROLE_TABLE_CELL
|
result
|
atk_table_cell_get_row_column_span()
|
contains
|
column_span=3
|
AXAPI
|
property
|
AXRole
|
is
|
AXCell
|
property
|
AXColumnIndexRange.length
|
is
|
3
|
IAccessible2
|
property
|
role
|
is
|
ROLE_SYSTEM_CELL
|
property
|
objectAttributes
|
doesNotContain
|
colspan:2
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_CELL
|
UIA
|
property
|
ControlType
|
is
|
DataItem
|
property
|
TableItem.ColumnSpan
|
is
|
3
|
cell aria-colspan 2 on td html colspan 3 with headers and border
This test was created to ensure we are testing what we think we are testing. For instance, the previous test fails in WebKit not because of lack of implementation, but because the test case's table is so minimal that the element is not being exposed as a cell. It is my assumption that it should be exposed as a cell and have filed https://bugs.webkit.org/show_bug.cgi?id=171178. In the meantime, creating a test with a table with headers and border seems sufficient to pass the "is a real table" test.
NOTE: aria-colspan should be ignored if colspan is declared.
if given
<table border="1">
<tr>
<th>test header 1</th><th>test header 2</th><th>test header 3</th>
</tr>
<tr>
<td id="test" colspan="3" aria-colspan="2">test cell</td>
</tr>
</table>
then do not expose the aria-colspan value(2) on the element with id="test"
ATK
|
property
|
role
|
is
|
ROLE_TABLE_CELL
|
property
|
objectAttributes
|
doesNotContain
|
colspan:2
|
result
|
atk_table_cell_get_row_column_span()
|
contains
|
column_span=3
|
AXAPI
|
property
|
AXRole
|
is
|
AXCell
|
property
|
AXColumnIndexRange.length
|
is
|
3
|
IAccessible2
|
property
|
role
|
is
|
ROLE_SYSTEM_CELL
|
property
|
objectAttributes
|
doesNotContain
|
colspan:2
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_CELL
|
UIA
|
property
|
ControlType
|
is
|
DataItem
|
property
|
TableItem.ColumnSpan
|
is
|
3
|
cell aria-colspan 2 on td with html colspan not specified
NOTE: aria-colspan replaces colspan if colspan is missing.
if given
<table>
<tr>
<td id="test" aria-colspan="2">test cell</td>
</tr>
</table>
then expose aria-colspan="2" on the element with id="test"
ATK
|
property
|
role
|
is
|
ROLE_TABLE_CELL
|
property
|
objectAttributes
|
contains
|
colspan:2
|
result
|
atk_table_cell_get_row_column_span()
|
contains
|
column_span=2
|
AXAPI
|
property
|
AXRole
|
is
|
AXCell
|
property
|
AXColumnIndexRange.length
|
is
|
2
|
IAccessible2
|
property
|
role
|
is
|
ROLE_SYSTEM_CELL
|
property
|
objectAttributes
|
contains
|
colspan:2
|
property
|
interfaces
|
contains
|
IAccessibleTableCell
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_CELL
|
UIA
|
property
|
ControlType
|
is
|
DataItem
|
property
|
TableItem.ColumnSpan
|
is
|
2
|
gridcell aria-colspan 2 on div
if given
<div role="grid">
<div role="row">
<div id="test" role="gridcell" aria-colspan="2">test cell</div>
</div>
</div>
then expose aria-colspan="2" on the element with id="test"
ATK
|
property
|
role
|
is
|
ROLE_TABLE_CELL
|
property
|
objectAttributes
|
contains
|
colspan:2
|
result
|
atk_table_cell_get_row_column_span()
|
contains
|
column_span=2
|
AXAPI
|
property
|
AXRole
|
is
|
AXCell
|
property
|
AXColumnIndexRange.length
|
is
|
2
|
IAccessible2
|
property
|
role
|
is
|
ROLE_SYSTEM_CELL
|
property
|
objectAttributes
|
contains
|
colspan:2
|
property
|
interfaces
|
contains
|
IAccessibleTableCell
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_CELL
|
UIA
|
property
|
ControlType
|
is
|
DataItem
|
property
|
DataItem.ColumnSpan
|
is
|
2
|
columnheader aria-colspan 2 on div
if given
<div role="table">
<div role="row">
<div id="test" role="columnheader" aria-colspan="2">test cell</div>
</div>
</div>
then expose aria-colspan="2" on the element with id="test"
ATK
|
property
|
role
|
is
|
ROLE_COLUMN_HEADER
|
property
|
objectAttributes
|
contains
|
colspan:2
|
result
|
atk_table_cell_get_row_column_span()
|
contains
|
column_span=2
|
AXAPI
|
property
|
AXRole
|
is
|
AXCell
|
property
|
AXColumnIndexRange.length
|
is
|
2
|
IAccessible2
|
property
|
role
|
is
|
ROLE_SYSTEM_COLUMNHEADER
|
property
|
objectAttributes
|
contains
|
colspan:2
|
property
|
interfaces
|
contains
|
IAccessibleTableCell
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_COLUMNHEADER
|
UIA
|
property
|
ControlType
|
is
|
HeaderItem
|
property
|
HeaderItem.ColumnSpan
|
is
|
2
|
columnheader aria-colspan 2 on th html colspan 3
NOTE: aria-colspan should be ignored if colspan is declared.
if given
<table>
<tr>
<th id="test" role="columnheader" colspan="3" aria-colspan="2">test cell</th>
</tr>
</table>
then do not expose the aria-colspan value (2) on the element with id="test"
ATK
|
property
|
role
|
is
|
ROLE_COLUMN_HEADER
|
property
|
objectAttributes
|
doesNotContain
|
colspan:2
|
result
|
atk_table_cell_get_row_column_span()
|
doesNotContain
|
column_span=2
|
AXAPI
|
property
|
AXRole
|
is
|
AXCell
|
property
|
AXColumnIndexRange.length
|
isNot
|
2
|
IAccessible2
|
property
|
role
|
is
|
ROLE_SYSTEM_COLUMNHEADER
|
property
|
objectAttributes
|
doesNotContain
|
colspan:2
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_COLUMNHEADER
|
UIA
|
property
|
ControlType
|
is
|
HeaderItem
|
property
|
HeaderItem.ColumnSpan
|
isNot
|
2
|
columnheader aria-colspan 2 on th html colspan 3 with three actual columns
NOTE: aria-colspan should be ignored if colspan is declared.
NOTE: This test was added to verify exposure of colspan 3. The previous test cannot reliably be used for this purpose because the rendered table only contains one column, and adding colspan="3" on the th element won't change that. Thus the previous test can only be used to verify that the ARIA value is ignored. This test verifies that not only is the ARIA value ignored, but the value associated with the th element is exposed.
if given
<table>
<tr>
<th>1</th><th>2</th><th>3</th>
</tr>
<tr>
<th id="test" role="columnheader" colspan="3" aria-colspan="2">test cell</th>
</tr>
</table>
then do not expose the aria-colspan value(2) on the element with id="test"
ATK
|
property
|
role
|
is
|
ROLE_COLUMN_HEADER
|
result
|
atk_table_cell_get_row_column_span()
|
contains
|
column_span=3
|
AXAPI
|
property
|
AXRole
|
is
|
AXCell
|
property
|
AXColumnIndexRange.length
|
is
|
3
|
IAccessible2
|
property
|
role
|
is
|
ROLE_SYSTEM_COLUMNHEADER
|
property
|
objectAttributes
|
doesNotContain
|
colspan:2
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_COLUMNHEADER
|
UIA
|
property
|
ControlType
|
is
|
HeaderItem
|
property
|
TableItem.ColumnSpan
|
is
|
3
|
columnheader aria-colspan 2 on th with html colspan not specified
NOTE: aria-colspan replaces colspan if colspan is missing.
if given
<table>
<tr>
<th id="test" role="columnheader" aria-colspan="2">test cell</th>
</tr>
</table>
then expose aria-colspan="2" on the element with id="test"
ATK
|
property
|
role
|
is
|
ROLE_COLUMN_HEADER
|
property
|
objectAttributes
|
contains
|
colspan:2
|
result
|
atk_table_cell_get_row_column_span()
|
contains
|
column_span=2
|
AXAPI
|
property
|
AXRole
|
is
|
AXCell
|
property
|
AXColumnIndexRange.length
|
is
|
2
|
IAccessible2
|
property
|
role
|
is
|
ROLE_SYSTEM_COLUMNHEADER
|
property
|
objectAttributes
|
contains
|
colspan:2
|
property
|
interfaces
|
contains
|
IAccessibleTableCell
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_COLUMNHEADER
|
UIA
|
property
|
ControlType
|
is
|
HeaderItem
|
property
|
HeaderItem.ColumnSpan
|
is
|
2
|
if given
<div role="table">
<div role="row">
<div id="test" role="rowheader" aria-colspan="2">test cell</div>
</div>
</div>
then expose aria-colspan="2" on the element with id="test"
ATK
|
property
|
role
|
is
|
ROLE_ROW_HEADER
|
property
|
objectAttributes
|
contains
|
colspan:2
|
result
|
atk_table_cell_get_row_column_span()
|
contains
|
column_span=2
|
AXAPI
|
property
|
AXRole
|
is
|
AXCell
|
property
|
AXColumnIndexRange.length
|
is
|
2
|
IAccessible2
|
property
|
role
|
is
|
ROLE_SYSTEM_ROWHEADER
|
property
|
objectAttributes
|
contains
|
colspan:2
|
property
|
interfaces
|
contains
|
IAccessibleTableCell
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_ROWHEADER
|
UIA
|
property
|
ControlType
|
is
|
HeaderItem
|
property
|
HeaderItem.ColumnSpan
|
is
|
2
|
cell aria-rowspan 2 on div
if given
<div role="table">
<div role="row">
<div id="test" role="cell" aria-rowspan="2">test cell</div>
</div>
</div>
then expose aria-rowspan ="2" on the element with id="test"
ATK
|
property
|
role
|
is
|
ROLE_TABLE_CELL
|
property
|
objectAttributes
|
contains
|
rowspan:2
|
result
|
atk_table_cell_get_row_column_span()
|
contains
|
row_span=2
|
AXAPI
|
property
|
AXRole
|
is
|
AXCell
|
property
|
AXRowIndexRange.length
|
is
|
2
|
IAccessible2
|
property
|
role
|
is
|
ROLE_SYSTEM_CELL
|
property
|
objectAttributes
|
contains
|
rowspan:2
|
property
|
interfaces
|
contains
|
IAccessibleTableCell
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_CELL
|
UIA
|
property
|
ControlType
|
is
|
DataItem
|
property
|
TableItem.RowSpan
|
is
|
2
|
cell aria-rowspan 2 on td html rowspan 3
NOTE: aria-rowspan should be ignored if rowspan is declared.
if given
<table>
<tr>
<td id="test" role="cell" rowspan="3" aria-rowspan="2">test cell</td>
</tr>
</table>
then do not expose the aria-rowspan value (2) on the element with id="test"
ATK
|
property
|
role
|
is
|
ROLE_TABLE_CELL
|
property
|
objectAttributes
|
doesNotContain
|
rowspan:2
|
result
|
atk_table_cell_get_row_column_span()
|
doesNotContain
|
row_span=2
|
AXAPI
|
property
|
AXRole
|
is
|
AXCell
|
property
|
AXRowIndexRange.length
|
isNot
|
2
|
IAccessible2
|
property
|
role
|
is
|
ROLE_SYSTEM_CELL
|
property
|
objectAttributes
|
doesNotContain
|
rowspan:2
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_CELL
|
UIA
|
property
|
ControlType
|
is
|
DataItem
|
property
|
TableItem.RowSpan
|
isNot
|
2
|
cell aria-rowspan 2 on td html rowspan 3 with three actual rows
NOTE: aria-rowspan should be ignored if rowspan is declared.
NOTE: This test was added to verify exposure of rowspan 3. The previous test cannot reliably be used for this purpose because the rendered table only contains one row, and adding rowspan="3" on the td element won't change that. Thus the previous test can only be used to verify that the ARIA value is ignored. This test verifies that not only is the ARIA value ignored, but the value associated with the td element is exposed.
if given
<table>
<tr>
<td>1</td>
<td id="test" role="cell" rowspan="3" aria-rowspan="2">test cell</td>
</tr>
<tr>
<td>2</td>
</tr>
<tr>
<td>3</td>
</tr>
</table>
then do not expose the aria-rowspan value (2) on the element with id="test"
ATK
|
property
|
role
|
is
|
ROLE_TABLE_CELL
|
result
|
atk_table_cell_get_row_column_span()
|
contains
|
row_span=3
|
AXAPI
|
property
|
AXRole
|
is
|
AXCell
|
property
|
AXRowIndexRange.length
|
is
|
3
|
IAccessible2
|
property
|
role
|
is
|
ROLE_SYSTEM_CELL
|
property
|
objectAttributes
|
doesNotContain
|
rowspan:2
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_CELL
|
UIA
|
property
|
ControlType
|
is
|
DataItem
|
property
|
TableItem.RowSpan
|
is
|
3
|
cell aria-rowspan 2 on td with html rowspan not specified
NOTE: aria-rowspan replaces rowspan if rowspan is missing.
if given
<table>
<tr>
<td id="test" role="cell" aria-rowspan="2">test cell</td>
</tr>
</table>
then expose aria-rowspan="2" on the element with id="test"
ATK
|
property
|
role
|
is
|
ROLE_TABLE_CELL
|
property
|
objectAttributes
|
contains
|
rowspan:2
|
result
|
atk_table_cell_get_row_column_span()
|
contains
|
row_span=2
|
AXAPI
|
property
|
AXRole
|
is
|
AXCell
|
property
|
AXRowIndexRange.length
|
is
|
2
|
IAccessible2
|
property
|
role
|
is
|
ROLE_SYSTEM_CELL
|
property
|
objectAttributes
|
contains
|
rowspan:2
|
property
|
interfaces
|
contains
|
IAccessibleTableCell
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_CELL
|
UIA
|
property
|
ControlType
|
is
|
DataItem
|
property
|
TableItem.RowSpan
|
is
|
2
|
gridcell aria-rowspan 2 on div
if given
<div role="grid">
<div role="row">
<div id="test" role="gridcell" aria-rowspan="2">test cell</div>
</div>
</div>
then expose aria-rowspan ="2" on the element with id="test"
ATK
|
property
|
role
|
is
|
ROLE_TABLE_CELL
|
property
|
objectAttributes
|
contains
|
rowspan:2
|
result
|
atk_table_cell_get_row_column_span()
|
contains
|
row_span=2
|
AXAPI
|
property
|
AXRole
|
is
|
AXCell
|
property
|
AXRowIndexRange.length
|
is
|
2
|
IAccessible2
|
property
|
role
|
is
|
ROLE_SYSTEM_CELL
|
property
|
objectAttributes
|
contains
|
rowspan:2
|
property
|
interfaces
|
contains
|
IAccessibleTableCell
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_CELL
|
UIA
|
property
|
ControlType
|
is
|
DataItem
|
property
|
DataItem.RowSpan
|
is
|
2
|
columnheader aria-rowspan 2 on div
if given
<div role="table">
<div role="row">
<div id="test" role="columnheader" aria-rowspan="2">test cell</div>
</div>
</div>
then expose aria-rowspan ="2" on the element with id="test"
ATK
|
property
|
role
|
is
|
ROLE_COLUMN_HEADER
|
property
|
objectAttributes
|
contains
|
rowspan:2
|
result
|
atk_table_cell_get_row_column_span()
|
contains
|
row_span=2
|
AXAPI
|
property
|
AXRole
|
is
|
AXCell
|
property
|
AXRowIndexRange.length
|
is
|
2
|
IAccessible2
|
property
|
role
|
is
|
ROLE_SYSTEM_COLUMNHEADER
|
property
|
objectAttributes
|
contains
|
rowspan:2
|
property
|
interfaces
|
contains
|
IAccessibleTableCell
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_COLUMNHEADER
|
UIA
|
property
|
ControlType
|
is
|
HeaderItem
|
property
|
HeaderItem.RowSpan
|
is
|
2
|
columnheader aria-rowspan 2 on th html rowspan 3
NOTE: aria-rowspan should be ignored if rowspan is declared.
if given
<table>
<tr>
<th id="test" role="columnheader" rowspan="3" aria-rowspan="2">test cell</th>
</tr>
</table>
then do not expose the aria-rowspan value (2) on the element with id="test"
ATK
|
property
|
role
|
is
|
ROLE_COLUMN_HEADER
|
property
|
objectAttributes
|
doesNotContain
|
rowspan:2
|
result
|
atk_table_cell_get_row_column_span()
|
doesNotContain
|
row_span=2
|
AXAPI
|
property
|
AXRole
|
is
|
AXCell
|
property
|
AXRowIndexRange.length
|
isNot
|
2
|
IAccessible2
|
property
|
role
|
is
|
ROLE_SYSTEM_COLUMNHEADER
|
property
|
objectAttributes
|
doesNotContain
|
rowspan:2
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_COLUMNHEADER
|
UIA
|
property
|
ControlType
|
is
|
HeaderItem
|
property
|
HeaderItem.RowSpan
|
isNot
|
2
|
columnheader aria-rowspan 2 on th html rowspan 3 with three actual rows
NOTE: aria-rowspan should be ignored if rowspan is declared.
NOTE: This test was added to verify exposure of rowspan 3. The previous test cannot reliably be used for this purpose because the rendered table only contains one row, and adding rowspan="3" on the th element won't change that. Thus the previous test can only be used to verify that the ARIA value is ignored. This test verifies that not only is the ARIA value ignored, but the value associated with the th element is exposed.
if given
<table>
<tr>
<th>1</th>
<th id="test" role="columnheader" rowspan="3" aria-rowspan="2">test cell</th>
</tr>
<tr>
<th>2</th>
</tr>
<tr>
<th>3</th>
</tr>
</table>
then do not expose the aria-rowspan value (2) on the element with id="test"
ATK
|
property
|
role
|
is
|
ROLE_COLUMN_HEADER
|
result
|
atk_table_cell_get_row_column_span()
|
contains
|
row_span=3
|
AXAPI
|
property
|
AXRole
|
is
|
AXCell
|
property
|
AXRowIndexRange.length
|
is
|
3
|
IAccessible2
|
property
|
role
|
is
|
ROLE_SYSTEM_COLUMNHEADER
|
property
|
objectAttributes
|
doesNotContain
|
rowspan:2
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_COLUMNHEADER
|
UIA
|
property
|
ControlType
|
is
|
HeaderItem
|
property
|
HeaderItem.RowSpan
|
is
|
3
|
columnheader aria-rowspan 2 on th with html rowspan not specified
NOTE: aria-rowspan replaces rowspan if rowspan is missing.
if given
<table>
<tr>
<th id="test" role="columnheader" aria-rowspan="2">test cell</th>
</tr>
</table>
then expose aria-rowspan="2" on the element with id="test"
ATK
|
property
|
role
|
is
|
ROLE_COLUMN_HEADER
|
property
|
objectAttributes
|
contains
|
rowspan:2
|
result
|
atk_table_cell_get_row_column_span()
|
contains
|
row_span=2
|
AXAPI
|
property
|
AXRole
|
is
|
AXCell
|
property
|
AXRowIndexRange.length
|
is
|
2
|
IAccessible2
|
property
|
role
|
is
|
ROLE_SYSTEM_COLUMNHEADER
|
property
|
objectAttributes
|
contains
|
rowspan:2
|
property
|
interfaces
|
contains
|
IAccessibleTableCell
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_COLUMNHEADER
|
UIA
|
property
|
ControlType
|
is
|
HeaderItem
|
property
|
HeaderItem.RowSpan
|
is
|
2
|
if given
<div role="table">
<div role="row">
<div id="test" role="rowheader" aria-rowspan="2">test cell</div>
</div>
</div>
then expose aria-rowspan ="2" on the element with id="test"
ATK
|
property
|
role
|
is
|
ROLE_ROW_HEADER
|
property
|
objectAttributes
|
contains
|
rowspan:2
|
result
|
atk_table_cell_get_row_column_span()
|
contains
|
row_span=2
|
AXAPI
|
property
|
AXRole
|
is
|
AXCell
|
property
|
AXRowIndexRange.length
|
is
|
2
|
IAccessible2
|
property
|
role
|
is
|
ROLE_SYSTEM_ROWHEADER
|
property
|
objectAttributes
|
contains
|
rowspan:2
|
property
|
interfaces
|
contains
|
IAccessibleTableCell
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_ROWHEADER
|
UIA
|
property
|
ControlType
|
is
|
HeaderItem
|
property
|
HeaderItem.RowSpan
|
is
|
2
|
aria-controls
In ARIA 1.1, aria-controls went from a supported to a required attribute for combobox.
QUESTION: Is this really testable? There is no implicit value. The property was supported on combobox in 1.0, so we do not need to test that. There is nothing in the ARIA spec regarding what user agents need to do if the author fails to provide a value.
ANSWER: The is an author requirement, and the tests are only for user agent requirements. That said, user agents are required to ignore an invalid aria-controls when it has an invalid ID:
User agents MUST NOT expose WAI-ARIA attributes that reference unresolved IDs.
Note that this is true for all IDREF valued aria-attributes. That is, aria-controls is not unique in this regard, but let's test it just to be sure.
Documentation:
combobox controls an invalid ID
The test case makes the assumption that the intended (correct) value for aria-controls is the listbox with id="myID", but is intentionally set to "fakeID" here for testing.
if given
<div id="test" role="combobox" aria-controls="fakeID" aria-owns="myID" aria-expanded="true" aria-haspopup="listbox"><span role="textbox">option 3</span></div>
<div role="listbox" id="myID">
<div role="option">option 1</div>
<div role="option">option 2</div>
<div role="option">option 3</div>
</div>
then ignore aria-controls on the element with id="test"
element test
|
ATK
|
property
|
relations
|
doesNotContain
|
RELATION_CONTROLLER_FOR
|
AXAPI
|
property
|
AXLinkedUIElements
|
doesNotContain
|
myID
|
IAccessible2
|
property
|
relations
|
doesNotContain
|
IA2_RELATION_CONTROLLER_FOR
|
UIA
|
property
|
IUIAutomation.ControllerFor
|
doesNotContain
|
myID
|
element myID
|
ATK
|
property
|
relations
|
doesNotContain
|
RELATION_CONTROLLED_BY
|
IAccessible2
|
property
|
relations
|
doesNotContain
|
IA2_RELATION_CONTROLLED_BY
|
aria-current
The aria-current state was added during ARIA 1.1. It is supported on all elements of the base markup, has a value type of token, and supported values of: false (default), true, page, step, location, date, and time. If the attribute is not present or its value is an empty string, the default value of false applies and the aria-current state MUST NOT be exposed by user agents.
Documentation:
aria-current not declared
if given
<ul role="list">
<li id="test" role="listitem">2</li>
</ul>
then the value of aria-current MUST NOT be exposed
ATK
|
property
|
role
|
is
|
ROLE_LIST_ITEM
|
property
|
states
|
doesNotContain
|
STATE_ACTIVE
|
property
|
objectAttributes
|
doesNotContain
|
current:false
|
AXAPI
|
property
|
AXRole
|
is
|
AXGroup
|
property
|
AXARIACurrent
|
is
|
"false"
|
IAccessible2
|
property
|
role
|
is
|
ROLE_SYSTEM_LISTITEM
|
property
|
objectAttributes
|
doesNotContain
|
current:false
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_LISTITEM
|
property
|
states
|
contains
|
STATE_SYSTEM_READONLY
|
UIA
|
property
|
ControlType
|
is
|
ListItem
|
property
|
current
|
is
|
|
aria-current with value unspecified
NOTE: This means property is declared but value is empty.
if given
<ul role="list">
<li id="test" role="listitem" aria-current="">1</li>
</ul>
then expose aria-current = "false" on the element with id="test"
ATK
|
property
|
role
|
is
|
ROLE_LIST_ITEM
|
property
|
states
|
doesNotContain
|
STATE_ACTIVE
|
AXAPI
|
property
|
AXRole
|
is
|
AXGroup
|
property
|
AXARIACurrent
|
is
|
"false"
|
IAccessible2
|
property
|
role
|
is
|
ROLE_SYSTEM_LISTITEM
|
property
|
objectAttributes
|
doesNotContain
|
current:false
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_LISTITEM
|
property
|
states
|
contains
|
STATE_SYSTEM_READONLY
|
UIA
|
property
|
ControlType
|
is
|
ListItem
|
property
|
current
|
is
|
|
aria-current with value true
if given
<ul role="list">
<li id="test" role="listitem" aria-current="true">1</li>
</ul>
then expose aria-current = "true" on the element with id="test"
ATK
|
property
|
role
|
is
|
ROLE_LIST_ITEM
|
property
|
states
|
contains
|
STATE_ACTIVE
|
property
|
objectAttributes
|
contains
|
current:true
|
AXAPI
|
property
|
AXRole
|
is
|
AXGroup
|
property
|
AXARIACurrent
|
is
|
"true"
|
IAccessible2
|
property
|
role
|
is
|
ROLE_SYSTEM_LISTITEM
|
property
|
objectAttributes
|
contains
|
current:true
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_LISTITEM
|
property
|
states
|
contains
|
STATE_SYSTEM_READONLY
|
UIA
|
property
|
ControlType
|
is
|
ListItem
|
property
|
current
|
is
|
"true"
|
aria-current with value page
if given
<div id="test" role="link" aria-current="page">1</div>
then expose aria-current = "page" on the element with id="test"
ATK
|
property
|
role
|
is
|
ROLE_LINK
|
property
|
states
|
contains
|
STATE_ACTIVE
|
property
|
objectAttributes
|
contains
|
current:page
|
AXAPI
|
property
|
AXRole
|
is
|
AXLink
|
property
|
AXARIACurrent
|
is
|
"page"
|
IAccessible2
|
property
|
role
|
is
|
ROLE_SYSTEM_LINK
|
property
|
objectAttributes
|
contains
|
current:page
|
property
|
interfaces
|
contains
|
IAccessibleHypertext
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_LINK
|
property
|
states
|
contains
|
STATE_SYSTEM_LINKED
|
UIA
|
property
|
ControlType
|
is
|
HyperLink
|
property
|
current
|
is
|
"page"
|
aria-current with value step
if given
<div id="test" role="link" aria-current="step">1</div>
then expose aria-current = "step" on the element with id="test"
ATK
|
property
|
role
|
is
|
ROLE_LINK
|
property
|
states
|
contains
|
STATE_ACTIVE
|
property
|
objectAttributes
|
contains
|
current:step
|
AXAPI
|
property
|
AXRole
|
is
|
AXLink
|
property
|
AXARIACurrent
|
is
|
"step"
|
IAccessible2
|
property
|
role
|
is
|
ROLE_SYSTEM_LINK
|
property
|
objectAttributes
|
contains
|
current:step
|
property
|
interfaces
|
contains
|
IAccessibleHypertext
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_LINK
|
property
|
states
|
contains
|
STATE_SYSTEM_LINKED
|
UIA
|
property
|
ControlType
|
is
|
HyperLink
|
property
|
current
|
is
|
"step"
|
aria-current with value location
if given
<div id="test" role="img" aria-current="location">1</div>
then expose aria-current = "location" on the element with id="test"
ATK
|
property
|
role
|
is
|
ROLE_IMAGE
|
property
|
states
|
contains
|
STATE_ACTIVE
|
property
|
objectAttributes
|
contains
|
current:location
|
AXAPI
|
property
|
AXRole
|
is
|
AXImage
|
property
|
AXARIACurrent
|
is
|
"location"
|
IAccessible2
|
property
|
role
|
is
|
ROLE_SYSTEM_GRAPHIC
|
property
|
objectAttributes
|
contains
|
current:location
|
property
|
interfaces
|
contains
|
IAccessibleImage
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_GRAPHIC
|
UIA
|
property
|
ControlType
|
is
|
Image
|
property
|
current
|
is
|
"location"
|
aria-current with value date
if given
<table>
<tr>
<td id="test" role="cell" aria-current="date">1</td>
</tr>
</table>
then expose aria-current = "date" on the element with id="test"
ATK
|
property
|
role
|
is
|
ROLE_TABLE_CELL
|
property
|
states
|
contains
|
STATE_ACTIVE
|
property
|
objectAttributes
|
contains
|
current:date
|
AXAPI
|
property
|
AXRole
|
is
|
AXCell
|
property
|
AXARIACurrent
|
is
|
"date"
|
IAccessible2
|
property
|
role
|
is
|
ROLE_SYSTEM_CELL
|
property
|
objectAttributes
|
contains
|
current:date
|
property
|
interfaces
|
contains
|
IAccessibleTableCell
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_CELL
|
UIA
|
property
|
controlPatterns
|
contains
|
TableItem
|
property
|
current
|
is
|
"date"
|
aria-current with value time
if given
<table>
<tr>
<td id="test" role="cell" aria-current="time">1</td>
</tr>
</table>
then expose aria-current = "time" on the element with id="test"
ATK
|
property
|
role
|
is
|
ROLE_TABLE_CELL
|
property
|
states
|
contains
|
STATE_ACTIVE
|
property
|
objectAttributes
|
contains
|
current:time
|
AXAPI
|
property
|
AXRole
|
is
|
AXCell
|
property
|
AXARIACurrent
|
is
|
"time"
|
IAccessible2
|
property
|
role
|
is
|
ROLE_SYSTEM_CELL
|
property
|
objectAttributes
|
contains
|
current:time
|
property
|
interfaces
|
contains
|
IAccessibleTableCell
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_CELL
|
UIA
|
property
|
controlPatterns
|
contains
|
TableItem
|
property
|
current
|
is
|
"time"
|
aria-current with value changes
https://rawgit.com/w3c/aria/master/core-aam/core-aam.html#event-aria-current
if given
<ul role="list">
<li id="test" role="listitem" aria-current="true">1</li>
<li role="listitem" aria-current="false">2</li>
</ul>
then change aria-current to "false" and then raise attribute changed event and expose aria-current = "false" on the element with id="test"
attribute test:aria-current "false"
|
element test
|
ATK
|
property
|
states
|
doesNotContain
|
STATE_ACTIVE
|
property
|
objectAttributes
|
contains
|
current:false
|
event
|
type
|
is
|
object:state-changed:active
|
event
|
detail1
|
is
|
0
|
IAccessible2
|
property
|
objectAttributes
|
contains
|
current:false
|
event
|
type
|
is
|
IA2_EVENT_OBJECT_ATTRIBUTE_CHANGED
|
AXAPI
|
property
|
AXARIACurrent
|
contains
|
false
|
UIA
|
property
|
current
|
is
|
false
|
event
|
type
|
is
|
PropertyChangedEvent
|
aria-details
The aria-details property was added during ARIA 1.1. It is supported on all elements of the base markup and has a value type of ID reference.
Documentation:
NOTE: While the spec examples show aria-details pointing to a details element, there is no requirement for authors to do so. In order to ensure both conditions are properly supported, both conditions should be tested.
aria-details pointing to details element
if given
<img id="test" src="foo.jpg" aria-details="details">
<details id="details">
<summary>More information at W3.org</summary>
<iframe src="data:text/html,<body>foo</body>"/>
</details>
then for the element of id test expose the aria details relationships on id's test and details
element test
|
ATK
|
relation
|
RELATION_DETAILS
|
is
|
[details]
|
IAccessible2
|
property
|
relations
|
contains
|
IA2_RELATION_DETAILS
|
UIA
|
property
|
IUIAutomationElement.DescribedBy
|
is
|
[details]
|
element details
|
ATK
|
relation
|
RELATION_DETAILS_FOR
|
is
|
[test]
|
IAccessible2
|
property
|
relations
|
contains
|
IA2_RELATION_DETAILS_FOR
|
aria-details pointing to div element
if given
<img id="test" src="foo.jpg" aria-details="details">
<div id="details">
<iframe src="data:text/html,<body>foo</body>"/>
</div>
then for the element of id test expose the aria details relationships on id's test and details
element test
|
ATK
|
relation
|
RELATION_DETAILS
|
is
|
[details]
|
IAccessible2
|
property
|
relations
|
contains
|
IA2_RELATION_DETAILS
|
UIA
|
property
|
IUIAutomationElement.DescribedBy
|
is
|
[details]
|
element details
|
ATK
|
relation
|
RELATION_DETAILS_FOR
|
is
|
[test]
|
IAccessible2
|
property
|
relations
|
contains
|
IA2_RELATION_DETAILS_FOR
|
aria-errormessage
The aria-errormessage property was added during ARIA 1.1. It is supported on all elements of the base markup and has a value type of ID reference.
According to the spec, "Authors must use aria-invalid in conjunction with aria-errormessage. Initially, the object is in a valid state and either has aria-invalid set to false or no aria-invalid attribute, and the element referenced by aria-errormessage is not applicable. If the user enters an invalid value for the object, aria-invalid is set to true to indicate that aria-errormessage is now pertinent."
Documentation:
errormessage object in valid state
NOTE: Valid state means the error message is not applicable.
if given
<div role="form">
<label for="test">date</label><input type="text" id="test" value="April 12" aria-invalid="false" aria-errormessage="error">
<label for="test1">surname</label><input type="text" id="test1">
</div>
<div id="error">
You did not enter a valid date!
</div>
then for the element of id test expose do not expose the aria error message relationships on id's test and error
element test
|
ATK
|
property
|
relations
|
doesNotContain
|
RELATION_ERROR_MESSAGE
|
AXAPI
|
property
|
AXValidationError
|
is
|
<nil>
|
IAccessible2
|
property
|
relations
|
doesNotContain
|
IA2_RELATION_ERROR
|
UIA
|
property
|
IUIAutomationElement.ControllerFor
|
is
|
|
element error
|
ATK
|
property
|
relations
|
doesNotContain
|
RELATION_ERROR_FOR
|
IAccessible2
|
property
|
relations
|
doesNotContain
|
IA2_RELATION_ERROR_FOR
|
errormessage object in invalid state
NOTE: Invalid state means the error message IS applicable.
if given
<div role="form">
<label for="test">date</label><input type="text" id="test" value="foo" aria-invalid="true" aria-errormessage="error">
<label for="test1">surname</label><input type="text" id="test1">
</div>
<div id="error">
You did not enter a valid date!
</div>
then for the element of id test expose the aria error message relationships on id's test and error
element test
|
ATK
|
relation
|
RELATION_ERROR_MESSAGE
|
is
|
[error]
|
AXAPI
|
property
|
AXValidationError
|
is
|
"You did not enter a valid date!"
|
IAccessible2
|
properties
|
relations
|
contains
|
IA2_RELATION_ERROR_MESSAGE
|
UIA
|
property
|
IUIAutomationElement.ControllerFor
|
is
|
error
|
element error
|
ATK
|
relation
|
RELATION_ERROR_FOR
|
is
|
[test]
|
IAccessible2
|
property
|
relations
|
contains
|
IA2_RELATION_ERROR_FOR
|
In ARIA 1.1, aria-haspopup's type became token. Values: true, false (default, unless it's a combobox), dialog, grid, listbox (default for combobox), menu, and tree.
In addition, the following normative statement was added to the ARIA 1.1 spec: "User agents MUST treat any value of aria-haspopup that is not included in the list of allowed values, including an empty string, as if the value false had been provided."
Documentation:
NOTE: aria-haspopup is supported on all roles and has the same default values, unless the role is combobox. Therefore, choosing button as the representative role and also testing combobox seems sufficient.
if given
<div id="test" role="button">
OK
</div>
then for the element of id test expose the button role but do not expose aria-haspopup
element test
|
ATK
|
property
|
role
|
is
|
ROLE_PUSH_BUTTON
|
property
|
objectAttributes
|
doesNotContain
|
haspopup
|
property
|
states
|
doesNotContain
|
STATE_HAS_POPUP
|
AXAPI
|
property
|
AXRole
|
is
|
AXButton
|
property
|
AXSubrole
|
is
|
<nil>
|
property
|
AXRoleDescription
|
is
|
button
|
property
|
actions
|
doesNotContain
|
AXShowMenu
|
UIA
|
property
|
IUIAutomationElement.ControlType
|
is
|
Button
|
property
|
controlPatterns
|
doesNotContain
|
ExpandCollapse
|
IAccessible2
|
property
|
role
|
is
|
ROLE_SYSTEM_PUSHBUTTON
|
property
|
objectAttributes
|
contains
|
haspopup:false
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_PUSHBUTTON
|
property
|
states
|
doesNotContain
|
STATE_SYSTEM_HASPOPUP
|
Note: The ARIA spec says "To provide backward compatibility with ARIA 1.0 content, user agents must treat an aria-haspopup value of true as equivalent to a value of menu."
if given
<div role="button" aria-haspopup="true" id="test">
OK
</div>
then for the element of id test expose the button role and aria-haspopup="menu"
element test
|
ATK
|
property
|
role
|
is
|
ROLE_PUSH_BUTTON
|
property
|
objectAttributes
|
contains
|
haspopup:menu
|
property
|
states
|
contains
|
STATE_HAS_POPUP
|
AXAPI
|
property
|
AXRole
|
is
|
AXPopUpButton
|
property
|
AXSubrole
|
is
|
<nil>
|
property
|
AXRoleDescription
|
is
|
pop up button
|
property
|
actions
|
contains
|
AXShowMenu
|
UIA
|
property
|
IUIAutomationElement.ControlType
|
is
|
Button
|
property
|
controlPatterns
|
contains
|
ExpandCollapse
|
IAccessible2
|
property
|
role
|
is
|
ROLE_SYSTEM_PUSHBUTTON
|
property
|
objectAttributes
|
contains
|
haspopup:menu
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_PUSHBUTTON
|
property
|
states
|
contains
|
STATE_SYSTEM_HASPOPUP
|
if given
<div id="test" role="button" aria-haspopup="false">
OK
</div>
then for the element of id test expose the button role but do not expose aria-haspopup
element test
|
ATK
|
property
|
role
|
is
|
ROLE_PUSH_BUTTON
|
property
|
states
|
doesNotContain
|
STATE_HAS_POPUP
|
AXAPI
|
property
|
AXRole
|
is
|
AXButton
|
property
|
AXSubrole
|
is
|
<nil>
|
property
|
AXRoleDescription
|
is
|
button
|
property
|
actions
|
doesNotContain
|
AXShowMenu
|
UIA
|
property
|
IUIAutomationElement.ControlType
|
is
|
Button
|
property
|
controlPatterns
|
doesNotContain
|
ExpandCollapse
|
IAccessible2
|
property
|
role
|
is
|
ROLE_SYSTEM_PUSHBUTTON
|
property
|
objectAttributes
|
contains
|
haspopup:false
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_PUSHBUTTON
|
property
|
states
|
doesNotContain
|
STATE_SYSTEM_HASPOPUP
|
if given
<div id="test" role="button" aria-haspopup="dialog">
OK
</div>
<div role="dialog">
This is the dialog box
</div>
then for the element of id test expose the button role but aria-haspopup="dialog"
element test
|
ATK
|
property
|
role
|
is
|
ROLE_PUSH_BUTTON
|
property
|
objectAttributes
|
contains
|
haspopup:dialog
|
property
|
states
|
contains
|
STATE_HAS_POPUP
|
AXAPI
|
property
|
AXRole
|
is
|
AXPopUpButton
|
property
|
AXSubrole
|
is
|
<nil>
|
property
|
AXRoleDescription
|
is
|
pop up button
|
property
|
actions
|
contains
|
AXShowMenu
|
UIA
|
property
|
IUIAutomationElement.ControlType
|
is
|
Button
|
property
|
controlPatterns
|
contains
|
ExpandCollapse
|
IAccessible2
|
property
|
role
|
is
|
ROLE_SYSTEM_PUSHBUTTON
|
property
|
objectAttributes
|
contains
|
haspopup:dialog
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_PUSHBUTTON
|
property
|
states
|
contains
|
STATE_SYSTEM_HASPOPUP
|
if given
<div id="test" role="button" aria-haspopup="grid">
OK
</div>
<table role="grid">
<tr>
<th>c1</th><th>c2</th>
</tr>
<tr>
<td>A</td><td>B</td>
</tr>
</table>
then for the element of id test expose the button role but aria-haspopup="grid"
element test
|
ATK
|
property
|
role
|
is
|
ROLE_PUSH_BUTTON
|
property
|
objectAttributes
|
contains
|
haspopup:grid
|
property
|
states
|
contains
|
STATE_HAS_POPUP
|
AXAPI
|
property
|
AXRole
|
is
|
AXPopUpButton
|
property
|
AXSubrole
|
is
|
<nil>
|
property
|
AXRoleDescription
|
is
|
pop up button
|
property
|
actions
|
contains
|
AXShowMenu
|
UIA
|
property
|
IUIAutomationElement.ControlType
|
is
|
Button
|
property
|
controlPatterns
|
contains
|
ExpandCollapse
|
IAccessible2
|
property
|
role
|
is
|
ROLE_SYSTEM_PUSHBUTTON
|
property
|
objectAttributes
|
contains
|
haspopup:grid
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_PUSHBUTTON
|
property
|
states
|
contains
|
STATE_SYSTEM_HASPOPUP
|
if given
<div id="test" role="button" aria-haspopup="listbox">
OK
</div>
<ul role="listbox">
<li tabindex="0" role="option">sprouts</li>
<li tabindex="-1" role="option">cucumbers</li>
</ul>
then for the element of id test expose the button role but aria-haspopup="listbox"
element test
|
ATK
|
property
|
role
|
is
|
ROLE_PUSH_BUTTON
|
property
|
objectAttributes
|
contains
|
haspopup:listbox
|
property
|
states
|
contains
|
STATE_HAS_POPUP
|
AXAPI
|
property
|
AXRole
|
is
|
AXPopUpButton
|
property
|
AXSubrole
|
is
|
<nil>
|
property
|
AXRoleDescription
|
is
|
pop up button
|
property
|
actions
|
contains
|
AXShowMenu
|
UIA
|
property
|
IUIAutomationElement.ControlType
|
is
|
Button
|
property
|
controlPatterns
|
contains
|
ExpandCollapse
|
IAccessible2
|
property
|
role
|
is
|
ROLE_SYSTEM_PUSHBUTTON
|
property
|
objectAttributes
|
contains
|
haspopup:listbox
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_PUSHBUTTON
|
property
|
states
|
contains
|
STATE_SYSTEM_HASPOPUP
|
if given
<div id="test" role="button" aria-haspopup="menu">
OK
</div>
<ul tabindex="0" aria-activedescendant="foo" role="menu">
<li id="foo" tabindex="-1" role="menuitem">sprouts</li>
<li tabindex="-1" role="menuitem">cucumbers</li>
</ul>
then for the element of id test expose the button role but aria-haspopup="menu"
element test
|
ATK
|
property
|
role
|
is
|
ROLE_PUSH_BUTTON
|
property
|
objectAttributes
|
contains
|
haspopup:menu
|
property
|
states
|
contains
|
STATE_HAS_POPUP
|
AXAPI
|
property
|
AXRole
|
is
|
AXPopUpButton
|
property
|
AXSubrole
|
is
|
<nil>
|
property
|
AXRoleDescription
|
is
|
pop up button
|
property
|
actions
|
contains
|
AXShowMenu
|
UIA
|
property
|
IUIAutomationElement.ControlType
|
is
|
Button
|
property
|
controlPatterns
|
contains
|
ExpandCollapse
|
IAccessible2
|
property
|
role
|
is
|
ROLE_SYSTEM_PUSHBUTTON
|
property
|
objectAttributes
|
contains
|
haspopup:menu
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_PUSHBUTTON
|
property
|
states
|
contains
|
STATE_SYSTEM_HASPOPUP
|
if given
<div id="test" role="button" aria-haspopup="tree">
OK
</div>
<ul tabindex="0" aria-activedescendant="foo" role="tree">
<li id="foo" tabindex="-1" role="treeitem">
squash
<ul role="group">
<li tabindex="-1"id="t1" role="treeitem">yellow</li>
<li tabindex="-1"id="t2" role="treeitem">summmer</li>
</ul>
</li>
<li tabindex="-1" role="treeitem">cucumbers</li>
</ul>
then for the element of id test expose the button role but aria-haspopup="tree"
element test
|
ATK
|
property
|
role
|
is
|
ROLE_PUSH_BUTTON
|
property
|
objectAttributes
|
contains
|
haspopup:tree
|
property
|
states
|
contains
|
STATE_HAS_POPUP
|
AXAPI
|
property
|
AXRole
|
is
|
AXPopUpButton
|
property
|
AXSubrole
|
is
|
<nil>
|
property
|
AXRoleDescription
|
is
|
pop up button
|
property
|
actions
|
contains
|
AXShowMenu
|
UIA
|
property
|
IUIAutomationElement.ControlType
|
is
|
Button
|
property
|
controlPatterns
|
contains
|
ExpandCollapse
|
IAccessible2
|
property
|
role
|
is
|
ROLE_SYSTEM_PUSHBUTTON
|
property
|
objectAttributes
|
contains
|
haspopup:tree
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_PUSHBUTTON
|
property
|
states
|
contains
|
STATE_SYSTEM_HASPOPUP
|
if given
<div id="test" role="button" aria-haspopup="foo">
OK
</div>
then for the element of id test expose the button role but do not expose aria-haspopup
element test
|
ATK
|
property
|
role
|
is
|
ROLE_PUSH_BUTTON
|
property
|
objectAttributes
|
contains
|
haspopup:false
|
property
|
states
|
doesNotContain
|
STATE_HAS_POPUP
|
AXAPI
|
property
|
AXRole
|
is
|
AXButton
|
property
|
AXSubrole
|
is
|
<nil>
|
property
|
AXRoleDescription
|
is
|
button
|
property
|
actions
|
doesNotContain
|
AXShowMenu
|
UIA
|
property
|
IUIAutomationElement.ControlType
|
is
|
Button
|
property
|
controlPatterns
|
doesNotContain
|
ExpandCollapse
|
IAccessible2
|
property
|
role
|
is
|
ROLE_SYSTEM_PUSHBUTTON
|
property
|
objectAttributes
|
contains
|
haspopup:false
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_PUSHBUTTON
|
property
|
states
|
doesNotContain
|
STATE_SYSTEM_HASPOPUP
|
if given
<div id="test" role="button" aria-haspopup="">
OK
</div>
then for the element of id test expose the button role but do not expose aria-haspopup
element test
|
ATK
|
property
|
role
|
is
|
ROLE_PUSH_BUTTON
|
property
|
objectAttributes
|
contains
|
haspopup:false
|
property
|
states
|
doesNotContain
|
STATE_HAS_POPUP
|
AXAPI
|
property
|
AXRole
|
is
|
AXButton
|
property
|
AXSubrole
|
is
|
<nil>
|
property
|
AXRoleDescription
|
is
|
button
|
property
|
actions
|
doesNotContain
|
AXShowMenu
|
UIA
|
property
|
IUIAutomationElement.ControlType
|
is
|
Button
|
property
|
controlPatterns
|
doesNotContain
|
ExpandCollapse
|
IAccessible2
|
property
|
role
|
is
|
ROLE_SYSTEM_PUSHBUTTON
|
property
|
objectAttributes
|
contains
|
haspopup:false
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_PUSHBUTTON
|
property
|
states
|
doesNotContain
|
STATE_SYSTEM_HASPOPUP
|
if given
<div aria-label="Tag" id="test" role="combobox" aria-expanded="true" aria-owns="owned_listbox">
<input type="text" aria-autocomplete="list" aria-controls="owned_listbox" aria-activedescendant="selected_option">
</div>
<ul role="listbox" id="owned_listbox">
<li role="option">Zebra</li>
<li role="option" id="selected_option">Zoom</li>
</ul>
then role: combobox, aria-haspopup: "listbox"
element test
|
ATK
|
property
|
role
|
is
|
ROLE_COMBO_BOX
|
property
|
states
|
contains
|
STATE_EXPANDABLE
|
property
|
states
|
contains
|
STATE_EXPANDED
|
property
|
states
|
contains
|
STATE_HAS_POPUP
|
property
|
objectAttributes
|
contains
|
haspopup:listbox
|
AXAPI
|
property
|
AXRole
|
is
|
AXComboBox
|
property
|
AXSubrole
|
is
|
<nil>
|
property
|
AXRoleDescription
|
is
|
combo box
|
property
|
AXExpanded
|
is
|
true
|
property
|
actions
|
contains
|
AXShowMenu
|
IAccessible2
|
property
|
role
|
is
|
ROLE_SYSTEM_COMBOBOX
|
property
|
objectAttributes
|
contains
|
haspopup:listbox
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_COMBOBOX
|
property
|
states
|
contains
|
STATE_SYSTEM_HASPOPUP
|
property
|
states
|
contains
|
STATE_SYSTEM_EXPANDED
|
UIA
|
property
|
ControlType
|
is
|
Combobox
|
property
|
interfaces
|
contains
|
ExpandCollapse pattern
|
property
|
ExpandCollapse.ExpandCollapseState
|
is
|
Expanded
|
if given
<div aria-label="Tag" id="test" aria-haspopup="true" role="combobox" aria-expanded="true" aria-owns="owned_dialog">
<input type="text" aria-autocomplete="list" aria-controls="owned_dialog" aria-activedescendant="selected_cell">
</div>
<div id="owned_dialog" role="dialog">
<div role="radiogroup">
<div role="radio" id="selected_radio" tabindex="-1">R1</div><div role="radio" tabindex="-1">R2</div>
</div>
<div role="button" tabindex="0">ok</div>
</div>
then role: combobox, aria-haspopup: "true"
element test
|
ATK
|
property
|
role
|
is
|
ROLE_COMBO_BOX
|
property
|
states
|
contains
|
STATE_EXPANDABLE
|
property
|
states
|
contains
|
STATE_EXPANDED
|
property
|
states
|
contains
|
STATE_HAS_POPUP
|
property
|
objectAttributes
|
contains
|
haspopup:true
|
AXAPI
|
property
|
AXRole
|
is
|
AXComboBox
|
property
|
AXSubrole
|
is
|
<nil>
|
property
|
AXRoleDescription
|
is
|
combo box
|
property
|
AXExpanded
|
is
|
true
|
property
|
actions
|
contains
|
AXShowMenu
|
IAccessible2
|
property
|
role
|
is
|
ROLE_SYSTEM_COMBOBOX
|
property
|
objectAttributes
|
contains
|
haspopup:true
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_COMBOBOX
|
property
|
states
|
contains
|
STATE_SYSTEM_HASPOPUP
|
property
|
states
|
contains
|
STATE_SYSTEM_EXPANDED
|
UIA
|
property
|
ControlType
|
is
|
Combobox
|
property
|
interfaces
|
contains
|
ExpandCollapse pattern
|
property
|
ExpandCollapse.ExpandCollapseState
|
is
|
Expanded
|
if given
<div aria-label="Tag" id="test" aria-haspopup="false" role="combobox" aria-expanded="true" aria-owns="owned_dialog">
<input type="text" aria-autocomplete="list" aria-controls="owned_dialog" aria-activedescendant="selected_cell">
</div>
<div id="owned_dialog" role="dialog">
<div role="radiogroup">
<div role="radio" id="selected_radio" tabindex="-1">R1</div><div role="radio" tabindex="-1">R2</div>
</div>
<div role="button" tabindex="0">ok</div>
</div>
then role: combobox, aria-haspopup: "false"
element test
|
ATK
|
property
|
role
|
is
|
ROLE_COMBO_BOX
|
property
|
states
|
contains
|
STATE_EXPANDABLE
|
property
|
states
|
contains
|
STATE_EXPANDED
|
property
|
states
|
doesNotContain
|
STATE_HAS_POPUP
|
AXAPI
|
property
|
AXRole
|
is
|
AXComboBox
|
property
|
AXSubrole
|
is
|
<nil>
|
property
|
AXRoleDescription
|
is
|
combo box
|
property
|
AXExpanded
|
is
|
true
|
property
|
actions
|
doesNotContain
|
AXShowMenu
|
IAccessible2
|
property
|
role
|
is
|
ROLE_SYSTEM_COMBOBOX
|
property
|
objectAttributes
|
contains
|
haspopup:false
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_COMBOBOX
|
property
|
states
|
doesNotContain
|
STATE_SYSTEM_HASPOPUP
|
property
|
states
|
contains
|
STATE_SYSTEM_EXPANDED
|
UIA
|
property
|
ControlType
|
is
|
Combobox
|
property
|
interfaces
|
contains
|
ExpandCollapse pattern
|
property
|
ExpandCollapse.ExpandCollapseState
|
is
|
Expanded
|
if given
<div aria-label="Tag" aria-haspopup="dialog" id="test" role="combobox" aria-expanded="true" aria-owns="owned_dialog">
<input type="text" aria-autocomplete="list" aria-controls="owned_dialog" aria-activedescendant="selected_cell">
</div>
<div id="owned_dialog" role="dialog">
<div role="radiogroup">
<div role="radio" id="selected_radio" tabindex="-1">R1</div><div role="radio" tabindex="-1">R2</div>
</div>
<div role="button" tabindex="0">ok</div>
</div>
then role: combobox, aria-haspopup: "dialog"
element test
|
ATK
|
property
|
role
|
is
|
ROLE_COMBO_BOX
|
property
|
states
|
contains
|
STATE_EXPANDABLE
|
property
|
states
|
contains
|
STATE_EXPANDED
|
property
|
states
|
contains
|
STATE_HAS_POPUP
|
property
|
objectAttributes
|
contains
|
haspopup:dialog
|
AXAPI
|
property
|
AXRole
|
is
|
AXComboBox
|
property
|
AXSubrole
|
is
|
<nil>
|
property
|
AXRoleDescription
|
is
|
combo box
|
property
|
AXExpanded
|
is
|
true
|
property
|
actions
|
contains
|
AXShowMenu
|
IAccessible2
|
property
|
role
|
is
|
ROLE_SYSTEM_COMBOBOX
|
property
|
objectAttributes
|
contains
|
haspopup:dialog
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_COMBOBOX
|
property
|
states
|
contains
|
STATE_SYSTEM_HASPOPUP
|
property
|
states
|
contains
|
STATE_SYSTEM_EXPANDED
|
UIA
|
property
|
ControlType
|
is
|
Combobox
|
property
|
interfaces
|
contains
|
ExpandCollapse pattern
|
property
|
ExpandCollapse.ExpandCollapseState
|
is
|
Expanded
|
if given
<div aria-label="Tag" aria-haspopup="grid" id="test" role="combobox" aria-expanded="true" aria-owns="owned_grid">
<input type="text" aria-autocomplete="list" aria-controls="owned_grid" aria-activedescendant="selected_cell">
</div>
<table id="owned_grid" role="grid">
<tr>
<th tabindex="-1" id="selected_cell" role="colomnheader">c1</th><th role="colomnheader">c2</th>
</tr>
<tr>
<td role="gridcell">A1</td><td role="gridcell">A2</td>
</tr>
<tr>
<td role="gridcell">A3</td><td role="gridcell">A4</td>
</tr>
</table>
then role: combobox, aria-haspopup: "grid"
element test
|
ATK
|
property
|
role
|
is
|
ROLE_COMBO_BOX
|
property
|
states
|
contains
|
STATE_EXPANDABLE
|
property
|
states
|
contains
|
STATE_EXPANDED
|
property
|
states
|
contains
|
STATE_HAS_POPUP
|
property
|
objectAttributes
|
contains
|
haspopup:grid
|
AXAPI
|
property
|
AXRole
|
is
|
AXComboBox
|
property
|
AXSubrole
|
is
|
<nil>
|
property
|
AXRoleDescription
|
is
|
combo box
|
property
|
AXExpanded
|
is
|
true
|
property
|
actions
|
contains
|
AXShowMenu
|
IAccessible2
|
property
|
objectAttributes
|
contains
|
haspopup:grid
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_COMBOBOX
|
property
|
states
|
contains
|
STATE_SYSTEM_HASPOPUP
|
property
|
states
|
contains
|
STATE_SYSTEM_EXPANDED
|
UIA
|
property
|
ControlType
|
is
|
Combobox
|
property
|
interfaces
|
contains
|
ExpandCollapse pattern
|
property
|
ExpandCollapse.ExpandCollapseState
|
is
|
Expanded
|
if given
<div aria-label="Tag" aria-haspopup="listbox" id="test" role="combobox" aria-expanded="true" aria-owns="owned_listbox">
<input type="text" aria-autocomplete="list" aria-controls="owned_listbox" aria-activedescendant="selected_cell">
</div>
<div id="owned_listbox" role="listbox">
<div role="option">foo</div>
<div role="option">baz</div>
</div>
</div>
then role: combobox, aria-haspopup: "listbox"
element test
|
ATK
|
property
|
role
|
is
|
ROLE_COMBO_BOX
|
property
|
states
|
contains
|
STATE_EXPANDABLE
|
property
|
states
|
contains
|
STATE_EXPANDED
|
property
|
states
|
contains
|
STATE_HAS_POPUP
|
property
|
objectAttributes
|
contains
|
haspopup:listbox
|
AXAPI
|
property
|
AXRole
|
is
|
AXComboBox
|
property
|
AXSubrole
|
is
|
<nil>
|
property
|
AXRoleDescription
|
is
|
combo box
|
property
|
AXExpanded
|
is
|
true
|
property
|
actions
|
contains
|
AXShowMenu
|
IAccessible2
|
property
|
objectAttributes
|
contains
|
haspopup:listbox
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_COMBOBOX
|
property
|
states
|
contains
|
STATE_SYSTEM_HASPOPUP
|
property
|
states
|
contains
|
STATE_SYSTEM_EXPANDED
|
UIA
|
property
|
ControlType
|
is
|
Combobox
|
property
|
interfaces
|
contains
|
ExpandCollapse pattern
|
property
|
ExpandCollapse.ExpandCollapseState
|
is
|
Expanded
|
if given
<div aria-label="Tag" aria-haspopup="menu" id="test" role="combobox" aria-expanded="true" aria-owns="owned_menu">
<input type="text" aria-autocomplete="list" aria-controls="owned_menu" aria-activedescendant="selected_cell">
</div>
<div id="owned_listbox" role="menu">
<div role="menuitem">foo</div>
<div role="menuitem">baz</div>
</div>
</div>
then role: combobox, aria-haspopup: "menu"
element test
|
ATK
|
property
|
role
|
is
|
ROLE_COMBO_BOX
|
property
|
states
|
contains
|
STATE_EXPANDABLE
|
property
|
states
|
contains
|
STATE_EXPANDED
|
property
|
states
|
contains
|
STATE_HAS_POPUP
|
property
|
objectAttributes
|
contains
|
haspopup:menu
|
AXAPI
|
property
|
AXRole
|
is
|
AXComboBox
|
property
|
AXSubrole
|
is
|
<nil>
|
property
|
AXRoleDescription
|
is
|
combo box
|
property
|
AXExpanded
|
is
|
true
|
property
|
actions
|
contains
|
AXShowMenu
|
IAccessible2
|
property
|
objectAttributes
|
contains
|
haspopup:menu
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_COMBOBOX
|
property
|
states
|
contains
|
STATE_SYSTEM_HASPOPUP
|
property
|
states
|
contains
|
STATE_SYSTEM_EXPANDED
|
UIA
|
property
|
ControlType
|
is
|
Combobox
|
property
|
interfaces
|
contains
|
ExpandCollapse pattern
|
property
|
ExpandCollapse.ExpandCollapseState
|
is
|
Expanded
|
if given
<div aria-label="Tag" id="test" role="combobox" aria-expanded="true" aria-owns="owned_tree" aria-haspopup="tree">
<input type="text" aria-autocomplete="list" aria-controls="owned_tree" aria-activedescendant="oranges">
</div>
<ul id="owned_tree" role="tree">
<li id="fruits" role="treeitem" tabindex="0" aria-expanded="true"><span>Fruits</span>
<ul id="fruit-grp" role="group">
<li id="oranges" role="treeitem" tabindex="-1">Oranges</li>
<li id="apples" role="treeitem" tabindex="-1" aria-expanded="false"><span>Apples</span>
<ul id="apple-grp" role="group">
<li id="macintosh" role="treeitem" tabindex="-1">Macintosh</li>
<li id="granny_smith" role="treeitem" tabindex="-1" aria-expanded="false"><span>Granny Smith</span>
<ul id="granny-grp" role="group">
<li id="Washington" role="treeitem" tabindex="-1">Washington State</li>
<li id="Michigan" role="treeitem" tabindex="-1">Michigan</li>
</ul>
</li>
<li id="fuji" role="treeitem" tabindex="-1">Fuji</li>
</ul>
</li>
<li id="bananas" role="treeitem" tabindex="-1">Bananas</li>
<li id="pears" role="treeitem" tabindex="-1">Pears</li>
</ul>
</li>
<li id="vegetables" role="treeitem" tabindex="-1" aria-expanded="true">Vegetables</li>
</ul>
then role: combobox, has-haspopup: "tree"
element test
|
ATK
|
property
|
role
|
is
|
ROLE_COMBO_BOX
|
property
|
states
|
contains
|
STATE_EXPANDABLE
|
property
|
states
|
contains
|
STATE_EXPANDED
|
property
|
states
|
contains
|
STATE_HAS_POPUP
|
property
|
objectAttributes
|
contains
|
haspopup:tree
|
AXAPI
|
property
|
AXRole
|
is
|
AXComboBox
|
property
|
AXSubrole
|
is
|
<nil>
|
property
|
AXRoleDescription
|
is
|
combo box
|
property
|
AXExpanded
|
is
|
true
|
property
|
actions
|
contains
|
AXShowMenu
|
IAccessible2
|
property
|
objectAttributes
|
contains
|
haspopup:tree
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_COMBOBOX
|
property
|
states
|
contains
|
STATE_SYSTEM_HASPOPUP
|
property
|
states
|
contains
|
STATE_SYSTEM_EXPANDED
|
UIA
|
property
|
ControlType
|
is
|
Combobox
|
property
|
interfaces
|
contains
|
ExpandCollapse pattern
|
property
|
ExpandCollapse.ExpandCollapseState
|
is
|
Expanded
|
aria-hidden
In ARIA 1.1, aria-hidden's value type went from true/false to true/false/undefined. The default value of aria-hidden is now "undefined." If aria-hidden is undefined, "The element's hidden state is determined by the user agent based on whether it is rendered."
Documentation:
group hidden undefined element rendered
if given
<div role="group" id="test">
Some group content
</div>
then the element with role="group" and id="test" should be mapped as non-hidden (aria-hidden="false")
ATK
|
property
|
role
|
is
|
ROLE_PANEL
|
property
|
objectAttributes
|
doesNotContain
|
hidden
|
AXAPI
|
property
|
AXRole
|
is
|
AXGroup
|
property
|
AXSubrole
|
is
|
AXApplicationGroup
|
property
|
AXRoleDescription
|
is
|
'group'
|
property
|
hidden
|
is
|
<nil>
|
IAccessible2
|
property
|
role
|
is
|
ROLE_SYSTEM_GROUPING
|
property
|
objectAttributes
|
doesNotContain
|
hidden:false
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_GROUPING
|
UIA
|
property
|
ControlType
|
is
|
Group
|
property
|
AriaProperties.hidden
|
is
|
false
|
group hidden undefined element not rendered
Note: The Core AAM states for aria-hidden="true": "Element should not be exposed, unless it is focused or fires an accessibility event." The element being tested is not focused and does not fire an accessibility event. Therefore, it should not be in the accessibility tree at all.
if given
<div role="group" id="test" style="display:none">
Some invisible group content
</div>
then the invisible element with role="group" and id="test" should be mapped as hidden (aria-hidden="true")
ATK
|
property
|
accessible
|
is
|
false
|
AXAPI
|
property
|
accessible
|
is
|
false
|
IAccessible2
|
property
|
accessible
|
is
|
false
|
MSAA
|
property
|
accessible
|
is
|
false
|
UIA
|
property
|
accessible
|
is
|
false
|
aria-keyshortcuts
The aria-keyshortcuts property was added during ARIA 1.1. It is supported on all elements of the base markup and has a value type of string.
According to the spec, "User agents MUST NOT change keyboard behavior in response to the aria-keyshortcuts attribute."
Documentation:
keyshortcuts one shortcut
if given
<body>
<div id="test" tabindex="0" role="button" aria-keyshortcuts="Shift+Space">Submit</h1>
</body>
then the element with role="button" and id="test" exposes aria-keyshortcuts="Shift+Space"
ATK
|
property
|
role
|
is
|
ROLE_PUSH_BUTTON
|
property
|
objectAttributes
|
contains
|
keyshortcuts:Shift+Space
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_PUSHBUTTON
|
property
|
accKeyboardShortcut
|
is
|
"Shift+Space"
|
UIA
|
property
|
ControlType
|
is
|
Button
|
property
|
AcceleratorKey
|
is
|
"Shift+Space"
|
keyshortcuts multiple shortcuts
if given
<body>
<div id="test" tabindex="0" role="button" aria-keyshortcuts="Shift+Space Alt+Space">Submit</h1>
</body>
then the element with role="button" and id="test" exposes aria-keyshortcuts="Shift+Space Alt+Space"
ATK
|
property
|
role
|
is
|
ROLE_PUSH_BUTTON
|
property
|
objectAttributes
|
contains
|
keyshortcuts:Shift+Space Alt+Space
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_PUSHBUTTON
|
property
|
accKeyboardShortcut
|
is
|
"Shift+Space Alt+Space"
|
UIA
|
property
|
ControlType
|
is
|
Button
|
property
|
AcceleratorKey
|
is
|
"Shift+Space Alt+Space"
|
keyshortcuts keyboard behavior not changed by user agent (NEEDS TEST: Joanie)
FIXME: NO TEST
aria-level
In ARIA 1.1, aria-level became a required attribute for heading. It has an implicit value of 2.
Documentation:
heading level unspecified
if given
<div role="heading" id="test">
Go Fish
</div>
then the element with role="heading" and id="test" exposes aria-level=2
ATK
|
property
|
role
|
is
|
ROLE_HEADING
|
property
|
objectAttributes
|
contains
|
level:2
|
AXAPI
|
property
|
AXRole
|
is
|
AXHeading
|
property
|
AXSubrole
|
is
|
<nil>
|
property
|
AXRoleDescription
|
is
|
'heading'
|
property
|
AXValue
|
is
|
2
|
IAccessible2
|
property
|
role
|
is
|
IA2_ROLE_HEADING
|
property
|
objectAttributes
|
contains
|
level:2
|
property
|
objectAttributes
|
contains
|
xml-roles:heading
|
UIA
|
property
|
ControlType
|
is
|
Text
|
property
|
StyleId_Heading
|
is
|
2
|
property
|
AriaProperties.level
|
is
|
2
|
aria-modal
The aria-modal property was added during ARIA 1.1. It is supported in dialog and alertdialog and has a value type of true/false. The default value is false.
Documentation:
alertdialog modal true
if given
<h1 id="Test2">Modal Dialog Box Test</h1>
<div role="alertdialog" aria-modal="true" id="test">
You have an error.
<input type="button" value="ok"/>
</div>
then the element with role="alertdialog" and id="test" exposes aria-modal="true"
element test
|
ATK
|
property
|
role
|
is
|
ROLE_DIALOG
|
property
|
states
|
contains
|
STATE_MODAL
|
IAccessible2
|
property
|
role
|
is
|
ROLE_SYSTEM_DIALOG
|
property
|
states
|
contains
|
IA2_STATE_MODAL
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_DIALOG
|
UIA
|
property
|
ControlType
|
is
|
Pane
|
result
|
Window.isModal
|
is
|
true
|
element Test2
|
AXAPI
|
property
|
accessible
|
is
|
false
|
alertdialog modal false
if given
<h1 id="Test2">Modal Dialog Box Test</h1>
<div role="alertdialog" aria-modal="false" id="test">
You have an error.
<input type="button" value="ok"/>
</div>
then the element with role="alertdialog" and id="test" exposes aria-modal="false"
element test
|
ATK
|
property
|
role
|
is
|
ROLE_DIALOG
|
property
|
states
|
doesNotContain
|
STATE_MODAL
|
AXAPI
|
property
|
AXRole
|
is
|
AXGroup
|
property
|
AXSubrole
|
is
|
AXApplicationAlertDialog
|
property
|
AXRoleDescription
|
is
|
web alert dialog
|
IAccessible2
|
property
|
role
|
is
|
ROLE_SYSTEM_DIALOG
|
property
|
states
|
doesNotContain
|
IA2_STATE_MODAL
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_DIALOG
|
UIA
|
property
|
ControlType
|
is
|
Pane
|
result
|
Window.isModal
|
is
|
false
|
element Test2
|
AXAPI
|
property
|
accessible
|
is
|
true
|
dialog modal true
if given
<body>
<h1 id="Test2">Modal Dialog Box Test</h1>
<div role="dialog" aria-modal="true" id="test">
<input type="button" value="ok"/>
</div>
</body>
then the element with role="dialog" and id="test" exposes aria-modal="true"
element test
|
ATK
|
property
|
role
|
is
|
ROLE_DIALOG
|
property
|
states
|
contains
|
STATE_MODAL
|
IAccessible2
|
property
|
role
|
is
|
ROLE_SYSTEM_DIALOG
|
property
|
states
|
contains
|
IA2_STATE_MODAL
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_DIALOG
|
UIA
|
property
|
ControlType
|
is
|
Pane
|
result
|
Window.isModal
|
is
|
true
|
element Test2
|
AXAPI
|
property
|
accessible
|
is
|
false
|
dialog modal false
if given
<h1 id="Test2">Modal Dialog Box Test</h1>
<div role="dialog" aria-modal="false" id="test">
You have an error.
<input type="button" value="ok"/>
</div>
then the element with role="dialog" and id="test" exposes aria-modal="false"
element test
|
ATK
|
property
|
role
|
is
|
ROLE_DIALOG
|
property
|
states
|
doesNotContain
|
STATE_MODAL
|
AXAPI
|
property
|
AXRole
|
is
|
AXGroup
|
property
|
AXSubrole
|
is
|
AXApplicationDialog
|
property
|
AXRoleDescription
|
is
|
web dialog
|
IAccessible2
|
property
|
role
|
is
|
ROLE_SYSTEM_DIALOG
|
property
|
states
|
doesNotContain
|
IA2_STATE_MODAL
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_DIALOG
|
UIA
|
property
|
ControlType
|
is
|
Pane
|
result
|
Window.isModal
|
is
|
false
|
element Test2
|
AXAPI
|
property
|
accessible
|
is
|
true
|
dialog modal unspecified
if given
<h1 id="Test2">Modal Dialog Box Test</h1>
<div role="dialog" id="test">
You have an error.
<input type="button" value="ok"/>
</div>
then the element with role="dialog" and id="test" exposes aria-modal="false"
element test
|
ATK
|
property
|
role
|
is
|
ROLE_DIALOG
|
property
|
states
|
doesNotContain
|
STATE_MODAL
|
AXAPI
|
property
|
AXRole
|
is
|
AXGroup
|
property
|
AXSubrole
|
is
|
AXApplicationDialog
|
property
|
AXRoleDescription
|
is
|
web dialog
|
IAccessible2
|
property
|
role
|
is
|
ROLE_SYSTEM_DIALOG
|
property
|
states
|
doesNotContain
|
IA2_STATE_MODAL
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_DIALOG
|
UIA
|
property
|
ControlType
|
is
|
Pane
|
result
|
Window.isModal
|
is
|
false
|
element Test2
|
AXAPI
|
property
|
accessible
|
is
|
true
|
aria-multiline
In ARIA 1.1, aria-multiline became a supported property of searchbox as a consequence of the creation of a new role which subclasses textbox.
Documentation:
searchbox multiline true
if given
<div id='test' role='searchbox' contenteditable='true' aria-multiline='true'></div>
then role:searchbox, contenteditable:true
ATK
|
property
|
role
|
is
|
ROLE_ENTRY
|
property
|
states
|
doesNotContain
|
STATE_SINGLE_LINE
|
property
|
states
|
contains
|
STATE_MULTI_LINE
|
property
|
interfaces
|
contains
|
EditableText
|
AXAPI
|
property
|
AXRole
|
is
|
AXTextField
|
property
|
AXSubrole
|
is
|
AXSearchField
|
property
|
AXRoleDescription
|
is
|
search text field
|
IAccessible2
|
property
|
role
|
is
|
ROLE_SYSTEM_TEXT
|
property
|
states
|
contains
|
IA2_MULTI_LINE
|
property
|
states
|
doesNotContain
|
IA2_SINGLE_LINE
|
property
|
objectAttributes
|
contains
|
text-input-type:search
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_TEXT
|
UIA
|
property
|
ControlType
|
is
|
Edit
|
property
|
LocalizedControlType
|
is
|
search box
|
property
|
AriaProperties.multiline
|
is
|
true
|
searchbox multiline false
if given
<div id='test' role='searchbox' contenteditable='true' aria-multiline='false'></div>
then role:searchbox, contenteditable:true
ATK
|
property
|
role
|
is
|
ROLE_ENTRY
|
property
|
states
|
contains
|
STATE_SINGLE_LINE
|
property
|
interfaces
|
contains
|
EditableText
|
AXAPI
|
property
|
AXRole
|
is
|
AXTextField
|
property
|
AXSubrole
|
is
|
AXSearchField
|
property
|
AXRoleDescription
|
is
|
search text field
|
IAccessible2
|
property
|
role
|
is
|
ROLE_SYSTEM_TEXT
|
property
|
states
|
doesNotContain
|
IA2_MULTI_LINE
|
property
|
states
|
contains
|
IA2_SINGLE_LINE
|
property
|
objectAttributes
|
contains
|
text-input-type:search
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_TEXT
|
UIA
|
property
|
ControlType
|
is
|
Edit
|
property
|
LocalizedControlType
|
is
|
search box
|
searchbox multiline unspecified
if given
<div id='test' role='searchbox' contenteditable='true'></div>
then role:searchbox, contenteditable:true
ATK
|
property
|
role
|
is
|
ROLE_ENTRY
|
property
|
states
|
contains
|
STATE_SINGLE_LINE
|
property
|
interfaces
|
contains
|
EditableText
|
AXAPI
|
property
|
AXRole
|
is
|
AXTextField
|
property
|
AXSubrole
|
is
|
AXSearchField
|
property
|
AXRoleDescription
|
is
|
search text field
|
IAccessible2
|
property
|
objectAttributes
|
contains
|
xml-roles:search
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_TEXT
|
UIA
|
property
|
ControlType
|
is
|
Edit
|
property
|
LocalizedControlType
|
is
|
search box
|
aria-orientation
In ARIA 1.1, aria-orientation was added to the following roles with the specified implicit values:
- combobox: undefined
- listbox: vertical
- menu: vertical
- menubar: horizontal
- radiogroup: undefined
- tablist: horizontal
- toolbar: horizontal
- tree: vertical
- treegrid: undefined
In ARIA 1.1, the following changes related to aria-orientation were also made:
- aria-orientation's default value changed from horizontal to undefined
- separator now has implicit value of horizontal
- slider now has implicit value of horizontal
Documentation:
combobox orientation unspecified
if given
<div aria-label="Tag" id="test" role="combobox" aria-expanded="true" aria-owns="owned_listbox">
<input type="text" aria-autocomplete="list" aria-controls="owned_listbox" aria-activedescendant="selected_option">
</div>
<ul role="listbox" id="owned_listbox">
<li role="option">Zebra</li>
<li role="option" id="selected_option">Zoom</li>
</ul>
then role: combobox exposes no orientation
element test
|
ATK
|
property
|
role
|
is
|
ROLE_COMBO_BOX
|
property
|
states
|
doesNotContain
|
STATE_VERTICAL
|
property
|
states
|
doesNotContain
|
STATE_HORIZONTAL
|
AXAPI
|
property
|
AXRole
|
is
|
AXComboBox
|
property
|
AXSubrole
|
is
|
<nil>
|
property
|
AXRoleDescription
|
is
|
combo box
|
property
|
AXOrientation
|
is
|
AXUnknownOrientation
|
IAccessible2
|
property
|
states
|
doesNotContain
|
IA2_STATE_VERTICAL
|
property
|
states
|
doesNotContain
|
IA2_STATE_HORIZONTAL
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_COMBOBOX
|
UIA
|
property
|
ControlType
|
is
|
Combobox
|
property
|
IUIAutomationElement.Orientation
|
isNot
|
vertical
|
property
|
IUIAutomationElement.Orientation
|
isNot
|
horizontal
|
combobox orientation horizontal
if given
<div aria-label="Tag" id="test" role="combobox" aria-orientation="horizontal" aria-expanded="true" aria-owns="owned_listbox">
<input type="text" aria-autocomplete="list" aria-controls="owned_listbox" aria-activedescendant="selected_option">
</div>
<ul role="listbox" id="owned_listbox">
<li role="option">Zebra</li>
<li role="option" id="selected_option">Zoom</li>
</ul>
then role: combobox exposes no orientation
element test
|
ATK
|
property
|
role
|
is
|
ROLE_COMBO_BOX
|
property
|
states
|
doesNotContain
|
STATE_VERTICAL
|
property
|
states
|
contains
|
STATE_HORIZONTAL
|
AXAPI
|
property
|
AXRole
|
is
|
AXComboBox
|
property
|
AXSubrole
|
is
|
<nil>
|
property
|
AXRoleDescription
|
is
|
combo box
|
property
|
AXOrientation
|
is
|
AXHorizontalOrientation
|
IAccessible2
|
property
|
states
|
doesNotContain
|
IA2_STATE_VERTICAL
|
property
|
states
|
contains
|
IA2_STATE_HORIZONTAL
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_COMBOBOX
|
UIA
|
property
|
ControlType
|
is
|
Combobox
|
property
|
IUIAutomationElement.Orientation
|
is
|
horizontal
|
combobox orientation vertical
if given
<div aria-label="Tag" id="test" role="combobox" aria-orientation="vertical" aria-expanded="true" aria-owns="owned_listbox">
<input type="text" aria-autocomplete="list" aria-controls="owned_listbox" aria-activedescendant="selected_option">
</div>
<ul role="listbox" id="owned_listbox">
<li role="option">Zebra</li>
<li role="option" id="selected_option">Zoom</li>
</ul>
then role: combobox exposes no orientation
element test
|
ATK
|
property
|
role
|
is
|
ROLE_COMBO_BOX
|
property
|
states
|
contains
|
STATE_VERTICAL
|
property
|
states
|
doesNotContain
|
STATE_HORIZONTAL
|
AXAPI
|
property
|
AXRole
|
is
|
AXComboBox
|
property
|
AXSubrole
|
is
|
<nil>
|
property
|
AXRoleDescription
|
is
|
combo box
|
property
|
AXOrientation
|
is
|
AXVerticalOrientation
|
IAccessible2
|
property
|
states
|
contains
|
IA2_STATE_VERTICAL
|
property
|
states
|
doesNotContain
|
IA2_STATE_HORIZONTAL
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_COMBOBOX
|
UIA
|
property
|
ControlType
|
is
|
Combobox
|
property
|
IUIAutomationElement.Orientation
|
is
|
vertical
|
listbox orientation unspecified
if given
<div id="test" tabindex="0" role="listbox" >
<div role="option">option 1</div>
<div role="option">option 2</div>
</div>
then expose role: listbox and aria-orientation="vertical" for the element with id="test"
element test
|
ATK
|
property
|
role
|
is
|
ROLE_LIST_BOX
|
property
|
interfaces
|
contains
|
Selection
|
property
|
states
|
contains
|
STATE_VERTICAL
|
property
|
states
|
doesNotContain
|
STATE_HORIZONTAL
|
AXAPI
|
property
|
AXRole
|
is
|
AXList
|
property
|
AXSubrole
|
is
|
<nil>
|
property
|
AXRoleDescription
|
is
|
list
|
property
|
AXOrientation
|
is
|
AXVerticalOrientation
|
IAccessible2
|
property
|
states
|
contains
|
IA2_STATE_VERTICAL
|
property
|
states
|
doesNotContain
|
IA2_STATE_HORIZONTAL
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_LIST
|
UIA
|
property
|
ControlType
|
is
|
List
|
property
|
IUIAutomationElement.Orientation
|
is
|
vertical
|
listbox orientation horizontal
if given
<div id="test" aria-orientation="horizontal" tabindex="0" role="listbox" >
<div role="option">option 1</div>
<div role="option">option 2</div>
</div>
then expose role: listbox and aria-orientation="horizontal" for the element with id="test"
element test
|
ATK
|
property
|
role
|
is
|
ROLE_LIST_BOX
|
property
|
interfaces
|
contains
|
Selection
|
property
|
states
|
doesNotContain
|
STATE_VERTICAL
|
property
|
states
|
contains
|
STATE_HORIZONTAL
|
AXAPI
|
property
|
AXRole
|
is
|
AXList
|
property
|
AXsubrole
|
is
|
<nil>
|
property
|
AXRoleDescription
|
is
|
list
|
property
|
AXOrientation
|
is
|
AXHorizontalOrientation
|
IAccessible2
|
property
|
states
|
doesNotContain
|
IA2_STATE_VERTICAL
|
property
|
states
|
contains
|
IA2_STATE_HORIZONTAL
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_LIST
|
UIA
|
property
|
ControlType
|
is
|
List
|
property
|
IUIAutomationElement.Orientation
|
is
|
horizontal
|
listbox orientation vertical
if given
<div id="test" aria-orientation="vertical" tabindex="0" role="listbox" >
<div role="option">option 1</div>
<div role="option">option 2</div>
</div>
then expose role: listbox and aria-orientation="vertical" for the element with id="test"
element test
|
ATK
|
property
|
role
|
is
|
ROLE_LIST_BOX
|
property
|
interfaces
|
contains
|
Selection
|
property
|
states
|
contains
|
STATE_VERTICAL
|
property
|
states
|
doesNotContain
|
STATE_HORIZONTAL
|
AXAPI
|
property
|
AXRole
|
is
|
AXList
|
property
|
AXSubrole
|
is
|
<nil>
|
property
|
AXRoleDescription
|
is
|
list
|
property
|
AXOrientation
|
is
|
AXVerticalOrientation
|
IAccessible2
|
property
|
states
|
contains
|
IA2_STATE_VERTICAL
|
property
|
states
|
doesNotContain
|
IA2_STATE_HORIZONTAL
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_LIST
|
UIA
|
property
|
ControlType
|
is
|
List
|
property
|
IUIAutomationElement.Orientation
|
is
|
vertical
|
if given
<div id="test" tabindex="0" role="menu" >
<div role="menuitem">option 1</div>
<div role="menuitem">option 2</div>
</div>
then expose role: menu and aria-orientation="vertical" for the element with id="test"
element test
|
ATK
|
property
|
role
|
is
|
ROLE_MENU
|
property
|
states
|
contains
|
STATE_VERTICAL
|
property
|
states
|
doesNotContain
|
STATE_HORIZONTAL
|
AXAPI
|
property
|
AXRole
|
is
|
AXMenu
|
property
|
AXSubrole
|
is
|
<nil>
|
property
|
AXRoleDescription
|
is
|
menu
|
property
|
AXOrientation
|
is
|
AXVerticalOrientation
|
IAccessible2
|
property
|
states
|
contains
|
IA2_STATE_VERTICAL
|
property
|
states
|
doesNotContain
|
IA2_STATE_HORIZONTAL
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_MENUPOPUP
|
UIA
|
property
|
ControlType
|
is
|
Menu
|
property
|
IUIAutomationElement.Orientation
|
is
|
vertical
|
if given
<ul id="test" role="menu" aria-orientation="horizontal">
<li role="menuitem">File</file>
<li role="menuitem">Edit</file>
</ul>
then expose aria-orientation="horizontal" for element test
element test
|
ATK
|
property
|
role
|
is
|
ROLE_MENU
|
property
|
states
|
contains
|
STATE_HORIZONTAL
|
AXAPI
|
property
|
AXRole
|
is
|
AXMenu
|
property
|
AXSubrole
|
is
|
<nil>
|
property
|
AXRoleDescription
|
is
|
menu
|
property
|
AXOrientation
|
is
|
AXHorizontalOrientation
|
IAccessible2
|
property
|
role
|
is
|
ROLE_SYSTEM_MENUPOPUP
|
property
|
states
|
doesNotContain
|
IA2_STATE_VERTICAL
|
property
|
states
|
contains
|
IA2_STATE_HORIZONTAL
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_MENUPOPUP
|
UIA
|
property
|
ControlType
|
is
|
Menu
|
property
|
IUIAutomationElement.Orientation
|
is
|
horizontal
|
if given
<ul id="test" role="menu" aria-orientation="vertical">
<li role="menuitem">File</file>
<li role="menuitem">Edit</file>
</ul>
then expose aria-orientation="vertical" for element test
element test
|
ATK
|
property
|
role
|
is
|
ROLE_MENU
|
property
|
states
|
contains
|
STATE_VERTICAL
|
AXAPI
|
property
|
AXRole
|
is
|
AXMenu
|
property
|
AXSubrole
|
is
|
<nil>
|
property
|
AXRoleDescription
|
is
|
menu
|
property
|
AXOrientation
|
is
|
AXVerticalOrientation
|
IAccessible2
|
property
|
role
|
is
|
ROLE_SYSTEM_MENUPOPUP
|
property
|
states
|
contains
|
IA2_STATE_VERTICAL
|
property
|
states
|
doesNotContain
|
IA2_STATE_HORIZONTAL
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_MENUPOPUP
|
UIA
|
property
|
ControlType
|
is
|
Menu
|
property
|
IUIAutomationElement.Orientation
|
is
|
vertical
|
if given
<ul id="test" role="menubar">
<li role="menuitem">File</file>
<li role="menuitem">Edit</file>
</ul>
then expose aria-orientation="horizontal" for element test
element test
|
ATK
|
property
|
role
|
is
|
ROLE_MENU_BAR
|
property
|
states
|
contains
|
STATE_HORIZONTAL
|
AXAPI
|
property
|
AXRole
|
is
|
AXMenuBar
|
property
|
AXSubrole
|
is
|
<nil>
|
property
|
AXRoleDescription
|
is
|
menu bar
|
property
|
AXOrientation
|
is
|
AXHorizontalOrientation
|
IAccessible2
|
property
|
role
|
is
|
ROLE_SYSTEM_MENUBAR
|
property
|
states
|
doesNotContain
|
IA2_STATE_VERTICAL
|
property
|
states
|
contains
|
IA2_STATE_HORIZONTAL
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_MENUBAR
|
UIA
|
property
|
ControlType
|
is
|
MenuBar
|
property
|
IUIAutomationElement.Orientation
|
is
|
horizontal
|
if given
<ul id="test" role="menubar" aria-orientation="horizontal">
<li role="menuitem">File</file>
<li role="menuitem">Edit</file>
</ul>
then expose aria-orientation="horizontal" for element test
element test
|
ATK
|
property
|
role
|
is
|
ROLE_MENU_BAR
|
property
|
states
|
contains
|
STATE_HORIZONTAL
|
AXAPI
|
property
|
AXRole
|
is
|
AXMenuBar
|
property
|
AXSubrole
|
is
|
<nil>
|
property
|
AXRoleDescription
|
is
|
menu bar
|
property
|
AXOrientation
|
is
|
AXHorizontalOrientation
|
IAccessible2
|
property
|
role
|
is
|
ROLE_SYSTEM_MENUBAR
|
property
|
states
|
doesNotContain
|
IA2_STATE_VERTICAL
|
property
|
states
|
contains
|
IA2_STATE_HORIZONTAL
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_MENUBAR
|
UIA
|
property
|
ControlType
|
is
|
MenuBar
|
property
|
IUIAutomationElement.Orientation
|
is
|
horizontal
|
if given
<ul id="test" role="menubar" aria-orientation="vertical">
<li role="menuitem">File</file>
<li role="menuitem">Edit</file>
</ul>
then expose aria-orientation="horizontal" for element test
element test
|
ATK
|
property
|
role
|
is
|
ROLE_MENU_BAR
|
property
|
states
|
contains
|
STATE_VERTICAL
|
AXAPI
|
property
|
AXRole
|
is
|
AXMenuBar
|
property
|
AXSubrole
|
is
|
<nil>
|
property
|
AXRoleDescription
|
is
|
menu bar
|
property
|
AXOrientation
|
is
|
AXVerticalOrientation
|
IAccessible2
|
property
|
states
|
contains
|
IA2_STATE_VERTICAL
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_MENUBAR
|
UIA
|
property
|
ControlType
|
is
|
MenuBar
|
property
|
IUIAutomationElement.Orientation
|
is
|
vertical
|
radiogroup orientation unspecified
if given
<ul id="test" role="radiogroup">
<li role="radio">File</file>
<li role="radio">Edit</file>
</ul>
then do not expose aria-orientation for element test
element test
|
ATK
|
property
|
role
|
is
|
ROLE_PANEL
|
property
|
states
|
doesNotContain
|
STATE_VERTICAL
|
property
|
states
|
doesNotContain
|
STATE_HORIZONTAL
|
AXAPI
|
property
|
AXRole
|
is
|
AXRadioGroup
|
property
|
AXSubrole
|
is
|
<nil>
|
property
|
AXRoleDescription
|
is
|
radio group
|
property
|
AXOrientation
|
is
|
AXUnknownOrientation
|
IAccessible2
|
property
|
role
|
is
|
ROLE_SYSTEM_GROUPING
|
property
|
states
|
doesNotContain
|
IA2_STATE_VERTICAL
|
property
|
states
|
doesNotContain
|
IA2_STATE_HORIZONTAL
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_GROUPING
|
UIA
|
property
|
ControlType
|
is
|
List
|
property
|
IUIAutomationElement.Orientation
|
isNot
|
vertical
|
property
|
IUIAutomationElement.Orientation
|
isNot
|
horizontal
|
radiogroup orientation horizontal
if given
<ul id="test" role="radiogroup" aria-orientation="horizontal">
<li role="radio">File</file>
<li role="radio">Edit</file>
</ul>
then expose aria-orientation="horizontal" for element test
element test
|
ATK
|
property
|
role
|
is
|
ROLE_PANEL
|
property
|
states
|
contains
|
STATE_HORIZONTAL
|
AXAPI
|
property
|
AXRole
|
is
|
AXRadioGroup
|
property
|
AXSubrole
|
is
|
<nil>
|
property
|
AXRoleDescription
|
is
|
radio group
|
property
|
AXOrientation
|
is
|
AXHorizontalOrientation
|
IAccessible2
|
property
|
role
|
is
|
ROLE_SYSTEM_GROUPING
|
property
|
states
|
doesNotContain
|
IA2_STATE_VERTICAL
|
property
|
states
|
contains
|
IA2_STATE_HORIZONTAL
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_GROUPING
|
UIA
|
property
|
ControlType
|
is
|
List
|
property
|
IUIAutomationElement.Orientation
|
is
|
horizontal
|
radiogroup orientation vertical
if given
<ul id="test" role="radiogroup" aria-orientation="vertical">
<li role="radio">File</file>
<li role="radio">Edit</file>
</ul>
then expose aria-orientation="vertical" for element test
element test
|
ATK
|
property
|
role
|
is
|
ROLE_PANEL
|
property
|
states
|
contains
|
STATE_VERTICAL
|
AXAPI
|
property
|
AXRole
|
is
|
AXRadioGroup
|
property
|
AXSubrole
|
is
|
<nil>
|
property
|
AXRoleDescription
|
is
|
radio group
|
property
|
AXOrientation
|
is
|
AXVerticalOrientation
|
IAccessible2
|
property
|
states
|
contains
|
IA2_STATE_VERTICAL
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_GROUPING
|
UIA
|
property
|
ControlType
|
is
|
List
|
property
|
IUIAutomationElement.Orientation
|
is
|
vertical
|
scrollbar orientation unspecified
if given
<div role="scrollbar" id="test"></div>
then the element with role="scrollbar" and id="test" exposes aria-orientation="vertical"
ATK
|
property
|
role
|
is
|
ROLE_SCROLL_BAR
|
property
|
interfaces
|
contains
|
Value
|
property
|
states
|
contains
|
STATE_VERTICAL
|
AXAPI
|
property
|
AXRole
|
is
|
AXScrollBar
|
property
|
AXSubrole
|
is
|
<nil>
|
property
|
AXRoleDescription
|
is
|
scroll bar
|
property
|
AXOrientation
|
is
|
AXVerticalOrientation
|
IAccessible2
|
property
|
role
|
is
|
ROLE_SYSTEM_SCROLLBAR
|
property
|
states
|
doesNotContain
|
IA2_STATE_HORIZONTAL
|
property
|
states
|
contains
|
IA2_STATE_VERTICAL
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_SCROLLBAR
|
UIA
|
property
|
ControlType
|
is
|
ScrollBar
|
property
|
Orientation
|
is
|
vertical
|
property
|
interfaces
|
contains
|
RangeValue
|
separator orientation unspecified
if given
<div role="separator" id="test"></div>
then the element with role="separator" and id="test" exposes aria-orientation="horizontal"
ATK
|
property
|
role
|
is
|
ROLE_SEPARATOR
|
property
|
states
|
contains
|
STATE_HORIZONTAL
|
AXAPI
|
property
|
AXRole
|
is
|
AXSplitter
|
property
|
AXSubrole
|
is
|
<nil>
|
property
|
AXRoleDescription
|
is
|
splitter
|
property
|
AXOrientation
|
is
|
AXHorizontalOrientation
|
IAccessible2
|
property
|
role
|
is
|
ROLE_SYSTEM_SEPARATOR
|
property
|
states
|
doesNotContain
|
IA2_STATE_VERTICAL
|
property
|
states
|
contains
|
IA2_STATE_HORIZONTAL
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_SEPARATOR
|
UIA
|
property
|
ControlType
|
is
|
Separator
|
property
|
Orientation
|
is
|
horizontal
|
slider orientation unspecified
if given
<div role="slider" id="test"></div>
then the element with role="scrollbar" and id="test" exposes aria-orientation="horizontal"
ATK
|
property
|
role
|
is
|
ROLE_SLIDER
|
property
|
interfaces
|
contains
|
Value
|
property
|
states
|
contains
|
STATE_HORIZONTAL
|
AXAPI
|
property
|
AXRole
|
is
|
AXSlider
|
property
|
AXSubrole
|
is
|
<nil>
|
property
|
AXRoleDescription
|
is
|
slider
|
property
|
AXOrientation
|
is
|
AXHorizontalOrientation
|
IAccessible2
|
property
|
role
|
is
|
ROLE_SYSTEM_SLIDER
|
property
|
states
|
doesNotContain
|
IA2_STATE_VERTICAL
|
property
|
states
|
contains
|
IA2_STATE_HORIZONTAL
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_SLIDER
|
UIA
|
property
|
ControlType
|
is
|
Slider
|
property
|
Orientation
|
is
|
horizontal
|
property
|
interfaces
|
contains
|
RangeValue
|
tablist orientation unspecified
if given
<div role="tablist" id="test">
<div role="tab" tabindex="0">Tab1</div><div role="tab" tabindex="-1">Tab2</div>
</div>
<div role="tabpanel"></div>
</div>
then the element with role="tablist" and id="test" exposes aria-orientation="horizontal"
ATK
|
property
|
role
|
is
|
ROLE_PAGE_TAB_LIST
|
property
|
interfaces
|
contains
|
Selection
|
property
|
states
|
contains
|
STATE_HORIZONTAL
|
AXAPI
|
property
|
AXRole
|
is
|
AXTabGroup
|
property
|
AXSubrole
|
is
|
<nil>
|
property
|
AXRoleDescription
|
is
|
tab group
|
property
|
AXOrientation
|
is
|
AXHorizontalOrientation
|
IAccessible2
|
property
|
role
|
is
|
ROLE_SYSTEM_PAGETABLIST
|
property
|
states
|
doesNotContain
|
IA2_STATE_VERTICAL
|
property
|
states
|
contains
|
IA2_STATE_HORIZONTAL
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_PAGETABLIST
|
UIA
|
property
|
ControlType
|
is
|
Tab
|
property
|
interfaces
|
contains
|
selection pattern
|
property
|
Orientation
|
is
|
horizontal
|
tablist orientation horizontal
if given
<div role="tablist" aria-orientation="horizontal" id="test">
<div role="tab" tabindex="0">Tab1</div><div role="tab" tabindex="-1">Tab2</div>
</div>
<div role="tabpanel"></div>
</div>
then the element with role="tablist" and id="test" exposes aria-orientation="vertical"
ATK
|
property
|
role
|
is
|
ROLE_PAGE_TAB_LIST
|
property
|
interfaces
|
contains
|
Selection
|
property
|
states
|
contains
|
STATE_HORIZONTAL
|
property
|
states
|
doesNotContain
|
STATE_VERTICAL
|
AXAPI
|
property
|
AXRole
|
is
|
AXTabGroup
|
property
|
AXSubrole
|
is
|
<nil>
|
property
|
AXRoleDescription
|
is
|
tab group
|
property
|
AXOrientation
|
is
|
AXHorizontalOrientation
|
IAccessible2
|
property
|
role
|
is
|
ROLE_SYSTEM_PAGETABLIST
|
property
|
states
|
doesNotContain
|
IA2_STATE_VERTICAL
|
property
|
states
|
contains
|
IA2_STATE_HORIZONTAL
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_PAGETABLIST
|
UIA
|
property
|
ControlType
|
is
|
Tab
|
property
|
interfaces
|
contains
|
selection pattern
|
property
|
Orientation
|
is
|
horizontal
|
tablist orientation vertical
if given
<div role="tablist" aria-orientation="vertical" id="test">
<div role="tab" tabindex="0">Tab1</div><div role="tab" tabindex="-1">Tab2</div>
</div>
<div role="tabpanel"></div>
</div>
then the element with role="tablist" and id="test" exposes aria-orientation="vertical"
ATK
|
property
|
role
|
is
|
ROLE_PAGE_TAB_LIST
|
property
|
interfaces
|
contains
|
Selection
|
property
|
states
|
contains
|
STATE_VERTICAL
|
AXAPI
|
property
|
AXRole
|
is
|
AXTabGroup
|
property
|
AXSubrole
|
is
|
<nil>
|
property
|
AXRoleDescription
|
is
|
tab group
|
property
|
AXOrientation
|
is
|
AXVerticalOrientation
|
IAccessible2
|
property
|
states
|
contains
|
IA2_STATE_VERTICAL
|
property
|
states
|
doesNotContain
|
IA2_STATE_HORIZONTAL
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_PAGETABLIST
|
UIA
|
property
|
ControlType
|
is
|
Tab
|
property
|
interfaces
|
contains
|
selection pattern
|
property
|
Orientation
|
is
|
vertical
|
toolbar orientation unspecified
if given
<div role="toolbar" id="test">
<button value="b1"> <button value="b2">
</div>
then the element with role="toolbar" and id="test" exposes aria-orientation="horizontal"
ATK
|
property
|
role
|
is
|
ROLE_TOOL_BAR
|
property
|
states
|
contains
|
STATE_HORIZONTAL
|
AXAPI
|
property
|
AXRole
|
is
|
AXToolbar
|
property
|
AXSubrole
|
is
|
<nil>
|
property
|
AXRoleDescription
|
is
|
toolbar
|
property
|
AXOrientation
|
is
|
AXHorizontalOrientation
|
IAccessible2
|
property
|
role
|
is
|
ROLE_SYSTEM_TOOLBAR
|
property
|
states
|
doesNotContain
|
IA2_STATE_VERTICAL
|
property
|
states
|
contains
|
IA2_STATE_HORIZONTAL
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_TOOLBAR
|
UIA
|
property
|
ControlType
|
is
|
ToolBar
|
property
|
Orientation
|
is
|
horizontal
|
toolbar orientation horizontal
if given
<div role="toolbar" aria-orientation="horizontal" id="test">
<button value="b1"> <button value="b2">
</div>
then the element with role="toolbar" and id="test" exposes aria-orientation="horizontal"
ATK
|
property
|
role
|
is
|
ROLE_TOOL_BAR
|
property
|
states
|
contains
|
STATE_HORIZONTAL
|
AXAPI
|
property
|
AXRole
|
is
|
AXToolbar
|
property
|
AXSubrole
|
is
|
<nil>
|
property
|
AXRoleDescription
|
is
|
toolbar
|
property
|
AXOrientation
|
is
|
AXHorizontalOrientation
|
IAccessible2
|
property
|
role
|
is
|
ROLE_SYSTEM_TOOLBAR
|
property
|
states
|
doesNotContain
|
IA2_STATE_VERTICAL
|
property
|
states
|
contains
|
IA2_STATE_HORIZONTAL
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_TOOLBAR
|
UIA
|
property
|
ControlType
|
is
|
ToolBar
|
property
|
Orientation
|
is
|
horizontal
|
toolbar orientation vertical
if given
<div role="toolbar" aria-orientation="vertical" id="test">
<button value="b1"> <button value="b2">
</div>
then the element with role="toolbar" and id="test" exposes aria-orientation="vertical"
ATK
|
property
|
role
|
is
|
ROLE_TOOL_BAR
|
property
|
states
|
contains
|
STATE_VERTICAL
|
AXAPI
|
property
|
AXRole
|
is
|
AXToolbar
|
property
|
AXSubrole
|
is
|
<nil>
|
property
|
AXRoleDescription
|
is
|
toolbar
|
property
|
AXOrientation
|
is
|
AXVerticalOrientation
|
IAccessible2
|
property
|
role
|
is
|
ROLE_SYSTEM_TOOLBAR
|
property
|
states
|
contains
|
IA2_STATE_VERTICAL
|
property
|
states
|
doesNotContain
|
IA2_STATE_HORIZONTAL
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_TOOLBAR
|
UIA
|
property
|
ControlType
|
is
|
ToolBar
|
property
|
Orientation
|
is
|
vertical
|
tree orientation unspecified
if given
<div role="tree" tabindex="0" aria-activedescendant="foo" id="test">
<div id="foo" role="treeitem">foo</div>
<div role="treeitem">baz</div>
</div>
then the element with role="tree" and id="test" exposes aria-orientation="vertical"
ATK
|
property
|
role
|
is
|
ROLE_TREE
|
property
|
interfaces
|
contains
|
Selection
|
property
|
states
|
contains
|
STATE_VERTICAL
|
AXAPI
|
property
|
AXRole
|
is
|
AXOutline
|
property
|
AXSubrole
|
is
|
<nil>
|
property
|
AXRoleDescription
|
is
|
outline
|
property
|
AXOrientation
|
is
|
AXVerticalOrientation
|
IAccessible2
|
property
|
role
|
is
|
ROLE_SYSTEM_OUTLINE
|
property
|
states
|
contains
|
IA2_STATE_VERTICAL
|
property
|
states
|
doesNotContain
|
IA2_STATE_HORIZONTAL
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_OUTLINE
|
UIA
|
property
|
ControlType
|
is
|
Tree
|
property
|
Orientation
|
is
|
vertical
|
tree orientation horizontal
if given
<div role="tree" tabindex="0" aria-orientation="horizontal" aria-activedescendant="foo" id="test">
<div id="foo" role="treeitem">foo</div>
<div role="treeitem">baz</div>
</div>
then the element with role="tree" and id="test" exposes aria-orientation="vertical"
ATK
|
property
|
role
|
is
|
ROLE_TREE
|
property
|
interfaces
|
contains
|
Selection
|
property
|
states
|
contains
|
STATE_HORIZONTAL
|
AXAPI
|
property
|
AXRole
|
is
|
AXOutline
|
property
|
AXSubrole
|
is
|
<nil>
|
property
|
AXRoleDescription
|
is
|
outline
|
property
|
AXOrientation
|
is
|
AXHorizontalOrientation
|
IAccessible2
|
property
|
role
|
is
|
ROLE_SYSTEM_OUTLINE
|
property
|
states
|
contains
|
IA2_STATE_HORIZONTAL
|
property
|
states
|
doesNotContain
|
IA2_STATE_VERTICAL
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_OUTLINE
|
UIA
|
property
|
ControlType
|
is
|
Tree
|
property
|
Orientation
|
is
|
horizontal
|
tree orientation vertical
if given
<div role="tree" tabindex="0" aria-orientation="vertical" aria-activedescendant="foo" id="test">
<div id="foo" role="treeitem">foo</div>
<div role="treeitem">baz</div>
</div>
then the element with role="tree" and id="test" exposes aria-orientation="vertical"
ATK
|
property
|
role
|
is
|
ROLE_TREE
|
property
|
interfaces
|
contains
|
Selection
|
property
|
states
|
contains
|
STATE_VERTICAL
|
AXAPI
|
property
|
AXRole
|
is
|
AXOutline
|
property
|
AXSubrole
|
is
|
<nil>
|
property
|
AXRoleDescription
|
is
|
outline
|
property
|
AXOrientation
|
is
|
AXVerticalOrientation
|
IAccessible2
|
property
|
role
|
is
|
ROLE_SYSTEM_OUTLINE
|
property
|
states
|
contains
|
IA2_STATE_VERTICAL
|
property
|
states
|
doesNotContain
|
IA2_STATE_HORIZONTAL
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_OUTLINE
|
UIA
|
property
|
ControlType
|
is
|
Tree
|
property
|
Orientation
|
is
|
vertical
|
treegrid orientation unspecified
if given
<div role="treegrid" tabindex="0" aria-activedescendant="foo" id="test">
<div role="row">
<div role="cell" id="foo">c1</div>
<div role="cell">c2</div>
</div>
</div>
then the element with role="treegrid" and id="test" exposes aria-orientation="undefined"
ATK
|
property
|
role
|
is
|
ROLE_TREE_TABLE
|
property
|
interfaces
|
contains
|
Selection
|
property
|
states
|
doesNotContain
|
STATE_VERTICAL
|
property
|
states
|
doesNotContain
|
STATE_HORIZONTAL
|
AXAPI
|
property
|
AXRole
|
is
|
AXTable
|
property
|
AXSubrole
|
is
|
<nil>
|
property
|
AXRoleDescription
|
is
|
table
|
property
|
AXOrientation
|
isNot
|
AXVerticalOrientation
|
property
|
AXOrientation
|
isNot
|
AXHorizontalOrientation
|
IAccessible2
|
property
|
role
|
is
|
ROLE_SYSTEM_OUTLINE
|
property
|
states
|
doesNotContain
|
IA2_STATE_VERTICAL
|
property
|
states
|
doesNotContain
|
IA2_STATE_HORIZONTAL
|
property
|
interfaces
|
contains
|
IAccessibleTable2
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_OUTLINE
|
UIA
|
property
|
ControlType
|
is
|
DataGrid
|
property
|
Orientation
|
isNot
|
vertical
|
property
|
Orientation
|
isNot
|
horizontal
|
treegrid orientation horizontal
if given
<div role="treegrid" tabindex="0" aria-orientation="horizontal" aria-activedescendant="foo" id="test">
<div role="row">
<div role="cell" id="foo">c1</div>
<div role="cell">c2</div>
</div>
</div>
then the element with role="treegrid" and id="test" exposes aria-orientation="horizontal"
ATK
|
property
|
role
|
is
|
ROLE_TREE_TABLE
|
property
|
interfaces
|
contains
|
Selection
|
property
|
states
|
contains
|
STATE_HORIZONTAL
|
AXAPI
|
property
|
AXRole
|
is
|
AXTable
|
property
|
AXSubrole
|
is
|
<nil>
|
property
|
AXRoleDescription
|
is
|
table
|
property
|
AXOrientation
|
is
|
AXHorizontalOrientation
|
IAccessible2
|
property
|
role
|
is
|
ROLE_SYSTEM_OUTLINE
|
property
|
states
|
doesNotContain
|
IA2_STATE_VERTICAL
|
property
|
states
|
contains
|
IA2_STATE_HORIZONTAL
|
property
|
interfaces
|
contains
|
IAccessibleTable2
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_OUTLINE
|
UIA
|
property
|
ControlType
|
is
|
DataGrid
|
property
|
Orientation
|
is
|
horizontal
|
treegrid orientation vertical
if given
<div role="treegrid" tabindex="0" aria-orientation="vertical" aria-activedescendant="foo" id="test">
<div role="row">
<div role="cell" id="foo">c1</div>
<div role="cell">c2</div>
</div>
</div>
then the element with role="treegrid" and id="test" exposes aria-orientation="vertical"
ATK
|
property
|
role
|
is
|
ROLE_TREE_TABLE
|
property
|
interfaces
|
contains
|
Selection
|
property
|
states
|
contains
|
STATE_VERTICAL
|
AXAPI
|
property
|
AXRole
|
is
|
AXTable
|
property
|
AXSubrole
|
is
|
<nil>
|
property
|
AXRoleDescription
|
is
|
table
|
property
|
AXOrientation
|
is
|
AXVerticalOrientation
|
IAccessible2
|
property
|
role
|
is
|
ROLE_SYSTEM_OUTLINE
|
property
|
states
|
contains
|
IA2_STATE_VERTICAL
|
property
|
states
|
doesNotContain
|
IA2_STATE_HORIZONTAL
|
property
|
interfaces
|
contains
|
IAccessibleTable2
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_OUTLINE
|
UIA
|
property
|
ControlType
|
is
|
DataGrid
|
property
|
Orientation
|
is
|
vertical
|
aria-placeholder
The aria-placeholder property was added during ARIA 1.1. It is supported in textbox and searchbox and has a value type of string.
Documentation:
searchbox placeholder
if given
<div contenteditable="true" role="searchbox" aria-placeholder="DD/MM/YYYY" id="test">
"DD/MM/YYYY"
</div>
then the element with role="textbox" and id="test" exposes aria-placeholder="DD/MM/YYYY"
ATK
|
property
|
role
|
is
|
ROLE_ENTRY
|
property
|
interfaces
|
contains
|
EditableText
|
property
|
objectAttributes
|
contains
|
placeholder-text:DD/MM/YYYY
|
AXAPI
|
property
|
AXRole
|
is
|
AXTextField
|
property
|
AXSubrole
|
is
|
AXSearchField
|
property
|
AXRoleDescription
|
is
|
search text field
|
property
|
AXPlaceholderValue
|
is
|
DD/MM/YYYY
|
IAccessible2
|
property
|
role
|
is
|
ROLE_SYSTEM_TEXT
|
property
|
states
|
doesNotContain
|
IA2_STATE_SINGLE_LINE
|
property
|
objectAttributes
|
contains
|
placeholder-text:DD/MM/YYYY
|
property
|
objectAttributes
|
contains
|
text-input-type:search
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_TEXT
|
UIA
|
property
|
ControlType
|
is
|
Edit
|
property
|
LocalizedControlType
|
is
|
search box
|
result
|
AriaProperties.placeholder
|
is
|
DD/MM/YYYY
|
textbox placeholder
if given
<div contenteditable="true" role="textbox" aria-placeholder="DD/MM/YYYY" id="test">
"DD/MM/YYYY"
</div>
then the element with role="textbox" and id="test" exposes aria-placeholder="DD/MM/YYYY"
ATK
|
property
|
role
|
is
|
ROLE_ENTRY
|
property
|
interfaces
|
contains
|
EditableText
|
property
|
states
|
contains
|
STATE_SINGLE_LINE
|
property
|
objectAttributes
|
contains
|
placeholder-text:DD/MM/YYYY
|
AXAPI
|
property
|
AXRole
|
is
|
AXTextField
|
property
|
AXSubrole
|
is
|
<nil>
|
property
|
AXRoleDescription
|
is
|
text field
|
property
|
AXPlaceholderValue
|
is
|
DD/MM/YYYY
|
IAccessible2
|
property
|
role
|
is
|
ROLE_SYSTEM_TEXT
|
property
|
states
|
doesNotContain
|
IA2_STATE_SINGLE_LINE
|
property
|
objectAttributes
|
contains
|
placeholder-text:DD/MM/YYYY
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_TEXT
|
UIA
|
property
|
ControlType
|
is
|
Edit
|
result
|
AriaProperties.placeholder
|
is
|
DD/MM/YYYY
|
textbox placeholder on input with html placeholder value (see HTML-AAM issue 87)
Note: See HTML-AAM issue 87: https://github.com/w3c/html-aam/issues/87
if given
<form>
<input type="textbox" placeholder="ABC" role="textbox" aria-placeholder="DD/MM/YYYY" id="test">
<input type="submit">
</form>
then the element with role="textbox" and id="test" exposes aria-placeholder="ABC"
ATK
|
property
|
role
|
is
|
ROLE_ENTRY
|
property
|
interfaces
|
contains
|
EditableText
|
property
|
states
|
contains
|
STATE_SINGLE_LINE
|
property
|
objectAttributes
|
contains
|
placeholder-text:ABC
|
AXAPI
|
property
|
AXRole
|
is
|
AXTextField
|
property
|
AXSubrole
|
is
|
<nil>
|
property
|
AXRoleDescription
|
is
|
text field
|
property
|
AXPlaceholderValue
|
is
|
ABC
|
IAccessible2
|
property
|
role
|
is
|
ROLE_SYSTEM_TEXT
|
property
|
states
|
doesNotContain
|
IA2_STATE_SINGLE_LINE
|
property
|
objectAttributes
|
contains
|
placeholder-text:ABC
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_TEXT
|
UIA
|
property
|
ControlType
|
is
|
Edit
|
result
|
AriaProperties.placeholder
|
is
|
ABC
|
aria-posinset and aria-setsize
In ARIA 1.1, aria-posinset and aria-setsize became supported properties of:
- article (when article is in feed)
- menuitem
- menuitemcheckbox
- menuitemradio
- tab
In addition, -1 was added as a valid value for aria-setsize as a means to indicate that the set size is unknown and should not be calculated by user agents.
QUESTION: The spec language regarding the use of aria-posinset and aria-setsize on article is, "When an article is in the context of a feed, the author may specify values for aria-posinset and aria-setsize." There does not seem to be a statement regarding what user agents are expected to do if the author uses these attributes on an article that is not in the context of a feed. Does that make this condition not testable?
ANSWER: No test is possible since the condition is underdetermined:
- It's an author responsibility but it's optional ("authors MAY ..."), with no requirement for context-free articles (no "authors MUST NOT ...").
- There is no requirement for how user agents handle aria-posinset and aria-setsize on an article that is context-free.
That said, a test is needed to show that aria-posinet and aria-setsize are properly exposed when used with the article role. The test below is sufficient.
Documentation:
article not in feed posinset and setsize
if given
<div id="test" role="article" aria-posinset="4" aria-setsize="8">test cell</div>
then role: article, aria-posinset: 4, aria-setsize: 8
ATK
|
property
|
role
|
is
|
ROLE_ARTICLE
|
property
|
objectAttributes
|
contains
|
xml-roles:article
|
property
|
objectAttributes
|
contains
|
posinset:4
|
property
|
objectAttributes
|
contains
|
setsize:8
|
AXAPI
|
property
|
AXRole
|
is
|
AXGroup
|
property
|
AXSubrole
|
is
|
AXDocumentArticle
|
property
|
AXRoleDescription
|
is
|
article
|
property
|
AXARIAPosInSet
|
is
|
4
|
property
|
AXARIASetSize
|
is
|
8
|
IAccessible2
|
property
|
role
|
is
|
ROLE_SYSTEM_DOCUMENT
|
property
|
objectAttributes
|
contains
|
xml-roles:article
|
property
|
objectAttributes
|
contains
|
posinset:4
|
property
|
objectAttributes
|
contains
|
setsize:8
|
property
|
groupPosition
|
contains
|
similarItemsInGroup:8
|
property
|
groupPosition
|
contains
|
positionInGroup:4
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_DOCUMENT
|
property
|
states
|
contains
|
STATE_SYSTEM_READONLY
|
UIA
|
property
|
ControlType
|
is
|
Group
|
property
|
LocalizedControlType
|
is
|
article
|
property
|
AriaProperties.posinset
|
is
|
4
|
property
|
AriaProperties.setsize
|
is
|
8
|
article in feed posinset and setsize
if given
<div role="feed">
<div id="test" role="article" aria-posinset="4" aria-setsize="8">test cell</div>
</div>
then role: article, aria-posinset: 4, aria-setsize: 8
ATK
|
property
|
role
|
is
|
ROLE_ARTICLE
|
property
|
objectAttributes
|
contains
|
xml-roles:article
|
property
|
objectAttributes
|
contains
|
posinset:4
|
property
|
objectAttributes
|
contains
|
setsize:8
|
AXAPI
|
property
|
AXRole
|
is
|
AXGroup
|
property
|
AXSubrole
|
is
|
AXDocumentArticle
|
property
|
AXRoleDescription
|
is
|
article
|
property
|
AXARIAPosInSet
|
is
|
4
|
property
|
AXARIASetSize
|
is
|
8
|
IAccessible2
|
property
|
objectAttributes
|
contains
|
xml-roles:article
|
property
|
objectAttributes
|
contains
|
posinset:4
|
property
|
objectAttributes
|
contains
|
setsize:8
|
property
|
groupPosition
|
contains
|
similarItemsInGroup:8
|
property
|
groupPosition
|
contains
|
positionInGroup:4
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_DOCUMENT
|
property
|
states
|
contains
|
STATE_SYSTEM_READONLY
|
UIA
|
property
|
ControlType
|
is
|
Group
|
property
|
LocalizedControlType
|
is
|
article
|
property
|
AriaProperties.posinset
|
is
|
4
|
property
|
AriaProperties.setsize
|
is
|
8
|
article in feed setsize -1
if given
<div role="feed">
<div id="test" role="article" aria-setsize="-1">test cell</div>
</div>
then role: article, aria-setsize: -1
ATK
|
property
|
role
|
is
|
ROLE_ARTICLE
|
property
|
objectAttributes
|
contains
|
xml-roles:article
|
property
|
objectAttributes
|
contains
|
setsize:-1
|
AXAPI
|
property
|
AXRole
|
is
|
AXGroup
|
property
|
AXSubrole
|
is
|
AXDocumentArticle
|
property
|
AXRoleDescription
|
is
|
article
|
property
|
AXARIASetSize
|
is
|
-1
|
IAccessible2
|
property
|
objectAttributes
|
contains
|
xml-roles:article
|
property
|
objectAttributes
|
contains
|
setsize:-1
|
property
|
groupPosition
|
contains
|
similarItemsInGroup:-1
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_DOCUMENT
|
property
|
states
|
contains
|
STATE_SYSTEM_READONLY
|
UIA
|
property
|
ControlType
|
is
|
Group
|
property
|
LocalizedControlType
|
is
|
article
|
property
|
AriaProperties.setsize
|
is
|
-1
|
listitem setsize -1
if given
<div role="list">
<div id="test" role="listitem" aria-setsize="-1">test cell</div>
</div>
then role: article, aria-setsize: -1
ATK
|
property
|
role
|
is
|
ROLE_LIST_ITEM
|
property
|
states
|
doesNotContain
|
STATE_EDITABLE
|
property
|
objectAttributes
|
contains
|
setsize:-1
|
AXAPI
|
property
|
AXRole
|
is
|
AXGroup
|
property
|
AXSubrole
|
is
|
<nil>
|
property
|
AXRoleDescription
|
is
|
group
|
property
|
AXARIASetSize
|
is
|
-1
|
IAccessible2
|
property
|
objectAttributes
|
contains
|
setsize:-1
|
property
|
groupPosition
|
contains
|
similarItemsInGroup:-1
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_LISTITEM
|
property
|
states
|
contains
|
STATE_SYSTEM_READONLY
|
UIA
|
property
|
ControlType
|
is
|
ListItem
|
property
|
AriaProperties.setsize
|
is
|
-1
|
property
|
controlPatterns
|
contains
|
SelectionItem
|
menuitem posinset and setsize
if given
<ul role='menu'>Menu
<li role='menuitem'> option 1</li>
<li role='menuitem' id='test' aria-posinset='4' aria-setsize='8'> option 2</li>
<li role='menuitem'> option 3</li>
</ul>
then role: menuitem, aria-posinset:4, aria-setsize:8
ATK
|
property
|
role
|
is
|
ROLE_MENU_ITEM
|
property
|
objectAttributes
|
contains
|
posinset:4
|
property
|
objectAttributes
|
contains
|
setsize:8
|
AXAPI
|
property
|
AXRole
|
is
|
AXMenuItem
|
property
|
AXSubrole
|
is
|
<nil>
|
property
|
AXRoleDescription
|
is
|
menu item
|
property
|
AXARIAPosInSet
|
is
|
4
|
property
|
AXARIASetSize
|
is
|
8
|
IAccessible2
|
property
|
objectAttributes
|
contains
|
posinset:4
|
property
|
objectAttributes
|
contains
|
setsize:8
|
property
|
groupPosition
|
contains
|
similarItemsInGroup:8
|
property
|
groupPosition
|
contains
|
positionInGroup:4
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_MENUITEM
|
UIA
|
property
|
ControlType
|
is
|
MenuItem
|
property
|
AriaProperties.posinset
|
is
|
4
|
property
|
AriaProperties.setsize
|
is
|
8
|
menuitemcheckbox posinset and setsize
if given
<ul role='menu'>Menu
<li role='menuitem'> option 1</li>
<li role='menuitemcheckbox' id='test' aria-posinset='4' aria-setsize='8'
class='ckbox' aria-checked='true'>panda doodles</li>
<li role='menuitem'> option 3</li>
</ul>
then role: menuitemcheckbox, aria-posinset:4, aria-setsize:8, aria-checked:true
ATK
|
property
|
role
|
is
|
ROLE_CHECK_MENU_ITEM
|
property
|
states
|
contains
|
STATE_CHECKABLE
|
property
|
states
|
contains
|
STATE_CHECKED
|
property
|
objectAttributes
|
contains
|
posinset:4
|
property
|
objectAttributes
|
contains
|
setsize:8
|
AXAPI
|
property
|
AXRole
|
is
|
AXMenuItem
|
property
|
AXSubrole
|
is
|
<nil>
|
property
|
AXRoleDescription
|
is
|
menu item
|
property
|
AXValue
|
is
|
1
|
property
|
AXARIAPosInSet
|
is
|
4
|
property
|
AXARIASetSize
|
is
|
8
|
IAccessible2
|
property
|
role
|
is
|
IA2_ROLE_CHECK_MENU_ITEM
|
property
|
objectAttributes
|
contains
|
checkable:true
|
property
|
objectAttributes
|
contains
|
posinset:4
|
property
|
objectAttributes
|
contains
|
setsize:8
|
property
|
groupPosition
|
contains
|
similarItemsInGroup:8
|
property
|
groupPosition
|
contains
|
positionInGroup:4
|
MSAA
|
property
|
role
|
isAny
|
[ROLE_SYSTEM_MENUITEM, ROLE_SYSTEM_CHECKBUTTON]
|
UIA
|
property
|
ControlType
|
is
|
MenuItem
|
property
|
Toggle.ToggleState
|
is
|
On
|
property
|
AriaProperties.posinset
|
is
|
4
|
property
|
AriaProperties.setsize
|
is
|
8
|
menuitemradio posinset and setsize
if given
<ul role='menu'>Menu
<li role='menuitemradio'> option 1</li>
<li role='menuitemradio' id='test' aria-posinset='4' aria-setsize='8'>panda doodles</li>
<li role='menuitemradio'> option 3</li>
</ul>
then role: menuitemradio, aria-posinset:4, aria-setsize:8
ATK
|
property
|
role
|
is
|
ROLE_RADIO_MENU_ITEM
|
property
|
states
|
contains
|
STATE_CHECKABLE
|
property
|
objectAttributes
|
contains
|
posinset:4
|
property
|
objectAttributes
|
contains
|
setsize:8
|
AXAPI
|
property
|
AXRole
|
is
|
AXMenuItem
|
property
|
AXSubrole
|
is
|
<nil>
|
property
|
AXRoleDescription
|
is
|
menu item
|
property
|
AXValue
|
is
|
0
|
property
|
AXARIAPosInSet
|
is
|
4
|
property
|
AXARIASetSize
|
is
|
8
|
property
|
AXMenuItemMarkChar
|
is
|
<nil>
|
IAccessible2
|
property
|
role
|
is
|
IA2_ROLE_RADIO_MENU_ITEM
|
property
|
objectAttributes
|
contains
|
checkable:true
|
property
|
objectAttributes
|
contains
|
posinset:4
|
property
|
objectAttributes
|
contains
|
setsize:8
|
property
|
groupPosition
|
contains
|
similarItemsInGroup:8
|
property
|
groupPosition
|
contains
|
positionInGroup:4
|
MSAA
|
property
|
role
|
isAny
|
[ROLE_SYSTEM_RADIOBUTTON, ROLE_SYSTEM_MENUITEM]
|
UIA
|
property
|
ControlType
|
is
|
MenuItem
|
property
|
controlPatterns
|
contains
|
Toggle
|
property
|
controlPatterns
|
contains
|
SelectionItem
|
property
|
Toggle.ToggleState
|
is
|
Off
|
property
|
AriaProperties.posinset
|
is
|
4
|
property
|
AriaProperties.setsize
|
is
|
8
|
tab posinset and setsize
if given
<div role='tabpanel'>
<div role='tab' aria-selected='false'>Hello Mary</div>
<div role='tab' id='test' aria-selected='true' aria-posinset='3' aria-setsize='7'>Hello Bob</div>
</div>
then role:tab, aria-selected: true, aria-posinset: 3, aria-setsize: 7
ATK
|
property
|
role
|
is
|
ROLE_PAGE_TAB
|
property
|
states
|
contains
|
STATE_SELECTED
|
property
|
states
|
contains
|
STATE_SELECTABLE
|
property
|
objectAttributes
|
contains
|
posinset:3
|
property
|
objectAttributes
|
contains
|
setsize:7
|
AXAPI
|
property
|
AXRole
|
is
|
AXRadioButton
|
property
|
AXSubrole
|
is
|
<nil>
|
property
|
AXRoleDescription
|
is
|
tab
|
property
|
AXARIAPosInSet
|
is
|
3
|
property
|
AXARIASetSize
|
is
|
7
|
property
|
AXSelected
|
is
|
true
|
IAccessible2
|
property
|
role
|
is
|
ROLE_SYSTEM_PAGETAB
|
property
|
objectAttributes
|
contains
|
posinset:3
|
property
|
objectAttributes
|
contains
|
setsize:7
|
property
|
groupPosition
|
contains
|
similarItemsInGroup:7
|
property
|
groupPosition
|
contains
|
positionInGroup:3
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_PAGETAB
|
property
|
states
|
contains
|
STATE_SYSTEM_SELECTED
|
property
|
states
|
contains
|
STATE_SYSTEM_SELECTABLE
|
UIA
|
property
|
ControlType
|
is
|
TabItem
|
property
|
AriaProperties.posinset
|
is
|
3
|
property
|
AriaProperties.setsize
|
is
|
7
|
property
|
SelectionItem
|
isNot
|
IsSelected
|
aria-readonly
ARIA 1.1 adds aria-readonly to the following roles: checkbox, combobox, listbox, menuitemcheckbox, menuitemradio, radiogroup, slider, and spinbutton.
In addition, the following normative statement was added to the ARIA 1.1 spec for grids: "If aria-readonly is set on an element with role grid, user agents MUST propagate the value to all gridcell elements owned by the grid and expose the value in the accessibility API." (The 1.0 statement was "The value of the grid element's aria-readonly attribute is implicitly propagated to all of its owned gridcell elements, and will be exposed through the accessibility API.")
Lastly, the following normative statements were added to the columnheader and rowheader roles respectively in ARIA 1.1:
- "user agents SHOULD NOT expose either (aria-readonly or aria-required) property to assistive technologies unless the columnheader descends from a grid."
- "user agents SHOULD NOT expose either (aria-readonly or aria-required) property to assistive technologies unless the rowheader descends from a grid."
QUESTION 1: Joanie assumes that although ARIA 1.0's "implicitly propagated" and "will be exposed" suggests user agents need to do this, ARIA 1.1's "user agents MUST" means we now need to test that it really is being done.
ANSWER 1: It depends on whether "implicitily propagated" is normative. Nonetheless, there is no test case in the ARIA 1.0 test harness for implicit propagation of aria-readonly to a grid's gridcells. NEEDS TEST.
QUESTION 2: "SHOULD NOT expose" is not a "MUST NOT expose." Are only "MUST" and "MUST NOT" statements for user agents to be tested? Joanie added test placeholders in the meantime.
ANSWER: Yes, only MUST and MUST NOT statements are tested. However, an implication of "SHOULD NOT expose unless the columnheader descends from a grid" is "MUST expose if the columnheader descends from a grid".
Documentation:
grid columnheader readonly true
NOTE: aria-readonly is an attribute of the grid element
if given
<div role="grid" >
<div role="row">
<div id="test" role="columnheader" aria-readonly="true">test cell</div>
</div>
</div>
then expose aria-readonly="true" on the element with id="test"
ATK
|
property
|
role
|
is
|
ROLE_COLUMN_HEADER
|
property
|
states
|
contains
|
STATE_READ_ONLY
|
AXAPI
|
property
|
AXRole
|
is
|
AXCell
|
result
|
AXUIElementIsAttributeSettable(AXValue)
|
is
|
false
|
IAccessible2
|
property
|
role
|
is
|
ROLE_SYSTEM_COLUMNHEADER
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_COLUMNHEADER
|
property
|
states
|
contains
|
STATE_SYSTEM_READONLY
|
UIA
|
property
|
ControlType
|
is
|
HeaderItem
|
property
|
Value.IsReadOnly
|
is
|
true
|
grid columnheader readonly false
NOTE: aria-readonly is an attribute of the grid element
if given
<div role="grid">
<div role="row">
<div id="test" role="columnheader" aria-readonly="false">test cell</div>
</div>
</div>
then expose aria-readonly="false" on the element with id="test"
ATK
|
property
|
role
|
is
|
ROLE_COLUMN_HEADER
|
property
|
states
|
doesNotContain
|
STATE_READ_ONLY
|
AXAPI
|
property
|
AXRole
|
is
|
AXCell
|
result
|
AXUIElementIsAttributeSettable(AXValue)
|
is
|
true
|
IAccessible2
|
property
|
role
|
is
|
ROLE_SYSTEM_COLUMNHEADER
|
property
|
states
|
contains
|
IA2_STATE_EDITABLE
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_COLUMNHEADER
|
property
|
states
|
doesNotContain
|
STATE_SYSTEM_READONLY
|
UIA
|
property
|
ControlType
|
is
|
HeaderItem
|
property
|
Value.IsReadOnly
|
is
|
false
|
grid columnheader readonly unspecified
if given
<div role="grid">
<div role="row">
<div id="test" role="columnheader">test cell</div>
</div>
</div>
then expose aria-readonly="false" on the element with id="test"
ATK
|
property
|
role
|
is
|
ROLE_COLUMN_HEADER
|
property
|
states
|
doesNotContain
|
STATE_READ_ONLY
|
AXAPI
|
property
|
AXRole
|
is
|
AXCell
|
result
|
AXUIElementIsAttributeSettable(AXValue)
|
is
|
true
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_COLUMNHEADER
|
property
|
states
|
doesNotContain
|
STATE_SYSTEM_READONLY
|
UIA
|
property
|
ControlType
|
is
|
HeaderItem
|
property
|
Value.IsReadOnly
|
is
|
false
|
NOTE: aria-readonly is an attribute of the grid element
if given
<div role="grid">
<div role="row">
<div id="test" role="rowheader" aria-readonly="true">test cell</div>
</div>
</div>
then expose aria-readonly="true" on the element with id="test"
ATK
|
property
|
role
|
is
|
ROLE_ROW_HEADER
|
property
|
states
|
contains
|
STATE_READ_ONLY
|
AXAPI
|
property
|
AXRole
|
is
|
AXCell
|
result
|
AXUIElementIsAttributeSettable(AXValue)
|
is
|
false
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_ROWHEADER
|
property
|
states
|
contains
|
STATE_SYSTEM_READONLY
|
UIA
|
property
|
ControlType
|
is
|
HeaderItem
|
property
|
Value.IsReadOnly
|
is
|
true
|
FNOTE: aria-readonly is an attribute of the grid element
if given
<div role="grid">
<div role="row">
<div id="test" role="rowheader" aria-readonly="false">test cell</div>
</div>
</div>
then expose aria-readonly="false" on the element with id="test"
ATK
|
property
|
role
|
is
|
ROLE_ROW_HEADER
|
property
|
states
|
doesNotContain
|
STATE_READ_ONLY
|
AXAPI
|
property
|
AXRole
|
is
|
AXCell
|
result
|
AXUIElementIsAttributeSettable(AXValue)
|
is
|
true
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_ROWHEADER
|
property
|
states
|
doesNotContain
|
STATE_SYSTEM_READONLY
|
UIA
|
property
|
ControlType
|
is
|
HeaderItem
|
property
|
Value.IsReadOnly
|
is
|
false
|
if given
<div role="grid">
<div role="row">
<div id="test" role="rowheader">test cell</div>
</div>
</div>
then expose aria-readonly="false" on the element with id="test"
ATK
|
property
|
role
|
is
|
ROLE_ROW_HEADER
|
property
|
states
|
doesNotContain
|
STATE_READ_ONLY
|
AXAPI
|
property
|
AXRole
|
is
|
AXCell
|
result
|
AXUIElementIsAttributeSettable(AXValue)
|
is
|
true
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_ROWHEADER
|
property
|
states
|
doesNotContain
|
STATE_SYSTEM_READONLY
|
UIA
|
property
|
ControlType
|
is
|
HeaderItem
|
property
|
Value.IsReadOnly
|
is
|
false
|
checkbox readonly unspecified
if given
<div id="test" role="checkbox">test cell</div>
then expose aria-readonly="false" on the element with id="test"
ATK
|
property
|
role
|
is
|
ROLE_CHECK_BOX
|
property
|
states
|
doesNotContain
|
STATE_READ_ONLY
|
AXAPI
|
property
|
AXRole
|
is
|
AXCheckBox
|
property
|
AXSubrole
|
is
|
<nil>
|
property
|
AXRoleDescription
|
is
|
checkbox
|
result
|
AXUIElementIsAttributeSettable(AXValue)
|
is
|
true
|
IAccessible2
|
property
|
role
|
is
|
ROLE_SYSTEM_CHECKBUTTON
|
property
|
objectAttributes
|
contains
|
checkable:true
|
property
|
states
|
contains
|
IA2_STATE_EDITABLE
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_CHECKBUTTON
|
UIA
|
property
|
ControlType
|
is
|
Checkbox
|
property
|
Value.IsReadOnly
|
is
|
false
|
checkbox readonly true
if given
<div id="test" aria-readonly="true" role="checkbox">test cell</div>
then expose aria-readonly="true" on the element with id="test"
ATK
|
property
|
role
|
is
|
ROLE_CHECK_BOX
|
property
|
states
|
doesNotContain
|
STATE_CHECKABLE
|
property
|
states
|
contains
|
STATE_READ_ONLY
|
AXAPI
|
property
|
AXRole
|
is
|
AXCheckBox
|
property
|
AXSubrole
|
is
|
<nil>
|
property
|
AXRoleDescription
|
is
|
checkbox
|
result
|
AXUIElementIsAttributeSettable(AXValue)
|
is
|
false
|
IAccessible2
|
property
|
objectAttributes
|
contains
|
checkable:true
|
property
|
states
|
doesNotContain
|
IA2_STATE_EDITABLE
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_CHECKBUTTON
|
property
|
states
|
contains
|
STATE_SYSTEM_READONLY
|
UIA
|
property
|
ControlType
|
is
|
Checkbox
|
property
|
Value.IsReadOnly
|
is
|
true
|
checkbox readonly false
if given
<div id="test" aria-readonly="false" role="checkbox">test cell</div>
then expose aria-readonly="false" on the element with id="test"
ATK
|
property
|
role
|
is
|
ROLE_CHECK_BOX
|
property
|
states
|
doesNotContain
|
STATE_READ_ONLY
|
AXAPI
|
property
|
AXRole
|
is
|
AXCheckBox
|
property
|
AXSubrole
|
is
|
<nil>
|
property
|
AXRoleDescription
|
is
|
checkbox
|
result
|
AXUIElementIsAttributeSettable(AXValue)
|
is
|
true
|
IAccessible2
|
property
|
role
|
is
|
ROLE_SYSTEM_CHECKBUTTON
|
property
|
objectAttributes
|
contains
|
checkable:true
|
property
|
states
|
contains
|
IA2_STATE_EDITABLE
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_CHECKBUTTON
|
UIA
|
property
|
ControlType
|
is
|
Checkbox
|
property
|
Value.IsReadOnly
|
is
|
false
|
combobox readonly unspecified
if given
<div id="test" role="combobox" aria-owns="myID" aria-expanded="true" aria-haspopup="listbox"><span role="textbox">option 3</span></div>
<div role="listbox" id="myID">
<div role="option">option 1</div>
<div role="option">option 2</div>
<div role="option">option 3</div>
</div>
then then the element with id="test" exposes aria-readonly="false"
ATK
|
property
|
role
|
is
|
ROLE_COMBO_BOX
|
property
|
states
|
contains
|
STATE_EXPANDABLE
|
property
|
states
|
contains
|
STATE_HAS_POPUP
|
property
|
states
|
doesNotContain
|
STATE_READ_ONLY
|
AXAPI
|
property
|
AXRole
|
is
|
AXComboBox
|
property
|
AXSubrole
|
is
|
<nil>
|
property
|
AXRoleDescription
|
is
|
combo box
|
result
|
AXUIElementIsAttributeSettable(AXValue)
|
is
|
true
|
IAccessible2
|
property
|
role
|
is
|
ROLE_SYSTEM_COMBOBOX
|
property
|
objectAttributes
|
contains
|
haspopup:listbox
|
property
|
states
|
contains
|
IA2_STATE_EDITABLE
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_COMBOBOX
|
property
|
states
|
contains
|
STATE_SYSTEM_HASPOPUP
|
property
|
states
|
contains
|
STATE_SYSTEM_EXPANDED
|
UIA
|
property
|
ControlType
|
is
|
Combobox
|
property
|
Value.IsReadOnly
|
is
|
false
|
combobox readonly true
if given
<div id="test" role="combobox" aria-readonly="true" aria-owns="myID" aria-expanded="true" aria-haspopup="listbox"><span role="textbox">option 3</span></div>
<div role="listbox" id="myID">
<div role="option">option 1</div>
<div role="option">option 2</div>
<div role="option">option 3</div>
</div>
then then the element with id="test" exposes aria-readonly="true"
ATK
|
property
|
role
|
is
|
ROLE_COMBO_BOX
|
property
|
states
|
contains
|
STATE_EXPANDABLE
|
property
|
states
|
contains
|
STATE_HAS_POPUP
|
property
|
states
|
contains
|
STATE_READ_ONLY
|
AXAPI
|
property
|
AXRole
|
is
|
AXComboBox
|
property
|
AXSubrole
|
is
|
<nil>
|
property
|
AXRoleDescription
|
is
|
combo box
|
result
|
AXUIElementIsAttributeSettable(AXValue)
|
is
|
false
|
IAccessible2
|
property
|
role
|
is
|
ROLE_SYSTEM_COMBOBOX
|
property
|
objectAttributes
|
contains
|
haspopup:listbox
|
property
|
states
|
doesNotContain
|
IA2_STATE_EDITABLE
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_COMBOBOX
|
property
|
states
|
contains
|
STATE_SYSTEM_HASPOPUP
|
property
|
states
|
contains
|
STATE_SYSTEM_READONLY
|
property
|
states
|
contains
|
STATE_SYSTEM_EXPANDED
|
UIA
|
property
|
ControlType
|
is
|
Combobox
|
property
|
Value.IsReadOnly
|
is
|
true
|
combobox readonly false
if given
<div id="test" role="combobox" aria-readonly="false" aria-owns="myID" aria-expanded="true" aria-haspopup="listbox"><span role="textbox">option 3</span></div>
<div role="listbox" id="myID">
<div role="option">option 1</div>
<div role="option">option 2</div>
<div role="option">option 3</div>
</div>
then then the element with id="test" exposes aria-readonly="false"
ATK
|
property
|
role
|
is
|
ROLE_COMBO_BOX
|
property
|
states
|
contains
|
STATE_EXPANDABLE
|
property
|
states
|
contains
|
STATE_HAS_POPUP
|
property
|
states
|
doesNotContain
|
STATE_READ_ONLY
|
AXAPI
|
property
|
AXRole
|
is
|
AXComboBox
|
property
|
AXSubrole
|
is
|
<nil>
|
property
|
AXRoleDescription
|
is
|
combo box
|
result
|
AXUIElementIsAttributeSettable(AXValue)
|
is
|
true
|
IAccessible2
|
property
|
role
|
is
|
ROLE_SYSTEM_COMBOBOX
|
property
|
objectAttributes
|
contains
|
haspopup:listbox
|
property
|
states
|
contains
|
IA2_STATE_EDITABLE
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_COMBOBOX
|
property
|
states
|
contains
|
STATE_SYSTEM_HASPOPUP
|
property
|
states
|
contains
|
STATE_SYSTEM_EXPANDED
|
UIA
|
property
|
ControlType
|
is
|
Combobox
|
property
|
Value.IsReadOnly
|
is
|
false
|
listbox readonly unspecified
if given
<div id="test" role="listbox">
<div role="option">option 1</div>
<div role="option">option 2</div>
<div role="option">option 3</div>
</div>
then then the element with id="test" exposes aria-readonly="false"
ATK
|
property
|
role
|
is
|
ROLE_LIST_BOX
|
property
|
interfaces
|
contains
|
Selection
|
property
|
states
|
doesNotContain
|
STATE_READ_ONLY
|
AXAPI
|
property
|
AXRole
|
is
|
AXList
|
property
|
AXSubrole
|
is
|
<nil>
|
property
|
AXRoleDescription
|
is
|
list
|
result
|
AXUIElementIsAttributeSettable(AXValue)
|
is
|
true
|
IAccessible2
|
property
|
role
|
is
|
ROLE_SYSTEM_LIST
|
property
|
states
|
contains
|
IA2_STATE_EDITABLE
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_LIST
|
UIA
|
property
|
ControlType
|
is
|
List
|
property
|
Value.IsReadOnly
|
is
|
false
|
listbox readonly true
if given
<div id="test" aria-readonly="true" role="listbox">
<div role="option">option 1</div>
<div role="option">option 2</div>
<div role="option">option 3</div>
</div>
then then the element with id="test" exposes aria-readonly="true"
ATK
|
property
|
role
|
is
|
ROLE_LIST_BOX
|
property
|
interfaces
|
contains
|
Selection
|
property
|
states
|
contains
|
STATE_READ_ONLY
|
AXAPI
|
property
|
AXRole
|
is
|
AXList
|
property
|
AXSubrole
|
is
|
<nil>
|
property
|
AXRoleDescription
|
is
|
list
|
result
|
AXUIElementIsAttributeSettable(AXValue)
|
is
|
false
|
IAccessible2
|
property
|
role
|
is
|
ROLE_SYSTEM_LIST
|
property
|
states
|
doesNotContain
|
IA2_STATE_EDITABLE
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_LIST
|
property
|
states
|
contains
|
STATE_SYSTEM_READONLY
|
UIA
|
property
|
ControlType
|
is
|
List
|
property
|
Value.IsReadOnly
|
is
|
true
|
listbox readonly false
if given
<div id="test" aria-readonly="false" role="listbox">
<div role="option">option 1</div>
<div role="option">option 2</div>
<div role="option">option 3</div>
</div>
then then the element with id="test" exposes aria-readonly="false"
ATK
|
property
|
role
|
is
|
ROLE_LIST_BOX
|
property
|
interfaces
|
contains
|
Selection
|
property
|
states
|
doesNotContain
|
STATE_READ_ONLY
|
AXAPI
|
property
|
AXRole
|
is
|
AXList
|
property
|
AXSubrole
|
is
|
<nil>
|
property
|
AXRoleDescription
|
is
|
list
|
result
|
AXUIElementIsAttributeSettable(AXValue)
|
is
|
true
|
IAccessible2
|
property
|
role
|
is
|
ROLE_SYSTEM_LIST
|
property
|
states
|
contains
|
IA2_STATE_EDITABLE
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_LIST
|
UIA
|
property
|
ControlType
|
is
|
List
|
property
|
Value.IsReadOnly
|
is
|
false
|
if given
<div role="menu">
<div role="menuitemcheckbox" id="test">option 1</div>
</div>
then then the element with id="test" exposes aria-readonly="false"
ATK
|
property
|
role
|
is
|
ROLE_CHECK_MENU_ITEM
|
property
|
states
|
doesNotContain
|
STATE_READ_ONLY
|
AXAPI
|
property
|
AXRole
|
is
|
AXMenuItem
|
property
|
AXSubrole
|
is
|
<nil>
|
property
|
AXRoleDescription
|
is
|
menu item
|
result
|
AXUIElementIsAttributeSettable(AXValue)
|
is
|
true
|
IAccessible2
|
property
|
role
|
is
|
IA2_ROLE_CHECK_MENU_ITEM
|
property
|
states
|
contains
|
IA2_STATE_EDITABLE
|
MSAA
|
property
|
role
|
isAny
|
[ROLE_SYSTEM_CHECKBUTTON, ROLE_SYSTEM_MENUITEM]
|
UIA
|
property
|
ControlType
|
is
|
MenuItem
|
property
|
controlPatterns
|
contains
|
Toggle
|
property
|
Value.IsReadOnly
|
is
|
false
|
if given
<div role="menu">
<div role="menuitemcheckbox" aria-readonly="true" id="test">option 1</div>
</div>
then then the element with id="test" exposes aria-readonly="true"
ATK
|
property
|
role
|
is
|
ROLE_CHECK_MENU_ITEM
|
property
|
states
|
contains
|
STATE_READ_ONLY
|
AXAPI
|
property
|
AXRole
|
is
|
AXMenuItem
|
property
|
AXSubrole
|
is
|
<nil>
|
property
|
AXRoleDescription
|
is
|
menu item
|
result
|
AXUIElementIsAttributeSettable(AXValue)
|
is
|
false
|
IAccessible2
|
property
|
role
|
is
|
IA2_ROLE_CHECK_MENU_ITEM
|
property
|
states
|
contains
|
IA2_STATE_EDITABLE
|
MSAA
|
property
|
role
|
isAny
|
[ROLE_SYSTEM_CHECKBUTTON, ROLE_SYSTEM_MENUITEM]
|
property
|
states
|
contains
|
STATE_SYSTEM_READONLY
|
UIA
|
property
|
ControlType
|
is
|
MenuItem
|
property
|
controlPatterns
|
contains
|
Toggle
|
property
|
Value.IsReadOnly
|
is
|
true
|
if given
<div role="menu">
<div role="menuitemcheckbox" aria-readonly="false" id="test">option 1</div>
</div>
then then the element with id="test" exposes aria-readonly="false"
ATK
|
property
|
role
|
is
|
ROLE_CHECK_MENU_ITEM
|
property
|
states
|
contains
|
STATE_CHECKABLE
|
property
|
states
|
doesNotContain
|
STATE_READ_ONLY
|
AXAPI
|
property
|
AXRole
|
is
|
AXMenuItem
|
property
|
AXSubrole
|
is
|
<nil>
|
property
|
AXRoleDescription
|
is
|
menu item
|
result
|
AXUIElementIsAttributeSettable(AXValue)
|
is
|
true
|
IAccessible2
|
property
|
role
|
is
|
IA2_ROLE_CHECK_MENU_ITEM
|
property
|
states
|
contains
|
IA2_STATE_EDITABLE
|
MSAA
|
property
|
role
|
isAny
|
[ROLE_SYSTEM_CHECKBUTTON, ROLE_SYSTEM_MENUITEM]
|
UIA
|
property
|
ControlType
|
is
|
MenuItem
|
property
|
controlPatterns
|
contains
|
Toggle
|
property
|
Value.IsReadOnly
|
is
|
false
|
if given
<div role="menu">
<div role="menuitemradio" id="test">option 1</div>
</div>
then then the element with id="test" exposes aria-readonly="false"
ATK
|
property
|
role
|
is
|
ROLE_RADIO_MENU_ITEM
|
property
|
states
|
doesNotContain
|
STATE_READ_ONLY
|
AXAPI
|
property
|
AXRole
|
is
|
AXMenuItem
|
property
|
AXSubrole
|
is
|
<nil>
|
property
|
AXRoleDescription
|
is
|
menu item
|
result
|
AXUIElementIsAttributeSettable(AXValue)
|
is
|
true
|
IAccessible2
|
property
|
role
|
is
|
IA2_ROLE_RADIO_MENU_ITEM
|
property
|
states
|
contains
|
IA2_STATE_EDITABLE
|
MSAA
|
property
|
role
|
isAny
|
[ROLE_SYSTEM_RADIOBUTTON, ROLE_SYSTEM_MENUITEM]
|
UIA
|
property
|
ControlType
|
is
|
MenuItem
|
property
|
controlPatterns
|
contains
|
Toggle
|
property
|
controlPatterns
|
contains
|
SelectionItem
|
property
|
Value.IsReadOnly
|
is
|
false
|
if given
<div role="menu">
<div role="menuitemradio" aria-readonly="true" id="test">option 1</div>
</div>
then then the element with id="test" exposes aria-readonly="true"
ATK
|
property
|
role
|
is
|
ROLE_RADIO_MENU_ITEM
|
property
|
states
|
doesNotContain
|
STATE_CHECKABLE
|
property
|
states
|
contains
|
STATE_READ_ONLY
|
AXAPI
|
property
|
AXRole
|
is
|
AXMenuItem
|
property
|
AXSubrole
|
is
|
<nil>
|
property
|
AXRoleDescription
|
is
|
menu item
|
result
|
AXUIElementIsAttributeSettable(AXValue)
|
is
|
false
|
IAccessible2
|
property
|
role
|
is
|
IA2_ROLE_RADIO_MENU_ITEM
|
property
|
states
|
doesNotContain
|
IA2_STATE_EDITABLE
|
MSAA
|
property
|
role
|
isAny
|
[ROLE_SYSTEM_RADIOBUTTON, ROLE_SYSTEM_MENUITEM]
|
property
|
states
|
contains
|
STATE_SYSTEM_READONLY
|
UIA
|
property
|
ControlType
|
is
|
MenuItem
|
property
|
controlPatterns
|
contains
|
Toggle
|
property
|
controlPatterns
|
contains
|
SelectionItem
|
property
|
Value.IsReadOnly
|
is
|
true
|
if given
<div role="menu">
<div role="menuitemradio" aria-readonly="false" id="test">option 1</div>
</div>
then then the element with id="test" exposes aria-readonly="false"
ATK
|
property
|
role
|
is
|
ROLE_RADIO_MENU_ITEM
|
property
|
states
|
doesNotContain
|
STATE_READ_ONLY
|
AXAPI
|
property
|
AXRole
|
is
|
AXMenuItem
|
property
|
AXSubrole
|
is
|
<nil>
|
property
|
AXRoleDescription
|
is
|
menu item
|
result
|
AXUIElementIsAttributeSettable(AXValue)
|
is
|
true
|
IAccessible2
|
property
|
role
|
is
|
IA2_ROLE_RADIO_MENU_ITEM
|
property
|
states
|
contains
|
IA2_STATE_EDITABLE
|
MSAA
|
property
|
role
|
isAny
|
[ROLE_SYSTEM_RADIOBUTTON, ROLE_SYSTEM_MENUITEM]
|
UIA
|
property
|
ControlType
|
is
|
MenuItem
|
property
|
controlPatterns
|
contains
|
Toggle
|
property
|
controlPatterns
|
contains
|
SelectionItem
|
property
|
Value.IsReadOnly
|
is
|
false
|
radiogroup readonly unspecified
if given
<div id="test" role="radiogroup">
</div>
then then the element with id="test" exposes aria-readonly="false"
ATK
|
property
|
role
|
is
|
ROLE_PANEL
|
property
|
states
|
doesNotContain
|
STATE_READ_ONLY
|
AXAPI
|
property
|
AXRole
|
is
|
AXRadioGroup
|
property
|
AXSubrole
|
is
|
<nil>
|
property
|
AXRoleDescription
|
is
|
radio group
|
result
|
AXUIElementIsAttributeSettable(AXValue)
|
is
|
true
|
IAccessible2
|
property
|
role
|
is
|
ROLE_SYSTEM_GROUPING
|
property
|
states
|
contains
|
IA2_STATE_EDITABLE
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_GROUPING
|
UIA
|
property
|
ControlType
|
is
|
List
|
property
|
Value.IsReadOnly
|
is
|
false
|
radiogroup readonly true
if given
<div id="test" role="radiogroup" aria-readonly="true">
</div>
then then the element with id="test" exposes aria-readonly="true"
ATK
|
property
|
role
|
is
|
ROLE_PANEL
|
property
|
states
|
contains
|
STATE_READ_ONLY
|
AXAPI
|
property
|
AXRole
|
is
|
AXRadioGroup
|
property
|
AXSubrole
|
is
|
<nil>
|
property
|
AXRoleDescription
|
is
|
radio group
|
result
|
AXUIElementIsAttributeSettable(AXValue)
|
is
|
false
|
IAccessible2
|
property
|
role
|
is
|
ROLE_SYSTEM_GROUPING
|
property
|
states
|
doesNotContain
|
IA2_STATE_EDITABLE
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_GROUPING
|
UIA
|
property
|
ControlType
|
is
|
List
|
property
|
Value.IsReadOnly
|
is
|
true
|
radiogroup readonly false
if given
<div id="test" role="radiogroup" aria-readonly="false">
</div>
then then the element with id="test" exposes aria-readonly="false"
ATK
|
property
|
role
|
is
|
ROLE_PANEL
|
property
|
states
|
doesNotContain
|
STATE_READ_ONLY
|
AXAPI
|
property
|
AXRole
|
is
|
AXRadioGroup
|
property
|
AXSubrole
|
is
|
<nil>
|
property
|
AXRoleDescription
|
is
|
radio group
|
result
|
AXUIElementIsAttributeSettable(AXValue)
|
is
|
true
|
IAccessible2
|
property
|
role
|
is
|
ROLE_SYSTEM_GROUPING
|
property
|
states
|
contains
|
IA2_STATE_EDITABLE
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_GROUPING
|
UIA
|
property
|
ControlType
|
is
|
List
|
property
|
Value.IsReadOnly
|
is
|
false
|
searchbox readonly unspecified
if given
<div id="test" role="searchbox">
</div>
then then the element with id="test" exposes aria-readonly="false"
ATK
|
property
|
role
|
is
|
ROLE_ENTRY
|
property
|
states
|
contains
|
STATE_SINGLE_LINE
|
property
|
interfaces
|
contains
|
EditableText
|
property
|
states
|
doesNotContain
|
STATE_READ_ONLY
|
AXAPI
|
property
|
AXRole
|
is
|
AXTextField
|
property
|
AXSubrole
|
is
|
AXSearchField
|
property
|
AXRoleDescription
|
is
|
search text field
|
result
|
AXUIElementIsAttributeSettable(AXValue)
|
is
|
true
|
IAccessible2
|
property
|
role
|
is
|
ROLE_SYSTEM_TEXT
|
property
|
objectAttributes
|
contains
|
text-input-type:search
|
property
|
states
|
contains
|
IA2_STATE_EDITABLE
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_TEXT
|
UIA
|
property
|
ControlType
|
is
|
Edit
|
property
|
LocalizedControlType
|
is
|
search box
|
property
|
Value.IsReadOnly
|
is
|
false
|
searchbox readonly true
if given
<div id="test" role="searchbox" aria-readonly="true">
</div>
then then the element with id="test" exposes aria-readonly="true"
ATK
|
property
|
role
|
is
|
ROLE_ENTRY
|
property
|
states
|
contains
|
STATE_SINGLE_LINE
|
property
|
interfaces
|
doesNotContain
|
EditableText
|
property
|
states
|
contains
|
STATE_READ_ONLY
|
AXAPI
|
property
|
AXRole
|
is
|
AXTextField
|
property
|
AXSubrole
|
is
|
AXSearchField
|
property
|
AXRoleDescription
|
is
|
search text field
|
result
|
AXUIElementIsAttributeSettable(AXValue)
|
is
|
false
|
IAccessible2
|
property
|
role
|
is
|
ROLE_SYSTEM_TEXT
|
property
|
objectAttributes
|
contains
|
text-input-type:search
|
property
|
states
|
doesNotContain
|
IA2_STATE_EDITABLE
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_TEXT
|
UIA
|
property
|
ControlType
|
is
|
Edit
|
property
|
LocalizedControlType
|
is
|
search box
|
property
|
Value.IsReadOnly
|
is
|
true
|
searchbox readonly false
if given
<div id="test" role="searchbox" aria-readonly="false">
</div>
then then the element with id="test" exposes aria-readonly="false"
ATK
|
property
|
role
|
is
|
ROLE_ENTRY
|
property
|
states
|
contains
|
STATE_SINGLE_LINE
|
property
|
interfaces
|
contains
|
EditableText
|
property
|
states
|
doesNotContain
|
STATE_READ_ONLY
|
AXAPI
|
property
|
AXRole
|
is
|
AXTextField
|
property
|
AXSubrole
|
is
|
AXSearchField
|
property
|
AXRoleDescription
|
is
|
search text field
|
result
|
AXUIElementIsAttributeSettable(AXValue)
|
is
|
true
|
IAccessible2
|
property
|
role
|
is
|
ROLE_SYSTEM_TEXT
|
property
|
objectAttributes
|
contains
|
text-input-type:search
|
property
|
states
|
contains
|
IA2_STATE_EDITABLE
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_TEXT
|
UIA
|
property
|
ControlType
|
is
|
Edit
|
property
|
LocalizedControlType
|
is
|
search box
|
property
|
Value.IsReadOnly
|
is
|
false
|
slider readonly unspecified
if given
<div id="test" role="slider">
</div>
then then the element with id="test" exposes aria-readonly="false"
ATK
|
property
|
role
|
is
|
ROLE_SLIDER
|
property
|
interfaces
|
contains
|
Value
|
property
|
states
|
doesNotContain
|
STATE_READ_ONLY
|
AXAPI
|
property
|
AXRole
|
is
|
AXSlider
|
property
|
AXSubrole
|
is
|
<nil>
|
property
|
AXRoleDescription
|
is
|
slider
|
result
|
AXUIElementIsAttributeSettable(AXValue)
|
is
|
true
|
IAccessible2
|
property
|
role
|
is
|
ROLE_SYSTEM_SLIDER
|
property
|
interfaces
|
contains
|
IAcesssibleValue
|
property
|
states
|
contains
|
IA2_STATE_EDITABLE
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_SLIDER
|
UIA
|
property
|
ControlType
|
is
|
Slider
|
property
|
Value.IsReadOnly
|
is
|
false
|
slider readonly true
if given
<div id="test" role="slider" aria-readonly="true">
</div>
then then the element with id="test" exposes aria-readonly="true"
ATK
|
property
|
role
|
is
|
ROLE_SLIDER
|
property
|
interfaces
|
contains
|
Value
|
property
|
states
|
contains
|
STATE_READ_ONLY
|
AXAPI
|
property
|
AXRole
|
is
|
AXSlider
|
property
|
AXSubrole
|
is
|
<nil>
|
property
|
AXRoleDescription
|
is
|
slider
|
result
|
AXUIElementIsAttributeSettable(AXValue)
|
is
|
false
|
IAccessible2
|
property
|
role
|
is
|
ROLE_SYSTEM_SLIDER
|
property
|
interfaces
|
contains
|
IAcesssibleValue
|
property
|
states
|
doesNotContain
|
IA2_STATE_EDITABLE
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_SLIDER
|
UIA
|
property
|
ControlType
|
is
|
Slider
|
property
|
Value.IsReadOnly
|
is
|
true
|
slider readonly false
if given
<div id="test" role="slider" aria-readonly="false">
</div>
then then the element with id="test" exposes aria-readonly="false"
ATK
|
property
|
role
|
is
|
ROLE_SLIDER
|
property
|
interfaces
|
contains
|
Value
|
property
|
states
|
doesNotContain
|
STATE_READ_ONLY
|
AXAPI
|
property
|
AXRole
|
is
|
AXSlider
|
property
|
AXSubrole
|
is
|
<nil>
|
property
|
AXRoleDescription
|
is
|
slider
|
result
|
AXUIElementIsAttributeSettable(AXValue)
|
is
|
true
|
IAccessible2
|
property
|
role
|
is
|
ROLE_SYSTEM_SLIDER
|
property
|
interfaces
|
contains
|
IAcesssibleValue
|
property
|
states
|
contains
|
IA2_STATE_EDITABLE
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_SLIDER
|
UIA
|
property
|
ControlType
|
is
|
Slider
|
property
|
Value.IsReadOnly
|
is
|
false
|
spinbutton readonly unspecified
if given
<div id="test" role="spinbutton">
</div>
then then the element with id="test" exposes aria-readonly="false"
ATK
|
property
|
role
|
is
|
ROLE_SPIN_BUTTON
|
property
|
interfaces
|
contains
|
Value
|
property
|
states
|
doesNotContain
|
STATE_READ_ONLY
|
AXAPI
|
property
|
AXRole
|
is
|
AXIncrementor
|
property
|
AXSubrole
|
is
|
<nil>
|
property
|
AXRoleDescription
|
is
|
stepper
|
result
|
AXUIElementIsAttributeSettable(AXValue)
|
is
|
true
|
IAccessible2
|
property
|
role
|
is
|
ROLE_SYSTEM_SPINBUTTON
|
property
|
interfaces
|
contains
|
IAcesssibleValue
|
property
|
states
|
contains
|
IA2_STATE_EDITABLE
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_SPINBUTTON
|
UIA
|
property
|
ControlType
|
is
|
Spinner
|
property
|
Value.IsReadOnly
|
is
|
false
|
spinbutton readonly true
if given
<div id="test" role="spinbutton" aria-readonly="true">
</div>
then then the element with id="test" exposes aria-readonly="true"
ATK
|
property
|
role
|
is
|
ROLE_SPIN_BUTTON
|
property
|
interfaces
|
contains
|
Value
|
property
|
states
|
contains
|
STATE_READ_ONLY
|
AXAPI
|
property
|
AXRole
|
is
|
AXIncrementor
|
property
|
AXSubrole
|
is
|
<nil>
|
property
|
AXRoleDescription
|
is
|
stepper
|
result
|
AXUIElementIsAttributeSettable(AXValue)
|
is
|
false
|
IAccessible2
|
property
|
role
|
is
|
ROLE_SYSTEM_SPINBUTTON
|
property
|
interfaces
|
contains
|
IAcesssibleValue
|
property
|
states
|
doesNotContain
|
IA2_STATE_EDITABLE
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_SPINBUTTON
|
UIA
|
property
|
ControlType
|
is
|
Spinner
|
property
|
Value.IsReadOnly
|
is
|
true
|
spinbutton readonly false
if given
<div id="test" role="spinbutton" aria-readonly="false">
</div>
then then the element with id="test" exposes aria-readonly="false"
ATK
|
property
|
role
|
is
|
ROLE_SPIN_BUTTON
|
property
|
interfaces
|
contains
|
Value
|
property
|
states
|
doesNotContain
|
STATE_READ_ONLY
|
AXAPI
|
property
|
AXRole
|
is
|
AXIncrementor
|
property
|
AXSubrole
|
is
|
<nil>
|
property
|
AXRoleDescription
|
is
|
stepper
|
result
|
AXUIElementIsAttributeSettable(AXValue)
|
is
|
true
|
IAccessible2
|
property
|
role
|
is
|
ROLE_SYSTEM_SPINBUTTON
|
property
|
interfaces
|
contains
|
IAcesssibleValue
|
property
|
states
|
contains
|
IA2_STATE_EDITABLE
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_SPINBUTTON
|
UIA
|
property
|
ControlType
|
is
|
Spinner
|
property
|
Value.IsReadOnly
|
is
|
false
|
switch readonly unspecified
if given
<div id="test" role="switch">
</div>
then then the element with id="test" exposes aria-readonly="false"
ATK
|
property
|
role
|
is
|
ROLE_TOGGLE_BUTTON
|
property
|
states
|
doesNotContain
|
STATE_READ_ONLY
|
AXAPI
|
property
|
AXRole
|
is
|
AXCheckBox
|
property
|
AXSubrole
|
is
|
AXSwitch
|
property
|
AXRoleDescription
|
is
|
switch
|
result
|
AXUIElementIsAttributeSettable(AXValue)
|
is
|
true
|
IAccessible2
|
property
|
role
|
is
|
IA2_ROLE_TOGGLE_BUTTON
|
property
|
objectAttributes
|
contains
|
xml-roles:switch
|
property
|
states
|
contains
|
IA2_STATE_EDITABLE
|
UIA
|
property
|
ControlType
|
is
|
Button
|
property
|
LocalizedControlType
|
is
|
toggleswitch
|
property
|
Value.IsReadOnly
|
is
|
false
|
switch readonly true
if given
<div id="test" role="switch" aria-readonly="true">
</div>
then then the element with id="test" exposes aria-readonly="true"
ATK
|
property
|
role
|
is
|
ROLE_TOGGLE_BUTTON
|
property
|
states
|
contains
|
STATE_READ_ONLY
|
AXAPI
|
property
|
AXRole
|
is
|
AXCheckBox
|
property
|
AXSubrole
|
is
|
AXSwitch
|
property
|
AXRoleDescription
|
is
|
switch
|
result
|
AXUIElementIsAttributeSettable(AXValue)
|
is
|
false
|
IAccessible2
|
property
|
role
|
is
|
IA2_ROLE_TOGGLE_BUTTON
|
property
|
objectAttributes
|
contains
|
xml-roles:switch
|
property
|
states
|
doesNotContain
|
IA2_STATE_EDITABLE
|
UIA
|
property
|
ControlType
|
is
|
Button
|
property
|
LocalizedControlType
|
is
|
toggleswitch
|
property
|
Value.IsReadOnly
|
is
|
true
|
switch readonly false
if given
<div id="test" role="switch" aria-readonly="false">
</div>
then then the element with id="test" exposes aria-readonly="false"
ATK
|
property
|
role
|
is
|
ROLE_TOGGLE_BUTTON
|
property
|
states
|
doesNotContain
|
STATE_READ_ONLY
|
AXAPI
|
property
|
AXRole
|
is
|
AXCheckBox
|
property
|
AXSubrole
|
is
|
AXSwitch
|
property
|
AXRoleDescription
|
is
|
switch
|
result
|
AXUIElementIsAttributeSettable(AXValue)
|
is
|
true
|
IAccessible2
|
property
|
role
|
is
|
IA2_ROLE_TOGGLE_BUTTON
|
property
|
objectAttributes
|
contains
|
xml-roles:switch
|
property
|
states
|
contains
|
IA2_STATE_EDITABLE
|
UIA
|
property
|
ControlType
|
is
|
Button
|
property
|
LocalizedControlType
|
is
|
toggleswitch
|
property
|
Value.IsReadOnly
|
is
|
false
|
grid aria-readonly true automatically propagated
if given
<div role="grid" aria-readonly="true">
<div role="row">
<div id="test1" role="columnheader">c1</div>
<div role="columnheader">c2</div>
</div>
<div role="row">
<div id="test2" role="rowheader">rh1</div>
<div id="test" role="gridcell">test cell</div>
</div>
</div>
then expose aria-readonly="true" on the elements with id="test", "test1", and "test2"
element test
|
ATK
|
property
|
role
|
is
|
ROLE_TABLE_CELL
|
property
|
states
|
contains
|
STATE_READ_ONLY
|
property
|
interfaces
|
contains
|
TableCell
|
AXAPI
|
property
|
AXRole
|
is
|
AXCell
|
result
|
AXUIElementIsAttributeSettable(AXValue)
|
is
|
false
|
IAccessible2
|
property
|
interfaces
|
contains
|
IAccessibleTableCell
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_CELL
|
property
|
states
|
contains
|
STATE_SYSTEM_READONLY
|
UIA
|
property
|
ControlType
|
is
|
DataItem
|
property
|
controlPatterns
|
contains
|
SelectionItem
|
property
|
Value.IsReadOnly
|
is
|
true
|
element test1
|
ATK
|
property
|
role
|
is
|
ROLE_COLUMN_HEADER
|
property
|
states
|
contains
|
STATE_READ_ONLY
|
AXAPI
|
property
|
AXRole
|
is
|
AXCell
|
result
|
AXUIElementIsAttributeSettable(AXValue)
|
is
|
false
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_COLUMNHEADER
|
property
|
states
|
contains
|
STATE_SYSTEM_READONLY
|
UIA
|
property
|
ControlType
|
is
|
HeaderItem
|
property
|
Value.IsReadOnly
|
is
|
true
|
element test2
|
ATK
|
property
|
role
|
is
|
ROLE_ROW_HEADER
|
property
|
states
|
contains
|
STATE_READ_ONLY
|
AXAPI
|
property
|
AXRole
|
is
|
AXCell
|
result
|
AXUIElementIsAttributeSettable(AXValue)
|
is
|
false
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_ROWHEADER
|
property
|
states
|
contains
|
STATE_SYSTEM_READONLY
|
UIA
|
property
|
ControlType
|
is
|
HeaderItem
|
property
|
Value.IsReadOnly
|
is
|
true
|
grid aria-readonly false automatically propagated
if given
<div role="grid" aria-readonly="false">
<div role="row">
<div id="test1" role="columnheader">c1</div>
<div role="columnheader">c2</div>
</div>
<div role="row">
<div id="test2" role="rowheader">rh1</div>
<div id="test" role="gridcell">test cell</div>
</div>
</div>
then expose aria-readonly="true" on the elements with id="test", "test1", and "test2"
element test
|
ATK
|
property
|
role
|
is
|
ROLE_TABLE_CELL
|
property
|
states
|
doesNotContain
|
STATE_READ_ONLY
|
property
|
interfaces
|
contains
|
TableCell
|
AXAPI
|
property
|
AXRole
|
is
|
AXCell
|
result
|
AXUIElementIsAttributeSettable(AXValue)
|
is
|
true
|
IAccessible2
|
property
|
interfaces
|
contains
|
IAccessibleTableCell
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_CELL
|
property
|
states
|
doesNotContain
|
STATE_SYSTEM_READONLY
|
UIA
|
property
|
ControlType
|
is
|
DataItem
|
property
|
controlPatterns
|
contains
|
selectionitem
|
property
|
Value.IsReadOnly
|
is
|
false
|
element test1
|
ATK
|
property
|
role
|
is
|
ROLE_COLUMN_HEADER
|
property
|
states
|
doesNotContain
|
STATE_READ_ONLY
|
AXAPI
|
property
|
AXRole
|
is
|
AXCell
|
result
|
AXUIElementIsAttributeSettable(AXValue)
|
is
|
true
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_COLUMNHEADER
|
property
|
states
|
contains
|
STATE_SYSTEM_READONLY
|
UIA
|
property
|
ControlType
|
is
|
HeaderItem
|
property
|
Value.IsReadOnly
|
is
|
false
|
element test2
|
ATK
|
property
|
role
|
is
|
ROLE_ROW_HEADER
|
property
|
states
|
doesNotContain
|
STATE_READ_ONLY
|
AXAPI
|
property
|
AXRole
|
is
|
AXCell
|
result
|
AXUIElementIsAttributeSettable(AXValue)
|
is
|
true
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_ROWHEADER
|
property
|
states
|
doesNotContain
|
STATE_SYSTEM_READONLY
|
UIA
|
property
|
ControlType
|
is
|
HeaderItem
|
property
|
Value.IsReadOnly
|
is
|
false
|
table columnheader readonly not exposed (NO TEST NEEDED)
aria-required
In ARIA 1.1, aria-required became a supported property of searchbox as a consequence of the creation of a new role which subclasses textbox.
In addition, the following normative statements were added to the columnheader and rowheader roles respectively in ARIA 1.1:
- "user agents SHOULD NOT expose either (aria-readonly or aria-required) property to assistive technologies unless the columnheader descends from a grid."
- "user agents SHOULD NOT expose either (aria-readonly or aria-required) property to assistive technologies unless the rowheader descends from a grid."
Documentation:
QUESTION: "SHOULD NOT expose" is not a "MUST NOT expose." Are only "MUST" and "MUST NOT" statements for user agents to be tested? Joanie added test placeholders in the meantime.
ANSWER: Yes, only MUST and MUST NOT statements are tested. However, an implication of "SHOULD NOT expose unless the columnheader descends from a grid" is "MUST expose if the columnheader descends from a grid".
grid columnheader required true
NOTE: the aria-required attribute is on a columnheader which descends from a grid element. (aria-required is not a supported property of grid.)
if given
<div role="grid">
<div role="row">
<div id="test" role="columnheader" aria-required="true">test cell</div>
</div>
</div>
then expose aria-required="true" on the element with id="test"
ATK
|
property
|
role
|
is
|
ROLE_COLUMN_HEADER
|
property
|
states
|
contains
|
STATE_REQUIRED
|
AXAPI
|
property
|
AXRole
|
is
|
AXCell
|
property
|
AXRequired
|
is
|
true
|
IAccessible2
|
property
|
role
|
is
|
ROLE_SYSTEM_COLUMNHEADER
|
property
|
states
|
contains
|
IA2_STATE_REQUIRED
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_COLUMNHEADER
|
UIA
|
property
|
ControlType
|
is
|
HeaderItem
|
property
|
IsrequiredForForm
|
is
|
true
|
grid columnheader required false
NOTE: the aria-required attribute is on a columnheader which descends from a grid element. (aria-required is not a supported property of grid.)
if given
<div role="grid">
<div role="row">
<div id="test" role="columnheader" aria-required="false">test cell</div>
</div>
</div>
then expose aria-required="false" on the element with id="test"
ATK
|
property
|
role
|
is
|
ROLE_COLUMN_HEADER
|
property
|
states
|
doesNotContain
|
STATE_REQUIRED
|
AXAPI
|
property
|
AXRole
|
is
|
AXCell
|
property
|
AXRequired
|
is
|
false
|
IAccessible2
|
property
|
role
|
is
|
ROLE_SYSTEM_COLUMNHEADER
|
property
|
states
|
doesNotContain
|
IA2_STATE_REQUIRED
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_COLUMNHEADER
|
UIA
|
property
|
ControlType
|
is
|
HeaderItem
|
property
|
IsrequiredForForm
|
is
|
false
|
grid columnheader required unspecified
if given
<div role="grid">
<div role="row">
<div id="test" role="columnheader">test cell</div>
</div>
</div>
then expose aria-required="false" on the element with id="test"
ATK
|
property
|
role
|
is
|
ROLE_COLUMN_HEADER
|
property
|
states
|
doesNotContain
|
STATE_REQUIRED
|
AXAPI
|
property
|
AXRole
|
is
|
AXCell
|
property
|
AXRequired
|
is
|
false
|
IAccessible2
|
property
|
role
|
is
|
ROLE_SYSTEM_COLUMNHEADER
|
property
|
states
|
doesNotContain
|
IA2_STATE_REQUIRED
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_COLUMNHEADER
|
UIA
|
property
|
ControlType
|
is
|
HeaderItem
|
property
|
IsrequiredForForm
|
is
|
false
|
NOTE: the aria-required attribute is on a rowheader which descends from a grid element. (aria-required is not a supported property of grid.)
if given
<div role="grid">
<div role="row">
<div id="test" role="rowheader" aria-required="true">test cell</div>
</div>
</div>
then expose aria-required="true" on the element with id="test"
ATK
|
property
|
role
|
is
|
ROLE_ROW_HEADER
|
property
|
states
|
contains
|
STATE_REQUIRED
|
AXAPI
|
property
|
AXRole
|
is
|
AXCell
|
property
|
AXRequired
|
is
|
true
|
IAccessible2
|
property
|
role
|
is
|
ROLE_SYSTEM_ROWHEADER
|
property
|
states
|
contains
|
IA2_STATE_REQUIRED
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_ROWHEADER
|
UIA
|
property
|
ControlType
|
is
|
HeaderItem
|
property
|
IsrequiredForForm
|
is
|
true
|
NOTE: the aria-required attribute is on a rowheader which descends from a grid element. (aria-required is not a supported property of grid.)
if given
<div role="grid">
<div role="row">
<div id="test" role="rowheader" aria-required="false">test cell</div>
</div>
</div>
then expose aria-required="false" on the element with id="test"
ATK
|
property
|
role
|
is
|
ROLE_ROW_HEADER
|
property
|
states
|
doesNotContain
|
STATE_REQUIRED
|
AXAPI
|
property
|
AXRole
|
is
|
AXCell
|
property
|
AXRequired
|
is
|
false
|
IAccessible2
|
property
|
role
|
is
|
ROLE_SYSTEM_ROWHEADER
|
property
|
states
|
doesNotContain
|
IA2_STATE_REQUIRED
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_ROWHEADER
|
UIA
|
property
|
ControlType
|
is
|
HeaderItem
|
property
|
IsrequiredForForm
|
is
|
false
|
if given
<div role="grid">
<div role="row">
<div id="test" role="rowheader">test cell</div>
</div>
</div>
then expose aria-required="false" on the element with id="test"
ATK
|
property
|
role
|
is
|
ROLE_ROW_HEADER
|
property
|
states
|
doesNotContain
|
STATE_REQUIRED
|
AXAPI
|
property
|
AXRole
|
is
|
AXCell
|
property
|
AXRequired
|
is
|
false
|
IAccessible2
|
property
|
role
|
is
|
ROLE_SYSTEM_ROWHEADER
|
property
|
states
|
doesNotContain
|
IA2_STATE_REQUIRED
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_ROWHEADER
|
UIA
|
property
|
ControlType
|
is
|
HeaderItem
|
property
|
IsrequiredForForm
|
is
|
false
|
searchbox required true
if given
<div id="test" role="searchbox" aria-required="true">
</div>
then expose aria-required="true" on the element with id="test"
ATK
|
property
|
role
|
is
|
ROLE_ENTRY
|
property
|
states
|
contains
|
STATE_SINGLE_LINE
|
property
|
states
|
contains
|
STATE_REQUIRED
|
AXAPI
|
property
|
AXRole
|
is
|
AXTextField
|
property
|
AXSubrole
|
is
|
AXSearchField
|
property
|
AXRequired
|
is
|
true
|
IAccessible2
|
property
|
role
|
is
|
ROLE_SYSTEM_TEXT
|
property
|
objectAttributes
|
contains
|
text-input-type:search
|
property
|
states
|
contains
|
IA2_STATE_REQUIRED
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_TEXT
|
UIA
|
property
|
ControlType
|
is
|
Edit
|
property
|
LocalizedControlType
|
is
|
search box
|
property
|
IsrequiredForForm
|
is
|
true
|
searchbox required false
if given
<div id="test" role="searchbox" aria-required="false">
</div>
then expose aria-required="false" on the element with id="test"
ATK
|
property
|
role
|
is
|
ROLE_ENTRY
|
property
|
states
|
contains
|
STATE_SINGLE_LINE
|
property
|
states
|
doesNotContain
|
STATE_REQUIRED
|
AXAPI
|
property
|
AXRole
|
is
|
AXTextField
|
property
|
AXSubrole
|
is
|
AXSearchField
|
property
|
AXRequired
|
is
|
false
|
IAccessible2
|
property
|
role
|
is
|
ROLE_SYSTEM_TEXT
|
property
|
objectAttributes
|
contains
|
text-input-type:search
|
property
|
states
|
doesNotContain
|
IA2_STATE_REQUIRED
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_TEXT
|
UIA
|
property
|
ControlType
|
is
|
Edit
|
property
|
LocalizedControlType
|
is
|
search box
|
property
|
IsrequiredForForm
|
is
|
false
|
searchbox required unspecified
if given
<div id="test" role="searchbox">
</div>
then expose aria-required="false" on the element with id="test"
ATK
|
property
|
role
|
is
|
ROLE_ENTRY
|
property
|
states
|
contains
|
STATE_SINGLE_LINE
|
property
|
states
|
doesNotContain
|
STATE_REQUIRED
|
AXAPI
|
property
|
AXRole
|
is
|
AXTextField
|
property
|
AXSubrole
|
is
|
AXSearchField
|
property
|
AXRequired
|
is
|
false
|
IAccessible2
|
property
|
role
|
is
|
ROLE_SYSTEM_TEXT
|
property
|
objectAttributes
|
contains
|
text-input-type:search
|
property
|
states
|
doesNotContain
|
IA2_STATE_REQUIRED
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_TEXT
|
UIA
|
property
|
ControlType
|
is
|
Edit
|
property
|
LocalizedControlType
|
is
|
search box
|
property
|
IsrequiredForForm
|
is
|
false
|
table columnheader required not exposed (NO TEST NEEDED)
aria-roledescription
The aria-roledescription property was added during ARIA 1.1. It is supported on all elements of the base markup and has a value type of string.
The spec also states that user agents MUST NOT expose the property if:
1. The element to which aria-roledescription is applied does not have a valid WAI-ARIA role or does not have an implicit WAI-ARIA role semantic.
2. The value of aria-roledescription is empty or contains only whitespace characters.
Documentation:
button roledescription valid
if given
<input type="button" value="Go Fish" aria-roledescription="SassyButton" id="test"/>
then the element with role="button" and id="test" exposes aria-roledescription="SassyButton"
ATK
|
property
|
role
|
is
|
ROLE_PUSH_BUTTON
|
property
|
objectAttributes
|
contains
|
roledescription:SassyButton
|
AXAPI
|
property
|
AXRole
|
is
|
AXButton
|
property
|
AXSubrole
|
is
|
<nil>
|
property
|
AXRoleDescription
|
is
|
SassyButton
|
IAccessible2
|
property
|
localizedExtendedRole
|
is
|
SassyButton
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_PUSHBUTTON
|
UIA
|
property
|
ControlType
|
is
|
Button
|
property
|
LocalizedControlType
|
is
|
SassyButton
|
button roledescription empty
if given
<div role="button" aria-roledescription="" id="test">
Go Fish
</div>
then the element with role="button" and id="test" don't expose aria-roledescription
ATK
|
property
|
role
|
is
|
ROLE_PUSH_BUTTON
|
property
|
objectAttributes
|
doesNotContain
|
roledescription
|
AXAPI
|
property
|
AXRole
|
is
|
AXButton
|
property
|
AXSubrole
|
is
|
<nil>
|
property
|
AXRoleDescription
|
is
|
button
|
IAccessible2
|
property
|
localizedExtendedRole
|
is
|
null
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_PUSHBUTTON
|
UIA
|
property
|
ControlType
|
is
|
Button
|
property
|
LocalizedControlType
|
is
|
Button
|
button roledescription whitespace only
if given
<div role="button" aria-roledescription=" " id="test">
Go Fish
</div>
then the element with role="button" and id="test" does not expose aria-roledescription
ATK
|
property
|
role
|
is
|
ROLE_PUSH_BUTTON
|
property
|
objectAttributes
|
doesNotContain
|
roledescription
|
AXAPI
|
property
|
AXRole
|
is
|
AXButton
|
property
|
AXSubrole
|
is
|
<nil>
|
property
|
AXRoleDescription
|
is
|
button
|
IAccessible2
|
property
|
localizedExtendedRole
|
is
|
null
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_PUSHBUTTON
|
UIA
|
property
|
ControlType
|
is
|
Button
|
property
|
LocalizedControlType
|
is
|
Button
|
div element without role roledescription valid
if given
<div aria-roledescription="foo" id="test">
Go Fish
</div>
then the element with id="test" defaults to only the HTML AAM mapping for the div element: https://www.w3.org/TR/html-aam-1.0/#el-div and no passed aria-roledescription
ATK
|
property
|
role
|
is
|
ROLE_SECTION
|
property
|
objectAttributes
|
doesNotContain
|
roledescription
|
property
|
interfaces
|
contains
|
Text
|
property
|
interfaces
|
contains
|
Hypertext
|
AXAPI
|
property
|
AXRole
|
is
|
AXGroup
|
property
|
AXSubrole
|
is
|
<nil>
|
property
|
AXRoleDescription
|
is
|
group
|
IAccessible2
|
property
|
role
|
is
|
IA2_ROLE_SECTION
|
property
|
localizedExtendedRole
|
is
|
null
|
property
|
interfaces
|
contains
|
IAccessibleText2
|
property
|
interfaces
|
contains
|
IAccessibleHypertext2
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_GROUPING
|
UIA
|
property
|
ControlType
|
is
|
Group
|
aria-selected
In ARIA 1.1, aria-selected was removed from radio and is now required (not just supported) on option and treeitem.
In addition, the following normative statements were added to the columnheader and rowheader roles respectively in ARIA 1.1:
- "Applying the aria-selected state on a columnheader MUST NOT cause the user agent to automatically propagate the aria-selected state to all the cells in the corresponding column. An author MAY choose to propagate selection in this manner depending on the specific application."
- "Applying the aria-selected state on a rowheader MUST NOT cause the user agent to automatically propagate the aria-selected state to all the cells in the corresponding row. An author MAY choose to propagate selection in this manner depending on the specific application."
Documentation:
option selected true
if given
<div role="listbox">
<div role="option" aria-selected="true" id="test">
Fish
</div>
<div role="option">
beef
</div>
</div>
then the element with id="test" exposes aria-selected="true"
element test
|
ATK
|
property
|
role
|
is
|
ROLE_LIST_ITEM
|
property
|
states
|
contains
|
STATE_SELECTED
|
property
|
states
|
contains
|
STATE_SELECTABLE
|
AXAPI
|
property
|
AXRole
|
is
|
AXStaticText
|
property
|
AXSubrole
|
is
|
<nil>
|
property
|
AXRoleDescription
|
is
|
'text'
|
property
|
AXSelected
|
is
|
true
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_LISTITEM
|
property
|
states
|
contains
|
STATE_SYSTEM_SELECTED
|
property
|
states
|
contains
|
STATE_SYSTEM_SELECTABLE
|
UIA
|
property
|
ControlType
|
is
|
ListItem
|
property
|
interfaces
|
contains
|
Invoke
|
property
|
SelectionItem.IsSelected
|
Is
|
true
|
option selected false
if given
<div role="listbox">
<div role="option" aria-selected="false" id="test">
Fish
</div>
<div role="option">
beef
</div>
</div>
then the element with id="test" exposes aria-selected="false"
element test
|
ATK
|
property
|
role
|
is
|
ROLE_LIST_ITEM
|
property
|
states
|
doesNotContain
|
STATE_SELECTED
|
property
|
states
|
contains
|
STATE_SELECTABLE
|
AXAPI
|
property
|
AXRole
|
is
|
AXStaticText
|
property
|
AXSubrole
|
is
|
<nil>
|
property
|
AXRoleDescription
|
is
|
'text'
|
property
|
AXSelected
|
is
|
false
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_LISTITEM
|
property
|
states
|
doesNotContain
|
STATE_SYSTEM_SELECTED
|
property
|
states
|
contains
|
STATE_SYSTEM_SELECTABLE
|
UIA
|
property
|
ControlType
|
is
|
ListItem
|
property
|
interfaces
|
contains
|
Invoke
|
property
|
ControlPatterns
|
doesNotContain
|
SelectionItem
|
option selected undefined
if given
<div role="listbox">
<div role="option" id="test">
Fish
</div>
<div role="option">
beef
</div>
</div>
then the element with id="test" exposes aria-selected as false
element test
|
ATK
|
property
|
role
|
is
|
ROLE_LIST_ITEM
|
property
|
states
|
doesNotContain
|
STATE_SELECTED
|
property
|
states
|
contains
|
STATE_SELECTABLE
|
AXAPI
|
property
|
AXRole
|
is
|
AXStaticText
|
property
|
AXSubrole
|
is
|
<nil>
|
property
|
AXRoleDescription
|
is
|
'text'
|
property
|
AXSelected
|
is
|
false
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_LISTITEM
|
property
|
states
|
doesNotContain
|
STATE_SYSTEM_SELECTED
|
property
|
states
|
contains
|
STATE_SYSTEM_SELECTABLE
|
UIA
|
property
|
ControlType
|
is
|
ListItem
|
property
|
interfaces
|
contains
|
Invoke
|
property
|
ControlPatterns
|
doesNotContain
|
SelectionItem
|
option selected value changes
if given
<div id="test1" aria-activedescendant="test2" role="listbox">
<div role="option" aria-selected="false" id="test">
Fish
</div>
<div id="test2" aria-selected="true" role="option">
beef
</div>
</div>
then the element with id="test" exposes aria-selected="true"
attribute test1:aria-activedescendant "test"
|
attribute test:aria-selected "true"
|
attribute test2:aria-selected "false"
|
element test
|
ATK
|
event
|
type
|
is
|
object:state-changed:selected
|
event
|
detail1
|
is
|
1
|
MSAA
|
event
|
type
|
is
|
EVENT_OBJECT_SELECTION
|
event
|
type
|
is
|
EVENT_OBJECT_STATECHANGE
|
UIA
|
event
|
type
|
is
|
UIA_SelectionItem_ElementSelectedEventId
|
element test1
|
ATK
|
event
|
type
|
is
|
object:selection-changed
|
AXAPI
|
event
|
type
|
is
|
AXSelectedChildrenChanged
|
element test2
|
ATK
|
event
|
type
|
is
|
object:state-changed:selected
|
event
|
detail1
|
is
|
0
|
treeitem selected true
if given
<UL role="tree">
<li role="treeitem" aria-selected="true" id="test">
Fish
</li>
<li role="treeitem">
beef
</li>
</ul>
then the element with id="test" exposes aria-selected="true"
element test
|
ATK
|
property
|
role
|
is
|
ROLE_TREE_ITEM
|
property
|
states
|
contains
|
STATE_SELECTED
|
property
|
states
|
contains
|
STATE_SELECTABLE
|
AXAPI
|
property
|
AXRole
|
is
|
AXRow
|
property
|
AXSubrole
|
is
|
AXOutlineRow
|
property
|
AXRoleDescription
|
is
|
'outline row'
|
property
|
AXSelected
|
is
|
true
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_OUTLINEITEM
|
property
|
states
|
contains
|
STATE_SYSTEM_SELECTED
|
property
|
states
|
contains
|
STATE_SYSTEM_SELECTABLE
|
UIA
|
property
|
ControlType
|
is
|
TreeItem
|
property
|
SelectionItem.IsSelected
|
Is
|
true
|
treeitem selected false
if given
<UL role="tree">
<li role="treeitem" aria-selected="false" id="test">
Fish
</li>
<li role="treeitem">
beef
</li>
</ul>
then the element with id="test" exposes aria-selected="false"
element test
|
ATK
|
property
|
role
|
is
|
ROLE_TREE_ITEM
|
property
|
states
|
doesNotContain
|
STATE_SELECTED
|
property
|
states
|
contains
|
STATE_SELECTABLE
|
AXAPI
|
property
|
AXRole
|
is
|
AXRow
|
property
|
AXSubrole
|
is
|
AXOutlineRow
|
property
|
AXRoleDescription
|
is
|
'outline row'
|
property
|
AXSelected
|
is
|
false
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_OUTLINEITEM
|
property
|
states
|
doesNotContain
|
STATE_SYSTEM_SELECTED
|
property
|
states
|
contains
|
STATE_SYSTEM_SELECTABLE
|
UIA
|
property
|
ControlType
|
is
|
TreeItem
|
property
|
ControlPatterns
|
doesNotContain
|
SelectionItem
|
treeitem selected undefined
if given
<UL role="tree">
<li role="treeitem" id="test">
Fish
</li>
<li role="treeitem">
beef
</li>
</ul>
then the element with id="test" exposes aria-selected="false"
element test
|
ATK
|
property
|
role
|
is
|
ROLE_TREE_ITEM
|
property
|
states
|
doesNotContain
|
STATE_SELECTED
|
property
|
states
|
contains
|
STATE_SELECTABLE
|
AXAPI
|
property
|
AXRole
|
is
|
AXRow
|
property
|
AXSubrole
|
is
|
AXOutlineRow
|
property
|
AXRoleDescription
|
is
|
'outline row'
|
property
|
AXSelected
|
is
|
false
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_OUTLINEITEM
|
property
|
states
|
doesNotContain
|
STATE_SYSTEM_SELECTED
|
property
|
states
|
contains
|
STATE_SYSTEM_SELECTABLE
|
UIA
|
property
|
ControlType
|
is
|
TreeItem
|
property
|
ControlPatterns
|
doesNotContain
|
SelectionItem
|
treeitem selected value changes
if given
<ul id="test1" aria-activedescendant="test2" role="tree">
<li role="treeitem" aria-selected="false" id="test">
Fish
</li>
<li id="test2" aria-selected="true" role="treeitem">
beef
</li>
</ul>
then the element with id="test" exposes aria-selected="true"
attribute test1:aria-activedescendant "test"
|
attribute test:aria-selected "true"
|
attribute test2:aria-selected "false"
|
element test
|
ATK
|
event
|
type
|
is
|
object:state-changed:selected
|
event
|
detail1
|
is
|
1
|
MSAA
|
event
|
type
|
is
|
EVENT_OBJECT_SELECTION
|
event
|
type
|
is
|
EVENT_OBJECT_STATECHANGE
|
UIA
|
event
|
type
|
is
|
UIA_SelectionItem_ElementSelectedEventId
|
element test1
|
ATK
|
event
|
type
|
is
|
object:selection-changed
|
AXAPI
|
event
|
type
|
is
|
AXSelectedChildrenChanged
|
element test2
|
ATK
|
event
|
type
|
is
|
object:state-changed:selected
|
event
|
detail1
|
is
|
0
|
columnheader selected true not automatically propagated
if given
<div id="test1" role="grid">
<div role="row">
<div role="columnheader" aria-selected="true">C1</div>
<div role="columnheader">C2</div>
</div>
<div role="row">
<div id="test" role="gridcell">A1</div>
<div role="gridcell">A2</div>
</div>
</div>
then the element with id="test" exposes aria-selected="false"
element test
|
ATK
|
property
|
role
|
is
|
ROLE_TABLE_CELL
|
property
|
states
|
doesNotContain
|
STATE_SELECTED
|
property
|
states
|
contains
|
STATE_SELECTABLE
|
AXAPI
|
property
|
AXRole
|
is
|
AXCell
|
property
|
AXSubrole
|
is
|
<nil>
|
property
|
AXRoleDescription
|
is
|
'cell'
|
property
|
AXSelected
|
is
|
false
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_CELL
|
property
|
states
|
doesNotContain
|
STATE_SYSTEM_SELECTED
|
property
|
states
|
contains
|
STATE_SYSTEM_SELECTABLE
|
UIA
|
property
|
ControlType
|
is
|
DataItem
|
property
|
SelectionItem.IsSelected
|
is
|
false
|
property
|
SelectionItem.selectionContainer
|
is
|
test1
|
columnheader selected false not automatically propagated
if given
<div id="test1" role="grid">
<div role="row">
<div role="columnheader" aria-selected="false">C1</div>
<div role="columnheader">C2</div>
</div>
<div role="row">
<div id="test" aria-selected="true" role="gridcell">A1</div>
<div role="gridcell">A2</div>
</div>
</div>
then the element with id="test" exposes aria-selected="true"
element test
|
ATK
|
property
|
role
|
is
|
ROLE_TABLE_CELL
|
property
|
states
|
contains
|
STATE_SELECTED
|
property
|
states
|
contains
|
STATE_SELECTABLE
|
AXAPI
|
property
|
AXRole
|
is
|
AXCell
|
property
|
AXSubrole
|
is
|
<nil>
|
property
|
AXRoleDescription
|
is
|
'cell'
|
property
|
AXSelected
|
is
|
true
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_CELL
|
property
|
states
|
contains
|
STATE_SYSTEM_SELECTED
|
property
|
states
|
contains
|
STATE_SYSTEM_SELECTABLE
|
UIA
|
property
|
ControlType
|
is
|
DataItem
|
property
|
SelectionItem.IsSelected
|
is
|
true
|
property
|
SelectionItem.selectionContainer
|
is
|
test1
|
if given
<div id="test1" role="grid">
<div role="row">
<div role="columnheader">C1</div>
<div role="columnheader">C2</div>
</div>
<div role="row">
<div role="rowheader" aria-selected="true">A1</div>
<div id="test" role="gridcell">A2</div>
</div>
</div>
then the element with id="test" exposes aria-selected="false"
element test
|
ATK
|
property
|
role
|
is
|
ROLE_TABLE_CELL
|
property
|
states
|
doesNotContain
|
STATE_SELECTED
|
property
|
states
|
contains
|
STATE_SELECTABLE
|
AXAPI
|
property
|
AXRole
|
is
|
AXCell
|
property
|
AXSubrole
|
is
|
<nil>
|
property
|
AXRoleDescription
|
is
|
'cell'
|
property
|
AXSelected
|
is
|
false
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_CELL
|
property
|
states
|
doesNotContain
|
STATE_SYSTEM_SELECTED
|
property
|
states
|
contains
|
STATE_SYSTEM_SELECTABLE
|
UIA
|
property
|
ControlType
|
is
|
DataItem
|
property
|
SelectionItem.IsSelected
|
is
|
false
|
property
|
SelectionItem.selectionContainer
|
is
|
test1
|
if given
<div id="test1" role="grid">
<div role="row">
<div role="columnheader">C1</div>
<div role="columnheader">C2</div>
</div>
<div role="row">
<div aria-selected="false" role="rowheader">A1</div>
<div id="test" aria-selected="true" role="gridcell">A2</div>
</div>
</div>
then the element with id="test" exposes aria-selected="true"
element test
|
ATK
|
property
|
role
|
is
|
ROLE_TABLE_CELL
|
property
|
states
|
contains
|
STATE_SELECTED
|
property
|
states
|
contains
|
STATE_SELECTABLE
|
AXAPI
|
property
|
AXRole
|
is
|
AXCell
|
property
|
AXSubrole
|
is
|
<nil>
|
property
|
AXRoleDescription
|
is
|
'cell'
|
property
|
AXSelected
|
is
|
true
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_CELL
|
property
|
states
|
contains
|
STATE_SYSTEM_SELECTED
|
property
|
states
|
contains
|
STATE_SYSTEM_SELECTABLE
|
UIA
|
property
|
ControlType
|
is
|
DataItem
|
property
|
SelectionItem.IsSelected
|
is
|
true
|
property
|
SelectionItem.selectionContainer
|
is
|
test1
|
aria-valuemin, aria-valuemax, aria-valuenow, and aria-valuetext
In ARIA 1.1, aria-valuemin, aria-valuenow, and aria-valuemax were given default implicit values for scrollbar, slider, and spinbutton. In addition, these properties along with aria-valuetext became supported on separator, but ONLY if the separator is focusable (i.e. functioning as a widget).
The default implicit values are as follows:
- aria-valuemin is 0 for focusable separator, scrollbar, and slider. In the case of spinbutton, it is "there is no minimum value."
- aria-valuemax is 100 for focusable separator, scrollbar, and slider. In the case of spinbutton, it is "there is no maximum value."
- aria-valuenow is 50 for focusable separator, half way between aria-valuemin and aria-valuemax for scrollbar and slider, and 0 for spinbutton.
Documentation:
scrollbar all values unspecified
if given
<div role="scrollbar" id="test">
Go Fish
</div>
then the element with role="scrollbar" and id="test" exposes aria-valuenow=50, aria-valuemin=0, aria-valuemax=100
ATK
|
property
|
role
|
is
|
ROLE_SCROLL_BAR
|
property
|
interfaces
|
contains
|
Value
|
result
|
atk_value_get_minimum_value()
|
is
|
0
|
result
|
atk_value_get_current_value()
|
is
|
50
|
result
|
atk_value_get_maximum_value()
|
is
|
100
|
AXAPI
|
property
|
AXRole
|
is
|
AXScrollBar
|
property
|
AXSubrole
|
is
|
<nil>
|
property
|
AXRoleDescription
|
is
|
'scroll bar'
|
property
|
AXMinValue
|
is
|
0
|
property
|
AXValue
|
is
|
50
|
property
|
AXMaxValue
|
is
|
100
|
IAccessible2
|
property
|
role
|
is
|
ROLE_SYSTEM_SCROLLBAR
|
property
|
interfaces
|
contains
|
AccessibleValue
|
property
|
minimumValue
|
is
|
0
|
property
|
currentValue
|
is
|
50
|
property
|
maximumValue
|
is
|
100
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_SCROLLBAR
|
UIA
|
property
|
ControlType
|
is
|
scrollbar
|
property
|
interfaces
|
contains
|
RangeValue
|
result
|
RangeValue.Minimum
|
is
|
0
|
result
|
RangeValue.Value
|
is
|
50
|
result
|
RangeValue.Maximum
|
is
|
100
|
scrollbar only valuenow unspecified
if given
<div role="scrollbar" aria-valuemin="0" aria-valuemax="40" id="test">
Go Fish
</div>
then the element with role="scrollbar" and id="test" exposes aria-valuenow=20, aria-valuemin=0, aria-valuemax=40
ATK
|
property
|
role
|
is
|
ROLE_SCROLL_BAR
|
property
|
interfaces
|
contains
|
Value
|
result
|
atk_value_get_minimum_value()
|
is
|
0
|
result
|
atk_value_get_current_value()
|
is
|
20
|
result
|
atk_value_get_maximum_value()
|
is
|
40
|
AXAPI
|
property
|
AXRole
|
is
|
AXScrollBar
|
property
|
AXSubrole
|
is
|
<nil>
|
property
|
AXRoleDescription
|
is
|
'scroll bar'
|
property
|
AXMinValue
|
is
|
0
|
property
|
AXValue
|
is
|
20
|
property
|
AXMaxValue
|
is
|
40
|
IAccessible2
|
property
|
role
|
is
|
ROLE_SYSTEM_SCROLLBAR
|
property
|
interfaces
|
contains
|
AccessibleValue
|
property
|
minimumValue
|
is
|
0
|
property
|
currentValue
|
is
|
20
|
property
|
maximumValue
|
is
|
40
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_SCROLLBAR
|
UIA
|
property
|
ControlType
|
is
|
ScrollBar
|
property
|
controlPatterns
|
contains
|
RangeValue
|
result
|
RangeValue.Minimum
|
is
|
0
|
result
|
RangeValue.Value
|
is
|
20
|
result
|
RangeValue.Maximum
|
is
|
40
|
separator focusable all values unspecified
if given
<div tabindex="0" role="separator" id="test">
Go Fish
</div>
then the element with role="separator" and id="test" exposes a focusable separator with
aria-valuenow=50, aria-valuemin=0, aria-valuemax=100
ATK
|
property
|
role
|
is
|
ROLE_SEPARATOR
|
property
|
interfaces
|
contains
|
Value
|
result
|
atk_value_get_minimum_value()
|
is
|
0
|
result
|
atk_value_get_current_value()
|
is
|
50
|
result
|
atk_value_get_maximum_value()
|
is
|
100
|
AXAPI
|
property
|
AXRole
|
is
|
AXSplitter
|
property
|
AXSubrole
|
is
|
<nil>
|
property
|
AXRoleDescription
|
is
|
'splitter'
|
property
|
AXMinValue
|
is
|
0
|
property
|
AXValue
|
is
|
50
|
property
|
AXMaxValue
|
is
|
100
|
IAccessible2
|
property
|
role
|
is
|
ROLE_SYSTEM_SEPARATOR
|
property
|
interfaces
|
contains
|
AccessibleValue
|
property
|
minimumValue
|
is
|
0
|
property
|
currentValue
|
is
|
50
|
property
|
maximumValue
|
is
|
100
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_SEPARATOR
|
UIA
|
property
|
ControlType
|
is
|
Thumb
|
property
|
controlPatterns
|
contains
|
RangeValue
|
result
|
RangeValue.Minimum
|
is
|
0
|
result
|
RangeValue.Value
|
is
|
50
|
result
|
RangeValue.Maximum
|
is
|
100
|
separator focusable only valuenow unspecified
if given
<div tabindex="0" role="separator" aria-valuemin="0", aria-valuemax="100" id="test">
Go Fish
</div>
then the element with role="separator" and id="test" exposes a focusable separator with
aria-valuenow=50, aria-valuemin=0, aria-valuemax=100
ATK
|
property
|
role
|
is
|
ROLE_SEPARATOR
|
property
|
interfaces
|
contains
|
Value
|
result
|
atk_value_get_minimum_value()
|
is
|
0
|
result
|
atk_value_get_current_value()
|
is
|
50
|
result
|
atk_value_get_maximum_value()
|
is
|
100
|
AXAPI
|
property
|
AXRole
|
is
|
AXSplitter
|
property
|
AXSubrole
|
is
|
<nil>
|
property
|
AXRoleDescription
|
is
|
'splitter'
|
property
|
AXMinValue
|
is
|
0
|
property
|
AXValue
|
is
|
50
|
property
|
AXMaxValue
|
is
|
100
|
IAccessible2
|
property
|
role
|
is
|
ROLE_SYSTEM_SEPARATOR
|
property
|
interfaces
|
contains
|
AccessibleValue
|
property
|
minimumValue
|
is
|
0
|
property
|
currentValue
|
is
|
50
|
property
|
maximumValue
|
is
|
100
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_SEPARATOR
|
UIA
|
property
|
ControlType
|
is
|
Thumb
|
property
|
controlPatterns
|
contains
|
RangeValue
|
result
|
RangeValue.Minimum
|
is
|
0
|
result
|
RangeValue.Value
|
is
|
50
|
result
|
RangeValue.Maximum
|
is
|
100
|
separator focusable valuetext
if given
<div tabindex="0" role="separator" aria-valuetext="Bonaire" id="test">
Go Fish
</div>
then the element with role="separator" and id="test" exposes focusable separator with
aria-valuenow=50, aria-valuemin=0, aria-valuemax=100 and aria-valuetext="Bonaire"
ATK
|
property
|
role
|
is
|
ROLE_SEPARATOR
|
property
|
objectAttributes
|
contains
|
valuetext:Bonaire
|
property
|
interfaces
|
contains
|
Value
|
result
|
atk_value_get_minimum_value()
|
is
|
0
|
result
|
atk_value_get_current_value()
|
is
|
50
|
result
|
atk_value_get_maximum_value()
|
is
|
100
|
AXAPI
|
property
|
AXRole
|
is
|
AXSplitter
|
property
|
AXSubrole
|
is
|
<nil>
|
property
|
AXRoleDescription
|
is
|
'splitter'
|
property
|
AXMinValue
|
is
|
0
|
property
|
AXValue
|
is
|
50
|
property
|
AXMaxValue
|
is
|
100
|
property
|
AXValueDescription
|
is
|
'Bonaire'
|
IAccessible2
|
property
|
role
|
is
|
ROLE_SYSTEM_SEPARATOR
|
property
|
interfaces
|
contains
|
AccessibleValue
|
property
|
objectAttributes
|
contains
|
valuetext:Bonaire
|
property
|
minimumValue
|
is
|
0
|
property
|
currentValue
|
is
|
50
|
property
|
maximumValue
|
is
|
100
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_SEPARATOR
|
UIA
|
property
|
ControlType
|
is
|
Thumb
|
property
|
controlPatterns
|
contains
|
RangeValue
|
result
|
RangeValue.Minimum
|
is
|
0
|
result
|
RangeValue.Value
|
is
|
50
|
result
|
RangeValue.Maximum
|
is
|
100
|
property
|
Value.Value
|
is
|
Bonaire
|
separator unfocusable all values unspecified
if given
<div role="separator" id="test">
Go Fish
</div>
then the element with role="separator" and id="test" expose not value information
ATK
|
property
|
role
|
is
|
ROLE_SEPARATOR
|
property
|
interfaces
|
doesNotContain
|
Value
|
AXAPI
|
property
|
AXRole
|
is
|
AXSplitter
|
property
|
AXSubrole
|
is
|
<nil>
|
property
|
AXRoleDescription
|
is
|
'splitter'
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_SEPARATOR
|
UIA
|
property
|
ControlType
|
is
|
Separator
|
separator unfocusable valuetext
if given
<div role="separator" aria-valuetext="Bonaire" id="test">
Go Fish
</div>
then the element with role="separator" and id="test" do not expose aria-valuetext
ATK
|
property
|
role
|
is
|
ROLE_SEPARATOR
|
property
|
objectAttributes
|
doesNotContain
|
valuetext:Bonaire
|
AXAPI
|
property
|
AXRole
|
is
|
AXSplitter
|
property
|
AXSubrole
|
is
|
<nil>
|
property
|
AXRoleDescription
|
is
|
'splitter'
|
property
|
AXValueDescription
|
isNot
|
Bonaire
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_SEPARATOR
|
IAccessible2
|
property
|
objectAttributes
|
doesNotContain
|
valuetext:Bonaire
|
property
|
value
|
isNot
|
Bonaire
|
UIA
|
property
|
ControlType
|
is
|
Separator
|
property
|
controlPatterns
|
doesNotContain
|
RangeValue
|
slider all values unspecified
if given
<div role="slider" id="test">
Go Fish
</div>
then the element with role="sliderbar" and id="test" exposes aria-valuenow=50, aria-valuemin=0, aria-valuemax=100
ATK
|
property
|
role
|
is
|
ROLE_SLIDER
|
property
|
interfaces
|
contains
|
Value
|
result
|
atk_value_get_minimum_value()
|
is
|
0
|
result
|
atk_value_get_current_value()
|
is
|
50
|
result
|
atk_value_get_maximum_value()
|
is
|
100
|
AXAPI
|
property
|
AXRole
|
is
|
AXSlider
|
property
|
AXSubrole
|
is
|
<nil>
|
property
|
AXRoleDescription
|
is
|
'slider'
|
property
|
AXMinValue
|
is
|
0
|
property
|
AXValue
|
is
|
50
|
property
|
AXMaxValue
|
is
|
100
|
IAccessible2
|
property
|
role
|
is
|
ROLE_SYSTEM_SLIDER
|
property
|
interfaces
|
contains
|
AccessibleValue
|
property
|
minimumValue
|
is
|
0
|
property
|
currentValue
|
is
|
50
|
property
|
maximumValue
|
is
|
100
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_SLIDER
|
UIA
|
property
|
ControlType
|
is
|
Slider
|
property
|
controlPatterns
|
contains
|
RangeValue
|
result
|
RangeValue.Minimum
|
is
|
0
|
result
|
RangeValue.Value
|
is
|
50
|
result
|
RangeValue.Maximum
|
is
|
100
|
slider only valuenow unspecified
if given
<div role="slider" aria-valuemin="0" aria-valuemax="40" id="test">
Go Fish
</div>
then the element with role="scrollbar" and id="test" exposes aria-valuenow=20, aria-valuemin=0, aria-valuemax=40
ATK
|
property
|
role
|
is
|
ROLE_SLIDER
|
property
|
interfaces
|
contains
|
Value
|
result
|
atk_value_get_minimum_value()
|
is
|
0
|
result
|
atk_value_get_current_value()
|
is
|
20
|
result
|
atk_value_get_maximum_value()
|
is
|
40
|
AXAPI
|
property
|
AXRole
|
is
|
AXSlider
|
property
|
AXSubrole
|
is
|
<nil>
|
property
|
AXRoleDescription
|
is
|
'slider'
|
property
|
AXMinValue
|
is
|
0
|
property
|
AXValue
|
is
|
20
|
property
|
AXMaxValue
|
is
|
40
|
IAccessible2
|
property
|
role
|
is
|
ROLE_SYSTEM_SLIDER
|
property
|
interfaces
|
contains
|
AccessibleValue
|
property
|
minimumValue
|
is
|
0
|
property
|
currentValue
|
is
|
20
|
property
|
maximumValue
|
is
|
40
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_SLIDER
|
UIA
|
property
|
ControlType
|
is
|
Slider
|
property
|
controlPatterns
|
contains
|
RangeValue
|
result
|
RangeValue.Minimum
|
is
|
0
|
result
|
RangeValue.Value
|
is
|
20
|
result
|
RangeValue.Maximum
|
is
|
40
|
spinbutton all values unspecified
if given
<div role="spinbutton" id="test">
Go Fish
</div>
then the element with role="spinbutton" and id="test" exposes aria-valuenow=0, aria-valuemin=negative infinity, aria-valuemax=positive infinity
ATK
|
property
|
role
|
is
|
ROLE_SPIN_BUTTON
|
property
|
interfaces
|
contains
|
Value
|
result
|
atk_value_get_minimum_value()
|
isLTE
|
-9007199254740992
|
result
|
atk_value_get_current_value()
|
is
|
0
|
result
|
atk_value_get_maximum_value()
|
isGTE
|
9007199254740992
|
AXAPI
|
property
|
AXRole
|
is
|
AXIncrementor
|
property
|
AXSubrole
|
is
|
<nil>
|
property
|
AXRoleDescription
|
is
|
'stepper'
|
property
|
AXMinValue
|
isLTE
|
-9007199254740992
|
property
|
AXValue
|
is
|
0
|
property
|
AXMaxValue
|
isGTE
|
9007199254740992
|
IAccessible2
|
property
|
role
|
is
|
ROLE_SYSTEM_SPINBUTTON
|
property
|
interfaces
|
contains
|
AccessibleValue
|
property
|
minimumValue
|
isLTE
|
-9007199254740992
|
property
|
currentValue
|
is
|
0
|
property
|
maximumValue
|
isGTE
|
9007199254740992
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_SPINBUTTON
|
UIA
|
property
|
ControlType
|
is
|
Spinner
|
property
|
interfaces
|
contains
|
RangeValue
|
result
|
RangeValue.Minimum
|
isLTE
|
-9007199254740992
|
result
|
RangeValue.Value
|
is
|
0
|
result
|
RangeValue.Maximum
|
isGTE
|
9007199254740992
|
spinbutton only aria-valuenow unspecified
if given
<div role="spinbutton" aria-valuemin="0" aria-valuemax="100" id="test">
Go Fish
</div>
then the element with role="spinbutton" and id="test" exposes aria-valuenow=0,
aria-valuemin=0, aria-valuemax=100
ATK
|
property
|
role
|
is
|
ROLE_SPIN_BUTTON
|
property
|
interfaces
|
contains
|
Value
|
result
|
atk_value_get_minimum_value()
|
is
|
0
|
result
|
atk_value_get_current_value()
|
is
|
0
|
result
|
atk_value_get_maximum_value()
|
is
|
100
|
AXAPI
|
property
|
AXRole
|
is
|
AXIncrementor
|
property
|
AXSubrole
|
is
|
<nil>
|
property
|
AXRoleDescription
|
is
|
'stepper'
|
property
|
AXMinValue
|
is
|
0
|
property
|
AXValue
|
is
|
0
|
property
|
AXMaxValue
|
is
|
100
|
IAccessible2
|
property
|
role
|
is
|
ROLE_SYSTEM_SPINBUTTON
|
property
|
interfaces
|
contains
|
AccessibleValue
|
property
|
minimumValue
|
is
|
0
|
property
|
currentValue
|
is
|
0
|
property
|
maximumValue
|
is
|
100
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_SPINBUTTON
|
UIA
|
property
|
ControlType
|
is
|
Spinner
|
property
|
interfaces
|
contains
|
RangeValue
|
result
|
RangeValue.Minimum
|
is
|
0
|
result
|
RangeValue.Value
|
is
|
0
|
result
|
RangeValue.Maximum
|
is
|
100
|
children presentational true
ARIA 1.1 adds children-presentational true to checkbox, menuitemcheckbox, menuitemradio, option, radio, switch, tab.
NOTE 1: There were additional roles during the ARIA 1.1 time frame to which children-presentational true had been applied, but then subsequently removed upon further consideration and discussion. Because there is not any "net change" from ARIA 1.0, there is no need to write tests for these non-changes.
NOTE 2: The spec states "User agents SHOULD NOT expose descendants of this element through the platform accessibility API." Because it's a "SHOULD NOT" rather than a "MUST NOT," one might make the case that no testing is needed. However, in order to verify implementation (implementability), we can test that the user agent treats elements with the specified roles in the same way they expose roles which had children-presentational of true in 1.0, such as button, separator, and progressbar.
Documentation:
checkbox with child elements
README: According to NOTE 2 above, the test is to see if the user agent exposes presentational children for the new roles in the same way as it did in ARIA 1.0 for the old roles. In the markup below, role "button" is used as the ARIA 1.0 role.
if given
<div role="button" id="aria10">
<img id="presentationalChild" src="gradient.png"> OK
</div>
<div role="checkbox" id="test" aria-checked="false">
<img id="checkboxImage" src="unchecked.gif"> Ask to keep changes when closing documents
</div>
then if the accessible button object "aria10" does not have an accessible child object "presentationalChild", then:
the accessible object "test" does not have an accessible child object "checkboxImage"
element test
|
ATK
|
property
|
children
|
shouldNotContain
|
accessible object associated with element "checkboxImage"
|
AXAPI
|
property
|
children
|
shouldNotContain
|
accessible object associated with element "checkboxImage"
|
IAccessible2
|
property
|
children
|
shouldNotContain
|
accessible object associated with element "checkboxImage"
|
UIA
|
property
|
children
|
shouldNotContain
|
accessible object associated with element "checkboxImage"
|
See README above.
if given
<div role="menu" aria-label="File Save Options">
<div role="menuitemcheckbox" id="test" aria-checked="false">
<img id="checkboxImage" src="unchecked.gif"> Ask to keep changes when closing documents
</div>
</div>
then the accessible object "test" should not have an accessible child object "checkboxImage"
element test
|
ATK
|
property
|
children
|
shouldNotContain
|
accessible object associated with element "checkboxImage"
|
AXAPI
|
property
|
children
|
shouldNotContain
|
accessible object associated with element "checkboxImage"
|
IAccessible2
|
property
|
children
|
shouldNotContain
|
accessible object associated with element "checkboxImage"
|
UIA
|
property
|
children
|
shouldNotContain
|
accessible object associated with element "checkboxImage"
|
See README above.
if given
<div role="menu" aria-labelledby="accname"><span id="accname">Colour Resolution</span>
<div role="menuitemradio" id="test" aria-checked="true"><img id="radioButtonImg" src="checked.gif"> 256 colours</div>
<div role="menuitemradio" aria-checked="false"><img src="unchecked.gif"> Thousands of colours</div>
<div role="menuitemradio" aria-checked="false"><img src="unchecked.gif"> Millions of colours</div>
</div>
then the accessible object "test" should not have an accessible child object "radioButtonImg"
element test
|
ATK
|
property
|
children
|
shouldNotContain
|
accessible object associated with element "radioButtonImg"
|
AXAPI
|
property
|
children
|
shouldNotContain
|
accessible object associated with element "radioButtonImg"
|
IAccessible2
|
property
|
children
|
shouldNotContain
|
accessible object associated with element "radioButtonImg"
|
UIA
|
property
|
children
|
shouldNotContain
|
accessible object associated with element "radioButtonImg"
|
option with child elements (Rich)
FIXME: NO TEST
radio with child elements
See README above.
if given
<div role="radiogroup" aria-labelledby="accname"><span id="accname">Colour Resolution</span>
<div role="radio" id="test" aria-checked="true"><img id="radioButtonImg" src="checked.gif"> 256 colours</div>
<div role="radio" aria-checked="false"><img src="unchecked.gif"> Thousands of colours</div>
<div role="radio" aria-checked="false"><img src="unchecked.gif"> Millions of colours</div>
</div>
then the accessible object "test" should not have an accessible child object "radioButtonImg"
element test
|
ATK
|
property
|
children
|
shouldNotContain
|
accessible object associated with element "radioButtonImg"
|
AXAPI
|
property
|
children
|
shouldNotContain
|
accessible object associated with element "radioButtonImg"
|
IAccessible2
|
property
|
children
|
shouldNotContain
|
accessible object associated with element "radioButtonImg"
|
UIA
|
property
|
children
|
shouldNotContain
|
accessible object associated with element "radioButtonImg"
|
switch with child elements (NEEDS TEST: Rich)
FIXME: NO TEST
tab with child elements (NEEDS TEST: Rich)
FIXME: NO TEST
New roles
cell
The cell role was added in ARIA 1.1.
QUESTION: All non-global ARIA attributes (aria-colindex, aria-colspan, aria-rowindex, aria-rowspan) have coverage in the properties sections above. It is Joanie's assumption that global attributes do NOT also need to be tested for cell because presumably the user agent implementation of global attributes is not done on a per-role basis. If this is correct, then either the test below is redundant to the aria-colindex cell test OR we should make the tests more specific/limited to just those things being tested.
ANSWER: The test for aria-colindex also tests role="cell". That test is sufficient for testing the new cell role.
CORRECTION MADE: aria-colcount is not, according to the ARIA spec, a supported attribute of cell so it is applied to table here. (It's only supported on table, grid, and treegrid.)
Documentation:
if given
<div id="foo" role="table" aria-colcount="8">
<div role="row">
<span id="test" role="cell" aria-colindex="4" >test cell</span>
</div>
</div>
then role: cell, aria-colindex: 4, aria-colcount:8
element foo
|
ATK
|
result
|
atk_table_get_n_columns()
|
is
|
8
|
property
|
objectAttributes
|
contains
|
colcount:8
|
AXAPI
|
property
|
AXRole
|
is
|
AXTable
|
property
|
AXSubrole
|
is
|
<nil>
|
property
|
AXRoleDescription
|
is
|
table
|
property
|
AXARIAColumnCount
|
is
|
8
|
UIA
|
property
|
Grid.ColumnCount
|
is
|
8
|
element test
|
ATK
|
property
|
role
|
is
|
ROLE_TABLE_CELL
|
result
|
atk_table_cell_get_position()
|
contains
|
column=3
|
property
|
interfaces
|
contains
|
TableCell
|
property
|
objectAttributes
|
contains
|
colindex:4
|
AXAPI
|
property
|
AXRole
|
is
|
AXCell
|
property
|
AXSubrole
|
is
|
<nil>
|
property
|
AXRoleDescription
|
is
|
cell
|
property
|
AXARIAColumnIndex
|
is
|
4
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_CELL
|
IAccessible2
|
property
|
objectAttributes
|
contains
|
colindex:4
|
property
|
objectAttributes
|
contains
|
colcount:8
|
property
|
groupPosition
|
contains
|
similarItemsInGroup:8
|
property
|
groupPosition
|
contains
|
positionInGroup:4
|
UIA
|
property
|
ControlType
|
is
|
DataItem
|
property
|
interfaces
|
contains
|
GridItem pattern
|
property
|
GridItem.Column
|
is
|
3
|
property
|
interfaces
|
contains
|
selection pattern
|
property
|
interfaces
|
MUST NOT contain
|
invoke pattern
|
feed
The feed role was added in ARIA 1.1
QUESTION: The feed role has no non-global ARIA attributes. It is Joanie's assumption that global attributes do NOT also need to be tested for feed because presumably the user agent implementation of global attributes is not done on a per-role basis. If this is correct, only the role-mapping test below is needed.
ANSWER: All that is needed is a test that the feed role itself is properly exposed in the AAPIs.
Documentation:
if given
<section role="feed" id="test">
<article>This is article 1</article>
<div role="article">This is article 2</div>
</section>
then expose a role of feed for the element with id of test
element test
|
ATK
|
property
|
role
|
is
|
ROLE_PANEL
|
property
|
objectAttributes
|
contains
|
xml-roles:feed
|
AXAPI
|
property
|
AXRole
|
is
|
AXGroup
|
property
|
AXSubrole
|
is
|
AXApplicationGroup
|
property
|
AXRoleDescription
|
is
|
feed
|
IAccessible2
|
property
|
objectAttributes
|
contains
|
xml-roles:feed
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_GROUPING
|
UIA
|
property
|
ControlType
|
is
|
Group
|
property
|
LocalizedControlType
|
is
|
feed
|
figure
The figure role was added in ARIA 1.1
QUESTION: The figure role has no non-global ARIA attributes. It is Joanie's assumption that global attributes do NOT also need to be tested for figure because presumably the user agent implementation of global attributes is not done on a per-role basis. If this is correct, only the role-mapping test below is needed.
ANSWER: All that is needed is a test that the figure role itself is properly exposed in the AAPIs.
Documentation:
if given
<div role="figure" id="test">
<img src="foo.jpg" aria-label="fake image"/>
<img src="baz.jpg" aria-label="really fake image">
</div>
then expose a role of figure for the element with id of test
element test
|
ATK
|
property
|
role
|
is
|
ROLE_PANEL
|
property
|
objectAttributes
|
contains
|
xml-roles:figure
|
AXAPI
|
property
|
AXRole
|
is
|
AXGroup
|
property
|
AXSubrole
|
is
|
<nil>
|
property
|
AXRoleDescription
|
is
|
figure
|
IAccessible2
|
property
|
objectAttributes
|
contains
|
xml-roles:figure
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_GROUPING
|
UIA
|
property
|
ControlType
|
is
|
Group
|
property
|
LocalizedControlType
|
is
|
figure
|
none
if given
<img id='test' role='none' src="foo.jpg" alt="footest"/>
then elemnet with id test is not mapped.
ATK
|
property
|
accessible
|
is
|
false
|
AXAPI
|
property
|
accessible
|
is
|
false
|
IAccessible2
|
property
|
accessible
|
is
|
false
|
MSAA
|
property
|
accessible
|
is
|
false
|
UIA
|
property
|
accessible
|
is
|
false
|
searchbox
The searchbox role was added in ARIA 1.1.
QUESTION: All non-global ARIA attributes (i.e. those which are inherited because searchbox subclasses textbox) have coverage in the properties sections above. It is Joanie's assumption that global attributes do NOT also need to be tested for searchbox because presumably the user agent implementation of global attributes is not done on a per-role basis. If this is correct, then either the test below is redundant to the searchbox tests under aria-multiline OR we should make the tests more specific/limited to just those things being tested.
ANSWER: The tests for aria-multiline also test role="searchbox". Those tests are sufficient for testing the new role.
QUESTION 2: Although only implicit in the Core-AAM, the mapping of role="searchbox" for ATK/AT-SPI and IA2 include an object property xml-roles:searchbox
. This is the how the actual role is communicated. The expected results tables list the property for IA2 but not ATK. Should the expected results table be updated for ATK? (Should the Core-AAM make the use of xml-roles
object property explicit in this case?)
Documentation:
if given
<div id='test' role='searchbox' contenteditable='true'></div>
then role:searchbox, contenteditable:true
ATK
|
property
|
role
|
is
|
ROLE_ENTRY
|
property
|
states
|
contains
|
STATE_SINGLE_LINE
|
property
|
interfaces
|
contains
|
EditableText
|
property
|
objectAttributes
|
contains
|
xml-roles:searchbox
|
AXAPI
|
property
|
AXRole
|
is
|
AXTextField
|
property
|
AXSubrole
|
is
|
AXSearchField
|
property
|
AXRoleDescription
|
is
|
search text field
|
IAccessible2
|
property
|
objectAttributes
|
contains
|
text-input-type:search
|
property
|
objectAttributes
|
contains
|
xml-roles:searchbox
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_TEXT
|
UIA
|
property
|
ControlType
|
is
|
Edit
|
property
|
LocalizedControlType
|
is
|
search box
|
switch (NO TEST NEEDED)
The switch role was added in ARIA 1.1.
QUESTION: All non-global ARIA attributes (i.e. those which are inherited because switch subclasses checkbox) have coverage in the properties sections above. It is Joanie's assumption that global attributes do NOT also need to be tested for switch because presumably the user agent implementation of global attributes is not done on a per-role basis. If this is correct, then either the test below is redundant to the aria-checked="false" switch test OR we should make the tests more specific/limited to just those things being tested.
ANSWER: The tests for aria-checked also test role="switch". Those tests are sufficient for testing the new role.
Documentation:
if given
<div id='test' role='switch' aria-checked='false' class='switch'>power</div>
then role: switch, aria-checked: false
ATK
|
property
|
role
|
is
|
ROLE_TOGGLE_BUTTON
|
property
|
states
|
contains
|
STATE_CHECKABLE
|
property
|
states
|
doesNotContain
|
STATE_CHECKED
|
AXAPI
|
property
|
AXRole
|
is
|
AXCheckBox
|
property
|
AXSubrole
|
is
|
AXSwitch
|
property
|
AXRoleDescription
|
is
|
switch
|
property
|
AXValue
|
is
|
0
|
IAccessible2
|
property
|
role
|
is
|
IA2_ROLE_TOGGLE_BUTTON
|
property
|
objectAttributes
|
contains
|
xml-roles:switch
|
UIA
|
property
|
ControlType
|
isNot
|
Button
|
property
|
LocalizedControlType
|
isNot
|
toggleswitch
|
property
|
Toggle
|
contains
|
ToggleState:Off
|
table (NO TEST NEEDED)
The table role was added in ARIA 1.1
QUESTION: All non-global ARIA attributes (aria-colcount, aria-rowcount) have coverage in the properties sections above. It is Joanie's assumption that global attributes do NOT also need to be tested for table because presumably the user agent implementation of global attributes is not done on a per-role basis. If this is correct, then either the test below is redundant to the aria-colcount and aria-rowcount table tests OR we should make the tests more specific/limited to just those things being tested.
ANSWER: The tests for aria-colcount also test role="table". Those tests are sufficient for testing the new role.
Documentation:
if given
<div role='table' id='test' aria-rowcount='3' aria-colcount='2'>
<div role='row'>
<span role='cell'>cheese</span>
</div>
</div>
then role: table, aria-colcount: 2, aria-rowcount: 3
ATK
|
property
|
role
|
is
|
ROLE_TABLE
|
property
|
objectAttributes
|
contains
|
xml-roles:table
|
property
|
interfaces
|
contains
|
Table
|
AXAPI
|
property
|
AXRole
|
is
|
AXTable
|
property
|
AXSubrole
|
is
|
<nil>
|
property
|
AXRoleDescription
|
is
|
table
|
IAccessible2
|
property
|
objectAttributes
|
contains
|
xml-roles:table
|
property
|
interfaces
|
doesNotContain
|
IAccessibleTable2
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_TABLE
|
UIA
|
property
|
ControlType
|
isNot
|
Table
|
property
|
grid pattern TODO
|
isNot
|
|
property
|
table pattern TODO
|
isNot
|
|
term role
The term role was added in ARIA 1.1
QUESTION: The term role has no non-global ARIA attributes. It is Joanie's assumption that global attributes do NOT also need to be tested for term because presumably the user agent implementation of global attributes is not done on a per-role basis. If this is correct, only a role-mapping test is needed.
ANSWER: Correct, only a role mapping test is required.
Documentation:
if given
<div role="term" id='test' aria-describedby="dfn">
w3c
</div>
<div role="definition" id="dfn">
World Wide Web Consortium
</div>
then expose role="term" for element with id="test"
element test
|
ATK
|
property
|
role
|
is
|
ROLE_DESCRIPTION_TERM
|
property
|
interfaces
|
contains
|
Text
|
property
|
interfaces
|
contains
|
Hypertext
|
AXAPI
|
property
|
AXRole
|
is
|
AXGroup
|
property
|
AXSubrole
|
is
|
AXTerm
|
property
|
AXRoleDescription
|
is
|
term
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_TERM
|
property
|
states
|
contains
|
ROLE_SYSTEM_READONLY
|
UIA
|
property
|
ControlType
|
is
|
Text
|
Other role-related tests
combobox on a textbox (QUESTION PARTIALLY ANSWERED, FIX ME)
QUESTION: The test below was added because (to quote the original comment) "Authoring patterns changed to allow combobox role on textbox, construct a combobox on an HTML textbox where the role of combobox is on the actual textbox." While this is an ARIA spec change made in 1.1, it is specific to authors. We do not have any related normative statements in the ARIA spec about what user agents are expected to do in response. Note that other combobox properties have test coverage under the properties sections. With all of this in mind, what test -- if any -- needs to be written for ARIA 1.1 (as opposed to, potentially, Core AAM) regarding this "authoring pattern"?
ANSWER: With one difference, this pattern was tested in test cases 169 - 174 for ARIA 1.0. See test case 169 for example. The difference is that aria-controls was not required in ARIA 1.0, and was not used in the ARIA 1.0 test cases. The test report shows that the tests passed for at least two implementations (scroll down to find the reports for test cases 169 - 174).
FIX ME: The test markup uses aria-controls, but none of the expected results are shown, e.g., ATK will have RELATION_CONTROLLER_FOR for element test and RELATION_CONTROLLED_BY for element owned_listbox.
FIXME: The test element does not have an id="test".
if given
<input type="text" aria-label="Tag"role="combobox" aria-expanded="true" aria-owns="owned_listbox" aria-autocomplete="list" aria-controls="owned_listbox" aria-activedescendant="selected_option">
<ul role="listbox" id="owned_listbox">
<li role="option">Zebra</li>
<li role="option" id="selected_option">Zoom</li>
</ul>
then role: combobox, has-haspopup: "listbox"
element test
|
ATK
|
property
|
role
|
is
|
ROLE_COMBO_BOX
|
property
|
states
|
contains
|
STATE_EXPANDABLE
|
property
|
states
|
contains
|
STATE_EXPANDED
|
property
|
states
|
contains
|
STATE_HAS_POPUP
|
property
|
objectAttributes
|
contains
|
haspopup:listbox
|
AXAPI
|
property
|
AXRole
|
is
|
AXComboBox
|
property
|
AXSubrole
|
is
|
<nil>
|
property
|
AXRoleDescription
|
is
|
combo box
|
property
|
AXExpanded
|
is
|
true
|
property
|
action
|
contains
|
AXShowMenu
|
IAccessible2
|
property
|
objectAttributes
|
contains
|
haspopup:listbox
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_COMBOBOX
|
property
|
states
|
contains
|
STATE_SYSTEM_HASPOPUP
|
property
|
states
|
contains
|
STATE_SYSTEM_EXPANDED
|
UIA
|
property
|
ControlType
|
is
|
Combobox
|
property
|
interfaces
|
contains
|
ExpandCollapse pattern
|
property
|
ExpandCollapse.ExpandCollapseState
|
is
|
Expanded
|
log
QUESTION: The log role is not new to ARIA 1.1 nor have any of its properties changed. That it now subclasses section rather than region is only a taxonomy change rather than a change which impacts platform mappings. The only apparent difference between 1.0 and 1.1 is that in 1.0 the following statement is in a note: "Elements with the role log have an implicit aria-live value of polite." Because notes are non-normative, one could argue that this is a change which must be tested. HOWEVER, in 1.0, the Characteristics table includes this same information. And the Characteristics table IS normative, right? Thus did anything actually change? Do we actually need this test? (Reminder: At least on some platforms, testing will be manual.)
ANSWER: I believe that we did not realize that notes were non-normative in the 1.0 time frame. That's moot since, as you point out, the characteristics table is (was) normative. However, I cannot find a test case in the ARIA 1.0 test harness specifically for the implicit aria-live="polite" on the log role. It needs testing.
if given
<div id='test' role='log' > </div>
then role: log
ATK
|
property
|
role
|
is
|
ROLE_LOG
|
property
|
objectAttributes
|
contains
|
xml-roles:log
|
property
|
objectAttributes
|
contains
|
container-live:polite
|
property
|
objectAttributes
|
contains
|
live:polite
|
property
|
objectAttributes
|
contains
|
container-live-role:log
|
AXAPI
|
property
|
AXRole
|
is
|
AXGroup
|
property
|
AXSubrole
|
is
|
AXApplicationLog
|
property
|
AXRoleDescription
|
is
|
log
|
IAccessible2
|
property
|
objectAttributes
|
contains
|
xml-roles:log
|
property
|
objectAttributes
|
contains
|
container-live:polite
|
property
|
objectAttributes
|
contains
|
live:polite
|
property
|
objectAttributes
|
contains
|
container-live-role:log
|
UIA
|
property
|
ControlType
|
is
|
Group
|
property
|
LocalizedControlType
|
is
|
log
|
property
|
LiveSettingProperty
|
is
|
1
|
region without name
Note: The tabindex is here to keep the element from being pruned from the tree, with just the article shown.
if given
<div role="region" id="test" tabindex="-1">
<article>This is article 1</article>
</div>
then expose the element with id of test as if the role were not present
element test
|
ATK
|
property
|
role
|
is
|
ROLE_SECTION
|
property
|
interfaces
|
contains
|
Text
|
property
|
interfaces
|
contains
|
Hypertext
|
AXAPI
|
property
|
AXRole
|
is
|
AXGroup
|
property
|
AXSubrole
|
is
|
<nil>
|
property
|
AXRoleDescription
|
is
|
group
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_GROUPING
|
IAccessible2
|
property
|
interfaces
|
contains
|
IAccessibleText2
|
property
|
interfaces
|
contains
|
IAccessibleHypertext2
|
property
|
role
|
is
|
IA2_ROLE_SECTION
|
UIA
|
property
|
Control Group
|
is
|
Group
|
property
|
landmarkType
|
isNot
|
Custom
|
property
|
localizedLandmarkType
|
isNot
|
region
|
region with name
ARIA 1.1 made region a type of landmark. Some platforms have special mappings for landmarks and the mapping of region might change as a direct result of this change to the ARIA spec. See the region role in the Core AAM.
if given
<section role="region" aria-label="foobar" id="test">
<article>This is article 1</article>
</section>
then expose a role of feed for the element with id of test
element test
|
ATK
|
property
|
role
|
is
|
ROLE_LANDMARK
|
property
|
objectAttributes
|
contains
|
xml-roles:region
|
AXAPI
|
property
|
AXRole
|
is
|
AXGroup
|
property
|
AXSubrole
|
is
|
AXLandmarkRegion
|
property
|
AXRoleDescription
|
is
|
region
|
IAccessible2
|
property
|
objectAttributes
|
contains
|
xml-roles:region
|
property
|
role
|
is
|
IA2_ROLE_LANDMARK
|
UIA
|
property
|
Control Group
|
is
|
Group
|
property
|
localizedControlType
|
is
|
region
|
property
|
landmarkType
|
is
|
Custom
|
property
|
localizedLandmarkType
|
is
|
region
|
spinbutton
QUESTION: In ARIA 1.1, spinbutton became a subclass of composite. This decision was made as a consequence of the discussion regarding what children (if any) spinbuttons can have. When the conclusion was that a spinbutton could have navigable children -- but only a textbox and/or two buttons -- spinbutton became, by definition, a potentially-composite widget. HOWEVER, the associated changes made in the ARIA spec in 1.1 are all related to authors and authoring practice. We do not have any normative statements in the ARIA spec about what user agents are expected to do (e.g. if a spinbutton has child elements which are neither a button nor a textbox). With this in mind, what test -- if any -- needs to be written for ARIA 1.1 (as opposed to, potentially, Core AAM)?
ANSWER: Unless the spec normatively requires of user agents that they allow only certain roles for spinbutton children, there is nothing to test in terms of the type of children. An corollary is that there is no Core-AAM test here either since it cannot be more restrictive than the spec itself. However, the fact that spinbutton is now composite does require user agents to expose the children if there are any. Whether children were exposed or not was not tested in the ARIA 1.0 time frame. Hence, a test is needed for cases where spinbutton are authored with children.
if given
<div role="spinbutton" id="test" aria-label="Temperature (deg K)" aria-valuemin="0" aria-valuemax="400" aria-valuenow="294">
<input type="text" id="input" value="294"> <button id="increment" aria-label="increment value">+</button> <button id="decrement" aria-label="decrement value">-</button>
</div>
then the accessibility tree rooted at node "test" has child nodes "input", "increment", and "decrement"
QUESTION: How to express the above using the table of expected results?
element test
|
ATK
|
property
|
children
|
contains
|
accessible object associated with element "input"
|
property
|
children
|
contains
|
accessible object associated with element "increment"
|
property
|
children
|
contains
|
accessible object associated with element "decrement"
|
AX API
|
property
|
children
|
contains
|
accessible object associated with element "input"
|
property
|
children
|
contains
|
accessible object associated with element "increment"
|
property
|
children
|
contains
|
accessible object associated with element "decrement"
|
IAccessible2
|
property
|
children
|
contains
|
accessible object associated with element "input"
|
property
|
children
|
contains
|
accessible object associated with element "increment"
|
property
|
children
|
contains
|
accessible object associated with element "decrement"
|
UIA
|
property
|
children
|
contains
|
accessible object associated with element "input"
|
property
|
children
|
contains
|
accessible object associated with element "increment"
|
property
|
children
|
contains
|
accessible object associated with element "decrement"
|
Miscellaneous
Selection Events for MSAA for Single Selection when item becomes unselected
if given
<div id="listbox" role="listbox" aria-multiselectable="false" tabindex="0" aria-activedescendant="test">
<div> id="test" role="option" aria-selected="true">First</div>;
<div> id="item2" role="option" aria-selected="false">Second</div>;
</div>
set the aria-selected state to false on element with id:test and generate the MSAA EVENT_OBJECT_SELECTIONREMOVE event
attribute test:aria-selected "false"
|
element test
|
MSAA
|
event
|
type
|
is
|
EVENT_OBJECT_SELECTIONREMOVE
|
property
|
states
|
doesNotContain
|
STATE_SYSTEM_SELECTED
|
property
|
states
|
contains
|
STATE_SYSTEM_SELECTABLE
|
Special Core-AAM tests (See note)
N.B. Joanie is currently working on creation and validation of tests for Core AAM in a dedicated page for this purpose. For now, please do not modify this section or add tests to it.
UIA: new FullDescription
property
if given
<button id="test" aria-describedby="desc1 desc2">Home</button>
<div id="desc1">Open the</div>
<div id="desc2">Home Page</div>
then for the element with id test expose the aria describedby relationships on IDs test, desc1, and desc2
element test
|
UIA
|
property
|
FullDescription
|
is
|
"Open the Home Page"
|
property
|
DescribedBy
|
contains
|
desc1 desc2
|
Accessible name change
A name with an embedded textbox (id="entry"): the textbox value changes from "4" to "3".
if given
<div id="test" role="checkbox" tabindex="0">
Flash the screen <span id="entry" role="textbox" aria-multiline="false" contenteditable>3</span> times
</div>
value entry changes to "3", test's accessible name changes to "Flash the screen 3 times".
|
element test
|
ATK
|
event
|
type
|
is
|
object:property-change:accessible-name
|
MSAA
|
event
|
type
|
is
|
EVENT_OBJECT_NAMECHANGE
|
UIA
|
event
|
type
|
is
|
PropertyChangeEvent
|
AX API
|
event
|
type
|
is
|
ValueChangedNotification
|
Accessible description change
A description changes from "Press to play" to "Press to pause".
if given
<div id="test" role="button" aria-pressed="false" tabindex="0" aria-describedby="description">
Play/pause
</div>
<div id="description">
Press to pause
</div>
Description changes to "Press to pause"
|
element test
|
ATK
|
event
|
type
|
is
|
object:property-change:accessible-description
|
MSAA
|
event
|
type
|
is
|
EVENT_OBJECT_DESCRIPTIONCHANGE
|
UIA
|
event
|
type
|
is
|
PropertyChangeEvent
|
AX API
|
N/A
|
aria-expanded
In ARIA 1.1, aria-expanded is no longer a supported property of separator.
Documentation:
separator expanded false
if given
<div id="test" tabindex="0" role="separator" aria-expanded="false" id="test">
Go Fish
</div>
then the element with role="separator" and id="test" does not expose aria-expanded
ATK
|
property
|
role
|
is
|
ROLE_SEPARATOR
|
property
|
interfaces
|
contains
|
Value
|
result
|
atk_value_get_minimum_value()
|
is
|
0
|
result
|
atk_value_get_current_value()
|
is
|
50
|
result
|
atk_value_get_maximum_value()
|
is
|
100
|
property
|
states
|
doesNotContain
|
STATE_EXPANDED
|
property
|
states
|
doesNotContain
|
STATE_EXPANDABLE
|
AXAPI
|
property
|
AXRole
|
is
|
AXSplitter
|
property
|
AXSubrole
|
is
|
<nil>
|
property
|
AXRoleDescription
|
is
|
'splitter'
|
property
|
AXMinValue
|
is
|
0
|
property
|
AXValue
|
is
|
50
|
property
|
AXMaxValue
|
is
|
100
|
property
|
AXExpanded
|
TBD (need to determine how to say is not exposed)
|
true
|
property
|
AXExpanded
|
TBD (need to determine how to say is not exposed)
|
false
|
IAccessible2
|
property
|
interfaces
|
contains
|
AccessibleValue
|
property
|
minimumValue
|
is
|
0
|
property
|
currentValue
|
is
|
50
|
property
|
maximumValue
|
is
|
100
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_SEPARATOR
|
property
|
states
|
doesNotContain
|
STATE_SYSTEM_EXPANDED
|
UIA
|
property
|
ControlType
|
is
|
Thumb
|
property
|
interfaces
|
contains
|
RangeValue
|
result
|
RangeValue.Minimum
|
is
|
0
|
property
|
controlPatterns
|
doesNotContain
|
ExpandCollapse
|
result
|
RangeValue.Value
|
is
|
50
|
result
|
RangeValue.Maximum
|
is
|
100
|
separator expanded value changes
if given
<div tabindex="0" id="test" role="separator" tabindex="0">
Go fish
</div>
attribute test:aria-expanded "true"
|
element test
|
ATK
|
event
|
type
|
isNot
|
object:state-changed:expanded
|
MSAA
|
event
|
type
|
isNot
|
EVENT_OBJECT_STATECHANGE
|
UIA
|
event
|
type
|
isNot
|
expand
|
event
|
type
|
isNot
|
collapse
|
AXAPI
|
event
|
type
|
isNot
|
AXRowExpanded
|
event
|
type
|
isNot
|
AXRowCollapsed
|
event
|
type
|
isNot
|
AXRowCountChanged
|
separator expanded true
if given
<div id="test" tabindex="0" role="separator" aria-expanded="true" id="test">
Go Fish
</div>
then the element with role="separator" and id="test" does not expose aria-expanded
ATK
|
property
|
role
|
is
|
ROLE_SEPARATOR
|
property
|
interfaces
|
contains
|
Value
|
result
|
atk_value_get_minimum_value()
|
is
|
0
|
result
|
atk_value_get_current_value()
|
is
|
50
|
result
|
atk_value_get_maximum_value()
|
is
|
100
|
property
|
states
|
doesNotContain
|
STATE_EXPANDED
|
property
|
states
|
doesNotContain
|
STATE_EXPANDABLE
|
AXAPI
|
property
|
AXRole
|
is
|
AXSplitter
|
property
|
AXSubrole
|
is
|
<nil>
|
property
|
AXRoleDescription
|
is
|
'splitter'
|
property
|
AXMinValue
|
is
|
0
|
property
|
AXValue
|
is
|
50
|
property
|
AXMaxValue
|
is
|
100
|
property
|
AXExpanded
|
TBD (need to determine how to say is not exposed)
|
true
|
property
|
AXExpanded
|
TBD (need to determine how to say is not exposed)
|
false
|
IAccessible2
|
property
|
role
|
is
|
ROLE_SYSTEM_SEPARATOR
|
property
|
interfaces
|
contains
|
AccessibleValue
|
property
|
minimumValue
|
is
|
0
|
property
|
currentValue
|
is
|
50
|
property
|
maximumValue
|
is
|
100
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_SEPARATOR
|
property
|
states
|
doesNotContain
|
STATE_SYSTEM_EXPANDED
|
UIA
|
property
|
ControlType
|
is
|
Thumb
|
property
|
interfaces
|
contains
|
RangeValue
|
result
|
RangeValue.Minimum
|
is
|
0
|
property
|
controlPatterns
|
doesNotContain
|
ExpandCollapse
|
result
|
RangeValue.Value
|
is
|
50
|
result
|
RangeValue.Maximum
|
is
|
100
|
aria-selected Core AAM
In ARIA 1.1, aria-selected was removed from radio and is now required (not just supported) on option and treeitem.
In addition, the following normative statements were added to the columnheader and rowheader roles respectively in ARIA 1.1:
- "Applying the aria-selected state on a columnheader MUST NOT cause the user agent to automatically propagate the aria-selected state to all the cells in the corresponding column. An author MAY choose to propagate selection in this manner depending on the specific application."
- "Applying the aria-selected state on a rowheader MUST NOT cause the user agent to automatically propagate the aria-selected state to all the cells in the corresponding row. An author MAY choose to propagate selection in this manner depending on the specific application."
Documentation:
radio selected true
if given
<ul role="radiogroup" >
<li id="test" tabindex="0" role="radio" aria-selected="true">File</file>
<li tabindex="0" role="radio">Edit</file>
</ul>
then do not expose aria-selected for element test
element test
|
ATK
|
property
|
role
|
is
|
ROLE_RADIO_BUTTON
|
property
|
states
|
doesNotContain
|
STATE_SYSTEM_SELECTED
|
AXAPI
|
property
|
AXRole
|
is
|
AXRadioButton
|
property
|
AXSubrole
|
is
|
<nil>
|
property
|
AXRoleDescription
|
is
|
radio button
|
property
|
AXSelected
|
isNot
|
true
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_RADIOBUTTON
|
property
|
states
|
doesNotContain
|
STATE_SYSTEM_SELECTED
|
UIA
|
property
|
ControlType
|
is
|
RadioButton
|
property
|
SelectionItem.IsSelected
|
isNot
|
true
|
radio selected false
if given
<ul role="radiogroup" >
<li id="test" tabindex="0" role="radio" aria-selected="false">File</file>
<li tabindex="0" role="radio">Edit</file>
</ul>
then do not expose aria-selected for element test
element test
|
ATK
|
property
|
role
|
is
|
ROLE_RADIO_BUTTON
|
property
|
states
|
doesNotContain
|
STATE_SYSTEM_SELECTABLE
|
property
|
states
|
doesNotContain
|
STATE_SYSTEM_SELECTED
|
AXAPI
|
property
|
AXRole
|
is
|
AXRadioButton
|
property
|
AXSubrole
|
is
|
<nil>
|
property
|
AXRoleDescription
|
is
|
radio button
|
property
|
AXSelected
|
isNot
|
true
|
MSAA
|
property
|
role
|
is
|
ROLE_SYSTEM_RADIOBUTTON
|
property
|
states
|
doesNotContain
|
STATE_SYSTEM_SELECTED
|
UIA
|
property
|
ControlType
|
is
|
RadioButton
|
property
|
SelectionItem.IsSelected
|
is
|
false
|
radio selected value changes
if given
<ul role="radiogroup" >
<li id="test" tabindex="0" role="radio" aria-selected="false">File</file>
<li tabindex="0" role="radio">Edit</file>
</ul>
then do not expose aria-selected change notifications
attribute test:aria-selected "true"
|
element test
|
ATK
|
event
|
type
|
isNot
|
object:selection-changed
|
event
|
type
|
isNot
|
object:state-changed:selected
|
MSAA
|
event
|
type
|
isNot
|
EVENT_OBJECT_STATECHANGE
|
event
|
type
|
isNot
|
EVENT_OBJECT_SELECTION
|
UIA
|
event
|
type
|
isNot
|
UIA_SelectionItem_ElementSelectedEventId
|
AXAPI
|
event
|
type
|
isNot
|
AXSelectedChildrenChanged
|
AX API accessibilityIsAttributeSettable()
deprecated (NEEDS TEST)
NOTE: AX API accessibilityIsAttributeSettable()
was deprecated and replaced with AXUIElementIsAttributeSettable()
.
Special accname tests
AccName 540 test from 1.0
if given
<div id="foo"> Rich's button </div>
<input type="button" aria-labelledby="foo" id="test">
then
name="Rich's button"
ATK
|
property
|
atk_object_get_name()
|
is
|
"Rich's Button"
|
AXAPI
|
property
|
aXTitleUIElement
|
is
|
"Rich's Button"
|
property
|
aXDescription
|
is
|
<nil>
|
MSAA
|
property
|
accName
|
is
|
"Rich's Button"
|
UIA
|
property
|
Name
|
is
|
"Rich's Button"
|