| 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 c58908fa0a69c57eedc41a5a6306add279ad892a..3c182f0221bce7481e1a0b2ac9bef6f5ebf6d957 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
|
| @@ -44,12 +44,9 @@ bool ShouldShrinkToFit(const NGConstraintSpace& parent_space,
|
|
|
| // Updates the fragment's BFC offset if it's not already set.
|
| void UpdateFragmentBfcOffset(const NGLogicalOffset& offset,
|
| - const NGConstraintSpace& space,
|
| NGFragmentBuilder* builder) {
|
| - NGLogicalOffset fragment_offset =
|
| - space.IsNewFormattingContext() ? space.BfcOffset() : offset;
|
| if (!builder->BfcOffset())
|
| - builder->SetBfcOffset(fragment_offset);
|
| + builder->SetBfcOffset(offset);
|
| }
|
|
|
| // Adjusts content_size to respect the CSS "clear" property.
|
| @@ -325,13 +322,13 @@ NGBlockLayoutAlgorithm::ComputeMinAndMaxContentSizes() const {
|
| return sizes;
|
| }
|
|
|
| -NGLogicalOffset NGBlockLayoutAlgorithm::CalculateRelativeOffset(
|
| - const NGBoxFragment& fragment) {
|
| +NGLogicalOffset NGBlockLayoutAlgorithm::CalculateLogicalOffset(
|
| + const WTF::Optional<NGLogicalOffset>& known_fragment_offset) {
|
| LayoutUnit inline_offset =
|
| border_and_padding_.inline_start + curr_child_margins_.inline_start;
|
| LayoutUnit block_offset = content_size_;
|
| - if (fragment.BfcOffset()) {
|
| - block_offset = fragment.BfcOffset().value().block_offset -
|
| + if (known_fragment_offset) {
|
| + block_offset = known_fragment_offset.value().block_offset -
|
| builder_->BfcOffset().value().block_offset;
|
| }
|
| return {inline_offset, block_offset};
|
| @@ -456,8 +453,7 @@ RefPtr<NGPhysicalFragment> NGBlockLayoutAlgorithm::Layout() {
|
| // Non empty blocks always know their position in space:
|
| if (block_size) {
|
| curr_bfc_offset_.block_offset += curr_margin_strut_.Sum();
|
| - UpdateFragmentBfcOffset(curr_bfc_offset_, ConstraintSpace(),
|
| - builder_.get());
|
| + UpdateFragmentBfcOffset(curr_bfc_offset_, builder_.get());
|
| PositionPendingFloats(curr_bfc_offset_, builder_.get());
|
| }
|
|
|
| @@ -527,31 +523,39 @@ void NGBlockLayoutAlgorithm::FinishCurrentChildLayout(
|
| return;
|
| }
|
|
|
| - // Fragment that knows its offset can be used to set parent's BFC position.
|
| - if (fragment.BfcOffset()) {
|
| + // Determine the fragment's position in the parent space either by using
|
| + // content_size_ or known fragment's BFC offset.
|
| + WTF::Optional<NGLogicalOffset> bfc_offset;
|
| + if (CurrentChildConstraintSpace().IsNewFormattingContext()) {
|
| + curr_bfc_offset_.block_offset += curr_margin_strut_.Sum();
|
| + bfc_offset = curr_bfc_offset_;
|
| + } else if (fragment.BfcOffset()) {
|
| + // Fragment that knows its offset can be used to set parent's BFC position.
|
| curr_bfc_offset_.block_offset = fragment.BfcOffset().value().block_offset;
|
| - UpdateFragmentBfcOffset(curr_bfc_offset_, ConstraintSpace(),
|
| - builder_.get());
|
| + bfc_offset = curr_bfc_offset_;
|
| + }
|
| + if (bfc_offset) {
|
| + UpdateFragmentBfcOffset(curr_bfc_offset_, builder_.get());
|
| PositionPendingFloats(curr_bfc_offset_, builder_.get());
|
| }
|
| - NGLogicalOffset fragment_offset = CalculateRelativeOffset(fragment);
|
| + NGLogicalOffset logical_offset = CalculateLogicalOffset(bfc_offset);
|
|
|
| if (fragmentainer_mapper_)
|
| - fragmentainer_mapper_->ToVisualOffset(fragment_offset);
|
| + fragmentainer_mapper_->ToVisualOffset(logical_offset);
|
| else
|
| - fragment_offset.block_offset -= PreviousBreakOffset();
|
| + logical_offset.block_offset -= PreviousBreakOffset();
|
|
|
| // Update margin strut.
|
| curr_margin_strut_ = fragment.EndMarginStrut();
|
| curr_margin_strut_.Append(curr_child_margins_.block_end);
|
|
|
| - content_size_ = fragment.BlockSize() + fragment_offset.block_offset;
|
| + content_size_ = fragment.BlockSize() + logical_offset.block_offset;
|
| max_inline_size_ =
|
| std::max(max_inline_size_, fragment.InlineSize() +
|
| curr_child_margins_.InlineSum() +
|
| border_and_padding_.InlineSum());
|
|
|
| - builder_->AddChild(std::move(physical_fragment), fragment_offset);
|
| + builder_->AddChild(std::move(physical_fragment), logical_offset);
|
| }
|
|
|
| bool NGBlockLayoutAlgorithm::ProceedToNextUnfinishedSibling(
|
| @@ -749,8 +753,7 @@ NGBlockLayoutAlgorithm::CreateConstraintSpaceForCurrentChild() {
|
| // https://software.hixie.ch/utilities/js/live-dom-viewer/saved/4847
|
| if (current_child_style.clear() != EClear::kNone) {
|
| curr_bfc_offset_.block_offset += curr_margin_strut_.Sum();
|
| - UpdateFragmentBfcOffset(curr_bfc_offset_, ConstraintSpace(),
|
| - builder_.get());
|
| + UpdateFragmentBfcOffset(curr_bfc_offset_, builder_.get());
|
| // Only collapse margins if it's an adjoining block with clearance.
|
| if (!content_size_) {
|
| curr_margin_strut_ = NGMarginStrut();
|
|
|