Skip to content

Commit 73870f3

Browse files
committed
Revert "Bug 1924090 - Apply resolved position-area influenced self-alignment properties during alignment for abspos with cb r=emilio,layout-reviewers,dshin,firefox-style-system-reviewers" for causing Wr failures on position-try-switch-to-fixed-anchor.html
This reverts commit 0a4067b.
1 parent 36b0ce8 commit 73870f3

25 files changed

+162
-219
lines changed

layout/base/AnchorPositioningUtils.cpp

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -504,8 +504,7 @@ static StylePositionArea ToPhysicalPositionArea(StylePositionArea aPosArea,
504504

505505
nsRect AnchorPositioningUtils::AdjustAbsoluteContainingBlockRectForPositionArea(
506506
const nsRect& aAnchorRect, const nsRect& aCBRect, WritingMode aPositionedWM,
507-
WritingMode aCBWM, const StylePositionArea& aPosArea,
508-
StylePositionArea* aOutResolvedArea) {
507+
WritingMode aCBWM, const StylePositionArea& aPosArea) {
509508
// Get the boundaries of 3x3 grid in CB's frame space. The edges of the
510509
// default anchor box are clamped to the bounds of the CB, even if that
511510
// results in zero width/height cells.
@@ -537,7 +536,6 @@ nsRect AnchorPositioningUtils::AdjustAbsoluteContainingBlockRectForPositionArea(
537536
// PositionArea, resolved to only contain Left/Right/Top/Bottom values.
538537
StylePositionArea posArea =
539538
ToPhysicalPositionArea(aPosArea, aCBWM, aPositionedWM);
540-
*aOutResolvedArea = posArea;
541539

542540
nscoord right = ltrEdges[3];
543541
if (posArea.first == StylePositionAreaKeyword::Left) {

layout/base/AnchorPositioningUtils.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@ struct AnchorPositioningUtils {
114114
static nsRect AdjustAbsoluteContainingBlockRectForPositionArea(
115115
const nsRect& aAnchorRect, const nsRect& aCBRect,
116116
WritingMode aPositionedWM, WritingMode aCBWM,
117-
const StylePositionArea& aPosArea, StylePositionArea* aOutResolvedArea);
117+
const StylePositionArea& aPosArea);
118118

119119
/**
120120
* Gets the used anchor name for an anchor positioned frame.

layout/generic/AbsoluteContainingBlock.cpp

Lines changed: 13 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -506,8 +506,7 @@ 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,
510-
const StylePositionArea& aPositionArea) {
509+
LogicalAxis aAbsPosCBAxis, Maybe<NonAutoAlignParams> aNonAutoAlignParams) {
511510
if (!aPlaceholderContainer) {
512511
// (The placeholder container should be the thing that kicks this whole
513512
// process off, by setting PLACEHOLDER_STATICPOS_NEEDS_CSSALIGN. So it
@@ -527,7 +526,6 @@ static nscoord OffsetToAlignedStaticPos(
527526
// WritingMode. For brevity, we use the abbreviation "pc" for "placeholder
528527
// container" in variables below.
529528
WritingMode pcWM = aPlaceholderContainer->GetWritingMode();
530-
LogicalSize absPosCBSizeInPCWM = aAbsPosCBSize.ConvertTo(pcWM, aAbsPosCBWM);
531529

532530
// Find what axis aAbsPosCBAxis corresponds to, in placeholder's parent's
533531
// writing-mode.
@@ -611,7 +609,7 @@ static nscoord OffsetToAlignedStaticPos(
611609
aNonAutoAlignParams
612610
? aPlaceholderContainer
613611
->CSSAlignmentForAbsPosChildWithinContainingBlock(
614-
aKidReflowInput, pcAxis, aPositionArea, absPosCBSizeInPCWM)
612+
aKidReflowInput, pcAxis)
615613
: aPlaceholderContainer->CSSAlignmentForAbsPosChild(aKidReflowInput,
616614
pcAxis);
617615
// If the safe bit in alignConst is set, set the safe flag in |flags|.
@@ -712,7 +710,7 @@ static nscoord OffsetToAlignedStaticPos(
712710
void AbsoluteContainingBlock::ResolveSizeDependentOffsets(
713711
ReflowInput& aKidReflowInput, const LogicalSize& aLogicalCBSize,
714712
const LogicalSize& aKidSize, const LogicalMargin& aMargin,
715-
const StylePositionArea& aResolvedPositionArea, LogicalMargin& aOffsets) {
713+
LogicalMargin& aOffsets) {
716714
WritingMode wm = aKidReflowInput.GetWritingMode();
717715
WritingMode outerWM = aKidReflowInput.mParentReflowInput->GetWritingMode();
718716

@@ -747,7 +745,7 @@ void AbsoluteContainingBlock::ResolveSizeDependentOffsets(
747745
placeholderContainer = GetPlaceholderContainer(aKidReflowInput.mFrame);
748746
nscoord offset = OffsetToAlignedStaticPos(
749747
aKidReflowInput, aKidSize, logicalCBSizeOuterWM, placeholderContainer,
750-
outerWM, LogicalAxis::Inline, Nothing{}, aResolvedPositionArea);
748+
outerWM, LogicalAxis::Inline, Nothing{});
751749
// Shift IStart from its current position (at start corner of the
752750
// alignment container) by the returned offset. And set IEnd to the
753751
// distance between the kid's end edge to containing block's end edge.
@@ -767,7 +765,7 @@ void AbsoluteContainingBlock::ResolveSizeDependentOffsets(
767765
}
768766
nscoord offset = OffsetToAlignedStaticPos(
769767
aKidReflowInput, aKidSize, logicalCBSizeOuterWM, placeholderContainer,
770-
outerWM, LogicalAxis::Block, Nothing{}, aResolvedPositionArea);
768+
outerWM, LogicalAxis::Block, Nothing{});
771769
// Shift BStart from its current position (at start corner of the
772770
// alignment container) by the returned offset. And set BEnd to the
773771
// distance between the kid's end edge to containing block's end edge.
@@ -957,14 +955,13 @@ void AbsoluteContainingBlock::ReflowAbsoluteFrame(
957955

958956
do {
959957
AutoFallbackStyleSetter fallback(aKidFrame, currentFallbackStyle);
960-
auto positionArea = aKidFrame->StylePosition()->mPositionArea;
961-
StylePositionArea resolvedPositionArea;
962958
const nsRect usedCb = [&] {
963959
if (isGrid) {
964960
// TODO(emilio): how does position-area interact with grid?
965961
return nsGridContainerFrame::GridItemCB(aKidFrame);
966962
}
967963

964+
auto positionArea = aKidFrame->StylePosition()->mPositionArea;
968965
if (currentFallback && currentFallback->IsPositionArea()) {
969966
MOZ_ASSERT(currentFallback->IsPositionArea());
970967
positionArea = currentFallback->AsPositionArea();
@@ -978,8 +975,7 @@ void AbsoluteContainingBlock::ReflowAbsoluteFrame(
978975
AdjustAbsoluteContainingBlockRectForPositionArea(
979976
*defaultAnchorInfo.mRect, aOriginalContainingBlockRect,
980977
aKidFrame->GetWritingMode(),
981-
aDelegatingFrame->GetWritingMode(), positionArea,
982-
&resolvedPositionArea);
978+
aDelegatingFrame->GetWritingMode(), positionArea);
983979
}
984980
}
985981

@@ -1100,7 +1096,7 @@ void AbsoluteContainingBlock::ReflowAbsoluteFrame(
11001096
// If we're solving for start in either inline or block direction,
11011097
// then compute it now that we know the dimensions.
11021098
ResolveSizeDependentOffsets(kidReflowInput, logicalCBSize, kidSize,
1103-
margin, resolvedPositionArea, offsets);
1099+
margin, offsets);
11041100

11051101
if (kidReflowInput.mFlags.mDeferAutoMarginComputation) {
11061102
ResolveAutoMarginsAfterLayout(kidReflowInput, logicalCBSize, kidSize,
@@ -1112,12 +1108,10 @@ void AbsoluteContainingBlock::ReflowAbsoluteFrame(
11121108
// to align the child by its margin box:
11131109
// https://drafts.csswg.org/css-position-3/#abspos-layout
11141110
const auto* stylePos = aKidFrame->StylePosition();
1115-
const LogicalSize logicalCBSizeOuterWM(outerWM, usedCb.Size());
11161111
const auto anchorResolutionParams =
1117-
AnchorPosOffsetResolutionParams::ExplicitCBFrameSize(
1112+
AnchorPosOffsetResolutionParams::UseCBFrameSize(
11181113
AnchorPosResolutionParams::From(aKidFrame,
1119-
aAnchorPosReferenceData),
1120-
&logicalCBSizeOuterWM);
1114+
aAnchorPosReferenceData));
11211115
const bool iInsetAuto =
11221116
stylePos
11231117
->GetAnchorResolvedInset(LogicalSide::IStart, outerWM,
@@ -1136,6 +1130,7 @@ void AbsoluteContainingBlock::ReflowAbsoluteFrame(
11361130
->GetAnchorResolvedInset(LogicalSide::BEnd, outerWM,
11371131
anchorResolutionParams)
11381132
->IsAuto();
1133+
const LogicalSize logicalCBSizeOuterWM(outerWM, usedCb.Size());
11391134
const LogicalSize kidMarginBox{
11401135
outerWM, margin.IStartEnd(outerWM) + kidSize.ISize(outerWM),
11411136
margin.BStartEnd(outerWM) + kidSize.BSize(outerWM)};
@@ -1153,8 +1148,7 @@ void AbsoluteContainingBlock::ReflowAbsoluteFrame(
11531148
Some(NonAutoAlignParams{
11541149
offsets.IStart(outerWM),
11551150
offsets.IEnd(outerWM),
1156-
}),
1157-
resolvedPositionArea);
1151+
}));
11581152

11591153
offsets.IStart(outerWM) += alignOffset;
11601154
offsets.IEnd(outerWM) =
@@ -1171,8 +1165,7 @@ void AbsoluteContainingBlock::ReflowAbsoluteFrame(
11711165
Some(NonAutoAlignParams{
11721166
offsets.BStart(outerWM),
11731167
offsets.BEnd(outerWM),
1174-
}),
1175-
resolvedPositionArea);
1168+
}));
11761169
offsets.BStart(outerWM) += alignOffset;
11771170
offsets.BEnd(outerWM) =
11781171
logicalCBSizeOuterWM.BSize(outerWM) -

layout/generic/AbsoluteContainingBlock.h

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@ enum class AbsPosReflowFlag : uint8_t {
2828
IsGridContainerCB,
2929
};
3030
using AbsPosReflowFlags = EnumSet<AbsPosReflowFlag>;
31-
struct StylePositionArea;
3231

3332
/**
3433
* This class contains the logic for being an absolute containing block. This
@@ -123,10 +122,11 @@ class AbsoluteContainingBlock {
123122
*
124123
* aOffset is an outparam.
125124
*/
126-
void ResolveSizeDependentOffsets(
127-
ReflowInput& aKidReflowInput, const LogicalSize& aLogicalCBSize,
128-
const LogicalSize& aKidSize, const LogicalMargin& aMargin,
129-
const StylePositionArea& aResolvedPositionArea, LogicalMargin& aOffsets);
125+
void ResolveSizeDependentOffsets(ReflowInput& aKidReflowInput,
126+
const LogicalSize& aLogicalCBSize,
127+
const LogicalSize& aKidSize,
128+
const LogicalMargin& aMargin,
129+
LogicalMargin& aOffsets);
130130

131131
/**
132132
* For frames that have intrinsic block sizes, since we want to use the

layout/generic/ReflowInput.h

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -981,12 +981,9 @@ struct ReflowInput : public SizeComputationInput {
981981
} // namespace mozilla
982982

983983
inline AnchorPosResolutionParams AnchorPosResolutionParams::From(
984-
const mozilla::ReflowInput* aRI, bool aIgnorePositionArea) {
985-
const mozilla::StylePositionArea posArea =
986-
aIgnorePositionArea ? mozilla::StylePositionArea{}
987-
: aRI->mStylePosition->mPositionArea;
988-
return {aRI->mFrame, aRI->mStyleDisplay->mPosition, posArea,
989-
aRI->mAnchorPosReferenceData};
984+
const mozilla::ReflowInput* aRI) {
985+
return {aRI->mFrame, aRI->mStyleDisplay->mPosition,
986+
aRI->mStylePosition->mPositionArea, aRI->mAnchorPosReferenceData};
990987
}
991988

992989
#endif // mozilla_ReflowInput_h

layout/generic/nsContainerFrame.cpp

Lines changed: 1 addition & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010

1111
#include <algorithm>
1212

13-
#include "AnchorPositioningUtils.h"
1413
#include "mozilla/AbsoluteContainingBlock.h"
1514
#include "mozilla/AutoRestore.h"
1615
#include "mozilla/ComputedStyle.h"
@@ -2625,9 +2624,7 @@ StyleAlignFlags nsContainerFrame::CSSAlignmentForAbsPosChild(
26252624

26262625
StyleAlignFlags
26272626
nsContainerFrame::CSSAlignmentForAbsPosChildWithinContainingBlock(
2628-
const ReflowInput& aChildRI, LogicalAxis aLogicalAxis,
2629-
const StylePositionArea& aResolvedPositionArea,
2630-
const LogicalSize& aCBSize) const {
2627+
const ReflowInput& aChildRI, LogicalAxis aLogicalAxis) const {
26312628
MOZ_ASSERT(aChildRI.mFrame->IsAbsolutelyPositioned(),
26322629
"This method should only be called for abspos children");
26332630
// When determining the position of absolutely-positioned boxes,
@@ -2637,51 +2634,6 @@ nsContainerFrame::CSSAlignmentForAbsPosChildWithinContainingBlock(
26372634
? aChildRI.mStylePosition->UsedJustifySelf(nullptr)._0
26382635
: aChildRI.mStylePosition->UsedAlignSelf(nullptr)._0;
26392636

2640-
// Check if position-area is set - if so, it determines the default alignment
2641-
// https://drafts.csswg.org/css-anchor-position/#position-area-alignment
2642-
if (!aResolvedPositionArea.IsNone() && alignment == StyleAlignFlags::NORMAL) {
2643-
// Check if exactly one inset in the axis is auto
2644-
// https://drafts.csswg.org/css-anchor-position/#position-area-alignment
2645-
// "However, if only one inset property in the relevant axis is auto, the
2646-
// default alignment is instead towards the edge with the non-auto inset;
2647-
// and this is an unsafe alignment."
2648-
const WritingMode cbWM = GetWritingMode();
2649-
const auto anchorResolutionParams = AnchorPosResolutionParams::From(
2650-
&aChildRI, /* aIgnorePositionArea = */ true);
2651-
const auto anchorOffsetResolutionParams =
2652-
AnchorPosOffsetResolutionParams::ExplicitCBFrameSize(
2653-
anchorResolutionParams, &aCBSize);
2654-
2655-
const LogicalSide startSide = aLogicalAxis == LogicalAxis::Inline
2656-
? LogicalSide::IStart
2657-
: LogicalSide::BStart;
2658-
const LogicalSide endSide = GetOppositeSide(startSide);
2659-
2660-
const bool startInsetIsAuto =
2661-
aChildRI.mStylePosition
2662-
->GetAnchorResolvedInset(startSide, cbWM,
2663-
anchorOffsetResolutionParams)
2664-
->IsAuto();
2665-
const bool endInsetIsAuto =
2666-
aChildRI.mStylePosition
2667-
->GetAnchorResolvedInset(endSide, cbWM,
2668-
anchorOffsetResolutionParams)
2669-
->IsAuto();
2670-
2671-
// Exactly one inset is auto - align toward the non-auto edge, unsafely
2672-
if (startInsetIsAuto != endInsetIsAuto) {
2673-
alignment =
2674-
startInsetIsAuto ? StyleAlignFlags::END : StyleAlignFlags::START;
2675-
alignment |= StyleAlignFlags::UNSAFE;
2676-
} else {
2677-
auto keyword = aLogicalAxis == LogicalAxis::Inline
2678-
? aResolvedPositionArea.first
2679-
: aResolvedPositionArea.second;
2680-
// Use normal position-area alignment
2681-
Servo_ResolvePositionAreaSelfAlignment(&keyword, &alignment);
2682-
}
2683-
}
2684-
26852637
return MapCSSAlignment(alignment, aChildRI, aLogicalAxis, GetWritingMode());
26862638
}
26872639

layout/generic/nsContainerFrame.h

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@ class nsOverflowContinuationTracker;
2121

2222
namespace mozilla {
2323
class PresShell;
24-
struct StylePositionArea;
2524
} // namespace mozilla
2625

2726
// Some macros for container classes to do sanity checking on
@@ -493,9 +492,7 @@ class nsContainerFrame : public nsSplittableFrame {
493492
* on its type (By overriding `CSSAlignmentForAbsPosChild`).
494493
*/
495494
mozilla::StyleAlignFlags CSSAlignmentForAbsPosChildWithinContainingBlock(
496-
const ReflowInput& aChildRI, mozilla::LogicalAxis aLogicalAxis,
497-
const mozilla::StylePositionArea& aResolvedPositionArea,
498-
const mozilla::LogicalSize& aContainingBlockSize) const;
495+
const ReflowInput& aChildRI, mozilla::LogicalAxis aLogicalAxis) const;
499496

500497
#define NS_DECLARE_FRAME_PROPERTY_FRAMELIST(prop) \
501498
NS_DECLARE_FRAME_PROPERTY_WITH_DTOR_NEVER_CALLED(prop, nsFrameList)

layout/style/nsStyleStruct.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -399,8 +399,7 @@ struct AnchorPosResolutionParams {
399399
static inline AnchorPosResolutionParams From(
400400
const nsIFrame* aFrame,
401401
mozilla::AnchorPosReferenceData* aAnchorPosReferenceData = nullptr);
402-
static inline AnchorPosResolutionParams From(
403-
const mozilla::ReflowInput* aRI, bool aIgnorePositionArea = false);
402+
static inline AnchorPosResolutionParams From(const mozilla::ReflowInput* aRI);
404403
static inline AnchorPosResolutionParams From(
405404
const nsComputedDOMStyle* aComputedDOMStyle);
406405
};

servo/components/style/values/specified/position.rs

Lines changed: 0 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@ use crate::values::generics::position::ZIndex as GenericZIndex;
2121
use crate::values::generics::position::{AspectRatio as GenericAspectRatio, GenericAnchorSide};
2222
use crate::values::generics::position::{GenericAnchorFunction, GenericInset};
2323
use crate::values::specified;
24-
use crate::values::specified::align::AlignFlags;
2524
use crate::values::specified::{AllowQuirks, Integer, LengthPercentage, NonNegativeNumber};
2625
use crate::values::DashedIdent;
2726
use crate::{Atom, Zero};
@@ -1185,28 +1184,6 @@ impl PositionAreaKeyword {
11851184
let new_track = old_track.flip();
11861185
Self::from_u8((self as u8 & !TRACK_MASK) | new_track as u8).unwrap()
11871186
}
1188-
1189-
/// Returns a value for the self-alignment properties in order to resolve
1190-
/// `normal`.
1191-
///
1192-
/// <https://drafts.csswg.org/css-anchor-position/#position-area-alignment>
1193-
pub fn to_self_alignment(self) -> Option<AlignFlags> {
1194-
self.track().map(|track| match track {
1195-
// "If the only the center track in an axis is selected, the default alignment in that axis is center."
1196-
PositionAreaTrack::Center => AlignFlags::CENTER,
1197-
// "If all three tracks are selected, the default alignment in that axis is anchor-center."
1198-
PositionAreaTrack::SpanAll => AlignFlags::ANCHOR_CENTER,
1199-
// "Otherwise, the default alignment in that axis is toward the non-specified side track: if it’s
1200-
// specifying the “start” track of its axis, the default alignment in that axis is end; etc."
1201-
_ => {
1202-
if track.start() {
1203-
AlignFlags::END
1204-
} else {
1205-
AlignFlags::START
1206-
}
1207-
},
1208-
})
1209-
}
12101187
}
12111188

