Changeset 87277 in webkit


Ignore:
Timestamp:
May 25, 2011 12:17:21 AM (13 years ago)
Author:
yuzo@google.com
Message:

2011-05-25 Yuzo Fujishima <yuzo@google.com>

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):
Location:
trunk/Source/WebCore
Files:
10 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r87276 r87277  
     12011-05-25  Yuzo Fujishima  <yuzo@google.com>
     2
     3        Reviewed by Kent Tamura.
     4
     5        Fix for Bug 61352 - Refactor RenderView::{enable,disable}LayoutState call sites to use RIIA
     6        https://bugs.webkit.org/show_bug.cgi?id=61352
     7
     8        No new tests because no behavior changes.
     9
     10        * html/shadow/MediaControlElements.cpp:
     11        (WebCore::RenderMediaVolumeSliderContainer::layout):
     12        * page/FrameView.cpp:
     13        (WebCore::FrameView::layout):
     14        * rendering/RenderBlock.cpp:
     15        (WebCore::RenderBlock::repaintOverhangingFloats):
     16        (WebCore::RenderBlock::updateFirstLetter):
     17        * rendering/RenderLayer.cpp:
     18        (WebCore::RenderLayer::updateLayerPositions):
     19        (WebCore::RenderLayer::updateScrollInfoAfterLayout):
     20        * rendering/RenderListBox.cpp:
     21        (WebCore::RenderListBox::layout):
     22        * rendering/RenderListItem.cpp:
     23        (WebCore::RenderListItem::updateMarkerLocation):
     24        * rendering/RenderMedia.cpp:
     25        (WebCore::RenderMedia::layout):
     26        * rendering/RenderView.h:
     27        (WebCore::RenderView::disableLayoutState):
     28        (WebCore::RenderView::enableLayoutState):
     29        (WebCore::LayoutStateDisabler::LayoutStateDisabler):
     30        (WebCore::LayoutStateDisabler::~LayoutStateDisabler):
     31        * rendering/svg/RenderSVGRoot.cpp:
     32        (WebCore::RenderSVGRoot::layout):
     33
    1342011-05-24  Csaba Osztrogonác  <ossy@webkit.org>
    235
  • trunk/Source/WebCore/html/shadow/MediaControlElements.cpp

    r84336 r87277  
    168168    RenderBox* buttonBox = toRenderBox(previousSibling());
    169169
    170     if (view())
    171         view()->disableLayoutState();
     170    LayoutStateDisabler layoutStateDisabler(view());
    172171
    173172    IntPoint offset = theme()->volumeSliderOffsetFromMuteButton(buttonBox, IntSize(width(), height()));
    174173    setX(offset.x() + buttonBox->offsetLeft());
    175174    setY(offset.y() + buttonBox->offsetTop());
    176 
    177     if (view())
    178         view()->enableLayoutState();
    179175}
    180176
  • trunk/Source/WebCore/page/FrameView.cpp

    r87187 r87277  
    979979    m_actionScheduler->pause();
    980980
    981     bool disableLayoutState = false;
    982     if (subtree) {
    983         RenderView* view = root->view();
    984         disableLayoutState = view->shouldDisableLayoutStateForSubtree(root);
    985         view->pushLayoutState(root);
    986         if (disableLayoutState)
    987             view->disableLayoutState();
    988     }
    989        
    990     m_inLayout = true;
    991     beginDeferredRepaints();
    992     root->layout();
    993     endDeferredRepaints();
    994     m_inLayout = false;
    995 
    996     if (subtree) {
    997         RenderView* view = root->view();
    998         view->popLayoutState(root);
    999         if (disableLayoutState)
    1000             view->enableLayoutState();
     981    {
     982        bool disableLayoutState = false;
     983        if (subtree) {
     984            RenderView* view = root->view();
     985            disableLayoutState = view->shouldDisableLayoutStateForSubtree(root);
     986            view->pushLayoutState(root);
     987        }
     988        LayoutStateDisabler layoutStateDisabler(disableLayoutState ? root->view() : 0);
     989
     990        m_inLayout = true;
     991        beginDeferredRepaints();
     992        root->layout();
     993        endDeferredRepaints();
     994        m_inLayout = false;
     995
     996        if (subtree)
     997            root->view()->popLayoutState(root);
    1001998    }
    1002999    m_layoutRoot = 0;
  • trunk/Source/WebCore/rendering/RenderBlock.cpp

    r87152 r87277  
    22262226    // FIXME: Avoid disabling LayoutState. At the very least, don't disable it for floats originating
    22272227    // in this block. Better yet would be to push extra state for the containers of other floats.
    2228     view()->disableLayoutState();
     2228    LayoutStateDisabler layoutStateDisabler(view());
    22292229    FloatingObjectSet& floatingObjectSet = m_floatingObjects->set();
    22302230    FloatingObjectSetIterator end = floatingObjectSet.end();
     
    22392239        }
    22402240    }
    2241     view()->enableLayoutState();
    22422241}
    22432242 
     
    53525351
    53535352            // Move the first letter into the new renderer.
    5354             view()->disableLayoutState();
     5353            LayoutStateDisabler layoutStateDisabler(view());
    53555354            while (RenderObject* child = firstLetter->firstChild()) {
    53565355                if (child->isText())
     
    53595358                newFirstLetter->addChild(child, 0);
    53605359            }
    5361            
     5360
    53625361            RenderTextFragment* remainingText = 0;
    53635362            RenderObject* nextSibling = firstLetter->nextSibling();
     
    53785377            firstLetter = newFirstLetter;
    53795378            firstLetterContainer->addChild(firstLetter, nextSibling);
    5380             view()->enableLayoutState();
    53815379        } else
    53825380            firstLetter->setStyle(pseudoStyle);
     
    53985396    // Our layout state is not valid for the repaints we are going to trigger by
    53995397    // adding and removing children of firstLetterContainer.
    5400     view()->disableLayoutState();
     5398    LayoutStateDisabler layoutStateDisabler(view());
    54015399
    54025400    RenderText* textObj = toRenderText(currChild);
     
    54615459        textObj->destroy();
    54625460    }
    5463     view()->enableLayoutState();
    54645461}
    54655462
  • trunk/Source/WebCore/rendering/RenderLayer.cpp

    r86584 r87277  
    310310        RenderView* view = renderer()->view();
    311311        ASSERT(view);
    312         // FIXME: Optimize using LayoutState and remove the disableLayoutState() call
     312        // FIXME: Optimize using LayoutState and remove LayoutStateDisabler instantiation
    313313        // from updateScrollInfoAfterLayout().
    314314        ASSERT(!view->layoutStateEnabled());
     
    21822182            // scrollToOffset() may call updateLayerPositions(), which doesn't work
    21832183            // with LayoutState.
    2184             // FIXME: Remove the disableLayoutState/enableLayoutState if the above changes.
    2185             if (view)
    2186                 view->disableLayoutState();
     2184            // FIXME: Remove the LayoutStateDisabler instantiation if the above changes.
     2185            LayoutStateDisabler layoutStateDisabler(view);
    21872186            scrollToOffset(newX, newY);
    2188             if (view)
    2189                 view->enableLayoutState();
    21902187        }
    21912188    }
     
    22622259 
    22632260    RenderView* view = renderer()->view();
    2264     view->disableLayoutState();
    2265     scrollToOffset(scrollXOffset(), scrollYOffset());
    2266     view->enableLayoutState();
    2267  
     2261    {
     2262        LayoutStateDisabler layoutStateDisabler(view);
     2263        scrollToOffset(scrollXOffset(), scrollYOffset());
     2264    }
     2265
    22682266    if (renderer()->node() && renderer()->document()->hasListenerType(Document::OVERFLOWCHANGED_LISTENER))
    22692267        updateOverflowStatus(horizontalOverflow, verticalOverflow);
  • trunk/Source/WebCore/rendering/RenderListBox.cpp

    r87152 r87277  
    151151    RenderBlock::layout();
    152152    if (m_scrollToRevealSelectionAfterLayout) {
    153         view()->disableLayoutState();
     153        LayoutStateDisabler layoutStateDisabler(view());
    154154        scrollToRevealSelection();
    155         view()->enableLayoutState();
    156155    }
    157156}
  • trunk/Source/WebCore/rendering/RenderListItem.cpp

    r82611 r87277  
    214214            // Removing and adding the marker can trigger repainting in
    215215            // containers other than ourselves, so we need to disable LayoutState.
    216             view()->disableLayoutState();
     216            LayoutStateDisabler layoutStateDisabler(view());
    217217            updateFirstLetter();
    218218            m_marker->remove();
     
    222222            if (m_marker->preferredLogicalWidthsDirty())
    223223                m_marker->computePreferredLogicalWidths();
    224             view()->enableLayoutState();
    225224        }
    226225    }
  • trunk/Source/WebCore/rendering/RenderMedia.cpp

    r86395 r87277  
    7171
    7272    // When calling layout() on a child node, a parent must either push a LayoutStateMaintainter, or
    73     // call view()->disableLayoutState(). Since using a LayoutStateMaintainer is slightly more efficient,
     73    // instantiate LayoutStateDisabler. Since using a LayoutStateMaintainer is slightly more efficient,
    7474    // and this method will be called many times per second during playback, use a LayoutStateMaintainer:
    7575    LayoutStateMaintainer statePusher(view(), this, IntSize(x(), y()), hasTransform() || hasReflection() || style()->isFlippedBlocksWritingMode());
  • trunk/Source/WebCore/rendering/RenderView.h

    r86632 r87277  
    126126    LayoutState* layoutState() const { return m_layoutState; }
    127127
    128     // Suspends the LayoutState optimization. Used under transforms that cannot be represented by
    129     // LayoutState (common in SVG) and when manipulating the render tree during layout in ways
    130     // that can trigger repaint of a non-child (e.g. when a list item moves its list marker around).
    131     // Note that even when disabled, LayoutState is still used to store layoutDelta.
    132     void disableLayoutState() { m_layoutStateDisableCount++; }
    133     void enableLayoutState() { ASSERT(m_layoutStateDisableCount > 0); m_layoutStateDisableCount--; }
    134 
    135128    virtual void updateHitTestResult(HitTestResult&, const IntPoint&);
    136129
     
    196189    }
    197190
     191    // Suspends the LayoutState optimization. Used under transforms that cannot be represented by
     192    // LayoutState (common in SVG) and when manipulating the render tree during layout in ways
     193    // that can trigger repaint of a non-child (e.g. when a list item moves its list marker around).
     194    // Note that even when disabled, LayoutState is still used to store layoutDelta.
     195    // These functions may only be accessed by LayoutStateMaintainer or LayoutStateDisabler.
     196    void disableLayoutState() { m_layoutStateDisableCount++; }
     197    void enableLayoutState() { ASSERT(m_layoutStateDisableCount > 0); m_layoutStateDisableCount--; }
     198
    198199    size_t getRetainedWidgets(Vector<RenderWidget*>&);
    199200    void releaseWidgets(Vector<RenderWidget*>&);
    200201   
    201202    friend class LayoutStateMaintainer;
     203    friend class LayoutStateDisabler;
    202204       
    203205protected:
     
    322324};
    323325
     326class LayoutStateDisabler {
     327    WTF_MAKE_NONCOPYABLE(LayoutStateDisabler);
     328public:
     329    LayoutStateDisabler(RenderView* view)
     330        : m_view(view)
     331    {
     332        if (m_view)
     333            m_view->disableLayoutState();
     334    }
     335
     336    ~LayoutStateDisabler()
     337    {
     338        if (m_view)
     339            m_view->enableLayoutState();
     340    }
     341private:
     342    RenderView* m_view;
     343};
     344
    324345} // namespace WebCore
    325346
  • trunk/Source/WebCore/rendering/svg/RenderSVGRoot.cpp

    r87027 r87277  
    104104
    105105    // Arbitrary affine transforms are incompatible with LayoutState.
    106     view()->disableLayoutState();
     106    LayoutStateDisabler layoutStateDisabler(view());
    107107
    108108    bool needsLayout = selfNeedsLayout();
     
    129129    repainter.repaintAfterLayout();
    130130
    131     view()->enableLayoutState();
    132131    setNeedsLayout(false);
    133132}
Note: See TracChangeset for help on using the changeset viewer.