AccessibilityARIAGridCell.cpp [plain text]
#include "config.h"
#include "AccessibilityARIAGridCell.h"
#include "AccessibilityObject.h"
#include "AccessibilityTable.h"
#include "AccessibilityTableRow.h"
#include "HTMLNames.h"
namespace WebCore {
using namespace HTMLNames;
AccessibilityARIAGridCell::AccessibilityARIAGridCell(RenderObject* renderer)
: AccessibilityTableCell(renderer)
{
}
AccessibilityARIAGridCell::~AccessibilityARIAGridCell()
{
}
Ref<AccessibilityARIAGridCell> AccessibilityARIAGridCell::create(RenderObject* renderer)
{
return adoptRef(*new AccessibilityARIAGridCell(renderer));
}
AccessibilityTable* AccessibilityARIAGridCell::parentTable() const
{
for (AccessibilityObject* parent = parentObjectUnignored(); parent; parent = parent->parentObjectUnignored()) {
if (is<AccessibilityTable>(*parent) && downcast<AccessibilityTable>(*parent).isExposableThroughAccessibility())
return downcast<AccessibilityTable>(parent);
}
return nullptr;
}
void AccessibilityARIAGridCell::rowIndexRange(std::pair<unsigned, unsigned>& rowRange) const
{
AccessibilityObject* parent = parentObjectUnignored();
if (!parent)
return;
if (is<AccessibilityTableRow>(*parent)) {
rowRange.first = downcast<AccessibilityTableRow>(*parent).rowIndex();
} else if (is<AccessibilityTable>(*parent) && downcast<AccessibilityTable>(*parent).isExposableThroughAccessibility()) {
unsigned columnCount = downcast<AccessibilityTable>(*parent).columnCount();
if (!columnCount)
return;
const auto& siblings = parent->children();
unsigned childrenSize = siblings.size();
for (unsigned k = 0; k < childrenSize; ++k) {
if (siblings[k].get() == this) {
rowRange.first = k / columnCount;
break;
}
}
}
rowRange.second = ariaRowSpanWithRowIndex(rowRange.first);
}
unsigned AccessibilityARIAGridCell::ariaRowSpanWithRowIndex(unsigned rowIndex) const
{
unsigned rowSpan = AccessibilityTableCell::ariaRowSpan();
AccessibilityObject* parent = parentObjectUnignored();
if (!parent)
return 1;
if (!rowSpan) {
rowSpan = 1;
if (AccessibilityObject* parentRowGroup = this->parentRowGroup()) {
if (is<AccessibilityTable>(*parentRowGroup))
rowSpan = downcast<AccessibilityTable>(*parentRowGroup).rowCount() - rowIndex;
else if (is<AccessibilityTableRow>(*parent)) {
const auto& siblings = parentRowGroup->children();
unsigned rowCount = siblings.size();
for (unsigned k = 0; k < rowCount; ++k) {
if (siblings[k].get() == parent) {
rowSpan = rowCount - k;
break;
}
}
}
}
}
return rowSpan;
}
void AccessibilityARIAGridCell::columnIndexRange(std::pair<unsigned, unsigned>& columnRange) const
{
AccessibilityObject* parent = parentObjectUnignored();
if (!parent)
return;
if (!is<AccessibilityTableRow>(*parent)
&& !(is<AccessibilityTable>(*parent) && downcast<AccessibilityTable>(*parent).isExposableThroughAccessibility()))
return;
const AccessibilityChildrenVector& siblings = parent->children();
unsigned childrenSize = siblings.size();
for (unsigned k = 0; k < childrenSize; ++k) {
if (siblings[k].get() == this) {
columnRange.first = k;
break;
}
}
columnRange.second = ariaColumnSpan();
}
AccessibilityObject* AccessibilityARIAGridCell::parentRowGroup() const
{
for (AccessibilityObject* parent = parentObject(); parent; parent = parent->parentObject()) {
if (parent->hasTagName(theadTag) || parent->hasTagName(tbodyTag) || parent->hasTagName(tfootTag) || parent->roleValue() == RowGroupRole)
return parent;
}
return parentTable();
}
}