Commit e30fa136 authored by Aaron Leventhal's avatar Aaron Leventhal Committed by Commit Bot

Table column headers not exposed appropriately in Mac accessibility

- On existing column headers, we should expose nothing for
AXColumnHeaderUIElements.
- For cells, we should expose only the column headers that are used for that cell,
not all of them as we currently do.
- The children of a column should be exposed (this is what actually fixes the VoiceOver issue in the bug).
- The children and visibleChildren should be the same.

Bug: 775167
Change-Id: Ief4d1ee80cd759250041e78e95e643030c14b361
Reviewed-on: https://chromium-review.googlesource.com/721420
Commit-Queue: Aaron Leventhal <aleventhal@chromium.org>
Commit-Queue: Dominic Mazzoni <dmazzoni@chromium.org>
Reviewed-by: default avatarDominic Mazzoni <dmazzoni@chromium.org>
Cr-Commit-Position: refs/heads/master@{#512707}
parent e60ebbd1
...@@ -83,6 +83,9 @@ struct AXTextEdit { ...@@ -83,6 +83,9 @@ struct AXTextEdit {
- (NSString*)valueForRange:(NSRange)range; - (NSString*)valueForRange:(NSRange)range;
- (NSAttributedString*)attributedValueForRange:(NSRange)range; - (NSAttributedString*)attributedValueForRange:(NSRange)range;
- (BOOL)isRowHeaderForCurrentCell:(content::BrowserAccessibility*)header;
- (BOOL)isColumnHeaderForCurrentCell:(content::BrowserAccessibility*)header;
// Internally-used property. // Internally-used property.
@property(nonatomic, readonly) NSPoint origin; @property(nonatomic, readonly) NSPoint origin;
......
...@@ -805,13 +805,55 @@ NSString* const NSAccessibilityRequiredAttributeChrome = @"AXRequired"; ...@@ -805,13 +805,55 @@ NSString* const NSAccessibilityRequiredAttributeChrome = @"AXRequired";
} }
} }
- (BOOL)isColumnHeaderForCurrentCell:(BrowserAccessibility*)header {
int cell_first_col = -1;
int cell_colspan = -1;
browserAccessibility_->GetIntAttribute(ui::AX_ATTR_ARIA_CELL_COLUMN_INDEX,
&cell_first_col);
if (cell_first_col < 0) {
browserAccessibility_->GetIntAttribute(ui::AX_ATTR_TABLE_CELL_COLUMN_INDEX,
&cell_first_col);
}
if (cell_first_col < 0)
return false;
browserAccessibility_->GetIntAttribute(ui::AX_ATTR_TABLE_CELL_COLUMN_SPAN,
&cell_colspan);
if (cell_colspan <= 0)
cell_colspan = 1;
int cell_last_col = cell_first_col + cell_colspan - 1;
int header_first_col = -1;
int header_colspan = -1;
header->GetIntAttribute(ui::AX_ATTR_ARIA_CELL_COLUMN_INDEX,
&header_first_col);
if (header_first_col < 0) {
header->GetIntAttribute(ui::AX_ATTR_TABLE_CELL_COLUMN_INDEX,
&header_first_col);
}
if (header_first_col < 0)
return false;
header->GetIntAttribute(ui::AX_ATTR_TABLE_CELL_COLUMN_SPAN, &header_colspan);
if (header_colspan <= 0)
header_colspan = 1;
int header_last_col = header_first_col + header_colspan - 1;
int topmost_col_of_either = std::max(cell_first_col, header_first_col);
int bottommost_col_of_either = std::min(cell_last_col, header_last_col);
bool has_col_intersection = topmost_col_of_either <= bottommost_col_of_either;
return has_col_intersection;
}
- (NSArray*)columnHeaders { - (NSArray*)columnHeaders {
if (![self instanceActive]) if (![self instanceActive])
return nil; return nil;
if (!ui::IsTableLikeRole(browserAccessibility_->GetRole()) &&
!ui::IsCellOrTableHeaderRole(browserAccessibility_->GetRole())) { bool is_cell_or_table_header =
ui::IsCellOrTableHeaderRole(browserAccessibility_->GetRole());
bool is_table_like = ui::IsTableLikeRole(browserAccessibility_->GetRole());
if (!is_table_like && !is_cell_or_table_header)
return nil; return nil;
}
BrowserAccessibility* table = [self containingTable]; BrowserAccessibility* table = [self containingTable];
if (!table) if (!table)
return nil; return nil;
...@@ -823,10 +865,14 @@ NSString* const NSAccessibilityRequiredAttributeChrome = @"AXRequired"; ...@@ -823,10 +865,14 @@ NSString* const NSAccessibilityRequiredAttributeChrome = @"AXRequired";
int id = uniqueCellIds[i]; int id = uniqueCellIds[i];
BrowserAccessibility* cell = BrowserAccessibility* cell =
browserAccessibility_->manager()->GetFromID(id); browserAccessibility_->manager()->GetFromID(id);
if (cell && cell->GetRole() == ui::AX_ROLE_COLUMN_HEADER) if (cell && cell->GetRole() == ui::AX_ROLE_COLUMN_HEADER) {
[ret addObject:ToBrowserAccessibilityCocoa(cell)]; // Expose all column headers on table object.
// Expose only relevant column headers on cell object.
if (is_table_like || [self isColumnHeaderForCurrentCell:cell])
[ret addObject:ToBrowserAccessibilityCocoa(cell)];
}
} }
return ret; return [ret count] ? ret : nil;
} }
- (NSValue*)columnIndexRange { - (NSValue*)columnIndexRange {
...@@ -1617,13 +1663,56 @@ NSString* const NSAccessibilityRequiredAttributeChrome = @"AXRequired"; ...@@ -1617,13 +1663,56 @@ NSString* const NSAccessibilityRequiredAttributeChrome = @"AXRequired";
return NSAccessibilityRoleDescription(role, nil); return NSAccessibilityRoleDescription(role, nil);
} }
- (BOOL)isRowHeaderForCurrentCell:(BrowserAccessibility*)header {
int cell_first_row = -1;
int cell_rowspan = -1;
browserAccessibility_->GetIntAttribute(ui::AX_ATTR_ARIA_CELL_ROW_INDEX,
&cell_first_row);
if (cell_first_row < 0) {
browserAccessibility_->GetIntAttribute(ui::AX_ATTR_TABLE_CELL_ROW_INDEX,
&cell_first_row);
}
if (cell_first_row < 0)
return false;
browserAccessibility_->GetIntAttribute(ui::AX_ATTR_TABLE_CELL_ROW_SPAN,
&cell_rowspan);
if (cell_rowspan <= 0)
cell_rowspan = 1;
int cell_last_row = cell_first_row + cell_rowspan - 1;
int header_first_row = -1;
int header_rowspan = -1;
header->GetIntAttribute(ui::AX_ATTR_ARIA_CELL_ROW_INDEX, &header_first_row);
if (header_first_row < 0) {
header->GetIntAttribute(ui::AX_ATTR_TABLE_CELL_ROW_INDEX,
&header_first_row);
}
if (header_first_row < 0)
return false;
header->GetIntAttribute(ui::AX_ATTR_TABLE_CELL_ROW_SPAN, &header_rowspan);
if (header_rowspan <= 0)
header_rowspan = 1;
int header_last_row = header_first_row + header_rowspan - 1;
int topmost_row_of_either = std::max(cell_first_row, header_first_row);
int bottommost_row_of_either = std::min(cell_last_row, header_last_row);
bool has_row_intersection = topmost_row_of_either <= bottommost_row_of_either;
return has_row_intersection;
}
- (NSArray*)rowHeaders { - (NSArray*)rowHeaders {
if (![self instanceActive]) if (![self instanceActive])
return nil; return nil;
if (!ui::IsTableLikeRole(browserAccessibility_->GetRole()) && bool is_cell_or_table_header =
!ui::IsCellOrTableHeaderRole(browserAccessibility_->GetRole())) { ui::IsCellOrTableHeaderRole(browserAccessibility_->GetRole());
bool is_table_like = ui::IsTableLikeRole(browserAccessibility_->GetRole());
if (!is_table_like && !is_cell_or_table_header)
return nil; return nil;
}
BrowserAccessibility* table = [self containingTable]; BrowserAccessibility* table = [self containingTable];
if (!table) if (!table)
return nil; return nil;
...@@ -1635,10 +1724,12 @@ NSString* const NSAccessibilityRequiredAttributeChrome = @"AXRequired"; ...@@ -1635,10 +1724,12 @@ NSString* const NSAccessibilityRequiredAttributeChrome = @"AXRequired";
int id = uniqueCellIds[i]; int id = uniqueCellIds[i];
BrowserAccessibility* cell = BrowserAccessibility* cell =
browserAccessibility_->manager()->GetFromID(id); browserAccessibility_->manager()->GetFromID(id);
if (cell && cell->GetRole() == ui::AX_ROLE_ROW_HEADER) if (cell && cell->GetRole() == ui::AX_ROLE_ROW_HEADER) {
[ret addObject:ToBrowserAccessibilityCocoa(cell)]; if (is_table_like || [self isRowHeaderForCurrentCell:cell])
[ret addObject:ToBrowserAccessibilityCocoa(cell)];
}
} }
return ret; return [ret count] ? ret : nil;
} }
- (NSValue*)rowIndexRange { - (NSValue*)rowIndexRange {
...@@ -2054,17 +2145,7 @@ NSString* const NSAccessibilityRequiredAttributeChrome = @"AXRequired"; ...@@ -2054,17 +2145,7 @@ NSString* const NSAccessibilityRequiredAttributeChrome = @"AXRequired";
- (NSArray*)visibleChildren { - (NSArray*)visibleChildren {
if (![self instanceActive]) if (![self instanceActive])
return nil; return nil;
NSMutableArray* ret = [[[NSMutableArray alloc] init] autorelease]; return [self children];
uint32_t childCount = browserAccessibility_->PlatformChildCount();
for (uint32_t index = 0; index < childCount; ++index) {
BrowserAccessibilityCocoa* child = ToBrowserAccessibilityCocoa(
browserAccessibility_->PlatformGetChild(index));
if ([child isIgnored])
[ret addObjectsFromArray:[child visibleChildren]];
else
[ret addObject:child];
}
return ret;
} }
- (NSArray*)visibleColumns { - (NSArray*)visibleColumns {
...@@ -2753,12 +2834,20 @@ NSString* const NSAccessibilityRequiredAttributeChrome = @"AXRequired"; ...@@ -2753,12 +2834,20 @@ NSString* const NSAccessibilityRequiredAttributeChrome = @"AXRequired";
[ret addObjectsFromArray:@[ [ret addObjectsFromArray:@[
NSAccessibilityColumnIndexRangeAttribute, NSAccessibilityColumnIndexRangeAttribute,
NSAccessibilityRowIndexRangeAttribute, NSAccessibilityRowIndexRangeAttribute,
NSAccessibilityColumnHeaderUIElementsAttribute,
NSAccessibilityRowHeaderUIElementsAttribute,
NSAccessibilityARIAColumnIndexAttribute, NSAccessibilityARIAColumnIndexAttribute,
NSAccessibilityARIARowIndexAttribute, NSAccessibilityARIARowIndexAttribute,
@"AXSortDirection", @"AXSortDirection",
]]; ]];
if ([self internalRole] != ui::AX_ROLE_COLUMN_HEADER) {
[ret addObjectsFromArray:@[
NSAccessibilityColumnHeaderUIElementsAttribute,
]];
}
if ([self internalRole] != ui::AX_ROLE_ROW_HEADER) {
[ret addObjectsFromArray:@[
NSAccessibilityRowHeaderUIElementsAttribute,
]];
}
} else if ([role isEqualToString:@"AXWebArea"]) { } else if ([role isEqualToString:@"AXWebArea"]) {
[ret addObjectsFromArray:@[ [ret addObjectsFromArray:@[
@"AXLoaded", NSAccessibilityLoadingProgressAttribute @"AXLoaded", NSAccessibilityLoadingProgressAttribute
......
...@@ -905,15 +905,15 @@ void BlinkAXTreeSource::SerializeNode(WebAXObject src, ...@@ -905,15 +905,15 @@ void BlinkAXTreeSource::SerializeNode(WebAXObject src,
// parent is the row, the row adds it as a child, and the column adds it // parent is the row, the row adds it as a child, and the column adds it
// as an indirect child. // as an indirect child.
int child_count = src.ChildCount(); int child_count = src.ChildCount();
std::vector<int32_t> indirect_child_ids;
for (int i = 0; i < child_count; ++i) { for (int i = 0; i < child_count; ++i) {
WebAXObject child = src.ChildAt(i); WebAXObject child = src.ChildAt(i);
std::vector<int32_t> indirect_child_ids;
if (!is_iframe && !child.IsDetached() && !IsParentUnignoredOf(src, child)) if (!is_iframe && !child.IsDetached() && !IsParentUnignoredOf(src, child))
indirect_child_ids.push_back(child.AxID()); indirect_child_ids.push_back(child.AxID());
if (indirect_child_ids.size() > 0) { }
dst->AddIntListAttribute( if (indirect_child_ids.size() > 0) {
ui::AX_ATTR_INDIRECT_CHILD_IDS, indirect_child_ids); dst->AddIntListAttribute(ui::AX_ATTR_INDIRECT_CHILD_IDS,
} indirect_child_ids);
} }
if (src.IsScrollableContainer()) { if (src.IsScrollableContainer()) {
......
AXWebArea AXWebArea
++AXTable AXColumnHeaderUIElements=["AXCell Browser","AXCell Rendering Engine"] AXHeader='AXGroup' AXRowHeaderUIElements=[] ++AXTable AXColumnHeaderUIElements=["AXCell Browser","AXCell Rendering Engine"] AXHeader='AXGroup'
++++AXRow AXIndex='0' ++++AXRow AXIndex='0'
++++++AXCell AXTitle='Browser' AXColumnHeaderUIElements=["AXCell Browser","AXCell Rendering Engine"] AXColumnIndexRange={"len":1,"loc":0} AXRowHeaderUIElements=[] AXRowIndexRange={"len":1,"loc":0} ++++++AXCell AXTitle='Browser' AXColumnIndexRange={"len":1,"loc":0} AXRowIndexRange={"len":1,"loc":0}
++++++++AXStaticText AXValue='Browser' ++++++++AXStaticText AXValue='Browser'
++++++AXCell AXTitle='Rendering Engine' AXColumnHeaderUIElements=["AXCell Browser","AXCell Rendering Engine"] AXColumnIndexRange={"len":1,"loc":1} AXRowHeaderUIElements=[] AXRowIndexRange={"len":1,"loc":0} ++++++AXCell AXTitle='Rendering Engine' AXColumnIndexRange={"len":1,"loc":1} AXRowIndexRange={"len":1,"loc":0}
++++++++AXStaticText AXValue='Rendering Engine' ++++++++AXStaticText AXValue='Rendering Engine'
++++AXRow AXIndex='1' ++++AXRow AXIndex='1'
++++++AXCell AXTitle='Chrome' AXColumnHeaderUIElements=["AXCell Browser","AXCell Rendering Engine"] AXColumnIndexRange={"len":1,"loc":0} AXRowHeaderUIElements=[] AXRowIndexRange={"len":1,"loc":1} ++++++AXCell AXTitle='Chrome' AXColumnHeaderUIElements=["AXCell Browser"] AXColumnIndexRange={"len":1,"loc":0} AXRowIndexRange={"len":1,"loc":1}
++++++++AXStaticText AXValue='Chrome' ++++++++AXStaticText AXValue='Chrome'
++++++AXCell AXTitle='Blink' AXColumnHeaderUIElements=["AXCell Browser","AXCell Rendering Engine"] AXColumnIndexRange={"len":1,"loc":1} AXRowHeaderUIElements=[] AXRowIndexRange={"len":1,"loc":1} ++++++AXCell AXTitle='Blink' AXColumnHeaderUIElements=["AXCell Rendering Engine"] AXColumnIndexRange={"len":1,"loc":1} AXRowIndexRange={"len":1,"loc":1}
++++++++AXStaticText AXValue='Blink' ++++++++AXStaticText AXValue='Blink'
++++AXRow AXIndex='2' ++++AXRow AXIndex='2'
++++++AXCell AXTitle='Safari' AXColumnHeaderUIElements=["AXCell Browser","AXCell Rendering Engine"] AXColumnIndexRange={"len":1,"loc":0} AXRowHeaderUIElements=[] AXRowIndexRange={"len":1,"loc":2} ++++++AXCell AXTitle='Safari' AXColumnHeaderUIElements=["AXCell Browser"] AXColumnIndexRange={"len":1,"loc":0} AXRowIndexRange={"len":1,"loc":2}
++++++++AXStaticText AXValue='Safari' ++++++++AXStaticText AXValue='Safari'
++++++AXCell AXTitle='WebKit' AXColumnHeaderUIElements=["AXCell Browser","AXCell Rendering Engine"] AXColumnIndexRange={"len":1,"loc":1} AXRowHeaderUIElements=[] AXRowIndexRange={"len":1,"loc":2} ++++++AXCell AXTitle='WebKit' AXColumnHeaderUIElements=["AXCell Rendering Engine"] AXColumnIndexRange={"len":1,"loc":1} AXRowIndexRange={"len":1,"loc":2}
++++++++AXStaticText AXValue='WebKit' ++++++++AXStaticText AXValue='WebKit'
++++AXColumn AXHeader='AXCell Browser' AXIndex='0' ++++AXColumn AXHeader='AXCell Browser' AXIndex='0'
++++AXColumn AXHeader='AXCell Rendering Engine' AXIndex='1' ++++AXColumn AXHeader='AXCell Rendering Engine' AXIndex='1'
++++AXGroup ++++AXGroup
\ No newline at end of file
AXWebArea AXWebArea
++AXTable AXColumnHeaderUIElements=[] AXHeader='AXGroup' AXRowHeaderUIElements=["AXCell Browser","AXCell Rendering Engine"] ++AXTable AXHeader='AXGroup' AXRowHeaderUIElements=["AXCell Browser","AXCell Rendering Engine"]
++++AXRow AXIndex='0' ++++AXRow AXIndex='0'
++++++AXCell AXTitle='Browser' AXColumnHeaderUIElements=[] AXColumnIndexRange={"len":1,"loc":0} AXRowHeaderUIElements=["AXCell Browser","AXCell Rendering Engine"] AXRowIndexRange={"len":1,"loc":0} ++++++AXCell AXTitle='Browser' AXColumnIndexRange={"len":1,"loc":0} AXRowIndexRange={"len":1,"loc":0}
++++++++AXStaticText AXValue='Browser' ++++++++AXStaticText AXValue='Browser'
++++++AXCell AXTitle='Chrome' AXColumnHeaderUIElements=[] AXColumnIndexRange={"len":1,"loc":1} AXRowHeaderUIElements=["AXCell Browser","AXCell Rendering Engine"] AXRowIndexRange={"len":1,"loc":0} ++++++AXCell AXTitle='Chrome' AXColumnIndexRange={"len":1,"loc":1} AXRowHeaderUIElements=["AXCell Browser"] AXRowIndexRange={"len":1,"loc":0}
++++++++AXStaticText AXValue='Chrome' ++++++++AXStaticText AXValue='Chrome'
++++++AXCell AXTitle='Safari' AXColumnHeaderUIElements=[] AXColumnIndexRange={"len":1,"loc":2} AXRowHeaderUIElements=["AXCell Browser","AXCell Rendering Engine"] AXRowIndexRange={"len":1,"loc":0} ++++++AXCell AXTitle='Safari' AXColumnIndexRange={"len":1,"loc":2} AXRowHeaderUIElements=["AXCell Browser"] AXRowIndexRange={"len":1,"loc":0}
++++++++AXStaticText AXValue='Safari' ++++++++AXStaticText AXValue='Safari'
++++AXRow AXIndex='1' ++++AXRow AXIndex='1'
++++++AXCell AXTitle='Rendering Engine' AXColumnHeaderUIElements=[] AXColumnIndexRange={"len":1,"loc":0} AXRowHeaderUIElements=["AXCell Browser","AXCell Rendering Engine"] AXRowIndexRange={"len":1,"loc":1} ++++++AXCell AXTitle='Rendering Engine' AXColumnIndexRange={"len":1,"loc":0} AXRowIndexRange={"len":1,"loc":1}
++++++++AXStaticText AXValue='Rendering Engine' ++++++++AXStaticText AXValue='Rendering Engine'
++++++AXCell AXTitle='Blink' AXColumnHeaderUIElements=[] AXColumnIndexRange={"len":1,"loc":1} AXRowHeaderUIElements=["AXCell Browser","AXCell Rendering Engine"] AXRowIndexRange={"len":1,"loc":1} ++++++AXCell AXTitle='Blink' AXColumnIndexRange={"len":1,"loc":1} AXRowHeaderUIElements=["AXCell Rendering Engine"] AXRowIndexRange={"len":1,"loc":1}
++++++++AXStaticText AXValue='Blink' ++++++++AXStaticText AXValue='Blink'
++++++AXCell AXTitle='WebKit' AXColumnHeaderUIElements=[] AXColumnIndexRange={"len":1,"loc":2} AXRowHeaderUIElements=["AXCell Browser","AXCell Rendering Engine"] AXRowIndexRange={"len":1,"loc":1} ++++++AXCell AXTitle='WebKit' AXColumnIndexRange={"len":1,"loc":2} AXRowHeaderUIElements=["AXCell Rendering Engine"] AXRowIndexRange={"len":1,"loc":1}
++++++++AXStaticText AXValue='WebKit' ++++++++AXStaticText AXValue='WebKit'
++++AXColumn AXIndex='0' ++++AXColumn AXIndex='0'
++++AXColumn AXIndex='1' ++++AXColumn AXIndex='1'
++++AXColumn AXIndex='2' ++++AXColumn AXIndex='2'
++++AXGroup ++++AXGroup
\ No newline at end of file
AXWebArea AXWebArea
++AXTable AXColumnHeaderUIElements=["AXCell Firstname","AXCell Lastname"] AXHeader='AXGroup' AXRowHeaderUIElements=[] ++AXTable AXColumnHeaderUIElements=["AXCell Firstname","AXCell Lastname"] AXHeader='AXGroup'
++++AXRow AXIndex='0' ++++AXRow AXIndex='0'
++++++AXCell AXTitle='Firstname' AXColumnHeaderUIElements=["AXCell Firstname","AXCell Lastname"] AXColumnIndexRange={"len":1,"loc":0} AXRowHeaderUIElements=[] AXRowIndexRange={"len":1,"loc":0} ++++++AXCell AXTitle='Firstname' AXColumnIndexRange={"len":1,"loc":0} AXRowIndexRange={"len":1,"loc":0}
++++++++AXStaticText AXValue='Firstname' ++++++++AXStaticText AXValue='Firstname'
++++++AXCell AXTitle='Lastname' AXColumnHeaderUIElements=["AXCell Firstname","AXCell Lastname"] AXColumnIndexRange={"len":1,"loc":1} AXRowHeaderUIElements=[] AXRowIndexRange={"len":1,"loc":0} ++++++AXCell AXTitle='Lastname' AXColumnIndexRange={"len":1,"loc":1} AXRowIndexRange={"len":1,"loc":0}
++++++++AXStaticText AXValue='Lastname' ++++++++AXStaticText AXValue='Lastname'
++++AXRow AXIndex='1' ++++AXRow AXIndex='1'
++++++AXCell AXTitle='Jill' AXColumnHeaderUIElements=["AXCell Firstname","AXCell Lastname"] AXColumnIndexRange={"len":1,"loc":0} AXRowHeaderUIElements=[] AXRowIndexRange={"len":1,"loc":1} ++++++AXCell AXTitle='Jill' AXColumnHeaderUIElements=["AXCell Firstname"] AXColumnIndexRange={"len":1,"loc":0} AXRowIndexRange={"len":1,"loc":1}
++++++++AXStaticText AXValue='Jill' ++++++++AXStaticText AXValue='Jill'
++++++AXCell AXTitle='Smith' AXColumnHeaderUIElements=["AXCell Firstname","AXCell Lastname"] AXColumnIndexRange={"len":1,"loc":1} AXRowHeaderUIElements=[] AXRowIndexRange={"len":1,"loc":1} ++++++AXCell AXTitle='Smith' AXColumnHeaderUIElements=["AXCell Lastname"] AXColumnIndexRange={"len":1,"loc":1} AXRowIndexRange={"len":1,"loc":1}
++++++++AXStaticText AXValue='Smith' ++++++++AXStaticText AXValue='Smith'
++++AXColumn AXHeader='AXCell Firstname' AXIndex='0' ++++AXColumn AXHeader='AXCell Firstname' AXIndex='0'
++++AXColumn AXHeader='AXCell Lastname' AXIndex='1' ++++AXColumn AXHeader='AXCell Lastname' AXIndex='1'
++++AXGroup ++++AXGroup
\ No newline at end of file
AXWebArea AXTitle='Table example - th rowheader' AXWebArea AXTitle='Table example - th rowheader'
++AXTable AXColumnHeaderUIElements=[] AXHeader='AXGroup' AXRowHeaderUIElements=["AXCell Firstname","AXCell Lastname"] ++AXTable AXHeader='AXGroup' AXRowHeaderUIElements=["AXCell Firstname","AXCell Lastname"]
++++AXRow AXIndex='0' ++++AXRow AXIndex='0'
++++++AXCell AXTitle='Firstname' AXColumnHeaderUIElements=[] AXColumnIndexRange={"len":1,"loc":0} AXRowHeaderUIElements=["AXCell Firstname","AXCell Lastname"] AXRowIndexRange={"len":1,"loc":0} ++++++AXCell AXTitle='Firstname' AXColumnIndexRange={"len":1,"loc":0} AXRowIndexRange={"len":1,"loc":0}
++++++++AXStaticText AXValue='Firstname' ++++++++AXStaticText AXValue='Firstname'
++++++AXCell AXTitle='Jill' AXColumnHeaderUIElements=[] AXColumnIndexRange={"len":1,"loc":1} AXRowHeaderUIElements=["AXCell Firstname","AXCell Lastname"] AXRowIndexRange={"len":1,"loc":0} ++++++AXCell AXTitle='Jill' AXColumnIndexRange={"len":1,"loc":1} AXRowHeaderUIElements=["AXCell Firstname"] AXRowIndexRange={"len":1,"loc":0}
++++++++AXStaticText AXValue='Jill' ++++++++AXStaticText AXValue='Jill'
++++AXRow AXIndex='1' ++++AXRow AXIndex='1'
++++++AXCell AXTitle='Lastname' AXColumnHeaderUIElements=[] AXColumnIndexRange={"len":1,"loc":0} AXRowHeaderUIElements=["AXCell Firstname","AXCell Lastname"] AXRowIndexRange={"len":1,"loc":1} ++++++AXCell AXTitle='Lastname' AXColumnIndexRange={"len":1,"loc":0} AXRowIndexRange={"len":1,"loc":1}
++++++++AXStaticText AXValue='Lastname' ++++++++AXStaticText AXValue='Lastname'
++++++AXCell AXTitle='Smith' AXColumnHeaderUIElements=[] AXColumnIndexRange={"len":1,"loc":1} AXRowHeaderUIElements=["AXCell Firstname","AXCell Lastname"] AXRowIndexRange={"len":1,"loc":1} ++++++AXCell AXTitle='Smith' AXColumnIndexRange={"len":1,"loc":1} AXRowHeaderUIElements=["AXCell Lastname"] AXRowIndexRange={"len":1,"loc":1}
++++++++AXStaticText AXValue='Smith' ++++++++AXStaticText AXValue='Smith'
++++AXColumn AXIndex='0' ++++AXColumn AXIndex='0'
++++AXColumn AXIndex='1' ++++AXColumn AXIndex='1'
++++AXGroup ++++AXGroup
\ No newline at end of file
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