diff options
Diffstat (limited to 'Source/WebCore/accessibility/AccessibilityARIAGrid.cpp')
-rw-r--r-- | Source/WebCore/accessibility/AccessibilityARIAGrid.cpp | 68 |
1 files changed, 43 insertions, 25 deletions
diff --git a/Source/WebCore/accessibility/AccessibilityARIAGrid.cpp b/Source/WebCore/accessibility/AccessibilityARIAGrid.cpp index acb837070..a0b95760c 100644 --- a/Source/WebCore/accessibility/AccessibilityARIAGrid.cpp +++ b/Source/WebCore/accessibility/AccessibilityARIAGrid.cpp @@ -10,7 +10,7 @@ * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. - * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of + * 3. Neither the name of Apple Inc. ("Apple") nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * @@ -30,11 +30,13 @@ #include "AccessibilityARIAGrid.h" #include "AXObjectCache.h" +#include "AccessibilityARIAGridRow.h" #include "AccessibilityTableCell.h" #include "AccessibilityTableColumn.h" #include "AccessibilityTableHeaderContainer.h" #include "AccessibilityTableRow.h" #include "RenderObject.h" +#include "RenderTableSection.h" namespace WebCore { @@ -47,36 +49,36 @@ AccessibilityARIAGrid::~AccessibilityARIAGrid() { } -PassRefPtr<AccessibilityARIAGrid> AccessibilityARIAGrid::create(RenderObject* renderer) +Ref<AccessibilityARIAGrid> AccessibilityARIAGrid::create(RenderObject* renderer) { - return adoptRef(new AccessibilityARIAGrid(renderer)); + return adoptRef(*new AccessibilityARIAGrid(renderer)); } bool AccessibilityARIAGrid::addTableCellChild(AccessibilityObject* child, HashSet<AccessibilityObject*>& appendedRows, unsigned& columnCount) { - if (!child || !child->isTableRow() || child->ariaRoleAttribute() != RowRole) + if (!child || (!is<AccessibilityTableRow>(*child) && !is<AccessibilityARIAGridRow>(*child))) return false; - AccessibilityTableRow* row = toAccessibilityTableRow(child); - if (appendedRows.contains(row)) + auto& row = downcast<AccessibilityTableRow>(*child); + if (appendedRows.contains(&row)) return false; // store the maximum number of columns - unsigned rowCellCount = row->children().size(); + unsigned rowCellCount = row.children().size(); if (rowCellCount > columnCount) columnCount = rowCellCount; - row->setRowIndex((int)m_rows.size()); - m_rows.append(row); + row.setRowIndex((int)m_rows.size()); + m_rows.append(&row); // Try adding the row if it's not ignoring accessibility, // otherwise add its children (the cells) as the grid's children. - if (!row->accessibilityIsIgnored()) - m_children.append(row); + if (!row.accessibilityIsIgnored()) + m_children.append(&row); else - m_children.appendVector(row->children()); + m_children.appendVector(row.children()); - appendedRows.add(row); + appendedRows.add(&row); return true; } @@ -85,9 +87,9 @@ void AccessibilityARIAGrid::addRowDescendant(AccessibilityObject* rowChild, Hash if (!rowChild) return; - if (!rowChild->isTableRow()) { + if (!rowChild->isTableRow() || !rowChild->node()) { // Although a "grid" should have rows as its direct descendants, if this is not a table row, - // dive deeper into the descendants to try to find a valid row. + // or this row is anonymous, dive deeper into the descendants to try to find a valid row. for (const auto& child : rowChild->children()) addRowDescendant(child.get(), appendedRows, columnCount); } else @@ -98,7 +100,7 @@ void AccessibilityARIAGrid::addChildren() { ASSERT(!m_haveChildren); - if (!isAccessibilityTable()) { + if (!isExposableThroughAccessibility()) { AccessibilityRenderObject::addChildren(); return; } @@ -109,20 +111,36 @@ void AccessibilityARIAGrid::addChildren() AXObjectCache* axCache = m_renderer->document().axObjectCache(); - // add only rows that are labeled as aria rows + // Add the children rows but be mindful in case there are footer sections in this table. HashSet<AccessibilityObject*> appendedRows; unsigned columnCount = 0; - for (RefPtr<AccessibilityObject> child = firstChild(); child; child = child->nextSibling()) - addRowDescendant(child.get(), appendedRows, columnCount); + AccessibilityChildrenVector footerSections; + for (RefPtr<AccessibilityObject> child = firstChild(); child; child = child->nextSibling()) { + bool footerSection = false; + if (RenderObject* childRenderer = child->renderer()) { + if (is<RenderTableSection>(*childRenderer)) { + RenderTableSection& childSection = downcast<RenderTableSection>(*childRenderer); + if (&childSection == childSection.table()->footer()) { + footerSections.append(child); + footerSection = true; + } + } + } + if (!footerSection) + addRowDescendant(child.get(), appendedRows, columnCount); + } + + for (const auto& footerSection : footerSections) + addRowDescendant(footerSection.get(), appendedRows, columnCount); // make the columns based on the number of columns in the first body for (unsigned i = 0; i < columnCount; ++i) { - AccessibilityTableColumn* column = toAccessibilityTableColumn(axCache->getOrCreate(ColumnRole)); - column->setColumnIndex((int)i); - column->setParent(this); - m_columns.append(column); - if (!column->accessibilityIsIgnored()) - m_children.append(column); + auto& column = downcast<AccessibilityTableColumn>(*axCache->getOrCreate(ColumnRole)); + column.setColumnIndex(static_cast<int>(i)); + column.setParent(this); + m_columns.append(&column); + if (!column.accessibilityIsIgnored()) + m_children.append(&column); } AccessibilityObject* headerContainerObject = headerContainer(); |