[LayoutNG] Remove NGConstraintSpaceBuilder "copy" constructor.

Reland of:
https://chromium-review.googlesource.com/c/chromium/src/+/617062

This removes the NGConstraintSpaceBuilder copy constructor which
took a mutable constraint space. The constructor now just picks off
the writing_mode, and icb_size, which are the two things that are
strictly required.

This is in preparation for making NGExclusionSpace immutable when
passed between layouts, via a copy. (Needed to const-ify
NGConstraintSpace in the ng_float_utils.cc file.

Bug: 635619
Change-Id: I082066d3b6ad6ebd08beba0a1ef4101a5624a298
Reviewed-on: https://chromium-review.googlesource.com/624857
Reviewed-by: Emil A Eklund <eae@chromium.org>
Commit-Queue: Ian Kilpatrick <ikilpatrick@chromium.org>
Cr-Commit-Position: refs/heads/master@{#496114}
diff --git a/third_party/WebKit/Source/core/layout/ng/NGInlineLayoutTest.cpp b/third_party/WebKit/Source/core/layout/ng/NGInlineLayoutTest.cpp
index 934f151..6deee50a 100644
--- a/third_party/WebKit/Source/core/layout/ng/NGInlineLayoutTest.cpp
+++ b/third_party/WebKit/Source/core/layout/ng/NGInlineLayoutTest.cpp
@@ -24,7 +24,8 @@
   RefPtr<NGConstraintSpace> ConstraintSpaceForElement(
       LayoutNGBlockFlow* block_flow) {
     return NGConstraintSpaceBuilder(
-               FromPlatformWritingMode(block_flow->Style()->GetWritingMode()))
+               FromPlatformWritingMode(block_flow->Style()->GetWritingMode()),
+               /* icb_size */ {NGSizeIndefinite, NGSizeIndefinite})
         .SetAvailableSize(NGLogicalSize(LayoutUnit(), LayoutUnit()))
         .SetPercentageResolutionSize(NGLogicalSize(LayoutUnit(), LayoutUnit()))
         .SetTextDirection(block_flow->Style()->Direction())
diff --git a/third_party/WebKit/Source/core/layout/ng/inline/ng_inline_layout_algorithm.cc b/third_party/WebKit/Source/core/layout/ng/inline/ng_inline_layout_algorithm.cc
index 2ec8ee6..7048487f 100644
--- a/third_party/WebKit/Source/core/layout/ng/inline/ng_inline_layout_algorithm.cc
+++ b/third_party/WebKit/Source/core/layout/ng/inline/ng_inline_layout_algorithm.cc
@@ -58,8 +58,7 @@
           TextDirection::kLtr,
           break_token),
       is_horizontal_writing_mode_(
-          blink::IsHorizontalWritingMode(space->WritingMode())),
-      space_builder_(space) {
+          blink::IsHorizontalWritingMode(space->WritingMode())) {
   unpositioned_floats_ = ConstraintSpace().UnpositionedFloats();
 
   if (!is_horizontal_writing_mode_)
diff --git a/third_party/WebKit/Source/core/layout/ng/inline/ng_inline_layout_algorithm.h b/third_party/WebKit/Source/core/layout/ng/inline/ng_inline_layout_algorithm.h
index 36abcf0..02377379 100644
--- a/third_party/WebKit/Source/core/layout/ng/inline/ng_inline_layout_algorithm.h
+++ b/third_party/WebKit/Source/core/layout/ng/inline/ng_inline_layout_algorithm.h
@@ -76,7 +76,6 @@
 
   unsigned is_horizontal_writing_mode_ : 1;
 
-  NGConstraintSpaceBuilder space_builder_;
   Vector<RefPtr<NGUnpositionedFloat>> unpositioned_floats_;
 };
 
diff --git a/third_party/WebKit/Source/core/layout/ng/inline/ng_inline_layout_algorithm_test.cc b/third_party/WebKit/Source/core/layout/ng/inline/ng_inline_layout_algorithm_test.cc
index cef7513..cc2f270 100644
--- a/third_party/WebKit/Source/core/layout/ng/inline/ng_inline_layout_algorithm_test.cc
+++ b/third_party/WebKit/Source/core/layout/ng/inline/ng_inline_layout_algorithm_test.cc
@@ -37,10 +37,14 @@
   LayoutNGBlockFlow* block_flow =
       ToLayoutNGBlockFlow(GetLayoutObjectByElementId("container"));
   NGInlineNode inline_node(block_flow);
+  NGLogicalSize size(LayoutUnit(50), LayoutUnit(20));
+
   RefPtr<NGConstraintSpace> constraint_space =
-      NGConstraintSpaceBuilder(NGWritingMode::kHorizontalTopBottom)
-          .SetAvailableSize({LayoutUnit(50), LayoutUnit(20)})
-          .ToConstraintSpace(NGWritingMode::kHorizontalTopBottom);
+      NGConstraintSpaceBuilder(
+          kHorizontalTopBottom,
+          /* icb_size */ size.ConvertToPhysical(kHorizontalTopBottom))
+          .SetAvailableSize(size)
+          .ToConstraintSpace(kHorizontalTopBottom);
   RefPtr<NGLayoutResult> layout_result =
       inline_node.Layout(constraint_space.Get(), nullptr);
   auto* wrapper =
diff --git a/third_party/WebKit/Source/core/layout/ng/inline/ng_inline_node.cc b/third_party/WebKit/Source/core/layout/ng/inline/ng_inline_node.cc
index cfb5ee1..2fb00ee6 100644
--- a/third_party/WebKit/Source/core/layout/ng/inline/ng_inline_node.cc
+++ b/third_party/WebKit/Source/core/layout/ng/inline/ng_inline_node.cc
@@ -532,7 +532,9 @@
   NGWritingMode writing_mode = FromPlatformWritingMode(style.GetWritingMode());
 
   RefPtr<NGConstraintSpace> space =
-      NGConstraintSpaceBuilder(writing_mode)
+      NGConstraintSpaceBuilder(
+          writing_mode,
+          /* icb_size */ {NGSizeIndefinite, NGSizeIndefinite})
           .SetTextDirection(style.Direction())
           .SetAvailableSize({available_inline_size, NGSizeIndefinite})
           .ToConstraintSpace(writing_mode);
diff --git a/third_party/WebKit/Source/core/layout/ng/inline/ng_inline_node_test.cc b/third_party/WebKit/Source/core/layout/ng/inline/ng_inline_node_test.cc
index 9cb3870..2b5c503 100644
--- a/third_party/WebKit/Source/core/layout/ng/inline/ng_inline_node_test.cc
+++ b/third_party/WebKit/Source/core/layout/ng/inline/ng_inline_node_test.cc
@@ -94,8 +94,10 @@
 
   void CreateLine(NGInlineNode node,
                   Vector<RefPtr<const NGPhysicalTextFragment>>* fragments_out) {
+    NGPhysicalSize icb_size(LayoutUnit(200), LayoutUnit(200));
+
     RefPtr<NGConstraintSpace> constraint_space =
-        NGConstraintSpaceBuilder(kHorizontalTopBottom)
+        NGConstraintSpaceBuilder(kHorizontalTopBottom, icb_size)
             .ToConstraintSpace(kHorizontalTopBottom);
     RefPtr<NGLayoutResult> result =
         NGInlineLayoutAlgorithm(node, constraint_space.Get()).Layout();
diff --git a/third_party/WebKit/Source/core/layout/ng/inline/ng_line_breaker.cc b/third_party/WebKit/Source/core/layout/ng/inline/ng_line_breaker.cc
index 1c41535d..20eab0b 100644
--- a/third_party/WebKit/Source/core/layout/ng/inline/ng_line_breaker.cc
+++ b/third_party/WebKit/Source/core/layout/ng/inline/ng_line_breaker.cc
@@ -438,11 +438,12 @@
   LayoutBox* layout_box = ToLayoutBox(item.GetLayoutObject());
   NGBlockNode node = NGBlockNode(layout_box);
   const ComputedStyle& style = node.Style();
-  NGConstraintSpaceBuilder constraint_space_builder(constraint_space_);
+
+  NGConstraintSpaceBuilder space_builder(*constraint_space_);
   // Request to compute baseline during the layout, except when we know the box
   // would synthesize box-baseline.
   if (NGBaseline::ShouldPropagateBaselines(layout_box)) {
-    constraint_space_builder.AddBaselineRequest(
+    space_builder.AddBaselineRequest(
         {line_info.UseFirstLineStyle()
              ? NGBaselineAlgorithmType::kAtomicInlineForFirstLine
              : NGBaselineAlgorithmType::kAtomicInline,
@@ -451,8 +452,11 @@
              : FontBaseline::kIdeographicBaseline});
   }
   RefPtr<NGConstraintSpace> constraint_space =
-      constraint_space_builder.SetIsNewFormattingContext(true)
+      space_builder.SetIsNewFormattingContext(true)
           .SetIsShrinkToFit(true)
+          .SetAvailableSize(constraint_space_->AvailableSize())
+          .SetPercentageResolutionSize(
+              constraint_space_->PercentageResolutionSize())
           .SetTextDirection(style.Direction())
           .ToConstraintSpace(FromPlatformWritingMode(style.GetWritingMode()));
   item_result->layout_result = node.Layout(constraint_space.Get());
@@ -522,7 +526,7 @@
       /* break_token */ nullptr);
 
   LayoutUnit inline_size = ComputeInlineSizeForUnpositionedFloat(
-      constraint_space_, unpositioned_float.Get());
+      *constraint_space_, unpositioned_float.Get());
 
   // We can only determine if our float will fit if we have an available_width
   // I.e. we may not have come across any text yet, in order to be able to
@@ -546,7 +550,8 @@
 
     NGPositionedFloat positioned_float =
         PositionFloat(origin_block_offset, container_bfc_offset.block_offset,
-                      unpositioned_float.Get(), constraint_space_);
+                      unpositioned_float.Get(), *constraint_space_,
+                      constraint_space_->ExclusionSpace().get());
     container_builder_->AddChild(positioned_float.layout_result,
                                  positioned_float.logical_offset);
 
