Title: [87277] trunk/Source/WebCore
Revision
87277
Author
[email protected]
Date
2011-05-25 00:17:21 -0700 (Wed, 25 May 2011)

Log Message

2011-05-25  Yuzo Fujishima  <[email protected]>

        Reviewed by Kent Tamura.

        Fix for Bug 61352 - Refactor RenderView::{enable,disable}LayoutState call sites to use RIIA
        https://bugs.webkit.org/show_bug.cgi?id=61352

        No new tests because no behavior changes.

        * html/shadow/MediaControlElements.cpp:
        (WebCore::RenderMediaVolumeSliderContainer::layout):
        * page/FrameView.cpp:
        (WebCore::FrameView::layout):
        * rendering/RenderBlock.cpp:
        (WebCore::RenderBlock::repaintOverhangingFloats):
        (WebCore::RenderBlock::updateFirstLetter):
        * rendering/RenderLayer.cpp:
        (WebCore::RenderLayer::updateLayerPositions):
        (WebCore::RenderLayer::updateScrollInfoAfterLayout):
        * rendering/RenderListBox.cpp:
        (WebCore::RenderListBox::layout):
        * rendering/RenderListItem.cpp:
        (WebCore::RenderListItem::updateMarkerLocation):
        * rendering/RenderMedia.cpp:
        (WebCore::RenderMedia::layout):
        * rendering/RenderView.h:
        (WebCore::RenderView::disableLayoutState):
        (WebCore::RenderView::enableLayoutState):
        (WebCore::LayoutStateDisabler::LayoutStateDisabler):
        (WebCore::LayoutStateDisabler::~LayoutStateDisabler):
        * rendering/svg/RenderSVGRoot.cpp:
        (WebCore::RenderSVGRoot::layout):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (87276 => 87277)


--- trunk/Source/WebCore/ChangeLog	2011-05-25 06:42:11 UTC (rev 87276)
+++ trunk/Source/WebCore/ChangeLog	2011-05-25 07:17:21 UTC (rev 87277)
@@ -1,3 +1,36 @@
+2011-05-25  Yuzo Fujishima  <[email protected]>
+
+        Reviewed by Kent Tamura.
+
+        Fix for Bug 61352 - Refactor RenderView::{enable,disable}LayoutState call sites to use RIIA
+        https://bugs.webkit.org/show_bug.cgi?id=61352
+
+        No new tests because no behavior changes.
+
+        * html/shadow/MediaControlElements.cpp:
+        (WebCore::RenderMediaVolumeSliderContainer::layout):
+        * page/FrameView.cpp:
+        (WebCore::FrameView::layout):
+        * rendering/RenderBlock.cpp:
+        (WebCore::RenderBlock::repaintOverhangingFloats):
+        (WebCore::RenderBlock::updateFirstLetter):
+        * rendering/RenderLayer.cpp:
+        (WebCore::RenderLayer::updateLayerPositions):
+        (WebCore::RenderLayer::updateScrollInfoAfterLayout):
+        * rendering/RenderListBox.cpp:
+        (WebCore::RenderListBox::layout):
+        * rendering/RenderListItem.cpp:
+        (WebCore::RenderListItem::updateMarkerLocation):
+        * rendering/RenderMedia.cpp:
+        (WebCore::RenderMedia::layout):
+        * rendering/RenderView.h:
+        (WebCore::RenderView::disableLayoutState):
+        (WebCore::RenderView::enableLayoutState):
+        (WebCore::LayoutStateDisabler::LayoutStateDisabler):
+        (WebCore::LayoutStateDisabler::~LayoutStateDisabler):
+        * rendering/svg/RenderSVGRoot.cpp:
+        (WebCore::RenderSVGRoot::layout):
+
 2011-05-24  Csaba Osztrogonác  <[email protected]>
 
         [Qt] Unreviewed typo fix after r87228.

Modified: trunk/Source/WebCore/html/shadow/MediaControlElements.cpp (87276 => 87277)


--- trunk/Source/WebCore/html/shadow/MediaControlElements.cpp	2011-05-25 06:42:11 UTC (rev 87276)
+++ trunk/Source/WebCore/html/shadow/MediaControlElements.cpp	2011-05-25 07:17:21 UTC (rev 87277)
@@ -167,15 +167,11 @@
 
     RenderBox* buttonBox = toRenderBox(previousSibling());
 
