tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

commit a08fe7ba212e959f5056c0eb13c510a3a8ebf60c
parent 62ad52e72505d187d266a4f27b20616b19045459
Author: Ting-Yu Lin <tlin@mozilla.com>
Date:   Wed, 19 Nov 2025 05:08:18 +0000

Bug 2000488 - Use nsStylePosition::UsedSelfAlignment() to simplify code. r=layout-reviewers,jfkthame

Note: `justif-self` and `align-self` operates on the alignment container's axis.
See https://drafts.csswg.org/css-align-3/#justify-self-property and
https://drafts.csswg.org/css-align-3/#align-self-property

Differential Revision: https://phabricator.services.mozilla.com/D272825

Diffstat:
Mlayout/generic/WritingModes.h | 17++++++++++++++---
Mlayout/generic/nsContainerFrame.cpp | 22++++++++--------------
Mlayout/generic/nsGridContainerFrame.cpp | 11+++--------
Mlayout/generic/nsIFrame.cpp | 29+++++++++++++----------------
Mlayout/style/nsStyleStruct.h | 26+++++++++++++++++++++++---
5 files changed, 61 insertions(+), 44 deletions(-)

diff --git a/layout/generic/WritingModes.h b/layout/generic/WritingModes.h @@ -2329,9 +2329,20 @@ inline AnchorResolvedMargin nsStyleMargin::GetMargin( } inline mozilla::StyleAlignFlags nsStylePosition::UsedSelfAlignment( - mozilla::LogicalAxis aAxis, const mozilla::ComputedStyle* aParent) const { - return aAxis == mozilla::LogicalAxis::Block ? UsedAlignSelf(aParent)._0 - : UsedJustifySelf(aParent)._0; + LogicalAxis aAlignContainerAxis, + const ComputedStyle* aAlignContainerStyle) const { + return aAlignContainerAxis == LogicalAxis::Block + ? UsedAlignSelf(aAlignContainerStyle)._0 + : UsedJustifySelf(aAlignContainerStyle)._0; +} + +inline mozilla::StyleAlignFlags nsStylePosition::UsedSelfAlignment( + WritingMode aAlignSubjectWM, LogicalAxis aAlignSubjectAxis, + WritingMode aAlignContainerWM, + const ComputedStyle* aAlignContainerStyle) const { + const auto alignContainerAxis = + aAlignSubjectWM.ConvertAxisTo(aAlignSubjectAxis, aAlignContainerWM); + return UsedSelfAlignment(alignContainerAxis, aAlignContainerStyle); } inline mozilla::StyleContentDistribution nsStylePosition::UsedContentAlignment( diff --git a/layout/generic/nsContainerFrame.cpp b/layout/generic/nsContainerFrame.cpp @@ -2038,7 +2038,6 @@ LogicalSize nsContainerFrame::ComputeSizeWithIntrinsicDimensions( FillCB inlineFillCB = FillCB::No; // fill CB behavior in the inline axis FillCB blockFillCB = FillCB::No; // fill CB behavior in the block axis - const bool isOrthogonal = aWM.IsOrthogonalTo(parentFrame->GetWritingMode()); const LogicalSize fallbackIntrinsicSize(aWM, kFallbackIntrinsicSize); const Maybe<nscoord>& maybeIntrinsicISize = aIntrinsicSize.ISize(aWM); const bool hasIntrinsicISize = maybeIntrinsicISize.isSome(); @@ -2063,9 +2062,9 @@ LogicalSize nsContainerFrame::ComputeSizeWithIntrinsicDimensions( if (cbSize != NS_UNCONSTRAINEDSIZE) { if (!StyleMargin()->HasInlineAxisAuto( aWM, AnchorPosResolutionParams::From(this))) { - auto inlineAxisAlignment = - isOrthogonal ? stylePos->UsedAlignSelf(GetParent()->Style())._0 - : stylePos->UsedJustifySelf(GetParent()->Style())._0; + auto inlineAxisAlignment = stylePos->UsedSelfAlignment( + aWM, LogicalAxis::Inline, parentFrame->GetWritingMode(), + parentFrame->Style()); if (inlineAxisAlignment == StyleAlignFlags::STRETCH) { inlineFillCB = FillCB::Stretch; } @@ -2125,9 +2124,9 @@ LogicalSize nsContainerFrame::ComputeSizeWithIntrinsicDimensions( if (cbSize != NS_UNCONSTRAINEDSIZE) { if (!StyleMargin()->HasBlockAxisAuto( aWM, AnchorPosResolutionParams::From(this))) { - auto blockAxisAlignment = - !isOrthogonal ? stylePos->UsedAlignSelf(GetParent()->Style())._0 - : stylePos->UsedJustifySelf(GetParent()->Style())._0; + auto blockAxisAlignment = stylePos->UsedSelfAlignment( + aWM, LogicalAxis::Block, parentFrame->GetWritingMode(), + parentFrame->Style()); if (blockAxisAlignment == StyleAlignFlags::STRETCH) { blockFillCB = FillCB::Stretch; } @@ -2491,10 +2490,7 @@ StyleAlignFlags nsContainerFrame::CSSAlignmentForAbsPosChild( // For computing the static position of an absolutely positioned box, // `auto` takes from parent's `align-items`. StyleAlignFlags alignment = - (aLogicalAxis == LogicalAxis::Inline) - ? aChildRI.mStylePosition->UsedJustifySelf(Style())._0 - : aChildRI.mStylePosition->UsedAlignSelf(Style())._0; - + aChildRI.mStylePosition->UsedSelfAlignment(aLogicalAxis, Style()); return MapCSSAlignment(alignment, aChildRI, aLogicalAxis, GetWritingMode()); } @@ -2508,9 +2504,7 @@ nsContainerFrame::CSSAlignmentForAbsPosChildWithinContainingBlock( // When determining the position of absolutely-positioned boxes, // `auto` behaves as `normal`. StyleAlignFlags alignment = - (aLogicalAxis == LogicalAxis::Inline) - ? aChildRI.mStylePosition->UsedJustifySelf(nullptr)._0 - : aChildRI.mStylePosition->UsedAlignSelf(nullptr)._0; + aChildRI.mStylePosition->UsedSelfAlignment(aLogicalAxis, nullptr); // Check if position-area is set - if so, it determines the default alignment // https://drafts.csswg.org/css-anchor-position/#position-area-alignment diff --git a/layout/generic/nsGridContainerFrame.cpp b/layout/generic/nsGridContainerFrame.cpp @@ -6499,9 +6499,7 @@ void nsGridContainerFrame::Tracks::InitializeItemBaselines( // [align|justify]-self:[last ]baseline. auto selfAlignment = - isInlineAxis - ? child->StylePosition()->UsedJustifySelf(containerStyle)._0 - : child->StylePosition()->UsedAlignSelf(containerStyle)._0; + child->StylePosition()->UsedSelfAlignment(mAxis, containerStyle); selfAlignment &= ~StyleAlignFlags::FLAG_BITS; if (selfAlignment == StyleAlignFlags::BASELINE) { state |= ItemState::eFirstBaseline | ItemState::eSelfBaseline; @@ -10638,7 +10636,6 @@ bool nsGridContainerFrame::GridItemShouldStretch(const nsIFrame* aChild, } const auto cbwm = GetWritingMode(); - const bool isOrthogonal = wm.IsOrthogonalTo(cbwm); if (IsMasonry(wm, aAxis)) { // The child is in the container's masonry-axis. // AlignJustifyTracksInMasonryAxis will stretch it, so we don't report that @@ -10646,10 +10643,8 @@ bool nsGridContainerFrame::GridItemShouldStretch(const nsIFrame* aChild, return false; } - const auto* pos = aChild->StylePosition(); - const auto alignment = (aAxis == LogicalAxis::Inline) == !isOrthogonal - ? pos->UsedJustifySelf(Style())._0 - : pos->UsedAlignSelf(Style())._0; + const auto alignment = + aChild->StylePosition()->UsedSelfAlignment(wm, aAxis, cbwm, Style()); // An item with 'normal' alignment that is a replaced frame should use its // natural size, and not fill the grid area. // https://drafts.csswg.org/css-grid-2/#grid-item-sizing diff --git a/layout/generic/nsIFrame.cpp b/layout/generic/nsIFrame.cpp @@ -6650,7 +6650,6 @@ nsIFrame::SizeComputationResult nsIFrame::ComputeSize( : LogicalAxis::Block); } - const bool isOrthogonal = aWM.IsOrthogonalTo(alignCB->GetWritingMode()); const bool isAutoISize = styleISize->IsAuto(); const bool isAutoBSize = nsLayoutUtils::IsAutoBSize(*styleBSize, aCBSize.BSize(aWM)); @@ -6683,9 +6682,9 @@ nsIFrame::SizeComputationResult nsIFrame::ComputeSize( if (!aFlags.contains(ComputeSizeFlag::ShrinkWrap) && !StyleMargin()->HasInlineAxisAuto(aWM, anchorResolutionParams) && !alignCB->IsMasonry(aWM, LogicalAxis::Inline)) { - auto inlineAxisAlignment = - isOrthogonal ? StylePosition()->UsedAlignSelf(alignCB->Style())._0 - : StylePosition()->UsedJustifySelf(alignCB->Style())._0; + auto inlineAxisAlignment = stylePos->UsedSelfAlignment( + aWM, LogicalAxis::Inline, alignCB->GetWritingMode(), + alignCB->Style()); isStretchAligned = inlineAxisAlignment == StyleAlignFlags::STRETCH || (inlineAxisAlignment == StyleAlignFlags::NORMAL && !mayUseAspectRatio); @@ -6891,9 +6890,9 @@ nsIFrame::SizeComputationResult nsIFrame::ComputeSize( bool mayUseAspectRatio = aspectRatio && result.ISize(aWM) != NS_UNCONSTRAINEDSIZE; if (!StyleMargin()->HasBlockAxisAuto(aWM, anchorResolutionParams)) { - auto blockAxisAlignment = - isOrthogonal ? StylePosition()->UsedJustifySelf(alignCB->Style())._0 - : StylePosition()->UsedAlignSelf(alignCB->Style())._0; + auto blockAxisAlignment = stylePos->UsedSelfAlignment( + aWM, LogicalAxis::Block, alignCB->GetWritingMode(), + alignCB->Style()); isStretchAligned = blockAxisAlignment == StyleAlignFlags::STRETCH || (blockAxisAlignment == StyleAlignFlags::NORMAL && !mayUseAspectRatio); @@ -7171,16 +7170,14 @@ LogicalSize nsIFrame::ComputeAbsolutePosAutoSize( const auto parentWM = parent->GetWritingMode(); // Self alignment properties translate `auto` to normal for this purpose. // https://drafts.csswg.org/css-align-3/#valdef-justify-self-auto - const auto inlineAlignSelf = parentWM.IsOrthogonalTo(aWM) - ? stylePos->UsedAlignSelf(nullptr) - : stylePos->UsedJustifySelf(nullptr); - const auto blockAlignSelf = parentWM.IsOrthogonalTo(aWM) - ? stylePos->UsedJustifySelf(nullptr) - : stylePos->UsedAlignSelf(nullptr); + const auto inlineSelfAlign = + stylePos->UsedSelfAlignment(aWM, LogicalAxis::Inline, parentWM, nullptr); + const auto blockSelfAlign = + stylePos->UsedSelfAlignment(aWM, LogicalAxis::Block, parentWM, nullptr); const auto iShouldStretch = shouldStretch( - inlineAlignSelf._0, this, iStartOffsetIsAuto, iEndOffsetIsAuto); - const auto bShouldStretch = shouldStretch( - blockAlignSelf._0, this, bStartOffsetIsAuto, bEndOffsetIsAuto); + inlineSelfAlign, this, iStartOffsetIsAuto, iEndOffsetIsAuto); + const auto bShouldStretch = + shouldStretch(blockSelfAlign, this, bStartOffsetIsAuto, bEndOffsetIsAuto); const auto iSizeIsAuto = styleISize->IsAuto(); // Note(dshin, bug 1789477): `auto` in the context of abs-element uses // stretch-fit sizing, given specific alignment conditions [1]. Effectively, diff --git a/layout/style/nsStyleStruct.h b/layout/style/nsStyleStruct.h @@ -950,12 +950,32 @@ struct MOZ_NEEDS_MEMMOVABLE_MEMBERS nsStylePosition { StyleSelfAlignment UsedJustifySelf(const ComputedStyle*) const; /** - * Return the used value for 'justify/align-self' in aAxis given our parent - * ComputedStyle aParent (or null for the root). + * Return the used value for 'justify/align-self' for the axis in the + * alignment container's writing mode. + * + * @param aAlignContainerStyle the computed style of the alignment container, + * or null for the root. + * + * (defined in WritingModes.h since we need the full WritingMode type) + */ + inline mozilla::StyleAlignFlags UsedSelfAlignment( + LogicalAxis aAlignContainerAxis, + const mozilla::ComputedStyle* aAlignContainerStyle) const; + + /** + * Return the used value for 'justify/align-self' for the axis in the + * alignment subject's writing mode. + * + * @param aAlignSubjectAxis the axis in aAlignSubjectWM. + * @param aAlignContainerStyle the computed style of the alignment container, + * or null for the root. + * * (defined in WritingModes.h since we need the full WritingMode type) */ inline mozilla::StyleAlignFlags UsedSelfAlignment( - LogicalAxis aAxis, const mozilla::ComputedStyle* aParent) const; + WritingMode aAlignSubjectWM, LogicalAxis aAlignSubjectAxis, + WritingMode aAlignContainerWM, + const ComputedStyle* aAlignContainerStyle) const; /** * Return the used value for 'justify/align-content' in aAxis.