Node* ComposedTreeWalker::traverseChild(const Node* node, TraversalDirection direction) const { ASSERT(node); ElementShadow* shadow = shadowFor(node); return shadow ? traverseLightChildren(shadow->youngestShadowRoot(), direction) : traverseLightChildren(node, direction); }
void ScopedStyleResolver::matchHostRules(ElementRuleCollector& collector, bool includeEmptyRules) { if (m_atHostRules.isEmpty() || !m_scopingNode->isElementNode()) return; ElementShadow* shadow = toElement(m_scopingNode)->shadow(); if (!shadow) return; collector.clearMatchedRules(); collector.matchedResult().ranges.lastAuthorRule = collector.matchedResult().matchedProperties.size() - 1; // FIXME(99827): https://bugs.webkit.org/show_bug.cgi?id=99827 // add a new flag to ElementShadow and cache whether any @host @-rules are // applied to the element or not. So we can quickly exit this method // by using the flag. ShadowRoot* shadowRoot = shadow->youngestShadowRoot(); for (; shadowRoot; shadowRoot = shadowRoot->olderShadowRoot()) if (!ScopeContentDistribution::hasShadowElement(shadowRoot)) break; // All shadow roots have <shadow>. if (!shadowRoot) shadowRoot = shadow->oldestShadowRoot(); StyleResolver::RuleRange ruleRange = collector.matchedResult().ranges.authorRuleRange(); collector.setBehaviorAtBoundary(static_cast<SelectorChecker::BehaviorAtBoundary>(SelectorChecker::DoesNotCrossBoundary | SelectorChecker::ScopeContainsLastMatchedElement)); for (; shadowRoot; shadowRoot = shadowRoot->youngerShadowRoot()) { if (RuleSet* ruleSet = atHostRuleSetFor(shadowRoot)) collector.collectMatchingRules(MatchRequest(ruleSet, includeEmptyRules, m_scopingNode), ruleRange); } collector.sortAndTransferMatchedRules(); }
Node* FlatTreeTraversal::traverseChild(const Node& node, TraversalDirection direction) { ElementShadow* shadow = shadowFor(node); if (shadow) { ShadowRoot& shadowRoot = shadow->youngestShadowRoot(); return resolveDistributionStartingAt(direction == TraversalDirectionForward ? shadowRoot.firstChild() : shadowRoot.lastChild(), direction); } return resolveDistributionStartingAt(direction == TraversalDirectionForward ? node.firstChild() : node.lastChild(), direction); }
Node* ComposedShadowTreeWalker::traverseChild(const Node* node, TraversalDirection direction) const { ASSERT(node); if (canCrossUpperBoundary()) { ElementShadow* shadow = shadowFor(node); return shadow ? traverseLightChildren(shadow->youngestShadowRoot(), direction) : traverseLightChildren(node, direction); } if (isShadowHost(node)) return 0; return traverseLightChildren(node, direction); }
void ScopedStyleTree::collectScopedResolversForHostedShadowTrees(const Element* element, Vector<ScopedStyleResolver*, 8>& resolvers) { ElementShadow* shadow = element->shadow(); if (!shadow) return; // Adding scoped resolver for active shadow roots for shadow host styling. for (ShadowRoot* shadowRoot = shadow->youngestShadowRoot(); shadowRoot; shadowRoot = shadowRoot->olderShadowRoot()) { if (shadowRoot->hasScopedHTMLStyleChild()) { if (ScopedStyleResolver* resolver = scopedStyleResolverFor(*shadowRoot)) resolvers.append(resolver); } if (!shadowRoot->containsShadowElements()) break; } }
void StyleScopeResolver::matchHostRules(const Element* element, Vector<RuleSet*>& matchedRules) { if (m_atHostRules.isEmpty()) return; ElementShadow* shadow = element->shadow(); if (!shadow) return; // FIXME(99827): https://bugs.webkit.org/show_bug.cgi?id=99827 // add a new flag to ElementShadow and cache whether any @host @-rules are // applied to the element or not. So we can quickly exit this method // by using the flag. for (ShadowRoot* shadowRoot = shadow->youngestShadowRoot(); shadowRoot; shadowRoot = shadowRoot->olderShadowRoot()) { if (RuleSet* ruleSet = atHostRuleSetFor(shadowRoot)) matchedRules.append(ruleSet); if (!shadowRoot->hasShadowInsertionPoint()) break; } }
bool StyleScopeResolver::styleSharingCandidateMatchesHostRules(const Element* element) { if (m_atHostRules.isEmpty()) return false; ElementShadow* shadow = element->shadow(); if (!shadow) return false; // FIXME(99827): https://bugs.webkit.org/show_bug.cgi?id=99827 // add a new flag to ElementShadow and cache whether any@host @-rules are // applied to the element or not. So we can avoid always traversing // shadow roots. for (ShadowRoot* shadowRoot = shadow->youngestShadowRoot(); shadowRoot; shadowRoot = shadowRoot->olderShadowRoot()) { if (atHostRuleSetFor(shadowRoot)) return true; if (!shadowRoot->hasShadowInsertionPoint()) break; } return false; }
void ChildFrameDisconnector::collectFrameOwners(ElementShadow& shadow) { for (ShadowRoot* root = &shadow.youngestShadowRoot(); root; root = root->olderShadowRoot()) collectFrameOwners(*root); }