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 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()); } } }