| Index: Source/core/layout/LayoutBlockFlow.cpp
|
| diff --git a/Source/core/layout/LayoutBlockFlow.cpp b/Source/core/layout/LayoutBlockFlow.cpp
|
| index 93c4967ebe1022c2efde2c5671861a14a9fe3b98..9870fd2ee5b364d6e02f24fcfed8e7a462904e0c 100644
|
| --- a/Source/core/layout/LayoutBlockFlow.cpp
|
| +++ b/Source/core/layout/LayoutBlockFlow.cpp
|
| @@ -728,52 +728,33 @@ LayoutUnit LayoutBlockFlow::adjustBlockChildForPagination(LayoutUnit logicalTopA
|
| return result;
|
| }
|
|
|
| -static inline LayoutUnit calculateMinimumPageHeight(const ComputedStyle& style, RootInlineBox* lastLine, LayoutUnit lineTop, LayoutUnit lineBottom)
|
| +static inline LayoutUnit calculateMinimumPageHeight(const ComputedStyle& style, const RootInlineBox& lastLine)
|
| {
|
| // We may require a certain minimum number of lines per page in order to satisfy
|
| // orphans and widows, and that may affect the minimum page height.
|
| unsigned lineCount = std::max<unsigned>(style.hasAutoOrphans() ? 1 : style.orphans(), style.widows());
|
| - if (lineCount > 1) {
|
| - RootInlineBox* line = lastLine;
|
| - for (unsigned i = 1; i < lineCount && line->prevRootBox(); i++)
|
| - line = line->prevRootBox();
|
| -
|
| - // FIXME: Paginating using line overflow isn't all fine. See FIXME in
|
| - // adjustLinePositionForPagination() for more details.
|
| - LayoutRect overflow = line->logicalVisualOverflowRect(line->lineTop(), line->lineBottom());
|
| - lineTop = std::min(line->lineTopWithLeading(), overflow.y());
|
| - }
|
| - return lineBottom - lineTop;
|
| + const RootInlineBox* firstLine = &lastLine;
|
| + for (unsigned i = 1; i < lineCount && firstLine->prevRootBox(); i++)
|
| + firstLine = firstLine->prevRootBox();
|
| + return lastLine.lineBottomWithLeading() - firstLine->lineTopWithLeading();
|
| }
|
|
|
| void LayoutBlockFlow::adjustLinePositionForPagination(RootInlineBox& lineBox, LayoutUnit& delta)
|
| {
|
| - // FIXME: For now we paginate using line overflow. This ensures that lines don't overlap at all when we
|
| - // put a strut between them for pagination purposes. However, this really isn't the desired layout, since
|
| - // the line on the top of the next page will appear too far down relative to the same kind of line at the top
|
| - // of the first column.
|
| - //
|
| - // The layout we would like to see is one where the lineTopWithLeading is at the top of the column, and any line overflow
|
| - // simply spills out above the top of the column. This effect would match what happens at the top of the first column.
|
| - // We can't achieve this layout, however, until we stop columns from clipping to the column bounds (thus allowing
|
| - // for overflow to occur), and then cache visible overflow for each column rect.
|
| - //
|
| - // Furthermore, the paint we have to do when a column has overflow has to be special. We need to exclude
|
| + // TODO(mstensho): Pay attention to line overflow. It should be painted in the same column as
|
| + // the rest of the line, possibly overflowing the column. We currently only allow overflow above
|
| + // the first column. We clip at all other column boundaries, and that's how it has to be for
|
| + // now. The paint we have to do when a column has overflow has to be special. We need to exclude
|
| // content that paints in a previous column (and content that paints in the following column).
|
| //
|
| - // For now we'll at least honor the lineTopWithLeading when paginating if it is above the logical top overflow. This will
|
| - // at least make positive leading work in typical cases.
|
| - //
|
| // FIXME: Another problem with simply moving lines is that the available line width may change (because of floats).
|
| // Technically if the location we move the line to has a different line width than our old position, then we need to dirty the
|
| // line and all following lines.
|
| - LayoutRect logicalVisualOverflow = lineBox.logicalVisualOverflowRect(lineBox.lineTop(), lineBox.lineBottom());
|
| - LayoutUnit logicalOffset = std::min(lineBox.lineTopWithLeading(), logicalVisualOverflow.y());
|
| - LayoutUnit logicalBottom = std::max(lineBox.lineBottomWithLeading(), logicalVisualOverflow.maxY());
|
| - LayoutUnit lineHeight = logicalBottom - logicalOffset;
|
| - updateMinimumPageHeight(logicalOffset, calculateMinimumPageHeight(styleRef(), &lineBox, logicalOffset, logicalBottom));
|
| + LayoutUnit logicalOffset = lineBox.lineTopWithLeading();
|
| + LayoutUnit lineHeight = lineBox.lineBottomWithLeading() - logicalOffset;
|
| + updateMinimumPageHeight(logicalOffset, calculateMinimumPageHeight(styleRef(), lineBox));
|
| logicalOffset += delta;
|
| - lineBox.setPaginationStrut(0);
|
| + lineBox.setPaginationStrut(LayoutUnit());
|
| lineBox.setIsFirstAfterPageBreak(false);
|
| LayoutUnit pageLogicalHeight = pageLogicalHeightForOffset(logicalOffset);
|
| if (!pageLogicalHeight)
|
| @@ -786,10 +767,6 @@ void LayoutBlockFlow::adjustLinePositionForPagination(RootInlineBox& lineBox, La
|
| clearShouldBreakAtLineToAvoidWidow();
|
| setDidBreakAtLineToAvoidWidow();
|
| }
|
| - if (lineHeight > pageLogicalHeight) {
|
| - // Split the top margin in order to avoid splitting the visible part of the line.
|
| - remainingLogicalHeight -= std::min(lineHeight - pageLogicalHeight, std::max<LayoutUnit>(0, logicalVisualOverflow.y() - lineBox.lineTopWithLeading()));
|
| - }
|
| LayoutUnit totalLogicalHeight = lineHeight + std::max<LayoutUnit>(0, logicalOffset);
|
| LayoutUnit pageLogicalHeightAtNewOffset = pageLogicalHeightForOffset(logicalOffset + remainingLogicalHeight);
|
| setPageBreak(logicalOffset, lineHeight - remainingLogicalHeight);
|
|
|