Index: Source/core/rendering/LayoutState.cpp |
diff --git a/Source/core/rendering/LayoutState.cpp b/Source/core/rendering/LayoutState.cpp |
index 49e59d09c4dfcc1d6320a6f98237dade3fc716b0..45c0d76f1accc00b7710159e49404018a85a24ce 100644 |
--- a/Source/core/rendering/LayoutState.cpp |
+++ b/Source/core/rendering/LayoutState.cpp |
@@ -33,22 +33,39 @@ |
namespace WebCore { |
-LayoutState::LayoutState(LayoutState* prev, RenderBox& renderer, const LayoutSize& offset, LayoutUnit pageLogicalHeight, bool pageLogicalHeightChanged, ColumnInfo* columnInfo) |
- : m_columnInfo(columnInfo) |
- , m_next(prev) |
-#ifndef NDEBUG |
- , m_renderer(&renderer) |
+LayoutState::LayoutState(LayoutUnit pageLogicalHeight, bool pageLogicalHeightChanged, RenderView& view) |
+ : m_clipped(false) |
+ , m_isPaginated(pageLogicalHeight) |
+ , m_pageLogicalHeightChanged(pageLogicalHeightChanged) |
+ , m_cachedOffsetsEnabled(true) |
+#if ASSERT_ENABLED |
+ , m_layoutDeltaXSaturated(false) |
+ , m_layoutDeltaYSaturated(false) |
#endif |
+ , m_columnInfo(0) |
+ , m_next(0) |
+ , m_pageLogicalHeight(pageLogicalHeight) |
+ , m_renderer(view) |
{ |
- ASSERT(m_next); |
+ ASSERT(!view.layoutState()); |
+ view.pushLayoutState(*this); |
+} |
+LayoutState::LayoutState(RenderBox& renderer, const LayoutSize& offset, LayoutUnit pageLogicalHeight, bool pageLogicalHeightChanged, ColumnInfo* columnInfo) |
+ : m_columnInfo(columnInfo) |
+ , m_next(renderer.view()->layoutState()) |
+ , m_renderer(renderer) |
+{ |
Julien - ping for review
2014/06/17 23:34:25
Should we add ASSERT(m_renderer.view()->layoutStat
leviw_travelin_and_unemployed
2014/06/17 23:37:04
Sure.
|
+ renderer.view()->pushLayoutState(*this); |
+ m_cachedOffsetsEnabled = m_next->m_cachedOffsetsEnabled && renderer.supportsLayoutStateCachedOffsets(); |
bool fixed = renderer.isOutOfFlowPositioned() && renderer.style()->position() == FixedPosition; |
if (fixed) { |
// FIXME: This doesn't work correctly with transforms. |
FloatPoint fixedOffset = renderer.view()->localToAbsolute(FloatPoint(), IsFixed); |
m_paintOffset = LayoutSize(fixedOffset.x(), fixedOffset.y()) + offset; |
- } else |
- m_paintOffset = prev->m_paintOffset + offset; |
+ } else { |
+ m_paintOffset = m_next->m_paintOffset + offset; |
+ } |
if (renderer.isOutOfFlowPositioned() && !fixed) { |
if (RenderObject* container = renderer.container()) { |
@@ -62,9 +79,9 @@ LayoutState::LayoutState(LayoutState* prev, RenderBox& renderer, const LayoutSiz |
if (renderer.isInFlowPositioned() && renderer.hasLayer()) |
m_paintOffset += renderer.layer()->offsetForInFlowPosition(); |
- m_clipped = !fixed && prev->m_clipped; |
+ m_clipped = !fixed && m_next->m_clipped; |
if (m_clipped) |
- m_clipRect = prev->m_clipRect; |
+ m_clipRect = m_next->m_clipRect; |
if (renderer.hasOverflowClip()) { |
LayoutSize deltaSize = RuntimeEnabledFeatures::repaintAfterLayoutEnabled() ? LayoutSize() : renderer.view()->layoutDelta(); |
@@ -119,21 +136,39 @@ LayoutState::LayoutState(LayoutState* prev, RenderBox& renderer, const LayoutSiz |
// FIXME: <http://bugs.webkit.org/show_bug.cgi?id=13443> Apply control clip if present. |
} |
+inline static bool shouldDisableLayoutStateForSubtree(RenderObject& renderer) |
+{ |
+ RenderObject* object = &renderer; |
+ while (object) { |
+ if (object->supportsLayoutStateCachedOffsets()) |
+ return true; |
+ object = object->container(); |
+ } |
+ return false; |
+} |
+ |
LayoutState::LayoutState(RenderObject& root) |
: m_clipped(false) |
, m_isPaginated(false) |
, m_pageLogicalHeightChanged(false) |
+ , m_cachedOffsetsEnabled(shouldDisableLayoutStateForSubtree(root)) |
Julien - ping for review
2014/06/17 23:34:26
That potentially makes the code O(depth_of_tree^2)
leviw_travelin_and_unemployed
2014/06/17 23:37:04
This is only created in FrameView for a sub-tree r
|
#if ASSERT_ENABLED |
, m_layoutDeltaXSaturated(false) |
, m_layoutDeltaYSaturated(false) |
#endif |
, m_columnInfo(0) |
- , m_next(0) |
+ , m_next(root.view()->layoutState()) |
, m_pageLogicalHeight(0) |
-#ifndef NDEBUG |
- , m_renderer(&root) |
-#endif |
+ , m_renderer(root) |
{ |
+ // FIXME: Why does RenderTableSection create this wonky LayoutState? |
Julien - ping for review
2014/06/17 23:34:26
RenderTableSections are definitely not special in
|
+ ASSERT(!m_next || root.isTableSection()); |
+ // We'll end up pushing in RenderView itself, so don't bother adding it. |
+ if (root.isRenderView()) |
+ return; |
+ |
+ root.view()->pushLayoutState(*this); |
+ |
RenderObject* container = root.container(); |
FloatPoint absContentPoint = container->localToAbsolute(FloatPoint(), UseTransforms); |
m_paintOffset = LayoutSize(absContentPoint.x(), absContentPoint.y()); |
@@ -146,14 +181,12 @@ LayoutState::LayoutState(RenderObject& root) |
} |
} |
-void* LayoutState::operator new(size_t sz) |
-{ |
- return partitionAlloc(Partitions::getRenderingPartition(), sz); |
-} |
- |
-void LayoutState::operator delete(void* ptr) |
+LayoutState::~LayoutState() |
{ |
- partitionFree(ptr); |
+ if (m_renderer.view()->layoutState()) { |
Julien - ping for review
2014/06/17 23:34:25
Nit:
if (LayoutState* currentLayoutState = m_rend
|
+ ASSERT(m_renderer.view()->layoutState() == this); |
+ m_renderer.view()->popLayoutState(); |
+ } |
} |
void LayoutState::clearPaginationInformation() |