commit e64ec53679977f308a7b46cb5de9b858bc02dede
parent 409c93329155855895a38df6724d8ae178af32a1
Author: Norisz Fay <nfay@mozilla.com>
Date: Mon, 8 Dec 2025 03:19:08 +0200
Revert "Bug 1924786 - Make position-area and default-anchor adjustments take priority over CSS grid CB. r=layout-anchor-positioning-reviewers,layout-reviewers,dshin" for causing wpt failures on align-self-default-overflow-htb-ltr-htb.html
This reverts commit bc04f15c3ab9c27efdadd9a29e4e77d208d32bc8.
Diffstat:
4 files changed, 20 insertions(+), 110 deletions(-)
diff --git a/layout/generic/AbsoluteContainingBlock.cpp b/layout/generic/AbsoluteContainingBlock.cpp
@@ -1220,13 +1220,27 @@ void AbsoluteContainingBlock::ReflowAbsoluteFrame(
aAnchorPosResolutionCache,
firstTryIndex == currentFallbackIndex);
auto cb = [&]() {
+ if (isGrid) {
+ // TODO(emilio): how does position-area interact with grid?
+ const auto border = aDelegatingFrame->GetUsedBorder();
+ const nsPoint borderShift{border.left, border.top};
+ // Shift in by border of the overall grid container.
+ return ContainingBlockRect{nsGridContainerFrame::GridItemCB(aKidFrame) +
+ borderShift};
+ }
+
+ auto positionArea = aKidFrame->StylePosition()->mPositionArea;
+ if (currentFallback && currentFallback->IsPositionArea()) {
+ MOZ_ASSERT(currentFallback->IsPositionArea());
+ positionArea = currentFallback->AsPositionArea();
+ }
+
if (aAnchorPosResolutionCache) {
const auto defaultAnchorInfo =
AnchorPositioningUtils::ResolveAnchorPosRect(
aKidFrame, aDelegatingFrame, nullptr, false,
aAnchorPosResolutionCache);
if (defaultAnchorInfo) {
- auto positionArea = aKidFrame->StylePosition()->mPositionArea;
if (!positionArea.IsNone()) {
// Offset should be up to, but not including the containing block's
// scroll offset.
@@ -1257,16 +1271,6 @@ void AbsoluteContainingBlock::ReflowAbsoluteFrame(
}
}
- if (isGrid) {
- // TODO(emilio, bug 2004596): This adjustment is supposed to also
- // restrict the position-area rect above...
- const auto border = aDelegatingFrame->GetUsedBorder();
- const nsPoint borderShift{border.left, border.top};
- // Shift in by border of the overall grid container.
- return ContainingBlockRect{nsGridContainerFrame::GridItemCB(aKidFrame) +
- borderShift};
- }
-
if (ViewportFrame* viewport = do_QueryFrame(aDelegatingFrame)) {
if (!IsSnapshotContainingBlock(aKidFrame)) {
return ContainingBlockRect{
diff --git a/layout/generic/nsGridContainerFrame.cpp b/layout/generic/nsGridContainerFrame.cpp
@@ -9326,16 +9326,17 @@ nscoord nsGridContainerFrame::ReflowChildren(GridReflowInput& aGridRI,
*cb = itemCB.GetPhysicalRect(wm, gridCBPhysicalSize);
++i;
}
- const auto border = aGridRI.mReflowInput->ComputedPhysicalBorder();
- const nsPoint borderShift{border.left, border.top};
- const nsRect paddingRect(borderShift, gridCBPhysicalSize);
+ // We pass a dummy rect as CB because each child has its own CB rect.
+ // The IsGridContainerCB flag tells AbsoluteContainingBlock::Reflow to
+ // use those instead.
+ nsRect dummyRect;
// XXX: To optimize the performance, set the flags only when the CB width
// or height actually changes.
AbsPosReflowFlags flags{
AbsPosReflowFlag::AllowFragmentation, AbsPosReflowFlag::CBWidthChanged,
AbsPosReflowFlag::CBHeightChanged, AbsPosReflowFlag::IsGridContainerCB};
absoluteContainer->Reflow(this, PresContext(), *aGridRI.mReflowInput,
- aStatus, paddingRect, flags,
+ aStatus, dummyRect, flags,
&aDesiredSize.mOverflowAreas);
}
return bSize;
diff --git a/testing/web-platform/tests/css/css-anchor-position/grid-position-area-basic-ref.html b/testing/web-platform/tests/css/css-anchor-position/grid-position-area-basic-ref.html
@@ -1,44 +0,0 @@
-<!DOCTYPE html>
-<meta charset="utf-8">
-<style>
-#grid {
- display: grid;
- grid: 150px 100px / 200px 300px;
- padding: 20px;
- position: relative;
- border: 1px solid;
-}
-
-#positioned {
- position: absolute;
- background: magenta;
- grid-column: 1 / 2;
- grid-row: 1 / 2;
- left: 500px;
- bottom: 0;
-}
-
-#static {
- background: pink;
- grid-column: 1 / 2;
- grid-row: 1 / 2;
-}
-
-#anchor {
- background: lime;
- grid-column: 2 / 3;
- grid-row: 2 / 3;
-}
-
-.abs-cb {
- width: 600px;
- height: 600px;
- position: relative;
-}
-</style>
-
-<div id="grid">
- <div id="anchor"></div>
- <div id="positioned">Anchored</div>
- <div id="static"></div>
-</div>
diff --git a/testing/web-platform/tests/css/css-anchor-position/grid-position-area-basic.html b/testing/web-platform/tests/css/css-anchor-position/grid-position-area-basic.html
@@ -1,51 +0,0 @@
-<!DOCTYPE html>
-<meta charset="utf-8">
-<link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1924786">
-<link rel="help" href="https://drafts.csswg.org/css-position/#original-cb">
-<link rel="match" href="grid-position-area-basic-ref.html">
-<style>
-#grid {
- display: grid;
- grid: 150px 100px / 200px 300px;
- padding: 20px;
- position: relative;
- border: 1px solid;
-}
-
-#positioned {
- position: absolute;
- background: magenta;
- grid-column: 1 / 2;
- grid-row: 1 / 2;
- position-anchor: --foo;
- position-area: top right;
- /* FIXME: Shouldn't be needed */
- width: fit-content;
- height: fit-content;
-}
-
-#static {
- background: pink;
- grid-column: 1 / 2;
- grid-row: 1 / 2;
-}
-
-#anchor {
- background: lime;
- grid-column: 2 / 3;
- grid-row: 2 / 3;
- anchor-name: --foo;
-}
-
-.abs-cb {
- width: 600px;
- height: 600px;
- position: relative;
-}
-</style>
-
-<div id="grid">
- <div id="anchor"></div>
- <div id="positioned">Anchored</div>
- <div id="static"></div>
-</div>