tor-browser

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

commit ffcccf0867788adb5400d4511f5a050ff5acdd98
parent 555cad41c3fda6f8f89b32b116f40710c62a2baf
Author: Emilio Cobos Álvarez <emilio@crisal.io>
Date:   Mon, 29 Dec 2025 20:44:06 +0000

Bug 2007185 - Implement StyleImage::IsOpaque() using switch. r=layout-reviewers,firefox-style-system-reviewers,boris

So that it's harder to miss a variant.

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

Diffstat:
Mlayout/style/nsStyleStruct.cpp | 76++++++++++++++++++++++++++++++++++++++++++++++------------------------------
1 file changed, 46 insertions(+), 30 deletions(-)

diff --git a/layout/style/nsStyleStruct.cpp b/layout/style/nsStyleStruct.cpp @@ -1607,41 +1607,57 @@ static bool GradientItemsAreOpaque( template <> bool StyleGradient::IsOpaque() const { - if (IsLinear()) { - return GradientItemsAreOpaque(AsLinear().items.AsSpan()); - } - if (IsRadial()) { - return GradientItemsAreOpaque(AsRadial().items.AsSpan()); - } - return GradientItemsAreOpaque(AsConic().items.AsSpan()); + switch (tag) { + case Tag::Linear: + return GradientItemsAreOpaque(AsLinear().items.AsSpan()); + case Tag::Radial: + return GradientItemsAreOpaque(AsRadial().items.AsSpan()); + case Tag::Conic: + return GradientItemsAreOpaque(AsConic().items.AsSpan()); + } + MOZ_ASSERT_UNREACHABLE("Unexpected gradient type"); + return false; } template <> bool StyleImage::IsOpaque() const { - if (IsImageSet()) { - return FinalImage().IsOpaque(); - } - - if (!IsComplete()) { - return false; - } - - if (IsGradient()) { - return AsGradient()->IsOpaque(); - } - - if (IsElement() || IsMozSymbolicIcon()) { - return false; + switch (tag) { + case Tag::ImageSet: + return FinalImage().IsOpaque(); + case Tag::Gradient: + return AsGradient()->IsOpaque(); + case Tag::Url: { + if (!IsComplete()) { + return false; + } + MOZ_ASSERT(GetImageRequest(), "should've returned earlier above"); + nsCOMPtr<imgIContainer> imageContainer; + GetImageRequest()->GetImage(getter_AddRefs(imageContainer)); + MOZ_ASSERT(imageContainer, "IsComplete() said image container is ready"); + return imageContainer->WillDrawOpaqueNow(); + } + case Tag::CrossFade: + for (const auto& el : AsCrossFade()->elements.AsSpan()) { + if (el.image.IsColor()) { + if (el.image.AsColor().MaybeTransparent()) { + return false; + } + continue; + } + MOZ_ASSERT(el.image.IsImage()); + if (!el.image.AsImage().IsOpaque()) { + return false; + } + } + return true; + case Tag::LightDark: + MOZ_FALLTHROUGH_ASSERT("Should be computed already"); + case Tag::Element: + case Tag::MozSymbolicIcon: + case Tag::None: + break; } - - MOZ_ASSERT(IsImageRequestType(), "unexpected image type"); - MOZ_ASSERT(GetImageRequest(), "should've returned earlier above"); - - nsCOMPtr<imgIContainer> imageContainer; - GetImageRequest()->GetImage(getter_AddRefs(imageContainer)); - MOZ_ASSERT(imageContainer, "IsComplete() said image container is ready"); - - return imageContainer->WillDrawOpaqueNow(); + return false; } template <>