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 c2c7571d9db3112564ca2c9c37d4b2ecd381bb10..238c3b0dc9b0e67b3b35ff7d137341c747ca0ecb 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 |
@@ -184,7 +184,6 @@ NGBlockLayoutAlgorithm::NGBlockLayoutAlgorithm( |
NGConstraintSpace* constraint_space, |
NGBreakToken* break_token) |
: NGLayoutAlgorithm(kBlockLayoutAlgorithm), |
- layout_state_(kStateInit), |
style_(style), |
first_child_(first_child), |
constraint_space_(constraint_space), |
@@ -224,136 +223,113 @@ NGLayoutStatus NGBlockLayoutAlgorithm::Layout( |
NGPhysicalFragment* child_fragment, |
NGPhysicalFragment** fragment_out, |
NGLayoutAlgorithm** algorithm_out) { |
- switch (layout_state_) { |
- case kStateInit: { |
- WTF::Optional<MinAndMaxContentSizes> sizes; |
- if (NeedMinAndMaxContentSizes(ConstraintSpace(), Style())) { |
- sizes = MinAndMaxContentSizes(); |
- ComputeMinAndMaxContentSizes(&*sizes); |
- } |
- |
- border_and_padding_ = |
- ComputeBorders(Style()) + ComputePadding(ConstraintSpace(), Style()); |
- |
- LayoutUnit inline_size = |
- ComputeInlineSizeForFragment(ConstraintSpace(), Style(), sizes); |
- LayoutUnit adjusted_inline_size = |
- inline_size - border_and_padding_.InlineSum(); |
- // TODO(layout-ng): For quirks mode, should we pass blockSize instead of |
- // -1? |
- LayoutUnit block_size = ComputeBlockSizeForFragment( |
- ConstraintSpace(), Style(), NGSizeIndefinite); |
- LayoutUnit adjusted_block_size(block_size); |
- // Our calculated block-axis size may be indefinite at this point. |
- // If so, just leave the size as NGSizeIndefinite instead of subtracting |
- // borders and padding. |
- if (adjusted_block_size != NGSizeIndefinite) |
- adjusted_block_size -= border_and_padding_.BlockSum(); |
- |
- space_builder_ = new NGConstraintSpaceBuilder(constraint_space_); |
- if (Style().specifiesColumns()) { |
- space_builder_->SetFragmentationType(kFragmentColumn); |
- adjusted_inline_size = |
- ResolveUsedColumnInlineSize(adjusted_inline_size, Style()); |
- LayoutUnit inline_progression = |
- adjusted_inline_size + ResolveUsedColumnGap(Style()); |
- fragmentainer_mapper_ = |
- new NGColumnMapper(inline_progression, adjusted_block_size); |
- } |
- space_builder_->SetAvailableSize( |
- NGLogicalSize(adjusted_inline_size, adjusted_block_size)); |
- space_builder_->SetPercentageResolutionSize( |
- NGLogicalSize(adjusted_inline_size, adjusted_block_size)); |
- |
- builder_ = new NGFragmentBuilder(NGPhysicalFragment::kFragmentBox); |
- builder_->SetDirection(constraint_space_->Direction()); |
- builder_->SetWritingMode(constraint_space_->WritingMode()); |
- builder_->SetInlineSize(inline_size).SetBlockSize(block_size); |
- |
- if (NGBlockBreakToken* token = CurrentBlockBreakToken()) { |
- // Resume after a previous break. |
- content_size_ = token->BreakOffset(); |
- current_child_ = token->InputNode(); |
- } else { |
- content_size_ = border_and_padding_.block_start; |
- current_child_ = first_child_; |
- } |
- |
- layout_state_ = kStatePrepareForChildLayout; |
- return kNotFinished; |
- } |
- case kStatePrepareForChildLayout: { |
- if (current_child_) { |
- EPosition position = current_child_->Style()->position(); |
- if ((position == AbsolutePosition || position == FixedPosition)) { |
- builder_->AddOutOfFlowChildCandidate(current_child_, |
- GetChildSpaceOffset()); |
- current_child_ = current_child_->NextSibling(); |
- return kNotFinished; |
- } |
- DCHECK(!ConstraintSpace().HasBlockFragmentation() || |
- SpaceAvailableForCurrentChild() > LayoutUnit()); |
- space_for_current_child_ = CreateConstraintSpaceForCurrentChild(); |
- *algorithm_out = NGLayoutInputNode::AlgorithmForInputNode( |
- current_child_, space_for_current_child_); |
- layout_state_ = kStateChildLayout; |
- return kChildAlgorithmRequired; |
- } |
- |
- // Prepare for kStateOutOfFlowLayout |
- content_size_ += border_and_padding_.block_end; |
- |
- // Recompute the block-axis size now that we know our content size. |
- LayoutUnit block_size = ComputeBlockSizeForFragment( |
- ConstraintSpace(), Style(), content_size_); |
- builder_->SetBlockSize(block_size); |
- |
- // Out of flow setup. |
- out_of_flow_layout_ = |
- new NGOutOfFlowLayoutPart(&Style(), builder_->Size()); |
- builder_->GetAndClearOutOfFlowDescendantCandidates( |
- &out_of_flow_candidates_, &out_of_flow_candidate_positions_); |
- out_of_flow_candidate_positions_index_ = 0; |
- current_child_ = nullptr; |
- layout_state_ = kStateOutOfFlowLayout; |
- return kNotFinished; |
- } |
- case kStateChildLayout: { |
- DCHECK(current_child_); |
- DCHECK(child_fragment); |
+ WTF::Optional<MinAndMaxContentSizes> sizes; |
+ if (NeedMinAndMaxContentSizes(ConstraintSpace(), Style())) { |
+ // TODO(ikilpatrick): Change ComputeMinAndMaxContentSizes to return |
+ // MinAndMaxContentSizes. |
+ sizes = MinAndMaxContentSizes(); |
+ ComputeMinAndMaxContentSizes(&*sizes); |
+ } |
- // TODO(layout_ng): Seems like a giant hack to call this here. |
- current_child_->UpdateLayoutBox(toNGPhysicalBoxFragment(child_fragment), |
- space_for_current_child_); |
+ border_and_padding_ = |
+ ComputeBorders(Style()) + ComputePadding(ConstraintSpace(), Style()); |
- FinishCurrentChildLayout(new NGBoxFragment( |
- ConstraintSpace().WritingMode(), ConstraintSpace().Direction(), |
- toNGPhysicalBoxFragment(child_fragment))); |
+ LayoutUnit inline_size = |
+ ComputeInlineSizeForFragment(ConstraintSpace(), Style(), sizes); |
+ LayoutUnit adjusted_inline_size = |
+ inline_size - border_and_padding_.InlineSum(); |
+ // TODO(layout-ng): For quirks mode, should we pass blockSize instead of |
+ // -1? |
+ LayoutUnit block_size = |
+ ComputeBlockSizeForFragment(ConstraintSpace(), Style(), NGSizeIndefinite); |
+ LayoutUnit adjusted_block_size(block_size); |
+ // Our calculated block-axis size may be indefinite at this point. |
+ // If so, just leave the size as NGSizeIndefinite instead of subtracting |
+ // borders and padding. |
+ if (adjusted_block_size != NGSizeIndefinite) |
+ adjusted_block_size -= border_and_padding_.BlockSum(); |
+ |
+ space_builder_ = new NGConstraintSpaceBuilder(constraint_space_); |
+ if (Style().specifiesColumns()) { |
+ space_builder_->SetFragmentationType(kFragmentColumn); |
+ adjusted_inline_size = |
+ ResolveUsedColumnInlineSize(adjusted_inline_size, Style()); |
+ LayoutUnit inline_progression = |
+ adjusted_inline_size + ResolveUsedColumnGap(Style()); |
+ fragmentainer_mapper_ = |
+ new NGColumnMapper(inline_progression, adjusted_block_size); |
+ } |
+ space_builder_->SetAvailableSize( |
+ NGLogicalSize(adjusted_inline_size, adjusted_block_size)); |
+ space_builder_->SetPercentageResolutionSize( |
+ NGLogicalSize(adjusted_inline_size, adjusted_block_size)); |
+ |
+ builder_ = new NGFragmentBuilder(NGPhysicalFragment::kFragmentBox); |
+ builder_->SetDirection(constraint_space_->Direction()); |
+ builder_->SetWritingMode(constraint_space_->WritingMode()); |
+ builder_->SetInlineSize(inline_size).SetBlockSize(block_size); |
+ |
+ if (NGBlockBreakToken* token = CurrentBlockBreakToken()) { |
+ // Resume after a previous break. |
+ content_size_ = token->BreakOffset(); |
+ current_child_ = token->InputNode(); |
+ } else { |
+ content_size_ = border_and_padding_.block_start; |
+ current_child_ = first_child_; |
+ } |
- if (ProceedToNextUnfinishedSibling(child_fragment)) |
- layout_state_ = kStatePrepareForChildLayout; |
- else |
- layout_state_ = kStateFinalize; |
- return kNotFinished; |
- } |
- case kStateOutOfFlowLayout: |
- if (LayoutOutOfFlowChild()) |
- layout_state_ = kStateFinalize; |
- return kNotFinished; |
- case kStateFinalize: { |
- builder_->SetInlineOverflow(max_inline_size_) |
- .SetBlockOverflow(content_size_); |
- |
- if (ConstraintSpace().HasBlockFragmentation()) |
- FinalizeForFragmentation(); |
- |
- *fragment_out = builder_->ToBoxFragment(); |
- layout_state_ = kStateInit; |
- return kNewFragment; |
+ while (current_child_) { |
+ EPosition position = current_child_->Style()->position(); |
+ if (position == AbsolutePosition || position == FixedPosition) { |
+ builder_->AddOutOfFlowChildCandidate(current_child_, |
+ GetChildSpaceOffset()); |
+ current_child_ = current_child_->NextSibling(); |
+ continue; |
} |
- }; |
- NOTREACHED(); |
- *fragment_out = nullptr; |
+ |
+ DCHECK(!ConstraintSpace().HasBlockFragmentation() || |
+ SpaceAvailableForCurrentChild() > LayoutUnit()); |
+ space_for_current_child_ = CreateConstraintSpaceForCurrentChild(); |
+ |
+ NGFragment* fragment; |
+ current_child_->LayoutSync(space_for_current_child_, &fragment); |
+ NGPhysicalFragment* child_fragment = fragment->PhysicalFragment(); |
+ |
+ // TODO(layout_ng): Seems like a giant hack to call this here. |
+ current_child_->UpdateLayoutBox(toNGPhysicalBoxFragment(child_fragment), |
+ space_for_current_child_); |
+ |
+ FinishCurrentChildLayout(new NGBoxFragment( |
+ ConstraintSpace().WritingMode(), ConstraintSpace().Direction(), |
+ toNGPhysicalBoxFragment(child_fragment))); |
+ |
+ if (!ProceedToNextUnfinishedSibling(child_fragment)) |
+ break; |
+ } |
+ |
+ content_size_ += border_and_padding_.block_end; |
+ |
+ // Recompute the block-axis size now that we know our content size. |
+ block_size = |
+ ComputeBlockSizeForFragment(ConstraintSpace(), Style(), content_size_); |
+ builder_->SetBlockSize(block_size); |
+ |
+ // Out of flow setup. |
+ out_of_flow_layout_ = new NGOutOfFlowLayoutPart(&Style(), builder_->Size()); |
+ builder_->GetAndClearOutOfFlowDescendantCandidates( |
+ &out_of_flow_candidates_, &out_of_flow_candidate_positions_); |
+ out_of_flow_candidate_positions_index_ = 0; |
+ current_child_ = nullptr; |
+ |
+ while (!LayoutOutOfFlowChild()) |
+ continue; |
+ |
+ builder_->SetInlineOverflow(max_inline_size_).SetBlockOverflow(content_size_); |
+ |
+ if (ConstraintSpace().HasBlockFragmentation()) |
+ FinalizeForFragmentation(); |
+ |
+ *fragment_out = builder_->ToBoxFragment(); |
return kNewFragment; |
} |