commit 1f2deb0d232c0ad552035107b2f3eef198db2178
parent b1abbd349f0b67efffa2d7fbeaaaf590869f9bc2
Author: David Shin <dshin@mozilla.com>
Date: Thu, 18 Dec 2025 18:44:12 +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:
2 files changed, 17 insertions(+), 46 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
@@ -324,12 +298,11 @@ bool AnchorPosResolutionParams::AutoResolutionOverrideParams::OverriddenToZero(
// If `anchor-center` is used with a valid anchor, "auto inset
// 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;
+ if (aAxis == StylePhysicalAxis::Vertical) {
+ return mVAnchorCenter;
}
+ MOZ_ASSERT(aAxis == StylePhysicalAxis::Horizontal);
+ return mHAnchorCenter;
}
AnchorPosResolutionParams::AutoResolutionOverrideParams::
@@ -343,6 +316,7 @@ AnchorPosResolutionParams::AutoResolutionOverrideParams::
}
const auto* stylePos = aFrame->StylePosition();
+ const auto cbwm = parent->GetWritingMode();
auto checkAxis = [&](LogicalAxis aAxis) {
StyleAlignFlags alignment =
@@ -351,8 +325,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;