Title: [188322] trunk/Source/WebCore
Revision
188322
Author
[email protected]
Date
2015-08-11 20:41:40 -0700 (Tue, 11 Aug 2015)

Log Message

Disconnect LayoutStateDisabler logic and RenderView pointer.
https://bugs.webkit.org/show_bug.cgi?id=147906

Reviewed by Simon Fraser.

LayoutStateDisabler should disable layout state unconditionally.
The only place where it was actually conditional was the subtree layout branch.
Create a dedicated SubtreeLayoutStateMaintainer to manage the subtree layout case.

No change in behaviour.

* page/FrameView.cpp:
(WebCore::SubtreeLayoutStateMaintainer::SubtreeLayoutStateMaintainer):
(WebCore::SubtreeLayoutStateMaintainer::~SubtreeLayoutStateMaintainer):
(WebCore::FrameView::layout):
* rendering/RenderBlock.cpp:
(WebCore::RenderBlock::updateFirstLetterStyle):
(WebCore::RenderBlock::updateFirstLetter):
* rendering/RenderBlockFlow.cpp:
(WebCore::RenderBlockFlow::repaintOverhangingFloats):
* rendering/RenderFlowThread.cpp:
(WebCore::RenderFlowThread::repaintRectangleInRegions):
* rendering/RenderListBox.cpp:
(WebCore::RenderListBox::layout):
* rendering/RenderListItem.cpp:
(WebCore::RenderListItem::insertOrMoveMarkerRendererIfNeeded):
* rendering/RenderMediaControlElements.cpp:
(WebCore::RenderMediaVolumeSliderContainer::layout):
(WebCore::RenderMediaControlTimelineContainer::layout):
(WebCore::RenderTextTrackContainerElement::layout):
* rendering/RenderMultiColumnFlowThread.cpp:
(WebCore::RenderMultiColumnFlowThread::populate):
(WebCore::RenderMultiColumnFlowThread::evacuateAndDestroy):
* rendering/RenderView.h:
(WebCore::LayoutStateDisabler::LayoutStateDisabler):
(WebCore::LayoutStateDisabler::~LayoutStateDisabler):
* rendering/svg/RenderSVGRoot.cpp:
(WebCore::RenderSVGRoot::layout):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (188321 => 188322)


--- trunk/Source/WebCore/ChangeLog	2015-08-12 03:16:15 UTC (rev 188321)
+++ trunk/Source/WebCore/ChangeLog	2015-08-12 03:41:40 UTC (rev 188322)
@@ -1,3 +1,44 @@
+2015-08-11  Zalan Bujtas  <[email protected]>
+
+        Disconnect LayoutStateDisabler logic and RenderView pointer.
+        https://bugs.webkit.org/show_bug.cgi?id=147906
+
+        Reviewed by Simon Fraser.
+
+        LayoutStateDisabler should disable layout state unconditionally.
+        The only place where it was actually conditional was the subtree layout branch.
+        Create a dedicated SubtreeLayoutStateMaintainer to manage the subtree layout case.
+
+        No change in behaviour.
+
+        * page/FrameView.cpp:
+        (WebCore::SubtreeLayoutStateMaintainer::SubtreeLayoutStateMaintainer):
+        (WebCore::SubtreeLayoutStateMaintainer::~SubtreeLayoutStateMaintainer):
+        (WebCore::FrameView::layout):
+        * rendering/RenderBlock.cpp:
+        (WebCore::RenderBlock::updateFirstLetterStyle):
+        (WebCore::RenderBlock::updateFirstLetter):
+        * rendering/RenderBlockFlow.cpp:
+        (WebCore::RenderBlockFlow::repaintOverhangingFloats):
+        * rendering/RenderFlowThread.cpp:
+        (WebCore::RenderFlowThread::repaintRectangleInRegions):
+        * rendering/RenderListBox.cpp:
+        (WebCore::RenderListBox::layout):
+        * rendering/RenderListItem.cpp:
+        (WebCore::RenderListItem::insertOrMoveMarkerRendererIfNeeded):
+        * rendering/RenderMediaControlElements.cpp:
+        (WebCore::RenderMediaVolumeSliderContainer::layout):
+        (WebCore::RenderMediaControlTimelineContainer::layout):
+        (WebCore::RenderTextTrackContainerElement::layout):
+        * rendering/RenderMultiColumnFlowThread.cpp:
+        (WebCore::RenderMultiColumnFlowThread::populate):
+        (WebCore::RenderMultiColumnFlowThread::evacuateAndDestroy):
+        * rendering/RenderView.h:
+        (WebCore::LayoutStateDisabler::LayoutStateDisabler):
+        (WebCore::LayoutStateDisabler::~LayoutStateDisabler):
+        * rendering/svg/RenderSVGRoot.cpp:
+        (WebCore::RenderSVGRoot::layout):
+
 2015-08-11  Simon Fraser  <[email protected]>
 
         Fix ViewportConfiguration dumping.

