Commit b0b4f031 authored by Morten Stenshorne's avatar Morten Stenshorne Committed by Commit Bot

[LayoutNG] Don't break inside monolithic block nodes.

We were already preventing breaks inside line boxes, but we also need to
do the same for certain types of block nodes, such as replaced content.

Add a unit test for break-before:avoid before monolithic block level
content, since the existing web_tests corpus has no break-between
avoidance tests at all.

Bug: 829028
Change-Id: I2240f96714e6dd760fac4f86089a0c8e6bf346ac
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1836492
Commit-Queue: Ian Kilpatrick <ikilpatrick@chromium.org>
Reviewed-by: default avatarIan Kilpatrick <ikilpatrick@chromium.org>
Cr-Commit-Position: refs/heads/master@{#702465}
parent 63a656aa
...@@ -2103,8 +2103,9 @@ NGBlockLayoutAlgorithm::BreakBeforeChildIfNeeded( ...@@ -2103,8 +2103,9 @@ NGBlockLayoutAlgorithm::BreakBeforeChildIfNeeded(
} else { } else {
LayoutUnit space_left = FragmentainerSpaceAvailable() - block_offset; LayoutUnit space_left = FragmentainerSpaceAvailable() - block_offset;
bool want_break; bool want_break;
if (child.IsInline()) { if (child.IsMonolithic()) {
// If the line doesn't fit, we need a break. // If the monolithic piece of content (e.g. a line, or block-level
// replaced content) doesn't fit, we need a break.
NGFragment fragment(ConstraintSpace().GetWritingMode(), NGFragment fragment(ConstraintSpace().GetWritingMode(),
physical_fragment); physical_fragment);
want_break = fragment.BlockSize() > space_left; want_break = fragment.BlockSize() > space_left;
......
...@@ -5087,5 +5087,40 @@ TEST_F(NGColumnLayoutAlgorithmTest, AvoidBreakBetweenBreakAtEarlyClassC) { ...@@ -5087,5 +5087,40 @@ TEST_F(NGColumnLayoutAlgorithmTest, AvoidBreakBetweenBreakAtEarlyClassC) {
EXPECT_EQ(expectation, dump); EXPECT_EQ(expectation, dump);
} }
TEST_F(NGColumnLayoutAlgorithmTest, AvoidBreakBeforeBlockReplacedContent) {
// Replaced content is unbreakable. Don't break right before it if we have
// break-before:avoid, though.
SetBodyInnerHTML(R"HTML(
<style>
#parent {
columns: 3;
column-gap: 10px;
column-fill: auto;
width: 320px;
height: 100px;
}
</style>
<div id="container">
<div id="parent">
<div style="width:22px; height:40px;"></div>
<div style="width:33px; height:50px; break-inside:avoid;"></div>
<img style="break-before:avoid; display:block; width:44px; height:50px;">
</div>
</div>
)HTML");
String dump = DumpFragmentTree(GetElementById("container"));
String expectation = R"DUMP(.:: LayoutNG Physical Fragment Tree ::.
offset:unplaced size:1000x100
offset:0,0 size:320x100
offset:0,0 size:100x100
offset:0,0 size:22x40
offset:110,0 size:100x100
offset:0,0 size:33x50
offset:0,50 size:44x50
)DUMP";
EXPECT_EQ(expectation, dump);
}
} // anonymous namespace } // anonymous namespace
} // namespace blink } // namespace blink
...@@ -134,6 +134,14 @@ class CORE_EXPORT NGLayoutInputNode { ...@@ -134,6 +134,14 @@ class CORE_EXPORT NGLayoutInputNode {
(box_->IsBody() || box_->IsTableCell()); (box_->IsBody() || box_->IsTableCell());
} }
// Return true if this node is monolithic for block fragmentation.
bool IsMonolithic() const {
// Lines are always monolithic. We cannot block-fragment inside them.
if (IsInline())
return true;
return box_->GetPaginationBreakability() == LayoutBox::kForbidBreaks;
}
bool CreatesNewFormattingContext() const { bool CreatesNewFormattingContext() const {
return IsBlock() && box_->CreatesNewFormattingContext(); return IsBlock() && box_->CreatesNewFormattingContext();
} }
......
...@@ -1648,7 +1648,6 @@ crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/nested-with-single ...@@ -1648,7 +1648,6 @@ crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/nested-with-single
crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/newmulticol/avoid-column-break-inside.html [ Failure ] crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/newmulticol/avoid-column-break-inside.html [ Failure ]
crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/newmulticol/balance2.html [ Failure ] crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/newmulticol/balance2.html [ Failure ]
crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/newmulticol/balance3.html [ Failure ] crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/newmulticol/balance3.html [ Failure ]
crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/newmulticol/balance-images.html [ Failure ]
crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/newmulticol/break-before.html [ Failure ] crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/newmulticol/break-before.html [ Failure ]
crbug.com/874506 virtual/layout_ng_experimental/fast/multicol/newmulticol/breaks-2-columns-3.html [ Failure ] crbug.com/874506 virtual/layout_ng_experimental/fast/multicol/newmulticol/breaks-2-columns-3.html [ Failure ]
crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/newmulticol/breaks-2-columns-3-no-balancing.html [ Failure ] crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/newmulticol/breaks-2-columns-3-no-balancing.html [ Failure ]
...@@ -1670,7 +1669,6 @@ crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/overflow-across-co ...@@ -1670,7 +1669,6 @@ crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/overflow-across-co
crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/overflow-content.html [ Failure ] crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/overflow-content.html [ Failure ]
crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/overflow-unsplittable.html [ Failure ] crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/overflow-unsplittable.html [ Failure ]
crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/pageLogicalOffset-vertical.html [ Failure ] crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/pageLogicalOffset-vertical.html [ Failure ]
crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/paginate-block-replaced.html [ Failure ]
crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/positioned-outside-of-columns.html [ Crash Failure ] crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/positioned-outside-of-columns.html [ Crash Failure ]
crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/positioned-split.html [ Failure ] crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/positioned-split.html [ Failure ]
crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/positive-leading.html [ Failure ] crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/positive-leading.html [ Failure ]
...@@ -1817,7 +1815,6 @@ crbug.com/591099 virtual/layout_ng_experimental/fragmentation/float-after-forced ...@@ -1817,7 +1815,6 @@ crbug.com/591099 virtual/layout_ng_experimental/fragmentation/float-after-forced
crbug.com/591099 virtual/layout_ng_experimental/fragmentation/float-margin-top.html [ Failure ] crbug.com/591099 virtual/layout_ng_experimental/fragmentation/float-margin-top.html [ Failure ]
crbug.com/591099 virtual/layout_ng_experimental/fragmentation/float-pushed-to-next-fragmentainer-by-floats.html [ Failure ] crbug.com/591099 virtual/layout_ng_experimental/fragmentation/float-pushed-to-next-fragmentainer-by-floats.html [ Failure ]
crbug.com/591099 virtual/layout_ng_experimental/fragmentation/forced-break-clearance-unsplittable-content.html [ Failure ] crbug.com/591099 virtual/layout_ng_experimental/fragmentation/forced-break-clearance-unsplittable-content.html [ Failure ]
crbug.com/591099 virtual/layout_ng_experimental/fragmentation/image-block-as-first-child.html [ Failure ]
crbug.com/591099 virtual/layout_ng_experimental/fragmentation/overflow-crossing-boundary.html [ Failure ] crbug.com/591099 virtual/layout_ng_experimental/fragmentation/overflow-crossing-boundary.html [ Failure ]
crbug.com/591099 virtual/layout_ng_experimental/fragmentation/relayout-abspos.html [ Failure ] crbug.com/591099 virtual/layout_ng_experimental/fragmentation/relayout-abspos.html [ Failure ]
crbug.com/591099 virtual/layout_ng_experimental/fragmentation/remove-unbreakable-block-in-line-float.html [ Failure ] crbug.com/591099 virtual/layout_ng_experimental/fragmentation/remove-unbreakable-block-in-line-float.html [ Failure ]
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment