Fix compile on ChromeOS. Revert "File browser: de-singleton"

This reverts commit 7db4f5b43aba588022cbc3c182f539da8cdbfa03.

BUG=none
TEST=none
TBR=asargent

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@90482 0039d316-1c4b-4281-b951-d872f2087c98
diff --git a/chrome/browser/chromeos/extensions/file_browser_event_router.cc b/chrome/browser/chromeos/extensions/file_browser_event_router.cc
index 121cd7cb..64d46d2 100644
--- a/chrome/browser/chromeos/extensions/file_browser_event_router.cc
+++ b/chrome/browser/chromeos/extensions/file_browser_event_router.cc
@@ -55,10 +55,9 @@
   return result;
 }
 
-ExtensionFileBrowserEventRouter::ExtensionFileBrowserEventRouter(
-    Profile* profile)
+ExtensionFileBrowserEventRouter::ExtensionFileBrowserEventRouter()
     : delegate_(new ExtensionFileBrowserEventRouter::FileWatcherDelegate()),
-      profile_(profile) {
+      profile_(NULL) {
 }
 
 ExtensionFileBrowserEventRouter::~ExtensionFileBrowserEventRouter() {
@@ -74,13 +73,20 @@
   chromeos::MountLibrary* lib =
       chromeos::CrosLibrary::Get()->GetMountLibrary();
   lib->RemoveObserver(this);
+  profile_ = NULL;
 }
 
-void ExtensionFileBrowserEventRouter::Init() {
-  if (!profile_) {
-    NOTREACHED();
+// static
+ExtensionFileBrowserEventRouter*
+  ExtensionFileBrowserEventRouter::GetInstance() {
+  return Singleton<ExtensionFileBrowserEventRouter>::get();
+}
+
+void ExtensionFileBrowserEventRouter::ObserveFileSystemEvents(
+    Profile* profile) {
+  if (!profile)
     return;
-  }
+  profile_ = profile;
   if (!chromeos::CrosLibrary::Get()->EnsureLoaded())
     return;
   if (chromeos::UserManager::Get()->user_is_logged_in()) {
@@ -129,6 +135,17 @@
   }
 }
 
+void ExtensionFileBrowserEventRouter::StopObservingFileSystemEvents() {
+  if (!profile_)
+    return;
+  if (!chromeos::CrosLibrary::Get()->EnsureLoaded())
+    return;
+  chromeos::MountLibrary* lib =
+      chromeos::CrosLibrary::Get()->GetMountLibrary();
+  lib->RemoveObserver(this);
+  profile_ = NULL;
+}
+
 void ExtensionFileBrowserEventRouter::DiskChanged(
     chromeos::MountLibraryEventType event,
     const chromeos::MountLibrary::Disk* disk) {
diff --git a/chrome/browser/chromeos/extensions/file_browser_event_router.h b/chrome/browser/chromeos/extensions/file_browser_event_router.h
index 71f97193..ebe4ebaa 100644
--- a/chrome/browser/chromeos/extensions/file_browser_event_router.h
+++ b/chrome/browser/chromeos/extensions/file_browser_event_router.h
@@ -28,10 +28,12 @@
 class ExtensionFileBrowserEventRouter
     : public chromeos::MountLibrary::Observer {
  public:
-  explicit ExtensionFileBrowserEventRouter(Profile* profile);
-  virtual ~ExtensionFileBrowserEventRouter();
+  static ExtensionFileBrowserEventRouter* GetInstance();
 
-  void Init();
+  // Starts/stops observing file system change events. Currently only
+  // MountLibrary events are being observed.
+  void ObserveFileSystemEvents(Profile* profile);
+  void StopObservingFileSystemEvents();
 
   // File watch setup routines.
   bool AddFileWatch(const FilePath& file_path,
@@ -47,6 +49,7 @@
                              const std::string& device_path);
 
  private:
+  friend struct DefaultSingletonTraits<ExtensionFileBrowserEventRouter>;
   typedef std::map<std::string, linked_ptr<chromeos::SystemNotification> >
       NotificationMap;
   typedef std::map<std::string, std::string> MountPointMap;
@@ -77,6 +80,9 @@
     void HandleFileWatchOnUIThread(const FilePath& local_path, bool got_error);
   };
 
+  ExtensionFileBrowserEventRouter();
+  virtual ~ExtensionFileBrowserEventRouter();
+
   // USB mount event handlers.
   void OnDiskAdded(const chromeos::MountLibrary::Disk* disk);
   void OnDiskRemoved(const chromeos::MountLibrary::Disk* disk);
diff --git a/chrome/browser/extensions/extension_service.cc b/chrome/browser/extensions/extension_service.cc
index 1a65255..f734a66 100644
--- a/chrome/browser/extensions/extension_service.cc
+++ b/chrome/browser/extensions/extension_service.cc
@@ -645,6 +645,13 @@
     ExternalExtensionProviderInterface* provider = i->get();
     provider->ServiceShutdown();
   }
+
+#if defined(OS_CHROMEOS)
+  if (event_routers_initialized_) {
+    ExtensionFileBrowserEventRouter::GetInstance()->
+        StopObservingFileSystemEvents();
+  }
+#endif
 }
 
 void ExtensionService::InitEventRouters() {
@@ -670,9 +677,9 @@
   web_navigation_event_router_->Init();
 
 #if defined(OS_CHROMEOS)
-  file_browser_event_router_.reset(
-      new ExtensionFileBrowserEventRouter(profile_));
-  file_browser_event_router_->Init();
+  ExtensionFileBrowserEventRouter::GetInstance()->ObserveFileSystemEvents(
+      profile_);
+  ExtensionMediaPlayerEventRouter::GetInstance()->Init(profile_);
 #endif
 
 #if defined(OS_CHROMEOS) && defined(TOUCH_UI)
diff --git a/chrome/browser/extensions/extension_service.h b/chrome/browser/extensions/extension_service.h
index 83ae3978..5fb3d457 100644
--- a/chrome/browser/extensions/extension_service.h
+++ b/chrome/browser/extensions/extension_service.h
@@ -43,7 +43,6 @@
 class ExtensionBrowserEventRouter;
 class ExtensionContentSettingsStore;
 class ExtensionCookiesEventRouter;
-class ExtensionFileBrowserEventRouter;
 class ExtensionHistoryEventRouter;
 class ExtensionInstallUI;
 class ExtensionManagementEventRouter;
@@ -717,10 +716,6 @@
 
   scoped_ptr<ExtensionWebNavigationEventRouter> web_navigation_event_router_;
 
-#if defined(OS_CHROMEOS)
-  scoped_ptr<ExtensionFileBrowserEventRouter> file_browser_event_router_;
-#endif
-
   // A collection of external extension providers.  Each provider reads
   // a source of external extension information.  Examples include the
   // windows registry and external_extensions.json.