Bug 1963485 Part 1 - Move selector/track size bits into a function that makes it clear which phase the selectors are for r=layout-grid-reviewers,tlouw

Differential Revision: https://phabricator.services.mozilla.com/D249695
This commit is contained in:
Emily McDonough
2025-05-20 22:32:34 +00:00
committed by emcdonough@mozilla.com
parent b54eecd390
commit 50e26ea3e7

View File

@@ -2421,6 +2421,28 @@ struct nsGridContainerFrame::Tracks {
MaxContentMaximums,
};
static TrackSize::StateBits SelectorForPhase(TrackSizingPhase aPhase,
SizingConstraint aConstraint) {
switch (aPhase) {
case TrackSizingPhase::IntrinsicMinimums:
return TrackSize::eIntrinsicMinSizing;
case TrackSizingPhase::ContentBasedMinimums:
return aConstraint == SizingConstraint::MinContent
? TrackSize::eIntrinsicMinSizing
: TrackSize::eMinOrMaxContentMinSizing;
case TrackSizingPhase::MaxContentMinimums:
return aConstraint == SizingConstraint::MaxContent
? (TrackSize::eMaxContentMinSizing |
TrackSize::eAutoMinSizing)
: TrackSize::eMaxContentMinSizing;
case TrackSizingPhase::IntrinsicMaximums:
return TrackSize::eIntrinsicMaxSizing;
case TrackSizingPhase::MaxContentMaximums:
return TrackSize::eAutoOrMaxContentMaxSizing;
}
MOZ_MAKE_COMPILER_ASSUME_IS_UNREACHABLE("Unexpected phase");
}
// Some data we collect on each item that spans more than one track for step 3
// and 4 of the Track Sizing Algorithm in ResolveIntrinsicSize below.
// https://drafts.csswg.org/css-grid-2/#algo-spanning-items
@@ -6834,18 +6856,6 @@ void nsGridContainerFrame::Tracks::ResolveIntrinsicSize(
// max span of items in `nonFlexSpanningItems` and `flexSpanningItems`.
uint32_t maxSpan = 0;
// Setup track selector for step 3.2:
const auto contentBasedMinSelector =
aConstraint == SizingConstraint::MinContent
? TrackSize::eIntrinsicMinSizing
: TrackSize::eMinOrMaxContentMinSizing;
// Setup track selector for step 3.3:
const auto maxContentMinSelector =
aConstraint == SizingConstraint::MaxContent
? (TrackSize::eMaxContentMinSizing | TrackSize::eAutoMinSizing)
: TrackSize::eMaxContentMinSizing;
const auto orthogonalAxis = GetOrthogonalAxis(mAxis);
const bool isMasonryInOtherAxis = aGridRI.mFrame->IsMasonry(orthogonalAxis);
@@ -6959,19 +6969,34 @@ void nsGridContainerFrame::Tracks::ResolveIntrinsicSize(
}
// Collect the various grid item size contributions we need.
// For 3.1
TrackSize::StateBits selector =
SelectorForPhase(TrackSizingPhase::IntrinsicMinimums, aConstraint);
nscoord minSize = 0;
if (state & TrackSize::eIntrinsicMinSizing) { // for 3.1
if (state & selector) {
minSize = MinContribution(gridItem, aGridRI, rc, wm, mAxis, &cache);
}
// For 3.2 and 3.5
selector =
SelectorForPhase(TrackSizingPhase::IntrinsicMaximums, aConstraint) |
SelectorForPhase(TrackSizingPhase::ContentBasedMinimums,
aConstraint);
nscoord minContent = 0;
if (state & (contentBasedMinSelector | // for 3.2
TrackSize::eIntrinsicMaxSizing)) { // for 3.5
if (state & selector) {
minContent =
MinContentContribution(gridItem, aGridRI, rc, wm, mAxis, &cache);
}
// For 3.3 and 3.6
selector =
SelectorForPhase(TrackSizingPhase::MaxContentMinimums,
aConstraint) |
SelectorForPhase(TrackSizingPhase::MaxContentMaximums, aConstraint);
nscoord maxContent = 0;
if (state & (maxContentMinSelector | // for 3.3
TrackSize::eAutoOrMaxContentMaxSizing)) { // for 3.6
if (state & selector) {
maxContent =
MaxContentContribution(gridItem, aGridRI, rc, wm, mAxis, &cache);
}
@@ -7040,33 +7065,36 @@ void nsGridContainerFrame::Tracks::ResolveIntrinsicSize(
MOZ_ASSERT(!(stateBitsForSpan & TrackSize::eFlexMaxSizing),
"Non-flex spanning items should not include any flex tracks");
bool updatedBase = false; // Did we update any mBase in step 3.1..3.3?
TrackSize::StateBits selector(TrackSize::eIntrinsicMinSizing);
TrackSizingPhase phase = TrackSizingPhase::IntrinsicMinimums;
TrackSize::StateBits selector = SelectorForPhase(phase, aConstraint);
if (stateBitsForSpan & selector) {
// Step 3.1 MinSize to intrinsic min-sizing.
updatedBase = GrowSizeForSpanningItems(
TrackSizingStep::NotFlex, TrackSizingPhase::IntrinsicMinimums,
spanGroupStart, spanGroupEnd, tracks, plan, itemPlan, selector,
aGridRI.mIsGridIntrinsicSizing, aFunctions);
TrackSizingStep::NotFlex, phase, spanGroupStart, spanGroupEnd,
tracks, plan, itemPlan, selector, aGridRI.mIsGridIntrinsicSizing,
aFunctions);
}
selector = contentBasedMinSelector;
phase = TrackSizingPhase::ContentBasedMinimums;
selector = SelectorForPhase(phase, aConstraint);
if (stateBitsForSpan & selector) {
// Step 3.2 MinContentContribution to min-/max-content (and 'auto' when
// sizing under a min-content constraint) min-sizing.
updatedBase |= GrowSizeForSpanningItems(
TrackSizingStep::NotFlex, TrackSizingPhase::ContentBasedMinimums,
spanGroupStart, spanGroupEnd, tracks, plan, itemPlan, selector,
aGridRI.mIsGridIntrinsicSizing, aFunctions);
TrackSizingStep::NotFlex, phase, spanGroupStart, spanGroupEnd,
tracks, plan, itemPlan, selector, aGridRI.mIsGridIntrinsicSizing,
aFunctions);
}
selector = maxContentMinSelector;
phase = TrackSizingPhase::MaxContentMinimums;
selector = SelectorForPhase(phase, aConstraint);
if (stateBitsForSpan & selector) {
// Step 3.3 MaxContentContribution to max-content (and 'auto' when
// sizing under a max-content constraint) min-sizing.
updatedBase |= GrowSizeForSpanningItems(
TrackSizingStep::NotFlex, TrackSizingPhase::MaxContentMinimums,
spanGroupStart, spanGroupEnd, tracks, plan, itemPlan, selector,
aGridRI.mIsGridIntrinsicSizing, aFunctions);
TrackSizingStep::NotFlex, phase, spanGroupStart, spanGroupEnd,
tracks, plan, itemPlan, selector, aGridRI.mIsGridIntrinsicSizing,
aFunctions);
}
if (updatedBase) {
@@ -7078,25 +7106,26 @@ void nsGridContainerFrame::Tracks::ResolveIntrinsicSize(
}
}
selector = TrackSize::eIntrinsicMaxSizing;
phase = TrackSizingPhase::IntrinsicMaximums;
selector = SelectorForPhase(phase, aConstraint);
bool willRunStep3_6 = false;
if (stateBitsForSpan & selector) {
const bool willRunStep3_6 =
willRunStep3_6 =
stateBitsForSpan & TrackSize::eAutoOrMaxContentMaxSizing;
// Step 3.5 MinContentContribution to intrinsic max-sizing.
GrowSizeForSpanningItems(
TrackSizingStep::NotFlex, TrackSizingPhase::IntrinsicMaximums,
spanGroupStart, spanGroupEnd, tracks, plan, itemPlan, selector,
aGridRI.mIsGridIntrinsicSizing, aFunctions, fitContentClamper,
willRunStep3_6);
if (willRunStep3_6) {
// Step 2.6 MaxContentContribution to max-content max-sizing.
selector = TrackSize::eAutoOrMaxContentMaxSizing;
GrowSizeForSpanningItems(
TrackSizingStep::NotFlex, TrackSizingPhase::MaxContentMaximums,
spanGroupStart, spanGroupEnd, tracks, plan, itemPlan, selector,
aGridRI.mIsGridIntrinsicSizing, aFunctions, fitContentClamper);
}
TrackSizingStep::NotFlex, phase, spanGroupStart, spanGroupEnd,
tracks, plan, itemPlan, selector, aGridRI.mIsGridIntrinsicSizing,
aFunctions, fitContentClamper, willRunStep3_6);
}
if (willRunStep3_6) {
// Step 2.6 MaxContentContribution to max-content max-sizing.
phase = TrackSizingPhase::MaxContentMaximums;
selector = SelectorForPhase(phase, aConstraint);
GrowSizeForSpanningItems(
TrackSizingStep::NotFlex, phase, spanGroupStart, spanGroupEnd,
tracks, plan, itemPlan, selector, aGridRI.mIsGridIntrinsicSizing,
aFunctions, fitContentClamper);
}
}
@@ -7110,33 +7139,36 @@ void nsGridContainerFrame::Tracks::ResolveIntrinsicSize(
stateBitsForSpan |= bits;
}
bool updatedBase = false; // Did we update any mBase in step 4.1..4.3?
TrackSize::StateBits selector(TrackSize::eIntrinsicMinSizing);
TrackSizingPhase phase = TrackSizingPhase::IntrinsicMinimums;
TrackSize::StateBits selector = SelectorForPhase(phase, aConstraint);
if (stateBitsForSpan & selector) {
// Step 4.1 MinSize to intrinsic min-sizing.
updatedBase = GrowSizeForSpanningItems(
TrackSizingStep::Flex, TrackSizingPhase::IntrinsicMinimums,
flexSpanningItems.begin(), flexSpanningItems.end(), tracks, plan,
itemPlan, selector, aGridRI.mIsGridIntrinsicSizing, aFunctions);
TrackSizingStep::Flex, phase, flexSpanningItems.begin(),
flexSpanningItems.end(), tracks, plan, itemPlan, selector,
aGridRI.mIsGridIntrinsicSizing, aFunctions);
}
selector = contentBasedMinSelector;
phase = TrackSizingPhase::ContentBasedMinimums;
selector = SelectorForPhase(phase, aConstraint);
if (stateBitsForSpan & selector) {
// Step 4.2 MinContentContribution to min-/max-content (and 'auto' when
// sizing under a min-content constraint) min-sizing.
updatedBase |= GrowSizeForSpanningItems(
TrackSizingStep::Flex, TrackSizingPhase::ContentBasedMinimums,
flexSpanningItems.begin(), flexSpanningItems.end(), tracks, plan,
itemPlan, selector, aGridRI.mIsGridIntrinsicSizing, aFunctions);
TrackSizingStep::Flex, phase, flexSpanningItems.begin(),
flexSpanningItems.end(), tracks, plan, itemPlan, selector,
aGridRI.mIsGridIntrinsicSizing, aFunctions);
}
selector = maxContentMinSelector;
phase = TrackSizingPhase::MaxContentMinimums;
selector = SelectorForPhase(phase, aConstraint);
if (stateBitsForSpan & selector) {
// Step 4.3 MaxContentContribution to max-content (and 'auto' when
// sizing under a max-content constraint) min-sizing.
updatedBase |= GrowSizeForSpanningItems(
TrackSizingStep::Flex, TrackSizingPhase::MaxContentMinimums,
flexSpanningItems.begin(), flexSpanningItems.end(), tracks, plan,
itemPlan, selector, aGridRI.mIsGridIntrinsicSizing, aFunctions);
TrackSizingStep::Flex, phase, flexSpanningItems.begin(),
flexSpanningItems.end(), tracks, plan, itemPlan, selector,
aGridRI.mIsGridIntrinsicSizing, aFunctions);
}
if (updatedBase) {