Chromium Code Reviews| 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 05f612fe4ddd7d63d691f5fa132388e7ee929180..494b6b9564de40121084436d26be0224b691681d 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 |
| @@ -16,48 +16,68 @@ namespace blink { |
| NGBlockLayoutAlgorithm::NGBlockLayoutAlgorithm( |
| PassRefPtr<const ComputedStyle> style, |
| - NGBoxIterator box_iterator) |
| - : style_(style), box_iterator_(box_iterator) {} |
| + NGBox* first_child) |
| + : style_(style), first_child_(first_child), state_(kStateInit) {} |
| bool NGBlockLayoutAlgorithm::Layout(const NGConstraintSpace* constraint_space, |
| NGFragment** out) { |
| - LayoutUnit inline_size = |
| - computeInlineSizeForFragment(*constraint_space, *style_); |
| - // TODO(layout-ng): For quirks mode, should we pass blockSize instead of -1? |
| - LayoutUnit block_size = |
| - computeBlockSizeForFragment(*constraint_space, *style_, LayoutUnit(-1)); |
| - NGConstraintSpace* constraint_space_for_children = new NGConstraintSpace( |
| - *constraint_space, NGLogicalSize(inline_size, block_size)); |
| + switch (state_) { |
|
ikilpatrick
2016/08/29 16:35:51
what does this look like with interleaved case's?
|
| + case kStateInit: { |
| + LayoutUnit inline_size = |
| + computeInlineSizeForFragment(*constraint_space, *style_); |
| + // TODO(layout-ng): For quirks mode, should we pass blockSize instead of |
| + // -1? |
| + LayoutUnit block_size = computeBlockSizeForFragment( |
| + *constraint_space, *style_, LayoutUnit(-1)); |
| + constraint_space_for_children_ = new NGConstraintSpace( |
| + *constraint_space, NGLogicalSize(inline_size, block_size)); |
| + content_size_ = LayoutUnit(); |
| - NGFragmentBuilder builder(NGFragmentBase::FragmentBox); |
| - builder.SetInlineSize(inline_size).SetBlockSize(block_size); |
| + builder_ = new NGFragmentBuilder(NGFragmentBase::FragmentBox); |
| + builder_->SetInlineSize(inline_size).SetBlockSize(block_size); |
| + current_child_ = first_child_; |
| + state_ = kStateChildLayout; |
| + return false; |
| + } |
| + case kStateChildLayout: { |
| + if (current_child_) { |
| + NGFragment* fragment; |
| + if (!current_child_->Layout(constraint_space_for_children_, &fragment)) |
| + return false; |
| + NGBoxStrut child_margins = computeMargins( |
| + *constraint_space_for_children_, *current_child_->Style()); |
| + // TODO(layout-ng): Support auto margins |
| + fragment->SetOffset(child_margins.inline_start, |
| + content_size_ + child_margins.block_start); |
| + current_child_->PositionUpdated(*fragment); |
| + content_size_ += fragment->BlockSize() + child_margins.BlockSum(); |
| + max_inline_size_ = |
| + std::max(max_inline_size_, |
| + fragment->InlineSize() + child_margins.InlineSum()); |
| + builder_->AddChild(fragment); |
| + current_child_ = current_child_->NextSibling(); |
| + if (current_child_) |
| + return false; |
| + } |
| - LayoutUnit content_size; |
| - for (NGBox box : box_iterator_) { |
| - NGBoxStrut child_margins = |
| - computeMargins(*constraint_space_for_children, *box.style()); |
| - NGFragment* fragment; |
| - // TODO(layout-ng): Actually make this async |
| - while (!box.Layout(constraint_space_for_children, &fragment)) |
| - ; |
| - // TODO(layout-ng): Support auto margins |
| - fragment->SetOffset(child_margins.inline_start, |
| - content_size + child_margins.block_start); |
| - box.positionUpdated(*fragment); |
| - content_size += fragment->BlockSize() + child_margins.BlockSum(); |
| - builder.AddChild(fragment); |
| - } |
| + state_ = kStateFinalize; |
| + return false; |
| + } |
| + case kStateFinalize: { |
| + // Recompute the block-axis size now that we know our content size. |
| + LayoutUnit block_size = computeBlockSizeForFragment( |
| + *constraint_space, *style_, content_size_); |
| - // Recompute the block-axis size now that we know our content size. |
| - block_size = |
| - computeBlockSizeForFragment(*constraint_space, *style_, content_size); |
| - |
| - // TODO(layout-ng): Compute correct inline overflow (block overflow should be |
| - // correct) |
| - builder.SetBlockSize(block_size) |
| - .SetInlineOverflow(inline_size) |
| - .SetBlockOverflow(content_size); |
| - *out = builder.ToFragment(); |
| + builder_->SetBlockSize(block_size) |
| + .SetInlineOverflow(max_inline_size_) |
| + .SetBlockOverflow(content_size_); |
| + *out = builder_->ToFragment(); |
| + state_ = kStateInit; |
| + return true; |
| + } |
| + }; |
| + NOTREACHED(); |
| + *out = nullptr; |
| return true; |
| } |