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 d8fae61c705351f28a53f08da44b29cd15bcb792..43699720ab09f939075c57415ba8b68a01c2b2be 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 |
@@ -180,7 +180,8 @@ NGBlockLayoutAlgorithm::NGBlockLayoutAlgorithm( |
NGBlockNode* first_child, |
NGConstraintSpace* constraint_space, |
NGBreakToken* break_token) |
- : state_(kStateInit), |
+ : NGLayoutAlgorithm(kBlockLayoutAlgorithm), |
+ state_(kStateInit), |
style_(style), |
first_child_(first_child), |
constraint_space_(constraint_space), |
@@ -190,9 +191,9 @@ NGBlockLayoutAlgorithm::NGBlockLayoutAlgorithm( |
} |
NGLayoutStatus NGBlockLayoutAlgorithm::Layout( |
- NGFragmentBase*, |
+ NGPhysicalFragmentBase* child_fragment, |
NGPhysicalFragmentBase** fragment_out, |
- NGLayoutAlgorithm**) { |
+ NGLayoutAlgorithm** algorithm_out) { |
switch (state_) { |
case kStateInit: { |
border_and_padding_ = |
@@ -235,14 +236,12 @@ NGLayoutStatus NGBlockLayoutAlgorithm::Layout( |
builder_->SetDirection(constraint_space_->Direction()); |
builder_->SetWritingMode(constraint_space_->WritingMode()); |
builder_->SetInlineSize(inline_size).SetBlockSize(block_size); |
- current_child_ = first_child_; |
- if (current_child_) |
- space_for_current_child_ = CreateConstraintSpaceForCurrentChild(); |
- state_ = kStateChildLayout; |
+ current_child_ = first_child_; |
+ state_ = kStatePrepareForChildLayout; |
return kNotFinished; |
} |
- case kStateChildLayout: { |
+ case kStatePrepareForChildLayout: { |
if (current_child_) { |
// TODO(atotic): uncomment this code when implementing oof layout. |
// This code cannot be turned on because it prevents layout of |
@@ -253,17 +252,32 @@ NGLayoutStatus NGBlockLayoutAlgorithm::Layout( |
// GetChildSpaceOffset()); |
// } |
// else |
- if (!LayoutCurrentChild()) |
- return kNotFinished; |
- current_child_ = current_child_->NextSibling(); |
- if (current_child_) { |
- space_for_current_child_ = CreateConstraintSpaceForCurrentChild(); |
- return kNotFinished; |
- } |
+ space_for_current_child_ = CreateConstraintSpaceForCurrentChild(); |
+ *algorithm_out = NGLayoutInputNode::AlgorithmForInputNode( |
+ current_child_, space_for_current_child_); |
+ state_ = kStateChildLayout; |
+ return kChildAlgorithmRequired; |
} |
+ |
state_ = kStateFinalize; |
return kNotFinished; |
} |
+ case kStateChildLayout: { |
+ DCHECK(current_child_); |
+ DCHECK(child_fragment); |
+ |
+ // TODO(layout_ng): Seems like a giant hack to call this here. |
+ current_child_->UpdateLayoutBox(toNGPhysicalFragment(child_fragment), |
+ space_for_current_child_); |
+ |
+ FinishCurrentChildLayout( |
+ new NGFragment(space_for_current_child_->WritingMode(), |
+ current_child_->Style()->direction(), |
+ toNGPhysicalFragment(child_fragment))); |
+ current_child_ = current_child_->NextSibling(); |
+ state_ = kStatePrepareForChildLayout; |
+ return kNotFinished; |
+ } |
case kStateFinalize: { |
content_size_ += border_and_padding_.block_end; |
@@ -284,11 +298,8 @@ NGLayoutStatus NGBlockLayoutAlgorithm::Layout( |
return kNewFragment; |
} |
-bool NGBlockLayoutAlgorithm::LayoutCurrentChild() { |
- NGFragmentBase* fragment; |
- if (!current_child_->Layout(space_for_current_child_, &fragment)) |
- return false; |
- |
+void NGBlockLayoutAlgorithm::FinishCurrentChildLayout( |
+ NGFragmentBase* fragment) { |
NGBoxStrut child_margins = ComputeMargins( |
*space_for_current_child_, CurrentChildStyle(), |
constraint_space_->WritingMode(), constraint_space_->Direction()); |
@@ -302,7 +313,6 @@ bool NGBlockLayoutAlgorithm::LayoutCurrentChild() { |
fragment_offset = PositionFragment(*fragment, child_margins); |
} |
builder_->AddChild(fragment, fragment_offset); |
- return true; |
} |
NGBoxStrut NGBlockLayoutAlgorithm::CollapseMargins( |