-    if (view())
-        view()->disableLayoutState();
+    LayoutStateDisabler layoutStateDisabler(view());
 
     IntPoint offset = theme()->volumeSliderOffsetFromMuteButton(buttonBox, IntSize(width(), height()));
     setX(offset.x() + buttonBox->offsetLeft());
     setY(offset.y() + buttonBox->offsetTop());
-
-    if (view())
-        view()->enableLayoutState();
 }
 
 inline MediaControlVolumeSliderContainerElement::MediaControlVolumeSliderContainerElement(HTMLMediaElement* mediaElement)

Modified: trunk/Source/WebCore/page/FrameView.cpp (87276 => 87277)


--- trunk/Source/WebCore/page/FrameView.cpp	2011-05-25 06:42:11 UTC (rev 87276)
+++ trunk/Source/WebCore/page/FrameView.cpp	2011-05-25 07:17:21 UTC (rev 87277)
@@ -978,26 +978,23 @@
 
     m_actionScheduler->pause();
 
-    bool disableLayoutState = false;
-    if (subtree) {
-        RenderView* view = root->view();
-        disableLayoutState = view->shouldDisableLayoutStateForSubtree(root);
-        view->pushLayoutState(root);
-        if (disableLayoutState)
-            view->disableLayoutState();
-    }
-        
-    m_inLayout = true;
-    beginDeferredRepaints();
-    root->layout();
-    endDeferredRepaints();
-    m_inLayout = false;
+    {
+        bool disableLayoutState = false;
+        if (subtree) {
+            RenderView* view = root->view();
+            disableLayoutState = view->shouldDisableLayoutStateForSubtree(root);
+            view->pushLayoutState(root);
+        }
+        LayoutStateDisabler layoutStateDisabler(disableLayoutState ? root->view() : 0);
 
-    if (subtree) {
-        RenderView* view = root->view();
-        view->popLayoutState(root);
-        if (disableLayoutState)
-            view->enableLayoutState();
+        m_inLayout = true;
+        beginDeferredRepaints();
+        root->layout();
+        endDeferredRepaints();
+        m_inLayout = false;
+
+        if (subtree)
+            root->view()->popLayoutState(root);
     }
     m_layoutRoot = 0;
 

Modified: trunk/Source/WebCore/rendering/RenderBlock.cpp (87276 => 87277)


--- trunk/Source/WebCore/rendering/RenderBlock.cpp	2011-05-25 06:42:11 UTC (rev 87276)
+++ trunk/Source/WebCore/rendering/RenderBlock.cpp	2011-05-25 07:17:21 UTC (rev 87277)
@@ -2225,7 +2225,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.
-    view()->disableLayoutState();
+    LayoutStateDisabler layoutStateDisabler(view());
     FloatingObjectSet& floatingObjectSet = m_floatingObjects->set();
     FloatingObjectSetIterator end = floatingObjectSet.end();
     for (FloatingObjectSetIterator it = floatingObjectSet.begin(); it != end; ++it) {
@@ -2238,7 +2238,6 @@
             r->m_renderer->repaintOverhangingFloats();
         }
     }
-    view()->enableLayoutState();
 }
  
 void RenderBlock::paint(PaintInfo& paintInfo, int tx, int ty)
@@ -5351,14 +5350,14 @@
             newFirstLetter->setStyle(pseudoStyle);
 
             // Move the first letter into the new renderer.
-            view()->disableLayoutState();
+            LayoutStateDisabler layoutStateDisabler(view());
             while (RenderObject* child = firstLetter->firstChild()) {
                 if (child->isText())
                     toRenderText(child)->removeAndDestroyTextBoxes();
                 firstLetter->removeChild(child);
                 newFirstLetter->addChild(child, 0);
             }
-            
+
             RenderTextFragment* remainingText = 0;
             RenderObject* nextSibling = firstLetter->nextSibling();
             RenderObject* next = nextSibling;
@@ -5377,7 +5376,6 @@
             firstLetter->destroy();
             firstLetter = newFirstLetter;
             firstLetterContainer->addChild(firstLetter, nextSibling);
-            view()->enableLayoutState();
         } else
             firstLetter->setStyle(pseudoStyle);
 
@@ -5397,7 +5395,7 @@
 
     // Our layout state is not valid for the repaints we are going to trigger by
     // adding and removing children of firstLetterContainer.
-    view()->disableLayoutState();
+    LayoutStateDisabler layoutStateDisabler(view());
 
     RenderText* textObj = toRenderText(currChild);
 
