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

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

Issue 2702403003: [layoutng] Split NGLayoutResult out of NGPhysicalFragment (Closed)
Patch Set: rebased Created 3 years, 10 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_block_layout_algorithm.h" 5 #include "core/layout/ng/ng_block_layout_algorithm.h"
6 6
7 #include "core/layout/ng/ng_absolute_utils.h" 7 #include "core/layout/ng/ng_absolute_utils.h"
8 #include "core/layout/ng/ng_block_break_token.h" 8 #include "core/layout/ng/ng_block_break_token.h"
9 #include "core/layout/ng/ng_box_fragment.h" 9 #include "core/layout/ng/ng_box_fragment.h"
10 #include "core/layout/ng/ng_column_mapper.h" 10 #include "core/layout/ng/ng_column_mapper.h"
(...skipping 338 matching lines...) Expand 10 before | Expand all | Expand 10 after
349 LayoutUnit inline_offset = 349 LayoutUnit inline_offset =
350 border_and_padding_.inline_start + curr_child_margins_.inline_start; 350 border_and_padding_.inline_start + curr_child_margins_.inline_start;
351 LayoutUnit block_offset = content_size_; 351 LayoutUnit block_offset = content_size_;
352 if (known_fragment_offset) { 352 if (known_fragment_offset) {
353 block_offset = known_fragment_offset.value().block_offset - 353 block_offset = known_fragment_offset.value().block_offset -
354 builder_->BfcOffset().value().block_offset; 354 builder_->BfcOffset().value().block_offset;
355 } 355 }
356 return {inline_offset, block_offset}; 356 return {inline_offset, block_offset};
357 } 357 }
358 358
359 RefPtr<NGPhysicalFragment> NGBlockLayoutAlgorithm::Layout() { 359 RefPtr<NGLayoutResult> NGBlockLayoutAlgorithm::Layout() {
360 WTF::Optional<MinAndMaxContentSizes> sizes; 360 WTF::Optional<MinAndMaxContentSizes> sizes;
361 if (NeedMinAndMaxContentSizes(ConstraintSpace(), Style())) 361 if (NeedMinAndMaxContentSizes(ConstraintSpace(), Style()))
362 sizes = ComputeMinAndMaxContentSizes(); 362 sizes = ComputeMinAndMaxContentSizes();
363 363
364 border_and_padding_ = 364 border_and_padding_ =
365 ComputeBorders(Style()) + ComputePadding(ConstraintSpace(), Style()); 365 ComputeBorders(Style()) + ComputePadding(ConstraintSpace(), Style());
366 366
367 LayoutUnit inline_size = 367 LayoutUnit inline_size =
368 ComputeInlineSizeForFragment(ConstraintSpace(), Style(), sizes); 368 ComputeInlineSizeForFragment(ConstraintSpace(), Style(), sizes);
369 LayoutUnit adjusted_inline_size = 369 LayoutUnit adjusted_inline_size =
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after
446 446
447 DCHECK(!ConstraintSpace().HasBlockFragmentation() || 447 DCHECK(!ConstraintSpace().HasBlockFragmentation() ||
448 SpaceAvailableForCurrentChild() > LayoutUnit()); 448 SpaceAvailableForCurrentChild() > LayoutUnit());
449 space_for_current_child_ = CreateConstraintSpaceForCurrentChild(); 449 space_for_current_child_ = CreateConstraintSpaceForCurrentChild();
450 450
451 if (current_child_->Type() == NGLayoutInputNode::kLegacyInline) { 451 if (current_child_->Type() == NGLayoutInputNode::kLegacyInline) {
452 LayoutInlineChildren(toNGInlineNode(current_child_)); 452 LayoutInlineChildren(toNGInlineNode(current_child_));
453 continue; 453 continue;
454 } 454 }
455 455
456 RefPtr<NGPhysicalFragment> physical_fragment = 456 RefPtr<NGLayoutResult> layout_result =
457 current_child_->Layout(space_for_current_child_); 457 current_child_->Layout(space_for_current_child_);
458 458
459 FinishCurrentChildLayout(toNGPhysicalBoxFragment(physical_fragment.get())); 459 FinishCurrentChildLayout(layout_result);
460 460
461 if (!ProceedToNextUnfinishedSibling(physical_fragment.get())) 461 if (!ProceedToNextUnfinishedSibling(
462 layout_result->PhysicalFragment().get()))
462 break; 463 break;
463 } 464 }
464 465
465 // Margins collapsing: 466 // Margins collapsing:
466 // Bottom margins of an in-flow block box doesn't collapse with its last 467 // Bottom margins of an in-flow block box doesn't collapse with its last
467 // in-flow block-level child's bottom margin if the box has bottom 468 // in-flow block-level child's bottom margin if the box has bottom
468 // border/padding. 469 // border/padding.
469 content_size_ += border_and_padding_.block_end; 470 content_size_ += border_and_padding_.block_end;
470 if (border_and_padding_.block_end || 471 if (border_and_padding_.block_end ||
471 ConstraintSpace().IsNewFormattingContext()) { 472 ConstraintSpace().IsNewFormattingContext()) {
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
509 void NGBlockLayoutAlgorithm::LayoutInlineChildren(NGInlineNode* current_child) { 510 void NGBlockLayoutAlgorithm::LayoutInlineChildren(NGInlineNode* current_child) {
510 // TODO(kojii): This logic does not handle when children are mix of 511 // TODO(kojii): This logic does not handle when children are mix of
511 // inline/block. We need to detect the case and setup appropriately; e.g., 512 // inline/block. We need to detect the case and setup appropriately; e.g.,
512 // constraint space, margin collapsing, next siblings, etc. 513 // constraint space, margin collapsing, next siblings, etc.
513 NGLineBuilder line_builder(current_child, space_for_current_child_); 514 NGLineBuilder line_builder(current_child, space_for_current_child_);
514 current_child->LayoutInline(space_for_current_child_, &line_builder); 515 current_child->LayoutInline(space_for_current_child_, &line_builder);
515 // TODO(kojii): The wrapper fragment should not be needed. 516 // TODO(kojii): The wrapper fragment should not be needed.
516 NGFragmentBuilder wrapper_fragment_builder(NGPhysicalFragment::kFragmentBox, 517 NGFragmentBuilder wrapper_fragment_builder(NGPhysicalFragment::kFragmentBox,
517 current_child); 518 current_child);
518 line_builder.CreateFragments(&wrapper_fragment_builder); 519 line_builder.CreateFragments(&wrapper_fragment_builder);
519 RefPtr<NGPhysicalBoxFragment> child_fragment = 520 RefPtr<NGLayoutResult> child_result =
520 wrapper_fragment_builder.ToBoxFragment(); 521 wrapper_fragment_builder.ToBoxFragment();
521 line_builder.CopyFragmentDataToLayoutBlockFlow(); 522 line_builder.CopyFragmentDataToLayoutBlockFlow();
522 FinishCurrentChildLayout(child_fragment.get()); 523 FinishCurrentChildLayout(child_result);
523 current_child_ = nullptr; 524 current_child_ = nullptr;
524 } 525 }
525 526
526 void NGBlockLayoutAlgorithm::FinishCurrentChildLayout( 527 void NGBlockLayoutAlgorithm::FinishCurrentChildLayout(
527 RefPtr<NGPhysicalBoxFragment> physical_fragment) { 528 RefPtr<NGLayoutResult> layout_result) {
528 NGBoxFragment fragment(ConstraintSpace().WritingMode(), 529 NGBoxFragment fragment(
529 physical_fragment.get()); 530 ConstraintSpace().WritingMode(),
531 toNGPhysicalBoxFragment(layout_result->PhysicalFragment().get()));
530 532
531 // Pull out unpositioned floats to the current fragment. This may needed if 533 // Pull out unpositioned floats to the current fragment. This may needed if
532 // for example the child fragment could not position its floats because it's 534 // for example the child fragment could not position its floats because it's
533 // empty and therefore couldn't determine its position in space. 535 // empty and therefore couldn't determine its position in space.
534 builder_->MutableUnpositionedFloats().appendVector( 536 builder_->MutableUnpositionedFloats().appendVector(
535 physical_fragment->UnpositionedFloats()); 537 layout_result->UnpositionedFloats());
536 538
537 if (current_child_->Type() == NGLayoutInputNode::kLegacyBlock && 539 if (current_child_->Type() == NGLayoutInputNode::kLegacyBlock &&
538 CurrentChildStyle().isFloating()) { 540 CurrentChildStyle().isFloating()) {
539 NGFloatingObject* floating_object = 541 NGFloatingObject* floating_object = new NGFloatingObject(
540 new NGFloatingObject(physical_fragment.get(), space_for_current_child_, 542 layout_result->PhysicalFragment().get(), space_for_current_child_,
541 constraint_space_, toNGBlockNode(current_child_), 543 constraint_space_, toNGBlockNode(current_child_), CurrentChildStyle(),
542 CurrentChildStyle(), curr_child_margins_); 544 curr_child_margins_);
543 builder_->AddUnpositionedFloat(floating_object); 545 builder_->AddUnpositionedFloat(floating_object);
544 // No need to postpone the positioning if we know the correct offset. 546 // No need to postpone the positioning if we know the correct offset.
545 if (builder_->BfcOffset()) { 547 if (builder_->BfcOffset()) {
546 NGLogicalOffset origin_point = curr_bfc_offset_; 548 NGLogicalOffset origin_point = curr_bfc_offset_;
547 // Adjust origin point to the margins of the last child. 549 // Adjust origin point to the margins of the last child.
548 // Example: <div style="margin-bottom: 20px"><float></div> 550 // Example: <div style="margin-bottom: 20px"><float></div>
549 // <div style="margin-bottom: 30px"></div> 551 // <div style="margin-bottom: 30px"></div>
550 origin_point.block_offset += curr_margin_strut_.Sum(); 552 origin_point.block_offset += curr_margin_strut_.Sum();
551 PositionPendingFloats(origin_point.block_offset, ConstraintSpace(), 553 PositionPendingFloats(origin_point.block_offset, ConstraintSpace(),
552 builder_.get()); 554 builder_.get());
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
597 // <div style="margin-top: 8px"></div> 599 // <div style="margin-top: 8px"></div>
598 // <div style="margin-top: 10px"></div> 600 // <div style="margin-top: 10px"></div>
599 // </div> 601 // </div>
600 if (fragment.BlockSize()) 602 if (fragment.BlockSize())
601 content_size_ = fragment.BlockSize() + logical_offset.block_offset; 603 content_size_ = fragment.BlockSize() + logical_offset.block_offset;
602 max_inline_size_ = 604 max_inline_size_ =
603 std::max(max_inline_size_, fragment.InlineSize() + 605 std::max(max_inline_size_, fragment.InlineSize() +
604 curr_child_margins_.InlineSum() + 606 curr_child_margins_.InlineSum() +
605 border_and_padding_.InlineSum()); 607 border_and_padding_.InlineSum());
606 608
607 builder_->AddChild(std::move(physical_fragment), logical_offset); 609 builder_->AddChild(layout_result, logical_offset);
608 } 610 }
609 611
610 bool NGBlockLayoutAlgorithm::ProceedToNextUnfinishedSibling( 612 bool NGBlockLayoutAlgorithm::ProceedToNextUnfinishedSibling(
611 NGPhysicalFragment* child_fragment) { 613 NGPhysicalFragment* child_fragment) {
612 DCHECK(current_child_); 614 DCHECK(current_child_);
613 NGBlockNode* finished_child = toNGBlockNode(current_child_); 615 NGBlockNode* finished_child = toNGBlockNode(current_child_);
614 current_child_ = current_child_->NextSibling(); 616 current_child_ = current_child_->NextSibling();
615 if (!ConstraintSpace().HasBlockFragmentation() && !fragmentainer_mapper_) 617 if (!ConstraintSpace().HasBlockFragmentation() && !fragmentainer_mapper_)
616 return true; 618 return true;
617 // If we're resuming layout after a fragmentainer break, we need to skip 619 // If we're resuming layout after a fragmentainer break, we need to skip
(...skipping 216 matching lines...) Expand 10 before | Expand all | Expand 10 after
834 space_builder_->SetMarginStrut(curr_margin_strut_); 836 space_builder_->SetMarginStrut(curr_margin_strut_);
835 } 837 }
836 838
837 space_builder_->SetBfcOffset(curr_bfc_offset_); 839 space_builder_->SetBfcOffset(curr_bfc_offset_);
838 840
839 return space_builder_->ToConstraintSpace( 841 return space_builder_->ToConstraintSpace(
840 FromPlatformWritingMode(current_child_style.getWritingMode())); 842 FromPlatformWritingMode(current_child_style.getWritingMode()));
841 } 843 }
842 844
843 } // namespace blink 845 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698