tor-browser

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

commit bc04f15c3ab9c27efdadd9a29e4e77d208d32bc8
parent d4456d810664a2a13a871a68e5323522a78c1131
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>