nsAccessible* nsAccTreeWalker::NextChildInternal(bool aNoWalkUp) { if (!mState || !mState->content) return nsnull; if (!mState->childList) mState->childList = mState->content->GetChildren(mChildFilter); nsCOMPtr<nsIPresShell> presShell(do_QueryReferent(mWeakShell)); PRUint32 length = 0; if (mState->childList) mState->childList->GetLength(&length); while (mState->childIdx < length) { nsIContent* childNode = mState->childList->GetNodeAt(mState->childIdx); mState->childIdx++; bool isSubtreeHidden = false; nsAccessible* accessible = GetAccService()->GetOrCreateAccessible(childNode, presShell, mWeakShell, &isSubtreeHidden); if (accessible) return accessible; // Walk down into subtree to find accessibles. if (!isSubtreeHidden) { if (!PushState(childNode)) break; accessible = NextChildInternal(true); if (accessible) return accessible; } } // No more children, get back to the parent. PopState(); return aNoWalkUp ? nsnull : NextChildInternal(false); }
Accessible* nsAccTreeWalker::NextChildInternal(bool aNoWalkUp) { if (!mState || !mState->content) return nullptr; if (!mState->childList) mState->childList = mState->content->GetChildren(mChildFilter); PRUint32 length = 0; if (mState->childList) mState->childList->GetLength(&length); while (mState->childIdx < length) { nsIContent* childNode = mState->childList->GetNodeAt(mState->childIdx); mState->childIdx++; bool isSubtreeHidden = false; Accessible* accessible = mWalkCache ? mDoc->GetAccessible(childNode) : GetAccService()->GetOrCreateAccessible(childNode, mDoc, &isSubtreeHidden); if (accessible) return accessible; // Walk down into subtree to find accessibles. if (!isSubtreeHidden) { if (!PushState(childNode)) break; accessible = NextChildInternal(true); if (accessible) return accessible; } } // No more children, get back to the parent. PopState(); return aNoWalkUp ? nullptr : NextChildInternal(false); }