tor-browser

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

commit ea8094db9f58088f1f811fd9afa1b8e0411701be
parent d6bd08f3a8a7fa257c7b29679a7af8e6f12034f4
Author: agoloman <agoloman@mozilla.com>
Date:   Tue,  9 Dec 2025 11:23:01 +0200

Revert "Bug 1991929 p3. Make shrink-wrapping work for anchor positioned elements. r=dshin,layout-reviewers,layout-anchor-positioning-reviewers,firefox-style-system-reviewers" for causing wr failures @popover-alignment-002.html.

This reverts commit 70c1ed629c2c203865009c16600e135caf16fc43.

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

This reverts commit ac0aa650de14ffd196c2c55fd255b1c86c86fc17.

Diffstat:
Mlayout/generic/CSSAlignUtils.cpp | 41-----------------------------------------
Mlayout/generic/CSSAlignUtils.h | 8--------
Mlayout/generic/ReflowInput.cpp | 22----------------------
Mlayout/generic/ReflowInput.h | 19+++++++++++++++++++
Mlayout/generic/nsContainerFrame.cpp | 57++++++++++++++++++++++++++++++++++++++++++++++-----------
Mlayout/generic/nsContainerFrame.h | 3+--
Mlayout/generic/nsIFrame.cpp | 11++++-------
Mlayout/style/nsStyleStruct.h | 9++++-----
8 files changed, 74 insertions(+), 96 deletions(-)

