ARIA 1.1 Testable Statements

From W3C Wiki

ARIA 1.1 Testing Wiki Pages

Introduction

Assumptions about Testing ARIA 1.1 Features

  1. 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.
  2. 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.
  3. 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:

  1. object:selection-changed emitted by the listbox
  2. object:state-changed:selected, with detail1 = 0 emitted by the item(s) which became unselected
  3. 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

menubar busy true

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

menubar busy false

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

rowheader colindex 4

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

rowheader rowindex 4

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

rowheader aria-colspan 2 on div

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

rowheader aria-rowspan 2 on div

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

aria-haspopup

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.

button haspopup unspecified

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

button haspopup true

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

button haspopup false

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

button haspopup dialog

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

button haspopup grid

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

button haspopup listbox

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

button haspopup menu

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

button haspopup tree

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

button haspopup foo

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

button haspopup emptystring

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

combobox haspopup 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, 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

combobox haspopup true

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

combobox haspopup false

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

combobox haspopup dialog

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

combobox haspopup grid

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

combobox haspopup listbox

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

combobox haspopup menu

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

combobox haspopup tree

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

menu orientation unspecified

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

menu orientation horizontal

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

menu orientation vertical

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

menubar orientation unspecified

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

menubar orientation 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

menubar orientation vertical

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

grid rowheader readonly true

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

grid rowheader readonly false

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

grid rowheader readonly unspecified

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

menuitemcheckbox readonly unspecified

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

menuitemcheckbox readonly true

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

menuitemcheckbox readonly false

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

menuitemradio readonly unspecified

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

menuitemradio readonly true

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

menuitemradio readonly false

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)

table rowheader 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

grid rowheader required 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="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

grid rowheader required 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="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

grid rowheader required unspecified

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)

table rowheader 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

rowheader selected true not automatically propagated

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

rowheader selected false not automatically propagated

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"

menuitemcheckbox with child elements

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"

menuitemradio with child elements

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"