From a4a6aa18d7a69c6d10a1701130a545a7bf4b1473 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Thu, 7 Jul 2022 21:17:36 +0000 Subject: [PATCH] Bug 1778444 - Clear UISettings on shutdown. r=kaie This should be the right fix. Differential Revision: https://phabricator.services.mozilla.com/D151311 --- widget/windows/WindowsUIUtils.cpp | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/widget/windows/WindowsUIUtils.cpp b/widget/windows/WindowsUIUtils.cpp index f769e2afc6f1..9b816ec1fb70 100644 --- a/widget/windows/WindowsUIUtils.cpp +++ b/widget/windows/WindowsUIUtils.cpp @@ -14,6 +14,7 @@ #include "nsIObserverService.h" #include "nsIAppShellService.h" #include "nsAppShellCID.h" +#include "mozilla/ClearOnShutdown.h" #include "mozilla/ResultVariant.h" #include "mozilla/Services.h" #include "mozilla/StaticPrefs_widget.h" @@ -339,23 +340,25 @@ static IInspectable* GetUISettings() { #ifndef __MINGW32__ // We need to keep this alive for ~ever so that change callbacks work as // expected, sigh. - static ComPtr sUiSettingsAsInspectable; + static StaticRefPtr sUiSettingsAsInspectable; + if (!IsWin10OrLater()) { // Windows.UI.ViewManagement.UISettings is Win10+ only. return nullptr; } if (!sUiSettingsAsInspectable) { + ComPtr uiSettingsAsInspectable; ::RoActivateInstance( HStringReference(RuntimeClass_Windows_UI_ViewManagement_UISettings) .Get(), - &sUiSettingsAsInspectable); - if (NS_WARN_IF(!sUiSettingsAsInspectable)) { + &uiSettingsAsInspectable); + if (NS_WARN_IF(!uiSettingsAsInspectable)) { return nullptr; } ComPtr uiSettings5; - if (SUCCEEDED(sUiSettingsAsInspectable.As(&uiSettings5))) { + if (SUCCEEDED(uiSettingsAsInspectable.As(&uiSettings5))) { EventRegistrationToken unusedToken; auto callback = Callback>( @@ -370,7 +373,7 @@ static IInspectable* GetUISettings() { } ComPtr uiSettings2; - if (SUCCEEDED(sUiSettingsAsInspectable.As(&uiSettings2))) { + if (SUCCEEDED(uiSettingsAsInspectable.As(&uiSettings2))) { EventRegistrationToken unusedToken; auto callback = Callback>([](auto...) { @@ -384,7 +387,7 @@ static IInspectable* GetUISettings() { } ComPtr uiSettings3; - if (SUCCEEDED(sUiSettingsAsInspectable.As(&uiSettings3))) { + if (SUCCEEDED(uiSettingsAsInspectable.As(&uiSettings3))) { EventRegistrationToken unusedToken; auto callback = Callback>([](auto...) { @@ -396,9 +399,12 @@ static IInspectable* GetUISettings() { (void)NS_WARN_IF(FAILED( uiSettings3->add_ColorValuesChanged(callback.Get(), &unusedToken))); } + + sUiSettingsAsInspectable = dont_AddRef(uiSettingsAsInspectable.Detach()); + ClearOnShutdown(&sUiSettingsAsInspectable); } - return sUiSettingsAsInspectable.Get(); + return sUiSettingsAsInspectable.get(); #else return nullptr; #endif