Commit 7d29603f authored by Benjamin Beaudry's avatar Benjamin Beaudry Committed by Chromium LUCI CQ

Expose NameProperty for listitems on UIA

Elements with the listitem role should always expose their accessible
names with UIA. This was causing an issue with Narrator on Windows when
navigating by list item - Narrator would only announce "element x of N"
when it should actually announce "[listitem name], element x of N".

This is per spec: https://docs.microsoft.com/en-us/dotnet/framework/ui-automation/ui-automation-support-for-the-listitem-control-type

Bug: N/A
Change-Id: I4f2d1a999d00cc8f5b23989d3ade90c907764152
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2610264Reviewed-by: default avatarNektarios Paisios <nektar@chromium.org>
Reviewed-by: default avatarVictor Fei <vicfei@microsoft.com>
Reviewed-by: default avatarAaron Leventhal <aleventhal@chromium.org>
Commit-Queue: Benjamin Beaudry <benjamin.beaudry@microsoft.com>
Cr-Commit-Position: refs/heads/master@{#843553}
parent 42d56cfe
StructureChanged/ChildAdded on role=listitem, name=item3
StructureChanged/ChildrenReordered on role=list, name=ul
\ No newline at end of file
StructureChanged/ChildrenReordered on role=list, name=ul
......@@ -14,7 +14,7 @@ Document
++++++++DataItem Name='Always expose editable tables as tables.' GridItem.Column=0 GridItem.ColumnSpan=1 GridItem.Row=0 GridItem.RowSpan=1
++++++++++Text Name='Always expose editable tables as tables.' IsControlElement=false
++++List
++++++ListItem
++++++ListItem Name='Editable list item.'
++++++++Group
++++++++++Text Name='1. ' IsControlElement=false
++++++++Text Name='Editable list item.' IsControlElement=false
......
......@@ -14,7 +14,7 @@ Document
++++++++DataItem Name='Always expose editable tables as tables.' GridItem.Column=0 GridItem.ColumnSpan=1 GridItem.Row=0 GridItem.RowSpan=1
++++++++++Text Name='Always expose editable tables as tables.' IsControlElement=false
++++List
++++++ListItem
++++++ListItem Name='Editable list item.'
++++++++Group
++++++++++Text Name='1. ' IsControlElement=false
++++++++Text Name='Editable list item.' IsControlElement=false
android.webkit.WebView focusable focused scrollable
++android.widget.ListView collection item_count=3 row_count=3
++++android.view.View collection_item
++++android.view.View collection_item name='Custom name'
++++++android.view.View name='• '
++++++android.widget.TextView name='Item 1'
++++android.view.View collection_item item_index=1 row_index=1
......
[document web]
++[list] display:block setsize:3
++++[list item] display:list-item posinset:1 setsize:3
++++[list item] name='Custom name' display:list-item posinset:1 setsize:3
++++++[panel] display:inline-block
++++++++[static] name='• '
++++++[static] name='Item 1' display:list-item
......
......@@ -2,7 +2,7 @@ rootWebArea
++genericContainer ignored display='block'
++++genericContainer ignored display='block'
++++++list display='block' setSize=3
++++++++listItem display='list-item' hierarchicalLevel=1 setSize=3 posInSet=1
++++++++listItem display='list-item' name='Custom name' hierarchicalLevel=1 setSize=3 posInSet=1
++++++++++listMarker display='inline-block' name='• '
++++++++++++staticText name='• '
++++++++++++++inlineTextBox name='• '
......
AXWebArea
++AXList AXSubrole=AXContentList
++++AXGroup
++++AXGroup AXDescription='Custom name'
++++++AXListMarker AXValue='• '
++++++++AXStaticText AXValue='• '
++++++AXStaticText AXValue='Item 1'
......
Document
++List
++++ListItem
++++ListItem Name='Custom name'
++++++Group
++++++++Text Name='• ' IsControlElement=false
++++++Text Name='Item 1' IsControlElement=false
++++ListItem
++++ListItem Name='Item 2'
++++++Group
++++++++Text Name='• ' IsControlElement=false
++++++Text Name='Item 2' IsControlElement=false
++++ListItem
++++ListItem Name='Item 3'
++++++Group
++++++++Text Name='• ' IsControlElement=false
++++++Text Name='Item 3' IsControlElement=false
ROLE_SYSTEM_DOCUMENT READONLY FOCUSABLE
++ROLE_SYSTEM_LIST READONLY display:block
++++ROLE_SYSTEM_LISTITEM READONLY display:list-item
++++ROLE_SYSTEM_LISTITEM name='Custom name' READONLY display:list-item
++++++ROLE_SYSTEM_GROUPING display:inline-block
++++++++ROLE_SYSTEM_STATICTEXT name='• '
++++++ROLE_SYSTEM_STATICTEXT name='Item 1' display:list-item
......
......@@ -12,7 +12,7 @@
<html>
<body>
<ul>
<li>Item 1</li>
<li aria-label="Custom name">Item 1</li>
<li>Item 2</li>
<li>Item 3</li>
</ul>
......
Document
++List
++++ListItem
++++ListItem Name='tic'
++++++Group
++++++++Text Name='• ' IsControlElement=false
++++++Text Name='tic' IsControlElement=false
++++ListItem
++++ListItem Name='tac'
++++++Group
++++++++Text Name='• ' IsControlElement=false
++++++Text Name='tac' IsControlElement=false
++++ListItem
++++ListItem Name='toe'
++++++Group
++++++++Text Name='• ' IsControlElement=false
++++++Text Name='toe' IsControlElement=false
++List
++++ListItem
++++ListItem Name='tic'
++++++Text Name='tic' IsControlElement=false
++++Text Name=' '
++++ListItem
++++ListItem Name='tac'
++++++Text Name='tac' IsControlElement=false
++++Text Name=' '
++++ListItem
++++ListItem Name='toe'
++++++Text Name='toe' IsControlElement=false
Document PositionInSet=0 SizeOfSet=0 Level=0
++List PositionInSet=0 SizeOfSet=8 Level=0
++++ListItem PositionInSet=5 SizeOfSet=-1 Level=1
++++ListItem Name='Level 1, item 5 of set size unknown' PositionInSet=5 SizeOfSet=-1 Level=1
++++++Text Name='Level 1, item 5 of set size unknown' PositionInSet=0 SizeOfSet=0 Level=0
++++ListItem PositionInSet=6 SizeOfSet=-1 Level=1
++++ListItem Name='Level 1, item 6 of set size unknown' PositionInSet=6 SizeOfSet=-1 Level=1
++++++Text Name='Level 1, item 6 of set size unknown' PositionInSet=0 SizeOfSet=0 Level=0
++++++List PositionInSet=0 SizeOfSet=7 Level=0
++++++++ListItem PositionInSet=6 SizeOfSet=-1 Level=2
++++++++ListItem Name='Level 2, item 6 of set size unknown' PositionInSet=6 SizeOfSet=-1 Level=2
++++++++++Text Name='Level 2, item 6 of set size unknown' PositionInSet=0 SizeOfSet=0 Level=0
++++++++ListItem PositionInSet=7 SizeOfSet=-1 Level=2
++++++++ListItem Name='Level 2, item 7 of set size unknown' PositionInSet=7 SizeOfSet=-1 Level=2
++++++++++Text Name='Level 2, item 7 of set size unknown' PositionInSet=0 SizeOfSet=0 Level=0
++++ListItem PositionInSet=7 SizeOfSet=2 Level=1
++++ListItem Name='Level 1, item 7 of set size 2' PositionInSet=7 SizeOfSet=2 Level=1
++++++Text Name='Level 1, item 7 of set size 2' PositionInSet=0 SizeOfSet=0 Level=0
++++ListItem PositionInSet=8 SizeOfSet=3 Level=1
++++++Text Name='Level 1, item 8 of set size 3' PositionInSet=0 SizeOfSet=0 Level=0
\ No newline at end of file
++++ListItem Name='Level 1, item 8 of set size 3' PositionInSet=8 SizeOfSet=3 Level=1
++++++Text Name='Level 1, item 8 of set size 3' PositionInSet=0 SizeOfSet=0 Level=0
Document PositionInSet=0 SizeOfSet=0 Level=0
++List PositionInSet=0 SizeOfSet=1 Level=0
++++ListItem PositionInSet=1 SizeOfSet=-1 Level=1
++++ListItem Name='Level 1, item 1 of set size unknown' PositionInSet=1 SizeOfSet=-1 Level=1
++++++Text Name='Level 1, item 1 of set size unknown' PositionInSet=0 SizeOfSet=0 Level=0
++List PositionInSet=0 SizeOfSet=1 Level=0
++++ListItem PositionInSet=1 SizeOfSet=-1 Level=2
++++ListItem Name='++Level 2, item 1 of set size unknown' PositionInSet=1 SizeOfSet=-1 Level=2
++++++Text Name='++Level 2, item 1 of set size unknown' PositionInSet=0 SizeOfSet=0 Level=0
++List PositionInSet=0 SizeOfSet=2 Level=0
++++ListItem PositionInSet=2 SizeOfSet=-1 Level=2
++++ListItem Name='++Level 2, item 2 of set size unknown' PositionInSet=2 SizeOfSet=-1 Level=2
++++++Text Name='++Level 2, item 2 of set size unknown' PositionInSet=0 SizeOfSet=0 Level=0
++List PositionInSet=0 SizeOfSet=3 Level=0
++++ListItem PositionInSet=3 SizeOfSet=-1 Level=2
++++ListItem Name='++Level 2, item 3 of set size unknown' PositionInSet=3 SizeOfSet=-1 Level=2
++++++Text Name='++Level 2, item 3 of set size unknown' PositionInSet=0 SizeOfSet=0 Level=0
++List PositionInSet=0 SizeOfSet=1 Level=0
++++ListItem PositionInSet=1 SizeOfSet=-1 Level=3
++++ListItem Name='++++Level 3, item 1 of set size unknown' PositionInSet=1 SizeOfSet=-1 Level=3
++++++Text Name='++++Level 3, item 1 of set size unknown' PositionInSet=0 SizeOfSet=0 Level=0
++List PositionInSet=0 SizeOfSet=2 Level=0
++++ListItem PositionInSet=2 SizeOfSet=-1 Level=3
++++ListItem Name='++++Level 3, item 2 of set size unknown' PositionInSet=2 SizeOfSet=-1 Level=3
++++++Text Name='++++Level 3, item 2 of set size unknown' PositionInSet=0 SizeOfSet=0 Level=0
++List PositionInSet=0 SizeOfSet=2 Level=0
++++ListItem PositionInSet=2 SizeOfSet=-1 Level=1
++++ListItem Name='Level 1, item 2 of set size unknown' PositionInSet=2 SizeOfSet=-1 Level=1
++++++Text Name='Level 1, item 2 of set size unknown' PositionInSet=0 SizeOfSet=0 Level=0
++List PositionInSet=0 SizeOfSet=3 Level=0
++++ListItem PositionInSet=3 SizeOfSet=-1 Level=1
++++ListItem Name='Level 1, item 3 of set size unknown' PositionInSet=3 SizeOfSet=-1 Level=1
++++++Text Name='Level 1, item 3 of set size unknown' PositionInSet=0 SizeOfSet=0 Level=0
++List PositionInSet=0 SizeOfSet=0 Level=0
++++List PositionInSet=0 SizeOfSet=4 Level=0
++++++ListItem PositionInSet=4 SizeOfSet=4 Level=2
++++++ListItem Name='Level Unspecified, aria-setsize attribute does not exist, item 4 of set size 4' PositionInSet=4 SizeOfSet=4 Level=2
++++++++Text Name='Level Unspecified, aria-setsize attribute does not exist, item 4 of set size 4' PositionInSet=0 SizeOfSet=0 Level=0
++++List PositionInSet=0 SizeOfSet=5 Level=0
++++++ListItem PositionInSet=5 SizeOfSet=5 Level=2
++++++++Text Name='Level Unspecified, aria-setsize attribute does not exist, item 5 of set size 5' PositionInSet=0 SizeOfSet=0 Level=0
\ No newline at end of file
++++++ListItem Name='Level Unspecified, aria-setsize attribute does not exist, item 5 of set size 5' PositionInSet=5 SizeOfSet=5 Level=2
++++++++Text Name='Level Unspecified, aria-setsize attribute does not exist, item 5 of set size 5' PositionInSet=0 SizeOfSet=0 Level=0
Document
++List
++++ListItem
++++ListItem Name='First item properly groups itself despite bolded text.'
++++++Group
++++++++Text Name='• ' IsControlElement=false
++++++Text Name='First item properly groups itself despite ' IsControlElement=false
++++++Text Name='bolded' IsControlElement=false
++++++Text Name=' text.' IsControlElement=false
++++ListItem
++++ListItem Name='This should also be seen as a group.'
++++++Group
++++++++Text Name='• ' IsControlElement=false
++++++Text Name='This should also be ' IsControlElement=false
++++++Text Name='seen' IsControlElement=false
++++++Text Name=' as a group.' IsControlElement=false
++++ListItem
++++ListItem Name='Some more text.'
++++++Group
++++++++Text Name='• ' IsControlElement=false
++++++Text Name='Some ' IsControlElement=false
......
......@@ -2,7 +2,7 @@ Document
++Group IsControlElement=false
++++Text Name='Menu is deprecated, but it may still be used semantically with list item children. For more history, see crbug.com/87553.'
++List
++++ListItem
++++ListItem Name='Cats'
++++++Text Name='Cats' IsControlElement=false
++++ListItem
++++ListItem Name='Dogs'
++++++Text Name='Dogs' IsControlElement=false
\ No newline at end of file
Document
++List
++++ListItem
++++ListItem Name='Chrome'
++++++Group
++++++++Text Name='1. ' IsControlElement=false
++++++Text Name='Chrome' IsControlElement=false
++++ListItem
++++ListItem Name='Safari'
++++++Group
++++++++Text Name='2. ' IsControlElement=false
++++++Text Name='Safari' IsControlElement=false
++++ListItem
++++ListItem Name='IE'
++++++Group
++++++++Text Name='3. ' IsControlElement=false
++++++Text Name='IE' IsControlElement=false
++List
++++ListItem
++++ListItem Name='Android'
++++++Group
++++++++Text Name='10. ' IsControlElement=false
++++++Text Name='Android' IsControlElement=false
++++ListItem
++++ListItem Name='Mac'
++++++Group
++++++++Text Name='11. ' IsControlElement=false
++++++Text Name='Mac' IsControlElement=false
++++ListItem
++++ListItem Name='Windows'
++++++Group
++++++++Text Name='12. ' IsControlElement=false
++++++Text Name='Windows' IsControlElement=false
Document
++List
++++ListItem
++++ListItem Name='Item 1'
++++++Group
++++++++Text Name='• ' IsControlElement=false
++++++Text Name='Item 1' IsControlElement=false
++++ListItem
++++ListItem Name='Item 2'
++++++Group
++++++++Text Name='• ' IsControlElement=false
++++++Text Name='Item 2' IsControlElement=false
++++ListItem
++++ListItem Name='Item 3'
++++++Group
++++++++Text Name='• ' IsControlElement=false
++++++Text Name='Item 3' IsControlElement=false
......@@ -4243,7 +4243,15 @@ HRESULT AXPlatformNodeWin::GetPropertyValueImpl(PROPERTYID property_id,
case UIA_NamePropertyId:
if (IsNameExposed()) {
result->vt = VT_BSTR;
GetNameAsBstr(&result->bstrVal);
// We need to handle listitems name property differently because UIA
// expects a name for listitems, whereas other APIs do not.
if (GetData().role == ax::mojom::Role::kListItem &&
!HasStringAttribute(ax::mojom::StringAttribute::kName)) {
ComputeListItemNameAsBstr(&result->bstrVal);
} else {
GetNameAsBstr(&result->bstrVal);
}
}
break;
......@@ -7641,6 +7649,21 @@ HRESULT AXPlatformNodeWin::GetNameAsBstr(BSTR* value_bstr) const {
return S_OK;
}
HRESULT AXPlatformNodeWin::ComputeListItemNameAsBstr(BSTR* value_bstr) const {
DCHECK(GetData().role == ax::mojom::Role::kListItem);
DCHECK(!HasStringAttribute(ax::mojom::StringAttribute::kName));
base::string16 str;
for (int i = 0; i < GetChildCount(); ++i) {
auto* child = static_cast<AXPlatformNodeWin*>(
FromNativeViewAccessible(ChildAtIndex(i)));
if (child->GetDelegate()->IsText())
str += child->GetNameAsString16();
}
*value_bstr = SysAllocString(str.c_str());
DCHECK(*value_bstr);
return S_OK;
}
void AXPlatformNodeWin::AddAlertTarget() {
g_alert_targets.Get().insert(this);
}
......
......@@ -1220,6 +1220,8 @@ class AX_EXPORT __declspec(uuid("26f5641a-246d-457b-a96d-07f3fae6acf2"))
HRESULT GetNameAsBstr(BSTR* value_bstr) const;
HRESULT ComputeListItemNameAsBstr(BSTR* value_bstr) const;
// Sets the selection given a start and end offset in IA2 Hypertext.
void SetIA2HypertextSelection(LONG start_offset, LONG end_offset);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment