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