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:
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);
};