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

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

Issue 2359733002: Need to consider the need for a soft break even when inserting a forced break. (Closed)
Patch Set: Created 4 years, 3 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
« no previous file with comments | « third_party/WebKit/Source/core/layout/LayoutBlockFlow.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 95ce2b15625130b5d768b377ee5d82c82c072180..548b4ac805f5b03514532f503a6d89e089714dbb 100644
--- a/third_party/WebKit/Source/core/layout/LayoutBlockFlow.cpp
+++ b/third_party/WebKit/Source/core/layout/LayoutBlockFlow.cpp
@@ -677,13 +677,13 @@ bool LayoutBlockFlow::positionAndLayoutOnceIfNeeded(LayoutBox& child, LayoutUnit
return true;
}
-bool LayoutBlockFlow::insertForcedBreakBeforeChildIfNeeded(LayoutBox& child, BlockChildrenLayoutInfo& layoutInfo)
+void LayoutBlockFlow::insertForcedBreakBeforeChildIfNeeded(LayoutBox& child, BlockChildrenLayoutInfo& layoutInfo)
{
if (layoutInfo.isAtFirstInFlowChild()) {
// There's no class A break point before the first child (only *between* siblings), so
// steal its break value and join it with what we already have here.
setBreakBefore(joinFragmentainerBreakValues(breakBefore(), child.breakBefore()));
- return false;
+ return;
}
// Figure out if a forced break should be inserted in front of the child. If we insert a forced
@@ -696,9 +696,7 @@ bool LayoutBlockFlow::insertForcedBreakBeforeChildIfNeeded(LayoutBox& child, Blo
setLogicalHeight(newLogicalTop);
LayoutUnit paginationStrut = newLogicalTop - oldLogicalTop;
child.setPaginationStrut(paginationStrut);
- return true;
}
- return false;
}
void LayoutBlockFlow::layoutBlockChild(LayoutBox& child, BlockChildrenLayoutInfo& layoutInfo)
@@ -737,7 +735,14 @@ void LayoutBlockFlow::layoutBlockChild(LayoutBox& child, BlockChildrenLayoutInfo
// If there should be a forced break before the child, we need to insert it before attempting
// to collapse margins or apply clearance.
- bool forcedBreakWasInserted = paginated && insertForcedBreakBeforeChildIfNeeded(child, layoutInfo);
+ if (paginated) {
+ // We will now insert the strut needed by any forced break. After this operation, we will
+ // have calculated the offset where we can apply margin collapsing and clearance. After
+ // having applied those things, we'll be at the position where we can honor requirements of
+ // unbreakable content, which may extend the strut further.
+ child.resetPaginationStrut();
+ insertForcedBreakBeforeChildIfNeeded(child, layoutInfo);
+ }
// Now determine the correct ypos based off examination of collapsing margin
// values.
@@ -751,7 +756,7 @@ void LayoutBlockFlow::layoutBlockChild(LayoutBox& child, BlockChildrenLayoutInfo
// determined. Otherwise, see if there are other reasons for breaking before it
// (break-inside:avoid, or not enough space for the first piece of child content to fit in the
// current fragmentainer), and adjust the position accordingly.
- if (paginated && !forcedBreakWasInserted) {
+ if (paginated) {
if (estimateWithoutPagination != newLogicalTop) {
// We got a new position due to clearance or margin collapsing. Before we attempt to
// paginate (which may result in the position changing again), let's try again at the
@@ -759,6 +764,8 @@ void LayoutBlockFlow::layoutBlockChild(LayoutBox& child, BlockChildrenLayoutInfo
positionAndLayoutOnceIfNeeded(child, newLogicalTop, layoutInfo);
}
+ // We have now applied forced breaks, margin collapsing and clearance, and we're at the
+ // position where we can honor requirements of unbreakable content.
newLogicalTop = adjustBlockChildForPagination(newLogicalTop, child, layoutInfo, atBeforeSideOfBlock && logicalTopBeforeClear == newLogicalTop);
}
@@ -821,9 +828,6 @@ void LayoutBlockFlow::layoutBlockChild(LayoutBox& child, BlockChildrenLayoutInfo
LayoutUnit LayoutBlockFlow::adjustBlockChildForPagination(LayoutUnit logicalTop, LayoutBox& child, BlockChildrenLayoutInfo& layoutInfo, bool atBeforeSideOfBlock)
{
- // Forced breaks trumps unforced ones, and if we have a forced break, we shouldn't even be here.
- ASSERT(layoutInfo.isAtFirstInFlowChild() || !isForcedFragmentainerBreakValue(child.classABreakPointValue(layoutInfo.previousBreakAfterValue())));
-
LayoutBlockFlow* childBlockFlow = child.isLayoutBlockFlow() ? toLayoutBlockFlow(&child) : 0;
// See if we need a soft (unforced) break in front of this child, and set the pagination strut
@@ -835,10 +839,6 @@ LayoutUnit LayoutBlockFlow::adjustBlockChildForPagination(LayoutUnit logicalTop,
// No matter which source, if we need to insert a strut, it should always take us to the exact
// top of a page or column further ahead, or be zero.
- // We're now going to calculate the child's final pagination strut. We may end up propagating
- // it to its containing block (|this|), so reset it first.
- child.resetPaginationStrut();
-
// The first piece of content inside the child may have set a strut during layout. Currently,
// only block flows support strut propagation, but this may (and should) change in the future.
// See crbug.com/539873
@@ -852,7 +852,12 @@ LayoutUnit LayoutBlockFlow::adjustBlockChildForPagination(LayoutUnit logicalTop,
// ahead than the next one.
LayoutUnit logicalTopAfterPagination = std::max(logicalTopWithContentStrut, logicalTopAfterUnsplittable);
LayoutUnit newLogicalTop = logicalTop;
- if (LayoutUnit paginationStrut = logicalTopAfterPagination - logicalTop) {
+
+ // Forced breaks may already have caused a strut, and this needs to be added together with
+ // any strut detected here in this method.
+ LayoutUnit previousStrut = child.paginationStrut();
+
+ if (LayoutUnit paginationStrut = logicalTopAfterPagination - logicalTop + previousStrut) {
ASSERT(paginationStrut > 0);
// If we're not at the first in-flow child, there's a class A break point before the child. If we *are* at the
// first in-flow child, but the child isn't flush with the content edge of its container, due to e.g. clearance,
@@ -864,11 +869,13 @@ LayoutUnit LayoutBlockFlow::adjustBlockChildForPagination(LayoutUnit logicalTop,
// and pushes to the next page anyway, so not too concerned about it.
paginationStrut += logicalTop + marginBeforeIfFloating();
setPaginationStrutPropagatedFromChild(paginationStrut);
+ child.resetPaginationStrut();
if (childBlockFlow)
childBlockFlow->setPaginationStrutPropagatedFromChild(LayoutUnit());
} else {
child.setPaginationStrut(paginationStrut);
- newLogicalTop += paginationStrut;
+ // |previousStrut| was already baked into the logical top, so don't add it again.
+ newLogicalTop += paginationStrut - previousStrut;
}
}
« no previous file with comments | « third_party/WebKit/Source/core/layout/LayoutBlockFlow.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698