Index: Source/core/dom/Document.cpp |
diff --git a/Source/core/dom/Document.cpp b/Source/core/dom/Document.cpp |
index dc167e613183440e9272369d25018eacdcc1eb27..4726a9b4ef859e1b09abed5b6106ef5c315a5ec7 100644 |
--- a/Source/core/dom/Document.cpp |
+++ b/Source/core/dom/Document.cpp |
@@ -1521,7 +1521,7 @@ PassRefPtr<TreeWalker> Document::createTreeWalker(Node* root, unsigned whatToSho |
return TreeWalker::create(root, whatToShow, filter); |
} |
-bool Document::shouldCallRecalcStyleForDocument() |
+bool Document::needsRenderTreeUpdate() const |
{ |
if (!isActive() || !view()) |
return false; |
@@ -1538,7 +1538,7 @@ bool Document::shouldCallRecalcStyleForDocument() |
return false; |
} |
-bool Document::shouldScheduleStyleRecalc() |
+bool Document::shouldScheduleRenderTreeUpdate() const |
{ |
if (!isActive()) |
return false; |
@@ -1554,12 +1554,12 @@ bool Document::shouldScheduleStyleRecalc() |
return true; |
} |
-void Document::scheduleStyleRecalc() |
+void Document::scheduleRenderTreeUpdate() |
{ |
- if (!shouldScheduleStyleRecalc()) |
+ if (!shouldScheduleRenderTreeUpdate()) |
return; |
- ASSERT(shouldCallRecalcStyleForDocument()); |
+ ASSERT(needsRenderTreeUpdate()); |
page()->animator().scheduleVisualUpdate(); |
m_lifecycle.advanceTo(DocumentLifecycle::StyleRecalcPending); |
@@ -1706,18 +1706,11 @@ void Document::inheritHtmlAndBodyElementStyles(StyleRecalcChange change) |
} |
} |
-void Document::updateStyleIfNeeded() |
-{ |
- updateStyle(NoChange); |
-} |
- |
-// FIXME: We need a better name than updateStyleIfNeeded. It's performing style invalidation, |
-// style recalc, distribution and <use> shadow tree creation. |
-void Document::updateStyle(StyleRecalcChange change) |
+void Document::updateRenderTree(StyleRecalcChange change) |
{ |
ASSERT(isMainThread()); |
- if (change != Force && !shouldCallRecalcStyleForDocument()) |
+ if (change != Force && !needsRenderTreeUpdate()) |
return; |
if (inStyleRecalc()) |
@@ -1732,8 +1725,8 @@ void Document::updateStyle(StyleRecalcChange change) |
// Script can run below in WidgetUpdates, so protect the LocalFrame. |
RefPtr<LocalFrame> protect(m_frame); |
- TRACE_EVENT0("webkit", "Document::recalcStyle"); |
- TRACE_EVENT_SCOPED_SAMPLING_STATE("Blink", "RecalcStyle"); |
+ TRACE_EVENT0("webkit", "Document::updateRenderTree"); |
+ TRACE_EVENT_SCOPED_SAMPLING_STATE("Blink", "UpdateRenderTree"); |
InspectorInstrumentationCookie cookie = InspectorInstrumentation::willRecalculateStyle(this); |
@@ -1741,10 +1734,8 @@ void Document::updateStyle(StyleRecalcChange change) |
updateUseShadowTreesIfNeeded(); |
updateStyleInvalidationIfNeeded(); |
- if (m_evaluateMediaQueriesOnStyleRecalc) { |
- m_evaluateMediaQueriesOnStyleRecalc = false; |
- evaluateMediaQueryList(); |
- } |
+ // This executes media query listeners which runs script. |
+ evaluateMediaQueryListIfNeeded(); |
// FIXME: We should update style on our ancestor chain before proceeding |
// however doing so currently causes several tests to crash, as LocalFrame::setDocument calls Document::attach |
@@ -1756,64 +1747,7 @@ void Document::updateStyle(StyleRecalcChange change) |
if (m_elemSheet && m_elemSheet->contents()->usesRemUnits()) |
m_styleEngine->setUsesRemUnit(true); |
- { |
- RenderWidget::UpdateSuspendScope suspendWidgetHierarchyUpdates; |
- m_lifecycle.advanceTo(DocumentLifecycle::InStyleRecalc); |
- |
- if (styleChangeType() >= SubtreeStyleChange) |
- change = Force; |
- |
- // FIXME: Cannot access the ensureStyleResolver() before calling styleForDocument below because |
- // apparently the StyleResolver's constructor has side effects. We should fix it. |
- // See printing/setPrinting.html, printing/width-overflow.html though they only fail on |
- // mac when accessing the resolver by what appears to be a viewport size difference. |
- |
- if (change == Force) { |
- m_hasNodesWithPlaceholderStyle = false; |
- RefPtr<RenderStyle> documentStyle = StyleResolver::styleForDocument(*this, m_styleEngine->fontSelector()); |
- StyleRecalcChange localChange = RenderStyle::compare(documentStyle.get(), renderView()->style()); |
- if (localChange != NoChange) |
- renderView()->setStyle(documentStyle.release()); |
- } |
- |
- clearNeedsStyleRecalc(); |
- |
- // Uncomment to enable printing of statistics about style sharing and the matched property cache. |
- // Optionally pass StyleResolver::ReportSlowStats to print numbers that require crawling the |
- // entire DOM (where collecting them is very slow). |
- // FIXME: Expose this as a runtime flag. |
- // ensureStyleResolver().enableStats(/*StyleResolver::ReportSlowStats*/); |
- |
- if (StyleResolverStats* stats = ensureStyleResolver().stats()) |
- stats->reset(); |
- |
- if (Element* documentElement = this->documentElement()) { |
- inheritHtmlAndBodyElementStyles(change); |
- dirtyElementsForLayerUpdate(); |
- if (documentElement->shouldCallRecalcStyle(change)) |
- documentElement->recalcStyle(change); |
- while (dirtyElementsForLayerUpdate()) |
- documentElement->recalcStyle(NoChange); |
- } |
- |
- ensureStyleResolver().printStats(); |
- |
- view()->updateCompositingLayersAfterStyleChange(); |
- |
- clearChildNeedsStyleRecalc(); |
- |
- if (m_styleEngine->hasResolver()) { |
- // Pseudo element removal and similar may only work with these flags still set. Reset them after the style recalc. |
- StyleResolver& resolver = m_styleEngine->ensureResolver(); |
- m_styleEngine->resetCSSFeatureFlags(resolver.ensureUpdatedRuleFeatureSet()); |
- resolver.clearStyleSharingList(); |
- } |
- |
- ASSERT(!needsStyleRecalc()); |
- ASSERT(!childNeedsStyleRecalc()); |
- ASSERT(inStyleRecalc()); |
- m_lifecycle.advanceTo(DocumentLifecycle::StyleClean); |
- } |
+ updateStyle(change); |
// As a result of the style recalculation, the currently hovered element might have been |
// detached (for example, by setting display:none in the :hover style), schedule another mouseMove event |
@@ -1831,9 +1765,71 @@ void Document::updateStyle(StyleRecalcChange change) |
InspectorInstrumentation::didRecalculateStyle(cookie); |
} |
+void Document::updateStyle(StyleRecalcChange change) |
+{ |
+ TRACE_EVENT0("webkit", "Document::updateStyle"); |
+ |
+ RenderWidget::UpdateSuspendScope suspendWidgetHierarchyUpdates; |
+ m_lifecycle.advanceTo(DocumentLifecycle::InStyleRecalc); |
+ |
+ if (styleChangeType() >= SubtreeStyleChange) |
+ change = Force; |
+ |
+ // FIXME: Cannot access the ensureStyleResolver() before calling styleForDocument below because |
+ // apparently the StyleResolver's constructor has side effects. We should fix it. |
+ // See printing/setPrinting.html, printing/width-overflow.html though they only fail on |
+ // mac when accessing the resolver by what appears to be a viewport size difference. |
+ |
+ if (change == Force) { |
+ m_hasNodesWithPlaceholderStyle = false; |
+ RefPtr<RenderStyle> documentStyle = StyleResolver::styleForDocument(*this, m_styleEngine->fontSelector()); |
+ StyleRecalcChange localChange = RenderStyle::compare(documentStyle.get(), renderView()->style()); |
+ if (localChange != NoChange) |
+ renderView()->setStyle(documentStyle.release()); |
+ } |
+ |
+ clearNeedsStyleRecalc(); |
+ |
+ // Uncomment to enable printing of statistics about style sharing and the matched property cache. |
+ // Optionally pass StyleResolver::ReportSlowStats to print numbers that require crawling the |
+ // entire DOM (where collecting them is very slow). |
+ // FIXME: Expose this as a runtime flag. |
+ // ensureStyleResolver().enableStats(/*StyleResolver::ReportSlowStats*/); |
+ |
+ if (StyleResolverStats* stats = ensureStyleResolver().stats()) |
+ stats->reset(); |
+ |
+ if (Element* documentElement = this->documentElement()) { |
+ inheritHtmlAndBodyElementStyles(change); |
+ dirtyElementsForLayerUpdate(); |
+ if (documentElement->shouldCallRecalcStyle(change)) |
+ documentElement->recalcStyle(change); |
+ while (dirtyElementsForLayerUpdate()) |
+ documentElement->recalcStyle(NoChange); |
+ } |
+ |
+ ensureStyleResolver().printStats(); |
+ |
+ view()->updateCompositingLayersAfterStyleChange(); |
+ |
+ clearChildNeedsStyleRecalc(); |
+ |
+ if (m_styleEngine->hasResolver()) { |
+ // Pseudo element removal and similar may only work with these flags still set. Reset them after the style recalc. |
+ StyleResolver& resolver = m_styleEngine->ensureResolver(); |
+ m_styleEngine->resetCSSFeatureFlags(resolver.ensureUpdatedRuleFeatureSet()); |
+ resolver.clearStyleSharingList(); |
+ } |
+ |
+ ASSERT(!needsStyleRecalc()); |
+ ASSERT(!childNeedsStyleRecalc()); |
+ ASSERT(inStyleRecalc()); |
+ m_lifecycle.advanceTo(DocumentLifecycle::StyleClean); |
+} |
+ |
void Document::updateStyleForNodeIfNeeded(Node* node) |
{ |
- if (!shouldCallRecalcStyleForDocument()) |
+ if (!needsRenderTreeUpdate()) |
return; |
// At this point, we know that we need to recalc some style on the document in order to fully update styles. |
@@ -1917,7 +1913,7 @@ void Document::updateLayoutIgnorePendingStylesheets(Document::RunPostLayoutTasks |
// If new nodes have been added or style recalc has been done with style sheets still |
// pending, some nodes may not have had their real style calculated yet. Normally this |
// gets cleaned when style sheets arrive but here we need up-to-date style immediately. |
- updateStyle(Force); |
+ updateRenderTree(Force); |
} |
} |
@@ -2009,7 +2005,7 @@ void Document::scheduleLayerUpdate(Element& element) |
return; |
element.setNeedsLayerUpdate(); |
m_layerUpdateElements.add(&element); |
- scheduleStyleRecalc(); |
+ scheduleRenderTreeUpdate(); |
} |
void Document::unscheduleLayerUpdate(Element& element) |
@@ -2021,7 +2017,7 @@ void Document::unscheduleLayerUpdate(Element& element) |
void Document::scheduleUseShadowTreeUpdate(SVGUseElement& element) |
{ |
m_useElementsNeedingUpdate.add(&element); |
- scheduleStyleRecalc(); |
+ scheduleRenderTreeUpdate(); |
} |
void Document::unscheduleUseShadowTreeUpdate(SVGUseElement& element) |
@@ -2607,7 +2603,7 @@ void Document::setParsing(bool b) |
m_elementDataCache = ElementDataCache::create(); |
} |
-bool Document::shouldScheduleLayout() |
+bool Document::shouldScheduleLayout() const |
{ |
// This function will only be called when FrameView thinks a layout is needed. |
// This enforces a couple extra rules. |
@@ -3288,6 +3284,14 @@ void Document::setSelectedStylesheetSet(const String& aString) |
styleResolverChanged(RecalcStyleDeferred); |
} |
+void Document::evaluateMediaQueryListIfNeeded() |
+{ |
+ if (!m_evaluateMediaQueriesOnStyleRecalc) |
+ return; |
+ evaluateMediaQueryList(); |
+ m_evaluateMediaQueriesOnStyleRecalc = false; |
+} |
+ |
void Document::evaluateMediaQueryList() |
{ |
if (m_mediaQueryMatcher) |