commit d8bd94aa646aa77a24a487be85480a479341d8eb
parent a804b5349956a4ce2002bebae629b152afd30ca2
Author: Emilio Cobos Álvarez <emilio@crisal.io>
Date: Fri, 9 Jan 2026 16:00:07 +0000
Bug 2009424 - Make containing block adjustment work for default anchored frames. r=layout-anchor-positioning-reviewers,layout-reviewers,dshin
Differential Revision: https://phabricator.services.mozilla.com/D278497
Diffstat:
2 files changed, 15 insertions(+), 19 deletions(-)
diff --git a/layout/generic/AbsoluteContainingBlock.cpp b/layout/generic/AbsoluteContainingBlock.cpp
@@ -1326,6 +1326,7 @@ void AbsoluteContainingBlock::ReflowAbsoluteFrame(
// The current containing block, with ongoing modifications.
// Starts as a local containing block.
nsRect containingBlock = aOriginalContainingBlockRect;
+ nsRect scrollableContainingBlock = aOriginalScrollableContainingBlockRect;
const auto defaultAnchorInfo = [&]() -> Maybe<AnchorPosInfo> {
if (!aAnchorPosResolutionCache) {
return Nothing{};
@@ -1341,6 +1342,18 @@ void AbsoluteContainingBlock::ReflowAbsoluteFrame(
containingBlock = aOriginalScrollableContainingBlockRect;
}
+ if (ViewportFrame* viewport = do_QueryFrame(aDelegatingFrame)) {
+ if (IsSnapshotContainingBlock(aKidFrame)) {
+ return ContainingBlockRect{
+ dom::ViewTransition::SnapshotContainingBlockRect(
+ viewport->PresContext())};
+ }
+ MOZ_ASSERT(aOriginalScrollableContainingBlockRect ==
+ aOriginalContainingBlockRect);
+ containingBlock = scrollableContainingBlock =
+ viewport->GetContainingBlockAdjustedForScrollbars(aReflowInput);
+ }
+
// https://drafts.csswg.org/css-position/#original-cb
// Handle grid-based adjustment first...
if (isGrid) {
@@ -1382,24 +1395,12 @@ void AbsoluteContainingBlock::ReflowAbsoluteFrame(
aAnchorPosResolutionCache->mReferenceData->mScrollCompensatedSides =
GetScrollCompensatedSidesFor(resolvedPositionArea);
return ContainingBlockRect{
- offset, resolvedPositionArea,
- aOriginalScrollableContainingBlockRect,
+ offset, resolvedPositionArea, scrollableContainingBlock,
// Unscroll the CB by canceling out the previously applied
// scroll offset (See above), the offset will be applied later.
scrolledAnchorCb + offset};
}
- return ContainingBlockRect{aOriginalScrollableContainingBlockRect,
- containingBlock};
- }
-
- if (ViewportFrame* viewport = do_QueryFrame(aDelegatingFrame)) {
- if (!IsSnapshotContainingBlock(aKidFrame)) {
- return ContainingBlockRect{
- viewport->GetContainingBlockAdjustedForScrollbars(aReflowInput)};
- }
- return ContainingBlockRect{
- dom::ViewTransition::SnapshotContainingBlockRect(
- viewport->PresContext())};
+ return ContainingBlockRect{scrollableContainingBlock, containingBlock};
}
return ContainingBlockRect{containingBlock};
}();
diff --git a/testing/web-platform/meta/css/css-anchor-position/anchor-scroll-position-try-007.html.ini b/testing/web-platform/meta/css/css-anchor-position/anchor-scroll-position-try-007.html.ini
@@ -1,5 +0,0 @@
-[anchor-scroll-position-try-007.html]
- [Should use the third position option with enough space left]
- expected:
- if os == "android": PASS
- FAIL