Chromium Code Reviews| Index: Source/core/layout/LayoutBlockFlow.cpp |
| diff --git a/Source/core/layout/LayoutBlockFlow.cpp b/Source/core/layout/LayoutBlockFlow.cpp |
| index 2318e6c9ea19f7e7a9a3e50e027107ba06936955..cb5fd36327d94a14d684da0d80ef435084120eab 100644 |
| --- a/Source/core/layout/LayoutBlockFlow.cpp |
| +++ b/Source/core/layout/LayoutBlockFlow.cpp |
| @@ -774,15 +774,42 @@ void LayoutBlockFlow::adjustLinePositionForPagination(RootInlineBox& lineBox, La |
| int lineIndex = lineCount(&lineBox); |
| if (remainingLogicalHeight < lineHeight || (shouldBreakAtLineToAvoidWidow() && lineBreakToAvoidWidow() == lineIndex)) { |
| + // We need to insert a break now, either because there's no room for the line in the |
| + // current column / page, or because we have determined that we need a break to satisfy |
| + // widow requirements. |
| if (shouldBreakAtLineToAvoidWidow() && lineBreakToAvoidWidow() == lineIndex) { |
| clearShouldBreakAtLineToAvoidWidow(); |
| setDidBreakAtLineToAvoidWidow(); |
| } |
| - LayoutUnit totalLogicalHeight = lineHeight + std::max<LayoutUnit>(0, logicalOffset); |
| - LayoutUnit pageLogicalHeightAtNewOffset = pageLogicalHeightForOffset(logicalOffset + remainingLogicalHeight); |
| setPageBreak(logicalOffset, lineHeight - remainingLogicalHeight); |
| - if (((lineBox == firstRootBox() && totalLogicalHeight < pageLogicalHeightAtNewOffset) || (!style()->hasAutoOrphans() && style()->orphans() >= lineIndex)) |
| - && !isOutOfFlowPositioned() && !isTableCell()) { |
| + // Decide whether to insert the break before the current line, or before the entire block. |
| + bool wantsStrutOnBlock = false; |
| + if (!style()->hasAutoOrphans() && style()->orphans() >= lineIndex) { |
|
leviw_travelin_and_unemployed
2015/08/10 19:46:19
It may be worth extracting this if/else block (det
mstensho (USE GERRIT)
2015/08/10 20:14:45
Done.
That helper function got some papayawhip-co
|
| + // Not enough orphans here. Push the entire block to the next column / page as an |
| + // attempt to better satisfy the orphans requirement. |
| + wantsStrutOnBlock = true; |
| + } else if (lineBox == firstRootBox() && logicalOffset == borderAndPaddingBefore()) { |
| + // This is the first line in the block. We can take the whole block with us to the next |
| + // page or column, rather than keeping a content-less portion of it in the previous |
| + // one. Only do this if the line is flush with the content edge of the block, |
| + // though. If it isn't, it means that the line was pushed downwards by preceding floats |
| + // that didn't fit beside the line, and we don't want to move all that, since it has |
| + // already been established that it fits nicely where it is. |
| + LayoutUnit totalLogicalHeight = lineHeight + std::max<LayoutUnit>(0, logicalOffset); |
| + LayoutUnit pageLogicalHeightAtNewOffset = pageLogicalHeightForOffset(logicalOffset + remainingLogicalHeight); |
| + // It's rather pointless to break before the block if the current line isn't going to |
| + // fit in the same column or page, so check that as well. |
| + if (totalLogicalHeight < pageLogicalHeightAtNewOffset) |
| + wantsStrutOnBlock = true; |
| + } |
| + // If we want to break before the block, one final check is needed, since some block object |
| + // types cannot handle struts. |
| + if (wantsStrutOnBlock && !isOutOfFlowPositioned() && !isTableCell()) { |
| + // Note that when setting the strut on a block, it may be propagated to parent blocks |
| + // later on, if a block's logical top is flush with that of its parent. We don't want |
| + // 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. |
| setPaginationStrut(remainingLogicalHeight + std::max<LayoutUnit>(0, logicalOffset)); |
| } else { |
| delta += remainingLogicalHeight; |