Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(199)

Unified Diff: third_party/WebKit/Source/core/dom/TreeScopeStyleSheetCollection.cpp

Issue 1913833002: Current work-in-progress crbug.com/567021 (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: More assert fixes Created 4 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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)

Powered by Google App Engine
This is Rietveld 408576698