Modified: trunk/Source/WebCore/page/FrameView.cpp (188321 => 188322)


--- trunk/Source/WebCore/page/FrameView.cpp	2015-08-12 03:16:15 UTC (rev 188321)
+++ trunk/Source/WebCore/page/FrameView.cpp	2015-08-12 03:41:40 UTC (rev 188322)
@@ -160,6 +160,35 @@
     return Pagination::BottomToTopPaginated;
 }
 
+class SubtreeLayoutStateMaintainer {
+public:
+    SubtreeLayoutStateMaintainer(RenderElement* subtreeLayoutRoot)
+        : m_layoutRoot(subtreeLayoutRoot)
+    {
+        if (m_layoutRoot) {
+            RenderView& view = m_layoutRoot->view();
+            view.pushLayoutState(*m_layoutRoot);
+            m_disableLayoutState = view.shouldDisableLayoutStateForSubtree(m_layoutRoot);
+            if (m_disableLayoutState)
+                view.disableLayoutState();
+        }
+    }
+
+    ~SubtreeLayoutStateMaintainer()
+    {
+        if (m_layoutRoot) {
+            RenderView& view = m_layoutRoot->view();
+            view.popLayoutState(*m_layoutRoot);
+            if (m_disableLayoutState)
+                view.enableLayoutState();
+        }
+    }
+
+private:
+    RenderElement* m_layoutRoot { nullptr };
+    bool m_disableLayoutState { false };
+};
+
 FrameView::FrameView(Frame& frame)
     : m_frame(frame)
     , m_canHaveScrollbars(true)
@@ -1366,13 +1395,8 @@
         }
 
         layer = root->enclosingLayer();
+        SubtreeLayoutStateMaintainer subtreeLayoutStateMaintainer(m_layoutRoot);
 
-        bool disableLayoutState = false;
-        if (subtree) {
-            disableLayoutState = root->view().shouldDisableLayoutStateForSubtree(root);
-            root->view().pushLayoutState(*root);
-        }
-        LayoutStateDisabler layoutStateDisabler(disableLayoutState ? &root->view() : nullptr);
         RenderView::RepaintRegionAccumulator repaintRegionAccumulator(&root->view());
 
         ASSERT(m_layoutPhase == InPreLayout);
@@ -1400,13 +1424,8 @@
 #endif
 
         ASSERT(m_layoutPhase == InLayout);
-
-        if (subtree)
-            root->view().popLayoutState(*root);
-
         m_layoutRoot = nullptr;
-
-        // Close block here to end the scope of changeSchedulingEnabled and layoutStateDisabler.
+        // Close block here to end the scope of changeSchedulingEnabled and SubtreeLayoutStateMaintainer.
     }
 
     m_layoutPhase = InViewSizeAdjust;

Modified: trunk/Source/WebCore/rendering/RenderBlock.cpp (188321 => 188322)


--- trunk/Source/WebCore/rendering/RenderBlock.cpp	2015-08-12 03:16:15 UTC (rev 188321)
+++ trunk/Source/WebCore/rendering/RenderBlock.cpp	2015-08-12 03:41:40 UTC (rev 188322)
@@ -3061,7 +3061,7 @@
         newFirstLetter->initializeStyle();
 
         // Move the first letter into the new renderer.
-        LayoutStateDisabler layoutStateDisabler(&view());
+        LayoutStateDisabler layoutStateDisabler(view());
         while (RenderObject* child = firstLetter->firstChild()) {
             if (is<RenderText>(*child))
                 downcast<RenderText>(*child).removeAndDestroyTextBoxes();
@@ -3237,7 +3237,7 @@
 
     // Our layout state is not valid for the repaints we are going to trigger by
     // adding and removing children of firstLetterContainer.
-    LayoutStateDisabler layoutStateDisabler(&view());
+    LayoutStateDisabler layoutStateDisabler(view());
 
     createFirstLetterRenderer(firstLetterContainer, downcast<RenderText>(firstLetterObj));
 }

