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 8eb135ee1321d7e0af1339975e75480165e35f3a..41e68517f1d4ebfa8931d9935df53db3b1a21006 100644 |
--- a/third_party/WebKit/Source/core/layout/LayoutBlockFlow.cpp |
+++ b/third_party/WebKit/Source/core/layout/LayoutBlockFlow.cpp |
@@ -798,26 +798,37 @@ LayoutUnit LayoutBlockFlow::adjustBlockChildForPagination(LayoutUnit logicalTop, |
static bool shouldSetStrutOnBlock(const LayoutBlockFlow& block, const RootInlineBox& lineBox, LayoutUnit lineLogicalOffset, int lineIndex, LayoutUnit pageLogicalHeight) |
{ |
- bool wantsStrutOnBlock = false; |
- if (!block.style()->hasAutoOrphans() && block.style()->orphans() >= lineIndex) { |
- // 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 == block.firstRootBox() && lineLogicalOffset == block.borderAndPaddingBefore()) { |
+ if (lineBox == block.firstRootBox()) { |
// 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. |
+ // fits nicely where it is. In this case we have a class "C" break point [1] in front of |
+ // this line. |
+ // |
+ // [1] https://drafts.csswg.org/css-break/#possible-breaks |
+ if (lineLogicalOffset > block.borderAndPaddingBefore()) |
+ return false; |
+ |
LayoutUnit lineHeight = lineBox.lineBottomWithLeading() - lineBox.lineTopWithLeading(); |
LayoutUnit totalLogicalHeight = lineHeight + lineLogicalOffset.clampNegativeToZero(); |
// 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 <= pageLogicalHeight) |
- wantsStrutOnBlock = true; |
+ if (totalLogicalHeight > pageLogicalHeight) |
+ return false; |
+ } else { |
+ if (block.style()->hasAutoOrphans() || lineIndex > block.style()->orphans()) |
+ return false; |
+ |
+ // Not enough orphans here. Push the entire block to the next column / page as an attempt to |
+ // better satisfy the orphans requirement. |
+ // |
+ // Note that we should ideally check if the first line in the block is flush with the |
+ // content edge of the block here, because if it isn't, we should break at the class "C" |
+ // break point in front of the first line, rather than before the entire block. |
} |
- return wantsStrutOnBlock && block.allowsPaginationStrut(); |
+ return block.allowsPaginationStrut(); |
} |
void LayoutBlockFlow::adjustLinePositionForPagination(RootInlineBox& lineBox, LayoutUnit& delta) |