| Index: Source/core/rendering/RenderView.h
|
| diff --git a/Source/core/rendering/RenderView.h b/Source/core/rendering/RenderView.h
|
| index 53a1bb05de11ab97a358caa30ad5d011b994ff0b..d7be0bf07ff373b1f5c2b6e9359ab205427f90bc 100644
|
| --- a/Source/core/rendering/RenderView.h
|
| +++ b/Source/core/rendering/RenderView.h
|
| @@ -139,11 +139,18 @@ public:
|
|
|
| bool doingFullRepaint() const { return m_frameView->needsFullRepaint(); }
|
|
|
| - // Subtree push/pop
|
| - void pushLayoutState(RenderObject*);
|
| - void popLayoutState(RenderObject*) { return popLayoutState(); } // Just doing this to keep popLayoutState() private and to make the subtree calls symmetrical.
|
| + // Subtree push
|
| + void pushLayoutState(RenderObject&);
|
|
|
| - bool shouldDisableLayoutStateForSubtree(RenderObject*) const;
|
| + void popLayoutState()
|
| + {
|
| + LayoutState* state = m_layoutState;
|
| + m_layoutState = state->m_next;
|
| + delete state;
|
| + popLayoutStateForCurrentFlowThread();
|
| + }
|
| +
|
| + bool shouldDisableLayoutStateForSubtree(RenderObject&) const;
|
|
|
| // Returns true if layoutState should be used for its cached offset and clip.
|
| bool layoutStateEnabled() const { return m_layoutStateDisableCount == 0 && m_layoutState; }
|
| @@ -194,6 +201,14 @@ public:
|
| double layoutViewportWidth() const;
|
| double layoutViewportHeight() const;
|
|
|
| + // 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--; }
|
| +
|
| private:
|
| virtual void mapLocalToContainer(const RenderLayerModelObject* repaintContainer, TransformState&, MapCoordinatesFlags = ApplyContainerFlip, bool* wasFixed = 0) const OVERRIDE;
|
| virtual const RenderObject* pushMappingToContainer(const RenderLayerModelObject* ancestorToStopAt, RenderGeometryMap&) const OVERRIDE;
|
| @@ -207,12 +222,12 @@ private:
|
| bool rootFillsViewportBackground(RenderBox* rootBox) const;
|
|
|
| // These functions may only be accessed by LayoutStateMaintainer.
|
| - bool pushLayoutState(RenderBox* renderer, const LayoutSize& offset, LayoutUnit pageHeight = 0, bool pageHeightChanged = false, ColumnInfo* colInfo = 0)
|
| + bool pushLayoutState(RenderBox& renderer, const LayoutSize& offset, LayoutUnit pageHeight = 0, bool pageHeightChanged = false, ColumnInfo* colInfo = 0)
|
| {
|
| // We push LayoutState even if layoutState is disabled because it stores layoutDelta too.
|
| - if (!doingFullRepaint() || m_layoutState->isPaginated() || renderer->hasColumns() || renderer->flowThreadContainingBlock()
|
| - || (renderer->isRenderBlock() && toRenderBlock(renderer)->shapeInsideInfo())
|
| - || (m_layoutState->shapeInsideInfo() && renderer->isRenderBlock() && !toRenderBlock(renderer)->allowsShapeInsideInfoSharing(m_layoutState->shapeInsideInfo()->owner()))
|
| + if (!doingFullRepaint() || m_layoutState->isPaginated() || renderer.hasColumns() || renderer.flowThreadContainingBlock()
|
| + || (renderer.isRenderBlock() && toRenderBlock(renderer).shapeInsideInfo())
|
| + || (m_layoutState->shapeInsideInfo() && renderer.isRenderBlock() && !toRenderBlock(renderer).allowsShapeInsideInfoSharing(m_layoutState->shapeInsideInfo()->owner()))
|
| ) {
|
| pushLayoutStateForCurrentFlowThread(renderer);
|
| m_layoutState = new LayoutState(m_layoutState, renderer, offset, pageHeight, pageHeightChanged, colInfo);
|
| @@ -221,22 +236,6 @@ private:
|
| return false;
|
| }
|
|
|
| - void popLayoutState()
|
| - {
|
| - LayoutState* state = m_layoutState;
|
| - m_layoutState = state->m_next;
|
| - delete state;
|
| - popLayoutStateForCurrentFlowThread();
|
| - }
|
| -
|
| - // 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--; }
|
| -
|
| void layoutContent(const LayoutState&);
|
| #ifndef NDEBUG
|
| void checkLayoutState(const LayoutState&);
|
| @@ -245,7 +244,7 @@ private:
|
| void positionDialog(RenderBox*);
|
| void positionDialogs();
|
|
|
| - void pushLayoutStateForCurrentFlowThread(const RenderObject*);
|
| + void pushLayoutStateForCurrentFlowThread(const RenderObject&);
|
| void popLayoutStateForCurrentFlowThread();
|
|
|
| friend class LayoutStateMaintainer;
|
| @@ -283,9 +282,9 @@ class LayoutStateMaintainer {
|
| WTF_MAKE_NONCOPYABLE(LayoutStateMaintainer);
|
| public:
|
| // ctor to push now
|
| - LayoutStateMaintainer(RenderBox* root, LayoutSize offset, LayoutUnit pageHeight = 0, bool pageHeightChanged = false, ColumnInfo* colInfo = 0)
|
| - : m_view(root->view())
|
| - , m_disabled(root->shouldDisableLayoutState())
|
| + explicit LayoutStateMaintainer(RenderBox& root, const LayoutSize& offset, LayoutUnit pageHeight = 0, bool pageHeightChanged = false, ColumnInfo* colInfo = 0)
|
| + : m_view(*root.view())
|
| + , m_disabled(root.shouldDisableLayoutState())
|
| , m_didStart(false)
|
| , m_didEnd(false)
|
| , m_didCreateLayoutState(false)
|
| @@ -294,8 +293,8 @@ public:
|
| }
|
|
|
| // ctor to maybe push later
|
| - LayoutStateMaintainer(RenderBox* root)
|
| - : m_view(root->view())
|
| + explicit LayoutStateMaintainer(RenderBox& root)
|
| + : m_view(*root.view())
|
| , m_disabled(false)
|
| , m_didStart(false)
|
| , m_didEnd(false)
|
| @@ -308,13 +307,13 @@ public:
|
| ASSERT(m_didStart == m_didEnd); // if this fires, it means that someone did a push(), but forgot to pop().
|
| }
|
|
|
| - void push(RenderBox* root, LayoutSize offset, LayoutUnit pageHeight = 0, bool pageHeightChanged = false, ColumnInfo* colInfo = 0)
|
| + void push(RenderBox& root, const LayoutSize& offset, LayoutUnit pageHeight = 0, bool pageHeightChanged = false, ColumnInfo* colInfo = 0)
|
| {
|
| ASSERT(!m_didStart);
|
| // We push state even if disabled, because we still need to store layoutDelta
|
| - m_didCreateLayoutState = m_view->pushLayoutState(root, offset, pageHeight, pageHeightChanged, colInfo);
|
| + m_didCreateLayoutState = m_view.pushLayoutState(root, offset, pageHeight, pageHeightChanged, colInfo);
|
| if (m_disabled && m_didCreateLayoutState)
|
| - m_view->disableLayoutState();
|
| + m_view.disableLayoutState();
|
| m_didStart = true;
|
| }
|
|
|
| @@ -323,9 +322,9 @@ public:
|
| if (m_didStart) {
|
| ASSERT(!m_didEnd);
|
| if (m_didCreateLayoutState) {
|
| - m_view->popLayoutState();
|
| + m_view.popLayoutState();
|
| if (m_disabled)
|
| - m_view->enableLayoutState();
|
| + m_view.enableLayoutState();
|
| }
|
|
|
| m_didEnd = true;
|
| @@ -335,7 +334,7 @@ public:
|
| bool didPush() const { return m_didStart; }
|
|
|
| private:
|
| - RenderView* m_view;
|
| + RenderView& m_view;
|
| bool m_disabled : 1; // true if the offset and clip part of layoutState is disabled
|
| bool m_didStart : 1; // true if we did a push or disable
|
| bool m_didEnd : 1; // true if we popped or re-enabled
|
| @@ -345,20 +344,18 @@ private:
|
| class LayoutStateDisabler {
|
| WTF_MAKE_NONCOPYABLE(LayoutStateDisabler);
|
| public:
|
| - LayoutStateDisabler(RenderView* view)
|
| - : m_view(view)
|
| + LayoutStateDisabler(const RenderBox& root)
|
| + : m_view(*root.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
|
|
|