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); } }
ScopedStyleResolver* ScopedStyleTree::ensureScopedStyleResolver(const ContainerNode& scopingNode) { bool isNewEntry; ScopedStyleResolver* scopedStyleResolver = addScopedStyleResolver(scopingNode, isNewEntry); if (isNewEntry) setupScopedStylesTree(scopedStyleResolver); return scopedStyleResolver; }
void StyleEngine::createResolver() { // It is a programming error to attempt to resolve style on a Document // which is not in a frame. Code which hits this should have checked // Document::isActive() before calling into code which could get here. ASSERT(document().frame()); m_resolver = adoptPtr(new StyleResolver(*m_document)); addScopedStyleResolver(&m_document->ensureScopedStyleResolver()); appendActiveAuthorStyleSheets(); }
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; } } }