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

[LayoutNG] Take overflow into account when column-balancing.

I didn't check why one test started to pass (it's not a very interesting
test for overflow).

Bug: 829028
Change-Id: I2c2d5fe3ea8c6a87f00df47f81d4158936d8a1bd
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1742162Reviewed-by: default avatarIan Kilpatrick <ikilpatrick@chromium.org>
Commit-Queue: Morten Stenshorne <mstensho@chromium.org>
Cr-Commit-Position: refs/heads/master@{#685349}
parent cb6e9a3c
...@@ -27,6 +27,37 @@ inline bool NeedsColumnBalancing(LayoutUnit block_size, ...@@ -27,6 +27,37 @@ inline bool NeedsColumnBalancing(LayoutUnit block_size,
style.GetColumnFill() == EColumnFill::kBalance; style.GetColumnFill() == EColumnFill::kBalance;
} }
LayoutUnit CalculateColumnContentBlockSize(
const NGPhysicalContainerFragment& fragment,
bool multicol_is_horizontal_writing_mode) {
// TODO(mstensho): Once LayoutNG is capable of calculating overflow on its
// own, we should probably just move over to relying on that machinery,
// instead of doing all this on our own.
LayoutUnit total_size;
for (const auto& child : fragment.Children()) {
LayoutUnit size;
LayoutUnit offset;
if (multicol_is_horizontal_writing_mode) {
offset = child.Offset().top;
size = child->Size().height;
} else {
offset = child.Offset().left;
size = child->Size().width;
}
if (child->IsContainer()) {
LayoutUnit children_size = CalculateColumnContentBlockSize(
To<NGPhysicalContainerFragment>(*child),
multicol_is_horizontal_writing_mode);
if (size < children_size)
size = children_size;
}
LayoutUnit block_end = offset + size;
if (total_size < block_end)
total_size = block_end;
}
return total_size;
}
} // namespace } // namespace
NGColumnLayoutAlgorithm::NGColumnLayoutAlgorithm( NGColumnLayoutAlgorithm::NGColumnLayoutAlgorithm(
...@@ -320,11 +351,9 @@ LayoutUnit NGColumnLayoutAlgorithm::CalculateBalancedColumnBlockSize( ...@@ -320,11 +351,9 @@ LayoutUnit NGColumnLayoutAlgorithm::CalculateBalancedColumnBlockSize(
{Node(), fragment_geometry, space}); {Node(), fragment_geometry, space});
scoped_refptr<const NGLayoutResult> result = balancing_algorithm.Layout(); scoped_refptr<const NGLayoutResult> result = balancing_algorithm.Layout();
// TODO(mstensho): This is where the fun begins. We need to examine the entire LayoutUnit single_strip_block_size = CalculateColumnContentBlockSize(
// fragment tree, not just the root. result->PhysicalFragment(),
LayoutUnit single_strip_block_size = IsHorizontalWritingMode(space.GetWritingMode()));
NGFragment(space.GetWritingMode(), result->PhysicalFragment())
.BlockSize();
// Some extra care is required the division here. We want a the resulting // Some extra care is required the division here. We want a the resulting
// LayoutUnit value to be large enough to prevent overflowing columns. Use // LayoutUnit value to be large enough to prevent overflowing columns. Use
......
...@@ -2430,6 +2430,41 @@ TEST_F(NGColumnLayoutAlgorithmTest, ColumnBalancingEmptyBlock) { ...@@ -2430,6 +2430,41 @@ TEST_F(NGColumnLayoutAlgorithmTest, ColumnBalancingEmptyBlock) {
EXPECT_EQ(expectation, dump); EXPECT_EQ(expectation, dump);
} }
TEST_F(NGColumnLayoutAlgorithmTest, ColumnBalancingOverflow) {
SetBodyInnerHTML(R"HTML(
<style>
#parent {
columns: 3;
column-gap: 10px;
width: 320px;
}
</style>
<div id="container">
<div id="parent">
<div style="width:30px; height:20px;">
<div style="width:33px; height:300px;"></div>
</div>
</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:100x20
offset:0,0 size:30x20
offset:0,0 size:33x100
offset:110,0 size:100x0
offset:0,0 size:30x0
offset:0,0 size:33x100
offset:220,0 size:100x0
offset:0,0 size:30x0
offset:0,0 size:33x100
)DUMP";
EXPECT_EQ(expectation, dump);
}
TEST_F(NGColumnLayoutAlgorithmTest, ColumnBalancingLines) { TEST_F(NGColumnLayoutAlgorithmTest, ColumnBalancingLines) {
SetBodyInnerHTML(R"HTML( SetBodyInnerHTML(R"HTML(
<style> <style>
......
...@@ -1370,7 +1370,6 @@ crbug.com/967329 virtual/layout_ng_experimental/external/wpt/css/css-multicol/co ...@@ -1370,7 +1370,6 @@ crbug.com/967329 virtual/layout_ng_experimental/external/wpt/css/css-multicol/co
crbug.com/829028 virtual/layout_ng_experimental/external/wpt/css/css-multicol/filter-with-abspos.html [ Failure ] crbug.com/829028 virtual/layout_ng_experimental/external/wpt/css/css-multicol/filter-with-abspos.html [ Failure ]
crbug.com/829028 virtual/layout_ng_experimental/external/wpt/css/css-multicol/float-and-block.html [ Failure ] crbug.com/829028 virtual/layout_ng_experimental/external/wpt/css/css-multicol/float-and-block.html [ Failure ]
crbug.com/829028 virtual/layout_ng_experimental/external/wpt/css/css-multicol/float-with-line-after-spanner.html [ Failure ] crbug.com/829028 virtual/layout_ng_experimental/external/wpt/css/css-multicol/float-with-line-after-spanner.html [ Failure ]
crbug.com/829028 virtual/layout_ng_experimental/external/wpt/css/css-multicol/going-out-of-flow-after-spanner.html [ Failure ]
crbug.com/829028 virtual/layout_ng_experimental/external/wpt/css/css-multicol/inline-block-and-column-span-all.html [ Failure ] crbug.com/829028 virtual/layout_ng_experimental/external/wpt/css/css-multicol/inline-block-and-column-span-all.html [ Failure ]
crbug.com/591099 virtual/layout_ng_experimental/external/wpt/css/css-multicol/multicol-basic-001.html [ Failure ] crbug.com/591099 virtual/layout_ng_experimental/external/wpt/css/css-multicol/multicol-basic-001.html [ Failure ]
crbug.com/591099 virtual/layout_ng_experimental/external/wpt/css/css-multicol/multicol-basic-002.html [ Failure ] crbug.com/591099 virtual/layout_ng_experimental/external/wpt/css/css-multicol/multicol-basic-002.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