void HTMLStyleElement::registerWithScopingNode() { // Note: We cannot rely on the 'scoped' element already being present when this method is invoked. // Therefore we cannot rely on scoped()! ASSERT(!m_isRegisteredWithScopingNode); ASSERT(inDocument()); if (m_isRegisteredWithScopingNode) return; if (!ContextEnabledFeatures::styleScopedEnabled(document())) return; ContainerNode* scope = parentNode(); if (!scope) return; if (!scope->isElementNode() && !scope->isShadowRoot()) { // DocumentFragment nodes should never be inDocument, // <style> should not be a child of Document, PI or some such. ASSERT_NOT_REACHED(); return; } scope->registerScopedHTMLStyleChild(); scope->setNeedsStyleRecalc(); if (inDocument() && !document()->parsing() && document()->renderer()) document()->styleResolverChanged(DeferRecalcStyle); m_isRegisteredWithScopingNode = true; }
void HTMLStyleElement::registerWithScopingNode(bool scoped) { // Note: We cannot rely on the 'scoped' element already being present when this method is invoked. // Therefore we cannot rely on scoped()! ASSERT(m_scopedStyleRegistrationState == NotRegistered); ASSERT(inDocument()); if (m_scopedStyleRegistrationState != NotRegistered) return; ContainerNode* scope = scoped ? parentNode() : containingShadowRoot(); if (!scope) return; if (!scope->isElementNode() && !scope->isShadowRoot()) { // DocumentFragment nodes should never be inDocument, // <style> should not be a child of Document, PI or some such. ASSERT_NOT_REACHED(); return; } scope->registerScopedHTMLStyleChild(); if (scope->isShadowRoot()) scope->shadowHost()->setNeedsStyleRecalc(); else scope->setNeedsStyleRecalc(); if (inDocument() && !document()->parsing() && document()->renderer()) document()->styleResolverChanged(DeferRecalcStyle); m_scopedStyleRegistrationState = scoped ? RegisteredAsScoped : RegisteredInShadowRoot; }
void HTMLStyleElement::unregisterWithScopingNode() { // Note: We cannot rely on the 'scoped' element still being present when this method is invoked. // Therefore we cannot rely on scoped()! ASSERT(m_isRegisteredWithScopingNode || !RuntimeEnabledFeatures::styleScopedEnabled()); if (!m_isRegisteredWithScopingNode) return; if (!RuntimeEnabledFeatures::styleScopedEnabled()) return; ContainerNode* scope = parentNode(); ASSERT(scope); if (scope) { ASSERT(scope->hasScopedHTMLStyleChild()); scope->unregisterScopedHTMLStyleChild(); scope->setNeedsStyleRecalc(); } if (inDocument() && !document()->parsing() && document()->renderer()) document()->styleResolverChanged(DeferRecalcStyle); m_isRegisteredWithScopingNode = false; }
void StyleSheetInvalidationAnalysis::invalidateStyle() { ASSERT(!m_dirtiesAllStyle); if (m_treeScope->rootNode().isShadowRoot()) { ContainerNode* shadowHost = toShadowRoot(m_treeScope->rootNode()).host(); shadowHost->setNeedsStyleRecalc(SubtreeStyleChange, StyleChangeReasonForTracing::create(StyleChangeReason::StyleSheetChange)); return; } if (m_idScopes.isEmpty() && m_classScopes.isEmpty()) return; Element* element = ElementTraversal::firstWithin(m_treeScope->document()); while (element) { if (elementMatchesSelectorScopes(element, m_idScopes, m_classScopes)) { element->setNeedsStyleRecalc(SubtreeStyleChange, StyleChangeReasonForTracing::create(StyleChangeReason::StyleSheetChange)); // The whole subtree is now invalidated, we can skip to the next sibling. element = ElementTraversal::nextSkippingChildren(*element); continue; } element = ElementTraversal::next(*element); } }