Index: third_party/WebKit/Source/core/layout/ng/ng_fragment_builder.h |
diff --git a/third_party/WebKit/Source/core/layout/ng/ng_fragment_builder.h b/third_party/WebKit/Source/core/layout/ng/ng_fragment_builder.h |
index 5b1a1f14a45407523f45b47e291a92e618ff25d8..ac703db1cbf49fe72e8cdd2c98ffad38dc98c911 100644 |
--- a/third_party/WebKit/Source/core/layout/ng/ng_fragment_builder.h |
+++ b/third_party/WebKit/Source/core/layout/ng/ng_fragment_builder.h |
@@ -28,8 +28,46 @@ class CORE_EXPORT NGFragmentBuilder final |
NGFragmentBuilder& AddChild(NGFragmentBase*, NGLogicalOffset); |
- NGFragmentBuilder& SetOutOfFlowDescendants(WeakBoxList&, |
- Vector<NGLogicalOffset>&); |
+ // Builder has non-trivial out-of-flow descendant methods. |
+ // These methods are building blocks for implementation of |
+ // out-of-flow descendants by layout algorithms. |
+ // |
+ // They are intended to be used by layout algorithm like this: |
+ // |
+ // Part 1: layout algorithm positions in-flow children. |
+ // out-of-flow children, and out-of-flow descendants of fragments |
+ // are stored inside builder. |
+ // |
+ // for (child : children) |
+ // if (child->position == (Absolute or Fixed)) |
+ // builder->AddOutOfFlowChildCandidate(child); |
+ // else |
+ // fragment = child->Layout() |
+ // builder->AddChild(fragment) |
+ // end |
+ // |
+ // Part 2: layout algorithm positions out-of-flow descendants. |
+ // |
+ // builder->SetInlineSize/SetBlockSize |
+ // builder->GetAndClearOutOfFlowDescendantCandidates(oof_candidates) |
+ // while (oof_candidates.size() > 0) |
+ // { |
+ // candidate = oof_candidates.shift() |
+ // if (CanPosition(candidate)) |
+ // fragment = candidate->Layout(); |
+ // builder->AddChild(fragment); |
+ // builder->GetAndClearOutOfFlowDescendantCandidates(child_oof_candidates) |
+ // oof_candidates.prepend(child_oof_candidates) |
+ // else |
+ // builder->AddOutOfFlowDescendant(); |
+ // } |
+ NGFragmentBuilder& AddOutOfFlowChildCandidate(NGBlockNode*, NGLogicalOffset); |
+ |
+ void GetAndClearOutOfFlowDescendantCandidates(WeakBoxList*, |
+ Vector<NGStaticPosition>*); |
+ |
+ NGFragmentBuilder& AddOutOfFlowDescendant(NGBlockNode*, |
+ const NGStaticPosition&); |
// Sets MarginStrut for the resultant fragment. |
NGFragmentBuilder& SetMarginStrutBlockStart(const NGMarginStrut& from); |
@@ -44,6 +82,24 @@ class CORE_EXPORT NGFragmentBuilder final |
DECLARE_VIRTUAL_TRACE(); |
private: |
+ // Out-of-flow descendant placement information. |
+ // The generated fragment must compute NGStaticPosition for all |
+ // out-of-flow descendants. |
+ // The resulting NGStaticPosition gets derived from: |
+ // 1. The offset of fragment's child. |
+ // 2. The static position of descendant wrt child. |
+ // |
+ // A child can be: |
+ // 1. A descendant itself. In this case, descendant position is (0,0). |
+ // 2. A fragment containing a descendant. |
+ // |
+ // child_offset is stored as NGLogicalOffset because physical offset cannot |
+ // be computed until we know fragment's size. |
+ struct OutOfFlowPlacement { |
+ NGLogicalOffset child_offset; |
+ NGStaticPosition descendant_position; |
+ }; |
+ |
NGPhysicalFragmentBase::NGFragmentType type_; |
NGWritingMode writing_mode_; |
TextDirection direction_; |
@@ -55,8 +111,12 @@ class CORE_EXPORT NGFragmentBuilder final |
HeapVector<Member<NGPhysicalFragmentBase>> children_; |
Vector<NGLogicalOffset> offsets_; |
+ |
+ WeakBoxList out_of_flow_descendant_candidates_; |
+ Vector<OutOfFlowPlacement> out_of_flow_candidate_placements_; |
+ |
WeakBoxList out_of_flow_descendants_; |
- Vector<NGLogicalOffset> out_of_flow_offsets_; |
+ Vector<NGStaticPosition> out_of_flow_positions_; |
}; |
} // namespace blink |