Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(245)

Unified Diff: third_party/WebKit/Source/core/layout/LayoutBox.cpp

Issue 2462643002: Be more restrictive about forcing relayout of children for pagination. (Closed)
Patch Set: No need to call updateFragmentationInfoForChild() when not paginated. Created 4 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: third_party/WebKit/Source/core/layout/LayoutBox.cpp
diff --git a/third_party/WebKit/Source/core/layout/LayoutBox.cpp b/third_party/WebKit/Source/core/layout/LayoutBox.cpp
index a6a949e465af92a7e47b69d289eebb46082deeaa..00ed489c0e719d90971c6c3c3c0ad40123b0fe4d 100644
--- a/third_party/WebKit/Source/core/layout/LayoutBox.cpp
+++ b/third_party/WebKit/Source/core/layout/LayoutBox.cpp
@@ -706,6 +706,15 @@ void LayoutBox::updateLayerTransformAfterLayout() {
layer()->updateTransformationMatrix();
}
+LayoutUnit LayoutBox::logicalHeightIncludingOverflow() const {
+ if (!m_overflow)
+ return logicalHeight();
+ LayoutRect overflow = layoutOverflowRect();
+ if (style()->isHorizontalWritingMode())
+ return overflow.maxY();
+ return overflow.maxX();
+}
+
LayoutUnit LayoutBox::constrainLogicalWidthByMinMax(LayoutUnit logicalWidth,
LayoutUnit availableWidth,
LayoutBlock* cb) const {
@@ -4702,23 +4711,59 @@ bool LayoutBox::hasNonCompositedScrollbars() const {
return false;
}
+void LayoutBox::updateFragmentationInfoForChild(LayoutBox& child) {
+ LayoutState* layoutState = view()->layoutState();
+ DCHECK(layoutState->isPaginated());
+ child.setOffsetToNextPage(LayoutUnit());
+ if (!pageLogicalHeightForOffset(child.logicalTop()))
+ return;
+
+ LayoutUnit logicalTop = child.logicalTop();
+ LayoutUnit logicalHeight = child.logicalHeightIncludingOverflow();
+ LayoutUnit spaceLeft =
+ pageRemainingLogicalHeightForOffset(logicalTop, AssociateWithLatterPage);
+ if (spaceLeft < logicalHeight)
+ child.setOffsetToNextPage(spaceLeft);
+}
+
void LayoutBox::markChildForPaginationRelayoutIfNeeded(
LayoutBox& child,
SubtreeLayoutScope& layoutScope) {
DCHECK(!child.needsLayout());
LayoutState* layoutState = view()->layoutState();
- if (layoutState->paginationStateChanged()) {
+ // TODO(mstensho): Should try to get this to work for floats too, instead of
+ // just marking and bailing here.
+ if (layoutState->paginationStateChanged() || child.isFloating()) {
layoutScope.setChildNeedsLayout(&child);
return;
}
if (!layoutState->isPaginated())
return;
- if (layoutState->pageLogicalHeightChanged() ||
- (layoutState->pageLogicalHeight() &&
- layoutState->pageLogicalOffset(child, child.logicalTop()) !=
- child.pageLogicalOffset()))
- layoutScope.setChildNeedsLayout(&child);
+ LayoutUnit logicalTop = child.logicalTop();
+ if (LayoutUnit pageLogicalHeight = pageLogicalHeightForOffset(logicalTop)) {
+ // Figure out if we really need to force re-layout of the child. We only
+ // need to do this if there's a chance that we need to recalculate
+ // pagination struts inside.
+ LayoutUnit remainingSpace = pageRemainingLogicalHeightForOffset(
+ logicalTop, AssociateWithLatterPage);
+ LayoutUnit logicalHeight = child.logicalHeightIncludingOverflow();
+ if ((!child.offsetToNextPage() && logicalHeight <= remainingSpace) ||
+ child.offsetToNextPage() == remainingSpace) {
+ // We don't need to relayout this child, either because the child wasn't
+ // previously fragmented, and won't be fragmented now either, or because
+ // it would fragment at the exact same position as before.
+ //
+ // We want to skip layout of this child, but we need to ask the flow
+ // thread for permission first. We currently cannot skip over objects
+ // containing column spanners.
+ LayoutFlowThread* flowThread = child.flowThreadContainingBlock();
+ if (!flowThread || flowThread->canSkipLayout(child))
+ return;
+ }
+ }
+
+ layoutScope.setChildNeedsLayout(&child);
}
void LayoutBox::markOrthogonalWritingModeRoot() {
@@ -5285,10 +5330,10 @@ LayoutUnit LayoutBox::offsetFromLogicalTopOfFirstPage() const {
return containerBlock->offsetFromLogicalTopOfFirstPage() + logicalTop();
}
-void LayoutBox::setPageLogicalOffset(LayoutUnit offset) {
+void LayoutBox::setOffsetToNextPage(LayoutUnit offset) {
if (!m_rareData && !offset)
return;
- ensureRareData().m_pageLogicalOffset = offset;
+ ensureRareData().m_offsetToNextPage = offset;
}
void LayoutBox::logicalExtentAfterUpdatingLogicalWidth(

Powered by Google App Engine
This is Rietveld 408576698