Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(189)

Unified Diff: third_party/WebKit/Source/core/layout/ng/ng_fragment_builder.h

Issue 2540653003: Implement collection of out-of-flow descendants (Closed)
Patch Set: Merge conflicts resolved Created 4 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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

Powered by Google App Engine
This is Rietveld 408576698