OLD | NEW |
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_block_child_iterator.h" | 9 #include "core/layout/ng/ng_block_child_iterator.h" |
10 #include "core/layout/ng/ng_box_fragment.h" | 10 #include "core/layout/ng/ng_box_fragment.h" |
(...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
127 // | 127 // |
128 // @param space Constraint space that is used to find layout opportunity for | 128 // @param space Constraint space that is used to find layout opportunity for |
129 // the fragment. | 129 // the fragment. |
130 // @param fragment Fragment that needs to be placed. | 130 // @param fragment Fragment that needs to be placed. |
131 // @param origin_point {@code space}'s offset relative to the space that | 131 // @param origin_point {@code space}'s offset relative to the space that |
132 // establishes a new formatting context that we're currently | 132 // establishes a new formatting context that we're currently |
133 // in and where all our exclusions reside. | 133 // in and where all our exclusions reside. |
134 // @param margins Margins of the fragment. | 134 // @param margins Margins of the fragment. |
135 // @return Layout opportunity for the fragment. | 135 // @return Layout opportunity for the fragment. |
136 const NGLayoutOpportunity FindLayoutOpportunityForFragment( | 136 const NGLayoutOpportunity FindLayoutOpportunityForFragment( |
137 NGConstraintSpace* space, | 137 const NGConstraintSpace* space, |
138 const NGFragment& fragment, | 138 const NGFragment& fragment, |
139 const NGLogicalOffset& origin_point, | 139 const NGLogicalOffset& origin_point, |
140 const NGBoxStrut& margins) { | 140 const NGBoxStrut& margins) { |
141 NGLogicalOffset adjusted_origin_point = | 141 NGLogicalOffset adjusted_origin_point = |
142 AdjustToTopEdgeAlignmentRule(*space, origin_point); | 142 AdjustToTopEdgeAlignmentRule(*space, origin_point); |
143 | 143 |
144 NGLayoutOpportunityIterator opportunity_iter(space, adjusted_origin_point); | 144 NGLayoutOpportunityIterator opportunity_iter(space, adjusted_origin_point); |
145 NGLayoutOpportunity opportunity; | 145 NGLayoutOpportunity opportunity; |
146 NGLayoutOpportunity opportunity_candidate = opportunity_iter.Next(); | 146 NGLayoutOpportunity opportunity_candidate = opportunity_iter.Next(); |
147 | 147 |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
179 block_offset -= from_offset.block_offset; | 179 block_offset -= from_offset.block_offset; |
180 inline_offset -= from_offset.inline_offset; | 180 inline_offset -= from_offset.inline_offset; |
181 | 181 |
182 return NGLogicalOffset(inline_offset, block_offset); | 182 return NGLogicalOffset(inline_offset, block_offset); |
183 } | 183 } |
184 | 184 |
185 // Calculates the relative position from {@code from_offset} of the | 185 // Calculates the relative position from {@code from_offset} of the |
186 // floating object that is requested to be positioned from {@code origin_point}. | 186 // floating object that is requested to be positioned from {@code origin_point}. |
187 NGLogicalOffset PositionFloat(const NGLogicalOffset& origin_point, | 187 NGLogicalOffset PositionFloat(const NGLogicalOffset& origin_point, |
188 const NGLogicalOffset& from_offset, | 188 const NGLogicalOffset& from_offset, |
189 NGFloatingObject* floating_object) { | 189 NGFloatingObject* floating_object, |
190 NGConstraintSpace* float_space = floating_object->space.get(); | 190 NGConstraintSpace* new_parent_space) { |
| 191 const auto* float_space = floating_object->space.get(); |
191 DCHECK(floating_object->fragment) << "Fragment cannot be null here"; | 192 DCHECK(floating_object->fragment) << "Fragment cannot be null here"; |
192 | 193 |
193 // TODO(ikilpatrick): The writing mode switching here looks wrong. | 194 // TODO(ikilpatrick): The writing mode switching here looks wrong. |
194 NGBoxFragment float_fragment( | 195 NGBoxFragment float_fragment( |
195 float_space->WritingMode(), | 196 float_space->WritingMode(), |
196 toNGPhysicalBoxFragment(floating_object->fragment.get())); | 197 toNGPhysicalBoxFragment(floating_object->fragment.get())); |
197 | 198 |
198 // Find a layout opportunity that will fit our float. | 199 // Find a layout opportunity that will fit our float. |
199 const NGLayoutOpportunity opportunity = FindLayoutOpportunityForFragment( | 200 const NGLayoutOpportunity opportunity = FindLayoutOpportunityForFragment( |
200 float_space, float_fragment, origin_point, floating_object->margins); | 201 float_space, float_fragment, origin_point, floating_object->margins); |
201 DCHECK(!opportunity.IsEmpty()) << "Opportunity is empty but it shouldn't be"; | 202 DCHECK(!opportunity.IsEmpty()) << "Opportunity is empty but it shouldn't be"; |
202 | 203 |
203 // Calculate the float offset if needed. | 204 // Calculate the float offset if needed. |
204 LayoutUnit float_offset; | 205 LayoutUnit float_offset; |
205 if (floating_object->exclusion_type == NGExclusion::kFloatRight) { | 206 if (floating_object->exclusion_type == NGExclusion::kFloatRight) { |
206 LayoutUnit float_margin_box_inline_size = | 207 LayoutUnit float_margin_box_inline_size = |
207 float_fragment.InlineSize() + floating_object->margins.InlineSum(); | 208 float_fragment.InlineSize() + floating_object->margins.InlineSum(); |
208 float_offset = opportunity.size.inline_size - float_margin_box_inline_size; | 209 float_offset = opportunity.size.inline_size - float_margin_box_inline_size; |
209 } | 210 } |
210 | 211 |
211 // Add the float as an exclusion. | 212 // Add the float as an exclusion. |
212 const NGExclusion exclusion = CreateExclusion( | 213 const NGExclusion exclusion = CreateExclusion( |
213 float_fragment, opportunity, float_offset, floating_object->margins, | 214 float_fragment, opportunity, float_offset, floating_object->margins, |
214 floating_object->exclusion_type); | 215 floating_object->exclusion_type); |
215 float_space->AddExclusion(exclusion); | 216 new_parent_space->AddExclusion(exclusion); |
216 | 217 |
217 return CalculateLogicalOffsetForOpportunity(opportunity, float_offset, | 218 return CalculateLogicalOffsetForOpportunity(opportunity, float_offset, |
218 from_offset, floating_object); | 219 from_offset, floating_object); |
219 } | 220 } |
220 | 221 |
221 // Updates the Floating Object's left offset from the provided parent_space | 222 // Updates the Floating Object's left offset from the provided parent_space |
222 // and {@code floating_object}'s space and margins. | 223 // and {@code floating_object}'s space and margins. |
223 void UpdateFloatingObjectLeftOffset( | 224 void UpdateFloatingObjectLeftOffset( |
224 const NGConstraintSpace& new_parent_space, | 225 const NGConstraintSpace& new_parent_space, |
225 const Persistent<NGFloatingObject>& floating_object, | 226 const Persistent<NGFloatingObject>& floating_object, |
226 const NGLogicalOffset& float_logical_offset) { | 227 const NGLogicalOffset& float_logical_offset) { |
227 // TODO(glebl): We should use physical offset here. | 228 // TODO(glebl): We should use physical offset here. |
228 floating_object->left_offset = | 229 floating_object->left_offset = |
229 floating_object->original_parent_space->BfcOffset().inline_offset - | 230 floating_object->original_parent_space->BfcOffset().inline_offset - |
230 new_parent_space.BfcOffset().inline_offset + | 231 new_parent_space.BfcOffset().inline_offset + |
231 float_logical_offset.inline_offset; | 232 float_logical_offset.inline_offset; |
232 } | 233 } |
233 | 234 |
234 // Positions pending floats stored on the fragment builder starting from | 235 // Positions pending floats stored on the fragment builder starting from |
235 // {@code origin_point_block_offset}. | 236 // {@code origin_point_block_offset}. |
236 void PositionPendingFloats(const LayoutUnit origin_point_block_offset, | 237 void PositionPendingFloats(const LayoutUnit origin_point_block_offset, |
237 const NGConstraintSpace& new_parent_space, | 238 NGConstraintSpace* new_parent_space, |
238 NGFragmentBuilder* builder) { | 239 NGFragmentBuilder* builder) { |
239 DCHECK(builder->BfcOffset()) << "Parent BFC offset should be known here"; | 240 DCHECK(builder->BfcOffset()) << "Parent BFC offset should be known here"; |
240 LayoutUnit bfc_block_offset = builder->BfcOffset().value().block_offset; | 241 LayoutUnit bfc_block_offset = builder->BfcOffset().value().block_offset; |
241 | 242 |
242 for (auto& floating_object : builder->UnpositionedFloats()) { | 243 for (auto& floating_object : builder->UnpositionedFloats()) { |
243 NGConstraintSpace* float_space = floating_object->space.get(); | 244 const auto* float_space = floating_object->space.get(); |
244 const NGConstraintSpace* original_parent_space = | 245 const NGConstraintSpace* original_parent_space = |
245 floating_object->original_parent_space.get(); | 246 floating_object->original_parent_space.get(); |
246 | 247 |
247 NGLogicalOffset origin_point = {float_space->BfcOffset().inline_offset, | 248 NGLogicalOffset origin_point = {float_space->BfcOffset().inline_offset, |
248 origin_point_block_offset}; | 249 origin_point_block_offset}; |
249 NGLogicalOffset from_offset = { | 250 NGLogicalOffset from_offset = { |
250 original_parent_space->BfcOffset().inline_offset, bfc_block_offset}; | 251 original_parent_space->BfcOffset().inline_offset, bfc_block_offset}; |
251 | 252 |
252 NGLogicalOffset float_fragment_offset = | 253 NGLogicalOffset float_fragment_offset = PositionFloat( |
253 PositionFloat(origin_point, from_offset, floating_object); | 254 origin_point, from_offset, floating_object, new_parent_space); |
254 builder->AddFloatingObject(floating_object, float_fragment_offset); | 255 builder->AddFloatingObject(floating_object, float_fragment_offset); |
255 UpdateFloatingObjectLeftOffset(new_parent_space, floating_object, | 256 UpdateFloatingObjectLeftOffset(*new_parent_space, floating_object, |
256 float_fragment_offset); | 257 float_fragment_offset); |
257 } | 258 } |
258 builder->MutableUnpositionedFloats().clear(); | 259 builder->MutableUnpositionedFloats().clear(); |
259 } | 260 } |
260 | 261 |
261 // Whether an in-flow block-level child creates a new formatting context. | 262 // Whether an in-flow block-level child creates a new formatting context. |
262 // | 263 // |
263 // This will *NOT* check the following cases: | 264 // This will *NOT* check the following cases: |
264 // - The child is out-of-flow, e.g. floating or abs-pos. | 265 // - The child is out-of-flow, e.g. floating or abs-pos. |
265 // - The child is a inline-level, e.g. "display: inline-block". | 266 // - The child is a inline-level, e.g. "display: inline-block". |
(...skipping 226 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
492 ComputeBlockSizeForFragment(ConstraintSpace(), Style(), content_size_); | 493 ComputeBlockSizeForFragment(ConstraintSpace(), Style(), content_size_); |
493 builder_.SetBlockSize(block_size); | 494 builder_.SetBlockSize(block_size); |
494 | 495 |
495 // Layout our absolute and fixed positioned children. | 496 // Layout our absolute and fixed positioned children. |
496 NGOutOfFlowLayoutPart(ConstraintSpace(), Style(), &builder_).Run(); | 497 NGOutOfFlowLayoutPart(ConstraintSpace(), Style(), &builder_).Run(); |
497 | 498 |
498 // Non-empty blocks always know their position in space: | 499 // Non-empty blocks always know their position in space: |
499 if (block_size) { | 500 if (block_size) { |
500 curr_bfc_offset_.block_offset += curr_margin_strut_.Sum(); | 501 curr_bfc_offset_.block_offset += curr_margin_strut_.Sum(); |
501 UpdateFragmentBfcOffset(curr_bfc_offset_); | 502 UpdateFragmentBfcOffset(curr_bfc_offset_); |
502 PositionPendingFloats(curr_bfc_offset_.block_offset, ConstraintSpace(), | 503 PositionPendingFloats(curr_bfc_offset_.block_offset, |
503 &builder_); | 504 MutableConstraintSpace(), &builder_); |
504 } | 505 } |
505 | 506 |
506 // Margins collapsing: | 507 // Margins collapsing: |
507 // Do not collapse margins between the last in-flow child and bottom margin | 508 // Do not collapse margins between the last in-flow child and bottom margin |
508 // of its parent if the parent has height != auto() | 509 // of its parent if the parent has height != auto() |
509 if (!Style().logicalHeight().isAuto()) { | 510 if (!Style().logicalHeight().isAuto()) { |
510 // TODO(glebl): handle minLogicalHeight, maxLogicalHeight. | 511 // TODO(glebl): handle minLogicalHeight, maxLogicalHeight. |
511 curr_margin_strut_ = NGMarginStrut(); | 512 curr_margin_strut_ = NGMarginStrut(); |
512 } | 513 } |
513 builder_.SetEndMarginStrut(curr_margin_strut_); | 514 builder_.SetEndMarginStrut(curr_margin_strut_); |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
551 | 552 |
552 // Pull out unpositioned floats to the current fragment. This may needed if | 553 // Pull out unpositioned floats to the current fragment. This may needed if |
553 // for example the child fragment could not position its floats because it's | 554 // for example the child fragment could not position its floats because it's |
554 // empty and therefore couldn't determine its position in space. | 555 // empty and therefore couldn't determine its position in space. |
555 builder_.MutableUnpositionedFloats().appendVector( | 556 builder_.MutableUnpositionedFloats().appendVector( |
556 layout_result->UnpositionedFloats()); | 557 layout_result->UnpositionedFloats()); |
557 | 558 |
558 if (child->Type() == NGLayoutInputNode::kLegacyBlock && | 559 if (child->Type() == NGLayoutInputNode::kLegacyBlock && |
559 toNGBlockNode(child)->Style().isFloating()) { | 560 toNGBlockNode(child)->Style().isFloating()) { |
560 NGFloatingObject* floating_object = new NGFloatingObject( | 561 NGFloatingObject* floating_object = new NGFloatingObject( |
561 layout_result->PhysicalFragment().get(), child_space, constraint_space_, | 562 child_space, constraint_space_, toNGBlockNode(child)->Style(), |
562 toNGBlockNode(child), toNGBlockNode(child)->Style(), | 563 curr_child_margins_, layout_result->PhysicalFragment().get()); |
563 curr_child_margins_); | |
564 builder_.AddUnpositionedFloat(floating_object); | 564 builder_.AddUnpositionedFloat(floating_object); |
565 // No need to postpone the positioning if we know the correct offset. | 565 // No need to postpone the positioning if we know the correct offset. |
566 if (builder_.BfcOffset()) { | 566 if (builder_.BfcOffset()) { |
567 NGLogicalOffset origin_point = curr_bfc_offset_; | 567 NGLogicalOffset origin_point = curr_bfc_offset_; |
568 // Adjust origin point to the margins of the last child. | 568 // Adjust origin point to the margins of the last child. |
569 // Example: <div style="margin-bottom: 20px"><float></div> | 569 // Example: <div style="margin-bottom: 20px"><float></div> |
570 // <div style="margin-bottom: 30px"></div> | 570 // <div style="margin-bottom: 30px"></div> |
571 origin_point.block_offset += curr_margin_strut_.Sum(); | 571 origin_point.block_offset += curr_margin_strut_.Sum(); |
572 PositionPendingFloats(origin_point.block_offset, ConstraintSpace(), | 572 PositionPendingFloats(origin_point.block_offset, MutableConstraintSpace(), |
573 &builder_); | 573 &builder_); |
574 } | 574 } |
575 return; | 575 return; |
576 } | 576 } |
577 | 577 |
578 // Determine the fragment's position in the parent space either by using | 578 // Determine the fragment's position in the parent space either by using |
579 // content_size_ or known fragment's BFC offset. | 579 // content_size_ or known fragment's BFC offset. |
580 WTF::Optional<NGLogicalOffset> bfc_offset; | 580 WTF::Optional<NGLogicalOffset> bfc_offset; |
581 if (child_space->IsNewFormattingContext()) { | 581 if (child_space->IsNewFormattingContext()) { |
582 // TODO(ikilpatrick): We may need to place ourself within the BFC | 582 // TODO(ikilpatrick): We may need to place ourself within the BFC |
(...skipping 10 matching lines...) Expand all Loading... |
593 // position because the parent fragment's BFC is known. | 593 // position because the parent fragment's BFC is known. |
594 // Example: | 594 // Example: |
595 // BFC Offset is known here because of the padding. | 595 // BFC Offset is known here because of the padding. |
596 // <div style="padding: 1px"> | 596 // <div style="padding: 1px"> |
597 // <div id="empty-div" style="margins: 1px"></div> | 597 // <div id="empty-div" style="margins: 1px"></div> |
598 bfc_offset = curr_bfc_offset_; | 598 bfc_offset = curr_bfc_offset_; |
599 bfc_offset.value().block_offset += curr_margin_strut_.Sum(); | 599 bfc_offset.value().block_offset += curr_margin_strut_.Sum(); |
600 } | 600 } |
601 if (bfc_offset) { | 601 if (bfc_offset) { |
602 UpdateFragmentBfcOffset(curr_bfc_offset_); | 602 UpdateFragmentBfcOffset(curr_bfc_offset_); |
603 PositionPendingFloats(curr_bfc_offset_.block_offset, ConstraintSpace(), | 603 PositionPendingFloats(curr_bfc_offset_.block_offset, |
604 &builder_); | 604 MutableConstraintSpace(), &builder_); |
605 } | 605 } |
606 NGLogicalOffset logical_offset = CalculateLogicalOffset(bfc_offset); | 606 NGLogicalOffset logical_offset = CalculateLogicalOffset(bfc_offset); |
607 | 607 |
608 // Update margin strut. | 608 // Update margin strut. |
609 curr_margin_strut_ = fragment.EndMarginStrut(); | 609 curr_margin_strut_ = fragment.EndMarginStrut(); |
610 curr_margin_strut_.Append(curr_child_margins_.block_end); | 610 curr_margin_strut_.Append(curr_child_margins_.block_end); |
611 | 611 |
612 // Only modify content_size if BlockSize is not empty. It's needed to prevent | 612 // Only modify content_size if BlockSize is not empty. It's needed to prevent |
613 // the situation when logical_offset is included in content_size for empty | 613 // the situation when logical_offset is included in content_size for empty |
614 // blocks. Example: | 614 // blocks. Example: |
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
689 RefPtr<NGConstraintSpace> NGBlockLayoutAlgorithm::CreateConstraintSpaceForChild( | 689 RefPtr<NGConstraintSpace> NGBlockLayoutAlgorithm::CreateConstraintSpaceForChild( |
690 NGLayoutInputNode* child) { | 690 NGLayoutInputNode* child) { |
691 DCHECK(child); | 691 DCHECK(child); |
692 | 692 |
693 if (child->Type() == NGLayoutInputNode::kLegacyInline) { | 693 if (child->Type() == NGLayoutInputNode::kLegacyInline) { |
694 // TODO(kojii): Setup space_builder_ appropriately for inline child. | 694 // TODO(kojii): Setup space_builder_ appropriately for inline child. |
695 | 695 |
696 // Margins collapsing: Inline block. | 696 // Margins collapsing: Inline block. |
697 curr_bfc_offset_.block_offset += curr_margin_strut_.Sum(); | 697 curr_bfc_offset_.block_offset += curr_margin_strut_.Sum(); |
698 UpdateFragmentBfcOffset(curr_bfc_offset_); | 698 UpdateFragmentBfcOffset(curr_bfc_offset_); |
699 PositionPendingFloats(curr_bfc_offset_.block_offset, ConstraintSpace(), | 699 PositionPendingFloats(curr_bfc_offset_.block_offset, |
700 &builder_); | 700 MutableConstraintSpace(), &builder_); |
701 curr_margin_strut_ = {}; | 701 curr_margin_strut_ = {}; |
702 | 702 |
703 return space_builder_.ToConstraintSpace( | 703 return space_builder_.ToConstraintSpace( |
704 FromPlatformWritingMode(Style().getWritingMode())); | 704 FromPlatformWritingMode(Style().getWritingMode())); |
705 } | 705 } |
706 | 706 |
707 NGBlockNode* block_child = toNGBlockNode(child); | 707 NGBlockNode* block_child = toNGBlockNode(child); |
708 const ComputedStyle& child_style = block_child->Style(); | 708 const ComputedStyle& child_style = block_child->Style(); |
709 | 709 |
710 // Calculate margins in parent's writing mode. | 710 // Calculate margins in parent's writing mode. |
(...skipping 12 matching lines...) Expand all Loading... |
723 // - Position all pending floats since the fragment's BFC offset is known. | 723 // - Position all pending floats since the fragment's BFC offset is known. |
724 // - Set the clearance offset on the constraint space's builder. | 724 // - Set the clearance offset on the constraint space's builder. |
725 if (child_style.clear() != EClear::kNone) { | 725 if (child_style.clear() != EClear::kNone) { |
726 curr_bfc_offset_.block_offset += curr_margin_strut_.Sum(); | 726 curr_bfc_offset_.block_offset += curr_margin_strut_.Sum(); |
727 UpdateFragmentBfcOffset(curr_bfc_offset_); | 727 UpdateFragmentBfcOffset(curr_bfc_offset_); |
728 // Only collapse margins if it's an adjoining block with clearance. | 728 // Only collapse margins if it's an adjoining block with clearance. |
729 if (!content_size_) { | 729 if (!content_size_) { |
730 curr_margin_strut_ = NGMarginStrut(); | 730 curr_margin_strut_ = NGMarginStrut(); |
731 curr_child_margins_.block_start = LayoutUnit(); | 731 curr_child_margins_.block_start = LayoutUnit(); |
732 } | 732 } |
733 PositionPendingFloats(curr_bfc_offset_.block_offset, ConstraintSpace(), | 733 PositionPendingFloats(curr_bfc_offset_.block_offset, |
734 &builder_); | 734 MutableConstraintSpace(), &builder_); |
735 WTF::Optional<LayoutUnit> clearance_offset = | 735 WTF::Optional<LayoutUnit> clearance_offset = |
736 GetClearanceOffset(constraint_space_->Exclusions(), child_style); | 736 GetClearanceOffset(constraint_space_->Exclusions(), child_style); |
737 space_builder_.SetClearanceOffset(clearance_offset); | 737 space_builder_.SetClearanceOffset(clearance_offset); |
738 } | 738 } |
739 | 739 |
740 // Set estimated BFC offset to the next child's constraint space. | 740 // Set estimated BFC offset to the next child's constraint space. |
741 curr_bfc_offset_ = builder_.BfcOffset() ? builder_.BfcOffset().value() | 741 curr_bfc_offset_ = builder_.BfcOffset() ? builder_.BfcOffset().value() |
742 : ConstraintSpace().BfcOffset(); | 742 : ConstraintSpace().BfcOffset(); |
743 curr_bfc_offset_.block_offset += content_size_; | 743 curr_bfc_offset_.block_offset += content_size_; |
744 curr_bfc_offset_.inline_offset += border_and_padding_.inline_start; | 744 curr_bfc_offset_.inline_offset += border_and_padding_.inline_start; |
(...skipping 22 matching lines...) Expand all Loading... |
767 DCHECK(builder_.BfcOffset()); | 767 DCHECK(builder_.BfcOffset()); |
768 space_available -= curr_bfc_offset_.block_offset; | 768 space_available -= curr_bfc_offset_.block_offset; |
769 } | 769 } |
770 } | 770 } |
771 space_builder_.SetFragmentainerSpaceAvailable(space_available); | 771 space_builder_.SetFragmentainerSpaceAvailable(space_available); |
772 | 772 |
773 return space_builder_.ToConstraintSpace( | 773 return space_builder_.ToConstraintSpace( |
774 FromPlatformWritingMode(child_style.getWritingMode())); | 774 FromPlatformWritingMode(child_style.getWritingMode())); |
775 } | 775 } |
776 } // namespace blink | 776 } // namespace blink |
OLD | NEW |