12121189
#[derive(

servo/ports/geckolib/glue.rs

Lines changed: 1 addition & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -163,15 +163,12 @@ use style::values::computed::length_percentage::{
163163
AllowAnchorPosResolutionInCalcPercentage, Unpacked,
164164
};
165165
use style::values::computed::position::{AnchorFunction, PositionArea};
166-
use style::values::computed::{
167-
self, ContentVisibility, Context, PositionAreaKeyword, ToComputedValue,
168-
};
166+
use style::values::computed::{self, ContentVisibility, Context, ToComputedValue};
169167
use style::values::distance::{ComputeSquaredDistance, SquaredDistance};
170168
use style::values::generics::color::ColorMixFlags;
171169
use style::values::generics::easing::BeforeFlag;
172170
use style::values::generics::length::GenericAnchorSizeFunction;
173171
use style::values::resolved;
174-
use style::values::specified::align::AlignFlags;
175172
use style::values::specified::intersection_observer::IntersectionObserverMargin;
176173
use style::values::specified::position::DashedIdentAndOrTryTactic;
177174
use style::values::specified::source_size_list::SourceSizeList;
@@ -10761,19 +10758,3 @@ pub extern "C" fn Servo_PhysicalizePositionArea(
1076110758
) {
1076210759
*area = area.to_physical(*cb_wm, *self_wm);
1076310760
}
10764-
10765-
#[no_mangle]
10766-
pub extern "C" fn Servo_ResolvePositionAreaSelfAlignment(
10767-
area: &PositionAreaKeyword,
10768-
out: &mut AlignFlags,
10769-
) {
10770-
let Some(align) = area.to_self_alignment() else {
10771-
debug_assert!(
10772-
false,
10773-
"ResolvePositionAreaSelfAlignment called on {:?}",
10774-
area
10775-
);
10776-
return;
10777-
};
10778-
*out = align;
10779-
}

0 commit comments

Comments
 (0)