commit 2786c0f5b896a22b0fd61f60d91bedb8177b9673 parent b6e55d9685d91621df92b8aad0c368e3d761ad94 Author: Tiaan Louw <tlouw@mozilla.com> Date: Fri, 17 Oct 2025 12:11:21 +0000 Bug 1924233 - Part 1 - Handle "position-visibility: no-overflow" r=emilio,layout-anchor-positioning-reviewers,layout-reviewers,dshin Check for "no-overflow" after all fallbacks were tried and then "hide" the frame if its still overflowing and value is set to "no-overflow". This test is still failing and will be addressed in part 2 of this patch: css/css-anchor-position/position-visibility-no-overflow-scroll.html Differential Revision: https://phabricator.services.mozilla.com/D268525 Diffstat:
5 files changed, 12 insertions(+), 8 deletions(-)
diff --git a/layout/generic/AbsoluteContainingBlock.cpp b/layout/generic/AbsoluteContainingBlock.cpp @@ -935,6 +935,10 @@ void AbsoluteContainingBlock::ReflowAbsoluteFrame( } } + // Assume we *are* overflowing the CB and if we find a fallback that doesn't + // overflow, we set this to false and break the loop. + bool isOverflowingCB = true; + do { AutoFallbackStyleSetter fallback(aKidFrame, currentFallbackStyle); const nsRect usedCb = [&] { @@ -1184,6 +1188,7 @@ void AbsoluteContainingBlock::ReflowAbsoluteFrame( if (usedCb.Contains(aKidFrame->GetRect()) && aStatus.IsComplete()) { // We don't overflow our CB, no further fallback needed. + isOverflowingCB = false; break; } @@ -1197,6 +1202,13 @@ void AbsoluteContainingBlock::ReflowAbsoluteFrame( aStatus.Reset(); } while (true); + // If author asked for `position-visibility: no-overflow` and we overflow + // `usedCB`, treat as "strongly hidden". + aKidFrame->AddOrRemoveStateBits( + NS_FRAME_POSITION_VISIBILITY_HIDDEN, + isOverflowingCB && aKidFrame->StylePosition()->mPositionVisibility == + StylePositionVisibility::NO_OVERFLOW); + if (currentFallbackIndex) { aKidFrame->SetProperty(nsIFrame::LastSuccessfulPositionFallback(), *currentFallbackIndex); diff --git a/testing/web-platform/meta/css/css-anchor-position/position-visibility-no-overflow-nested.html.ini b/testing/web-platform/meta/css/css-anchor-position/position-visibility-no-overflow-nested.html.ini @@ -1,2 +0,0 @@ -[position-visibility-no-overflow-nested.html] - expected: FAIL diff --git a/testing/web-platform/meta/css/css-anchor-position/position-visibility-no-overflow-stacked-child.html.ini b/testing/web-platform/meta/css/css-anchor-position/position-visibility-no-overflow-stacked-child.html.ini @@ -1,2 +0,0 @@ -[position-visibility-no-overflow-stacked-child.html] - expected: FAIL diff --git a/testing/web-platform/meta/css/css-anchor-position/position-visibility-no-overflow-without-anchor.html.ini b/testing/web-platform/meta/css/css-anchor-position/position-visibility-no-overflow-without-anchor.html.ini @@ -1,2 +0,0 @@ -[position-visibility-no-overflow-without-anchor.html] - expected: FAIL diff --git a/testing/web-platform/meta/css/css-anchor-position/position-visibility-no-overflow.html.ini b/testing/web-platform/meta/css/css-anchor-position/position-visibility-no-overflow.html.ini @@ -1,2 +0,0 @@ -[position-visibility-no-overflow.html] - expected: FAIL