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