diff --git a/third_party/WebKit/Source/core/layout/ng/inline/ng_line_breaker_test.cc b/third_party/WebKit/Source/core/layout/ng/inline/ng_line_breaker_test.cc
index 0498b692..4f4431c 100644
--- a/third_party/WebKit/Source/core/layout/ng/inline/ng_line_breaker_test.cc
+++ b/third_party/WebKit/Source/core/layout/ng/inline/ng_line_breaker_test.cc
@@ -32,7 +32,9 @@
       node.PrepareLayout();
 
     RefPtr<NGConstraintSpace> space =
-        NGConstraintSpaceBuilder(NGWritingMode::kHorizontalTopBottom)
+        NGConstraintSpaceBuilder(
+            NGWritingMode::kHorizontalTopBottom,
+            /* icb_size */ {NGSizeIndefinite, NGSizeIndefinite})
             .SetAvailableSize({available_width, NGSizeIndefinite})
             .ToConstraintSpace(NGWritingMode::kHorizontalTopBottom);
 
diff --git a/third_party/WebKit/Source/core/layout/ng/ng_absolute_utils_test.cc b/third_party/WebKit/Source/core/layout/ng/ng_absolute_utils_test.cc
index c691039..630490a 100644
--- a/third_party/WebKit/Source/core/layout/ng/ng_absolute_utils_test.cc
+++ b/third_party/WebKit/Source/core/layout/ng/ng_absolute_utils_test.cc
@@ -26,7 +26,9 @@
     style_->SetBorderBottomStyle(EBorderStyle::kSolid);
     style_->SetBoxSizing(EBoxSizing::kBorderBox);
     container_size_ = NGLogicalSize(LayoutUnit(200), LayoutUnit(300));
-    NGConstraintSpaceBuilder builder(kHorizontalTopBottom);
+    NGConstraintSpaceBuilder builder(
+        kHorizontalTopBottom,
+        /* icb_size */ container_size_.ConvertToPhysical(kHorizontalTopBottom));
     builder.SetAvailableSize(container_size_);
     ltr_space_ = builder.SetTextDirection(TextDirection::kLtr)
                      .ToConstraintSpace(kHorizontalTopBottom);
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 765cac4c..d941959 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
@@ -114,7 +114,8 @@
           : space->FloatsBfcOffset().value().block_offset;
 
   const auto positioned_floats = PositionFloats(
-      origin_block_offset, from_block_offset, *unpositioned_floats, space);
+      origin_block_offset, from_block_offset, *unpositioned_floats, *space,
+      space->ExclusionSpace().get());
 
   // TODO(ikilpatrick): Add DCHECK that any positioned floats are children.
 
@@ -768,20 +769,18 @@
   LayoutUnit child_bfc_offset_estimate =
       child_data.bfc_offset_estimate.block_offset;
 
