OLD | NEW |
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" |
11 #include "core/layout/ng/ng_units.h" | 11 #include "core/layout/ng/ng_units.h" |
12 #include "core/style/ComputedStyle.h" | 12 #include "core/style/ComputedStyle.h" |
13 #include "platform/LengthFunctions.h" | 13 #include "platform/LengthFunctions.h" |
14 | 14 |
15 namespace blink { | 15 namespace blink { |
16 namespace { | 16 namespace { |
17 | 17 |
18 LayoutUnit ComputeCollapsedMarginBlockStart( | 18 LayoutUnit ComputeCollapsedMarginBlockStart( |
19 const NGMarginStrut& prev_margin_strut, | 19 const NGMarginStrut& prev_margin_strut, |
20 const NGMarginStrut& curr_margin_strut) { | 20 const NGMarginStrut& curr_margin_strut) { |
21 return std::max(prev_margin_strut.margin_block_end, | 21 return std::max(prev_margin_strut.margin_block_end, |
22 curr_margin_strut.margin_block_start) - | 22 curr_margin_strut.margin_block_start) - |
23 std::max(prev_margin_strut.negative_margin_block_end.abs(), | 23 std::max(prev_margin_strut.negative_margin_block_end.abs(), |
24 curr_margin_strut.negative_margin_block_start.abs()); | 24 curr_margin_strut.negative_margin_block_start.abs()); |
25 } | 25 } |
26 | 26 |
| 27 // Whether an in-flow block-level child creates a new formatting context. |
| 28 // |
| 29 // This will *NOT* check the following cases: |
| 30 // - The child is out-of-flow, e.g. floating or abs-pos. |
| 31 // - The child is a inline-level, e.g. "display: inline-block". |
| 32 // - The child establishes a new formatting context, but should be a child of |
| 33 // another layout algorithm, e.g. "display: table-caption" or flex-item. |
| 34 bool IsNewFormattingContextForInFlowBlockLevelChild( |
| 35 const NGConstraintSpace& space, |
| 36 const ComputedStyle& style) { |
| 37 // TODO(layout-dev): This doesn't capture a few cases which can't be computed |
| 38 // directly from style yet: |
| 39 // - The child is a <fieldset>. |
| 40 // - "column-span: all" is set on the child (requires knowledge that we are |
| 41 // in a multi-col formatting context). |
| 42 // (https://drafts.csswg.org/css-multicol-1/#valdef-column-span-all) |
| 43 |
| 44 if (style.specifiesColumns() || style.containsPaint() || |
| 45 style.containsLayout()) |
| 46 return true; |
| 47 |
| 48 if (!style.isOverflowVisible()) |
| 49 return true; |
| 50 |
| 51 EDisplay display = style.display(); |
| 52 if (display == EDisplay::Grid || display == EDisplay::Flex || |
| 53 display == EDisplay::Box) |
| 54 return true; |
| 55 |
| 56 if (space.WritingMode() != FromPlatformWritingMode(style.getWritingMode())) |
| 57 return true; |
| 58 |
| 59 return false; |
| 60 } |
| 61 |
27 } // namespace | 62 } // namespace |
28 | 63 |
29 NGBlockLayoutAlgorithm::NGBlockLayoutAlgorithm( | 64 NGBlockLayoutAlgorithm::NGBlockLayoutAlgorithm( |
30 PassRefPtr<const ComputedStyle> style, | 65 PassRefPtr<const ComputedStyle> style, |
31 NGBox* first_child) | 66 NGBox* first_child) |
32 : style_(style), | 67 : style_(style), |
33 first_child_(first_child), | 68 first_child_(first_child), |
34 state_(kStateInit), | 69 state_(kStateInit), |
35 is_fragment_margin_strut_block_start_updated_(false) { | 70 is_fragment_margin_strut_block_start_updated_(false) { |
36 DCHECK(style_); | 71 DCHECK(style_); |
(...skipping 29 matching lines...) Expand all Loading... |
66 builder_ = new NGFragmentBuilder(NGPhysicalFragmentBase::FragmentBox); | 101 builder_ = new NGFragmentBuilder(NGPhysicalFragmentBase::FragmentBox); |
67 builder_->SetDirection(constraint_space->Direction()); | 102 builder_->SetDirection(constraint_space->Direction()); |
68 builder_->SetWritingMode(constraint_space->WritingMode()); | 103 builder_->SetWritingMode(constraint_space->WritingMode()); |
69 builder_->SetInlineSize(inline_size).SetBlockSize(block_size); | 104 builder_->SetInlineSize(inline_size).SetBlockSize(block_size); |
70 current_child_ = first_child_; | 105 current_child_ = first_child_; |
71 state_ = kStateChildLayout; | 106 state_ = kStateChildLayout; |
72 return false; | 107 return false; |
73 } | 108 } |
74 case kStateChildLayout: { | 109 case kStateChildLayout: { |
75 if (current_child_) { | 110 if (current_child_) { |
| 111 constraint_space_for_children_->SetIsNewFormattingContext( |
| 112 IsNewFormattingContextForInFlowBlockLevelChild( |
| 113 *constraint_space, *current_child_->Style())); |
| 114 |
76 NGFragment* fragment; | 115 NGFragment* fragment; |
77 if (!current_child_->Layout(constraint_space_for_children_, &fragment)) | 116 if (!current_child_->Layout(constraint_space_for_children_, &fragment)) |
78 return false; | 117 return false; |
79 NGBoxStrut child_margins = ComputeMargins( | 118 NGBoxStrut child_margins = ComputeMargins( |
80 *constraint_space_for_children_, *current_child_->Style(), | 119 *constraint_space_for_children_, *current_child_->Style(), |
81 constraint_space_for_children_->WritingMode(), | 120 constraint_space_for_children_->WritingMode(), |
82 constraint_space_for_children_->Direction()); | 121 constraint_space_for_children_->Direction()); |
83 ApplyAutoMargins(*constraint_space_for_children_, | 122 ApplyAutoMargins(*constraint_space_for_children_, |
84 *current_child_->Style(), *fragment, child_margins); | 123 *current_child_->Style(), *fragment, child_margins); |
85 | 124 |
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
193 | 232 |
194 void NGBlockLayoutAlgorithm::UpdateMarginStrut(const NGMarginStrut& from) { | 233 void NGBlockLayoutAlgorithm::UpdateMarginStrut(const NGMarginStrut& from) { |
195 if (!is_fragment_margin_strut_block_start_updated_) { | 234 if (!is_fragment_margin_strut_block_start_updated_) { |
196 builder_->SetMarginStrutBlockStart(from); | 235 builder_->SetMarginStrutBlockStart(from); |
197 is_fragment_margin_strut_block_start_updated_ = true; | 236 is_fragment_margin_strut_block_start_updated_ = true; |
198 } | 237 } |
199 builder_->SetMarginStrutBlockEnd(from); | 238 builder_->SetMarginStrutBlockEnd(from); |
200 } | 239 } |
201 | 240 |
202 } // namespace blink | 241 } // namespace blink |
OLD | NEW |