@@ -5460,7 +5458,6 @@
 
         textObj->destroy();
     }
-    view()->enableLayoutState();
 }
 
 // Helper methods for obtaining the last line, computing line counts and heights for line counts

Modified: trunk/Source/WebCore/rendering/RenderLayer.cpp (87276 => 87277)


--- trunk/Source/WebCore/rendering/RenderLayer.cpp	2011-05-25 06:42:11 UTC (rev 87276)
+++ trunk/Source/WebCore/rendering/RenderLayer.cpp	2011-05-25 07:17:21 UTC (rev 87277)
@@ -309,7 +309,7 @@
     if (m_hasVisibleContent) {
         RenderView* view = renderer()->view();
         ASSERT(view);
-        // FIXME: Optimize using LayoutState and remove the disableLayoutState() call
+        // FIXME: Optimize using LayoutState and remove LayoutStateDisabler instantiation
         // from updateScrollInfoAfterLayout().
         ASSERT(!view->layoutStateEnabled());
 
@@ -2181,12 +2181,9 @@
             ASSERT(view);
             // scrollToOffset() may call updateLayerPositions(), which doesn't work
             // with LayoutState.
-            // FIXME: Remove the disableLayoutState/enableLayoutState if the above changes.
-            if (view)
-                view->disableLayoutState();
+            // FIXME: Remove the LayoutStateDisabler instantiation if the above changes.
+            LayoutStateDisabler layoutStateDisabler(view);
             scrollToOffset(newX, newY);
-            if (view)
-                view->enableLayoutState();
         }
     }
 
@@ -2261,10 +2258,11 @@
     }
  
     RenderView* view = renderer()->view();
-    view->disableLayoutState();
-    scrollToOffset(scrollXOffset(), scrollYOffset());
-    view->enableLayoutState();
- 
+    {
+        LayoutStateDisabler layoutStateDisabler(view);
+        scrollToOffset(scrollXOffset(), scrollYOffset());
+    }
+
     if (renderer()->node() && renderer()->document()->hasListenerType(Document::OVERFLOWCHANGED_LISTENER))
         updateOverflowStatus(horizontalOverflow, verticalOverflow);
 }

Modified: trunk/Source/WebCore/rendering/RenderListBox.cpp (87276 => 87277)


--- trunk/Source/WebCore/rendering/RenderListBox.cpp	2011-05-25 06:42:11 UTC (rev 87276)
+++ trunk/Source/WebCore/rendering/RenderListBox.cpp	2011-05-25 07:17:21 UTC (rev 87277)
@@ -150,9 +150,8 @@
 {
     RenderBlock::layout();
     if (m_scrollToRevealSelectionAfterLayout) {
-        view()->disableLayoutState();
+        LayoutStateDisabler layoutStateDisabler(view());
         scrollToRevealSelection();
-        view()->enableLayoutState();
     }
 }
 

Modified: trunk/Source/WebCore/rendering/RenderListItem.cpp (87276 => 87277)


--- trunk/Source/WebCore/rendering/RenderListItem.cpp	2011-05-25 06:42:11 UTC (rev 87276)
+++ trunk/Source/WebCore/rendering/RenderListItem.cpp	2011-05-25 07:17:21 UTC (rev 87277)
@@ -213,7 +213,7 @@
         if (markerPar != lineBoxParent || m_marker->preferredLogicalWidthsDirty()) {
             // Removing and adding the marker can trigger repainting in
             // containers other than ourselves, so we need to disable LayoutState.
-            view()->disableLayoutState();
+            LayoutStateDisabler layoutStateDisabler(view());
             updateFirstLetter();
             m_marker->remove();
             if (!lineBoxParent)
@@ -221,7 +221,6 @@
             lineBoxParent->addChild(m_marker, firstNonMarkerChild(lineBoxParent));
             if (m_marker->preferredLogicalWidthsDirty())
                 m_marker->computePreferredLogicalWidths();
-            view()->enableLayoutState();
         }
     }
 }

Modified: trunk/Source/WebCore/rendering/RenderMedia.cpp (87276 => 87277)


--- trunk/Source/WebCore/rendering/RenderMedia.cpp	2011-05-25 06:42:11 UTC (rev 87276)
+++ trunk/Source/WebCore/rendering/RenderMedia.cpp	2011-05-25 07:17:21 UTC (rev 87277)
@@ -70,7 +70,7 @@
         return;
 
     // When calling layout() on a child node, a parent must either push a LayoutStateMaintainter, or 
