@@ -506,7 +506,8 @@ static nscoord OffsetToAlignedStaticPos(
506506 const ReflowInput& aKidReflowInput, const LogicalSize& aKidSizeInAbsPosCBWM,
507507 const LogicalSize& aAbsPosCBSize,
508508 const nsContainerFrame* aPlaceholderContainer, WritingMode aAbsPosCBWM,
509- LogicalAxis aAbsPosCBAxis, Maybe<NonAutoAlignParams> aNonAutoAlignParams) {
509+ LogicalAxis aAbsPosCBAxis, Maybe<NonAutoAlignParams> aNonAutoAlignParams,
510+ const StylePositionArea& aPositionArea) {
510511 if (!aPlaceholderContainer) {
511512 // (The placeholder container should be the thing that kicks this whole
512513 // process off, by setting PLACEHOLDER_STATICPOS_NEEDS_CSSALIGN. So it
@@ -526,6 +527,7 @@ static nscoord OffsetToAlignedStaticPos(
526527 // WritingMode. For brevity, we use the abbreviation "pc" for "placeholder
527528 // container" in variables below.
528529 WritingMode pcWM = aPlaceholderContainer->GetWritingMode ();
530+ LogicalSize absPosCBSizeInPCWM = aAbsPosCBSize.ConvertTo (pcWM, aAbsPosCBWM);
529531
530532 // Find what axis aAbsPosCBAxis corresponds to, in placeholder's parent's
531533 // writing-mode.
@@ -609,7 +611,7 @@ static nscoord OffsetToAlignedStaticPos(
609611 aNonAutoAlignParams
610612 ? aPlaceholderContainer
611613 ->CSSAlignmentForAbsPosChildWithinContainingBlock (
612- aKidReflowInput, pcAxis)
614+ aKidReflowInput, pcAxis, aPositionArea, absPosCBSizeInPCWM )
613615 : aPlaceholderContainer->CSSAlignmentForAbsPosChild (aKidReflowInput,
614616 pcAxis);
615617 // If the safe bit in alignConst is set, set the safe flag in |flags|.
@@ -710,7 +712,7 @@ static nscoord OffsetToAlignedStaticPos(
710712void AbsoluteContainingBlock::ResolveSizeDependentOffsets (
711713 ReflowInput& aKidReflowInput, const LogicalSize& aLogicalCBSize,
712714 const LogicalSize& aKidSize, const LogicalMargin& aMargin,
713- LogicalMargin& aOffsets) {
715+ const StylePositionArea& aResolvedPositionArea, LogicalMargin& aOffsets) {
714716 WritingMode wm = aKidReflowInput.GetWritingMode ();
715717 WritingMode outerWM = aKidReflowInput.mParentReflowInput ->GetWritingMode ();
716718
@@ -745,7 +747,7 @@ void AbsoluteContainingBlock::ResolveSizeDependentOffsets(
745747 placeholderContainer = GetPlaceholderContainer (aKidReflowInput.mFrame );
746748 nscoord offset = OffsetToAlignedStaticPos (
747749 aKidReflowInput, aKidSize, logicalCBSizeOuterWM, placeholderContainer,
748- outerWM, LogicalAxis::Inline, Nothing{});
750+ outerWM, LogicalAxis::Inline, Nothing{}, aResolvedPositionArea );
749751 // Shift IStart from its current position (at start corner of the
750752 // alignment container) by the returned offset. And set IEnd to the
751753 // distance between the kid's end edge to containing block's end edge.
@@ -765,7 +767,7 @@ void AbsoluteContainingBlock::ResolveSizeDependentOffsets(
765767 }
766768 nscoord offset = OffsetToAlignedStaticPos (
767769 aKidReflowInput, aKidSize, logicalCBSizeOuterWM, placeholderContainer,
768- outerWM, LogicalAxis::Block, Nothing{});
770+ outerWM, LogicalAxis::Block, Nothing{}, aResolvedPositionArea );
769771 // Shift BStart from its current position (at start corner of the
770772 // alignment container) by the returned offset. And set BEnd to the
771773 // distance between the kid's end edge to containing block's end edge.
@@ -955,13 +957,14 @@ void AbsoluteContainingBlock::ReflowAbsoluteFrame(
955957
956958 do {
957959 AutoFallbackStyleSetter fallback (aKidFrame, currentFallbackStyle);
960+ auto positionArea = aKidFrame->StylePosition ()->mPositionArea ;
961+ StylePositionArea resolvedPositionArea;
958962 const nsRect usedCb = [&] {
959963 if (isGrid) {
960964 // TODO(emilio): how does position-area interact with grid?
961965 return nsGridContainerFrame::GridItemCB (aKidFrame);
962966 }
963967
964- auto positionArea = aKidFrame->StylePosition ()->mPositionArea ;
965968 if (currentFallback && currentFallback->IsPositionArea ()) {
966969 MOZ_ASSERT (currentFallback->IsPositionArea ());
967970 positionArea = currentFallback->AsPositionArea ();
@@ -975,7 +978,8 @@ void AbsoluteContainingBlock::ReflowAbsoluteFrame(
975978 AdjustAbsoluteContainingBlockRectForPositionArea (
976979 *defaultAnchorInfo.mRect , aOriginalContainingBlockRect,
977980 aKidFrame->GetWritingMode (),
978- aDelegatingFrame->GetWritingMode (), positionArea);
981+ aDelegatingFrame->GetWritingMode (), positionArea,
982+ &resolvedPositionArea);
979983 }
980984 }
981985
@@ -1096,7 +1100,7 @@ void AbsoluteContainingBlock::ReflowAbsoluteFrame(
10961100 // If we're solving for start in either inline or block direction,
10971101 // then compute it now that we know the dimensions.
10981102 ResolveSizeDependentOffsets (kidReflowInput, logicalCBSize, kidSize,
1099- margin, offsets);
1103+ margin, resolvedPositionArea, offsets);
11001104
11011105 if (kidReflowInput.mFlags .mDeferAutoMarginComputation ) {
11021106 ResolveAutoMarginsAfterLayout (kidReflowInput, logicalCBSize, kidSize,
@@ -1108,10 +1112,12 @@ void AbsoluteContainingBlock::ReflowAbsoluteFrame(
11081112 // to align the child by its margin box:
11091113 // https://drafts.csswg.org/css-position-3/#abspos-layout
11101114 const auto * stylePos = aKidFrame->StylePosition ();
1115+ const LogicalSize logicalCBSizeOuterWM (outerWM, usedCb.Size ());
11111116 const auto anchorResolutionParams =
1112- AnchorPosOffsetResolutionParams::UseCBFrameSize (
1117+ AnchorPosOffsetResolutionParams::ExplicitCBFrameSize (
11131118 AnchorPosResolutionParams::From (aKidFrame,
1114- aAnchorPosReferenceData));
1119+ aAnchorPosReferenceData),
1120+ &logicalCBSizeOuterWM);
11151121 const bool iInsetAuto =
11161122 stylePos
11171123 ->GetAnchorResolvedInset (LogicalSide::IStart, outerWM,
@@ -1130,7 +1136,6 @@ void AbsoluteContainingBlock::ReflowAbsoluteFrame(
11301136 ->GetAnchorResolvedInset (LogicalSide::BEnd, outerWM,
11311137 anchorResolutionParams)
11321138 ->IsAuto ();
1133- const LogicalSize logicalCBSizeOuterWM (outerWM, usedCb.Size ());
11341139 const LogicalSize kidMarginBox{
11351140 outerWM, margin.IStartEnd (outerWM) + kidSize.ISize (outerWM),
11361141 margin.BStartEnd (outerWM) + kidSize.BSize (outerWM)};
@@ -1148,7 +1153,8 @@ void AbsoluteContainingBlock::ReflowAbsoluteFrame(
11481153 Some (NonAutoAlignParams{
11491154 offsets.IStart (outerWM),
11501155 offsets.IEnd (outerWM),
1151- }));
1156+ }),
1157+ resolvedPositionArea);
11521158
11531159 offsets.IStart (outerWM) += alignOffset;
11541160 offsets.IEnd (outerWM) =
@@ -1165,7 +1171,8 @@ void AbsoluteContainingBlock::ReflowAbsoluteFrame(
11651171 Some (NonAutoAlignParams{
11661172 offsets.BStart (outerWM),
11671173 offsets.BEnd (outerWM),
1168- }));
1174+ }),
1175+ resolvedPositionArea);
11691176 offsets.BStart (outerWM) += alignOffset;
11701177 offsets.BEnd (outerWM) =
11711178 logicalCBSizeOuterWM.BSize (outerWM) -
0 commit comments