From ae6fa4834c00b10df8cf2ac96b7358c7a45dd3e0 Mon Sep 17 00:00:00 2001 From: Ting-Yu Lin Date: Tue, 8 Feb 2022 22:47:20 +0000 Subject: [PATCH] Bug 1752658 Part 7 - Generalize GenerateFlexLines to populate FlexLayoutResult. r=dholbert Differential Revision: https://phabricator.services.mozilla.com/D138101 --- layout/generic/nsFlexContainerFrame.cpp | 27 +++++++++++++++---------- layout/generic/nsFlexContainerFrame.h | 9 ++++----- 2 files changed, 20 insertions(+), 16 deletions(-) diff --git a/layout/generic/nsFlexContainerFrame.cpp b/layout/generic/nsFlexContainerFrame.cpp index 1b2c55d4d863..5844ae673a41 100644 --- a/layout/generic/nsFlexContainerFrame.cpp +++ b/layout/generic/nsFlexContainerFrame.cpp @@ -4233,12 +4233,17 @@ void nsFlexContainerFrame::GenerateFlexLines( } } -void nsFlexContainerFrame::GenerateFlexLines(const SharedFlexData& aData, - nsTArray& aLines) { +nsFlexContainerFrame::FlexLayoutResult +nsFlexContainerFrame::GenerateFlexLayoutResult() { MOZ_ASSERT(GetPrevInFlow(), "This should be called by non-first-in-flows!"); + auto* data = FirstInFlow()->GetProperty(SharedFlexData::Prop()); + MOZ_ASSERT(data, "SharedFlexData should be set by our first-in-flow!"); + + FlexLayoutResult flr; + // Pretend we have only one line and zero main gap size. - aLines.AppendElement(FlexLine(0)); + flr.mLines.AppendElement(FlexLine(0)); // The order state of the children is consistent across entire continuation // chain due to calling nsContainerFrame::NormalizeChildLists() at the @@ -4255,7 +4260,7 @@ void nsFlexContainerFrame::GenerateFlexLines(const SharedFlexData& aData, CSSOrderAwareFrameIterator::ChildFilter::SkipPlaceholders, OrderStateForIter(this), OrderingPropertyForIter(this)); - FlexItemIterator itemIter(aData.mLines); + FlexItemIterator itemIter(data->mLines); for (; !iter.AtEnd(); iter.Next()) { nsIFrame* const child = *iter; @@ -4266,12 +4271,17 @@ void nsFlexContainerFrame::GenerateFlexLines(const SharedFlexData& aData, for (; !itemIter.AtEnd(); itemIter.Next()) { if (itemIter->Frame() == childFirstInFlow) { - aLines[0].Items().AppendElement(itemIter->CloneFor(child)); + flr.mLines[0].Items().AppendElement(itemIter->CloneFor(child)); itemIter.Next(); break; } } } + + flr.mContentBoxMainSize = data->mContentBoxMainSize; + flr.mContentBoxCrossSize = data->mContentBoxCrossSize; + + return flr; } // Returns the largest outer hypothetical main-size of any line in |aLines|. @@ -4600,12 +4610,7 @@ void nsFlexContainerFrame::Reflow(nsPresContext* aPresContext, containerInfo); } } else { - auto* data = FirstInFlow()->GetProperty(SharedFlexData::Prop()); - MOZ_ASSERT(data, "SharedFlexData should be set by our first-in-flow!"); - - GenerateFlexLines(*data, flr.mLines); - flr.mContentBoxMainSize = data->mContentBoxMainSize; - flr.mContentBoxCrossSize = data->mContentBoxCrossSize; + flr = GenerateFlexLayoutResult(); } const LogicalSize contentBoxSize = diff --git a/layout/generic/nsFlexContainerFrame.h b/layout/generic/nsFlexContainerFrame.h index 61802dda029d..3d151d3b11c3 100644 --- a/layout/generic/nsFlexContainerFrame.h +++ b/layout/generic/nsFlexContainerFrame.h @@ -456,12 +456,11 @@ class nsFlexContainerFrame final : public nsContainerFrame { nsTArray& aLines); /** - * This method creates FlexLines and FlexItems for children in flex - * container's next-in-flows by using the SharedFlexData stored in flex - * container's first-in-flow. Returns FlexLines in the outparam |aLines|. + * Generates and returns a FlexLayoutResult that contains the FlexLines and + * some sizing metrics that should be used to lay out a particular flex + * container continuation (i.e. don't call this on the first-in-flow). */ - void GenerateFlexLines(const SharedFlexData& aData, - nsTArray& aLines); + FlexLayoutResult GenerateFlexLayoutResult(); /** * Resolves the content-box main-size of a flex container frame,