| 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 c633ed2fc07dfc64fb31b29b623f75520fd98366..ab8fdd1a212c19f83e0ebcdc0e97bbe626d8ecbe 100644
|
| --- a/third_party/WebKit/Source/core/layout/LayoutBlockFlow.cpp
|
| +++ b/third_party/WebKit/Source/core/layout/LayoutBlockFlow.cpp
|
| @@ -1040,7 +1040,7 @@ LayoutUnit LayoutBlockFlow::adjustBlockChildForPagination(
|
| // happens e.g. when a tall break-inside:avoid object with a top margin is
|
| // the first in-flow child in the fragmentation context.
|
| if (allowsPaginationStrut()) {
|
| - paginationStrut += logicalTop + marginBeforeIfFloating();
|
| + paginationStrut += logicalTop;
|
| setPaginationStrutPropagatedFromChild(paginationStrut);
|
| if (childBlockFlow)
|
| childBlockFlow->setPaginationStrutPropagatedFromChild(LayoutUnit());
|
| @@ -1162,9 +1162,7 @@ void LayoutBlockFlow::adjustLinePositionForPagination(RootInlineBox& lineBox,
|
| // 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 strut =
|
| - paginationStrut + logicalOffset + marginBeforeIfFloating();
|
| - setPaginationStrutPropagatedFromChild(strut);
|
| + setPaginationStrutPropagatedFromChild(paginationStrut + logicalOffset);
|
| } else {
|
| delta += paginationStrut;
|
| lineBox.setPaginationStrut(paginationStrut);
|
| @@ -1179,27 +1177,24 @@ void LayoutBlockFlow::adjustLinePositionForPagination(RootInlineBox& lineBox,
|
| // 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 this is the first line in the block, and the block has a top border or
|
| + // padding, 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,
|
| pageLogicalHeight))
|
| - strutToPropagate = logicalOffset + marginBeforeIfFloating();
|
| + strutToPropagate = 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 + marginBeforeIfFloating();
|
| + // to where this line is, so that we don't split the top border or padding.
|
| LayoutUnit strut =
|
| - remainingLogicalHeight + totalLogicalOffset - pageLogicalHeight;
|
| - if (strut > 0) {
|
| + remainingLogicalHeight + logicalOffset - pageLogicalHeight;
|
| + if (strut > LayoutUnit()) {
|
| // 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)
|
| + // if there's room for the top border, padding and the line in one column
|
| + // or page.
|
| + if (logicalOffset + lineHeight <= pageLogicalHeight)
|
| strutToPropagate = strut;
|
| }
|
| }
|
| @@ -3697,9 +3692,32 @@ bool LayoutBlockFlow::positionNewFloats(LineWidth* width) {
|
| LayoutUnit strut =
|
| childBlockFlow ? childBlockFlow->paginationStrutPropagatedFromChild()
|
| : LayoutUnit();
|
| +
|
| + LayoutUnit marginBefore = marginBeforeForChild(*childBox);
|
| + if (marginBefore > LayoutUnit()) {
|
| + // Avoid breaking inside the top margin of a float.
|
| + if (strut) {
|
| + // If we already had decided to break, just add the margin. The strut
|
| + // so far only accounts for pushing the top border edge to the next
|
| + // fragmentainer. We need to push the margin over as well, because
|
| + // there's no break opportunity between margin and border.
|
| + strut += marginBefore;
|
| + } else {
|
| + // Even if we didn't break before the border box to the next
|
| + // fragmentainer, we need to check if we can fit the margin before
|
| + // it.
|
| + LayoutUnit marginEdge = childBox->logicalTop() - marginBefore;
|
| + if (LayoutUnit pageHeight = pageLogicalHeightForOffset(marginEdge)) {
|
| + LayoutUnit remainingSpace = pageRemainingLogicalHeightForOffset(
|
| + marginEdge, AssociateWithLatterPage);
|
| + if (remainingSpace <= marginBefore)
|
| + strut += remainingSpace;
|
| + }
|
| + }
|
| + }
|
| if (!strut) {
|
| - // Otherwise, if we are unsplittable and don't fit, move to the next
|
| - // page or column if that helps the situation.
|
| + // If we are unsplittable and don't fit, move to the next page or column
|
| + // if that helps the situation.
|
| strut =
|
| adjustForUnsplittableChild(*childBox, floatLogicalLocation.y()) -
|
| floatLogicalLocation.y();
|
|
|