@@ -2118,10 +2118,7 @@ struct nsGridContainerFrame::Tracks {
21182118 uint32_t mBaselineTrack ;
21192119 nscoord mBaseline ;
21202120 nscoord mSize ;
2121- // True if the baseline is not parallel to the alignment context.
2122- bool mIsOrthogonal ;
21232121 GridItemInfo* mGridItem ;
2124-
21252122 static bool IsBaselineTrackLessThan (const ItemBaselineData& a,
21262123 const ItemBaselineData& b) {
21272124 return a.mBaselineTrack < b.mBaselineTrack ;
@@ -5921,37 +5918,22 @@ void nsGridContainerFrame::Tracks::CalculateItemBaselines(
59215918 nscoord maxDescent = 0 ;
59225919 uint32_t currentTrack = kAutoLine ; // guaranteed to not match any item
59235920 uint32_t trackStartIndex = 0 ;
5924- bool trackHasParallelItems = false ;
59255921 for (uint32_t i = 0 , len = aBaselineItems.Length (); true ; ++i) {
59265922 // Find the maximum baseline and descent in the current track.
59275923 if (i != len) {
59285924 const ItemBaselineData& item = aBaselineItems[i];
59295925 if (currentTrack == item.mBaselineTrack ) {
59305926 maxBaseline = std::max (maxBaseline, item.mBaseline );
59315927 maxDescent = std::max (maxDescent, item.mSize - item.mBaseline );
5932- trackHasParallelItems |= !item.mIsOrthogonal ;
59335928 continue ;
59345929 }
59355930 }
5936- // Baseline alignment does not take effect if all items in the alignment
5937- // context is orthogonal to the baseline axis.
5938- if (trackHasParallelItems) {
5939- // Iterate the current track again and update the baseline offsets making
5940- // all items baseline-aligned within this group in this track.
5941- for (uint32_t j = trackStartIndex; j < i; ++j) {
5942- const ItemBaselineData& item = aBaselineItems[j];
5943- item.mGridItem ->mBaselineOffset [mAxis ] = maxBaseline - item.mBaseline ;
5944- MOZ_ASSERT (item.mGridItem ->mBaselineOffset [mAxis ] >= 0 );
5945- }
5946- } else {
5947- for (uint32_t j = trackStartIndex; j < i; ++j) {
5948- const ItemBaselineData& item = aBaselineItems[j];
5949- item.mGridItem ->mBaselineOffset [mAxis ] = 0 ;
5950- // The item is still baseline aligned, but we remove the type so that we
5951- // can still get fallback alignment.
5952- item.mGridItem ->mState [mAxis ] &=
5953- ~(ItemState::eSelfBaseline | ItemState::eContentBaseline);
5954- }
5931+ // Iterate the current track again and update the baseline offsets making
5932+ // all items baseline-aligned within this group in this track.
5933+ for (uint32_t j = trackStartIndex; j < i; ++j) {
5934+ const ItemBaselineData& item = aBaselineItems[j];
5935+ item.mGridItem ->mBaselineOffset [mAxis ] = maxBaseline - item.mBaseline ;
5936+ MOZ_ASSERT (item.mGridItem ->mBaselineOffset [mAxis ] >= 0 );
59555937 }
59565938 if (i != 0 ) {
59575939 // Store the size of this baseline-aligned subtree.
@@ -5972,7 +5954,6 @@ void nsGridContainerFrame::Tracks::CalculateItemBaselines(
59725954 // Initialize data for the next track with baseline-aligned items.
59735955 const ItemBaselineData& item = aBaselineItems[i];
59745956 currentTrack = item.mBaselineTrack ;
5975- trackHasParallelItems = !item.mIsOrthogonal ;
59765957 trackStartIndex = i;
59775958 maxBaseline = item.mBaseline ;
59785959 maxDescent = item.mSize - item.mBaseline ;
@@ -5987,7 +5968,6 @@ void nsGridContainerFrame::Tracks::InitializeItemBaselines(
59875968 return ;
59885969 }
59895970
5990- const bool isInlineAxis = mAxis == LogicalAxis::Inline; // i.e. columns
59915971 nsTArray<ItemBaselineData> firstBaselineItems;
59925972 nsTArray<ItemBaselineData> lastBaselineItems;
59935973 const WritingMode containerWM = aState.mWM ;
@@ -5998,6 +5978,7 @@ void nsGridContainerFrame::Tracks::InitializeItemBaselines(
59985978 // baseline sharing group.
59995979 auto containerBlockStartSide =
60005980 containerWM.PhysicalSide (MakeLogicalSide (mAxis , LogicalEdge::Start));
5981+
60015982 for (GridItemInfo& gridItem : aGridItems) {
60025983 if (gridItem.IsSubgrid (mAxis )) {
60035984 // A subgrid itself is never baseline-aligned.
@@ -6010,30 +5991,36 @@ void nsGridContainerFrame::Tracks::InitializeItemBaselines(
60105991 const auto childWM = child->GetWritingMode ();
60115992
60125993 const bool isOrthogonal = containerWM.IsOrthogonalTo (childWM);
5994+ const bool isInlineAxis = mAxis == LogicalAxis::Inline; // i.e. columns
5995+
5996+ // XXX update the line below to include orthogonal grid/table boxes
5997+ // XXX since they have baselines in both dimensions. And flexbox with
5998+ // XXX reversed main/cross axis?
60135999 const bool itemHasBaselineParallelToTrack = isInlineAxis == isOrthogonal;
6000+ if (itemHasBaselineParallelToTrack) {
6001+ // [align|justify]-self:[last ]baseline.
6002+ auto selfAlignment =
6003+ isOrthogonal
6004+ ? child->StylePosition ()->UsedJustifySelf (containerStyle)._0
6005+ : child->StylePosition ()->UsedAlignSelf (containerStyle)._0 ;
6006+ selfAlignment &= ~StyleAlignFlags::FLAG_BITS;
6007+ if (selfAlignment == StyleAlignFlags::BASELINE) {
6008+ state |= ItemState::eFirstBaseline | ItemState::eSelfBaseline;
6009+ const GridArea& area = gridItem.mArea ;
6010+ baselineTrack = isInlineAxis ? area.mCols .mStart : area.mRows .mStart ;
6011+ } else if (selfAlignment == StyleAlignFlags::LAST_BASELINE) {
6012+ state |= ItemState::eLastBaseline | ItemState::eSelfBaseline;
6013+ const GridArea& area = gridItem.mArea ;
6014+ baselineTrack = (isInlineAxis ? area.mCols .mEnd : area.mRows .mEnd ) - 1 ;
6015+ }
60146016
6015- // [align|justify]-self:[last ]baseline.
6016- auto selfAlignment =
6017- isInlineAxis
6018- ? child->StylePosition ()->UsedJustifySelf (containerStyle)._0
6019- : child->StylePosition ()->UsedAlignSelf (containerStyle)._0 ;
6020- selfAlignment &= ~StyleAlignFlags::FLAG_BITS;
6021- if (selfAlignment == StyleAlignFlags::BASELINE) {
6022- state |= ItemState::eFirstBaseline | ItemState::eSelfBaseline;
6023- const GridArea& area = gridItem.mArea ;
6024- baselineTrack = isInlineAxis ? area.mCols .mStart : area.mRows .mStart ;
6025- } else if (selfAlignment == StyleAlignFlags::LAST_BASELINE) {
6026- state |= ItemState::eLastBaseline | ItemState::eSelfBaseline;
6027- const GridArea& area = gridItem.mArea ;
6028- baselineTrack = (isInlineAxis ? area.mCols .mEnd : area.mRows .mEnd ) - 1 ;
6029- }
6030-
6031- // https://drafts.csswg.org/css-align-3/#baseline-align-content
6032- // Baseline content-alignment can only apply if the align-content axis is
6033- // parallel with the box’s block axis; otherwise the fallback alignment is
6034- // used.
6035- if (!isInlineAxis) {
60366017 // [align|justify]-content:[last ]baseline.
6018+ // https://drafts.csswg.org/css-align-3/#baseline-align-content
6019+ // "[...] and its computed 'align-self' or 'justify-self' (whichever
6020+ // affects its block axis) is 'stretch' or 'self-start' ('self-end').
6021+ // For this purpose, the 'start', 'end', 'flex-start', and 'flex-end'
6022+ // values of 'align-self' are treated as either 'self-start' or
6023+ // 'self-end', whichever they end up equivalent to.
60376024 auto alignContent = child->StylePosition ()->mAlignContent .primary ;
60386025 alignContent &= ~StyleAlignFlags::FLAG_BITS;
60396026 if (alignContent == StyleAlignFlags::BASELINE ||
@@ -6140,10 +6127,8 @@ void nsGridContainerFrame::Tracks::InitializeItemBaselines(
61406127 ? grid->GetBBaseline (baselineAlignment)
61416128 : grid->GetIBaseline (baselineAlignment));
61426129 } else {
6143- if (itemHasBaselineParallelToTrack) {
6144- baseline = child->GetNaturalBaselineBOffset (
6145- childWM, baselineAlignment, BaselineExportContext::Other);
6146- }
6130+ baseline = child->GetNaturalBaselineBOffset (
6131+ childWM, baselineAlignment, BaselineExportContext::Other);
61476132
61486133 if (!baseline) {
61496134 // If baseline alignment is specified on a grid item whose size in
@@ -6196,9 +6181,8 @@ void nsGridContainerFrame::Tracks::InitializeItemBaselines(
61966181 (baselineSharingGroup == BaselineSharingGroup::First)
61976182 ? firstBaselineItems
61986183 : lastBaselineItems;
6199- baselineItems.AppendElement (
6200- ItemBaselineData{baselineTrack, finalBaseline, alignSize,
6201- !itemHasBaselineParallelToTrack, &gridItem});
6184+ baselineItems.AppendElement (ItemBaselineData{
6185+ baselineTrack, finalBaseline, alignSize, &gridItem});
62026186 } else {
62036187 state &= ~ItemState::eAllBaselineBits;
62046188 }
@@ -6341,9 +6325,8 @@ void nsGridContainerFrame::Tracks::InitializeItemBaselinesInMasonryAxis(
63416325 baseline;
63426326 }
63436327 alignSize = frameSize;
6344- aFirstBaselineItems.AppendElement (
6345- ItemBaselineData ({baselineTrack, baseline, alignSize,
6346- /* isOrthogonal */ false , &gridItem}));
6328+ aFirstBaselineItems.AppendElement (ItemBaselineData (
6329+ {baselineTrack, baseline, alignSize, &gridItem}));
63476330 } else {
63486331 state &= ~ItemState::eAllBaselineBits;
63496332 }
@@ -6393,8 +6376,7 @@ void nsGridContainerFrame::Tracks::InitializeItemBaselinesInMasonryAxis(
63936376 auto alignSize =
63946377 frameSize + (isInlineAxis ? m.IStartEnd (wm) : m.BStartEnd (wm));
63956378 aLastBaselineItems.AppendElement (
6396- ItemBaselineData ({baselineTrack, descent, alignSize,
6397- /* isOrthogonal */ false , &gridItem}));
6379+ ItemBaselineData ({baselineTrack, descent, alignSize, &gridItem}));
63986380 } else {
63996381 state &= ~ItemState::eAllBaselineBits;
64006382 }
0 commit comments