Index: ui/accessibility/platform/ax_platform_node_base.cc |
diff --git a/ui/accessibility/platform/ax_platform_node_base.cc b/ui/accessibility/platform/ax_platform_node_base.cc |
index 953172e18c681c07e615d10986c83de812b9f345..405375a75e68bc37e7789e87a39bf464eb3e7053 100644 |
--- a/ui/accessibility/platform/ax_platform_node_base.cc |
+++ b/ui/accessibility/platform/ax_platform_node_base.cc |
@@ -7,6 +7,7 @@ |
#include "base/strings/utf_string_conversions.h" |
#include "ui/accessibility/ax_action_data.h" |
#include "ui/accessibility/ax_node_data.h" |
+#include "ui/accessibility/ax_role_properties.h" |
#include "ui/accessibility/platform/ax_platform_node_delegate.h" |
#include "ui/gfx/geometry/rect_conversions.h" |
@@ -189,6 +190,22 @@ bool AXPlatformNodeBase::GetString16Attribute( |
return GetData().GetString16Attribute(attribute, value); |
} |
+bool AXPlatformNodeBase::HasIntListAttribute( |
+ ui::AXIntListAttribute attribute) const { |
+ return GetData().HasIntListAttribute(attribute); |
+} |
+ |
+const std::vector<int32_t>& AXPlatformNodeBase::GetIntListAttribute( |
+ ui::AXIntListAttribute attribute) const { |
+ return GetData().GetIntListAttribute(attribute); |
+} |
+ |
+bool AXPlatformNodeBase::GetIntListAttribute( |
+ ui::AXIntListAttribute attribute, |
+ std::vector<int32_t>* value) const { |
+ return GetData().GetIntListAttribute(attribute, value); |
+} |
+ |
AXPlatformNodeBase::AXPlatformNodeBase() { |
} |
@@ -288,4 +305,125 @@ bool AXPlatformNodeBase::IsRangeValueSupported() const { |
} |
} |
+AXPlatformNodeBase* AXPlatformNodeBase::GetTable() const { |
+ AXPlatformNodeBase* table = const_cast<AXPlatformNodeBase*>(this); |
+ while (table && !ui::IsTableLikeRole(table->GetData().role)) { |
+ gfx::NativeViewAccessible parent_accessible = table->GetParent(); |
+ AXPlatformNodeBase* parent = FromNativeViewAccessible(parent_accessible); |
+ |
+ table = parent; |
+ } |
+ return table; |
+} |
+ |
+AXPlatformNodeBase* AXPlatformNodeBase::GetTableCell(int index) const { |
+ DCHECK(delegate_); |
+ |
+ if (!ui::IsTableLikeRole(GetData().role) && |
+ !ui::IsCellOrTableHeaderRole(GetData().role)) |
+ return nullptr; |
+ |
+ AXPlatformNodeBase* table = GetTable(); |
+ if (!table) |
+ return nullptr; |
+ const std::vector<int32_t>& unique_cell_ids = |
+ table->GetIntListAttribute(ui::AX_ATTR_UNIQUE_CELL_IDS); |
+ if (index < 0 || index >= static_cast<int>(unique_cell_ids.size())) |
+ return nullptr; |
+ |
+ return static_cast<AXPlatformNodeBase*>( |
+ table->delegate_->GetFromNodeID(unique_cell_ids[index])); |
+} |
+ |
+AXPlatformNodeBase* AXPlatformNodeBase::GetTableCell(int row, |
+ int column) const { |
+ if (!ui::IsTableLikeRole(GetData().role) && |
+ !ui::IsCellOrTableHeaderRole(GetData().role)) |
+ return nullptr; |
+ |
+ if (row < 0 || row >= GetTableRowCount() || column < 0 || |
+ column >= GetTableColumnCount()) { |
+ return nullptr; |
+ } |
+ |
+ AXPlatformNodeBase* table = GetTable(); |
+ if (!table) |
+ return nullptr; |
+ |
+ // In contrast to unique cell IDs, these are duplicated whenever a cell spans |
+ // multiple columns or rows. |
+ const std::vector<int32_t>& cell_ids = |
+ table->GetIntListAttribute(ui::AX_ATTR_CELL_IDS); |
+ DCHECK_EQ(GetTableRowCount() * GetTableColumnCount(), |
+ static_cast<int>(cell_ids.size())); |
+ int position = row * GetTableColumnCount() + column; |
+ if (position < 0 || position >= static_cast<int>(cell_ids.size())) |
+ return nullptr; |
+ |
+ return static_cast<AXPlatformNodeBase*>( |
+ table->delegate_->GetFromNodeID(cell_ids[position])); |
+} |
+ |
+int AXPlatformNodeBase::GetTableCellIndex() const { |
+ if (!ui::IsCellOrTableHeaderRole(GetData().role)) |
+ return -1; |
+ |
+ AXPlatformNodeBase* table = GetTable(); |
+ if (!table) |
+ return -1; |
+ |
+ const std::vector<int32_t>& unique_cell_ids = |
+ table->GetIntListAttribute(ui::AX_ATTR_UNIQUE_CELL_IDS); |
+ auto iter = |
+ std::find(unique_cell_ids.begin(), unique_cell_ids.end(), GetData().id); |
+ if (iter == unique_cell_ids.end()) |
+ return -1; |
+ |
+ return std::distance(unique_cell_ids.begin(), iter); |
+} |
+ |
+int AXPlatformNodeBase::GetTableColumn() const { |
+ return GetIntAttribute(ui::AX_ATTR_TABLE_CELL_COLUMN_INDEX); |
+} |
+ |
+int AXPlatformNodeBase::GetTableColumnCount() const { |
+ AXPlatformNodeBase* table = GetTable(); |
+ if (!table) |
+ return 0; |
+ |
+ return table->GetIntAttribute(ui::AX_ATTR_TABLE_COLUMN_COUNT); |
+} |
+ |
+int AXPlatformNodeBase::GetTableColumnSpan() const { |
+ if (!ui::IsCellOrTableHeaderRole(GetData().role)) |
+ return 0; |
+ |
+ int column_span; |
+ if (GetIntAttribute(ui::AX_ATTR_TABLE_CELL_COLUMN_SPAN, &column_span)) |
+ return column_span; |
+ return 1; |
+} |
+ |
+int AXPlatformNodeBase::GetTableRow() const { |
+ return GetIntAttribute(ui::AX_ATTR_TABLE_CELL_ROW_INDEX); |
+} |
+ |
+int AXPlatformNodeBase::GetTableRowCount() const { |
+ AXPlatformNodeBase* table = GetTable(); |
+ if (!table) |
+ return 0; |
+ |
+ return table->GetIntAttribute(ui::AX_ATTR_TABLE_ROW_COUNT); |
+} |
+ |
+int AXPlatformNodeBase::GetTableRowSpan() const { |
+ if (!ui::IsCellOrTableHeaderRole(GetData().role)) |
+ return 0; |
+ |
+ int row_span; |
+ if (GetIntAttribute(ui::AX_ATTR_TABLE_CELL_ROW_SPAN, &row_span)) |
+ return row_span; |
+ return 1; |
+} |
+ |
} // namespace ui |