| 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 69c81ee6fda034a746a568e4ba51daf1202ac772..d27b24501b61f552edc188bb58a48abdee6439d6 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
|
| @@ -456,6 +456,7 @@ RefPtr<NGLayoutResult> NGBlockLayoutAlgorithm::Layout() {
|
| }
|
| }
|
|
|
| + PrepareChildLayout(child);
|
| RefPtr<NGConstraintSpace> child_space =
|
| CreateConstraintSpaceForChild(child);
|
| RefPtr<NGLayoutResult> layout_result =
|
| @@ -515,6 +516,63 @@ RefPtr<NGLayoutResult> NGBlockLayoutAlgorithm::Layout() {
|
| return builder_.ToBoxFragment();
|
| }
|
|
|
| +void NGBlockLayoutAlgorithm::PrepareChildLayout(NGLayoutInputNode* child) {
|
| + DCHECK(child);
|
| +
|
| + // Margins collapsing:
|
| + // - An inline node doesn't have any margins to collapse with, so always
|
| + // can determine its position in space.
|
| + if (child->Type() == NGLayoutInputNode::kLegacyInline) {
|
| + curr_bfc_offset_.block_offset += curr_margin_strut_.Sum();
|
| + UpdateFragmentBfcOffset(curr_bfc_offset_);
|
| + PositionPendingFloats(curr_bfc_offset_.block_offset,
|
| + MutableConstraintSpace(), &builder_);
|
| + curr_margin_strut_ = {};
|
| + curr_child_margins_ = {};
|
| + return;
|
| + }
|
| +
|
| + NGBlockNode* block_child = toNGBlockNode(child);
|
| + const ComputedStyle& child_style = block_child->Style();
|
| +
|
| + // Calculate margins in parent's writing mode.
|
| + curr_child_margins_ = CalculateMargins(
|
| + block_child, *space_builder_.ToConstraintSpace(
|
| + FromPlatformWritingMode(Style().getWritingMode())));
|
| +
|
| + // Clearance:
|
| + // - *Always* collapse margins and update *container*'s BFC offset.
|
| + // - Position all pending floats since the fragment's BFC offset is known.
|
| + if (child_style.clear() != EClear::kNone) {
|
| + curr_bfc_offset_.block_offset += curr_margin_strut_.Sum();
|
| + UpdateFragmentBfcOffset(curr_bfc_offset_);
|
| + // Only collapse margins if it's an adjoining block with clearance.
|
| + if (!content_size_) {
|
| + curr_margin_strut_ = {};
|
| + curr_child_margins_.block_start = LayoutUnit();
|
| + }
|
| + PositionPendingFloats(curr_bfc_offset_.block_offset,
|
| + MutableConstraintSpace(), &builder_);
|
| + }
|
| +
|
| + // Set estimated BFC offset to the next child's constraint space.
|
| + curr_bfc_offset_ = builder_.BfcOffset() ? builder_.BfcOffset().value()
|
| + : ConstraintSpace().BfcOffset();
|
| + curr_bfc_offset_.block_offset += content_size_;
|
| + curr_bfc_offset_.inline_offset += border_and_padding_.inline_start;
|
| +
|
| + // Floats margins are not included in child's space because:
|
| + // 1) Floats do not participate in margins collapsing.
|
| + // 2) Floats margins are used separately to calculate floating exclusions.
|
| + if (!child_style.isFloating()) {
|
| + curr_bfc_offset_.inline_offset += curr_child_margins_.inline_start;
|
| + // Append the current margin strut with child's block start margin.
|
| + // Non empty border/padding use cases are handled inside of the child's
|
| + // layout.
|
| + curr_margin_strut_.Append(curr_child_margins_.block_start);
|
| + }
|
| +}
|
| +
|
| void NGBlockLayoutAlgorithm::FinishChildLayout(
|
| NGLayoutInputNode* child,
|
| NGConstraintSpace* child_space,
|
| @@ -665,71 +723,27 @@ RefPtr<NGConstraintSpace> NGBlockLayoutAlgorithm::CreateConstraintSpaceForChild(
|
|
|
| if (child->Type() == NGLayoutInputNode::kLegacyInline) {
|
| // TODO(kojii): Setup space_builder_ appropriately for inline child.
|
| -
|
| - // Margins collapsing: Inline block.
|
| - curr_bfc_offset_.block_offset += curr_margin_strut_.Sum();
|
| - UpdateFragmentBfcOffset(curr_bfc_offset_);
|
| - PositionPendingFloats(curr_bfc_offset_.block_offset,
|
| - MutableConstraintSpace(), &builder_);
|
| - curr_margin_strut_ = {};
|
| space_builder_.SetBfcOffset(curr_bfc_offset_);
|
| -
|
| return space_builder_.ToConstraintSpace(
|
| FromPlatformWritingMode(Style().getWritingMode()));
|
| }
|
|
|
| - NGBlockNode* block_child = toNGBlockNode(child);
|
| - const ComputedStyle& child_style = block_child->Style();
|
| -
|
| - // Calculate margins in parent's writing mode.
|
| - curr_child_margins_ = CalculateMargins(
|
| - block_child, *space_builder_.ToConstraintSpace(
|
| - FromPlatformWritingMode(Style().getWritingMode())));
|
| + const ComputedStyle& child_style = toNGBlockNode(child)->Style();
|
|
|
| bool is_new_bfc = IsNewFormattingContextForInFlowBlockLevelChild(
|
| ConstraintSpace(), child_style);
|
| space_builder_.SetIsNewFormattingContext(is_new_bfc)
|
| + .SetBfcOffset(curr_bfc_offset_)
|
| + .SetClearanceOffset(
|
| + GetClearanceOffset(constraint_space_->Exclusions(), child_style))
|
| .SetIsShrinkToFit(ShouldShrinkToFit(ConstraintSpace(), child_style))
|
| .SetTextDirection(child_style.direction());
|
|
|
| - // Clearance :
|
| - // - *Always* collapse margins and update *container*'s BFC offset.
|
| - // - Position all pending floats since the fragment's BFC offset is known.
|
| - // - Set the clearance offset on the constraint space's builder.
|
| - if (child_style.clear() != EClear::kNone) {
|
| - curr_bfc_offset_.block_offset += curr_margin_strut_.Sum();
|
| - UpdateFragmentBfcOffset(curr_bfc_offset_);
|
| - // Only collapse margins if it's an adjoining block with clearance.
|
| - if (!content_size_) {
|
| - curr_margin_strut_ = NGMarginStrut();
|
| - curr_child_margins_.block_start = LayoutUnit();
|
| - }
|
| - PositionPendingFloats(curr_bfc_offset_.block_offset,
|
| - MutableConstraintSpace(), &builder_);
|
| - WTF::Optional<LayoutUnit> clearance_offset =
|
| - GetClearanceOffset(constraint_space_->Exclusions(), child_style);
|
| - space_builder_.SetClearanceOffset(clearance_offset);
|
| - }
|
| -
|
| - // Set estimated BFC offset to the next child's constraint space.
|
| - curr_bfc_offset_ = builder_.BfcOffset() ? builder_.BfcOffset().value()
|
| - : ConstraintSpace().BfcOffset();
|
| - curr_bfc_offset_.block_offset += content_size_;
|
| - curr_bfc_offset_.inline_offset += border_and_padding_.inline_start;
|
| -
|
| - // Floats margins are not included in child's CS because
|
| - // 1) Floats do not participate in margins collapsing
|
| + // Float's margins are not included in child's space because:
|
| + // 1) Floats do not participate in margins collapsing.
|
| // 2) Floats margins are used separately to calculate floating exclusions.
|
| - if (!child_style.isFloating()) {
|
| - curr_bfc_offset_.inline_offset += curr_child_margins_.inline_start;
|
| - // Append the current margin strut with child's block start margin.
|
| - // Non empty border/padding use cases are handled inside of the child's
|
| - // layout.
|
| - curr_margin_strut_.Append(curr_child_margins_.block_start);
|
| - space_builder_.SetMarginStrut(curr_margin_strut_);
|
| - }
|
| -
|
| - space_builder_.SetBfcOffset(curr_bfc_offset_);
|
| + space_builder_.SetMarginStrut(child_style.isFloating() ? NGMarginStrut()
|
| + : curr_margin_strut_);
|
|
|
| LayoutUnit space_available;
|
| if (constraint_space_->HasBlockFragmentation()) {
|
|
|