diff --git a/layout/generic/CSSAlignUtils.cpp b/layout/generic/CSSAlignUtils.cpp @@ -9,50 +9,9 @@ #include "CSSAlignUtils.h" #include "ReflowInput.h" -#include "nsIFrame.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,14 +20,6 @@ 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/ReflowInput.cpp b/layout/generic/ReflowInput.cpp @@ -40,28 +40,6 @@ using namespace mozilla::css; using namespace mozilla::dom; using namespace mozilla::layout; -AnchorPosResolutionParams AnchorPosResolutionParams::From( - const mozilla::SizeComputationInput* aSizingInput, - bool aIgnorePositionArea) { - const mozilla::StylePositionArea posArea = - aIgnorePositionArea - ? mozilla::StylePositionArea{} - : aSizingInput->mFrame->StylePosition()->mPositionArea; - bool inlineUsesAnchorCenter = false; - bool blockUsesAnchorCenter = false; - - ComputeAnchorCenterUsage(aSizingInput->mFrame, - aSizingInput->mAnchorPosResolutionCache, - inlineUsesAnchorCenter, blockUsesAnchorCenter); - - return {aSizingInput->mFrame, - aSizingInput->mFrame->StyleDisplay()->mPosition, - posArea, - aSizingInput->mAnchorPosResolutionCache, - inlineUsesAnchorCenter, - blockUsesAnchorCenter}; -} - static bool CheckNextInFlowParenthood(nsIFrame* aFrame, nsIFrame* aParent) { nsIFrame* frameNext = aFrame->GetNextInFlow(); nsIFrame* parentNext = aParent->GetNextInFlow(); diff --git a/layout/generic/ReflowInput.h b/layout/generic/ReflowInput.h @@ -979,4 +979,23 @@ void ComputeAnchorCenterUsage( mozilla::AnchorPosResolutionCache* aAnchorPosResolutionCache, bool& aInlineUsesAnchorCenter, bool& aBlockUsesAnchorCenter); +inline AnchorPosResolutionParams AnchorPosResolutionParams::From( + const mozilla::ReflowInput* aRI, bool aIgnorePositionArea) { + const mozilla::StylePositionArea posArea = + aIgnorePositionArea ? mozilla::StylePositionArea{} + : aRI->mStylePosition->mPositionArea; + bool inlineUsesAnchorCenter = false; + bool blockUsesAnchorCenter = false; + + ComputeAnchorCenterUsage(aRI->mFrame, aRI->mAnchorPosResolutionCache, + inlineUsesAnchorCenter, blockUsesAnchorCenter); + + return {aRI->mFrame, + aRI->mStyleDisplay->mPosition, + posArea, + aRI->mAnchorPosResolutionCache, + inlineUsesAnchorCenter, + blockUsesAnchorCenter}; +} + #endif // mozilla_ReflowInput_h diff --git a/layout/generic/nsContainerFrame.cpp b/layout/generic/nsContainerFrame.cpp @@ -11,7 +11,6 @@ #include <algorithm> #include "AnchorPositioningUtils.h" -#include "CSSAlignUtils.h" #include "mozilla/AbsoluteContainingBlock.h" #include "mozilla/AutoRestore.h" #include "mozilla/ComputedStyle.h" @@ -2458,6 +2457,45 @@ 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(), @@ -2466,36 +2504,34 @@ StyleAlignFlags nsContainerFrame::CSSAlignmentForAbsPosChild( // `auto` takes from parent's `align-items`. StyleAlignFlags alignment = aChildRI.mStylePosition->UsedSelfAlignment(aLogicalAxis, Style()); - return CSSAlignUtils::UsedAlignmentForAbsPos(aChildRI.mFrame, alignment, - aLogicalAxis, GetWritingMode()); + return MapCSSAlignment(alignment, aChildRI, aLogicalAxis, GetWritingMode()); } StyleAlignFlags nsContainerFrame::CSSAlignmentForAbsPosChildWithinContainingBlock( - const SizeComputationInput& aSizingInput, LogicalAxis aLogicalAxis, + const ReflowInput& aChildRI, LogicalAxis aLogicalAxis, const StylePositionArea& aResolvedPositionArea, const LogicalSize& aCBSize) const { - MOZ_ASSERT(aSizingInput.mFrame->IsAbsolutelyPositioned(), + MOZ_ASSERT(aChildRI.mFrame->IsAbsolutelyPositioned(), "This method should only be called for abspos children"); // When determining the position of absolutely-positioned boxes, // `auto` behaves as `normal`. StyleAlignFlags alignment = - aSizingInput.mFrame->StylePosition()->UsedSelfAlignment(aLogicalAxis, - nullptr); + 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 if (!aResolvedPositionArea.IsNone() && alignment == StyleAlignFlags::NORMAL) { const WritingMode cbWM = GetWritingMode(); const auto anchorResolutionParams = AnchorPosResolutionParams::From( - &aSizingInput, /* aIgnorePositionArea = */ true); + &aChildRI, /* aIgnorePositionArea = */ true); const auto anchorOffsetResolutionParams = AnchorPosOffsetResolutionParams::ExplicitCBFrameSize( anchorResolutionParams, &aCBSize); // Check if we have exactly one auto inset in this axis (IMCB situation) const auto singleAutoInset = - aSizingInput.mFrame->StylePosition()->GetSingleAutoInsetInAxis( + aChildRI.mStylePosition->GetSingleAutoInsetInAxis( aLogicalAxis, cbWM, anchorOffsetResolutionParams); // Check if exactly one inset in the axis is auto @@ -2522,8 +2558,7 @@ nsContainerFrame::CSSAlignmentForAbsPosChildWithinContainingBlock( } } - return CSSAlignUtils::UsedAlignmentForAbsPos(aSizingInput.mFrame, alignment, - aLogicalAxis, GetWritingMode()); + return MapCSSAlignment(alignment, aChildRI, aLogicalAxis, GetWritingMode()); } nsOverflowContinuationTracker::nsOverflowContinuationTracker( diff --git a/layout/generic/nsContainerFrame.h b/layout/generic/nsContainerFrame.h @@ -481,8 +481,7 @@ class nsContainerFrame : public nsSplittableFrame { * on its type (By overriding `CSSAlignmentForAbsPosChild`). */ mozilla::StyleAlignFlags CSSAlignmentForAbsPosChildWithinContainingBlock( - const SizeComputationInput& aSizingInput, - mozilla::LogicalAxis aLogicalAxis, + const ReflowInput& aChildRI, mozilla::LogicalAxis aLogicalAxis, const mozilla::StylePositionArea& aResolvedPositionArea, const mozilla::LogicalSize& aContainingBlockSize) const; diff --git a/layout/generic/nsIFrame.cpp b/layout/generic/nsIFrame.cpp @@ -7269,17 +7269,14 @@ LogicalSize nsIFrame::ComputeAbsolutePosAutoSize( }; // i.e. Absolute containing block - + const auto* parent = GetParent(); + 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 - nsContainerFrame* contFrame = static_cast<nsContainerFrame*>(this); - const StylePositionArea posArea = stylePos->mPositionArea; const auto inlineSelfAlign = - contFrame->CSSAlignmentForAbsPosChildWithinContainingBlock( - aSizingInput, LogicalAxis::Inline, posArea, aCBSize); + stylePos->UsedSelfAlignment(aWM, LogicalAxis::Inline, parentWM, nullptr); const auto blockSelfAlign = - contFrame->CSSAlignmentForAbsPosChildWithinContainingBlock( - aSizingInput, LogicalAxis::Block, posArea, aCBSize); + stylePos->UsedSelfAlignment(aWM, LogicalAxis::Block, parentWM, nullptr); const auto iShouldStretch = shouldStretch( inlineSelfAlign, this, iStartOffsetIsAuto, iEndOffsetIsAuto); const auto bShouldStretch = diff --git a/layout/style/nsStyleStruct.h b/layout/style/nsStyleStruct.h @@ -41,9 +41,9 @@ struct nsStyleVisibility; class nsComputedDOMStyle; namespace mozilla { class ComputedStyle; -struct AnchorPosResolutionCache; struct IntrinsicSize; -struct SizeComputationInput; +struct ReflowInput; +struct AnchorPosResolutionCache; } // namespace mozilla @@ -399,9 +399,8 @@ struct AnchorPosResolutionParams { static inline AnchorPosResolutionParams From( const nsIFrame* aFrame, mozilla::AnchorPosResolutionCache* aAnchorPosResolutionCache = nullptr); - static AnchorPosResolutionParams From( - const mozilla::SizeComputationInput* aSizingInput, - bool aIgnorePositionArea = false); + static inline AnchorPosResolutionParams From( + const mozilla::ReflowInput* aRI, bool aIgnorePositionArea = false); static inline AnchorPosResolutionParams From( const nsComputedDOMStyle* aComputedDOMStyle); };