| // Copyright 2018 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "third_party/blink/renderer/core/layout/ng/layout_ng_flexible_box.h" |
| |
| #include "third_party/blink/renderer/core/layout/layout_analyzer.h" |
| #include "third_party/blink/renderer/core/layout/ng/ng_block_node.h" |
| #include "third_party/blink/renderer/core/layout/ng/ng_constraint_space.h" |
| #include "third_party/blink/renderer/core/layout/ng/ng_layout_result.h" |
| #include "third_party/blink/renderer/core/layout/ng/ng_out_of_flow_positioned_descendant.h" |
| #include "third_party/blink/renderer/core/layout/ng/ng_physical_box_fragment.h" |
| |
| namespace blink { |
| |
| LayoutNGFlexibleBox::LayoutNGFlexibleBox(Element* element) |
| : LayoutBlock(element) {} |
| |
| void LayoutNGFlexibleBox::UpdateBlockLayout(bool relayout_children) { |
| LayoutAnalyzer::BlockScope analyzer(*this); |
| |
| // TODO(dgrogan): Reuse logic from LayoutNGBlockFlow's |
| // UpdateOutOfFlowBlockLayout when this flexbox is out of flow. |
| |
| scoped_refptr<NGConstraintSpace> constraint_space = |
| NGConstraintSpace::CreateFromLayoutObject(*this); |
| |
| scoped_refptr<NGLayoutResult> result = |
| NGBlockNode(this).Layout(*constraint_space); |
| |
| for (NGOutOfFlowPositionedDescendant descendant : |
| result->OutOfFlowPositionedDescendants()) |
| descendant.node.UseOldOutOfFlowPositioning(); |
| |
| NGPhysicalBoxFragment* fragment = |
| ToNGPhysicalBoxFragment(result->PhysicalFragment().get()); |
| |
| // Pasted from layout_ng_block_flow. TODO(dgrogan): Factor a utility method. |
| const LayoutBlock* containing_block = ContainingBlock(); |
| NGPhysicalOffset physical_offset; |
| if (containing_block) { |
| NGPhysicalSize containing_block_size(containing_block->Size().Width(), |
| containing_block->Size().Height()); |
| NGLogicalOffset logical_offset(LogicalLeft(), LogicalTop()); |
| physical_offset = logical_offset.ConvertToPhysical( |
| constraint_space->GetWritingMode(), constraint_space->Direction(), |
| containing_block_size, fragment->Size()); |
| } |
| fragment->SetOffset(physical_offset); |
| } |
| |
| } // namespace blink |