ScopedStyleResolver* ScopedStyleResolver::parent() const { for (TreeScope* scope = treeScope().parentTreeScope(); scope; scope = scope->parentTreeScope()) { if (ScopedStyleResolver* resolver = scope->scopedStyleResolver()) return resolver; } return nullptr; }
void StyleEngine::updateActiveStyleSheets(StyleResolverUpdateMode updateMode) { ASSERT(isMaster()); ASSERT(!document().inStyleRecalc()); if (!document().isActive()) return; if (shouldUpdateDocumentStyleSheetCollection(updateMode)) documentStyleSheetCollection()->updateActiveStyleSheets(this, updateMode); if (shouldUpdateShadowTreeStyleSheetCollection(updateMode)) { TreeScopeSet treeScopes = updateMode == FullStyleUpdate ? m_activeTreeScopes : m_dirtyTreeScopes; HashSet<TreeScope*> treeScopesRemoved; for (TreeScopeSet::iterator it = treeScopes.begin(); it != treeScopes.end(); ++it) { TreeScope* treeScope = *it; ASSERT(treeScope != m_document); ShadowTreeStyleSheetCollection* collection = static_cast<ShadowTreeStyleSheetCollection*>(styleSheetCollectionFor(*treeScope)); ASSERT(collection); collection->updateActiveStyleSheets(this, updateMode); if (!collection->hasStyleSheetCandidateNodes()) { treeScopesRemoved.add(treeScope); // When removing TreeScope from ActiveTreeScopes, // its resolver should be destroyed by invoking resetAuthorStyle. ASSERT(!treeScope->scopedStyleResolver()); } } m_activeTreeScopes.removeAll(treeScopesRemoved); } InspectorInstrumentation::activeStyleSheetsUpdated(m_document); m_usesRemUnits = documentStyleSheetCollection()->usesRemUnits(); m_dirtyTreeScopes.clear(); m_documentScopeDirty = false; }
void ScopedStyleResolver::keyframesRulesAdded(const TreeScope& treeScope) { // Called when @keyframes rules are about to be added/removed from a // TreeScope. @keyframes rules may apply to animations on elements in the // same TreeScope as the stylesheet, or the host element in the parent // TreeScope if the TreeScope is a shadow tree. ScopedStyleResolver* resolver = treeScope.scopedStyleResolver(); ScopedStyleResolver* parentResolver = treeScope.parentTreeScope() ? treeScope.parentTreeScope()->scopedStyleResolver() : nullptr; bool hadUnresolvedKeyframes = false; if (resolver && resolver->m_hasUnresolvedKeyframesRule) { resolver->m_hasUnresolvedKeyframesRule = false; hadUnresolvedKeyframes = true; } if (parentResolver && parentResolver->m_hasUnresolvedKeyframesRule) { parentResolver->m_hasUnresolvedKeyframesRule = false; hadUnresolvedKeyframes = true; } if (hadUnresolvedKeyframes) { // If an animation ended up not being started because no @keyframes // rules were found for the animation-name, we need to recalculate style // for the elements in the scope, including its shadow host if // applicable. invalidationRootForTreeScope(treeScope).setNeedsStyleRecalc( SubtreeStyleChange, StyleChangeReasonForTracing::create( StyleChangeReason::StyleSheetChange)); return; } // If we have animations running, added/removed @keyframes may affect these. treeScope.document().timeline().invalidateKeyframeEffects(treeScope); }