diff options
author | yoz@chromium.org <yoz@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-07-21 21:32:58 +0000 |
---|---|---|
committer | yoz@chromium.org <yoz@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-07-21 21:32:58 +0000 |
commit | b16fc2e17f05ba5d285329559a4e352f9f689374 (patch) | |
tree | de60120771efe9df3e7eb789e2c92cd2720dbcef | |
parent | ba25bb107b348f1b4057fe10759695f3a4aecf5f (diff) | |
download | chromium_src-b16fc2e17f05ba5d285329559a4e352f9f689374.zip chromium_src-b16fc2e17f05ba5d285329559a4e352f9f689374.tar.gz chromium_src-b16fc2e17f05ba5d285329559a4e352f9f689374.tar.bz2 |
Make file browser event router owned by the ExtensionService instead of a singleton.
Originally was a part of http://codereview.chromium.org/7243012/
BUG=81745
TEST=covered by existing FileSystemExtensionApiTest tests
Review URL: http://codereview.chromium.org/7460005
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@93475 0039d316-1c4b-4281-b951-d872f2087c98
5 files changed, 41 insertions, 54 deletions
diff --git a/chrome/browser/chromeos/extensions/file_browser_event_router.cc b/chrome/browser/chromeos/extensions/file_browser_event_router.cc index d78b176..df0d61e 100644 --- a/chrome/browser/chromeos/extensions/file_browser_event_router.cc +++ b/chrome/browser/chromeos/extensions/file_browser_event_router.cc @@ -5,7 +5,6 @@ #include "chrome/browser/chromeos/extensions/file_browser_event_router.h" #include "base/json/json_writer.h" -#include "base/memory/singleton.h" #include "base/stl_util.h" #include "base/values.h" #include "chrome/browser/chromeos/cros/cros_library.h" @@ -55,17 +54,20 @@ DictionaryValue* DiskToDictionaryValue( return result; } -ExtensionFileBrowserEventRouter::ExtensionFileBrowserEventRouter() - : delegate_(new ExtensionFileBrowserEventRouter::FileWatcherDelegate()), - profile_(NULL) { +ExtensionFileBrowserEventRouter::ExtensionFileBrowserEventRouter( + Profile* profile) + : delegate_(new ExtensionFileBrowserEventRouter::FileWatcherDelegate(this)), + profile_(profile) { } ExtensionFileBrowserEventRouter::~ExtensionFileBrowserEventRouter() { DCHECK(file_watchers_.empty()); STLDeleteValues(&file_watchers_); - if (!profile_) + if (!profile_) { + NOTREACHED(); return; + } if (!chromeos::CrosLibrary::Get()->EnsureLoaded()) return; chromeos::MountLibrary* lib = @@ -74,17 +76,11 @@ ExtensionFileBrowserEventRouter::~ExtensionFileBrowserEventRouter() { profile_ = NULL; } -// static -ExtensionFileBrowserEventRouter* - ExtensionFileBrowserEventRouter::GetInstance() { - return Singleton<ExtensionFileBrowserEventRouter>::get(); -} - -void ExtensionFileBrowserEventRouter::ObserveFileSystemEvents( - Profile* profile) { - if (!profile) +void ExtensionFileBrowserEventRouter::ObserveFileSystemEvents() { + if (!profile_) { + NOTREACHED(); return; - profile_ = profile; + } if (!chromeos::CrosLibrary::Get()->EnsureLoaded()) return; if (chromeos::UserManager::Get()->user_is_logged_in()) { @@ -133,17 +129,6 @@ void ExtensionFileBrowserEventRouter::RemoveFileWatch( } } -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) { @@ -361,7 +346,8 @@ ExtensionFileBrowserEventRouter::NotificationMap::iterator // ExtensionFileBrowserEventRouter::WatcherDelegate methods. -ExtensionFileBrowserEventRouter::FileWatcherDelegate::FileWatcherDelegate() { +ExtensionFileBrowserEventRouter::FileWatcherDelegate::FileWatcherDelegate( + ExtensionFileBrowserEventRouter* router) : router_(router) { } void ExtensionFileBrowserEventRouter::FileWatcherDelegate::OnFilePathChanged( @@ -387,6 +373,5 @@ void ExtensionFileBrowserEventRouter::FileWatcherDelegate::OnFilePathError( void ExtensionFileBrowserEventRouter::FileWatcherDelegate::HandleFileWatchOnUIThread( const FilePath& local_path, bool got_error) { - ExtensionFileBrowserEventRouter::GetInstance()->HandleFileWatchNotification( - local_path, got_error); + router_->HandleFileWatchNotification(local_path, got_error); } diff --git a/chrome/browser/chromeos/extensions/file_browser_event_router.h b/chrome/browser/chromeos/extensions/file_browser_event_router.h index ebe4eba..fb8047d 100644 --- a/chrome/browser/chromeos/extensions/file_browser_event_router.h +++ b/chrome/browser/chromeos/extensions/file_browser_event_router.h @@ -28,12 +28,11 @@ class SystemNotification; class ExtensionFileBrowserEventRouter : public chromeos::MountLibrary::Observer { public: - static ExtensionFileBrowserEventRouter* GetInstance(); - - // Starts/stops observing file system change events. Currently only + explicit ExtensionFileBrowserEventRouter(Profile* profile); + virtual ~ExtensionFileBrowserEventRouter(); + // Starts observing file system change events. Currently only // MountLibrary events are being observed. - void ObserveFileSystemEvents(Profile* profile); - void StopObservingFileSystemEvents(); + void ObserveFileSystemEvents(); // File watch setup routines. bool AddFileWatch(const FilePath& file_path, @@ -44,12 +43,11 @@ class ExtensionFileBrowserEventRouter // MountLibrary::Observer overrides. virtual void DiskChanged(chromeos::MountLibraryEventType event, - const chromeos::MountLibrary::Disk* disk); + const chromeos::MountLibrary::Disk* disk) OVERRIDE; virtual void DeviceChanged(chromeos::MountLibraryEventType event, - const std::string& device_path); + const std::string& device_path) OVERRIDE; private: - friend struct DefaultSingletonTraits<ExtensionFileBrowserEventRouter>; typedef std::map<std::string, linked_ptr<chromeos::SystemNotification> > NotificationMap; typedef std::map<std::string, std::string> MountPointMap; @@ -70,7 +68,7 @@ class ExtensionFileBrowserEventRouter // Helper class for passing through file watch notification events. class FileWatcherDelegate : public base::files::FilePathWatcher::Delegate { public: - FileWatcherDelegate(); + explicit FileWatcherDelegate(ExtensionFileBrowserEventRouter* router); private: // base::files::FilePathWatcher::Delegate overrides. @@ -78,10 +76,9 @@ class ExtensionFileBrowserEventRouter virtual void OnFilePathError(const FilePath& path) OVERRIDE; void HandleFileWatchOnUIThread(const FilePath& local_path, bool got_error); - }; - ExtensionFileBrowserEventRouter(); - virtual ~ExtensionFileBrowserEventRouter(); + ExtensionFileBrowserEventRouter* router_; + }; // USB mount event handlers. void OnDiskAdded(const chromeos::MountLibrary::Disk* disk); diff --git a/chrome/browser/extensions/extension_file_browser_private_api.cc b/chrome/browser/extensions/extension_file_browser_private_api.cc index 7d0622c..3f0cb0e 100644 --- a/chrome/browser/extensions/extension_file_browser_private_api.cc +++ b/chrome/browser/extensions/extension_file_browser_private_api.cc @@ -479,15 +479,15 @@ void FileWatchBrowserFunctionBase::RunFileWatchOperationOnFileThread( bool AddFileWatchBrowserFunction::PerformFileWatchOperation( const FilePath& local_path, const FilePath& virtual_path, const std::string& extension_id) { - return ExtensionFileBrowserEventRouter::GetInstance()->AddFileWatch( - local_path, virtual_path, extension_id); + return profile_->GetExtensionService()->file_browser_event_router()-> + AddFileWatch(local_path, virtual_path, extension_id); } bool RemoveFileWatchBrowserFunction::PerformFileWatchOperation( const FilePath& local_path, const FilePath& unused, const std::string& extension_id) { - ExtensionFileBrowserEventRouter::GetInstance()->RemoveFileWatch( - local_path, extension_id); + profile_->GetExtensionService()->file_browser_event_router()-> + RemoveFileWatch(local_path, extension_id); return true; } diff --git a/chrome/browser/extensions/extension_service.cc b/chrome/browser/extensions/extension_service.cc index 6afe4ce..c2aab1e 100644 --- a/chrome/browser/extensions/extension_service.cc +++ b/chrome/browser/extensions/extension_service.cc @@ -646,13 +646,6 @@ ExtensionService::~ExtensionService() { ExternalExtensionProviderInterface* provider = i->get(); provider->ServiceShutdown(); } - -#if defined(OS_CHROMEOS) - if (event_routers_initialized_) { - ExtensionFileBrowserEventRouter::GetInstance()-> - StopObservingFileSystemEvents(); - } -#endif } void ExtensionService::InitEventRouters() { @@ -678,8 +671,9 @@ void ExtensionService::InitEventRouters() { web_navigation_event_router_->Init(); #if defined(OS_CHROMEOS) - ExtensionFileBrowserEventRouter::GetInstance()->ObserveFileSystemEvents( - profile_); + file_browser_event_router_.reset( + new ExtensionFileBrowserEventRouter(profile_)); + file_browser_event_router_->ObserveFileSystemEvents(); // Lazy initialization. chromeos::ExtensionInputMethodEventRouter::GetInstance(); diff --git a/chrome/browser/extensions/extension_service.h b/chrome/browser/extensions/extension_service.h index 491a80a..4c74f0a 100644 --- a/chrome/browser/extensions/extension_service.h +++ b/chrome/browser/extensions/extension_service.h @@ -44,6 +44,7 @@ class ExtensionBookmarkEventRouter; class ExtensionBrowserEventRouter; class ExtensionContentSettingsStore; class ExtensionCookiesEventRouter; +class ExtensionFileBrowserEventRouter; class ExtensionHistoryEventRouter; class ExtensionInstallUI; class ExtensionManagementEventRouter; @@ -471,6 +472,12 @@ class ExtensionService return browser_event_router_.get(); } +#if defined(OS_CHROMEOS) + ExtensionFileBrowserEventRouter* file_browser_event_router() { + return file_browser_event_router_.get(); + } +#endif + // Notify the frontend that there was an error loading an extension. // This method is public because ExtensionServiceBackend can post to here. void ReportExtensionLoadError(const FilePath& extension_path, @@ -729,6 +736,10 @@ class ExtensionService 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. |