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

[LayoutNG] Spanner margin affects size of next column row.

We were setting the *position* of the column row after a spanner
correctly, but the *size* was wrong, if there was a trailing spanner
margin.

Just update the layout position up front when entering layout of a
column row, which simplifies the code and fixes bugs.

Bug: 829028
Change-Id: I473ff1fe43da3b8b852a0a2f199c7537d7bfc3a4
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2410242Reviewed-by: default avatarIan Kilpatrick <ikilpatrick@chromium.org>
Commit-Queue: Morten Stenshorne <mstensho@chromium.org>
Cr-Commit-Position: refs/heads/master@{#807367}
parent a252d4a4
...@@ -478,6 +478,11 @@ scoped_refptr<const NGLayoutResult> NGColumnLayoutAlgorithm::LayoutRow( ...@@ -478,6 +478,11 @@ scoped_refptr<const NGLayoutResult> NGColumnLayoutAlgorithm::LayoutRow(
NGMarginStrut* margin_strut) { NGMarginStrut* margin_strut) {
LogicalSize column_size(column_inline_size_, column_block_size_); LogicalSize column_size(column_inline_size_, column_block_size_);
// We're adding a row. Incorporate the trailing margin from any preceding
// column spanner into the layout position.
intrinsic_block_size_ += margin_strut->Sum();
*margin_strut = NGMarginStrut();
// If block-size is non-auto, subtract the space for content we've consumed in // If block-size is non-auto, subtract the space for content we've consumed in
// previous fragments. This is necessary when we're nested inside another // previous fragments. This is necessary when we're nested inside another
// fragmentation context. // fragmentation context.
...@@ -504,15 +509,11 @@ scoped_refptr<const NGLayoutResult> NGColumnLayoutAlgorithm::LayoutRow( ...@@ -504,15 +509,11 @@ scoped_refptr<const NGLayoutResult> NGColumnLayoutAlgorithm::LayoutRow(
CalculateBalancedColumnBlockSize(column_size, next_column_token); CalculateBalancedColumnBlockSize(column_size, next_column_token);
} }
// Column rows have no representation in the DOM and have no margins, but
// there may be a trailing margin from a preceding spanner.
LayoutUnit column_block_offset = intrinsic_block_size_ + margin_strut->Sum();
bool needs_more_fragments_in_outer = false; bool needs_more_fragments_in_outer = false;
bool zero_outer_space_left = false; bool zero_outer_space_left = false;
if (is_constrained_by_outer_fragmentation_context_) { if (is_constrained_by_outer_fragmentation_context_) {
LayoutUnit available_outer_space = LayoutUnit available_outer_space =
FragmentainerSpaceAtBfcStart(ConstraintSpace()) - column_block_offset; FragmentainerSpaceAtBfcStart(ConstraintSpace()) - intrinsic_block_size_;
if (available_outer_space <= LayoutUnit()) { if (available_outer_space <= LayoutUnit()) {
if (available_outer_space < LayoutUnit()) { if (available_outer_space < LayoutUnit()) {
...@@ -598,7 +599,7 @@ scoped_refptr<const NGLayoutResult> NGColumnLayoutAlgorithm::LayoutRow( ...@@ -598,7 +599,7 @@ scoped_refptr<const NGLayoutResult> NGColumnLayoutAlgorithm::LayoutRow(
// Add the new column fragment to the list, but don't commit anything to // Add the new column fragment to the list, but don't commit anything to
// the fragment builder until we know whether these are the final columns. // the fragment builder until we know whether these are the final columns.
LogicalOffset logical_offset(column_inline_offset, column_block_offset); LogicalOffset logical_offset(column_inline_offset, intrinsic_block_size_);
new_columns.emplace_back(result, logical_offset); new_columns.emplace_back(result, logical_offset);
LayoutUnit space_shortage = result->MinimalSpaceShortage(); LayoutUnit space_shortage = result->MinimalSpaceShortage();
...@@ -706,7 +707,7 @@ scoped_refptr<const NGLayoutResult> NGColumnLayoutAlgorithm::LayoutRow( ...@@ -706,7 +707,7 @@ scoped_refptr<const NGLayoutResult> NGColumnLayoutAlgorithm::LayoutRow(
column_size.block_size = new_column_block_size; column_size.block_size = new_column_block_size;
} while (true); } while (true);
intrinsic_block_size_ = column_block_offset + column_size.block_size; intrinsic_block_size_ += column_size.block_size;
// If we just have one empty fragmentainer, we need to keep the trailing // If we just have one empty fragmentainer, we need to keep the trailing
// margin from any previous column spanner, and also make sure that we don't // margin from any previous column spanner, and also make sure that we don't
...@@ -719,10 +720,6 @@ scoped_refptr<const NGLayoutResult> NGColumnLayoutAlgorithm::LayoutRow( ...@@ -719,10 +720,6 @@ scoped_refptr<const NGLayoutResult> NGColumnLayoutAlgorithm::LayoutRow(
if (!is_empty) { if (!is_empty) {
has_processed_first_child_ = true; has_processed_first_child_ = true;
container_builder_.SetPreviousBreakAfter(EBreakBetween::kAuto); container_builder_.SetPreviousBreakAfter(EBreakBetween::kAuto);
// We added a row. Reset the trailing margin from any previous column
// spanner.
*margin_strut = NGMarginStrut();
} }
// Commit all column fragments to the fragment builder. // Commit all column fragments to the fragment builder.
......
...@@ -1025,7 +1025,6 @@ crbug.com/829028 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/mult ...@@ -1025,7 +1025,6 @@ crbug.com/829028 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/mult
crbug.com/1079031 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-contained-absolute.html [ Failure ] crbug.com/1079031 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-contained-absolute.html [ Failure ]
crbug.com/1079031 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-containing-002.xht [ Crash Failure ] crbug.com/1079031 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-containing-002.xht [ Crash Failure ]
crbug.com/1079031 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-fill-auto-002.xht [ Crash Failure ] crbug.com/1079031 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-fill-auto-002.xht [ Crash Failure ]
crbug.com/829028 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-fill-auto-block-children-001.xht [ Failure ]
crbug.com/1079031 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-fill-balance-001.xht [ Crash Failure ] crbug.com/1079031 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-fill-balance-001.xht [ Crash Failure ]
crbug.com/829028 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-gap-large-001.xht [ Failure ] crbug.com/829028 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-gap-large-001.xht [ Failure ]
crbug.com/829028 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-inherit-001.xht [ Failure ] crbug.com/829028 virtual/layout_ng_block_frag/external/wpt/css/css-multicol/multicol-inherit-001.xht [ 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