-  // 1. Position all pending floats to a temporary space.
-  RefPtr<NGConstraintSpace> tmp_space =
-      NGConstraintSpaceBuilder(&child_space)
-          .SetIsNewFormattingContext(false)
-          .ToConstraintSpace(child_space.WritingMode());
+  // 1. Position all pending floats to a temporary space, which is a copy of
+  //    the current exclusion space.
+  NGExclusionSpace tmp_exclusion_space(
+      *ConstraintSpace().ExclusionSpace().get());
   PositionFloats(child_bfc_offset_estimate, child_bfc_offset_estimate,
-                 unpositioned_floats_, tmp_space.Get());
+                 unpositioned_floats_, ConstraintSpace(), &tmp_exclusion_space);
 
   NGLogicalOffset origin_offset = {ConstraintSpace().BfcOffset().inline_offset +
                                        border_scrollbar_padding_.inline_start,
                                    child_bfc_offset_estimate};
-  AdjustToClearance(
-      ConstraintSpace().ExclusionSpace()->ClearanceOffset(child_style.Clear()),
-      &origin_offset);
+  AdjustToClearance(tmp_exclusion_space.ClearanceOffset(child_style.Clear()),
+                    &origin_offset);
 
   // 2. Find an estimated layout opportunity for our fragment.
   // TODO(ikilpatrick): Should fragment_margin_size be including the block
@@ -789,9 +788,8 @@
   NGLogicalSize fragment_margin_size(
       fragment.InlineSize() + child_data.margins.InlineSum(),
       fragment.BlockSize() + child_data.margins.BlockSum());
-  NGLayoutOpportunity opportunity =
-      tmp_space->ExclusionSpace()->FindLayoutOpportunity(
-          origin_offset, child_space.AvailableSize(), fragment_margin_size);
+  NGLayoutOpportunity opportunity = tmp_exclusion_space.FindLayoutOpportunity(
+      origin_offset, child_space.AvailableSize(), fragment_margin_size);
 
   NGMarginStrut margin_strut = previous_inflow_position.margin_strut;
 
@@ -915,7 +913,7 @@
   const ComputedStyle& child_style = child.Style();
 
   RefPtr<NGConstraintSpace> space =
-      NGConstraintSpaceBuilder(MutableConstraintSpace())
+      NGConstraintSpaceBuilder(ConstraintSpace())
           .SetAvailableSize(child_available_size_)
           .SetPercentageResolutionSize(child_percentage_size_)
           .ToConstraintSpace(
@@ -943,8 +941,9 @@
     const NGLayoutInputNode child,
     const NGInflowChildData& child_data,
     const WTF::Optional<NGLogicalOffset> floats_bfc_offset) {
-  NGConstraintSpaceBuilder space_builder(MutableConstraintSpace());
-  space_builder.SetAvailableSize(child_available_size_)
+  NGConstraintSpaceBuilder space_builder(ConstraintSpace());
+  space_builder.SetExclusionSpace(ConstraintSpace().ExclusionSpace())
+      .SetAvailableSize(child_available_size_)
       .SetPercentageResolutionSize(child_percentage_size_);
 
   if (NGBaseline::ShouldPropagateBaselines(child))
@@ -992,7 +991,8 @@
       space_available -= child_data.bfc_offset_estimate.block_offset;
     }
   }
-  space_builder.SetFragmentainerSpaceAvailable(space_available);
+  space_builder.SetFragmentainerSpaceAvailable(space_available)
+      .SetFragmentationType(constraint_space_->BlockFragmentationType());
 
   return space_builder.ToConstraintSpace(
       FromPlatformWritingMode(child_style.GetWritingMode()));
diff --git a/third_party/WebKit/Source/core/layout/ng/ng_block_layout_algorithm_test.cc b/third_party/WebKit/Source/core/layout/ng/ng_block_layout_algorithm_test.cc
index 6634d19..4bae507 100644
--- a/third_party/WebKit/Source/core/layout/ng/ng_block_layout_algorithm_test.cc
+++ b/third_party/WebKit/Source/core/layout/ng/ng_block_layout_algorithm_test.cc
@@ -39,10 +39,11 @@
           ? NGFragmentationType::kFragmentColumn
           : NGFragmentationType::kFragmentNone;
 
-  return NGConstraintSpaceBuilder(writing_mode)
+  return NGConstraintSpaceBuilder(
+             writing_mode,
+             /* icb_size */ size.ConvertToPhysical(writing_mode))
       .SetAvailableSize(size)
       .SetPercentageResolutionSize(size)
-      .SetInitialContainingBlockSize(size.ConvertToPhysical(writing_mode))
       .SetTextDirection(direction)
       .SetIsShrinkToFit(shrink_to_fit)
       .SetIsNewFormattingContext(is_new_formatting_context)
diff --git a/third_party/WebKit/Source/core/layout/ng/ng_block_node.cc b/third_party/WebKit/Source/core/layout/ng/ng_block_node.cc
index 55d14dd..336f279 100644
--- a/third_party/WebKit/Source/core/layout/ng/ng_block_node.cc
+++ b/third_party/WebKit/Source/core/layout/ng/ng_block_node.cc
@@ -123,7 +123,8 @@
 
   RefPtr<NGConstraintSpace> constraint_space =
       NGConstraintSpaceBuilder(
-          FromPlatformWritingMode(Style().GetWritingMode()))
+          FromPlatformWritingMode(Style().GetWritingMode()),
+          /* icb_size */ {NGSizeIndefinite, NGSizeIndefinite})
           .SetTextDirection(Style().Direction())
           .ToConstraintSpace(FromPlatformWritingMode(Style().GetWritingMode()));
 
@@ -144,7 +145,8 @@
   // Now, redo with infinite space for max_content
   constraint_space =
       NGConstraintSpaceBuilder(
-          FromPlatformWritingMode(Style().GetWritingMode()))
+          FromPlatformWritingMode(Style().GetWritingMode()),
+          /* icb_size */ {NGSizeIndefinite, NGSizeIndefinite})
           .SetTextDirection(Style().Direction())
           .SetAvailableSize({LayoutUnit::Max(), LayoutUnit()})
           .SetPercentageResolutionSize({LayoutUnit(), LayoutUnit()})
diff --git a/third_party/WebKit/Source/core/layout/ng/ng_constraint_space.cc b/third_party/WebKit/Source/core/layout/ng/ng_constraint_space.cc
index 53dd312a..63fc8a7 100644
--- a/third_party/WebKit/Source/core/layout/ng/ng_constraint_space.cc
+++ b/third_party/WebKit/Source/core/layout/ng/ng_constraint_space.cc
@@ -133,10 +133,9 @@
   DCHECK_GE(initial_containing_block_size.width, LayoutUnit());
   DCHECK_GE(initial_containing_block_size.height, LayoutUnit());
 
-  return NGConstraintSpaceBuilder(writing_mode)
+  return NGConstraintSpaceBuilder(writing_mode, initial_containing_block_size)
       .SetAvailableSize(available_size)
       .SetPercentageResolutionSize(percentage_size)
