Commit c5d3db64 authored by Ian Kilpatrick's avatar Ian Kilpatrick Committed by Commit Bot

[LayoutNG] Properly handle block-end borders.

We previously didn't correctly handle block-end borders.

This fixes a couple of subtle bugs:
 - We don't grow the block-size of a fragment if it doesn't have
   any content.
 - We expand to encapsulate floats first, then grow to encapsulate
   the border.

Bug: 	635619
Cq-Include-Trybots: master.tryserver.chromium.linux:linux_layout_tests_layout_ng
Change-Id: I7770a1d23a9c25fcab51e2e681e00e4b4d3e9d08
Reviewed-on: https://chromium-review.googlesource.com/770645
Commit-Queue: Ian Kilpatrick <ikilpatrick@chromium.org>
Reviewed-by: default avatarChristian Biesinger <cbiesinger@chromium.org>
Cr-Commit-Position: refs/heads/master@{#517220}
parent eaa3cf0b
......@@ -418,9 +418,6 @@ crbug.com/704961 [ Mac ] virtual/layout_ng/external/wpt/css/CSS2/normal-flow/inl
crbug.com/704961 [ Mac ] virtual/layout_ng/external/wpt/css/CSS2/normal-flow/width-inherit-001.xht [ Failure ]
crbug.com/704961 [ Mac ] virtual/layout_ng/external/wpt/css/CSS2/positioning/abspos-027.xht [ Failure ]
### virtual/layout_ng Mac textarea.
crbug.com/763494 [ Mac ] virtual/layout_ng/fast/block/float/editable-text-overlapping-float.html [ Crash Failure ]
### virtual/layout_ng Mac 1px glyph difference.
crbug.com/635619 [ Mac ] virtual/layout_ng/fast/block/basic/015.html [ Failure ]
crbug.com/635619 [ Mac ] virtual/layout_ng/fast/block/float/026.html [ Failure ]
......@@ -458,7 +455,6 @@ crbug.com/635619 virtual/layout_ng/external/wpt/css/CSS2/floats-clear/floats-130
crbug.com/635619 virtual/layout_ng/external/wpt/css/CSS2/floats-clear/floats-131.xht [ Skip ]
crbug.com/635619 virtual/layout_ng/external/wpt/css/CSS2/floats-clear/floats-137.xht [ Skip ]
crbug.com/635619 virtual/layout_ng/external/wpt/css/CSS2/floats-clear/floats-143.xht [ Failure ]
crbug.com/635619 virtual/layout_ng/external/wpt/css/CSS2/floats-clear/margin-collapse-157.xht [ Failure ]
# Regressions while changing zero-block-size float behaviour.
crbug.com/635619 virtual/layout_ng/fast/block/margin-collapse/001.html [ Failure ]
......@@ -563,23 +559,6 @@ crbug.com/635619 virtual/layout_ng/external/wpt/css/CSS2/positioning/positioning
crbug.com/635619 virtual/layout_ng/external/wpt/css/CSS2/positioning/positioning-float-002.xht [ Failure ]
crbug.com/635619 virtual/layout_ng/external/wpt/css/CSS2/positioning/relpos-calcs-004.xht [ Failure ]
crbug.com/635619 virtual/layout_ng/external/wpt/css/CSS2/positioning/relpos-calcs-005.xht [ Failure ]
crbug.com/635619 virtual/layout_ng/external/wpt/css/CSS2/positioning/top-019.xht [ Crash Failure ]
crbug.com/635619 virtual/layout_ng/external/wpt/css/CSS2/positioning/top-020.xht [ Crash Failure ]
crbug.com/635619 virtual/layout_ng/external/wpt/css/CSS2/positioning/top-031.xht [ Crash Failure ]
crbug.com/635619 virtual/layout_ng/external/wpt/css/CSS2/positioning/top-032.xht [ Crash Failure ]
crbug.com/635619 virtual/layout_ng/external/wpt/css/CSS2/positioning/top-043.xht [ Crash Failure ]
crbug.com/635619 virtual/layout_ng/external/wpt/css/CSS2/positioning/top-044.xht [ Crash Failure ]
crbug.com/635619 virtual/layout_ng/external/wpt/css/CSS2/positioning/top-055.xht [ Crash Failure ]
crbug.com/635619 virtual/layout_ng/external/wpt/css/CSS2/positioning/top-056.xht [ Crash Failure ]
crbug.com/635619 virtual/layout_ng/external/wpt/css/CSS2/positioning/top-067.xht [ Crash Failure ]
crbug.com/635619 virtual/layout_ng/external/wpt/css/CSS2/positioning/top-068.xht [ Crash Failure ]
crbug.com/635619 virtual/layout_ng/external/wpt/css/CSS2/positioning/top-079.xht [ Crash Failure ]
crbug.com/635619 virtual/layout_ng/external/wpt/css/CSS2/positioning/top-080.xht [ Crash Failure ]
crbug.com/635619 virtual/layout_ng/external/wpt/css/CSS2/positioning/top-091.xht [ Crash Failure ]
crbug.com/635619 virtual/layout_ng/external/wpt/css/CSS2/positioning/top-092.xht [ Crash Failure ]
crbug.com/635619 virtual/layout_ng/external/wpt/css/CSS2/positioning/top-103.xht [ Crash Failure ]
crbug.com/635619 virtual/layout_ng/external/wpt/css/CSS2/positioning/top-104.xht [ Crash Failure ]
crbug.com/635619 virtual/layout_ng/external/wpt/css/CSS2/positioning/top-113.xht [ Crash Failure ]
### virtual/layout_ng/fast/block/basic
crbug.com/635619 virtual/layout_ng/fast/block/basic/011.html [ Failure ]
......@@ -653,7 +632,6 @@ crbug.com/635619 virtual/layout_ng/fast/block/float/trailing-float-with-columns.
crbug.com/635619 [ Mac ] virtual/layout_ng/fast/block/float/width-update-after-clear.html [ Failure ]
### virtual/layout_ng/fast/block/margin-collapse
crbug.com/635619 virtual/layout_ng/fast/block/margin-collapse/057.html [ Failure ]
crbug.com/635619 virtual/layout_ng/fast/block/margin-collapse/103.html [ Failure ]
### virtual/layout_ng/fast/block/margin-collapse/block-inside-inline
......
......@@ -301,6 +301,25 @@ scoped_refptr<NGLayoutResult> NGBlockLayoutAlgorithm::Layout() {
NGMarginStrut end_margin_strut = previous_inflow_position.margin_strut;
LayoutUnit end_bfc_block_offset = previous_inflow_position.bfc_block_offset;
// If the current layout is a new formatting context, we need to encapsulate
// all of our floats.
if (ConstraintSpace().IsNewFormattingContext()) {
// We can use the BFC coordinates, as we are a new formatting context.
DCHECK_EQ(container_builder_.BfcOffset().value(), NGBfcOffset());
WTF::Optional<LayoutUnit> float_end_offset =
exclusion_space_->ClearanceOffset(EClear::kBoth);
// We only update the size of this fragment if we need to grow to
// encapsulate the floats.
if (float_end_offset && float_end_offset.value() > end_bfc_block_offset) {
end_margin_strut = NGMarginStrut();
end_bfc_block_offset = float_end_offset.value();
intrinsic_block_size_ =
std::max(intrinsic_block_size_, float_end_offset.value());
}
}
// The end margin strut of an in-flow fragment contributes to the size of the
// current fragment if:
// - There is block-end border/scrollbar/padding.
......@@ -316,28 +335,39 @@ scoped_refptr<NGLayoutResult> NGBlockLayoutAlgorithm::Layout() {
// *last* quirky margin.
// TODO: revisit previous implementation to avoid changing behavior and
// https://html.spec.whatwg.org/multipage/rendering.html#margin-collapsing-quirks
intrinsic_block_size_ = std::max(
intrinsic_block_size_,
previous_inflow_position.logical_block_offset +
(node_.IsQuirkyContainer() ? end_margin_strut.QuirkyContainerSum()
: end_margin_strut.Sum()));
end_margin_strut = NGMarginStrut();
}
LayoutUnit margin_strut_sum = node_.IsQuirkyContainer()
? end_margin_strut.QuirkyContainerSum()
: end_margin_strut.Sum();
end_bfc_block_offset += margin_strut_sum;
bool updated = MaybeUpdateFragmentBfcOffset(end_bfc_block_offset);
// If the current layout is a new formatting context, we need to encapsulate
// all of our floats.
if (ConstraintSpace().IsNewFormattingContext()) {
// We can use the BFC coordinates, as we are a new formatting context.
DCHECK_EQ(container_builder_.BfcOffset().value(), NGBfcOffset());
if (updated && abort_when_bfc_resolved_) {
// New formatting contexts, and where we have an empty block affected by
// clearance should already have their BFC offset resolved, and shouldn't
// enter this branch.
DCHECK(!previous_inflow_position.empty_block_affected_by_clearance);
DCHECK(!ConstraintSpace().IsNewFormattingContext());
WTF::Optional<LayoutUnit> float_end_offset =
exclusion_space_->ClearanceOffset(EClear::kBoth);
if (float_end_offset)
intrinsic_block_size_ =
std::max(intrinsic_block_size_, float_end_offset.value());
}
container_builder_.SwapUnpositionedFloats(&unpositioned_floats_);
return container_builder_.Abort(NGLayoutResult::kBfcOffsetResolved);
}
intrinsic_block_size_ += border_scrollbar_padding_.block_end;
PositionPendingFloats(end_bfc_block_offset);
// We only grow the intrinsic block size if we have content (if we didn't
// update our BFC offset). E.g.
// <div style="margin-bottom: solid 20px"></div>
// In the above example the current layout won't have resolved its BFC
// offset yet, and shouldn't include the margin strut in its size.
if (!updated) {
intrinsic_block_size_ = std::max(
intrinsic_block_size_,
previous_inflow_position.logical_block_offset + margin_strut_sum);
}
intrinsic_block_size_ += border_scrollbar_padding_.block_end;
end_margin_strut = NGMarginStrut();
}
// Recompute the block-axis size now that we know our content size.
size.block_size = ComputeBlockSizeForFragment(ConstraintSpace(), Style(),
......@@ -366,6 +396,7 @@ scoped_refptr<NGLayoutResult> NGBlockLayoutAlgorithm::Layout() {
// TODO(glebl): handle minLogicalHeight, maxLogicalHeight.
end_margin_strut = NGMarginStrut();
}
container_builder_.SetEndMarginStrut(end_margin_strut);
container_builder_.SetIntrinsicBlockSize(intrinsic_block_size_);
......
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