Bug 1700370 - Don't use ScreenManager after shutdown phase is started. r=gsvelto

When terminating Firefox, if OS notifies screen change, Firefox seems to crash
according to crash data.

So we should consider this situation.

Differential Revision: https://phabricator.services.mozilla.com/D133058
This commit is contained in:
Makoto Kato 2021-12-09 12:13:28 +00:00
Родитель 42a0c93ddc
Коммит 4d166f2519
7 изменённых файлов: 19 добавлений и 13 удалений

Просмотреть файл

@ -44,7 +44,17 @@ void ScreenManager::SetHelper(UniquePtr<Helper> aHelper) {
mHelper = std::move(aHelper);
}
// static
void ScreenManager::Refresh(nsTArray<RefPtr<Screen>>&& 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<RefPtr<Screen>>&& aScreens) {
MOZ_LOG(sScreenLog, LogLevel::Debug, ("Refresh screens"));
mScreenList = std::move(aScreens);

Просмотреть файл

@ -39,7 +39,7 @@ class ScreenManager final : public nsIScreenManager {
static already_AddRefed<ScreenManager> GetAddRefedSingleton();
void SetHelper(UniquePtr<Helper> aHelper);
void Refresh(nsTArray<RefPtr<Screen>>&& aScreens);
static void Refresh(nsTArray<RefPtr<Screen>>&& aScreens);
void Refresh(nsTArray<mozilla::dom::ScreenDetails>&& aScreens);
void CopyScreensToRemote(mozilla::dom::ContentParent* aContentParent);
@ -47,6 +47,7 @@ class ScreenManager final : public nsIScreenManager {
ScreenManager();
virtual ~ScreenManager();
void RefreshInternal(nsTArray<RefPtr<Screen>>&& aScreens);
template <class Range>
void CopyScreensToRemoteRange(Range aRemoteRange);
void CopyScreensToAllRemotesIfIsParent();

Просмотреть файл

@ -63,8 +63,8 @@ void ScreenHelperAndroid::Refresh() {
mScreens.InsertOrUpdate(0, std::move(screen));
}
ScreenManager& manager = ScreenManager::GetSingleton();
manager.Refresh(ToTArray<AutoTArray<RefPtr<Screen>, 1>>(mScreens.Values()));
ScreenManager::Refresh(
ToTArray<AutoTArray<RefPtr<Screen>, 1>>(mScreens.Values()));
}
already_AddRefed<Screen> ScreenHelperAndroid::ScreenForId(uint32_t aScreenId) {

Просмотреть файл

@ -123,8 +123,7 @@ void ScreenHelperCocoa::RefreshScreens() {
screens.AppendElement(MakeScreen(screen));
}
ScreenManager& screenManager = ScreenManager::GetSingleton();
screenManager.Refresh(std::move(screens));
ScreenManager::Refresh(std::move(screens));
NS_OBJC_END_TRY_IGNORE_BLOCK;
}

Просмотреть файл

@ -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) {

Просмотреть файл

@ -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

Просмотреть файл

@ -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