static Node* traversePreviousSibling(const Node* node) { ASSERT(node); InsertionPoint* insertionPoint; if (nodeCanBeDistributed(node) && (insertionPoint = findInsertionPointOf(node))) { Node* found = findLastFromDistributedNode(insertionPoint->previousDistributedTo(node), insertionPoint); if (found) return found; return traversePreviousSibling(insertionPoint); } for (const Node* sibling = node->previousSibling(); sibling; sibling = sibling->previousSibling()) { if (Node* found = findLastEnteringInsertionPoints(sibling)) return found; } if (node->parentNode() && isActiveInsertionPoint(node->parentNode())) return traversePreviousSibling(node->parentNode()); return nullptr; }
Node* ComposedShadowTreeWalker::traverseSiblingOrBackToInsertionPoint(const Node* node, TraversalDirection direction) { ASSERT(node); if (!nodeCanBeDistributed(node)) return traverseSiblingInCurrentTree(node, direction); InsertionPoint* insertionPoint = resolveReprojection(node); if (!insertionPoint) return traverseSiblingInCurrentTree(node, direction); if (Node* found = traverseDistributedNodes(direction == TraversalDirectionForward ? insertionPoint->nextDistributedTo(node) : insertionPoint->previousDistributedTo(node), insertionPoint, direction)) return found; return traverseSiblingOrBackToInsertionPoint(insertionPoint, direction); }