diff --git a/widget/ScreenManager.cpp b/widget/ScreenManager.cpp index 7c8bab31c3af6..1bc29ab664072 100644 --- a/widget/ScreenManager.cpp +++ b/widget/ScreenManager.cpp @@ -44,7 +44,17 @@ void ScreenManager::SetHelper(UniquePtr aHelper) { mHelper = std::move(aHelper); } +// static void ScreenManager::Refresh(nsTArray>&& aScreens) { + if (PastShutdownPhase(ShutdownPhase::XPCOMShutdown)) { + // We don't refresh screen data if starting XPCOM shutdown path. + // GetSingleton returns invalid data since it is freed. + return; + } + GetSingleton().RefreshInternal(std::move(aScreens)); +} + +void ScreenManager::RefreshInternal(nsTArray>&& aScreens) { MOZ_LOG(sScreenLog, LogLevel::Debug, ("Refresh screens")); mScreenList = std::move(aScreens); diff --git a/widget/ScreenManager.h b/widget/ScreenManager.h index de8eec3be2d0f..0a75a32771f90 100644 --- a/widget/ScreenManager.h +++ b/widget/ScreenManager.h @@ -39,7 +39,7 @@ class ScreenManager final : public nsIScreenManager { static already_AddRefed GetAddRefedSingleton(); void SetHelper(UniquePtr aHelper); - void Refresh(nsTArray>&& aScreens); + static void Refresh(nsTArray>&& aScreens); void Refresh(nsTArray&& aScreens); void CopyScreensToRemote(mozilla::dom::ContentParent* aContentParent); @@ -47,6 +47,7 @@ class ScreenManager final : public nsIScreenManager { ScreenManager(); virtual ~ScreenManager(); + void RefreshInternal(nsTArray>&& aScreens); template void CopyScreensToRemoteRange(Range aRemoteRange); void CopyScreensToAllRemotesIfIsParent(); diff --git a/widget/android/ScreenHelperAndroid.cpp b/widget/android/ScreenHelperAndroid.cpp index 40544b11363c0..4df7dc900cfb1 100644 --- a/widget/android/ScreenHelperAndroid.cpp +++ b/widget/android/ScreenHelperAndroid.cpp @@ -63,8 +63,8 @@ void ScreenHelperAndroid::Refresh() { mScreens.InsertOrUpdate(0, std::move(screen)); } - ScreenManager& manager = ScreenManager::GetSingleton(); - manager.Refresh(ToTArray, 1>>(mScreens.Values())); + ScreenManager::Refresh( + ToTArray, 1>>(mScreens.Values())); } already_AddRefed ScreenHelperAndroid::ScreenForId(uint32_t aScreenId) { diff --git a/widget/cocoa/ScreenHelperCocoa.mm b/widget/cocoa/ScreenHelperCocoa.mm index 80bdde376a757..73836a57dd2c6 100644 --- a/widget/cocoa/ScreenHelperCocoa.mm +++ b/widget/cocoa/ScreenHelperCocoa.mm @@ -123,8 +123,7 @@ - (void)didChangeScreenParameters:(NSNotification*)aNotification { screens.AppendElement(MakeScreen(screen)); } - ScreenManager& screenManager = ScreenManager::GetSingleton(); - screenManager.Refresh(std::move(screens)); + ScreenManager::Refresh(std::move(screens)); NS_OBJC_END_TRY_IGNORE_BLOCK; } diff --git a/widget/gtk/ScreenHelperGTK.cpp b/widget/gtk/ScreenHelperGTK.cpp index ea9c7b57a18bc..041f8189a719a 100644 --- a/widget/gtk/ScreenHelperGTK.cpp +++ b/widget/gtk/ScreenHelperGTK.cpp @@ -208,8 +208,7 @@ void ScreenGetterGtk::RefreshScreens() { screenList.AppendElement(MakeScreenGtk(defaultScreen, i)); } - ScreenManager& screenManager = ScreenManager::GetSingleton(); - screenManager.Refresh(std::move(screenList)); + ScreenManager::Refresh(std::move(screenList)); } #ifdef MOZ_WAYLAND @@ -371,8 +370,7 @@ void ScreenGetterWayland::RefreshScreens() { managerScreenList.AppendElement(screen); } - ScreenManager& screenManager = ScreenManager::GetSingleton(); - screenManager.Refresh(std::move(managerScreenList)); + ScreenManager::Refresh(std::move(managerScreenList)); } int ScreenGetterWayland::GetMonitorForWindow(nsWindow* aWindow) { diff --git a/widget/headless/HeadlessScreenHelper.cpp b/widget/headless/HeadlessScreenHelper.cpp index 3800c9c73ab0c..5c4925eb10e42 100644 --- a/widget/headless/HeadlessScreenHelper.cpp +++ b/widget/headless/HeadlessScreenHelper.cpp @@ -36,8 +36,7 @@ HeadlessScreenHelper::HeadlessScreenHelper() { new Screen(rect, rect, 24, 24, DesktopToLayoutDeviceScale(), CSSToLayoutDeviceScale(), 96.0f); screenList.AppendElement(ret.forget()); - ScreenManager& screenManager = ScreenManager::GetSingleton(); - screenManager.Refresh(std::move(screenList)); + ScreenManager::Refresh(std::move(screenList)); } } // namespace widget diff --git a/widget/windows/ScreenHelperWin.cpp b/widget/windows/ScreenHelperWin.cpp index ff455b6c8c2dc..c77ed7a147ce1 100644 --- a/widget/windows/ScreenHelperWin.cpp +++ b/widget/windows/ScreenHelperWin.cpp @@ -81,8 +81,7 @@ void ScreenHelperWin::RefreshScreens() { if (!result) { NS_WARNING("Unable to EnumDisplayMonitors"); } - ScreenManager& screenManager = ScreenManager::GetSingleton(); - screenManager.Refresh(std::move(screens)); + ScreenManager::Refresh(std::move(screens)); } } // namespace widget