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 f9d504ef81b166d163bc2b9cd69df9df9979fdd0..64284cab1c9ab22e74046d9c7788f5aee3e68783 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 |
@@ -87,16 +87,29 @@ void MaybeUpdateFragmentBfcOffset(const NGConstraintSpace& space, |
} |
} |
+void PositionPendingFloatsFromOffset(LayoutUnit origin_block_offset, |
+ LayoutUnit from_block_offset, |
+ NGFragmentBuilder* container_builder, |
+ NGConstraintSpace* space) { |
+ DCHECK(container_builder->BfcOffset()) |
+ << "Parent BFC offset should be known here"; |
+ const auto& floating_objects = container_builder->UnpositionedFloats(); |
+ container_builder->MutablePositionedFloats().AppendVector( |
+ PositionFloats(origin_block_offset, from_block_offset, |
+ container_builder->BfcOffset().value().block_offset, |
+ floating_objects, space)); |
+ container_builder->MutableUnpositionedFloats().clear(); |
+} |
+ |
void PositionPendingFloats(LayoutUnit origin_block_offset, |
NGFragmentBuilder* container_builder, |
NGConstraintSpace* space) { |
DCHECK(container_builder->BfcOffset()) |
<< "Parent BFC offset should be known here"; |
- const auto& floating_objects = container_builder->UnpositionedFloats(); |
- container_builder->MutablePositionedFloats().AppendVector(PositionFloats( |
- origin_block_offset, container_builder->BfcOffset().value().block_offset, |
- floating_objects, space)); |
- container_builder->MutableUnpositionedFloats().clear(); |
+ LayoutUnit from_block_offset = |
+ container_builder->BfcOffset().value().block_offset; |
+ PositionPendingFloatsFromOffset(origin_block_offset, from_block_offset, |
+ container_builder, space); |
} |
NGBlockLayoutAlgorithm::NGBlockLayoutAlgorithm(NGBlockNode* node, |
@@ -394,7 +407,7 @@ void NGBlockLayoutAlgorithm::FinishChildLayout( |
else if (IsLegacyBlock(*child)) |
child_bfc_offset = PositionLegacy(child_space); |
else if (container_builder_.BfcOffset()) |
- child_bfc_offset = PositionWithParentBfc(fragment); |
+ child_bfc_offset = PositionWithParentBfc(child_space, fragment); |
NGLogicalOffset logical_offset = CalculateLogicalOffset(child_bfc_offset); |
@@ -428,6 +441,7 @@ NGLogicalOffset NGBlockLayoutAlgorithm::PositionNewFc( |
.SetIsNewFormattingContext(false) |
.ToConstraintSpace(child_space.WritingMode()); |
PositionFloats(curr_bfc_offset_.block_offset, curr_bfc_offset_.block_offset, |
+ curr_bfc_offset_.block_offset, |
container_builder_.UnpositionedFloats(), tmp_space.Get()); |
NGLogicalOffset origin_offset = curr_bfc_offset_; |
@@ -477,6 +491,7 @@ NGLogicalOffset NGBlockLayoutAlgorithm::PositionWithBfcOffset( |
} |
NGLogicalOffset NGBlockLayoutAlgorithm::PositionWithParentBfc( |
+ const NGConstraintSpace& space, |
const NGBoxFragment& fragment) { |
// The child must be an in-flow zero-block-size fragment, use its end margin |
// strut for positioning. |
@@ -489,6 +504,10 @@ NGLogicalOffset NGBlockLayoutAlgorithm::PositionWithParentBfc( |
curr_bfc_offset_ += |
{border_and_padding_.inline_start + curr_child_margins_.inline_start, |
margin_strut.Sum()}; |
+ AdjustToClearance(space.ClearanceOffset(), &curr_bfc_offset_); |
+ PositionPendingFloatsFromOffset( |
+ curr_bfc_offset_.block_offset, curr_bfc_offset_.block_offset, |
+ &container_builder_, MutableConstraintSpace()); |
return curr_bfc_offset_; |
} |