diff --git a/layout/generic/nsGridContainerFrame.cpp b/layout/generic/nsGridContainerFrame.cpp index c7ab0bd0e256..407c38a144d1 100644 --- a/layout/generic/nsGridContainerFrame.cpp +++ b/layout/generic/nsGridContainerFrame.cpp @@ -4032,6 +4032,16 @@ static void AlignSelf(const nsGridContainerFrame::GridItemInfo& aGridItem, aAlignSelf == StyleAlignFlags::LAST_BASELINE) { aAlignSelf = aGridItem.GetSelfBaseline(aAlignSelf, eLogicalAxisBlock, &baselineAdjust); + // Adjust the baseline alignment value if the baseline affects the opposite + // side of what AlignJustifySelf expects. + auto state = aGridItem.mState[eLogicalAxisBlock]; + if (aAlignSelf == StyleAlignFlags::LAST_BASELINE && + !GridItemInfo::BaselineAlignmentAffectsEndSide(state)) { + aAlignSelf = StyleAlignFlags::BASELINE; + } else if (aAlignSelf == StyleAlignFlags::BASELINE && + GridItemInfo::BaselineAlignmentAffectsEndSide(state)) { + aAlignSelf = StyleAlignFlags::LAST_BASELINE; + } } bool isOrthogonal = aCBWM.IsOrthogonalTo(childWM); @@ -4073,6 +4083,16 @@ static void JustifySelf(const nsGridContainerFrame::GridItemInfo& aGridItem, aJustifySelf == StyleAlignFlags::LAST_BASELINE) { aJustifySelf = aGridItem.GetSelfBaseline(aJustifySelf, eLogicalAxisInline, &baselineAdjust); + // Adjust the baseline alignment value if the baseline affects the opposite + // side of what AlignJustifySelf expects. + auto state = aGridItem.mState[eLogicalAxisInline]; + if (aJustifySelf == StyleAlignFlags::LAST_BASELINE && + !GridItemInfo::BaselineAlignmentAffectsEndSide(state)) { + aJustifySelf = StyleAlignFlags::BASELINE; + } else if (aJustifySelf == StyleAlignFlags::BASELINE && + GridItemInfo::BaselineAlignmentAffectsEndSide(state)) { + aJustifySelf = StyleAlignFlags::LAST_BASELINE; + } } bool isOrthogonal = aCBWM.IsOrthogonalTo(childWM); @@ -5980,12 +6000,6 @@ void nsGridContainerFrame::Tracks::InitializeItemBaselines( const WritingMode containerWM = aState.mWM; ComputedStyle* containerStyle = aState.mFrame->Style(); - // The physical side of the container's block start side. We use it to match - // against the physical block start side of the child to determine its - // baseline sharing group. - auto containerBlockStartSide = - containerWM.PhysicalSide(MakeLogicalSide(mAxis, eLogicalEdgeStart)); - for (GridItemInfo& gridItem : aGridItems) { if (gridItem.IsSubgrid(mAxis)) { // A subgrid itself is never baseline-aligned. @@ -6081,27 +6095,6 @@ void nsGridContainerFrame::Tracks::InitializeItemBaselines( } if (state & ItemState::eIsBaselineAligned) { - // The item is baseline aligned, so calculate the baseline sharing group. - // - BaselineSharingGroup baselineAlignment = - (state & ItemState::eFirstBaseline) ? BaselineSharingGroup::First - : BaselineSharingGroup::Last; - - BaselineSharingGroup baselineSharingGroup = [&]() { - { - auto childAxis = isOrthogonal ? GetOrthogonalAxis(mAxis) : mAxis; - auto childBlockStartSide = childWM.PhysicalSide( - MakeLogicalSide(childAxis, eLogicalEdgeStart)); - bool isFirstBaseline = (state & ItemState::eFirstBaseline) != 0; - const bool containerAndChildHasEqualBaselineSide = - containerBlockStartSide == childBlockStartSide; - - return isFirstBaseline == containerAndChildHasEqualBaselineSide - ? BaselineSharingGroup::First - : BaselineSharingGroup::Last; - } - }(); - // XXXmats if |child| is a descendant of a subgrid then the metrics // below needs to account for the accumulated MPB somehow... @@ -6129,13 +6122,16 @@ void nsGridContainerFrame::Tracks::InitializeItemBaselines( : margin.BStartEnd(containerWM)); Maybe baseline; + auto baselineSharingGroup = state & ItemState::eFirstBaseline + ? BaselineSharingGroup::First + : BaselineSharingGroup::Last; if (grid) { baseline.emplace((isOrthogonal == isInlineAxis) - ? grid->GetBBaseline(baselineAlignment) - : grid->GetIBaseline(baselineAlignment)); + ? grid->GetBBaseline(baselineSharingGroup) + : grid->GetIBaseline(baselineSharingGroup)); } else { baseline = child->GetNaturalBaselineBOffset( - childWM, baselineAlignment, BaselineExportContext::Other); + childWM, baselineSharingGroup, BaselineExportContext::Other); if (!baseline) { // If baseline alignment is specified on a grid item whose size in @@ -6160,7 +6156,7 @@ void nsGridContainerFrame::Tracks::InitializeItemBaselines( if (!isTrackAutoSize || !gridItem.IsBSizeDependentOnContainerSize(containerWM)) { baseline.emplace(Baseline::SynthesizeBOffsetFromBorderBox( - child, containerWM, baselineAlignment)); + child, containerWM, baselineSharingGroup)); } } } @@ -6170,19 +6166,15 @@ void nsGridContainerFrame::Tracks::InitializeItemBaselines( NS_ASSERTION(finalBaseline != NS_INTRINSIC_ISIZE_UNKNOWN, "about to use an unknown baseline"); - nscoord marginAdjust = 0; if (baselineSharingGroup == BaselineSharingGroup::First) { - marginAdjust = isInlineAxis ? margin.IStart(containerWM) - : margin.BStart(containerWM); - } else { - marginAdjust = isInlineAxis ? margin.IEnd(containerWM) - : margin.BEnd(containerWM); + finalBaseline += isInlineAxis ? margin.IStart(containerWM) + : margin.BStart(containerWM); - // This flag is used in ::AlignSelf(...) to check whether the item is - // last baseline aligned, but this flag should go away. - state |= GridItemInfo::eEndSideBaseline; + } else { + finalBaseline += isInlineAxis ? margin.IEnd(containerWM) + : margin.BEnd(containerWM); + state |= ItemState::eEndSideBaseline; } - finalBaseline += marginAdjust; auto& baselineItems = (baselineSharingGroup == BaselineSharingGroup::First) @@ -7604,12 +7596,7 @@ void nsGridContainerFrame::ReflowInFlowChild( // This happens when the subtree overflows its track. // XXX spec issue? it's unclear how to handle this. baselineAdjust = nscoord(0); - } else if (state & ItemState::eLastBaseline) { - // FIXME: We're not setting the ItemState::eEndSideBaseline flag any - // more as the new baseline sharing group calculation handles most of - // the cases we need. For non-masonry grids this flag was always set - // for LAST_BASELINE items, so we're just mimicking that behavior here. - // That said, masonry grids might not work 100% any more.. + } else if (GridItemInfo::BaselineAlignmentAffectsEndSide(state)) { baselineAdjust = -baselineAdjust; } if (baselineAdjust != nscoord(0)) { diff --git a/testing/web-platform/meta/css/css-grid/alignment/grid-align-baseline-001.html.ini b/testing/web-platform/meta/css/css-grid/alignment/grid-align-baseline-001.html.ini new file mode 100644 index 000000000000..25530dbc8482 --- /dev/null +++ b/testing/web-platform/meta/css/css-grid/alignment/grid-align-baseline-001.html.ini @@ -0,0 +1,15 @@ +[grid-align-baseline-001.html] + [#target > div 1] + expected: FAIL + + [#target > div 2] + expected: FAIL + + [#target > div 3] + expected: FAIL + + [#target > div 5] + expected: FAIL + + [#target > div 6] + expected: FAIL diff --git a/testing/web-platform/meta/css/css-grid/alignment/grid-align-baseline-002.html.ini b/testing/web-platform/meta/css/css-grid/alignment/grid-align-baseline-002.html.ini new file mode 100644 index 000000000000..045faf6ce044 --- /dev/null +++ b/testing/web-platform/meta/css/css-grid/alignment/grid-align-baseline-002.html.ini @@ -0,0 +1,15 @@ +[grid-align-baseline-002.html] + [#target > div 2] + expected: FAIL + + [#target > div 3] + expected: FAIL + + [#target > div 4] + expected: FAIL + + [#target > div 5] + expected: FAIL + + [#target > div 6] + expected: FAIL diff --git a/testing/web-platform/meta/css/css-grid/alignment/grid-item-content-baseline-001.html.ini b/testing/web-platform/meta/css/css-grid/alignment/grid-item-content-baseline-001.html.ini deleted file mode 100644 index ff4aee807872..000000000000 --- a/testing/web-platform/meta/css/css-grid/alignment/grid-item-content-baseline-001.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[grid-item-content-baseline-001.html] - expected: FAIL diff --git a/testing/web-platform/meta/css/css-grid/alignment/grid-item-content-baseline-002.html.ini b/testing/web-platform/meta/css/css-grid/alignment/grid-item-content-baseline-002.html.ini deleted file mode 100644 index 48e15df8cabe..000000000000 --- a/testing/web-platform/meta/css/css-grid/alignment/grid-item-content-baseline-002.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[grid-item-content-baseline-002.html] - expected: FAIL diff --git a/testing/web-platform/meta/css/css-grid/alignment/grid-item-content-baseline-003.html.ini b/testing/web-platform/meta/css/css-grid/alignment/grid-item-content-baseline-003.html.ini deleted file mode 100644 index c0aa3c9077b9..000000000000 --- a/testing/web-platform/meta/css/css-grid/alignment/grid-item-content-baseline-003.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[grid-item-content-baseline-003.html] - expected: FAIL diff --git a/testing/web-platform/meta/css/css-grid/alignment/grid-item-content-baseline-004.html.ini b/testing/web-platform/meta/css/css-grid/alignment/grid-item-content-baseline-004.html.ini deleted file mode 100644 index 185b98154ce2..000000000000 --- a/testing/web-platform/meta/css/css-grid/alignment/grid-item-content-baseline-004.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[grid-item-content-baseline-004.html] - expected: FAIL diff --git a/testing/web-platform/meta/css/css-grid/alignment/grid-justify-baseline-001.html.ini b/testing/web-platform/meta/css/css-grid/alignment/grid-justify-baseline-001.html.ini new file mode 100644 index 000000000000..374e6e7e566d --- /dev/null +++ b/testing/web-platform/meta/css/css-grid/alignment/grid-justify-baseline-001.html.ini @@ -0,0 +1,2 @@ +[grid-justify-baseline-001.html] + expected: FAIL diff --git a/testing/web-platform/meta/css/css-grid/alignment/grid-justify-baseline-002.html.ini b/testing/web-platform/meta/css/css-grid/alignment/grid-justify-baseline-002.html.ini new file mode 100644 index 000000000000..e2548b757e64 --- /dev/null +++ b/testing/web-platform/meta/css/css-grid/alignment/grid-justify-baseline-002.html.ini @@ -0,0 +1,17 @@ +[grid-justify-baseline-002.html] + expected: + if (os == "android") and fission: [OK, TIMEOUT] + [#target > div 1] + expected: FAIL + + [#target > div 2] + expected: FAIL + + [#target > div 3] + expected: FAIL + + [#target > div 5] + expected: FAIL + + [#target > div 6] + expected: FAIL diff --git a/testing/web-platform/meta/css/css-grid/masonry/tentative/baseline/masonry-grid-item-content-baseline-001.html.ini b/testing/web-platform/meta/css/css-grid/masonry/tentative/baseline/masonry-grid-item-content-baseline-001.html.ini deleted file mode 100644 index 7078073a7df7..000000000000 --- a/testing/web-platform/meta/css/css-grid/masonry/tentative/baseline/masonry-grid-item-content-baseline-001.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[masonry-grid-item-content-baseline-001.html] - expected: FAIL