Modified: trunk/Source/WebCore/rendering/RenderBlockFlow.cpp (188321 => 188322)


--- trunk/Source/WebCore/rendering/RenderBlockFlow.cpp	2015-08-12 03:16:15 UTC (rev 188321)
+++ trunk/Source/WebCore/rendering/RenderBlockFlow.cpp	2015-08-12 03:41:40 UTC (rev 188322)
@@ -2123,7 +2123,7 @@
 
     // FIXME: Avoid disabling LayoutState. At the very least, don't disable it for floats originating
     // in this block. Better yet would be to push extra state for the containers of other floats.
-    LayoutStateDisabler layoutStateDisabler(&view());
+    LayoutStateDisabler layoutStateDisabler(view());
     const FloatingObjectSet& floatingObjectSet = m_floatingObjects->set();
     auto end = floatingObjectSet.end();
     for (auto it = floatingObjectSet.begin(); it != end; ++it) {

Modified: trunk/Source/WebCore/rendering/RenderFlowThread.cpp (188321 => 188322)


--- trunk/Source/WebCore/rendering/RenderFlowThread.cpp	2015-08-12 03:16:15 UTC (rev 188321)
+++ trunk/Source/WebCore/rendering/RenderFlowThread.cpp	2015-08-12 03:41:40 UTC (rev 188322)
@@ -383,7 +383,7 @@
     if (!shouldRepaint(repaintRect) || !hasValidRegionInfo())
         return;
 
-    LayoutStateDisabler layoutStateDisabler(&view()); // We can't use layout state to repaint, since the regions are somewhere else.
+    LayoutStateDisabler layoutStateDisabler(view()); // We can't use layout state to repaint, since the regions are somewhere else.
 
     for (auto& region : m_regionList)
         region->repaintFlowThreadContent(repaintRect);

Modified: trunk/Source/WebCore/rendering/RenderListBox.cpp (188321 => 188322)


--- trunk/Source/WebCore/rendering/RenderListBox.cpp	2015-08-12 03:16:15 UTC (rev 188321)
+++ trunk/Source/WebCore/rendering/RenderListBox.cpp	2015-08-12 03:41:40 UTC (rev 188322)
@@ -174,7 +174,7 @@
     }
 
     if (m_scrollToRevealSelectionAfterLayout) {
-        LayoutStateDisabler layoutStateDisabler(&view());
+        LayoutStateDisabler layoutStateDisabler(view());
         scrollToRevealSelection();
     }
 }

Modified: trunk/Source/WebCore/rendering/RenderListItem.cpp (188321 => 188322)


--- trunk/Source/WebCore/rendering/RenderListItem.cpp	2015-08-12 03:16:15 UTC (rev 188321)
+++ trunk/Source/WebCore/rendering/RenderListItem.cpp	2015-08-12 03:41:40 UTC (rev 188322)
@@ -291,7 +291,7 @@
     if (newParent != currentParent) {
         // Removing and adding the marker can trigger repainting in
         // containers other than ourselves, so we need to disable LayoutState.
-        LayoutStateDisabler layoutStateDisabler(&view());
+        LayoutStateDisabler layoutStateDisabler(view());
         m_marker->removeFromParent();
         newParent->addChild(m_marker, firstNonMarkerChild(*newParent));
         m_marker->updateMarginsAndContent();

Modified: trunk/Source/WebCore/rendering/RenderMediaControlElements.cpp (188321 => 188322)


--- trunk/Source/WebCore/rendering/RenderMediaControlElements.cpp	2015-08-12 03:16:15 UTC (rev 188321)
+++ trunk/Source/WebCore/rendering/RenderMediaControlElements.cpp	2015-08-12 03:41:40 UTC (rev 188322)
@@ -50,7 +50,7 @@
     RenderBox& buttonBox = downcast<RenderBox>(*nextSibling());
     int absoluteOffsetTop = buttonBox.localToAbsolute(FloatPoint(0, -size().height())).y();
 
-    LayoutStateDisabler layoutStateDisabler(&view());
+    LayoutStateDisabler layoutStateDisabler(view());
 
     // If the slider would be rendered outside the page, it should be moved below the controls.
     if (UNLIKELY(absoluteOffsetTop < 0))
@@ -72,7 +72,7 @@
 {
     RenderFlexibleBox::layout();
 
-    LayoutStateDisabler layoutStateDisabler(&view());
+    LayoutStateDisabler layoutStateDisabler(view());
     MediaControlTimelineContainerElement* container = static_cast<MediaControlTimelineContainerElement*>(element());
     container->setTimeDisplaysHidden(width().toInt() < minWidthToDisplayTimeDisplays);
 }
@@ -94,7 +94,7 @@
 
     ASSERT(mediaControlElementType(element()) == MediaTextTrackDisplayContainer);
 
-    LayoutStateDisabler layoutStateDisabler(&view());
+    LayoutStateDisabler layoutStateDisabler(view());
     static_cast<MediaControlTextTrackContainerElement*>(element())->updateSizes();
 }
 

