void ScopedStyleTree::setupScopedStylesTree(ScopedStyleResolver* target) { ASSERT(target); const ContainerNode& scopingNode = target->scopingNode(); // Since StyleResolver creates RuleSets according to styles' document // order, a parent of the given ScopedRuleData has been already // prepared. for (const ContainerNode* node = scopingNode.parentOrShadowHostNode(); node; node = node->parentOrShadowHostNode()) { if (ScopedStyleResolver* scopedResolver = scopedStyleResolverFor(*node)) { target->setParent(scopedResolver); break; } if (node->isDocumentNode()) { bool dummy; ScopedStyleResolver* scopedResolver = addScopedStyleResolver(*node, dummy); target->setParent(scopedResolver); setupScopedStylesTree(scopedResolver); break; } } if (m_buildInDocumentOrder) return; // Reparent all nodes whose scoping node is contained by target's one. for (HashMap<const ContainerNode*, OwnPtr<ScopedStyleResolver> >::iterator it = m_authorStyles.begin(); it != m_authorStyles.end(); ++it) { if (it->value == target) continue; ASSERT(it->key->inDocument()); if (it->value->parent() == target->parent() && scopingNode.containsIncludingShadowDOM(it->key)) it->value->setParent(target); } }
inline ScopedStyleResolver* ScopedStyleTree::enclosingScopedStyleResolverFor(const ContainerNode* scopingNode) { for (; scopingNode; scopingNode = scopingNode->parentOrShadowHostNode()) { if (ScopedStyleResolver* scopedStyleResolver = scopedStyleResolverFor(scopingNode)) return scopedStyleResolver; } return 0; }
void ScopedStyleTree::pushStyleCache(const ContainerNode* scopingNode, const ContainerNode* parent) { if (m_authorStyles.isEmpty()) return; if (!cacheIsValid(parent)) { resolveStyleCache(scopingNode); return; } ScopedStyleResolver* scopedResolver = scopedStyleResolverFor(scopingNode); if (scopedResolver) m_cache.scopedResolver = scopedResolver; m_cache.nodeForScopedStyles = scopingNode; }
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 ScopedStyleTree::setupScopedStylesTree(ScopedStyleResolver* target) { ASSERT(target); ASSERT(target->scopingNode()); // Since StyleResolver creates RuleSets according to styles' document // order, a parent of the given ScopedRuleData has been already // prepared. const ContainerNode* e = target->scopingNode()->parentOrShadowHostNode(); for (; e; e = e->parentOrShadowHostNode()) { if (ScopedStyleResolver* scopedResolver = scopedStyleResolverFor(e)) { target->setParent(scopedResolver); break; } if (e->isDocumentNode()) { bool dummy; ScopedStyleResolver* scopedResolver = addScopedStyleResolver(e, dummy); target->setParent(scopedResolver); setupScopedStylesTree(scopedResolver); break; } } }