-      .SetInitialContainingBlockSize(initial_containing_block_size)
       .SetIsInlineDirectionTriggersScrollbar(
           box.StyleRef().OverflowInlineDirection() == EOverflow::kAuto)
       .SetIsBlockDirectionTriggersScrollbar(
diff --git a/third_party/WebKit/Source/core/layout/ng/ng_constraint_space.h b/third_party/WebKit/Source/core/layout/ng/ng_constraint_space.h
index 7c2d2c15..c19fc84 100644
--- a/third_party/WebKit/Source/core/layout/ng/ng_constraint_space.h
+++ b/third_party/WebKit/Source/core/layout/ng/ng_constraint_space.h
@@ -74,6 +74,10 @@
   // See: https://drafts.csswg.org/css-sizing/#available
   NGLogicalSize AvailableSize() const { return available_size_; }
 
+  NGPhysicalSize InitialContainingBlockSize() const {
+    return initial_containing_block_size_;
+  }
+
   // Return the block-direction space available in the current fragmentainer.
   LayoutUnit FragmentainerSpaceAvailable() const {
     DCHECK(HasBlockFragmentation());
@@ -202,10 +206,6 @@
       const WTF::Optional<LayoutUnit>& clearance_offset,
       Vector<NGBaselineRequest>& baseline_requests);
 
-  NGPhysicalSize InitialContainingBlockSize() const {
-    return initial_containing_block_size_;
-  }
-
   NGLogicalSize available_size_;
   NGLogicalSize percentage_resolution_size_;
   Optional<LayoutUnit> parent_percentage_resolution_inline_size_;
diff --git a/third_party/WebKit/Source/core/layout/ng/ng_constraint_space_builder.cc b/third_party/WebKit/Source/core/layout/ng/ng_constraint_space_builder.cc
index e6f90fd3..8e4ffcb5 100644
--- a/third_party/WebKit/Source/core/layout/ng/ng_constraint_space_builder.cc
+++ b/third_party/WebKit/Source/core/layout/ng/ng_constraint_space_builder.cc
@@ -9,29 +9,13 @@
 namespace blink {
 
 NGConstraintSpaceBuilder::NGConstraintSpaceBuilder(
-    const NGConstraintSpace* parent_space)
-    : available_size_(parent_space->AvailableSize()),
-      percentage_resolution_size_(parent_space->PercentageResolutionSize()),
-      parent_percentage_resolution_size_(
-          parent_space->PercentageResolutionSize()),
-      initial_containing_block_size_(
-          parent_space->InitialContainingBlockSize()),
-      fragmentainer_space_available_(NGSizeIndefinite),
-      parent_writing_mode_(parent_space->WritingMode()),
-      is_fixed_size_inline_(false),
-      is_fixed_size_block_(false),
-      is_shrink_to_fit_(false),
-      is_inline_direction_triggers_scrollbar_(false),
-      is_block_direction_triggers_scrollbar_(false),
-      fragmentation_type_(parent_space->BlockFragmentationType()),
-      is_new_fc_(parent_space->IsNewFormattingContext()),
-      is_anonymous_(false),
-      text_direction_(static_cast<unsigned>(parent_space->Direction())),
-      bfc_offset_(parent_space->bfc_offset_),
-      exclusion_space_(parent_space->ExclusionSpace()) {}
+    const NGConstraintSpace& parent_space)
+    : NGConstraintSpaceBuilder(parent_space.WritingMode(),
+                               parent_space.InitialContainingBlockSize()) {}
 
-NGConstraintSpaceBuilder::NGConstraintSpaceBuilder(NGWritingMode writing_mode)
-    : initial_containing_block_size_{NGSizeIndefinite, NGSizeIndefinite},
+NGConstraintSpaceBuilder::NGConstraintSpaceBuilder(NGWritingMode writing_mode,
+                                                   NGPhysicalSize icb_size)
+    : initial_containing_block_size_(icb_size),
       fragmentainer_space_available_(NGSizeIndefinite),
       parent_writing_mode_(writing_mode),
       is_fixed_size_inline_(false),
@@ -57,12 +41,6 @@
   return *this;
 }
 
-NGConstraintSpaceBuilder&
-NGConstraintSpaceBuilder::SetInitialContainingBlockSize(NGPhysicalSize size) {
-  initial_containing_block_size_ = size;
-  return *this;
-}
-
 NGConstraintSpaceBuilder& NGConstraintSpaceBuilder::SetTextDirection(
     TextDirection text_direction) {
   text_direction_ = static_cast<unsigned>(text_direction);
@@ -93,6 +71,12 @@
   return *this;
 }
 
