tor-browser

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

commit 2a64929749cab47d242785f48eadce3225415000
parent c894e84f05523a6d68b3a9861502cca5a5b8fe0f
Author: Jonathan Kew <jkew@mozilla.com>
Date:   Tue, 30 Dec 2025 23:08:46 +0000

Bug 1924792 - If an anchored element overflows its position-area IMCB, try to shift it to stay within the original containing block. r=layout-anchor-positioning-reviewers,layout-reviewers,emilio

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

Diffstat:
Mlayout/generic/AbsoluteContainingBlock.cpp | 23+++++++++++++++++++++++
Dtesting/web-platform/meta/css/css-anchor-position/last-successful-animation.html.ini | 3---
Dtesting/web-platform/meta/css/css-anchor-position/last-successful-basic.html.ini | 3---
Dtesting/web-platform/meta/css/css-anchor-position/last-successful-change-fallbacks.html.ini | 6------
Mtesting/web-platform/meta/css/css-anchor-position/last-successful-change-try-rule.html.ini | 3---
Dtesting/web-platform/meta/css/css-anchor-position/last-successful-iframe.html.ini | 3---
Dtesting/web-platform/meta/css/css-anchor-position/position-area-overflow-icb-001.html.ini | 2--
Dtesting/web-platform/meta/css/css-anchor-position/position-area-overflow-icb-002.html.ini | 2--
Mtesting/web-platform/meta/css/css-anchor-position/position-try-fallbacks-003.html.ini | 17-----------------
Dtesting/web-platform/meta/css/css-anchor-position/position-visibility-remove-no-overflow.html.ini | 2--
Mtesting/web-platform/meta/css/css-anchor-position/scroll-to-anchored-fixed-004.html.ini | 1+
Mtesting/web-platform/meta/css/css-anchor-position/scroll-to-anchored-fixed-006.html.ini | 1+
12 files changed, 25 insertions(+), 41 deletions(-)

diff --git a/layout/generic/AbsoluteContainingBlock.cpp b/layout/generic/AbsoluteContainingBlock.cpp @@ -1753,6 +1753,29 @@ void AbsoluteContainingBlock::ReflowAbsoluteFrame( position -= aAnchorPosResolutionCache->mReferenceData->mDefaultScrollShift; } + + if (isOverflowingCB && + !aKidFrame->StylePosition()->mPositionArea.IsNone()) { + // The anchored element overflows the IMCB of its position-area. Would it + // have fit within the original CB? If so, shift it to stay within that. + nsSize size = aKidFrame->GetSize(); + if (size.width <= aOriginalContainingBlockRect.width && + size.height <= aOriginalContainingBlockRect.height) { + if (position.x < aOriginalContainingBlockRect.x) { + position.x = aOriginalContainingBlockRect.x; + } else if (position.x + size.width > + aOriginalContainingBlockRect.XMost()) { + position.x = aOriginalContainingBlockRect.XMost() - size.width; + } + if (position.y < aOriginalContainingBlockRect.y) { + position.y = aOriginalContainingBlockRect.y; + } else if (position.y + size.height > + aOriginalContainingBlockRect.YMost()) { + position.y = aOriginalContainingBlockRect.YMost() - size.height; + } + } + } + const auto oldPosition = aKidFrame->GetPosition(); if (position == oldPosition) { return; diff --git a/testing/web-platform/meta/css/css-anchor-position/last-successful-animation.html.ini b/testing/web-platform/meta/css/css-anchor-position/last-successful-animation.html.ini @@ -1,3 +0,0 @@ -[last-successful-animation.html] - [No successful position, keep flip-block] - expected: FAIL diff --git a/testing/web-platform/meta/css/css-anchor-position/last-successful-basic.html.ini b/testing/web-platform/meta/css/css-anchor-position/last-successful-basic.html.ini @@ -1,3 +0,0 @@ -[last-successful-basic.html] - [No successful position, keep flip-block] - expected: FAIL diff --git a/testing/web-platform/meta/css/css-anchor-position/last-successful-change-fallbacks.html.ini b/testing/web-platform/meta/css/css-anchor-position/last-successful-change-fallbacks.html.ini @@ -1,6 +0,0 @@ -[last-successful-change-fallbacks.html] - [No successful position, keep flip-block] - expected: FAIL - - [No successful position, last successful invalidated by position-try-fallbacks change] - expected: FAIL diff --git a/testing/web-platform/meta/css/css-anchor-position/last-successful-change-try-rule.html.ini b/testing/web-platform/meta/css/css-anchor-position/last-successful-change-try-rule.html.ini @@ -1,6 +1,3 @@ [last-successful-change-try-rule.html] - [No successful position, keep --try] - expected: FAIL - [No successful position, last successful invalidated by @position-try change] expected: FAIL diff --git a/testing/web-platform/meta/css/css-anchor-position/last-successful-iframe.html.ini b/testing/web-platform/meta/css/css-anchor-position/last-successful-iframe.html.ini @@ -1,3 +0,0 @@ -[last-successful-iframe.html] - [No successful position, keep flip-block] - expected: FAIL diff --git a/testing/web-platform/meta/css/css-anchor-position/position-area-overflow-icb-001.html.ini b/testing/web-platform/meta/css/css-anchor-position/position-area-overflow-icb-001.html.ini @@ -1,2 +0,0 @@ -[position-area-overflow-icb-001.html] - expected: FAIL diff --git a/testing/web-platform/meta/css/css-anchor-position/position-area-overflow-icb-002.html.ini b/testing/web-platform/meta/css/css-anchor-position/position-area-overflow-icb-002.html.ini @@ -1,2 +0,0 @@ -[position-area-overflow-icb-002.html] - expected: FAIL diff --git a/testing/web-platform/meta/css/css-anchor-position/position-try-fallbacks-003.html.ini b/testing/web-platform/meta/css/css-anchor-position/position-try-fallbacks-003.html.ini @@ -1,20 +1,3 @@ [position-try-fallbacks-003.html] - [initial position] - expected: - FAIL - - [scroll to 100] - expected: - FAIL - - [scroll to 101] - expected: FAIL - - [scroll back to 100] - expected: FAIL - - [redisplay at 100] - expected: FAIL - [scroll back to 0] expected: FAIL diff --git a/testing/web-platform/meta/css/css-anchor-position/position-visibility-remove-no-overflow.html.ini b/testing/web-platform/meta/css/css-anchor-position/position-visibility-remove-no-overflow.html.ini @@ -1,2 +0,0 @@ -[position-visibility-remove-no-overflow.html] - expected: FAIL diff --git a/testing/web-platform/meta/css/css-anchor-position/scroll-to-anchored-fixed-004.html.ini b/testing/web-platform/meta/css/css-anchor-position/scroll-to-anchored-fixed-004.html.ini @@ -1,3 +1,4 @@ [scroll-to-anchored-fixed-004.html] expected: if (os == "android"): [PASS,FAIL] + FAIL diff --git a/testing/web-platform/meta/css/css-anchor-position/scroll-to-anchored-fixed-006.html.ini b/testing/web-platform/meta/css/css-anchor-position/scroll-to-anchored-fixed-006.html.ini @@ -1,3 +1,4 @@ [scroll-to-anchored-fixed-006.html] expected: if (os == "android"): [PASS,FAIL] + FAIL