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..477e89b9d2f9fd80a0b92929f9448ae5a0cf9e02 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( |
+ child_margins, fragment->MarginStrut(), *constraint_space); |
// TODO(layout-ng): Support auto margins |
builder_->AddChild(fragment, |
@@ -108,13 +108,32 @@ bool NGBlockLayoutAlgorithm::Layout(const NGConstraintSpace* constraint_space, |
LayoutUnit NGBlockLayoutAlgorithm::CollapseMargins( |
const NGBoxStrut& margins, |
- const NGMarginStrut& children_margin_strut) { |
+ const NGMarginStrut& children_margin_strut, |
+ const NGConstraintSpace& space) { |
// 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 |
+ LayoutUnit margin_block_start; |
+ |
+ // Calculate borders and padding for the current child. |
+ LayoutUnit border_and_padding_before = |
+ computeBorderAndPaddingBlockStart(space, *current_child_->Style()); |
+ LayoutUnit border_and_padding_after = |
+ computeBorderAndPaddingBlockEnd(space, *current_child_->Style()); |
+ |
+ // Collapse TOP margins if there is no padding or border between |
ikilpatrick
2016/09/14 18:45:25
s/TOP/BLOCK-START
Gleb Lanbin
2016/09/14 18:58:31
Done.
|
+ // parent(current child) and its first in-flow child. |
ikilpatrick
2016/09/14 18:45:25
insert space between "parent ("
Gleb Lanbin
2016/09/14 18:58:31
Done.
|
+ if (border_and_padding_before) { |
+ curr_margin_strut.SetMarginBlockStart(margins.block_start); |
+ } else { |
+ curr_margin_strut.AppendMarginBlockStart(margins.block_start); |
+ } |
+ |
+ // Collapse BOTOM margins if |
ikilpatrick
2016/09/14 18:45:25
s/BOTTOM/BLOCK-END
Gleb Lanbin
2016/09/14 18:58:31
Done.
|
+ // 1) there is no padding or border between parent(current child) and its |
ikilpatrick
2016/09/14 18:45:25
This this change if box-sizing: border-box is appl
ikilpatrick
2016/09/14 18:45:25
insert space between "parent ("
Gleb Lanbin
2016/09/14 18:58:31
Setting box-sizing doesn't have any affect on marg
Gleb Lanbin
2016/09/14 18:58:31
Done.
|
+ // 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); |