Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(276)

Side by Side Diff: third_party/WebKit/Source/core/layout/ng/ng_block_layout_algorithm.cc

Issue 2346473003: Do not collapse margins with padding/border b/w parent and first/last child (Closed)
Patch Set: renamed TOP/BOTTOM to BLOCK-{START|END} Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "core/layout/ng/ng_block_layout_algorithm.h" 5 #include "core/layout/ng/ng_block_layout_algorithm.h"
6 6
7 #include "core/layout/ng/ng_constraint_space.h" 7 #include "core/layout/ng/ng_constraint_space.h"
8 #include "core/layout/ng/ng_fragment_builder.h" 8 #include "core/layout/ng/ng_fragment_builder.h"
9 #include "core/layout/ng/ng_fragment.h" 9 #include "core/layout/ng/ng_fragment.h"
10 #include "core/layout/ng/ng_length_utils.h" 10 #include "core/layout/ng/ng_length_utils.h"
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
59 return false; 59 return false;
60 } 60 }
61 case kStateChildLayout: { 61 case kStateChildLayout: {
62 if (current_child_) { 62 if (current_child_) {
63 NGFragment* fragment; 63 NGFragment* fragment;
64 if (!current_child_->Layout(constraint_space_for_children_, &fragment)) 64 if (!current_child_->Layout(constraint_space_for_children_, &fragment))
65 return false; 65 return false;
66 NGBoxStrut child_margins = computeMargins( 66 NGBoxStrut child_margins = computeMargins(
67 *constraint_space_for_children_, *current_child_->Style()); 67 *constraint_space_for_children_, *current_child_->Style());
68 68
69 LayoutUnit margin_block_start = 69 LayoutUnit margin_block_start = CollapseMargins(
70 CollapseMargins(child_margins, fragment->MarginStrut()); 70 *constraint_space, child_margins, fragment->MarginStrut());
71 71
72 // TODO(layout-ng): Support auto margins 72 // TODO(layout-ng): Support auto margins
73 builder_->AddChild(fragment, 73 builder_->AddChild(fragment,
74 NGLogicalOffset(border_and_padding_.inline_start + 74 NGLogicalOffset(border_and_padding_.inline_start +
75 child_margins.inline_start, 75 child_margins.inline_start,
76 content_size_ + margin_block_start)); 76 content_size_ + margin_block_start));
77 77
78 content_size_ += fragment->BlockSize() + margin_block_start; 78 content_size_ += fragment->BlockSize() + margin_block_start;
79 max_inline_size_ = 79 max_inline_size_ =
80 std::max(max_inline_size_, fragment->InlineSize() + 80 std::max(max_inline_size_, fragment->InlineSize() +
(...skipping 19 matching lines...) Expand all
100 state_ = kStateInit; 100 state_ = kStateInit;
101 return true; 101 return true;
102 } 102 }
103 }; 103 };
104 NOTREACHED(); 104 NOTREACHED();
105 *out = nullptr; 105 *out = nullptr;
106 return true; 106 return true;
107 } 107 }
108 108
109 LayoutUnit NGBlockLayoutAlgorithm::CollapseMargins( 109 LayoutUnit NGBlockLayoutAlgorithm::CollapseMargins(
110 const NGConstraintSpace& space,
110 const NGBoxStrut& margins, 111 const NGBoxStrut& margins,
111 const NGMarginStrut& children_margin_strut) { 112 const NGMarginStrut& children_margin_strut) {
112 // Calculate margin strut for the current child. 113 // Calculate margin strut for the current child.
113 NGMarginStrut curr_margin_strut = children_margin_strut; 114 NGMarginStrut curr_margin_strut = children_margin_strut;
114 curr_margin_strut.AppendMarginBlockStart(margins.block_start); 115 LayoutUnit margin_block_start;
115 if (current_child_->Style()->logicalHeight().isAuto()) { 116
116 // bottom margin of a last in-flow child is only collapsed if 117 // Calculate borders and padding for the current child.
117 // the parent has 'auto' computed height 118 LayoutUnit border_and_padding_before =
119 computeBorderAndPaddingBlockStart(space, *current_child_->Style());
cbiesinger 2016/09/14 19:12:18 These functions were removed in https://codereview
Gleb Lanbin 2016/09/14 19:41:27 Done.
120 LayoutUnit border_and_padding_after =
121 computeBorderAndPaddingBlockEnd(space, *current_child_->Style());
122
123 // Collapse BLOCK-START margins if there is no padding or border between
124 // parent (current child) and its first in-flow child.
125 if (border_and_padding_before) {
126 curr_margin_strut.SetMarginBlockStart(margins.block_start);
127 } else {
128 curr_margin_strut.AppendMarginBlockStart(margins.block_start);
129 }
130
131 // Collapse BLOCK-END margins if
132 // 1) there is no padding or border between parent (current child) and its
133 // first/last in-flow child
134 // 2) parent's logical height is auto.
135 if (current_child_->Style()->logicalHeight().isAuto() &&
136 !border_and_padding_after) {
118 curr_margin_strut.AppendMarginBlockEnd(margins.block_end); 137 curr_margin_strut.AppendMarginBlockEnd(margins.block_end);
119 } else { 138 } else {
120 curr_margin_strut.SetMarginBlockEnd(margins.block_end); 139 curr_margin_strut.SetMarginBlockEnd(margins.block_end);
121 } 140 }
122 141
123 // Set the margin strut for the resultant fragment if this is the first or 142 // Set the margin strut for the resultant fragment if this is the first or
124 // last child fragment. 143 // last child fragment.
125 if (current_child_ == first_child_) 144 if (current_child_ == first_child_)
126 builder_->SetMarginStrutBlockStart(curr_margin_strut); 145 builder_->SetMarginStrutBlockStart(curr_margin_strut);
127 if (!current_child_->NextSibling()) 146 if (!current_child_->NextSibling())
128 builder_->SetMarginStrutBlockEnd(curr_margin_strut); 147 builder_->SetMarginStrutBlockEnd(curr_margin_strut);
129 148
130 // Compute the margin block start for adjoining blocks. 149 // Compute the margin block start for adjoining blocks.
131 LayoutUnit margin_block_start; 150 LayoutUnit margin_block_start;
132 if (current_child_ != first_child_) 151 if (current_child_ != first_child_)
133 margin_block_start = ComputeCollapsedMarginBlockStart( 152 margin_block_start = ComputeCollapsedMarginBlockStart(
134 prev_child_margin_strut_, curr_margin_strut); 153 prev_child_margin_strut_, curr_margin_strut);
135 154
136 prev_child_margin_strut_ = curr_margin_strut; 155 prev_child_margin_strut_ = curr_margin_strut;
137 // TODO(layout-ng): support other Margin Collapsing use cases, 156 // TODO(layout-ng): support other Margin Collapsing use cases,
138 // i.e. support 0 height elements etc. 157 // i.e. support 0 height elements etc.
139 return margin_block_start; 158 return margin_block_start;
140 } 159 }
141 160
142 } // namespace blink 161 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698