Index: third_party/WebKit/Source/core/dom/TreeScopeStyleSheetCollection.cpp |
diff --git a/third_party/WebKit/Source/core/dom/TreeScopeStyleSheetCollection.cpp b/third_party/WebKit/Source/core/dom/TreeScopeStyleSheetCollection.cpp |
index a64330698a590fa62ffe8da209d914a5272f575c..918824798ed10537f1849443e14cd12541843d22 100644 |
--- a/third_party/WebKit/Source/core/dom/TreeScopeStyleSheetCollection.cpp |
+++ b/third_party/WebKit/Source/core/dom/TreeScopeStyleSheetCollection.cpp |
@@ -28,10 +28,10 @@ |
#include "core/dom/TreeScopeStyleSheetCollection.h" |
+#include "core/css/ActiveStyleSheets.h" |
#include "core/css/CSSStyleSheet.h" |
#include "core/css/StyleRuleImport.h" |
#include "core/css/StyleSheetContents.h" |
-#include "core/css/invalidation/StyleSheetInvalidationAnalysis.h" |
#include "core/css/resolver/StyleResolver.h" |
#include "core/dom/Element.h" |
#include "core/dom/StyleEngine.h" |
@@ -42,139 +42,31 @@ namespace blink { |
TreeScopeStyleSheetCollection::TreeScopeStyleSheetCollection( |
TreeScope& treeScope) |
- : m_treeScope(treeScope), m_hadActiveLoadingStylesheet(false) {} |
+ : m_treeScope(treeScope) {} |
void TreeScopeStyleSheetCollection::addStyleSheetCandidateNode(Node& node) { |
- if (!node.isConnected()) |
- return; |
- |
- m_styleSheetCandidateNodes.add(&node); |
-} |
- |
-TreeScopeStyleSheetCollection::StyleResolverUpdateType |
-TreeScopeStyleSheetCollection::compareStyleSheets( |
- const HeapVector<Member<CSSStyleSheet>>& oldStyleSheets, |
- const HeapVector<Member<CSSStyleSheet>>& newStylesheets, |
- HeapVector<Member<StyleSheetContents>>& addedSheets) { |
- unsigned newStyleSheetCount = newStylesheets.size(); |
- unsigned oldStyleSheetCount = oldStyleSheets.size(); |
- DCHECK_GE(newStyleSheetCount, oldStyleSheetCount); |
- |
- if (!newStyleSheetCount) |
- return Reconstruct; |
- |
- unsigned newIndex = 0; |
- for (unsigned oldIndex = 0; oldIndex < oldStyleSheetCount; ++oldIndex) { |
- while (oldStyleSheets[oldIndex] != newStylesheets[newIndex]) { |
- addedSheets.append(newStylesheets[newIndex]->contents()); |
- if (++newIndex == newStyleSheetCount) |
- return Reconstruct; |
- } |
- if (++newIndex == newStyleSheetCount) |
- return Reconstruct; |
- } |
- bool hasInsertions = !addedSheets.isEmpty(); |
- while (newIndex < newStyleSheetCount) { |
- addedSheets.append(newStylesheets[newIndex]->contents()); |
- ++newIndex; |
- } |
- // If all new sheets were added at the end of the list we can just add them to |
- // existing StyleResolver. If there were insertions we need to re-add all the |
- // stylesheets so rules are ordered correctly. |
- return hasInsertions ? Reset : Additive; |
+ if (node.isConnected()) |
+ m_styleSheetCandidateNodes.add(&node); |
} |
-bool TreeScopeStyleSheetCollection::activeLoadingStyleSheetLoaded( |
- const HeapVector<Member<CSSStyleSheet>>& newStyleSheets) { |
- // StyleSheets of <style> elements that @import stylesheets are active but |
- // loading. We need to trigger a full recalc when such loads are done. |
- bool hasActiveLoadingStylesheet = false; |
- for (const auto& sheet : newStyleSheets) { |
- if (sheet->isLoading()) |
- hasActiveLoadingStylesheet = true; |
- } |
- if (m_hadActiveLoadingStylesheet && !hasActiveLoadingStylesheet) { |
- m_hadActiveLoadingStylesheet = false; |
- return true; |
- } |
- m_hadActiveLoadingStylesheet = hasActiveLoadingStylesheet; |
- return false; |
-} |
- |
-static bool findFontFaceRulesFromStyleSheetContents( |
- const HeapVector<Member<StyleSheetContents>>& sheets, |
- HeapVector<Member<const StyleRuleFontFace>>& fontFaceRules) { |
- bool hasFontFaceRule = false; |
- |
- for (const auto& sheet : sheets) { |
- DCHECK(sheet); |
- if (sheet->hasFontFaceRule()) { |
- // FIXME: We don't need this for styles in shadow tree. |
- sheet->findFontFaceRules(fontFaceRules); |
- hasFontFaceRule = true; |
- } |
- } |
- return hasFontFaceRule; |
-} |
- |
-void TreeScopeStyleSheetCollection::analyzeStyleSheetChange( |
- StyleResolverUpdateMode updateMode, |
- const HeapVector<Member<CSSStyleSheet>>& newActiveAuthorStyleSheets, |
- StyleSheetChange& change) { |
- if (activeLoadingStyleSheetLoaded(newActiveAuthorStyleSheets)) |
- return; |
- |
- if (updateMode != AnalyzedStyleUpdate) |
- return; |
- |
- // Find out which stylesheets are new. |
- HeapVector<Member<StyleSheetContents>> addedSheets; |
- if (m_activeAuthorStyleSheets.size() <= newActiveAuthorStyleSheets.size()) { |
- change.styleResolverUpdateType = compareStyleSheets( |
- m_activeAuthorStyleSheets, newActiveAuthorStyleSheets, addedSheets); |
- } else { |
- StyleResolverUpdateType updateType = compareStyleSheets( |
- newActiveAuthorStyleSheets, m_activeAuthorStyleSheets, addedSheets); |
- if (updateType != Additive) { |
- change.styleResolverUpdateType = updateType; |
- } else { |
- change.styleResolverUpdateType = Reset; |
- // If @font-face is removed, needs full style recalc. |
- if (findFontFaceRulesFromStyleSheetContents(addedSheets, |
- change.fontFaceRulesToRemove)) |
- return; |
- } |
- } |
- |
- // FIXME: If styleResolverUpdateType is Reconstruct, we should return early |
- // here since we need to recalc the whole document. It's wrong to use |
- // StyleSheetInvalidationAnalysis since it only looks at the addedSheets. |
- |
- // No point in doing the analysis work if we're just going to recalc the whole |
- // document anyways. This needs to be done after the compareStyleSheets calls |
- // above to ensure we don't throw away the StyleResolver if we don't need to. |
- if (document().hasPendingForcedStyleRecalc()) |
- return; |
- |
- // If we are already parsing the body and so may have significant amount of |
- // elements, put some effort into trying to avoid style recalcs. |
- if (!document().body() || document().hasNodesWithPlaceholderStyle()) |
- return; |
- StyleSheetInvalidationAnalysis invalidationAnalysis(*m_treeScope, |
- addedSheets); |
- if (invalidationAnalysis.dirtiesAllStyle()) |
- return; |
- invalidationAnalysis.invalidateStyle(); |
- change.requiresFullStyleRecalc = false; |
- return; |
-} |
- |
-void TreeScopeStyleSheetCollection::clearMediaQueryRuleSetStyleSheets() { |
- for (const auto& sheet : m_activeAuthorStyleSheets) { |
- StyleSheetContents* contents = sheet->contents(); |
+bool TreeScopeStyleSheetCollection::mediaQueryAffectingValueChanged() { |
+ bool needsActiveStyleUpdate = false; |
+ for (const auto& activeSheet : m_activeAuthorStyleSheets) { |
+ if (activeSheet.first->mediaQueries()) |
+ needsActiveStyleUpdate = true; |
+ StyleSheetContents* contents = activeSheet.first->contents(); |
if (contents->hasMediaQueries()) |
contents->clearRuleSet(); |
} |
+ return needsActiveStyleUpdate; |
+} |
+ |
+void TreeScopeStyleSheetCollection::applyActiveStyleSheetChanges( |
+ StyleSheetCollection& newCollection) { |
+ document().styleEngine().applyRuleSetChanges( |
+ treeScope(), activeAuthorStyleSheets(), |
+ newCollection.activeAuthorStyleSheets()); |
+ newCollection.swap(*this); |
} |
DEFINE_TRACE(TreeScopeStyleSheetCollection) { |