| Index: third_party/WebKit/Source/core/layout/LayoutBlockFlowLine.cpp
|
| diff --git a/third_party/WebKit/Source/core/layout/LayoutBlockFlowLine.cpp b/third_party/WebKit/Source/core/layout/LayoutBlockFlowLine.cpp
|
| index befbe44e07def5b0300ce50aff4796dbed86b3a8..2092d752803562ee42c35998d8dd26fc9152698a 100644
|
| --- a/third_party/WebKit/Source/core/layout/LayoutBlockFlowLine.cpp
|
| +++ b/third_party/WebKit/Source/core/layout/LayoutBlockFlowLine.cpp
|
| @@ -1076,6 +1076,7 @@ void LayoutBlockFlow::layoutRunsAndFloatsInRange(
|
| const ComputedStyle& styleToUse = styleRef();
|
| bool paginated =
|
| view()->layoutState() && view()->layoutState()->isPaginated();
|
| + bool recalculateStruts = layoutState.needsPaginationStrutRecalculation();
|
| LineMidpointState& lineMidpointState = resolver.midpointState();
|
| InlineIterator endOfLine = resolver.position();
|
| LayoutTextInfo layoutTextInfo;
|
| @@ -1190,7 +1191,7 @@ void LayoutBlockFlow::layoutRunsAndFloatsInRange(
|
| if (lineBox) {
|
| lineBox->setLineBreakInfo(endOfLine.getLineLayoutItem(),
|
| endOfLine.offset(), resolver.status());
|
| - if (paginated) {
|
| + if (recalculateStruts) {
|
| if (paginationStrutFromDeletedLine) {
|
| // This is a line that got re-created because it got pushed to the
|
| // next fragmentainer, and there were floats in the vicinity that
|
| @@ -1239,11 +1240,12 @@ void LayoutBlockFlow::layoutRunsAndFloatsInRange(
|
| if (!paginationStrutFromDeletedLine) {
|
| for (const auto& positionedObject : lineBreaker.positionedObjects()) {
|
| if (positionedObject.style()->isOriginalDisplayInlineType()) {
|
| - // Auto-positioend "inline" out-of-flow objects have already been
|
| - // positioned, but if we're paginated, we need to update their
|
| - // position now, since the line they "belong" to may have been pushed
|
| - // by a pagination strut.
|
| - if (paginated && lineBox)
|
| + // Auto-positioned "inline" out-of-flow objects have already been
|
| + // positioned, but if we're paginated, or just ceased to be so, we
|
| + // need to update their position now, since the line they "belong" to
|
| + // may have been pushed by a pagination strut, or pulled back because
|
| + // a pagination strut was removed.
|
| + if (recalculateStruts && lineBox)
|
| positionedObject.layer()->setStaticBlockPosition(
|
| lineBox->lineTopWithLeading());
|
| continue;
|
| @@ -1346,15 +1348,14 @@ void LayoutBlockFlow::layoutRunsAndFloatsInRange(
|
| void LayoutBlockFlow::linkToEndLineIfNeeded(LineLayoutState& layoutState) {
|
| if (layoutState.endLine()) {
|
| if (layoutState.endLineMatched()) {
|
| - bool paginated =
|
| - view()->layoutState() && view()->layoutState()->isPaginated();
|
| + bool recalculateStruts = layoutState.needsPaginationStrutRecalculation();
|
| // Attach all the remaining lines, and then adjust their y-positions as
|
| // needed.
|
| LayoutUnit delta = logicalHeight() - layoutState.endLineLogicalTop();
|
| for (RootInlineBox* line = layoutState.endLine(); line;
|
| line = line->nextRootBox()) {
|
| line->attachLine();
|
| - if (paginated) {
|
| + if (recalculateStruts) {
|
| delta -= line->paginationStrut();
|
| adjustLinePositionForPagination(*line, delta);
|
| }
|
| @@ -1896,6 +1897,11 @@ void LayoutBlockFlow::layoutInlineChildren(bool relayoutChildren,
|
| if (firstLineBox())
|
| setShouldDoFullPaintInvalidation();
|
| lineBoxes()->deleteLineBoxes();
|
| + } else if (const LayoutState* boxState = view()->layoutState()) {
|
| + // We'll attempt to keep the line boxes that we have, but we may need to
|
| + // add, change or remove pagination struts in front of them.
|
| + if (boxState->isPaginated() || boxState->paginationStateChanged())
|
| + layoutState.setNeedsPaginationStrutRecalculation();
|
| }
|
|
|
| // Text truncation kicks in if overflow isn't visible and text-overflow isn't
|
| @@ -2005,12 +2011,11 @@ RootInlineBox* LayoutBlockFlow::determineStartPosition(
|
| // function.
|
| if (!layoutState.isFullLayout()) {
|
| // Paginate all of the clean lines.
|
| - bool paginated =
|
| - view()->layoutState() && view()->layoutState()->isPaginated();
|
| + bool recalculateStruts = layoutState.needsPaginationStrutRecalculation();
|
| LayoutUnit paginationDelta;
|
| for (curr = firstRootBox(); curr && !curr->isDirty();
|
| curr = curr->nextRootBox()) {
|
| - if (paginated) {
|
| + if (recalculateStruts) {
|
| paginationDelta -= curr->paginationStrut();
|
| adjustLinePositionForPagination(*curr, paginationDelta);
|
| if (paginationDelta) {
|
| @@ -2183,9 +2188,7 @@ bool LayoutBlockFlow::checkPaginationAndFloatsAtEndLine(
|
|
|
| LayoutUnit lineDelta = logicalHeight() - layoutState.endLineLogicalTop();
|
|
|
| - bool paginated =
|
| - view()->layoutState() && view()->layoutState()->isPaginated();
|
| - if (paginated) {
|
| + if (layoutState.needsPaginationStrutRecalculation()) {
|
| // Check all lines from here to the end, and see if the hypothetical new
|
| // position for the lines will result
|
| // in a different available line width.
|
|
|