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

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

Issue 146023008: Add layout states to DocumentLifecycle state machine (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Whitelist one more transition' Created 6 years, 10 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/frame/FrameView.h ('k') | Source/core/rendering/RenderLayer.cpp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: Source/core/frame/FrameView.cpp
diff --git a/Source/core/frame/FrameView.cpp b/Source/core/frame/FrameView.cpp
index 34830a1ad24ccc93c2762267030476b24efdd3b7..6e798215d6ceb4d5550fb5fc80a3c0d78cf1bc7f 100644
--- a/Source/core/frame/FrameView.cpp
+++ b/Source/core/frame/FrameView.cpp
@@ -777,6 +777,7 @@ inline void FrameView::forceLayoutParentViewIfNeeded()
void FrameView::performPreLayoutTasks()
{
TRACE_EVENT0("webkit", "FrameView::performPreLayoutTasks");
+ lifecycle().advanceTo(DocumentLifecycle::InPreLayout);
// Don't schedule more layouts, we're in one.
TemporaryChange<bool> changeSchedulingEnabled(m_layoutSchedulingEnabled, false);
@@ -811,14 +812,16 @@ void FrameView::performPreLayoutTasks()
// the layout beats any sort of style recalc update that needs to occur.
TemporaryChange<bool> changeDoingPreLayoutStyleUpdate(m_doingPreLayoutStyleUpdate, true);
document->updateStyleIfNeeded();
+ lifecycle().advanceTo(DocumentLifecycle::StyleClean);
}
void FrameView::performLayout(RenderObject* rootForThisLayout, bool inSubtreeLayout)
{
- ASSERT(!m_inPerformLayout);
-
TRACE_EVENT0("webkit", "FrameView::performLayout");
+ ASSERT(!isInPerformLayout());
+ lifecycle().advanceTo(DocumentLifecycle::InPerformLayout);
+
TemporaryChange<bool> changeInPerformLayout(m_inPerformLayout, true);
// performLayout is the actual guts of layout().
@@ -856,6 +859,8 @@ void FrameView::performLayout(RenderObject* rootForThisLayout, bool inSubtreeLay
if (inSubtreeLayout)
rootForThisLayout->view()->popLayoutState(rootForThisLayout);
+
+ lifecycle().advanceTo(DocumentLifecycle::AfterPerformLayout);
}
void FrameView::scheduleOrPerformPostLayoutTasks()
@@ -891,10 +896,7 @@ void FrameView::layout(bool allowSubtree)
ASSERT(m_frame->view() == this);
ASSERT(m_frame->page());
- if (m_inPerformLayout)
- return;
-
- if (!m_frame->document()->isActive())
+ if (isInPerformLayout() || !m_frame->document()->isActive())
return;
ASSERT(!partialLayout().isStopping());
@@ -909,11 +911,9 @@ void FrameView::layout(bool allowSubtree)
TemporaryChange<bool> changeInProgrammaticScroll(m_inProgrammaticScroll, true);
m_hasPendingLayout = false;
+ DocumentLifecycle::Scope lifecycleScope(lifecycle(), DocumentLifecycle::LayoutClean);
- // we shouldn't enter layout() while painting
- ASSERT(!isPainting());
- if (isPainting())
- return;
+ RELEASE_ASSERT(!isPainting());
// Store the current maximal outline size to use when computing the old/new
// outline rects for repainting.
@@ -944,6 +944,9 @@ void FrameView::layout(bool allowSubtree)
bool isPartialLayout = partialLayout().isPartialLayout();
+ if (isPartialLayout)
+ lifecycleScope.setFinalState(DocumentLifecycle::StyleClean);
+
FontCachePurgePreventer fontCachePurgePreventer;
RenderLayer* layer;
{
@@ -1158,6 +1161,11 @@ void FrameView::repaintTree(RenderObject* root)
resetScrollbarDamage();
}
+DocumentLifecycle& FrameView::lifecycle() const
+{
+ return m_frame->document()->lifecycle();
+}
+
void FrameView::gatherDebugLayoutRects(RenderObject* layoutRoot)
{
bool isTracing;
@@ -1867,6 +1875,12 @@ bool FrameView::layoutPending() const
return m_hasPendingLayout;
}
+bool FrameView::isInPerformLayout() const
+{
+ ASSERT(m_inPerformLayout == (lifecycle().state() == DocumentLifecycle::InPerformLayout));
+ return m_inPerformLayout;
+}
+
bool FrameView::needsLayout() const
{
// This can return true in cases where the document does not have a body yet.
@@ -2313,7 +2327,7 @@ void FrameView::invalidateScrollbarRect(Scrollbar* scrollbar, const IntRect& rec
IntRect dirtyRect = rect;
dirtyRect.moveBy(scrollbar->location());
- if (RuntimeEnabledFeatures::repaintAfterLayoutEnabled() && m_inPerformLayout) {
+ if (RuntimeEnabledFeatures::repaintAfterLayoutEnabled() && isInPerformLayout()) {
if (scrollbar == verticalScrollbar()) {
m_verticalBarDamage = dirtyRect;
m_hasVerticalBarDamage = true;
« no previous file with comments | « Source/core/frame/FrameView.h ('k') | Source/core/rendering/RenderLayer.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698