From 4c41f32a2751c975ede6056627c8281dd4cf5c30 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Tue, 25 Jan 2022 21:31:43 +0000 Subject: [PATCH] Bug 1749531 - Manage native theme lifetime from Theme.cpp. r=mstange Differential Revision: https://phabricator.services.mozilla.com/D136127 --- gfx/src/nsITheme.h | 7 ++++++ widget/Theme.cpp | 38 +++++++++++++++++------------ widget/cocoa/nsNativeThemeCocoa.mm | 11 ++------- widget/gtk/nsNativeThemeGTK.cpp | 16 +++--------- widget/windows/nsNativeThemeWin.cpp | 11 ++------- 5 files changed, 38 insertions(+), 45 deletions(-) diff --git a/gfx/src/nsITheme.h b/gfx/src/nsITheme.h index 52e36504615c..8384f0f728a3 100644 --- a/gfx/src/nsITheme.h +++ b/gfx/src/nsITheme.h @@ -32,6 +32,9 @@ namespace layers { class StackingContextHelper; class RenderRootStateManager; } // namespace layers +namespace widget { +class Theme; +} // namespace widget namespace wr { class DisplayListBuilder; class IpcResourceUpdateQueue; @@ -268,4 +271,8 @@ extern already_AddRefed do_GetNativeThemeDoNotUseDirectly(); extern already_AddRefed do_GetBasicNativeThemeDoNotUseDirectly(); extern already_AddRefed do_GetRDMThemeDoNotUseDirectly(); +// Native theme creation function, these should never return null. +extern already_AddRefed +do_CreateNativeThemeDoNotUseDirectly(); + #endif diff --git a/widget/Theme.cpp b/widget/Theme.cpp index 360ff75d1dd3..fc4bb724e91e 100644 --- a/widget/Theme.cpp +++ b/widget/Theme.cpp @@ -107,30 +107,39 @@ struct MOZ_RAII AutoClipRect { DrawTarget& mDt; }; -static StaticRefPtr gInstance; -static StaticRefPtr gRDMInstance; +static StaticRefPtr gNativeInstance; +static StaticRefPtr gNonNativeInstance; +static StaticRefPtr gRDMInstance; } // namespace +#ifdef ANDROID +already_AddRefed do_CreateNativeThemeDoNotUseDirectly() { + // Android doesn't have a native theme. + return do_AddRef(new Theme(Theme::ScrollbarStyle())); +} +#endif + already_AddRefed do_GetBasicNativeThemeDoNotUseDirectly() { - if (MOZ_UNLIKELY(!gInstance)) { + if (MOZ_UNLIKELY(!gNonNativeInstance)) { UniquePtr scrollbarDrawing = Theme::ScrollbarStyle(); #ifdef MOZ_WIDGET_COCOA - gInstance = new ThemeCocoa(std::move(scrollbarDrawing)); + gNonNativeInstance = new ThemeCocoa(std::move(scrollbarDrawing)); #else - gInstance = new Theme(std::move(scrollbarDrawing)); + gNonNativeInstance = new Theme(std::move(scrollbarDrawing)); #endif - ClearOnShutdown(&gInstance); + ClearOnShutdown(&gNonNativeInstance); } - return do_AddRef(gInstance); + return do_AddRef(gNonNativeInstance); } -#ifdef ANDROID already_AddRefed do_GetNativeThemeDoNotUseDirectly() { - // Android doesn't have a native theme. - return do_GetBasicNativeThemeDoNotUseDirectly(); + if (MOZ_UNLIKELY(!gNativeInstance)) { + gNativeInstance = do_CreateNativeThemeDoNotUseDirectly(); + ClearOnShutdown(&gNativeInstance); + } + return do_AddRef(gNativeInstance); } -#endif already_AddRefed do_GetRDMThemeDoNotUseDirectly() { if (MOZ_UNLIKELY(!gRDMInstance)) { @@ -167,10 +176,9 @@ void Theme::Shutdown() { /* static */ void Theme::LookAndFeelChanged() { ThemeColors::RecomputeAccentColors(); - auto* basicTheme = static_cast(gInstance.get()); - if (basicTheme) { - basicTheme->SetScrollbarDrawing(Theme::ScrollbarStyle()); - basicTheme->GetScrollbarDrawing().RecomputeScrollbarParams(); + if (gNonNativeInstance) { + gNonNativeInstance->SetScrollbarDrawing(Theme::ScrollbarStyle()); + gNonNativeInstance->GetScrollbarDrawing().RecomputeScrollbarParams(); } } diff --git a/widget/cocoa/nsNativeThemeCocoa.mm b/widget/cocoa/nsNativeThemeCocoa.mm index 5c2875079d05..78592df24b0e 100644 --- a/widget/cocoa/nsNativeThemeCocoa.mm +++ b/widget/cocoa/nsNativeThemeCocoa.mm @@ -3644,13 +3644,6 @@ nsITheme::Transparency nsNativeThemeCocoa::GetWidgetTransparency(nsIFrame* aFram } } -already_AddRefed do_GetNativeThemeDoNotUseDirectly() { - static nsCOMPtr inst; - - if (!inst) { - inst = new nsNativeThemeCocoa(MakeUnique()); - ClearOnShutdown(&inst); - } - - return do_AddRef(inst); +already_AddRefed do_CreateNativeThemeDoNotUseDirectly() { + return do_AddRef(new nsNativeThemeCocoa(MakeUnique())); } diff --git a/widget/gtk/nsNativeThemeGTK.cpp b/widget/gtk/nsNativeThemeGTK.cpp index eb9560459e1c..11df4735b60e 100644 --- a/widget/gtk/nsNativeThemeGTK.cpp +++ b/widget/gtk/nsNativeThemeGTK.cpp @@ -1668,17 +1668,9 @@ nsITheme::Transparency nsNativeThemeGTK::GetWidgetTransparency( } } -already_AddRefed do_GetNativeThemeDoNotUseDirectly() { - static nsCOMPtr inst; - - if (!inst) { - if (gfxPlatform::IsHeadless()) { - inst = new Theme(Theme::DefaultPlatformScrollbarStyle()); - } else { - inst = new nsNativeThemeGTK(); - } - ClearOnShutdown(&inst); +already_AddRefed do_CreateNativeThemeDoNotUseDirectly() { + if (gfxPlatform::IsHeadless()) { + return do_AddRef(new Theme(Theme::DefaultPlatformScrollbarStyle())); } - - return do_AddRef(inst); + return do_AddRef(new nsNativeThemeGTK()); } diff --git a/widget/windows/nsNativeThemeWin.cpp b/widget/windows/nsNativeThemeWin.cpp index e7dd23ac511c..7f34447c0278 100644 --- a/widget/windows/nsNativeThemeWin.cpp +++ b/widget/windows/nsNativeThemeWin.cpp @@ -3662,13 +3662,6 @@ uint32_t nsNativeThemeWin::GetWidgetNativeDrawingFlags( // Creation Routine /////////////////////////////////////////// -already_AddRefed do_GetNativeThemeDoNotUseDirectly() { - static nsCOMPtr inst; - - if (!inst) { - inst = new nsNativeThemeWin(); - ClearOnShutdown(&inst); - } - - return do_AddRef(inst); +already_AddRefed do_CreateNativeThemeDoNotUseDirectly() { + return do_AddRef(new nsNativeThemeWin()); }