Skip to content

Commit

Permalink
Bug 1700370 - Don't use ScreenManager after shutdown phase is started…
Browse files Browse the repository at this point in the history
…. 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
  • Loading branch information
makotokato committed Dec 9, 2021
1 parent fa73449 commit e90f9a6
Show file tree
Hide file tree
Showing 7 changed files with 19 additions and 13 deletions.
10 changes: 10 additions & 0 deletions widget/ScreenManager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
3 changes: 2 additions & 1 deletion widget/ScreenManager.h
Original file line number Diff line number Diff line change
Expand Up @@ -39,14 +39,15 @@ 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);

private:
ScreenManager();
virtual ~ScreenManager();

void RefreshInternal(nsTArray<RefPtr<Screen>>&& aScreens);
template <class Range>
void CopyScreensToRemoteRange(Range aRemoteRange);
void CopyScreensToAllRemotesIfIsParent();
Expand Down
4 changes: 2 additions & 2 deletions widget/android/ScreenHelperAndroid.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down
3 changes: 1 addition & 2 deletions widget/cocoa/ScreenHelperCocoa.mm
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
Expand Down
6 changes: 2 additions & 4 deletions widget/gtk/ScreenHelperGTK.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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) {
Expand Down
3 changes: 1 addition & 2 deletions widget/headless/HeadlessScreenHelper.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
3 changes: 1 addition & 2 deletions widget/windows/ScreenHelperWin.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down

0 comments on commit e90f9a6

Please sign in to comment.