+NGConstraintSpaceBuilder& NGConstraintSpaceBuilder::SetExclusionSpace(
+    std::shared_ptr<NGExclusionSpace> exclusion_space) {
+  exclusion_space_ = exclusion_space;
+  return *this;
+}
+
 NGConstraintSpaceBuilder& NGConstraintSpaceBuilder::SetIsFixedSizeInline(
     bool is_fixed_size_inline) {
   is_fixed_size_inline_ = is_fixed_size_inline;
diff --git a/third_party/WebKit/Source/core/layout/ng/ng_constraint_space_builder.h b/third_party/WebKit/Source/core/layout/ng/ng_constraint_space_builder.h
index 7c5d3dc..c81bf1c 100644
--- a/third_party/WebKit/Source/core/layout/ng/ng_constraint_space_builder.h
+++ b/third_party/WebKit/Source/core/layout/ng/ng_constraint_space_builder.h
@@ -17,17 +17,18 @@
   DISALLOW_NEW();
 
  public:
-  NGConstraintSpaceBuilder(const NGConstraintSpace* parent_space);
+  // NOTE: This constructor doesn't act like a copy-constructor, it uses the
+  // writing_mode and icb_size from the parent constraint space, and passes
+  // them to the constructor below.
+  NGConstraintSpaceBuilder(const NGConstraintSpace& parent_space);
 
-  NGConstraintSpaceBuilder(NGWritingMode writing_mode);
+  NGConstraintSpaceBuilder(NGWritingMode writing_mode, NGPhysicalSize icb_size);
 
   NGConstraintSpaceBuilder& SetAvailableSize(NGLogicalSize available_size);
 
   NGConstraintSpaceBuilder& SetPercentageResolutionSize(
       NGLogicalSize percentage_resolution_size);
 
-  NGConstraintSpaceBuilder& SetInitialContainingBlockSize(NGPhysicalSize);
-
   NGConstraintSpaceBuilder& SetFragmentainerSpaceAvailable(LayoutUnit space) {
     fragmentainer_space_available_ = space;
     return *this;
@@ -61,6 +62,9 @@
   NGConstraintSpaceBuilder& SetClearanceOffset(
       const WTF::Optional<LayoutUnit>& clearance_offset);
 
+  NGConstraintSpaceBuilder& SetExclusionSpace(
+      std::shared_ptr<NGExclusionSpace> exclusion_space);
+
   void AddBaselineRequests(const Vector<NGBaselineRequest>&);
   NGConstraintSpaceBuilder& AddBaselineRequest(const NGBaselineRequest&);
 
diff --git a/third_party/WebKit/Source/core/layout/ng/ng_constraint_space_builder_test.cc b/third_party/WebKit/Source/core/layout/ng/ng_constraint_space_builder_test.cc
index f75866c..62f564f 100644
--- a/third_party/WebKit/Source/core/layout/ng/ng_constraint_space_builder_test.cc
+++ b/third_party/WebKit/Source/core/layout/ng/ng_constraint_space_builder_test.cc
@@ -22,17 +22,17 @@
 // Asserts that indefinite inline length becomes initial containing
 // block width for horizontal-tb inside vertical document.
 TEST(NGConstraintSpaceBuilderTest, AvailableSizeFromHorizontalICB) {
-  NGConstraintSpaceBuilder horizontal_builder(kHorizontalTopBottom);
-  NGLogicalSize fixed_size{LayoutUnit(100), LayoutUnit(200)};
-  NGLogicalSize indefinite_size{NGSizeIndefinite, NGSizeIndefinite};
   NGPhysicalSize icb_size{NGSizeIndefinite, LayoutUnit(51)};
 
-  horizontal_builder.SetInitialContainingBlockSize(icb_size);
+  NGConstraintSpaceBuilder horizontal_builder(kHorizontalTopBottom, icb_size);
+  NGLogicalSize fixed_size{LayoutUnit(100), LayoutUnit(200)};
+  NGLogicalSize indefinite_size{NGSizeIndefinite, NGSizeIndefinite};
+
   horizontal_builder.SetAvailableSize(fixed_size);
   horizontal_builder.SetPercentageResolutionSize(fixed_size);
 
   NGConstraintSpaceBuilder vertical_builder(
-      horizontal_builder.ToConstraintSpace(kHorizontalTopBottom).Get());
+      *horizontal_builder.ToConstraintSpace(kHorizontalTopBottom));
 
   vertical_builder.SetAvailableSize(indefinite_size);
   vertical_builder.SetPercentageResolutionSize(indefinite_size);
@@ -46,17 +46,17 @@
 // Asserts that indefinite inline length becomes initial containing
 // block height for vertical-lr inside horizontal document.
 TEST(NGConstraintSpaceBuilderTest, AvailableSizeFromVerticalICB) {
-  NGConstraintSpaceBuilder horizontal_builder(kVerticalLeftRight);
-  NGLogicalSize fixed_size{LayoutUnit(100), LayoutUnit(200)};
-  NGLogicalSize indefinite_size{NGSizeIndefinite, NGSizeIndefinite};
   NGPhysicalSize icb_size{LayoutUnit(51), NGSizeIndefinite};
 
-  horizontal_builder.SetInitialContainingBlockSize(icb_size);
+  NGConstraintSpaceBuilder horizontal_builder(kVerticalLeftRight, icb_size);
+  NGLogicalSize fixed_size{LayoutUnit(100), LayoutUnit(200)};
+  NGLogicalSize indefinite_size{NGSizeIndefinite, NGSizeIndefinite};
+
   horizontal_builder.SetAvailableSize(fixed_size);
   horizontal_builder.SetPercentageResolutionSize(fixed_size);
 
   NGConstraintSpaceBuilder vertical_builder(
-      horizontal_builder.ToConstraintSpace(kVerticalLeftRight).Get());
+      *horizontal_builder.ToConstraintSpace(kVerticalLeftRight));
 
   vertical_builder.SetAvailableSize(indefinite_size);
   vertical_builder.SetPercentageResolutionSize(indefinite_size);
diff --git a/third_party/WebKit/Source/core/layout/ng/ng_constraint_space_test.cc b/third_party/WebKit/Source/core/layout/ng/ng_constraint_space_test.cc
index c685645..93cfaeaa 100644
--- a/third_party/WebKit/Source/core/layout/ng/ng_constraint_space_test.cc
+++ b/third_party/WebKit/Source/core/layout/ng/ng_constraint_space_test.cc
@@ -17,7 +17,9 @@
     TextDirection direction,
     NGLogicalSize size,
     const NGLogicalOffset& bfc_offset = {}) {
-  return NGConstraintSpaceBuilder(writing_mode)
+  return NGConstraintSpaceBuilder(
+             writing_mode,
+             /* icb_size */ size.ConvertToPhysical(writing_mode))
       .SetTextDirection(direction)
       .SetAvailableSize(size)
       .SetPercentageResolutionSize(size)
diff --git a/third_party/WebKit/Source/core/layout/ng/ng_exclusion_space.cc b/third_party/WebKit/Source/core/layout/ng/ng_exclusion_space.cc
index 5f35a5e..84a35ec 100644
--- a/third_party/WebKit/Source/core/layout/ng/ng_exclusion_space.cc
+++ b/third_party/WebKit/Source/core/layout/ng/ng_exclusion_space.cc
@@ -35,7 +35,7 @@
 NGLayoutOpportunity NGExclusionSpace::FindLayoutOpportunity(
     const NGLogicalOffset& offset,
     const NGLogicalSize& available_size,
-    const NGLogicalSize& minimum_size) {
+    const NGLogicalSize& minimum_size) const {
   NGLayoutOpportunityIterator opportunity_iter(this, available_size, offset);
   NGLayoutOpportunity opportunity;
 
@@ -51,7 +51,7 @@
   return NGLayoutOpportunity();
 }
 
-LayoutUnit NGExclusionSpace::ClearanceOffset(EClear clear_type) {
+LayoutUnit NGExclusionSpace::ClearanceOffset(EClear clear_type) const {
   switch (clear_type) {
     case EClear::kNone:
       return LayoutUnit::Min();  // nothing to do here.
diff --git a/third_party/WebKit/Source/core/layout/ng/ng_exclusion_space.h b/third_party/WebKit/Source/core/layout/ng/ng_exclusion_space.h
index d773a50..424eb8f 100644
--- a/third_party/WebKit/Source/core/layout/ng/ng_exclusion_space.h
+++ b/third_party/WebKit/Source/core/layout/ng/ng_exclusion_space.h
@@ -29,12 +29,13 @@
 
   // Returns a layout opportunity, within the BFC, starting at the given offset,
   // with a size greater than {@code minimum_size}.
-  NGLayoutOpportunity FindLayoutOpportunity(const NGLogicalOffset& offset,
-                                            const NGLogicalSize& available_size,
-                                            const NGLogicalSize& minimum_size);
+  NGLayoutOpportunity FindLayoutOpportunity(
+      const NGLogicalOffset& offset,
+      const NGLogicalSize& available_size,
+      const NGLogicalSize& minimum_size) const;
 
   // Returns the clearance offset based on the provided {@code clear_type}.
-  LayoutUnit ClearanceOffset(EClear clear_type);
+  LayoutUnit ClearanceOffset(EClear clear_type) const;
 
   // Returns the block start offset of the last float added.
   LayoutUnit LastFloatBlockStart() const { return last_float_block_start_; }
diff --git a/third_party/WebKit/Source/core/layout/ng/ng_floats_utils.cc b/third_party/WebKit/Source/core/layout/ng/ng_floats_utils.cc
index 6b17430..47180c0 100644
--- a/third_party/WebKit/Source/core/layout/ng/ng_floats_utils.cc
+++ b/third_party/WebKit/Source/core/layout/ng/ng_floats_utils.cc
@@ -20,25 +20,25 @@
 // Top edge alignment rule: the outer top of a floating box may not be higher
 // than the outer top of any block or floated box generated by an element
 // earlier in the source document.
-NGLogicalOffset AdjustToTopEdgeAlignmentRule(const NGConstraintSpace& space,
-                                             const NGLogicalOffset& offset) {
+NGLogicalOffset AdjustToTopEdgeAlignmentRule(
+    const NGExclusionSpace& exclusion_space,
+    const NGLogicalOffset& offset) {
   NGLogicalOffset adjusted_offset = offset;
-  adjusted_offset.block_offset =
-      std::max(adjusted_offset.block_offset,
-               space.ExclusionSpace()->LastFloatBlockStart());
+  adjusted_offset.block_offset = std::max(
+      adjusted_offset.block_offset, exclusion_space.LastFloatBlockStart());
 
   return adjusted_offset;
 }
 
 NGLayoutOpportunity FindLayoutOpportunityForFloat(
     const NGLogicalOffset& origin_offset,
-    const NGConstraintSpace& space,
+    const NGExclusionSpace& exclusion_space,
     const NGUnpositionedFloat& unpositioned_float,
     LayoutUnit inline_size) {
   NGLogicalOffset adjusted_origin_point =
-      AdjustToTopEdgeAlignmentRule(space, origin_offset);
+      AdjustToTopEdgeAlignmentRule(exclusion_space, origin_offset);
   WTF::Optional<LayoutUnit> clearance_offset =
-      space.ExclusionSpace()->ClearanceOffset(unpositioned_float.ClearType());
+      exclusion_space.ClearanceOffset(unpositioned_float.ClearType());
 
   AdjustToClearance(clearance_offset, &adjusted_origin_point);
 
@@ -46,7 +46,7 @@
                            LayoutUnit());
   // TODO(ikilpatrick): Don't include the block-start margin of a float which
   // has fragmented.
-  return space.ExclusionSpace()->FindLayoutOpportunity(
+  return exclusion_space.FindLayoutOpportunity(
       adjusted_origin_point, unpositioned_float.available_size, float_size);
 }
 
@@ -111,7 +111,7 @@
 // Creates a constraint space for an unpositioned float.
 RefPtr<NGConstraintSpace> CreateConstraintSpaceForFloat(
     const NGUnpositionedFloat& unpositioned_float,
-    NGConstraintSpace* parent_space,
+    const NGConstraintSpace& parent_space,
     WTF::Optional<LayoutUnit> fragmentation_offset = WTF::nullopt) {
   const ComputedStyle& style = unpositioned_float.node.Style();
 
@@ -119,7 +119,7 @@
 
   if (fragmentation_offset) {
     builder.SetFragmentainerSpaceAvailable(fragmentation_offset.value())
-        .SetFragmentationType(parent_space->BlockFragmentationType());
+        .SetFragmentationType(parent_space.BlockFragmentationType());
   } else {
     builder.SetFragmentationType(NGFragmentationType::kFragmentNone);
   }
@@ -135,21 +135,21 @@
 }  // namespace
 
 LayoutUnit ComputeInlineSizeForUnpositionedFloat(
-    NGConstraintSpace* parent_space,
+    const NGConstraintSpace& parent_space,
     NGUnpositionedFloat* unpositioned_float) {
   DCHECK(unpositioned_float);
 
   const ComputedStyle& style = unpositioned_float->node.Style();
 
   bool is_same_writing_mode = FromPlatformWritingMode(style.GetWritingMode()) ==
-                              parent_space->WritingMode();
+                              parent_space.WritingMode();
 
   // If we've already performed layout on the unpositioned float, just return
   // the cached value.
   if (unpositioned_float->layout_result) {
     DCHECK(!is_same_writing_mode);
     return NGFragment(
-               parent_space->WritingMode(),
+               parent_space.WritingMode(),
                unpositioned_float->layout_result->PhysicalFragment().Get())
         .InlineSize();
   }
@@ -183,29 +183,30 @@
 
   DCHECK(fragment->BreakToken()->IsFinished());
 
-  return NGFragment(parent_space->WritingMode(), fragment).InlineSize();
+  return NGFragment(parent_space.WritingMode(), fragment).InlineSize();
 }
 
 NGPositionedFloat PositionFloat(LayoutUnit origin_block_offset,
                                 LayoutUnit parent_bfc_block_offset,
                                 NGUnpositionedFloat* unpositioned_float,
-                                NGConstraintSpace* new_parent_space) {
+                                const NGConstraintSpace& parent_space,
+                                NGExclusionSpace* exclusion_space) {
   DCHECK(unpositioned_float);
-  LayoutUnit inline_size = ComputeInlineSizeForUnpositionedFloat(
-      new_parent_space, unpositioned_float);
+  LayoutUnit inline_size =
+      ComputeInlineSizeForUnpositionedFloat(parent_space, unpositioned_float);
 
   NGLogicalOffset origin_offset = {unpositioned_float->origin_bfc_inline_offset,
                                    origin_block_offset};
 
   // Find a layout opportunity that will fit our float.
   NGLayoutOpportunity opportunity = FindLayoutOpportunityForFloat(
-      origin_offset, *new_parent_space, *unpositioned_float, inline_size);
+      origin_offset, *exclusion_space, *unpositioned_float, inline_size);
 
 #if DCHECK_IS_ON()
   bool is_same_writing_mode =
       FromPlatformWritingMode(
           unpositioned_float->node.Style().GetWritingMode()) ==
-      new_parent_space->WritingMode();
+      parent_space.WritingMode();
 #endif
 
   RefPtr<NGLayoutResult> layout_result;
@@ -222,16 +223,16 @@
 #endif
     WTF::Optional<LayoutUnit> fragmentation_offset =
         CalculateFragmentationOffset(origin_block_offset, *unpositioned_float,
-                                     *new_parent_space);
+                                     parent_space);
 
     RefPtr<NGConstraintSpace> space = CreateConstraintSpaceForFloat(
-        *unpositioned_float, new_parent_space, fragmentation_offset);
+        *unpositioned_float, parent_space, fragmentation_offset);
     layout_result = unpositioned_float->node.Layout(
         space.Get(), unpositioned_float->token.Get());
   }
 
   NGBoxFragment float_fragment(
-      new_parent_space->WritingMode(),
+      parent_space.WritingMode(),
       ToNGPhysicalBoxFragment(layout_result.Get()->PhysicalFragment().Get()));
 
   // TODO(glebl): This should check for infinite opportunity instead.
@@ -258,7 +259,7 @@
       float_fragment, opportunity, float_offset, unpositioned_float->margins,
       unpositioned_float->IsRight() ? NGExclusion::Type::kFloatRight
                                     : NGExclusion::Type::kFloatLeft);
-  new_parent_space->AddExclusion(exclusion);
+  exclusion_space->Add(exclusion);
 
   NGLogicalOffset logical_offset = CalculateLogicalOffsetForOpportunity(
       opportunity, float_offset, parent_bfc_block_offset, unpositioned_float);
@@ -270,14 +271,15 @@
     LayoutUnit origin_block_offset,
     LayoutUnit parent_bfc_block_offset,
     const Vector<RefPtr<NGUnpositionedFloat>>& unpositioned_floats,
-    NGConstraintSpace* space) {
+    const NGConstraintSpace& space,
+    NGExclusionSpace* exclusion_space) {
   Vector<NGPositionedFloat> positioned_floats;
   positioned_floats.ReserveCapacity(unpositioned_floats.size());
 
   for (auto& unpositioned_float : unpositioned_floats) {
-    positioned_floats.push_back(PositionFloat(origin_block_offset,
-                                              parent_bfc_block_offset,
-                                              unpositioned_float.Get(), space));
+    positioned_floats.push_back(
+        PositionFloat(origin_block_offset, parent_bfc_block_offset,
+                      unpositioned_float.Get(), space, exclusion_space));
   }
 
   return positioned_floats;
diff --git a/third_party/WebKit/Source/core/layout/ng/ng_floats_utils.h b/third_party/WebKit/Source/core/layout/ng/ng_floats_utils.h
index 1e5149b..78e0d88b 100644
--- a/third_party/WebKit/Source/core/layout/ng/ng_floats_utils.h
+++ b/third_party/WebKit/Source/core/layout/ng/ng_floats_utils.h
@@ -13,6 +13,7 @@
 namespace blink {
 
 class NGConstraintSpace;
+class NGExclusionSpace;
 struct NGPositionedFloat;
 struct NGUnpositionedFloat;
 
@@ -20,7 +21,7 @@
 // unpositioned float. If the float is in a different writing mode, this will
 // perform a layout.
 CORE_EXPORT LayoutUnit
-ComputeInlineSizeForUnpositionedFloat(NGConstraintSpace* parent_space,
+ComputeInlineSizeForUnpositionedFloat(const NGConstraintSpace& parent_space,
                                       NGUnpositionedFloat* unpositioned_float);
 
 // Positions {@code unpositioned_float} into {@code new_parent_space}.
@@ -29,7 +30,8 @@
 PositionFloat(LayoutUnit origin_block_offset,
               LayoutUnit parent_bfc_block_offset,
               NGUnpositionedFloat*,
-              NGConstraintSpace* new_parent_space);
+              const NGConstraintSpace& parent_space,
+              NGExclusionSpace* exclusion_space);
 
 // Positions the list of {@code unpositioned_floats}. Adds them as exclusions to
 // {@code space}.
@@ -37,7 +39,8 @@
     LayoutUnit origin_block_offset,
     LayoutUnit container_block_offset,
     const Vector<RefPtr<NGUnpositionedFloat>>& unpositioned_floats,
-    NGConstraintSpace* space);
+    const NGConstraintSpace& space,
+    NGExclusionSpace* exclusion_space);
 
 }  // namespace blink
 
