diff --git a/widget/gonk/nsScreenManagerGonk.cpp b/widget/gonk/nsScreenManagerGonk.cpp index 7498ed76c3e5..e608db5c085c 100644 --- a/widget/gonk/nsScreenManagerGonk.cpp +++ b/widget/gonk/nsScreenManagerGonk.cpp @@ -27,6 +27,7 @@ #include "HwcComposer2D.h" #include "VsyncSource.h" #include "nsWindow.h" +#include "mozilla/ClearOnShutdown.h" #include "mozilla/layers/CompositorParent.h" #include "mozilla/Services.h" #include "mozilla/ProcessPriorityManager.h" @@ -760,19 +761,33 @@ nsScreenManagerGonk::~nsScreenManagerGonk() { } +static StaticRefPtr sScreenManagerGonk; + /* static */ already_AddRefed nsScreenManagerGonk::GetInstance() { - nsCOMPtr manager; - manager = do_GetService("@mozilla.org/gfx/screenmanager;1"); - MOZ_ASSERT(manager); - return already_AddRefed( - static_cast(manager.forget().take())); + MOZ_ASSERT(NS_IsMainThread()); + + // Avoid creating nsScreenManagerGonk from content process. + if (!XRE_IsParentProcess()) { + MOZ_CRASH("Non-chrome processes should not get here."); + } + + // Avoid creating multiple nsScreenManagerGonk instance inside main process. + if (!sScreenManagerGonk) { + sScreenManagerGonk = new nsScreenManagerGonk(); + ClearOnShutdown(&sScreenManagerGonk); + } + + RefPtr screenMgr = sScreenManagerGonk.get(); + return screenMgr.forget(); } /* static */ already_AddRefed< nsScreenGonk> nsScreenManagerGonk::GetPrimaryScreen() { + MOZ_ASSERT(NS_IsMainThread()); + RefPtr manager = nsScreenManagerGonk::GetInstance(); nsCOMPtr screen; manager->GetPrimaryScreen(getter_AddRefs(screen)); diff --git a/widget/gonk/nsWidgetFactory.cpp b/widget/gonk/nsWidgetFactory.cpp index ddd116f56620..1c7525544507 100644 --- a/widget/gonk/nsWidgetFactory.cpp +++ b/widget/gonk/nsWidgetFactory.cpp @@ -50,7 +50,7 @@ NS_GENERIC_FACTORY_CONSTRUCTOR_INIT(GfxInfo, Init) } NS_GENERIC_FACTORY_CONSTRUCTOR(nsWindow) -NS_GENERIC_FACTORY_CONSTRUCTOR(nsScreenManagerGonk) +NS_GENERIC_FACTORY_SINGLETON_CONSTRUCTOR(nsScreenManagerGonk, nsScreenManagerGonk::GetInstance) NS_GENERIC_FACTORY_CONSTRUCTOR(PuppetScreenManager) NS_GENERIC_FACTORY_CONSTRUCTOR(nsHTMLFormatConverter) NS_GENERIC_FACTORY_SINGLETON_CONSTRUCTOR(nsIdleServiceGonk, nsIdleServiceGonk::GetInstance)