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 9082202d9d96b05d55c48895f491046eab5438f6..ae4722e5639624aede739e87e0b97c50998941fa 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 |
@@ -14,6 +14,18 @@ |
#include "platform/LengthFunctions.h" |
namespace blink { |
+namespace { |
+ |
+LayoutUnit ComputeCollapsedMarginBlockStart( |
+ const NGMarginStrut& prev_margin_strut, |
+ const NGMarginStrut& curr_margin_strut) { |
+ return std::max(prev_margin_strut.margin_block_end, |
+ curr_margin_strut.margin_block_start) - |
+ std::max(prev_margin_strut.negative_margin_block_end.abs(), |
+ curr_margin_strut.negative_margin_block_start.abs()); |
+} |
+ |
+} // namespace |
NGBlockLayoutAlgorithm::NGBlockLayoutAlgorithm( |
PassRefPtr<const ComputedStyle> style, |
@@ -50,13 +62,16 @@ bool NGBlockLayoutAlgorithm::Layout(const NGConstraintSpace* constraint_space, |
return false; |
NGBoxStrut child_margins = computeMargins( |
*constraint_space_for_children_, *current_child_->Style()); |
+ |
+ LayoutUnit margin_block_start = |
+ CollapseMargins(child_margins, fragment->MarginStrut()); |
+ |
// TODO(layout-ng): Support auto margins |
- builder_->AddChild( |
- fragment, |
- NGLogicalOffset(child_margins.inline_start, |
- content_size_ + child_margins.block_start)); |
+ builder_->AddChild(fragment, |
+ NGLogicalOffset(child_margins.inline_start, |
+ content_size_ + margin_block_start)); |
- content_size_ += fragment->BlockSize() + child_margins.BlockSum(); |
+ content_size_ += fragment->BlockSize() + margin_block_start; |
max_inline_size_ = |
std::max(max_inline_size_, |
fragment->InlineSize() + child_margins.InlineSum()); |
@@ -64,7 +79,6 @@ bool NGBlockLayoutAlgorithm::Layout(const NGConstraintSpace* constraint_space, |
if (current_child_) |
return false; |
} |
- |
state_ = kStateFinalize; |
return false; |
} |
@@ -86,4 +100,31 @@ bool NGBlockLayoutAlgorithm::Layout(const NGConstraintSpace* constraint_space, |
return true; |
} |
+LayoutUnit NGBlockLayoutAlgorithm::CollapseMargins( |
+ 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); |
+ curr_margin_strut.AppendMarginBlockEnd(margins.block_end); |
+ |
+ // Set the margin strut for the resultant fragment if this is the first or |
+ // last child fragment. |
+ if (current_child_ == first_child_) |
+ builder_->SetMarginStrutBlockStart(curr_margin_strut); |
+ if (!current_child_->NextSibling()) |
+ builder_->SetMarginStrutBlockEnd(curr_margin_strut); |
+ |
+ // Compute the margin block start for adjoining blocks. |
+ LayoutUnit margin_block_start; |
+ if (current_child_ != first_child_) |
+ margin_block_start = ComputeCollapsedMarginBlockStart( |
+ prev_child_margin_strut_, curr_margin_strut); |
+ |
+ prev_child_margin_strut_ = curr_margin_strut; |
+ // TODO(layout-ng): support other Margin Collapsing use cases, |
+ // i.e. support 0 height elements etc. |
+ return margin_block_start; |
+} |
+ |
} // namespace blink |