diff --git a/third_party/WebKit/Source/core/layout/ng/ng_length_utils.cc b/third_party/WebKit/Source/core/layout/ng/ng_length_utils.cc
index 563dea3f..b4c9e46 100644
--- a/third_party/WebKit/Source/core/layout/ng/ng_length_utils.cc
+++ b/third_party/WebKit/Source/core/layout/ng/ng_length_utils.cc
@@ -194,9 +194,9 @@
   // Synthesize a zero-sized constraint space for passing to
   // ResolveInlineLength.
   NGWritingMode writing_mode = FromPlatformWritingMode(style.GetWritingMode());
-  NGConstraintSpaceBuilder builder(writing_mode);
-  builder.SetInitialContainingBlockSize(
-      NGPhysicalSize{LayoutUnit(), LayoutUnit()});
+  NGConstraintSpaceBuilder builder(
+      writing_mode,
+      /* icb_size */ {NGSizeIndefinite, NGSizeIndefinite});
   RefPtr<NGConstraintSpace> space = builder.ToConstraintSpace(writing_mode);
 
   MinMaxSize computed_sizes;
diff --git a/third_party/WebKit/Source/core/layout/ng/ng_length_utils_test.cc b/third_party/WebKit/Source/core/layout/ng/ng_length_utils_test.cc
index eae247f..1ee3abb 100644
--- a/third_party/WebKit/Source/core/layout/ng/ng_length_utils_test.cc
+++ b/third_party/WebKit/Source/core/layout/ng/ng_length_utils_test.cc
@@ -26,11 +26,13 @@
       bool fixed_inline = false,
       bool fixed_block = false,
       NGWritingMode writing_mode = NGWritingMode::kHorizontalTopBottom) {
-    return NGConstraintSpaceBuilder(writing_mode)
-        .SetAvailableSize(
-            NGLogicalSize(LayoutUnit(inline_size), LayoutUnit(block_size)))
-        .SetPercentageResolutionSize(
-            NGLogicalSize(LayoutUnit(inline_size), LayoutUnit(block_size)))
+    NGLogicalSize size = {LayoutUnit(inline_size), LayoutUnit(block_size)};
+
+    return NGConstraintSpaceBuilder(
+               writing_mode,
+               /* icb_size */ size.ConvertToPhysical(writing_mode))
+        .SetAvailableSize(size)
+        .SetPercentageResolutionSize(size)
         .SetIsFixedSizeInline(fixed_inline)
         .SetIsFixedSizeBlock(fixed_block)
         .ToConstraintSpace(writing_mode);
diff --git a/third_party/WebKit/Source/core/layout/ng/ng_out_of_flow_layout_part.cc b/third_party/WebKit/Source/core/layout/ng/ng_out_of_flow_layout_part.cc
index ec0fc1e8..e0503cf 100644
--- a/third_party/WebKit/Source/core/layout/ng/ng_out_of_flow_layout_part.cc
+++ b/third_party/WebKit/Source/core/layout/ng/ng_out_of_flow_layout_part.cc
@@ -50,17 +50,11 @@
           container_builder_->Size().ConvertToPhysical(writing_mode),
           NGPhysicalSize());
 
