Bug 1454822 part 1: Refactor nsFlexContainerFrame::GetMinISize/GetPrefISize to be implemented via a common helper function. r?mats
This patch does not change behavior; it just merges the implementations of
these two functions into a single common function.
MozReview-Commit-ID: BqsRt3p2NQT
--- a/layout/generic/nsFlexContainerFrame.cpp
+++ b/layout/generic/nsFlexContainerFrame.cpp
@@ -30,16 +30,17 @@ using namespace mozilla::layout;
// Convenience typedefs for helper classes that we forward-declare in .h file
// (so that nsFlexContainerFrame methods can use them as parameters):
typedef nsFlexContainerFrame::FlexItem FlexItem;
typedef nsFlexContainerFrame::FlexLine FlexLine;
typedef nsFlexContainerFrame::FlexboxAxisTracker FlexboxAxisTracker;
typedef nsFlexContainerFrame::StrutInfo StrutInfo;
typedef nsFlexContainerFrame::CachedMeasuringReflowResult
CachedMeasuringReflowResult;
+typedef nsLayoutUtils::IntrinsicISizeType IntrinsicISizeType;
static mozilla::LazyLogModule gFlexContainerLog("nsFlexContainerFrame");
// XXXdholbert Some of this helper-stuff should be separated out into a general
// "main/cross-axis utils" header, shared by grid & flexbox?
// (Particularly when grid gets support for align-*/justify-* properties.)
// Helper enums
@@ -5068,83 +5069,68 @@ nsFlexContainerFrame::ReflowPlaceholders
// Mark the placeholder frame to indicate that it's not actually at the
// element's static position, because we need to apply CSS Alignment after
// we determine the OOF's size:
placeholder->AddStateBits(PLACEHOLDER_STATICPOS_NEEDS_CSSALIGN);
}
}
-/* virtual */ nscoord
-nsFlexContainerFrame::GetMinISize(gfxContext* aRenderingContext)
+nscoord
+nsFlexContainerFrame::IntrinsicISize(gfxContext* aRenderingContext,
+ IntrinsicISizeType aType)
{
- nscoord minISize = 0;
- DISPLAY_MIN_WIDTH(this, minISize);
-
+ nscoord containerISize = 0;
RenumberList();
const nsStylePosition* stylePos = StylePosition();
const FlexboxAxisTracker axisTracker(this, GetWritingMode());
const bool useMozBoxCollapseBehavior =
ShouldUseMozBoxCollapseBehavior(StyleDisplay());
for (nsIFrame* childFrame : mFrames) {
// If we're using legacy "visibility:collapse" behavior, then we don't
// care about the sizes of any collapsed children.
if (!useMozBoxCollapseBehavior ||
(NS_STYLE_VISIBILITY_COLLAPSE !=
childFrame->StyleVisibility()->mVisible)) {
- nscoord childMinISize =
+ nscoord childISize =
nsLayoutUtils::IntrinsicForContainer(aRenderingContext, childFrame,
- nsLayoutUtils::MIN_ISIZE);
- // For a horizontal single-line flex container, the intrinsic min
- // isize is the sum of its items' min isizes.
- // For a column-oriented flex container, or for a multi-line row-
- // oriented flex container, the intrinsic min isize is the max of
- // its items' min isizes.
+ aType);
+ // * For a row-oriented single-line flex container, the intrinsic
+ // {min/pref}-isize is the sum of its items' {min/pref}-isizes.
+ // * For a column-oriented flex container, the intrinsic min isize
+ // is the max of its items' min isizes.
+ // * For a row-oriented multi-line flex container, the intrinsic
+ // pref isize is former (sum), and its min isize is the latter (max).
+ bool isSingleLine = (NS_STYLE_FLEX_WRAP_NOWRAP == stylePos->mFlexWrap);
if (axisTracker.IsRowOriented() &&
- NS_STYLE_FLEX_WRAP_NOWRAP == stylePos->mFlexWrap) {
- minISize += childMinISize;
- } else {
- minISize = std::max(minISize, childMinISize);
+ (isSingleLine || aType == nsLayoutUtils::PREF_ISIZE)) {
+ containerISize += childISize;
+ } else { // (col-oriented, or MIN_ISIZE for multi-line row flex container)
+ containerISize = std::max(containerISize, childISize);
}
}
}
+
+ return containerISize;
+}
+
+/* virtual */ nscoord
+nsFlexContainerFrame::GetMinISize(gfxContext* aRenderingContext)
+{
+ nscoord minISize = 0;
+ DISPLAY_MIN_WIDTH(this, minISize);
+
+ minISize = IntrinsicISize(aRenderingContext, nsLayoutUtils::MIN_ISIZE);
return minISize;
}
/* virtual */ nscoord
nsFlexContainerFrame::GetPrefISize(gfxContext* aRenderingContext)
{
nscoord prefISize = 0;
DISPLAY_PREF_WIDTH(this, prefISize);
- RenumberList();
-
- // XXXdholbert Optimization: We could cache our intrinsic widths like
- // nsBlockFrame does (and return it early from this function if it's set).
- // Whenever anything happens that might change it, set it to
- // NS_INTRINSIC_WIDTH_UNKNOWN (like nsBlockFrame::MarkIntrinsicISizesDirty
- // does)
- const FlexboxAxisTracker axisTracker(this, GetWritingMode());
-
- const bool useMozBoxCollapseBehavior =
- ShouldUseMozBoxCollapseBehavior(StyleDisplay());
-
- for (nsIFrame* childFrame : mFrames) {
- // If we're using legacy "visibility:collapse" behavior, then we don't
- // care about the sizes of any collapsed children.
- if (!useMozBoxCollapseBehavior ||
- (NS_STYLE_VISIBILITY_COLLAPSE !=
- childFrame->StyleVisibility()->mVisible)) {
- nscoord childPrefISize =
- nsLayoutUtils::IntrinsicForContainer(aRenderingContext, childFrame,
- nsLayoutUtils::PREF_ISIZE);
- if (axisTracker.IsRowOriented()) {
- prefISize += childPrefISize;
- } else {
- prefISize = std::max(prefISize, childPrefISize);
- }
- }
- }
+ prefISize = IntrinsicISize(aRenderingContext, nsLayoutUtils::PREF_ISIZE);
return prefISize;
}
--- a/layout/generic/nsFlexContainerFrame.h
+++ b/layout/generic/nsFlexContainerFrame.h
@@ -431,14 +431,20 @@ protected:
* reflow methods to interpret positions correctly).
*/
void ReflowPlaceholders(nsPresContext* aPresContext,
const ReflowInput& aReflowInput,
nsTArray<nsIFrame*>& aPlaceholders,
const mozilla::LogicalPoint& aContentBoxOrigin,
const nsSize& aContainerSize);
+ /**
+ * Helper for GetMinISize / GetPrefISize.
+ */
+ nscoord IntrinsicISize(gfxContext* aRenderingContext,
+ nsLayoutUtils::IntrinsicISizeType aType);
+
nscoord mBaselineFromLastReflow;
// Note: the last baseline is a distance from our border-box end edge.
nscoord mLastBaselineFromLastReflow;
};
#endif /* nsFlexContainerFrame_h___ */