tor-browser

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

commit 56907edbced39dadadc4779d62eb9dee4bedb755
parent 3d67a1059f6f1b8b698a45fcea4f513bc4917b40
Author: David Shin <dshin@mozilla.com>
Date:   Thu, 18 Dec 2025 15:14:16 +0000

Bug 2006402: Use physical axes for flagging anchor-center use. r=layout-anchor-positioning-reviewers,firefox-style-system-reviewers,emilio

... Everything is in physical axes at resolution time, so front-load the
mapping from logical to physical when the resolution params are set up.

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

Diffstat:
Mlayout/style/nsStyleStruct.cpp | 43++++++++++---------------------------------
Mlayout/style/nsStyleStruct.h | 19+++++++------------
2 files changed, 17 insertions(+), 45 deletions(-)

diff --git a/layout/style/nsStyleStruct.cpp b/layout/style/nsStyleStruct.cpp @@ -288,33 +288,7 @@ static StyleRect<T> StyleRectWithAllSides(const T& aSide) { } bool AnchorPosResolutionParams::AutoResolutionOverrideParams::OverriddenToZero( - StylePhysicalAxis aAxis, const nsIFrame* aFrame) const { - if (!aFrame || !aFrame->HasAnyStateBits(NS_FRAME_OUT_OF_FLOW)) { - return false; - } - const auto* cb = aFrame->GetParent(); - const auto cbwm = cb->GetWritingMode(); - const auto logicalAxis = [&]() { - if (cbwm.IsVertical()) { - return aAxis == StylePhysicalAxis::Vertical ? LogicalAxis::Inline - : LogicalAxis::Block; - } - return aAxis == StylePhysicalAxis::Horizontal ? LogicalAxis::Inline - : LogicalAxis::Block; - }(); - return OverriddenToZero(logicalAxis); -} - -bool AnchorPosResolutionParams::AutoResolutionOverrideParams::OverriddenToZero( - Side aSide, const nsIFrame* aFrame) const { - return OverriddenToZero(aSide == Side::eSideBottom || aSide == Side::eSideTop - ? StylePhysicalAxis::Vertical - : StylePhysicalAxis::Horizontal, - aFrame); -} - -bool AnchorPosResolutionParams::AutoResolutionOverrideParams::OverriddenToZero( - LogicalAxis aAxis) const { + StylePhysicalAxis aAxis) const { if (mPositionAreaInUse) { // If `position-area` is used "Any auto inset properties resolve to 0": // https://drafts.csswg.org/css-anchor-position-1/#valdef-position-area-position-area @@ -325,10 +299,10 @@ bool AnchorPosResolutionParams::AutoResolutionOverrideParams::OverriddenToZero( // properties resolve to 0" on that axis: // https://drafts.csswg.org/css-anchor-position-1/#anchor-center switch (aAxis) { - case LogicalAxis::Block: - return mBAnchorCenter; - case LogicalAxis::Inline: - return mIAnchorCenter; + case StylePhysicalAxis::Vertical: + return mVAnchorCenter; + case StylePhysicalAxis::Horizontal: + return mHAnchorCenter; } } @@ -343,6 +317,7 @@ AnchorPosResolutionParams::AutoResolutionOverrideParams:: } const auto* stylePos = aFrame->StylePosition(); + const auto cbwm = parent->GetWritingMode(); auto checkAxis = [&](LogicalAxis aAxis) { StyleAlignFlags alignment = @@ -351,8 +326,10 @@ AnchorPosResolutionParams::AutoResolutionOverrideParams:: StyleAlignFlags::ANCHOR_CENTER; }; - mIAnchorCenter = checkAxis(LogicalAxis::Inline); - mBAnchorCenter = checkAxis(LogicalAxis::Block); + const auto horizontalLogicalAxis = + cbwm.IsVertical() ? LogicalAxis::Block : LogicalAxis::Inline; + mHAnchorCenter = checkAxis(horizontalLogicalAxis); + mVAnchorCenter = checkAxis(GetOrthogonalAxis(horizontalLogicalAxis)); mPositionAreaInUse = !stylePos->mPositionArea.IsNone(); } diff --git a/layout/style/nsStyleStruct.h b/layout/style/nsStyleStruct.h @@ -379,11 +379,10 @@ using AnchorResolvedMargin = // Base set of parameters required to resolve a reference to an anchor. struct AnchorPosResolutionParams { struct AutoResolutionOverrideParams { - // TODO(dshin): Probably just make it physical - // Whether anchor-center is being used on the inline axis. - bool mIAnchorCenter = false; - // Whether anchor-center is being used on the block axis. - bool mBAnchorCenter = false; + // Whether anchor-center is being used on the horizontal axis. + bool mHAnchorCenter = false; + // Whether anchor-center is being used on the vertical axis. + bool mVAnchorCenter = false; // Whether position-area is being used. bool mPositionAreaInUse = false; @@ -392,10 +391,7 @@ struct AnchorPosResolutionParams { const nsIFrame* aFrame, const mozilla::AnchorPosResolutionCache* aCache); - bool OverriddenToZero(mozilla::StylePhysicalAxis aAxis, - const nsIFrame* aFrame) const; - bool OverriddenToZero(mozilla::Side aSide, const nsIFrame* aFrame) const; - bool OverriddenToZero(mozilla::LogicalAxis aAxis) const; + bool OverriddenToZero(mozilla::StylePhysicalAxis aAxis) const; }; // Frame of the anchor positioned element. // If nullptr, skips anchor lookup and returns invalid, resolving fallbacks. @@ -437,8 +433,7 @@ struct AnchorResolvedMarginHelper { return AnchorResolvedMargin::NonOwning(&aValue); }(); if (resolved->IsAuto() && - aParams.mAutoResolutionOverrideParams.OverriddenToZero( - aAxis, aParams.mFrame)) { + aParams.mAutoResolutionOverrideParams.OverriddenToZero(aAxis)) { return Zero(); } return resolved; @@ -814,7 +809,7 @@ struct AnchorResolvedInsetHelper { }(); if (resolved->IsAuto() && aParams.mBaseParams.mAutoResolutionOverrideParams.OverriddenToZero( - aSide, aParams.mBaseParams.mFrame)) { + mozilla::ToStylePhysicalAxis(aSide))) { return AnchorResolvedInset::NonOwning(&ZeroValue()); } return resolved;