-  NGLogicalSize space_size = container_builder_->Size();
-  space_size.block_size -= borders.BlockSum();
-  space_size.inline_size -= borders.InlineSum();
+  container_size_ = container_builder_->Size();
+  container_size_.inline_size -= borders.InlineSum();
+  container_size_.block_size -= borders.BlockSum();
 
-  // Initialize ConstraintSpace
-  NGConstraintSpaceBuilder space_builder(writing_mode);
-  space_builder.SetAvailableSize(space_size);
-  space_builder.SetPercentageResolutionSize(space_size);
-  space_builder.SetIsNewFormattingContext(true);
-  space_builder.SetTextDirection(container_style_.Direction());
-  container_space_ = space_builder.ToConstraintSpace(writing_mode);
+  icb_size_ = container_space.InitialContainingBlockSize();
 }
 
 void NGOutOfFlowLayoutPart::Run() {
@@ -95,6 +89,11 @@
     NGLogicalOffset* offset) {
   DCHECK(descendant);
 
+  NGWritingMode container_writing_mode(
+      FromPlatformWritingMode(container_style_.GetWritingMode()));
+  NGWritingMode descendant_writing_mode(
+      FromPlatformWritingMode(descendant.Style().GetWritingMode()));
+
   // Adjust the static_position origin. The static_position coordinate origin is
   // relative to the container's border box, ng_absolute_utils expects it to be
   // relative to the container's padding box.
@@ -102,15 +101,15 @@
 
   // The block estimate is in the descendant's writing mode.
   RefPtr<NGConstraintSpace> descendant_constraint_space =
-      NGConstraintSpaceBuilder(container_space_.Get())
-          .ToConstraintSpace(
-              FromPlatformWritingMode(descendant.Style().GetWritingMode()));
+      NGConstraintSpaceBuilder(container_writing_mode, icb_size_)
+          .SetTextDirection(container_style_.Direction())
+          .SetAvailableSize(container_size_)
+          .SetPercentageResolutionSize(container_size_)
+          .ToConstraintSpace(descendant_writing_mode);
   Optional<MinMaxSize> min_max_size;
   Optional<LayoutUnit> block_estimate;
 
   RefPtr<NGLayoutResult> layout_result = nullptr;
-  NGWritingMode descendant_writing_mode(
-      FromPlatformWritingMode(descendant.Style().GetWritingMode()));
 
   if (AbsoluteNeedsChildInlineSize(descendant.Style()) ||
       NeedMinMaxSize(descendant.Style())) {
@@ -119,8 +118,8 @@
 
   Optional<NGLogicalSize> replaced_size;
   if (descendant.IsReplaced())
-    replaced_size =
-        ComputeReplacedSize(descendant, *container_space_, min_max_size);
+    replaced_size = ComputeReplacedSize(
+        descendant, *descendant_constraint_space, min_max_size);
 
   NGAbsolutePhysicalPosition node_position =
       ComputePartialAbsoluteWithChildInlineSize(
@@ -151,7 +150,7 @@
   // Compute logical offset, NGAbsolutePhysicalPosition is calculated relative
   // to the padding box so add back the container's borders.
   NGBoxStrut inset = node_position.inset.ConvertToLogical(
-      container_space_->WritingMode(), container_space_->Direction());
+      container_writing_mode, container_style_.Direction());
   offset->inline_offset =
       inset.inline_start + container_border_offset_.inline_offset;
   offset->block_offset =
@@ -173,10 +172,10 @@
   // the constraint space in the descendant's writing mode.
   NGWritingMode writing_mode(
       FromPlatformWritingMode(descendant.Style().GetWritingMode()));
-  NGLogicalSize container_size(
-      container_space_->AvailableSize()
-          .ConvertToPhysical(container_space_->WritingMode())
-          .ConvertToLogical(writing_mode));
+  NGLogicalSize container_size(container_size_
+                                   .ConvertToPhysical(FromPlatformWritingMode(
+                                       container_style_.GetWritingMode()))
+                                   .ConvertToLogical(writing_mode));
 
   LayoutUnit inline_size =
       node_position.size.ConvertToLogical(writing_mode).inline_size;
@@ -186,13 +185,14 @@
   NGLogicalSize available_size{inline_size, block_size};
 
   // TODO(atotic) will need to be adjusted for scrollbars.
-  NGConstraintSpaceBuilder builder(writing_mode);
-  builder.SetAvailableSize(available_size);
-  builder.SetPercentageResolutionSize(container_size);
+  NGConstraintSpaceBuilder builder(writing_mode, icb_size_);
+  builder.SetAvailableSize(available_size)
+      .SetTextDirection(descendant.Style().Direction())
+      .SetPercentageResolutionSize(container_size)
+      .SetIsNewFormattingContext(true)
+      .SetIsFixedSizeInline(true);
   if (block_estimate)
     builder.SetIsFixedSizeBlock(true);
-  builder.SetIsFixedSizeInline(true);
-  builder.SetIsNewFormattingContext(true);
   RefPtr<NGConstraintSpace> space = builder.ToConstraintSpace(writing_mode);
 
   return descendant.Layout(space.Get());
diff --git a/third_party/WebKit/Source/core/layout/ng/ng_out_of_flow_layout_part.h b/third_party/WebKit/Source/core/layout/ng/ng_out_of_flow_layout_part.h
index b186f9c..f3ceeec 100644
--- a/third_party/WebKit/Source/core/layout/ng/ng_out_of_flow_layout_part.h
+++ b/third_party/WebKit/Source/core/layout/ng/ng_out_of_flow_layout_part.h
@@ -47,7 +47,8 @@
 
   NGLogicalOffset container_border_offset_;
   NGPhysicalOffset container_border_physical_offset_;
-  RefPtr<NGConstraintSpace> container_space_;
+  NGLogicalSize container_size_;
+  NGPhysicalSize icb_size_;
 };
 
 }  // namespace blink