commit 54d25f5169e652ac6fa46fe988b5749a1c60d8f0
parent 9cc829db5defd8fae72591734116023bbd6021de
Author: Jonathan Watt <jwatt@jwatt.org>
Date: Tue, 9 Dec 2025 20:34:24 +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:
3 files changed, 54 insertions(+), 41 deletions(-)
diff --git a/layout/generic/CSSAlignUtils.cpp b/layout/generic/CSSAlignUtils.cpp
@@ -9,9 +9,50 @@
#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,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(