From 7f825cfa69cec97d14c875e43959c46996a716b9 Mon Sep 17 00:00:00 2001 From: Frederik Gladhorn Date: Fri, 8 Aug 2014 10:50:13 +0200 Subject: Accessibility: Table interface This is used to represent tables, lists and trees to screen readers. There are some properties still not implemented, notably selection which is also not available in blink. Change-Id: I57053881445e39a4967a1aabd85a594271402f63 Reviewed-by: Zeno Albisser Reviewed-by: Andras Becsi Reviewed-by: Frederik Gladhorn --- src/core/browser_accessibility_qt.cpp | 196 ++++++++++++++++++++++++++++++++++ src/core/browser_accessibility_qt.h | 36 +++++++ 2 files changed, 232 insertions(+) diff --git a/src/core/browser_accessibility_qt.cpp b/src/core/browser_accessibility_qt.cpp index 405bafb94..b5cd26f2f 100644 --- a/src/core/browser_accessibility_qt.cpp +++ b/src/core/browser_accessibility_qt.cpp @@ -173,6 +173,22 @@ void *BrowserAccessibilityQt::interface_cast(QAccessible::InterfaceType type) return static_cast(this); break; } + case QAccessible::TableInterface: { + QAccessible::Role r = role(); + if (r == QAccessible::Table || + r == QAccessible::List || + r == QAccessible::Tree) + return static_cast(this); + break; + } + case QAccessible::TableCellInterface: { + QAccessible::Role r = role(); + if (r == QAccessible::Cell || + r == QAccessible::ListItem || + r == QAccessible::TreeItem) + return static_cast(this); + break; + } default: break; } @@ -701,4 +717,184 @@ QVariant BrowserAccessibilityQt::minimumStepSize() const return QVariant(); } +QAccessibleInterface *BrowserAccessibilityQt::cellAt(int row, int column) const +{ + int columns = 0; + int rows = 0; + if (!GetIntAttribute(ui::AX_ATTR_TABLE_COLUMN_COUNT, &columns) || + !GetIntAttribute(ui::AX_ATTR_TABLE_ROW_COUNT, &rows) || + columns <= 0 || + rows <= 0) { + return 0; + } + + if (row < 0 || row >= rows || column < 0 || column >= columns) + return 0; + + const std::vector& cell_ids = GetIntListAttribute(ui::AX_ATTR_CELL_IDS); + DCHECK_EQ(columns * rows, static_cast(cell_ids.size())); + + int cell_id = cell_ids[row * columns + column]; + BrowserAccessibility* cell = manager()->GetFromID(cell_id); + if (cell) { + QAccessibleInterface *iface = static_cast(cell); + return iface; + } + + return 0; +} + +QAccessibleInterface *BrowserAccessibilityQt::caption() const +{ + return 0; +} + +QAccessibleInterface *BrowserAccessibilityQt::summary() const +{ + return 0; +} + +QString BrowserAccessibilityQt::columnDescription(int column) const +{ + return QString(); +} + +QString BrowserAccessibilityQt::rowDescription(int row) const +{ + return QString(); +} + +int BrowserAccessibilityQt::columnCount() const +{ + int columns = 0; + if (GetIntAttribute(ui::AX_ATTR_TABLE_COLUMN_COUNT, &columns)) + return columns; + + return 0; +} + +int BrowserAccessibilityQt::rowCount() const +{ + int rows = 0; + if (GetIntAttribute(ui::AX_ATTR_TABLE_ROW_COUNT, &rows)) + return rows; + return 0; +} + +int BrowserAccessibilityQt::selectedCellCount() const +{ + return 0; +} + +int BrowserAccessibilityQt::selectedColumnCount() const +{ + return 0; +} + +int BrowserAccessibilityQt::selectedRowCount() const +{ + return 0; +} + +QList BrowserAccessibilityQt::selectedCells() const +{ + return QList(); +} + +QList BrowserAccessibilityQt::selectedColumns() const +{ + return QList(); +} + +QList BrowserAccessibilityQt::selectedRows() const +{ + return QList(); +} + +bool BrowserAccessibilityQt::isColumnSelected(int /*column*/) const +{ + return false; +} + +bool BrowserAccessibilityQt::isRowSelected(int /*row*/) const +{ + return false; +} + +bool BrowserAccessibilityQt::selectRow(int /*row*/) +{ + return false; +} + +bool BrowserAccessibilityQt::selectColumn(int /*column*/) +{ + return false; +} + +bool BrowserAccessibilityQt::unselectRow(int /*row*/) +{ + return false; +} + +bool BrowserAccessibilityQt::unselectColumn(int /*column*/) +{ + return false; +} + +int BrowserAccessibilityQt::columnExtent() const +{ + return 1; +} + +QList BrowserAccessibilityQt::columnHeaderCells() const +{ + return QList(); +} + +int BrowserAccessibilityQt::columnIndex() const +{ + int column = 0; + if (GetIntAttribute(ui::AX_ATTR_TABLE_CELL_COLUMN_INDEX, &column)) + return column; + return 0; +} + +int BrowserAccessibilityQt::rowExtent() const +{ + return 1; +} + +QList BrowserAccessibilityQt::rowHeaderCells() const +{ + return QList(); +} + +int BrowserAccessibilityQt::rowIndex() const +{ + int row = 0; + if (GetIntAttribute(ui::AX_ATTR_TABLE_CELL_ROW_INDEX, &row)) + return row; + return 0; +} + +bool BrowserAccessibilityQt::isSelected() const +{ + return false; +} + +QAccessibleInterface *BrowserAccessibilityQt::table() const +{ + BrowserAccessibility* find_table = GetParent(); + while (find_table && find_table->GetRole() != ui::AX_ROLE_TABLE) + find_table = find_table->GetParent(); + if (!find_table) + return 0; + return static_cast(find_table); +} + +void BrowserAccessibilityQt::modelChange(QAccessibleTableModelChangeEvent *) +{ + +} + } // namespace content diff --git a/src/core/browser_accessibility_qt.h b/src/core/browser_accessibility_qt.h index 8dfffdcff..db190ffc4 100644 --- a/src/core/browser_accessibility_qt.h +++ b/src/core/browser_accessibility_qt.h @@ -48,6 +48,8 @@ class BrowserAccessibilityQt , public QAccessibleActionInterface , public QAccessibleTextInterface , public QAccessibleValueInterface + , public QAccessibleTableInterface + , public QAccessibleTableCellInterface { public: BrowserAccessibilityQt(); @@ -105,6 +107,40 @@ public: QVariant maximumValue() const Q_DECL_OVERRIDE; QVariant minimumValue() const Q_DECL_OVERRIDE; QVariant minimumStepSize() const Q_DECL_OVERRIDE; + + // QAccessibleTableInterface + virtual QAccessibleInterface *cellAt(int row, int column) const Q_DECL_OVERRIDE; + virtual QAccessibleInterface *caption() const Q_DECL_OVERRIDE; + virtual QAccessibleInterface *summary() const Q_DECL_OVERRIDE; + virtual QString columnDescription(int column) const Q_DECL_OVERRIDE; + virtual QString rowDescription(int row) const Q_DECL_OVERRIDE; + virtual int columnCount() const Q_DECL_OVERRIDE; + virtual int rowCount() const Q_DECL_OVERRIDE; + // selection + virtual int selectedCellCount() const Q_DECL_OVERRIDE; + virtual int selectedColumnCount() const Q_DECL_OVERRIDE; + virtual int selectedRowCount() const Q_DECL_OVERRIDE; + virtual QList selectedCells() const Q_DECL_OVERRIDE; + virtual QList selectedColumns() const Q_DECL_OVERRIDE; + virtual QList selectedRows() const Q_DECL_OVERRIDE; + virtual bool isColumnSelected(int column) const Q_DECL_OVERRIDE; + virtual bool isRowSelected(int row) const Q_DECL_OVERRIDE; + virtual bool selectRow(int row) Q_DECL_OVERRIDE; + virtual bool selectColumn(int column) Q_DECL_OVERRIDE; + virtual bool unselectRow(int row) Q_DECL_OVERRIDE; + virtual bool unselectColumn(int column) Q_DECL_OVERRIDE; + + // QAccessibleTableCellInterface + virtual int columnExtent() const Q_DECL_OVERRIDE; + virtual QList columnHeaderCells() const Q_DECL_OVERRIDE; + virtual int columnIndex() const Q_DECL_OVERRIDE; + virtual int rowExtent() const Q_DECL_OVERRIDE; + virtual QList rowHeaderCells() const Q_DECL_OVERRIDE; + virtual int rowIndex() const Q_DECL_OVERRIDE; + virtual bool isSelected() const Q_DECL_OVERRIDE; + virtual QAccessibleInterface* table() const Q_DECL_OVERRIDE; + + virtual void modelChange(QAccessibleTableModelChangeEvent *event) Q_DECL_OVERRIDE; }; } -- cgit v1.2.3