| Index: third_party/WebKit/Source/core/layout/ng/ng_block_layout_algorithm.cc
|
| diff --git a/third_party/WebKit/Source/core/layout/ng/ng_block_layout_algorithm.cc b/third_party/WebKit/Source/core/layout/ng/ng_block_layout_algorithm.cc
|
| index 3c77a6bce448f472f72ccb3eea153facd476dbd9..452acc60a06ab40985b40c50a90f3d45c6c0d6bd 100644
|
| --- a/third_party/WebKit/Source/core/layout/ng/ng_block_layout_algorithm.cc
|
| +++ b/third_party/WebKit/Source/core/layout/ng/ng_block_layout_algorithm.cc
|
| @@ -66,8 +66,8 @@ bool NGBlockLayoutAlgorithm::Layout(const NGConstraintSpace* constraint_space,
|
| NGBoxStrut child_margins = computeMargins(
|
| *constraint_space_for_children_, *current_child_->Style());
|
|
|
| - LayoutUnit margin_block_start =
|
| - CollapseMargins(child_margins, fragment->MarginStrut());
|
| + LayoutUnit margin_block_start = CollapseMargins(
|
| + *constraint_space, child_margins, fragment->MarginStrut());
|
|
|
| // TODO(layout-ng): Support auto margins
|
| builder_->AddChild(fragment,
|
| @@ -107,14 +107,33 @@ bool NGBlockLayoutAlgorithm::Layout(const NGConstraintSpace* constraint_space,
|
| }
|
|
|
| LayoutUnit NGBlockLayoutAlgorithm::CollapseMargins(
|
| + const NGConstraintSpace& space,
|
| const NGBoxStrut& margins,
|
| const NGMarginStrut& children_margin_strut) {
|
| // Calculate margin strut for the current child.
|
| NGMarginStrut curr_margin_strut = children_margin_strut;
|
| - curr_margin_strut.AppendMarginBlockStart(margins.block_start);
|
| - if (current_child_->Style()->logicalHeight().isAuto()) {
|
| - // bottom margin of a last in-flow child is only collapsed if
|
| - // the parent has 'auto' computed height
|
| +
|
| + // Calculate borders and padding for the current child.
|
| + NGBoxStrut borders = computeBorders(*current_child_->Style());
|
| + NGBoxStrut paddings = computePadding(space, *current_child_->Style());
|
| + LayoutUnit border_and_padding_before =
|
| + borders.block_start + paddings.block_start;
|
| + LayoutUnit border_and_padding_after = borders.block_end + paddings.block_end;
|
| +
|
| + // Collapse BLOCK-START margins if there is no padding or border between
|
| + // parent (current child) and its first in-flow child.
|
| + if (border_and_padding_before) {
|
| + curr_margin_strut.SetMarginBlockStart(margins.block_start);
|
| + } else {
|
| + curr_margin_strut.AppendMarginBlockStart(margins.block_start);
|
| + }
|
| +
|
| + // Collapse BLOCK-END margins if
|
| + // 1) there is no padding or border between parent (current child) and its
|
| + // first/last in-flow child
|
| + // 2) parent's logical height is auto.
|
| + if (current_child_->Style()->logicalHeight().isAuto() &&
|
| + !border_and_padding_after) {
|
| curr_margin_strut.AppendMarginBlockEnd(margins.block_end);
|
| } else {
|
| curr_margin_strut.SetMarginBlockEnd(margins.block_end);
|
|
|