| Index: third_party/WebKit/Source/core/layout/LayoutBlockFlow.cpp
|
| diff --git a/third_party/WebKit/Source/core/layout/LayoutBlockFlow.cpp b/third_party/WebKit/Source/core/layout/LayoutBlockFlow.cpp
|
| index 32c4ec825b50ed29f87cfa3b9aa4278e39891c2c..c115299d3723ac3e6b5eea4eebd0e784799e0867 100644
|
| --- a/third_party/WebKit/Source/core/layout/LayoutBlockFlow.cpp
|
| +++ b/third_party/WebKit/Source/core/layout/LayoutBlockFlow.cpp
|
| @@ -737,7 +737,7 @@ LayoutUnit LayoutBlockFlow::adjustBlockChildForPagination(LayoutUnit logicalTop,
|
| return newLogicalTop;
|
| }
|
|
|
| -static inline bool shouldSetStrutOnBlock(const LayoutBlockFlow& block, const RootInlineBox& lineBox, LayoutUnit lineLogicalOffset, int lineIndex, LayoutUnit remainingLogicalHeight)
|
| +static bool shouldSetStrutOnBlock(const LayoutBlockFlow& block, const RootInlineBox& lineBox, LayoutUnit lineLogicalOffset, int lineIndex, LayoutUnit remainingLogicalHeight)
|
| {
|
| bool wantsStrutOnBlock = false;
|
| if (!block.style()->hasAutoOrphans() && block.style()->orphans() >= lineIndex) {
|
| @@ -762,6 +762,14 @@ static inline bool shouldSetStrutOnBlock(const LayoutBlockFlow& block, const Roo
|
| return wantsStrutOnBlock && block.allowsPaginationStrut();
|
| }
|
|
|
| +static LayoutUnit calculateStrutForPropagation(const LayoutBlockFlow& blockFlow, LayoutUnit lineLogicalOffset)
|
| +{
|
| + LayoutUnit paginationStrut = std::max<LayoutUnit>(LayoutUnit(), lineLogicalOffset);
|
| + if (blockFlow.isFloating())
|
| + paginationStrut += blockFlow.marginBefore(); // Floats' margins do not collapse with page or column boundaries.
|
| + return paginationStrut;
|
| +}
|
| +
|
| void LayoutBlockFlow::adjustLinePositionForPagination(RootInlineBox& lineBox, LayoutUnit& delta)
|
| {
|
| // TODO(mstensho): Pay attention to line overflow. It should be painted in the same column as
|
| @@ -805,10 +813,7 @@ void LayoutBlockFlow::adjustLinePositionForPagination(RootInlineBox& lineBox, La
|
| // content-less portions (struts) at the beginning of a block before a break, if it can
|
| // be avoided. After all, that's the reason for setting struts on blocks and not lines
|
| // in the first place.
|
| - LayoutUnit paginationStrut = remainingLogicalHeight + std::max<LayoutUnit>(0, logicalOffset);
|
| - if (isFloating())
|
| - paginationStrut += marginBefore(); // Floats' margins do not collapse with page or column boundaries.
|
| - setPaginationStrutPropagatedFromChild(paginationStrut);
|
| + setPaginationStrutPropagatedFromChild(calculateStrutForPropagation(*this, remainingLogicalHeight + logicalOffset));
|
| } else {
|
| logicalOffset += remainingLogicalHeight;
|
| delta += remainingLogicalHeight;
|
| @@ -819,6 +824,27 @@ void LayoutBlockFlow::adjustLinePositionForPagination(RootInlineBox& lineBox, La
|
| // We're at the very top of a page or column.
|
| if (lineBox != firstRootBox())
|
| lineBox.setIsFirstAfterPageBreak(true);
|
| + // If this is the first line in the block, and the block has a top border, padding, or (in
|
| + // case it's a float) margin, we may want to set a strut on the block, so that everything
|
| + // ends up in the next column or page. Setting a strut on the block is also important when
|
| + // it comes to satisfying orphan requirements.
|
| + if (shouldSetStrutOnBlock(*this, lineBox, logicalOffset, lineIndex, remainingLogicalHeight))
|
| + setPaginationStrutPropagatedFromChild(calculateStrutForPropagation(*this, logicalOffset));
|
| + } else if (lineBox == firstRootBox() && allowsPaginationStrut()) {
|
| + // This is the first line in the block. The block may still start in the previous column or
|
| + // page, and if that's the case, attempt to pull it over to where this line is, so that we
|
| + // don't split the top border, padding, or (in case it's a float) margin.
|
| + LayoutUnit totalLogicalOffset = logicalOffset;
|
| + if (isFloating())
|
| + totalLogicalOffset += marginBefore(); // Floats' margins do not collapse with page or column boundaries.
|
| + LayoutUnit strut = remainingLogicalHeight + totalLogicalOffset - pageLogicalHeight;
|
| + if (strut > 0) {
|
| + // The block starts in a previous column or page. Set a strut on the block if there's
|
| + // room for the top border, padding and (if it's a float) margin and the line in one
|
| + // column or page.
|
| + if (totalLogicalOffset + lineHeight <= pageLogicalHeight)
|
| + setPaginationStrutPropagatedFromChild(strut);
|
| + }
|
| }
|
|
|
| paginatedContentWasLaidOut(logicalOffset);
|
|
|