-    // call view()->disableLayoutState().  Since using a LayoutStateMaintainer is slightly more efficient,
+    // instantiate LayoutStateDisabler. Since using a LayoutStateMaintainer is slightly more efficient,
     // and this method will be called many times per second during playback, use a LayoutStateMaintainer:
     LayoutStateMaintainer statePusher(view(), this, IntSize(x(), y()), hasTransform() || hasReflection() || style()->isFlippedBlocksWritingMode());
 

Modified: trunk/Source/WebCore/rendering/RenderView.h (87276 => 87277)


--- trunk/Source/WebCore/rendering/RenderView.h	2011-05-25 06:42:11 UTC (rev 87276)
+++ trunk/Source/WebCore/rendering/RenderView.h	2011-05-25 07:17:21 UTC (rev 87277)
@@ -125,13 +125,6 @@
     bool layoutStateEnabled() const { return m_layoutStateDisableCount == 0 && m_layoutState; }
     LayoutState* layoutState() const { return m_layoutState; }
 
-    // Suspends the LayoutState optimization. Used under transforms that cannot be represented by
-    // LayoutState (common in SVG) and when manipulating the render tree during layout in ways
-    // that can trigger repaint of a non-child (e.g. when a list item moves its list marker around).
-    // Note that even when disabled, LayoutState is still used to store layoutDelta.
-    void disableLayoutState() { m_layoutStateDisableCount++; }
-    void enableLayoutState() { ASSERT(m_layoutStateDisableCount > 0); m_layoutStateDisableCount--; }
-
     virtual void updateHitTestResult(HitTestResult&, const IntPoint&);
 
     unsigned pageLogicalHeight() const { return m_pageLogicalHeight; }
@@ -195,10 +188,19 @@
         state->destroy(renderArena());
     }
 
+    // Suspends the LayoutState optimization. Used under transforms that cannot be represented by
+    // LayoutState (common in SVG) and when manipulating the render tree during layout in ways
+    // that can trigger repaint of a non-child (e.g. when a list item moves its list marker around).
+    // Note that even when disabled, LayoutState is still used to store layoutDelta.
+    // These functions may only be accessed by LayoutStateMaintainer or LayoutStateDisabler.
+    void disableLayoutState() { m_layoutStateDisableCount++; }
+    void enableLayoutState() { ASSERT(m_layoutStateDisableCount > 0); m_layoutStateDisableCount--; }
+
     size_t getRetainedWidgets(Vector<RenderWidget*>&);
     void releaseWidgets(Vector<RenderWidget*>&);
     
     friend class LayoutStateMaintainer;
+    friend class LayoutStateDisabler;
         
 protected:
     FrameView* m_frameView;
@@ -321,6 +323,25 @@
     bool m_didCreateLayoutState : 1; // true if we actually made a layout state.
 };
 
+class LayoutStateDisabler {
+    WTF_MAKE_NONCOPYABLE(LayoutStateDisabler);
+public:
+    LayoutStateDisabler(RenderView* view)
+        : m_view(view)
+    {
+        if (m_view)
+            m_view->disableLayoutState();
+    }
+
+    ~LayoutStateDisabler()
+    {
+        if (m_view)
+            m_view->enableLayoutState();
+    }
+private:
+    RenderView* m_view;
+};
+
 } // namespace WebCore
 
 #endif // RenderView_h

Modified: trunk/Source/WebCore/rendering/svg/RenderSVGRoot.cpp (87276 => 87277)


--- trunk/Source/WebCore/rendering/svg/RenderSVGRoot.cpp	2011-05-25 06:42:11 UTC (rev 87276)
+++ trunk/Source/WebCore/rendering/svg/RenderSVGRoot.cpp	2011-05-25 07:17:21 UTC (rev 87277)
@@ -103,7 +103,7 @@
     ASSERT(needsLayout());
 
     // Arbitrary affine transforms are incompatible with LayoutState.
-    view()->disableLayoutState();
+    LayoutStateDisabler layoutStateDisabler(view());
 
     bool needsLayout = selfNeedsLayout();
     LayoutRepainter repainter(*this, checkForRepaintDuringLayout() && needsLayout);
@@ -128,7 +128,6 @@
 
     repainter.repaintAfterLayout();
 
-    view()->enableLayoutState();
     setNeedsLayout(false);
 }
 
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo.cgi/webkit-changes

Reply via email to