tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

commit 36a152949e5e2717120dbc17c39315dd619ae5e6
parent 23038681a70bfaf04f53cc7f40c42486777475e0
Author: Emilio Cobos Álvarez <emilio@crisal.io>
Date:   Sun,  7 Dec 2025 18:20:14 +0000

Bug 1924786 - Make position-area and default-anchor adjustments take priority over CSS grid CB. r=layout-anchor-positioning-reviewers,layout-reviewers,dshin

As per https://drafts.csswg.org/css-position/#original-cb they should
happen later. In general, multiple of these adjustments should be rarer
and browsers aren't particularly consistent. It's also unclear to me how
it affects the scrollable containing block stuff, I filed bug 2004596 to
sort that out.

Give a reasonable CB (the grid container's padding rect) down from grid
layout now that we might not use the actual grid CB.

Remove a check for fallbacks that isn't needed since part 1 of
bug 1991929.

Differential Revision: https://phabricator.services.mozilla.com/D275368

Diffstat:
Mlayout/generic/AbsoluteContainingBlock.cpp | 26+++++++++++---------------
Mlayout/generic/nsGridContainerFrame.cpp | 9++++-----
Atesting/web-platform/tests/css/css-anchor-position/grid-position-area-basic-ref.html | 44++++++++++++++++++++++++++++++++++++++++++++
Atesting/web-platform/tests/css/css-anchor-position/grid-position-area-basic.html | 51+++++++++++++++++++++++++++++++++++++++++++++++++++
4 files changed, 110 insertions(+), 20 deletions(-)

diff --git a/layout/generic/AbsoluteContainingBlock.cpp b/layout/generic/AbsoluteContainingBlock.cpp @@ -1209,27 +1209,13 @@ 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. @@ -1260,6 +1246,16 @@ 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,17 +9326,16 @@ nscoord nsGridContainerFrame::ReflowChildren(GridReflowInput& aGridRI, *cb = itemCB.GetPhysicalRect(wm, gridCBPhysicalSize); ++i; } - // 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; + const auto border = aGridRI.mReflowInput->ComputedPhysicalBorder(); + const nsPoint borderShift{border.left, border.top}; + const nsRect paddingRect(borderShift, gridCBPhysicalSize); // 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, dummyRect, flags, + aStatus, paddingRect, 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 @@ -0,0 +1,44 @@ +<!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 @@ -0,0 +1,51 @@ +<!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>