зеркало из https://github.com/mozilla/gecko-dev.git
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:
Родитель
42a0c93ddc
Коммит
4d166f2519
|
@ -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
|
||||
|
|
Загрузка…
Ссылка в новой задаче