void AccessibilityTableCell::columnHeaders(AccessibilityChildrenVector& headers) { AccessibilityTable* parent = parentTable(); if (!parent) return; // Choose columnHeaders as the place where the "headers" attribute is reported. ariaElementsFromAttribute(headers, headersAttr); // If the headers attribute returned valid values, then do not further search for column headers. if (!headers.isEmpty()) return; std::pair<unsigned, unsigned> rowRange; rowIndexRange(rowRange); std::pair<unsigned, unsigned> colRange; columnIndexRange(colRange); for (unsigned row = 0; row < rowRange.first; row++) { AccessibilityTableCell* tableCell = parent->cellForColumnAndRow(colRange.first, row); if (!tableCell || tableCell == this || headers.contains(tableCell)) continue; std::pair<unsigned, unsigned> childRowRange; tableCell->rowIndexRange(childRowRange); const AtomicString& scope = tableCell->getAttribute(scopeAttr); if (scope == "col" || tableCell->isTableHeaderCell()) headers.append(tableCell); else if (scope == "colgroup" && isTableCellInSameColGroup(tableCell)) headers.append(tableCell); } }
void AccessibilityObject::accessibleObjectsWithAccessibilitySearchPredicate(AccessibilitySearchPredicate* axSearchPredicate, AccessibilityChildrenVector& axResults) { ASSERT(AXObjectCache::accessibilityEnabled()); if (!axSearchPredicate) return; AccessibilityChildrenVector axChildren; if (axSearchPredicate->axContainerObject) axChildren.append(axSearchPredicate->axContainerObject); bool isSearchDirectionNext = (axSearchPredicate->axSearchDirection == SearchDirectionNext); bool didFindAXStartObject = (!axSearchPredicate->axStartObject); // FIXME: Iterate the AccessibilityObject cache creating and adding objects if nessesary. while (!axChildren.isEmpty() && axResults.size() < axSearchPredicate->resultsLimit) { AccessibilityObject* axChild = axChildren.last().get(); axChildren.removeLast(); if (didFindAXStartObject) { if (isAccessibilityObjectSearchMatch(axChild, axSearchPredicate) && isAccessibilityTextSearchMatch(axChild, axSearchPredicate)) axResults.append(axChild); } else if (axChild == axSearchPredicate->axStartObject) didFindAXStartObject = true; AccessibilityChildrenVector axGrandchildren = axChild->children(); unsigned axGrandchildrenSize = axChild->children().size(); for (unsigned i = (isSearchDirectionNext) ? axGrandchildrenSize : 0; (isSearchDirectionNext) ? i > 0 : i < axGrandchildrenSize; (isSearchDirectionNext) ? i-- : i++) // FIXME: Handle attachments. axChildren.append(axGrandchildren.at((isSearchDirectionNext) ? i - 1 : i).get()); } }
void AccessibilityListBox::selectedChildren(AccessibilityChildrenVector& result) { ASSERT(result.isEmpty()); if (!hasChildren()) addChildren(); for (const auto& child : m_children) { if (toAccessibilityListBoxOption(child.get())->isSelected()) result.append(child.get()); } }
void AccessibilityListBox::visibleChildren(AccessibilityChildrenVector& result) { ASSERT(result.isEmpty()); if (!hasChildren()) addChildren(); unsigned length = m_children.size(); for (unsigned i = 0; i < length; i++) { if (toRenderListBox(m_renderer)->listIndexIsVisible(i)) result.append(m_children[i]); } }
void AccessibilityListBox::selectedChildren(AccessibilityChildrenVector& result) { ASSERT(result.isEmpty()); if (!hasChildren()) addChildren(); unsigned length = m_children.size(); for (unsigned i = 0; i < length; i++) { if (static_cast<AccessibilityListBoxOption*>(m_children[i].get())->isSelected()) result.append(m_children[i]); } }
void AccessibilityObject::findMatchingObjects(AccessibilitySearchCriteria* criteria, AccessibilityChildrenVector& results) { ASSERT(criteria); if (!criteria) return; AccessibilityObject* startObject = criteria->startObject; AccessibilityChildrenVector searchStack; searchStack.append(this); bool isForward = criteria->searchDirection == SearchDirectionNext; bool didFindStartObject = !criteria->startObject; // FIXME: Iterate the AccessibilityObject cache creating and adding objects if nessesary. while (!searchStack.isEmpty()) { AccessibilityObject* searchObject = searchStack.last().get(); searchStack.removeLast(); if (didFindStartObject) { if (isAccessibilityObjectSearchMatch(searchObject, criteria) && isAccessibilityTextSearchMatch(searchObject, criteria)) { results.append(searchObject); // Enough results were found to stop searching. if (results.size() >= criteria->resultsLimit) break; } } else if (searchObject == startObject) didFindStartObject = true; AccessibilityChildrenVector searchChildren = searchObject->children(); size_t childrenSize = searchChildren.size(); for (size_t i = isForward ? childrenSize : 0; isForward ? i > 0 : i < childrenSize; isForward ? i-- : i++) { // FIXME: Handle attachments. searchStack.append(searchChildren.at(isForward ? i - 1 : i).get()); } } }