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

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

Issue 2365083002: Make NGFragment to own NGPhysicalFragment (Closed)
Patch Set: Created 4 years, 2 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_box.h" 5 #include "core/layout/ng/ng_box.h"
6 6
7 #include "core/layout/LayoutBlockFlow.h" 7 #include "core/layout/LayoutBlockFlow.h"
8 #include "core/layout/ng/layout_ng_block_flow.h" 8 #include "core/layout/ng/layout_ng_block_flow.h"
9 #include "core/layout/ng/ng_block_layout_algorithm.h" 9 #include "core/layout/ng/ng_block_layout_algorithm.h"
10 #include "core/layout/ng/ng_constraint_space.h" 10 #include "core/layout/ng/ng_constraint_space.h"
11 #include "core/layout/ng/ng_direction.h" 11 #include "core/layout/ng/ng_direction.h"
12 #include "core/layout/ng/ng_fragment.h" 12 #include "core/layout/ng/ng_fragment.h"
13 #include "core/layout/ng/ng_fragment_builder.h" 13 #include "core/layout/ng/ng_fragment_builder.h"
14 #include "core/layout/ng/ng_length_utils.h" 14 #include "core/layout/ng/ng_length_utils.h"
15 #include "core/layout/ng/ng_writing_mode.h" 15 #include "core/layout/ng/ng_writing_mode.h"
16 16
17 namespace blink { 17 namespace blink {
18 NGBox::NGBox(LayoutObject* layout_object) 18 NGBox::NGBox(LayoutObject* layout_object)
19 : layout_box_(toLayoutBox(layout_object)) { 19 : layout_box_(toLayoutBox(layout_object)) {
20 DCHECK(layout_box_); 20 DCHECK(layout_box_);
21 } 21 }
22 22
23 NGBox::NGBox(ComputedStyle* style) : layout_box_(nullptr), style_(style) { 23 NGBox::NGBox(ComputedStyle* style) : layout_box_(nullptr), style_(style) {
24 DCHECK(style_); 24 DCHECK(style_);
25 } 25 }
26 26
27 bool NGBox::Layout(const NGConstraintSpace* constraint_space, 27 bool NGBox::Layout(const NGConstraintSpace* constraint_space) {
28 NGFragment** out) {
29 if (layout_box_ && layout_box_->isOutOfFlowPositioned()) 28 if (layout_box_ && layout_box_->isOutOfFlowPositioned())
30 layout_box_->containingBlock()->insertPositionedObject(layout_box_); 29 layout_box_->containingBlock()->insertPositionedObject(layout_box_);
30
31 NGPhysicalFragment* physical_fragment = nullptr;
31 // We can either use the new layout code to do the layout and then copy the 32 // We can either use the new layout code to do the layout and then copy the
32 // resulting size to the LayoutObject, or use the old layout code and 33 // resulting size to the LayoutObject, or use the old layout code and
33 // synthesize a fragment. 34 // synthesize a fragment.
34 if (CanUseNewLayout()) { 35 if (CanUseNewLayout()) {
35 if (!algorithm_) 36 if (!algorithm_)
36 algorithm_ = new NGBlockLayoutAlgorithm(Style(), FirstChild()); 37 algorithm_ = new NGBlockLayoutAlgorithm(Style(), FirstChild());
37 // Change the coordinate system of the constraint space. 38 // Change the coordinate system of the constraint space.
38 NGConstraintSpace* child_constraint_space = new NGConstraintSpace( 39 NGConstraintSpace child_constraint_space(
39 FromPlatformWritingMode(Style()->getWritingMode()), 40 FromPlatformWritingMode(Style()->getWritingMode()),
40 FromPlatformDirection(Style()->direction()), constraint_space); 41 FromPlatformDirection(Style()->direction()), constraint_space);
41 42
42 NGPhysicalFragment* fragment = nullptr; 43 if (!algorithm_->Layout(child_constraint_space, &physical_fragment))
43 if (!algorithm_->Layout(child_constraint_space, &fragment))
44 return false; 44 return false;
45 fragment_ = fragment;
46 45
47 if (layout_box_) { 46 if (layout_box_) {
48 layout_box_->setWidth(fragment_->Width()); 47 layout_box_->setWidth(physical_fragment->Width());
49 layout_box_->setHeight(fragment_->Height()); 48 layout_box_->setHeight(physical_fragment->Height());
50 NGBoxStrut border_and_padding = 49 NGBoxStrut border_and_padding =
51 computeBorders(*Style()) + 50 computeBorders(*Style()) +
52 computePadding(*constraint_space, *Style()); 51 computePadding(*constraint_space, *Style());
53 LayoutUnit intrinsic_logical_height = 52 LayoutUnit intrinsic_logical_height =
54 layout_box_->style()->isHorizontalWritingMode() 53 layout_box_->style()->isHorizontalWritingMode()
55 ? fragment_->HeightOverflow() 54 ? physical_fragment->HeightOverflow()
56 : fragment_->WidthOverflow(); 55 : physical_fragment->WidthOverflow();
57 intrinsic_logical_height -= border_and_padding.BlockSum(); 56 intrinsic_logical_height -= border_and_padding.BlockSum();
58 layout_box_->setIntrinsicContentLogicalHeight(intrinsic_logical_height); 57 layout_box_->setIntrinsicContentLogicalHeight(intrinsic_logical_height);
59 58
60 // Ensure the position of the children are copied across to the 59 // Ensure the position of the children are copied across to the
61 // LayoutObject tree. 60 // LayoutObject tree.
62 for (NGBox* box = FirstChild(); box; box = box->NextSibling()) { 61 for (NGBox* box = FirstChild(); box; box = box->NextSibling()) {
63 if (box->fragment_) 62 if (box->Fragment())
64 box->PositionUpdated(); 63 box->PositionUpdated();
65 } 64 }
66 65
67 if (layout_box_->isLayoutBlock()) 66 if (layout_box_->isLayoutBlock())
68 toLayoutBlock(layout_box_)->layoutPositionedObjects(true); 67 toLayoutBlock(layout_box_)->layoutPositionedObjects(true);
69 layout_box_->clearNeedsLayout(); 68 layout_box_->clearNeedsLayout();
70 if (layout_box_->isLayoutBlockFlow()) { 69 if (layout_box_->isLayoutBlockFlow()) {
71 toLayoutBlockFlow(layout_box_)->updateIsSelfCollapsing(); 70 toLayoutBlockFlow(layout_box_)->updateIsSelfCollapsing();
72 } 71 }
73 } 72 }
(...skipping 15 matching lines...) Expand all
89 // overflow) 88 // overflow)
90 NGFragmentBuilder builder(NGPhysicalFragmentBase::FragmentBox); 89 NGFragmentBuilder builder(NGPhysicalFragmentBase::FragmentBox);
91 builder.SetInlineSize(layout_box_->logicalWidth()) 90 builder.SetInlineSize(layout_box_->logicalWidth())
92 .SetBlockSize(layout_box_->logicalHeight()) 91 .SetBlockSize(layout_box_->logicalHeight())
93 .SetDirection( 92 .SetDirection(
94 FromPlatformDirection(layout_box_->styleRef().direction())) 93 FromPlatformDirection(layout_box_->styleRef().direction()))
95 .SetWritingMode( 94 .SetWritingMode(
96 FromPlatformWritingMode(layout_box_->styleRef().getWritingMode())) 95 FromPlatformWritingMode(layout_box_->styleRef().getWritingMode()))
97 .SetInlineOverflow(overflow.width()) 96 .SetInlineOverflow(overflow.width())
98 .SetBlockOverflow(overflow.height()); 97 .SetBlockOverflow(overflow.height());
99 fragment_ = builder.ToFragment(); 98 physical_fragment = builder.ToFragment();
100 } 99 }
101 *out = new NGFragment(constraint_space->WritingMode(), 100 fragment_ = new NGFragment(constraint_space->WritingMode(),
102 FromPlatformDirection(Style()->direction()), 101 FromPlatformDirection(Style()->direction()),
103 fragment_.get()); 102 physical_fragment);
104 // Reset algorithm for future use 103 // Reset algorithm for future use
105 algorithm_ = nullptr; 104 algorithm_ = nullptr;
106 return true; 105 return true;
107 } 106 }
108 107
109 const ComputedStyle* NGBox::Style() const { 108 const ComputedStyle* NGBox::Style() const {
110 if (style_) 109 if (style_)
111 return style_.get(); 110 return style_.get();
112 DCHECK(layout_box_); 111 DCHECK(layout_box_);
113 return layout_box_->style(); 112 return layout_box_->style();
(...skipping 20 matching lines...) Expand all
134 133
135 void NGBox::SetNextSibling(NGBox* sibling) { 134 void NGBox::SetNextSibling(NGBox* sibling) {
136 next_sibling_ = sibling; 135 next_sibling_ = sibling;
137 } 136 }
138 137
139 void NGBox::SetFirstChild(NGBox* child) { 138 void NGBox::SetFirstChild(NGBox* child) {
140 first_child_ = child; 139 first_child_ = child;
141 } 140 }
142 141
143 void NGBox::PositionUpdated() { 142 void NGBox::PositionUpdated() {
144 if (layout_box_) { 143 if (layout_box_ && fragment_->PhysicalFragment()) {
cbiesinger 2016/09/26 17:17:55 Can PhysicalFragment() ever be null?
145 layout_box_->setX(fragment_->LeftOffset()); 144 layout_box_->setX(fragment_->PhysicalFragment()->LeftOffset());
146 layout_box_->setY(fragment_->TopOffset()); 145 layout_box_->setY(fragment_->PhysicalFragment()->TopOffset());
147 } 146 }
148 } 147 }
149 148
150 bool NGBox::CanUseNewLayout() { 149 bool NGBox::CanUseNewLayout() {
151 if (!layout_box_) 150 if (!layout_box_)
152 return true; 151 return true;
153 if (!layout_box_->isLayoutBlockFlow()) 152 if (!layout_box_->isLayoutBlockFlow())
154 return false; 153 return false;
155 const LayoutBlockFlow* block_flow = toLayoutBlockFlow(layout_box_); 154 const LayoutBlockFlow* block_flow = toLayoutBlockFlow(layout_box_);
156 return !block_flow->childrenInline() || !block_flow->firstChild(); 155 return !block_flow->childrenInline() || !block_flow->firstChild();
157 } 156 }
158 } // namespace blink 157 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698