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

Unified Diff: Source/core/page/FrameView.cpp

Issue 19782002: Make Blink stop scheduling its own Layout, and use the compositor's timer instead (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: With test changes Created 7 years, 5 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
« no previous file with comments | « Source/core/page/FrameView.h ('k') | Source/core/rendering/RenderIFrame.cpp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: Source/core/page/FrameView.cpp
diff --git a/Source/core/page/FrameView.cpp b/Source/core/page/FrameView.cpp
index 15389b0e919cce3bce83e0cdb1651a9223c04154..061fb96189efb2928a1d49923e90f5b519b4fbea 100644
--- a/Source/core/page/FrameView.cpp
+++ b/Source/core/page/FrameView.cpp
@@ -155,7 +155,7 @@ FrameView::FrameView(Frame* frame)
: m_frame(frame)
, m_canHaveScrollbars(true)
, m_slowRepaintObjectCount(0)
- , m_layoutTimer(this, &FrameView::layoutTimerFired)
+ , m_layoutIsScheduledWithEmbedder(false)
, m_layoutRoot(0)
, m_inSynchronousPostLayout(false)
, m_postLayoutTasksTimer(this, &FrameView::postLayoutTimerFired)
@@ -247,7 +247,7 @@ void FrameView::reset()
m_contentIsOpaque = false;
m_borderX = 30;
m_borderY = 30;
- m_layoutTimer.stop();
+ unscheduleRelayout();
m_layoutRoot = 0;
m_delayedLayout = false;
m_doFullRepaint = true;
@@ -691,7 +691,7 @@ void FrameView::updateCompositingLayersAfterStyleChange()
return;
// If we expect to update compositing after an incipient layout, don't do so here.
- if (m_doingPreLayoutStyleUpdate || layoutPending() || renderView->needsLayout())
+ if (m_doingPreLayoutStyleUpdate || layoutIsScheduledWithEmbedder() || renderView->needsLayout())
return;
// This call will make sure the cached hasAcceleratedCompositing is updated from the pref
@@ -816,7 +816,7 @@ bool FrameView::isSoftwareRenderable() const
RenderObject* FrameView::layoutRoot(bool onlyDuringLayout) const
{
- return onlyDuringLayout && layoutPending() ? 0 : m_layoutRoot;
+ return onlyDuringLayout && layoutIsScheduledWithEmbedder() ? 0 : m_layoutRoot;
}
static inline void collectFrameViewChildren(FrameView* frameView, Vector<RefPtr<FrameView> >& frameViews)
@@ -882,7 +882,7 @@ void FrameView::layout(bool allowSubtree)
// Every scroll that happens during layout is programmatic.
TemporaryChange<bool> changeInProgrammaticScroll(m_inProgrammaticScroll, true);
- m_layoutTimer.stop();
+ unscheduleRelayout();
m_delayedLayout = false;
m_setNeedsLayoutWasDeferred = false;
@@ -1875,6 +1875,13 @@ void FrameView::layoutTimerFired(Timer<FrameView>*)
layout();
}
+void FrameView::scheduleLayoutWithEmbedder()
+{
+ // FIXME: Right now we're hijacking the scheduleAnimation codepath.
+ scheduleAnimation();
+ m_layoutIsScheduledWithEmbedder = true;
+}
+
void FrameView::scheduleRelayout()
{
ASSERT(m_frame->view() == this);
@@ -1896,14 +1903,7 @@ void FrameView::scheduleRelayout()
if (m_frame->ownerRenderer() && frame()->document()->shouldDisplaySeamlesslyWithParent())
m_frame->ownerRenderer()->setNeedsLayout(true, MarkContainingBlockChain);
- int delay = m_frame->document()->minimumLayoutDelay();
- if (m_layoutTimer.isActive() && m_delayedLayout && !delay)
- unscheduleRelayout();
- if (m_layoutTimer.isActive())
- return;
-
- m_delayedLayout = delay != 0;
- m_layoutTimer.startOneShot(delay * 0.001);
+ scheduleLayoutWithEmbedder();
}
static bool isObjectAncestorContainerOf(RenderObject* ancestor, RenderObject* descendant)
@@ -1926,7 +1926,7 @@ void FrameView::scheduleRelayoutOfSubtree(RenderObject* relayoutRoot)
return;
}
- if (layoutPending() || !m_layoutSchedulingEnabled) {
+ if (layoutIsScheduledWithEmbedder() || !m_layoutSchedulingEnabled) {
if (m_layoutRoot != relayoutRoot) {
if (isObjectAncestorContainerOf(m_layoutRoot, relayoutRoot)) {
// Keep the current root
@@ -1952,14 +1952,13 @@ void FrameView::scheduleRelayoutOfSubtree(RenderObject* relayoutRoot)
m_layoutRoot = relayoutRoot;
ASSERT(!m_layoutRoot->container() || !m_layoutRoot->container()->needsLayout());
InspectorInstrumentation::didInvalidateLayout(m_frame.get());
- m_delayedLayout = delay != 0;
- m_layoutTimer.startOneShot(delay * 0.001);
+ scheduleLayoutWithEmbedder();
}
}
-bool FrameView::layoutPending() const
+bool FrameView::layoutIsScheduledWithEmbedder() const
{
- return m_layoutTimer.isActive();
+ return m_layoutIsScheduledWithEmbedder;
}
bool FrameView::needsLayout() const
@@ -1971,7 +1970,7 @@ bool FrameView::needsLayout() const
return false;
RenderView* renderView = this->renderView();
- return layoutPending()
+ return layoutIsScheduledWithEmbedder()
|| (renderView && renderView->needsLayout())
|| m_layoutRoot
|| (m_deferSetNeedsLayouts && m_setNeedsLayoutWasDeferred);
@@ -1990,15 +1989,15 @@ void FrameView::setNeedsLayout()
void FrameView::unscheduleRelayout()
{
- if (!m_layoutTimer.isActive())
- return;
-
- m_layoutTimer.stop();
- m_delayedLayout = false;
+ // FIXME: We should just remove this method.
+ m_layoutIsScheduledWithEmbedder = false;
}
void FrameView::serviceScriptedAnimations(double monotonicAnimationStartTime)
{
+ // The Animation timer is also used for scheduling layouts.
+ updateLayoutAndStyleIfNeededRecursive();
+
for (RefPtr<Frame> frame = m_frame; frame; frame = frame->tree()->traverseNext()) {
frame->view()->serviceScrollAnimations();
if (!RuntimeEnabledFeatures::webAnimationsCSSEnabled())
@@ -2987,6 +2986,7 @@ void FrameView::updateLayoutAndStyleIfNeededRecursive()
m_frame->document()->updateStyleIfNeeded();
+ unscheduleRelayout();
if (needsLayout())
layout();
« no previous file with comments | « Source/core/page/FrameView.h ('k') | Source/core/rendering/RenderIFrame.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698