Modified: trunk/Source/WebCore/rendering/RenderMultiColumnFlowThread.cpp (188321 => 188322)


--- trunk/Source/WebCore/rendering/RenderMultiColumnFlowThread.cpp	2015-08-12 03:16:15 UTC (rev 188321)
+++ trunk/Source/WebCore/rendering/RenderMultiColumnFlowThread.cpp	2015-08-12 03:41:40 UTC (rev 188322)
@@ -149,7 +149,7 @@
     // Reparent children preceding the flow thread into the flow thread. It's multicol content
     // now. At this point there's obviously nothing after the flow thread, but renderers (column
     // sets and spanners) will be inserted there as we insert elements into the flow thread.
-    LayoutStateDisabler layoutStateDisabler(&view());
+    LayoutStateDisabler layoutStateDisabler(view());
     multicolContainer->moveChildrenTo(this, multicolContainer->firstChild(), this, true);
 }
 
@@ -161,7 +161,7 @@
     // Delete the line box tree.
     deleteLines();
     
-    LayoutStateDisabler layoutStateDisabler(&view());
+    LayoutStateDisabler layoutStateDisabler(view());
 
     // First promote all children of the flow thread. Before we move them to the flow thread's
     // container, we need to unregister the flow thread, so that they aren't just re-added again to

Modified: trunk/Source/WebCore/rendering/RenderView.h (188321 => 188322)


--- trunk/Source/WebCore/rendering/RenderView.h	2015-08-12 03:16:15 UTC (rev 188321)
+++ trunk/Source/WebCore/rendering/RenderView.h	2015-08-12 03:41:40 UTC (rev 188322)
@@ -304,6 +304,7 @@
 
     friend class LayoutStateMaintainer;
     friend class LayoutStateDisabler;
+    friend class SubtreeLayoutStateMaintainer;
 
     virtual bool isScrollableOrRubberbandableBox() const override;
 
@@ -445,20 +446,19 @@
 class LayoutStateDisabler {
     WTF_MAKE_NONCOPYABLE(LayoutStateDisabler);
 public:
-    LayoutStateDisabler(RenderView* view)
+    LayoutStateDisabler(RenderView& view)
         : m_view(view)
     {
-        if (m_view)
-            m_view->disableLayoutState();
+        m_view.disableLayoutState();
     }
 
     ~LayoutStateDisabler()
     {
-        if (m_view)
-            m_view->enableLayoutState();
+        m_view.enableLayoutState();
     }
+
 private:
-    RenderView* m_view;
+    RenderView& m_view;
 };
 
 } // namespace WebCore

Modified: trunk/Source/WebCore/rendering/svg/RenderSVGRoot.cpp (188321 => 188322)


--- trunk/Source/WebCore/rendering/svg/RenderSVGRoot.cpp	2015-08-12 03:16:15 UTC (rev 188321)
+++ trunk/Source/WebCore/rendering/svg/RenderSVGRoot.cpp	2015-08-12 03:41:40 UTC (rev 188322)
@@ -165,7 +165,7 @@
     m_resourcesNeedingToInvalidateClients.clear();
 
     // Arbitrary affine transforms are incompatible with LayoutState.
-    LayoutStateDisabler layoutStateDisabler(&view());
+    LayoutStateDisabler layoutStateDisabler(view());
 
     bool needsLayout = selfNeedsLayout();
     LayoutRepainter repainter(*this, checkForRepaintDuringLayout() && needsLayout);
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to