// TODO(hayato): This may return a wrong result for a node which is not in a // document flat tree. See FlatTreeTraversalTest's redistribution test for details. Node* FlatTreeTraversal::traverseSiblings(const Node& node, TraversalDirection direction) { if (node.isChildOfV1ShadowHost()) return traverseSiblingsForV1HostChild(node, direction); if (shadowWhereNodeCanBeDistributed(node)) return traverseSiblingsForV0Distribution(node, direction); if (Node* found = resolveDistributionStartingAt(direction == TraversalDirectionForward ? node.nextSibling() : node.previousSibling(), direction)) return found; if (!node.isInV0ShadowTree()) return nullptr; // For v0 older shadow tree if (node.parentNode() && node.parentNode()->isShadowRoot()) { ShadowRoot* parentShadowRoot = toShadowRoot(node.parentNode()); if (!parentShadowRoot->isYoungest()) { HTMLShadowElement* assignedInsertionPoint = parentShadowRoot->shadowInsertionPointOfYoungerShadowRoot(); DCHECK(assignedInsertionPoint); return traverseSiblings(*assignedInsertionPoint, direction); } } return nullptr; }
ContainerNode* FlatTreeTraversal::traverseParentOrHost(const Node& node) { ContainerNode* parent = node.parentNode(); if (!parent) return nullptr; if (!parent->isShadowRoot()) return parent; ShadowRoot* shadowRoot = toShadowRoot(parent); DCHECK(!shadowRoot->shadowInsertionPointOfYoungerShadowRoot()); if (!shadowRoot->isYoungest()) return nullptr; return &shadowRoot->host(); }
Node* ComposedShadowTreeWalker::traverseBackToYoungerShadowRoot(const Node* node, TraversalDirection direction) { ASSERT(node); if (node->parentNode() && node->parentNode()->isShadowRoot()) { ShadowRoot* parentShadowRoot = toShadowRoot(node->parentNode()); if (!parentShadowRoot->isYoungest()) { InsertionPoint* assignedInsertionPoint = parentShadowRoot->insertionPoint(); ASSERT(assignedInsertionPoint); return traverseSiblingInCurrentTree(assignedInsertionPoint, direction); } } return 0; }
inline Node* ComposedTreeWalker::traverseParentOrHost(const Node* node) const { Node* parent = node->parentNode(); if (!parent) return 0; if (!parent->isShadowRoot()) return parent; ShadowRoot* shadowRoot = toShadowRoot(parent); ASSERT(!shadowRoot->shadowInsertionPointOfYoungerShadowRoot()); if (!shadowRoot->isYoungest()) return 0; return shadowRoot->host(); }