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);
}