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

Unified Diff: Source/core/dom/DocumentStyleSheetCollection.cpp

Issue 14604003: When there are no more stylesheets schedule the recalc async (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Refactor based on review Created 7 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: Source/core/dom/DocumentStyleSheetCollection.cpp
diff --git a/Source/core/dom/DocumentStyleSheetCollection.cpp b/Source/core/dom/DocumentStyleSheetCollection.cpp
index 4735ab200294a4817fdd4094c5eec8d4ab3a72e1..75cf467b03e3fe78bcccb52730429fa2c541285c 100644
--- a/Source/core/dom/DocumentStyleSheetCollection.cpp
+++ b/Source/core/dom/DocumentStyleSheetCollection.cpp
@@ -351,11 +351,10 @@ void DocumentStyleSheetCollection::collectActiveStyleSheets(Vector<RefPtr<StyleS
}
}
-void DocumentStyleSheetCollection::analyzeStyleSheetChange(UpdateFlag updateFlag, const Vector<RefPtr<CSSStyleSheet> >& newStylesheets, StyleResolverUpdateType& styleResolverUpdateType, bool& requiresFullStyleRecalc)
+DocumentStyleSheetCollection::UpdateAction DocumentStyleSheetCollection::analyzeStyleSheetChange(StyleResolverUpdateMode updateMode, const Vector<RefPtr<CSSStyleSheet> >& newStylesheets, bool& requiresFullStyleRecalc)
{
- styleResolverUpdateType = Reconstruct;
- requiresFullStyleRecalc = true;
-
+ // FIXME: Updating the active loading sheet state shouldn't be in this method.
+
// 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();
@@ -365,29 +364,29 @@ void DocumentStyleSheetCollection::analyzeStyleSheetChange(UpdateFlag updateFlag
}
if (m_hadActiveLoadingStylesheet && !hasActiveLoadingStylesheet) {
m_hadActiveLoadingStylesheet = false;
- return;
+ return Reconstruct;
}
m_hadActiveLoadingStylesheet = hasActiveLoadingStylesheet;
- if (updateFlag != OptimizedUpdate)
- return;
+ if (updateMode != OptimizedStyleUpdate)
+ return Reconstruct;
if (!m_document->styleResolverIfExists())
- return;
+ return Reconstruct;
// Find out which stylesheets are new.
unsigned oldStylesheetCount = m_activeAuthorStyleSheets.size();
if (newStylesheetCount < oldStylesheetCount)
- return;
+ return Reconstruct;
Vector<StyleSheetContents*> addedSheets;
unsigned newIndex = 0;
for (unsigned oldIndex = 0; oldIndex < oldStylesheetCount; ++oldIndex) {
if (newIndex >= newStylesheetCount)
- return;
+ return Reconstruct;
while (m_activeAuthorStyleSheets[oldIndex] != newStylesheets[newIndex]) {
addedSheets.append(newStylesheets[newIndex]->contents());
++newIndex;
if (newIndex == newStylesheetCount)
- return;
+ return Reconstruct;
}
++newIndex;
}
@@ -396,18 +395,23 @@ void DocumentStyleSheetCollection::analyzeStyleSheetChange(UpdateFlag updateFlag
addedSheets.append(newStylesheets[newIndex]->contents());
++newIndex;
}
+
+ // If we don't have a body yet it's unlikely there's enough nodes to warrant
+ // doing analysis. If there's place holder styles we do a full recalc to turn
+ // them into real styles.
+ //
+ // FIXME: It's not clear why analysis isn't safe for placeholder styles.
+ if (m_document->body() && !m_document->hasNodesWithPlaceholderStyle()) {
+ StyleInvalidationAnalysis invalidationAnalysis(addedSheets);
+ if (!invalidationAnalysis.dirtiesAllStyle()) {
+ invalidationAnalysis.invalidateStyle(m_document);
+ requiresFullStyleRecalc = false;
+ }
+ }
+
// 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.
- styleResolverUpdateType = hasInsertions ? Reset : Additive;
-
- // 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 (!m_document->body() || m_document->hasNodesWithPlaceholderStyle())
- return;
- StyleInvalidationAnalysis invalidationAnalysis(addedSheets);
- if (invalidationAnalysis.dirtiesAllStyle())
- return;
- invalidationAnalysis.invalidateStyle(m_document);
- requiresFullStyleRecalc = false;
+ return hasInsertions ? Reset : Append;
}
static bool styleSheetsUseRemUnits(const Vector<RefPtr<CSSStyleSheet> >& sheets)
@@ -438,7 +442,7 @@ static void collectActiveCSSStyleSheetsFromSeamlessParents(Vector<RefPtr<CSSStyl
sheets.append(seamlessParentIFrame->document()->styleSheetCollection()->activeAuthorStyleSheets());
}
-bool DocumentStyleSheetCollection::updateActiveStyleSheets(UpdateFlag updateFlag)
+bool DocumentStyleSheetCollection::updateActiveStyleSheets(StyleResolverUpdateMode updateMode)
{
if (m_document->inStyleRecalc()) {
// SVG <use> element may manage to invalidate style selector in the middle of a style recalc.
@@ -447,8 +451,8 @@ bool DocumentStyleSheetCollection::updateActiveStyleSheets(UpdateFlag updateFlag
m_needsUpdateActiveStylesheetsOnStyleRecalc = true;
m_document->scheduleForcedStyleRecalc();
return false;
-
}
+
if (!m_document->renderer() || !m_document->attached())
return false;
@@ -461,23 +465,24 @@ bool DocumentStyleSheetCollection::updateActiveStyleSheets(UpdateFlag updateFlag
collectActiveCSSStyleSheetsFromSeamlessParents(activeCSSStyleSheets, m_document);
filterEnabledCSSStyleSheets(activeCSSStyleSheets, activeStyleSheets);
- StyleResolverUpdateType styleResolverUpdateType;
- bool requiresFullStyleRecalc;
- analyzeStyleSheetChange(updateFlag, activeCSSStyleSheets, styleResolverUpdateType, requiresFullStyleRecalc);
+ bool requiresFullStyleRecalc = true;
+ UpdateAction action = analyzeStyleSheetChange(updateMode, activeCSSStyleSheets, requiresFullStyleRecalc);
- if (styleResolverUpdateType == Reconstruct)
+ switch (action) {
+ case Reconstruct:
m_document->clearStyleResolver();
- else {
- StyleResolver* styleResolver = m_document->styleResolver();
- if (styleResolverUpdateType == Reset) {
- styleResolver->ruleSets().resetAuthorStyle();
- styleResolver->appendAuthorStyleSheets(0, activeCSSStyleSheets);
- } else {
- ASSERT(styleResolverUpdateType == Additive);
- styleResolver->appendAuthorStyleSheets(m_activeAuthorStyleSheets.size(), activeCSSStyleSheets);
- }
+ break;
+ case Reset:
+ m_document->styleResolver()->ruleSets().resetAuthorStyle();
+ m_document->styleResolver()->appendAuthorStyleSheets(0, activeCSSStyleSheets);
resetCSSFeatureFlags();
+ break;
+ case Append:
+ m_document->styleResolver()->appendAuthorStyleSheets(m_activeAuthorStyleSheets.size(), activeCSSStyleSheets);
+ resetCSSFeatureFlags();
+ break;
}
+
m_activeAuthorStyleSheets.swap(activeCSSStyleSheets);
InspectorInstrumentation::activeStyleSheetsUpdated(m_document, activeStyleSheets);
m_styleSheetsForStyleSheetList.swap(activeStyleSheets);

Powered by Google App Engine
This is Rietveld 408576698