Index: Source/core/dom/Document.cpp |
diff --git a/Source/core/dom/Document.cpp b/Source/core/dom/Document.cpp |
index b2ba85404dafcb1612f45d95646ee0625d1d4edf..7517e92423a45924f19f06f7e4a3c536eb99360d 100644 |
--- a/Source/core/dom/Document.cpp |
+++ b/Source/core/dom/Document.cpp |
@@ -385,6 +385,7 @@ Document::Document(const DocumentInit& initializer, DocumentClassFlags documentC |
, m_lastStyleResolverAccessTime(0) |
, m_didCalculateStyleResolver(false) |
, m_ignorePendingStylesheets(false) |
+ , m_evaluateMediaQueriesOnStyleRecalc(false) |
, m_needsNotifyRemoveAllPendingStylesheet(false) |
, m_hasNodesWithPlaceholderStyle(false) |
, m_pendingSheetLayout(NoLayoutWithPendingSheets) |
@@ -1692,6 +1693,11 @@ void Document::recalcStyle(StyleRecalcChange change) |
TRACE_EVENT0("webkit", "Document::recalcStyle"); |
TRACE_EVENT_SCOPED_SAMPLING_STATE("Blink", "RecalcStyle"); |
+ if (m_evaluateMediaQueriesOnStyleRecalc) { |
+ m_evaluateMediaQueriesOnStyleRecalc = false; |
+ evaluateMediaQueryList(); |
+ } |
+ |
updateDistributionIfNeeded(); |
// FIXME: We should update style on our ancestor chain before proceeding (especially for seamless), |
@@ -2828,7 +2834,7 @@ void Document::didRemoveAllPendingStylesheet() |
{ |
m_needsNotifyRemoveAllPendingStylesheet = false; |
- styleResolverChanged(RecalcStyleImmediately, AnalyzedStyleUpdate); |
+ styleResolverChanged(RecalcStyleDeferred, AnalyzedStyleUpdate); |
executeScriptsWaitingForResourcesIfNeeded(); |
if (m_gotoAnchorNeededAfterStylesheetsLoad && view()) |
@@ -3303,34 +3309,21 @@ void Document::styleResolverChanged(StyleResolverUpdateType updateType, StyleRes |
bool needsRecalc = m_styleSheetCollections->updateActiveStyleSheets(updateMode); |
- if (updateType >= RecalcStyleDeferred) { |
- setNeedsStyleRecalc(); |
- return; |
- } |
- |
if (didLayoutWithPendingStylesheets() && !m_styleSheetCollections->hasPendingSheets()) { |
+ // We need to manually repaint because we avoid doing all repaints in layout or style |
+ // recalc while sheets are still loading to avoid FOUC. |
m_pendingSheetLayout = IgnoreLayoutWithPendingSheets; |
- if (renderer()) |
- renderView()->repaintViewAndCompositedLayers(); |
+ renderView()->repaintViewAndCompositedLayers(); |
} |
if (!needsRecalc) |
return; |
- // This recalcStyle initiates a new recalc cycle. We need to bracket it to |
- // make sure animations get the correct update time |
- { |
- AnimationUpdateBlock animationUpdateBlock(m_frame ? m_frame->animation() : 0); |
- recalcStyle(Force); |
- } |
- |
- if (renderer()) { |
- renderer()->setNeedsLayoutAndPrefWidthsRecalc(); |
- if (view()) |
- view()->scheduleRelayout(); |
- } |
+ m_evaluateMediaQueriesOnStyleRecalc = true; |
+ setNeedsStyleRecalc(); |
- evaluateMediaQueryList(); |
+ if (updateType == RecalcStyleImmediately) |
+ updateStyleIfNeeded(); |
} |
void Document::notifySeamlessChildDocumentsOfStylesheetUpdate() const |