inline Node* ComposedShadowTreeWalker::escapeFallbackContentElement(const Node* node, TraversalDirection direction) { ASSERT(node); if (node->parentNode() && isActiveInsertionPoint(node->parentNode())) return traverseSiblingOrBackToInsertionPoint(node->parentNode(), direction); return 0; }
Node* ComposedShadowTreeWalker::traverseSiblingOrBackToInsertionPoint(const Node* node, TraversalDirection direction) { ASSERT(node); ElementShadow* shadow = shadowOfParent(node); if (!shadow) return traverseSiblingInCurrentTree(node, direction); InsertionPoint* insertionPoint = shadow->insertionPointFor(node); if (!insertionPoint) return traverseSiblingInCurrentTree(node, direction); if (Node* next = (direction == TraversalDirectionForward ? insertionPoint->nextTo(node) : insertionPoint->previousTo(node))) return traverseNode(next, direction); return traverseSiblingOrBackToInsertionPoint(insertionPoint, direction); }
Node* ComposedShadowTreeWalker::traverseSiblingOrBackToInsertionPoint(const Node* node, TraversalDirection direction) { ASSERT(node); ElementShadow* shadow = shadowOfParent(node); if (!shadow) return traverseSiblingInCurrentTree(node, direction); InsertionPoint* insertionPoint = resolveReprojection(node); if (!insertionPoint) return traverseSiblingInCurrentTree(node, direction); if (Node* found = traverseDistributedNodes(direction == TraversalDirectionForward ? insertionPoint->nextTo(node) : insertionPoint->previousTo(node), insertionPoint, direction)) return found; return traverseSiblingOrBackToInsertionPoint(insertionPoint, direction); }
Node* ComposedShadowTreeWalker::traversePreviousSibling(const Node* node) { ASSERT(node); return traverseSiblingOrBackToInsertionPoint(node, TraversalDirectionBackward); }
void ComposedShadowTreeWalker::previousSibling() { assertPrecondition(); m_node = traverseSiblingOrBackToInsertionPoint(m_node, TraversalDirectionBackward); assertPostcondition(); }