tor-browser

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

commit b5ac7753b2fa5c3b8dc7294acec0b906d995e791
parent 1e00d9deee01443f17a61406f8dca13ddf7cecab
Author: Emilio Cobos Álvarez <emilio@crisal.io>
Date:   Tue, 11 Nov 2025 22:42:32 +0000

Bug 1998572 - Ensure masks/clip-path isolate for backdrop-filter if needed. r=gw

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

Diffstat:
Mlayout/generic/nsIFrame.cpp | 8++++----
Mlayout/painting/nsDisplayList.cpp | 11++++++++---
Mlayout/painting/nsDisplayList.h | 8+++++---
Mtesting/web-platform/meta/css/filter-effects/backdrop-filter-backdrop-root-clip-path-2.html.ini | 4+++-
Dtesting/web-platform/meta/css/filter-effects/backdrop-filter-backdrop-root-clip-path.html.ini | 5-----
5 files changed, 20 insertions(+), 16 deletions(-)

diff --git a/layout/generic/nsIFrame.cpp b/layout/generic/nsIFrame.cpp @@ -3583,14 +3583,15 @@ void nsIFrame::BuildDisplayListForStackingContext( // We don't need to isolate the root frame. return reasons; } - // Elements with a view-transition name also form a backdrop-root. + // Elements with a view-transition name also form a backdrop-root. Same for + // masks / clip-path. // See https://www.w3.org/TR/css-view-transitions-1/#named-and-transitioning // and https://github.com/w3c/csswg-drafts/issues/11772 const bool hasViewTransitionName = style.StyleUIReset()->HasViewTransitionName() && !style.IsRootElementStyle(); if ((disp->mWillChange.bits & StyleWillChangeBits::BACKDROP_ROOT) || - hasViewTransitionName) { + hasViewTransitionName || usingMask) { reasons |= StackingContextBits::ContainsBackdropFilter; } if (!combines3DTransformWithAncestors) { @@ -3686,9 +3687,8 @@ void nsIFrame::BuildDisplayListForStackingContext( clipForMask.isSome() ? nsDisplayItem::ContainerASRType::Constant : nsDisplayItem::ContainerASRType::AncestorOfContained, - usingBackdropFilter); + usingBackdropFilter, ShouldForceIsolation()); createdContainer = true; - MarkAsIsolated(); } // TODO(miko): We could probably create a wraplist here and avoid creating diff --git a/layout/painting/nsDisplayList.cpp b/layout/painting/nsDisplayList.cpp @@ -8130,10 +8130,12 @@ static void ComputeMaskGeometry(PaintFramesParams& aParams) { nsDisplayMasksAndClipPaths::nsDisplayMasksAndClipPaths( nsDisplayListBuilder* aBuilder, nsIFrame* aFrame, nsDisplayList* aList, const ActiveScrolledRoot* aActiveScrolledRoot, - ContainerASRType aContainerASRType, bool aWrapsBackdropFilter) + ContainerASRType aContainerASRType, bool aWrapsBackdropFilter, + bool aForceIsolation) : nsDisplayEffectsBase(aBuilder, aFrame, aList, aActiveScrolledRoot, - aContainerASRType, true), - mWrapsBackdropFilter(aWrapsBackdropFilter) { + aContainerASRType, /* aClearClipChain = */ true), + mWrapsBackdropFilter(aWrapsBackdropFilter), + mForceIsolation(aForceIsolation) { MOZ_COUNT_CTOR(nsDisplayMasksAndClipPaths); nsPresContext* presContext = mFrame->PresContext(); @@ -8452,6 +8454,9 @@ bool nsDisplayMasksAndClipPaths::CreateWebRenderCommands( wr::StackingContextParams params; params.clip = wr::WrStackingContextClip::ClipChain(clip->id); params.opacity = opacity.ptrOr(nullptr); + if (mForceIsolation) { + params.flags |= wr::StackingContextFlags::FORCED_ISOLATION; + } if (mWrapsBackdropFilter) { params.flags |= wr::StackingContextFlags::WRAPS_BACKDROP_FILTER; } diff --git a/layout/painting/nsDisplayList.h b/layout/painting/nsDisplayList.h @@ -6092,12 +6092,13 @@ class nsDisplayMasksAndClipPaths final : public nsDisplayEffectsBase { nsDisplayList* aList, const ActiveScrolledRoot* aActiveScrolledRoot, ContainerASRType aContainerASRType, - bool aWrapsBackdropFilter); + bool aWrapsBackdropFilter, bool aForceIsolation); nsDisplayMasksAndClipPaths(nsDisplayListBuilder* aBuilder, const nsDisplayMasksAndClipPaths& aOther) : nsDisplayEffectsBase(aBuilder, aOther), mDestRects(aOther.mDestRects.Clone()), - mWrapsBackdropFilter(aOther.mWrapsBackdropFilter) { + mWrapsBackdropFilter(aOther.mWrapsBackdropFilter), + mForceIsolation(aOther.mForceIsolation) { MOZ_COUNT_CTOR(nsDisplayMasksAndClipPaths); } @@ -6162,7 +6163,8 @@ class nsDisplayMasksAndClipPaths final : public nsDisplayEffectsBase { NS_DISPLAY_ALLOW_CLONING() nsTArray<nsRect> mDestRects; - bool mWrapsBackdropFilter; + bool mWrapsBackdropFilter : 1; + bool mForceIsolation : 1; }; class nsDisplayBackdropFilters final : public nsDisplayWrapList { diff --git a/testing/web-platform/meta/css/filter-effects/backdrop-filter-backdrop-root-clip-path-2.html.ini b/testing/web-platform/meta/css/filter-effects/backdrop-filter-backdrop-root-clip-path-2.html.ini @@ -1,2 +1,4 @@ [backdrop-filter-backdrop-root-clip-path-2.html] - expected: FAIL + expected: + if useDrawSnapshot: FAIL + PASS diff --git a/testing/web-platform/meta/css/filter-effects/backdrop-filter-backdrop-root-clip-path.html.ini b/testing/web-platform/meta/css/filter-effects/backdrop-filter-backdrop-root-clip-path.html.ini @@ -1,5 +0,0 @@ -[backdrop-filter-backdrop-root-clip-path.html] - expected: - if (os == "win") and not debug: [PASS, FAIL] - if useDrawSnapshot: PASS - FAIL