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 d1a185bbf8b3af07f744df0a7516d64a3bb4c7c7..ab41a6aca6ca3924263a403493c1e49b729336fe 100644 |
--- a/third_party/WebKit/Source/core/dom/TreeScopeStyleSheetCollection.cpp |
+++ b/third_party/WebKit/Source/core/dom/TreeScopeStyleSheetCollection.cpp |
@@ -26,10 +26,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" |
@@ -40,131 +40,32 @@ namespace blink { |
TreeScopeStyleSheetCollection::TreeScopeStyleSheetCollection(TreeScope& treeScope) |
: m_treeScope(treeScope) |
- , m_hadActiveLoadingStylesheet(false) |
{ |
} |
void TreeScopeStyleSheetCollection::addStyleSheetCandidateNode(Node* node) |
{ |
- if (!node->inShadowIncludingDocument()) |
- 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; |
-} |
- |
-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; |
- unsigned newStylesheetCount = newStyleSheets.size(); |
- for (unsigned i = 0; i < newStylesheetCount; ++i) { |
- if (newStyleSheets[i]->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 (unsigned i = 0; i < sheets.size(); ++i) { |
- DCHECK(sheets[i]); |
- if (sheets[i]->hasFontFaceRule()) { |
- // FIXME: We don't need this for styles in shadow tree. |
- sheets[i]->findFontFaceRules(fontFaceRules); |
- hasFontFaceRule = true; |
- } |
- } |
- return hasFontFaceRule; |
+ if (node->inShadowIncludingDocument()) |
+ m_styleSheetCandidateNodes.add(node); |
} |
-void TreeScopeStyleSheetCollection::analyzeStyleSheetChange(StyleResolverUpdateMode updateMode, const StyleSheetCollection& newCollection, StyleSheetChange& change) |
-{ |
- if (activeLoadingStyleSheetLoaded(newCollection.activeAuthorStyleSheets())) |
- return; |
- |
- if (updateMode != AnalyzedStyleUpdate) |
- return; |
- |
- // Find out which stylesheets are new. |
- HeapVector<Member<StyleSheetContents>> addedSheets; |
- if (m_activeAuthorStyleSheets.size() <= newCollection.activeAuthorStyleSheets().size()) { |
- change.styleResolverUpdateType = compareStyleSheets(m_activeAuthorStyleSheets, newCollection.activeAuthorStyleSheets(), addedSheets); |
- } else { |
- StyleResolverUpdateType updateType = compareStyleSheets(newCollection.activeAuthorStyleSheets(), 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() |
+bool TreeScopeStyleSheetCollection::mediaQueryAffectingValueChanged() |
{ |
+ bool needsActiveStyleUpdate = false; |
for (size_t i = 0; i < m_activeAuthorStyleSheets.size(); ++i) { |
- StyleSheetContents* contents = m_activeAuthorStyleSheets[i]->contents(); |
+ if (m_activeAuthorStyleSheets[i].first->mediaQueries()) |
+ needsActiveStyleUpdate = true; |
+ StyleSheetContents* contents = m_activeAuthorStyleSheets[i].first->contents(); |
if (contents->hasMediaQueries()) |
contents->clearRuleSet(); |
} |
+ return needsActiveStyleUpdate; |
+} |
+ |
+void TreeScopeStyleSheetCollection::applyActiveStyleSheetChanges(StyleSheetCollection& newCollection) |
+{ |
+ applyRuleSetChanges(document().styleEngine(), treeScope(), activeAuthorStyleSheets(), newCollection.activeAuthorStyleSheets()); |
+ newCollection.swap(*this); |
} |
DEFINE_TRACE(TreeScopeStyleSheetCollection) |