diff --git a/src/core/browser_accessibility_qt.cpp b/src/core/browser_accessibility_qt.cpp index 405bafb947c130f375be4496a76ca078abf7c956..b5cd26f2ff451eca647eb3908386f66a019df450 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<QAccessibleValueInterface*>(this); break; } + case QAccessible::TableInterface: { + QAccessible::Role r = role(); + if (r == QAccessible::Table || + r == QAccessible::List || + r == QAccessible::Tree) + return static_cast<QAccessibleTableInterface*>(this); + break; + } + case QAccessible::TableCellInterface: { + QAccessible::Role r = role(); + if (r == QAccessible::Cell || + r == QAccessible::ListItem || + r == QAccessible::TreeItem) + return static_cast<QAccessibleTableCellInterface*>(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<int32>& cell_ids = GetIntListAttribute(ui::AX_ATTR_CELL_IDS); + DCHECK_EQ(columns * rows, static_cast<int>(cell_ids.size())); + + int cell_id = cell_ids[row * columns + column]; + BrowserAccessibility* cell = manager()->GetFromID(cell_id); + if (cell) { + QAccessibleInterface *iface = static_cast<BrowserAccessibilityQt*>(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<QAccessibleInterface *> BrowserAccessibilityQt::selectedCells() const +{ + return QList<QAccessibleInterface *>(); +} + +QList<int> BrowserAccessibilityQt::selectedColumns() const +{ + return QList<int>(); +} + +QList<int> BrowserAccessibilityQt::selectedRows() const +{ + return QList<int>(); +} + +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<QAccessibleInterface *> BrowserAccessibilityQt::columnHeaderCells() const +{ + return QList<QAccessibleInterface*>(); +} + +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<QAccessibleInterface *> BrowserAccessibilityQt::rowHeaderCells() const +{ + return QList<QAccessibleInterface*>(); +} + +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<BrowserAccessibilityQt*>(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 8dfffdcffbf8d013568ea4714af006234d5a974c..db190ffc4f271ce95f9a554970ab7b548f9269a3 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<QAccessibleInterface*> selectedCells() const Q_DECL_OVERRIDE; + virtual QList<int> selectedColumns() const Q_DECL_OVERRIDE; + virtual QList<int> 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<QAccessibleInterface*> columnHeaderCells() const Q_DECL_OVERRIDE; + virtual int columnIndex() const Q_DECL_OVERRIDE; + virtual int rowExtent() const Q_DECL_OVERRIDE; + virtual QList<QAccessibleInterface*> 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; }; }