tor-browser

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

commit a781248c8d5c84e85c125d888697fa04e1acff2e
parent 4660bf95a90a375e663b7923288d1af614db976e
Author: Jonathan Watt <jwatt@jwatt.org>
Date:   Wed, 10 Dec 2025 08:22:20 +0000

Bug 1991929 p2. Move MapCSSAlignment() to CSSAlignUtils. r=emilio,layout-reviewers,layout-anchor-positioning-reviewers

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

Diffstat:
Mlayout/generic/CSSAlignUtils.cpp | 42++++++++++++++++++++++++++++++++++++++++++
Mlayout/generic/CSSAlignUtils.h | 8++++++++
Mlayout/generic/nsContainerFrame.cpp | 46+++++-----------------------------------------
3 files changed, 55 insertions(+), 41 deletions(-)

diff --git a/layout/generic/CSSAlignUtils.cpp b/layout/generic/CSSAlignUtils.cpp @@ -9,9 +9,51 @@ #include "CSSAlignUtils.h" #include "ReflowInput.h" +#include "nsIFrame.h" +#include "nsIFrameInlines.h" namespace mozilla { +StyleAlignFlags CSSAlignUtils::UsedAlignmentForAbsPos(nsIFrame* aFrame, + StyleAlignFlags aFlags, + LogicalAxis aLogicalAxis, + WritingMode aCBWM) { + MOZ_ASSERT(aFrame->IsAbsolutelyPositioned()); + + // Extract and strip the flag bits + StyleAlignFlags alignmentFlags = aFlags & StyleAlignFlags::FLAG_BITS; + aFlags &= ~StyleAlignFlags::FLAG_BITS; + + if (aFlags == StyleAlignFlags::NORMAL) { + // "the 'normal' keyword behaves as 'start' on replaced + // absolutely-positioned boxes, and behaves as 'stretch' on all other + // absolutely-positioned boxes." + // https://drafts.csswg.org/css-align/#align-abspos + // https://drafts.csswg.org/css-align/#justify-abspos + aFlags = aFrame->IsReplaced() ? StyleAlignFlags::START + : StyleAlignFlags::STRETCH; + } else if (aFlags == StyleAlignFlags::FLEX_START) { + aFlags = StyleAlignFlags::START; + } else if (aFlags == StyleAlignFlags::FLEX_END) { + aFlags = StyleAlignFlags::END; + } else if (aFlags == StyleAlignFlags::LEFT || + aFlags == StyleAlignFlags::RIGHT) { + if (aLogicalAxis == LogicalAxis::Inline) { + const bool isLeft = (aFlags == StyleAlignFlags::LEFT); + aFlags = (isLeft == aCBWM.IsBidiLTR()) ? StyleAlignFlags::START + : StyleAlignFlags::END; + } else { + aFlags = StyleAlignFlags::START; + } + } else if (aFlags == StyleAlignFlags::BASELINE) { + aFlags = StyleAlignFlags::START; + } else if (aFlags == StyleAlignFlags::LAST_BASELINE) { + aFlags = StyleAlignFlags::END; + } + + return (aFlags | alignmentFlags); +} + static nscoord SpaceToFill(WritingMode aWM, const LogicalSize& aSize, nscoord aMargin, LogicalAxis aAxis, nscoord aCBSize) { diff --git a/layout/generic/CSSAlignUtils.h b/layout/generic/CSSAlignUtils.h @@ -20,6 +20,14 @@ struct StyleAlignFlags; class CSSAlignUtils { public: /** + * Map a raw StyleAlignFlags value to the used one. + */ + static StyleAlignFlags UsedAlignmentForAbsPos(nsIFrame* aFrame, + StyleAlignFlags aFlags, + LogicalAxis aLogicalAxis, + WritingMode aCBWM); + + /** * Flags to customize the behavior of AlignJustifySelf: */ enum class AlignJustifyFlag { diff --git a/layout/generic/nsContainerFrame.cpp b/layout/generic/nsContainerFrame.cpp @@ -11,6 +11,7 @@ #include <algorithm> #include "AnchorPositioningUtils.h" +#include "CSSAlignUtils.h" #include "mozilla/AbsoluteContainingBlock.h" #include "mozilla/AutoRestore.h" #include "mozilla/ComputedStyle.h" @@ -2457,45 +2458,6 @@ void nsContainerFrame::ConsiderChildOverflow(OverflowAreas& aOverflowAreas, } } -// Map a raw StyleAlignFlags value to the used one. -static StyleAlignFlags MapCSSAlignment(StyleAlignFlags aFlags, - const ReflowInput& aChildRI, - LogicalAxis aLogicalAxis, - WritingMode aWM) { - // Extract and strip the flag bits - StyleAlignFlags alignmentFlags = aFlags & StyleAlignFlags::FLAG_BITS; - aFlags &= ~StyleAlignFlags::FLAG_BITS; - - if (aFlags == StyleAlignFlags::NORMAL) { - // "the 'normal' keyword behaves as 'start' on replaced - // absolutely-positioned boxes, and behaves as 'stretch' on all other - // absolutely-positioned boxes." - // https://drafts.csswg.org/css-align/#align-abspos - // https://drafts.csswg.org/css-align/#justify-abspos - aFlags = aChildRI.mFrame->IsReplaced() ? StyleAlignFlags::START - : StyleAlignFlags::STRETCH; - } else if (aFlags == StyleAlignFlags::FLEX_START) { - aFlags = StyleAlignFlags::START; - } else if (aFlags == StyleAlignFlags::FLEX_END) { - aFlags = StyleAlignFlags::END; - } else if (aFlags == StyleAlignFlags::LEFT || - aFlags == StyleAlignFlags::RIGHT) { - if (aLogicalAxis == LogicalAxis::Inline) { - const bool isLeft = (aFlags == StyleAlignFlags::LEFT); - aFlags = (isLeft == aWM.IsBidiLTR()) ? StyleAlignFlags::START - : StyleAlignFlags::END; - } else { - aFlags = StyleAlignFlags::START; - } - } else if (aFlags == StyleAlignFlags::BASELINE) { - aFlags = StyleAlignFlags::START; - } else if (aFlags == StyleAlignFlags::LAST_BASELINE) { - aFlags = StyleAlignFlags::END; - } - - return (aFlags | alignmentFlags); -} - StyleAlignFlags nsContainerFrame::CSSAlignmentForAbsPosChild( const ReflowInput& aChildRI, LogicalAxis aLogicalAxis) const { MOZ_ASSERT(aChildRI.mFrame->IsAbsolutelyPositioned(), @@ -2504,7 +2466,8 @@ StyleAlignFlags nsContainerFrame::CSSAlignmentForAbsPosChild( // `auto` takes from parent's `align-items`. StyleAlignFlags alignment = aChildRI.mStylePosition->UsedSelfAlignment(aLogicalAxis, Style()); - return MapCSSAlignment(alignment, aChildRI, aLogicalAxis, GetWritingMode()); + return CSSAlignUtils::UsedAlignmentForAbsPos(aChildRI.mFrame, alignment, + aLogicalAxis, GetWritingMode()); } StyleAlignFlags @@ -2561,7 +2524,8 @@ nsContainerFrame::CSSAlignmentForAbsPosChildWithinContainingBlock( } } - return MapCSSAlignment(alignment, aChildRI, aLogicalAxis, GetWritingMode()); + return CSSAlignUtils::UsedAlignmentForAbsPos(aChildRI.mFrame, alignment, + aLogicalAxis, GetWritingMode()); } nsOverflowContinuationTracker::nsOverflowContinuationTracker(