Index: third_party/WebKit/Source/core/layout/LayoutState.cpp |
diff --git a/third_party/WebKit/Source/core/layout/LayoutState.cpp b/third_party/WebKit/Source/core/layout/LayoutState.cpp |
index b00feb3c958cc61d62065d830f1180650c2f77ad..7113fbf9055357458af43687a7d0f9f7599e7b37 100644 |
--- a/third_party/WebKit/Source/core/layout/LayoutState.cpp |
+++ b/third_party/WebKit/Source/core/layout/LayoutState.cpp |
@@ -60,64 +60,53 @@ LayoutState::LayoutState(LayoutBox& layoutObject, |
else |
m_flowThread = nullptr; |
layoutObject.view()->pushLayoutState(*this); |
- bool fixed = layoutObject.isOutOfFlowPositioned() && |
- layoutObject.style()->position() == FixedPosition; |
- if (fixed) { |
- // FIXME: This doesn't work correctly with transforms. |
- FloatPoint fixedOffset = |
- layoutObject.view()->localToAbsolute(FloatPoint(), IsFixed); |
- m_layoutOffset = LayoutSize(fixedOffset.x(), fixedOffset.y()) + offset; |
- } else { |
- m_layoutOffset = m_next->m_layoutOffset + offset; |
- } |
m_heightOffsetForTableHeaders = m_next->heightOffsetForTableHeaders(); |
- if (layoutObject.isOutOfFlowPositioned() && !fixed) { |
- if (LayoutObject* container = layoutObject.container()) { |
- if (container->style()->hasInFlowPosition() && |
- container->isLayoutInline()) |
- m_layoutOffset += |
- toLayoutInline(container)->offsetForInFlowPositionedInline( |
- layoutObject); |
- } |
- } |
- // If we establish a new page height, then cache the offset to the top of the |
- // first page. We can compare this later on to figure out what part of the |
- // page we're actually on. |
if (pageLogicalHeight || layoutObject.isLayoutFlowThread()) { |
+ // Entering a new pagination context. |
m_pageLogicalHeight = pageLogicalHeight; |
- bool isFlipped = layoutObject.style()->isFlippedBlocksWritingMode(); |
- m_pageOffset = LayoutSize( |
- m_layoutOffset.width() + |
- (!isFlipped |
- ? layoutObject.borderLeft() + layoutObject.paddingLeft() |
- : layoutObject.borderRight() + layoutObject.paddingRight()), |
- m_layoutOffset.height() + |
- (!isFlipped |
- ? layoutObject.borderTop() + layoutObject.paddingTop() |
- : layoutObject.borderBottom() + layoutObject.paddingBottom())); |
m_pageLogicalHeightChanged = pageLogicalHeightChanged; |
+ m_paginationOffset = LayoutSize(); |
m_isPaginated = true; |
- } else if (m_layoutObject.isSVG() && !m_layoutObject.isSVGRoot()) { |
- // Pagination inside SVG is not allowed. |
+ return; |
+ } |
+ |
+ // Disable pagination for objects we don't support. For now this includes |
+ // overflow:scroll/auto, inline blocks and writing mode roots. Additionally, |
+ // pagination inside SVG is not allowed. |
+ if (layoutObject.getPaginationBreakability() == LayoutBox::ForbidBreaks || |
+ (m_layoutObject.isSVG() && !m_layoutObject.isSVGRoot())) { |
m_flowThread = nullptr; |
+ m_pageLogicalHeight = LayoutUnit(); |
m_pageLogicalHeightChanged = false; |
m_isPaginated = false; |
- } else { |
- // If we don't establish a new page height, then propagate the old page |
- // height and offset down. |
- m_pageLogicalHeight = m_next->m_pageLogicalHeight; |
- m_pageLogicalHeightChanged = m_next->m_pageLogicalHeightChanged; |
- m_pageOffset = m_next->m_pageOffset; |
- |
- // Disable pagination for objects we don't support. For now this includes |
- // overflow:scroll/auto, inline blocks and writing mode roots. |
- if (layoutObject.getPaginationBreakability() == LayoutBox::ForbidBreaks) { |
- m_flowThread = nullptr; |
- m_pageLogicalHeight = LayoutUnit(); |
- m_isPaginated = false; |
- } else { |
- m_isPaginated = m_pageLogicalHeight || m_flowThread; |
+ return; |
+ } |
+ |
+ // Propagate the old page height and offset down. |
+ m_pageLogicalHeight = m_next->m_pageLogicalHeight; |
+ m_pageLogicalHeightChanged = m_next->m_pageLogicalHeightChanged; |
+ |
+ m_isPaginated = m_pageLogicalHeight || m_flowThread; |
+ if (!m_isPaginated) |
+ return; |
+ |
+ // Now adjust the pagination offset, so that we can easily figure out how far |
+ // away we are from the start of the pagination context. |
+ m_paginationOffset = m_next->m_paginationOffset; |
+ bool fixed = layoutObject.isOutOfFlowPositioned() && |
+ layoutObject.style()->position() == FixedPosition; |
+ if (fixed) |
+ return; |
+ m_paginationOffset = m_next->m_paginationOffset + offset; |
+ if (!layoutObject.isOutOfFlowPositioned()) |
+ return; |
+ if (LayoutObject* container = layoutObject.container()) { |
+ if (container->style()->hasInFlowPosition() && |
+ container->isLayoutInline()) { |
+ m_paginationOffset += |
+ toLayoutInline(container)->offsetForInFlowPositionedInline( |
+ layoutObject); |
} |
} |
@@ -138,11 +127,6 @@ LayoutState::LayoutState(LayoutObject& root) |
return; |
root.view()->pushLayoutState(*this); |
- |
- LayoutObject* container = root.container(); |
- FloatPoint absContentPoint = |
- container->localToAbsolute(FloatPoint(), UseTransforms); |
- m_layoutOffset = LayoutSize(absContentPoint.x(), absContentPoint.y()); |
} |
LayoutState::~LayoutState() { |
@@ -156,8 +140,8 @@ LayoutUnit LayoutState::pageLogicalOffset( |
const LayoutBox& child, |
const LayoutUnit& childLogicalOffset) const { |
if (child.isHorizontalWritingMode()) |
- return m_layoutOffset.height() + childLogicalOffset - m_pageOffset.height(); |
- return m_layoutOffset.width() + childLogicalOffset - m_pageOffset.width(); |
+ return m_paginationOffset.height() + childLogicalOffset; |
+ return m_paginationOffset.width() + childLogicalOffset; |
} |
} // namespace blink |