diff options
author | yoz@chromium.org <yoz@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-05-26 00:09:49 +0000 |
---|---|---|
committer | yoz@chromium.org <yoz@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-05-26 00:09:49 +0000 |
commit | da55b8dd1cec219ceae19f964f7153dea3c70684 (patch) | |
tree | 21e0a2674c7f2b029cad2f4625119bf8cc0cc456 /chrome/browser/extensions | |
parent | bc68aa1aa9b8f1d812f6ad55ca7fe19ad3c1705c (diff) | |
download | chromium_src-da55b8dd1cec219ceae19f964f7153dea3c70684.zip chromium_src-da55b8dd1cec219ceae19f964f7153dea3c70684.tar.gz chromium_src-da55b8dd1cec219ceae19f964f7153dea3c70684.tar.bz2 |
Change event routers from singletons to being owned by the ExtensionService.
ExtensionService is in turn owned by the Profile.
Also stop pretending that each event router observes more than one profile. (To support multi-profile, each profile would have its own ExtensionService and routers.)
BUG=81745
TEST=covered by existing tests
Review URL: http://codereview.chromium.org/6961027
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@86750 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/extensions')
19 files changed, 124 insertions, 178 deletions
diff --git a/chrome/browser/extensions/extension_accessibility_api.cc b/chrome/browser/extensions/extension_accessibility_api.cc index cc694d1..8b8042a 100644 --- a/chrome/browser/extensions/extension_accessibility_api.cc +++ b/chrome/browser/extensions/extension_accessibility_api.cc @@ -34,20 +34,16 @@ std::string ControlInfoToJsonString(const AccessibilityControlInfo* info) { return json_args; } -ExtensionAccessibilityEventRouter* - ExtensionAccessibilityEventRouter::GetInstance() { - return Singleton<ExtensionAccessibilityEventRouter>::get(); -} - ExtensionAccessibilityEventRouter::ExtensionAccessibilityEventRouter() - : enabled_(false) {} + : enabled_(false) { +} ExtensionAccessibilityEventRouter::~ExtensionAccessibilityEventRouter() { STLDeleteElements(&on_enabled_listeners_); STLDeleteElements(&on_disabled_listeners_); } -void ExtensionAccessibilityEventRouter::ObserveProfile(Profile* profile) { +void ExtensionAccessibilityEventRouter::Init() { last_focused_control_dict_.Clear(); if (registrar_.IsEmpty()) { @@ -192,8 +188,9 @@ void ExtensionAccessibilityEventRouter::DispatchEvent( bool SetAccessibilityEnabledFunction::RunImpl() { bool enabled; EXTENSION_FUNCTION_VALIDATE(args_->GetBoolean(0, &enabled)); - ExtensionAccessibilityEventRouter::GetInstance() - ->SetAccessibilityEnabled(enabled); + ExtensionAccessibilityEventRouter* accessibility_event_router = + profile()->GetExtensionService()->accessibility_event_router(); + accessibility_event_router->SetAccessibilityEnabled(enabled); return true; } @@ -201,8 +198,8 @@ bool GetFocusedControlFunction::RunImpl() { // Get the serialized dict from the last focused control and return it. // However, if the dict is empty, that means we haven't seen any focus // events yet, so return null instead. - ExtensionAccessibilityEventRouter *accessibility_event_router = - ExtensionAccessibilityEventRouter::GetInstance(); + ExtensionAccessibilityEventRouter* accessibility_event_router = + profile()->GetExtensionService()->accessibility_event_router(); DictionaryValue *last_focused_control_dict = accessibility_event_router->last_focused_control_dict(); if (last_focused_control_dict->size()) { diff --git a/chrome/browser/extensions/extension_accessibility_api.h b/chrome/browser/extensions/extension_accessibility_api.h index 2dfc4c1..93eac1ff 100644 --- a/chrome/browser/extensions/extension_accessibility_api.h +++ b/chrome/browser/extensions/extension_accessibility_api.h @@ -10,7 +10,6 @@ #include <vector> #include "base/callback_old.h" -#include "base/memory/singleton.h" #include "base/values.h" #include "chrome/browser/accessibility_events.h" #include "chrome/browser/extensions/extension_function.h" @@ -21,11 +20,10 @@ // to the extension system. class ExtensionAccessibilityEventRouter : public NotificationObserver { public: - // Single instance of the event router. - static ExtensionAccessibilityEventRouter* GetInstance(); + explicit ExtensionAccessibilityEventRouter(); + virtual ~ExtensionAccessibilityEventRouter(); - // Safe to call multiple times. - void ObserveProfile(Profile* profile); + void Init(); // Get the dict representing the last control that received an // OnControlFocus event. @@ -45,11 +43,6 @@ class ExtensionAccessibilityEventRouter : public NotificationObserver { void AddOnDisabledListener(Callback* callback); private: - friend struct DefaultSingletonTraits<ExtensionAccessibilityEventRouter>; - - ExtensionAccessibilityEventRouter(); - virtual ~ExtensionAccessibilityEventRouter(); - // NotificationObserver::Observe. virtual void Observe(NotificationType type, const NotificationSource& source, diff --git a/chrome/browser/extensions/extension_bookmarks_module.cc b/chrome/browser/extensions/extension_bookmarks_module.cc index 33a0d19..8c31a72 100644 --- a/chrome/browser/extensions/extension_bookmarks_module.cc +++ b/chrome/browser/extensions/extension_bookmarks_module.cc @@ -117,22 +117,13 @@ void BookmarksFunction::Observe(NotificationType type, Release(); // Balanced in Run(). } -// static -ExtensionBookmarkEventRouter* ExtensionBookmarkEventRouter::GetInstance() { - return Singleton<ExtensionBookmarkEventRouter>::get(); -} - -ExtensionBookmarkEventRouter::ExtensionBookmarkEventRouter() { -} +ExtensionBookmarkEventRouter::ExtensionBookmarkEventRouter() {} -ExtensionBookmarkEventRouter::~ExtensionBookmarkEventRouter() { -} +ExtensionBookmarkEventRouter::~ExtensionBookmarkEventRouter() {} void ExtensionBookmarkEventRouter::Observe(BookmarkModel* model) { - if (models_.find(model) == models_.end()) { - model->AddObserver(this); - models_.insert(model); - } + model->AddObserver(this); + model_ = model; } void ExtensionBookmarkEventRouter::DispatchEvent(Profile *profile, diff --git a/chrome/browser/extensions/extension_bookmarks_module.h b/chrome/browser/extensions/extension_bookmarks_module.h index 1b8efed..eff5c92 100644 --- a/chrome/browser/extensions/extension_bookmarks_module.h +++ b/chrome/browser/extensions/extension_bookmarks_module.h @@ -12,7 +12,6 @@ #include "base/compiler_specific.h" #include "base/memory/ref_counted.h" -#include "base/memory/singleton.h" #include "chrome/browser/bookmarks/bookmark_model_observer.h" #include "chrome/browser/extensions/extension_function.h" #include "chrome/browser/ui/shell_dialogs.h" @@ -25,11 +24,10 @@ class FilePath; // the extension system. class ExtensionBookmarkEventRouter : public BookmarkModelObserver { public: - static ExtensionBookmarkEventRouter* GetInstance(); + explicit ExtensionBookmarkEventRouter(); virtual ~ExtensionBookmarkEventRouter(); - // Call this for each model to observe. Safe to call multiple times per - // model. + // Initialize to observe this bookmark model. void Observe(BookmarkModel* model); // BookmarkModelObserver: @@ -57,18 +55,13 @@ class ExtensionBookmarkEventRouter : public BookmarkModelObserver { virtual void BookmarkImportEnding(BookmarkModel* model) OVERRIDE; private: - ExtensionBookmarkEventRouter(); - friend struct DefaultSingletonTraits<ExtensionBookmarkEventRouter>; - // Helper to actually dispatch an event to extension listeners. void DispatchEvent(Profile* profile, const char* event_name, const std::string& json_args); - // These are stored so that Observe can be called multiple times safely. - // This way the caller doesn't have to know whether it's already observing - // a particular model or not. The pointers are not owned by this object. - std::set<BookmarkModel*> models_; + // The model being observed. + BookmarkModel* model_; DISALLOW_COPY_AND_ASSIGN(ExtensionBookmarkEventRouter); }; diff --git a/chrome/browser/extensions/extension_cookies_api.cc b/chrome/browser/extensions/extension_cookies_api.cc index 83c535d..d5eabaa 100644 --- a/chrome/browser/extensions/extension_cookies_api.cc +++ b/chrome/browser/extensions/extension_cookies_api.cc @@ -25,10 +25,9 @@ namespace keys = extension_cookies_api_constants; -// static -ExtensionCookiesEventRouter* ExtensionCookiesEventRouter::GetInstance() { - return Singleton<ExtensionCookiesEventRouter>::get(); -} +ExtensionCookiesEventRouter::ExtensionCookiesEventRouter() {} + +ExtensionCookiesEventRouter::~ExtensionCookiesEventRouter() {} void ExtensionCookiesEventRouter::Init() { if (registrar_.IsEmpty()) { diff --git a/chrome/browser/extensions/extension_cookies_api.h b/chrome/browser/extensions/extension_cookies_api.h index 286c8ba..276c336 100644 --- a/chrome/browser/extensions/extension_cookies_api.h +++ b/chrome/browser/extensions/extension_cookies_api.h @@ -12,7 +12,6 @@ #include <string> #include "base/memory/ref_counted.h" -#include "base/memory/singleton.h" #include "base/time.h" #include "chrome/browser/extensions/extension_function.h" #include "chrome/browser/net/chrome_cookie_notification_details.h" @@ -31,17 +30,12 @@ class URLRequestContextGetter; // extension system. class ExtensionCookiesEventRouter : public NotificationObserver { public: - // Single instance of the event router. - static ExtensionCookiesEventRouter* GetInstance(); + explicit ExtensionCookiesEventRouter(); + virtual ~ExtensionCookiesEventRouter(); void Init(); private: - friend struct DefaultSingletonTraits<ExtensionCookiesEventRouter>; - - ExtensionCookiesEventRouter() {} - virtual ~ExtensionCookiesEventRouter() {} - // NotificationObserver implementation. virtual void Observe(NotificationType type, const NotificationSource& source, diff --git a/chrome/browser/extensions/extension_event_router.cc b/chrome/browser/extensions/extension_event_router.cc index a86bf1c..76a419c 100644 --- a/chrome/browser/extensions/extension_event_router.cc +++ b/chrome/browser/extensions/extension_event_router.cc @@ -106,7 +106,7 @@ void ExtensionEventRouter::AddEventListener( // We lazily tell the TaskManager to start updating when listeners to the // processes.onUpdated event arrive. if (event_name.compare(extension_processes_api_constants::kOnUpdated) == 0) - ExtensionProcessesEventRouter::GetInstance()->ListenerAdded(); + profile_->GetExtensionService()->processes_event_router()->ListenerAdded(); } void ExtensionEventRouter::RemoveEventListener( @@ -127,7 +127,8 @@ void ExtensionEventRouter::RemoveEventListener( // If a processes.onUpdated event listener is removed (or a process with one // exits), then we let the TaskManager know that it has one fewer listener. if (event_name.compare(extension_processes_api_constants::kOnUpdated) == 0) - ExtensionProcessesEventRouter::GetInstance()->ListenerRemoved(); + profile_->GetExtensionService()->processes_event_router()-> + ListenerRemoved(); BrowserThread::PostTask( BrowserThread::IO, FROM_HERE, diff --git a/chrome/browser/extensions/extension_history_api.cc b/chrome/browser/extensions/extension_history_api.cc index 9ead422..3287184 100644 --- a/chrome/browser/extensions/extension_history_api.cc +++ b/chrome/browser/extensions/extension_history_api.cc @@ -64,49 +64,39 @@ void AddVisitNode(const history::VisitRow& row, ListValue* list) { } // namespace -ExtensionHistoryEventRouter* ExtensionHistoryEventRouter::GetInstance() { - return Singleton<ExtensionHistoryEventRouter>::get(); -} +ExtensionHistoryEventRouter::ExtensionHistoryEventRouter(Profile* profile) + : profile_(profile) {} -void ExtensionHistoryEventRouter::ObserveProfile(Profile* profile) { - NotificationSource source = Source<Profile>(profile); - if (profiles_.find(source.map_key()) == profiles_.end()) - profiles_[source.map_key()] = profile; +ExtensionHistoryEventRouter::~ExtensionHistoryEventRouter() {} +void ExtensionHistoryEventRouter::Init() { + NotificationSource source = Source<Profile>(profile_); if (registrar_.IsEmpty()) { registrar_.Add(this, NotificationType::HISTORY_URL_VISITED, - NotificationService::AllSources()); + source); registrar_.Add(this, NotificationType::HISTORY_URLS_DELETED, - NotificationService::AllSources()); + source); } } -ExtensionHistoryEventRouter::ExtensionHistoryEventRouter() {} - -ExtensionHistoryEventRouter::~ExtensionHistoryEventRouter() {} - void ExtensionHistoryEventRouter::Observe(NotificationType type, const NotificationSource& source, const NotificationDetails& details) { - ProfileMap::iterator it = profiles_.find(source.map_key()); - if (it != profiles_.end()) { - Profile* profile = it->second; - switch (type.value) { - case NotificationType::HISTORY_URL_VISITED: - HistoryUrlVisited( - profile, - Details<const history::URLVisitedDetails>(details).ptr()); - break; - case NotificationType::HISTORY_URLS_DELETED: - HistoryUrlsRemoved( - profile, - Details<const history::URLsDeletedDetails>(details).ptr()); - break; - default: - NOTREACHED(); - } + switch (type.value) { + case NotificationType::HISTORY_URL_VISITED: + HistoryUrlVisited( + profile_, + Details<const history::URLVisitedDetails>(details).ptr()); + break; + case NotificationType::HISTORY_URLS_DELETED: + HistoryUrlsRemoved( + profile_, + Details<const history::URLsDeletedDetails>(details).ptr()); + break; + default: + NOTREACHED(); } } diff --git a/chrome/browser/extensions/extension_history_api.h b/chrome/browser/extensions/extension_history_api.h index f6ddcdc..b5f7208 100644 --- a/chrome/browser/extensions/extension_history_api.h +++ b/chrome/browser/extensions/extension_history_api.h @@ -9,28 +9,23 @@ #include <map> #include <string> -#include "base/memory/singleton.h" #include "chrome/browser/extensions/extension_function.h" #include "chrome/browser/history/history.h" #include "chrome/browser/history/history_notifications.h" #include "content/common/notification_registrar.h" +class Profile; + // Observes History service and routes the notifications as events to the // extension system. class ExtensionHistoryEventRouter : public NotificationObserver { public: - // Single instance of the event router. - static ExtensionHistoryEventRouter* GetInstance(); + explicit ExtensionHistoryEventRouter(Profile* profile); + virtual ~ExtensionHistoryEventRouter(); - // Safe to call multiple times. - void ObserveProfile(Profile* profile); + void Init(); private: - friend struct DefaultSingletonTraits<ExtensionHistoryEventRouter>; - - ExtensionHistoryEventRouter(); - virtual ~ExtensionHistoryEventRouter(); - // NotificationObserver::Observe. virtual void Observe(NotificationType type, const NotificationSource& source, @@ -49,9 +44,8 @@ class ExtensionHistoryEventRouter : public NotificationObserver { // Used for tracking registrations to history service notifications. NotificationRegistrar registrar_; - // Registered profiles. - typedef std::map<uintptr_t, Profile*> ProfileMap; - ProfileMap profiles_; + // The associated Profile owns us transitively via ExtensionService. + Profile* profile_; DISALLOW_COPY_AND_ASSIGN(ExtensionHistoryEventRouter); }; diff --git a/chrome/browser/extensions/extension_management_api.cc b/chrome/browser/extensions/extension_management_api.cc index 0053b1d..73b905b 100644 --- a/chrome/browser/extensions/extension_management_api.cc +++ b/chrome/browser/extensions/extension_management_api.cc @@ -248,11 +248,6 @@ bool UninstallFunction::RunImpl() { return true; } -// static -ExtensionManagementEventRouter* ExtensionManagementEventRouter::GetInstance() { - return Singleton<ExtensionManagementEventRouter>::get(); -} - ExtensionManagementEventRouter::ExtensionManagementEventRouter() {} ExtensionManagementEventRouter::~ExtensionManagementEventRouter() {} diff --git a/chrome/browser/extensions/extension_management_api.h b/chrome/browser/extensions/extension_management_api.h index 04b2c8c..68aae0b 100644 --- a/chrome/browser/extensions/extension_management_api.h +++ b/chrome/browser/extensions/extension_management_api.h @@ -6,7 +6,6 @@ #define CHROME_BROWSER_EXTENSIONS_EXTENSION_MANAGEMENT_API_H__ #pragma once -#include "base/memory/singleton.h" #include "chrome/browser/extensions/extension_function.h" #include "content/common/notification_observer.h" #include "content/common/notification_registrar.h" @@ -50,18 +49,12 @@ class UninstallFunction : public ExtensionManagementFunction { class ExtensionManagementEventRouter : public NotificationObserver { public: - // Get the singleton instance of the event router. - static ExtensionManagementEventRouter* GetInstance(); + explicit ExtensionManagementEventRouter(); + virtual ~ExtensionManagementEventRouter(); - // Performs one-time initialization of our singleton. void Init(); private: - friend struct DefaultSingletonTraits<ExtensionManagementEventRouter>; - - ExtensionManagementEventRouter(); - virtual ~ExtensionManagementEventRouter(); - // NotificationObserver implementation. virtual void Observe(NotificationType type, const NotificationSource& source, diff --git a/chrome/browser/extensions/extension_preference_api.cc b/chrome/browser/extensions/extension_preference_api.cc index ae65a58..b297905 100644 --- a/chrome/browser/extensions/extension_preference_api.cc +++ b/chrome/browser/extensions/extension_preference_api.cc @@ -222,6 +222,11 @@ class PrefMapping { ExtensionPreferenceEventRouter::ExtensionPreferenceEventRouter( Profile* profile) : profile_(profile) { +} + +ExtensionPreferenceEventRouter::~ExtensionPreferenceEventRouter() {} + +void ExtensionPreferenceEventRouter::Init() { registrar_.Init(profile_->GetPrefs()); incognito_registrar_.Init(profile_->GetOffTheRecordPrefs()); for (size_t i = 0; i < arraysize(kPrefMapping); ++i) { @@ -230,8 +235,6 @@ ExtensionPreferenceEventRouter::ExtensionPreferenceEventRouter( } } -ExtensionPreferenceEventRouter::~ExtensionPreferenceEventRouter() { } - void ExtensionPreferenceEventRouter::Observe( NotificationType type, const NotificationSource& source, diff --git a/chrome/browser/extensions/extension_preference_api.h b/chrome/browser/extensions/extension_preference_api.h index 06897ce..6f6b3da 100644 --- a/chrome/browser/extensions/extension_preference_api.h +++ b/chrome/browser/extensions/extension_preference_api.h @@ -17,6 +17,8 @@ class ExtensionPreferenceEventRouter : public NotificationObserver { explicit ExtensionPreferenceEventRouter(Profile* profile); virtual ~ExtensionPreferenceEventRouter(); + void Init(); + private: // NotificationObserver implementation. virtual void Observe(NotificationType type, diff --git a/chrome/browser/extensions/extension_processes_api.cc b/chrome/browser/extensions/extension_processes_api.cc index 266afdc..92d61b8 100644 --- a/chrome/browser/extensions/extension_processes_api.cc +++ b/chrome/browser/extensions/extension_processes_api.cc @@ -42,21 +42,17 @@ DictionaryValue* CreateProcessValue(int process_id, return result; } -ExtensionProcessesEventRouter* ExtensionProcessesEventRouter::GetInstance() { - return Singleton<ExtensionProcessesEventRouter>::get(); -} - -ExtensionProcessesEventRouter::ExtensionProcessesEventRouter() { - model_ = TaskManager::GetInstance()->model(); - model_->AddObserver(this); +ExtensionProcessesEventRouter::ExtensionProcessesEventRouter(Profile* profile) + : profile_(profile) { } ExtensionProcessesEventRouter::~ExtensionProcessesEventRouter() { model_->RemoveObserver(this); } -void ExtensionProcessesEventRouter::ObserveProfile(Profile* profile) { - profiles_.insert(profile); +void ExtensionProcessesEventRouter::Init() { + model_ = TaskManager::GetInstance()->model(); + model_->AddObserver(this); } void ExtensionProcessesEventRouter::ListenerAdded() { @@ -138,12 +134,8 @@ void ExtensionProcessesEventRouter::OnItemsChanged(int start, int length) { std::string json_args; base::JSONWriter::Write(&args, false, &json_args); - // Notify each profile that is interested. - for (ProfileSet::iterator it = profiles_.begin(); - it != profiles_.end(); it++) { - Profile* profile = *it; - DispatchEvent(profile, keys::kOnUpdated, json_args); - } + // Notify the profile. + DispatchEvent(profile_, keys::kOnUpdated, json_args); } } diff --git a/chrome/browser/extensions/extension_processes_api.h b/chrome/browser/extensions/extension_processes_api.h index fe0a2f9..18e871f 100644 --- a/chrome/browser/extensions/extension_processes_api.h +++ b/chrome/browser/extensions/extension_processes_api.h @@ -13,15 +13,16 @@ #include "chrome/browser/task_manager/task_manager.h" #include "content/common/notification_registrar.h" +class Profile; + // Observes the Task Manager and routes the notifications as events to the // extension system. class ExtensionProcessesEventRouter : public TaskManagerModelObserver { public: - // Single instance of the event router. - static ExtensionProcessesEventRouter* GetInstance(); + explicit ExtensionProcessesEventRouter(Profile* profile); + virtual ~ExtensionProcessesEventRouter(); - // Safe to call multiple times. - void ObserveProfile(Profile* profile); + void Init(); // Called when an extension process wants to listen to process events. void ListenerAdded(); @@ -30,10 +31,6 @@ class ExtensionProcessesEventRouter : public TaskManagerModelObserver { void ListenerRemoved(); private: - friend struct DefaultSingletonTraits<ExtensionProcessesEventRouter>; - - ExtensionProcessesEventRouter(); - virtual ~ExtensionProcessesEventRouter(); // TaskManagerModelObserver methods. virtual void OnModelChanged() {} @@ -48,9 +45,8 @@ class ExtensionProcessesEventRouter : public TaskManagerModelObserver { // Used for tracking registrations to process related notifications. NotificationRegistrar registrar_; - // Registered profiles. - typedef std::set<Profile*> ProfileSet; - ProfileSet profiles_; + // The associated Profile owns us transitively via ExtensionService. + Profile* profile_; // TaskManager to observe for updates. TaskManagerModel* model_; diff --git a/chrome/browser/extensions/extension_service.cc b/chrome/browser/extensions/extension_service.cc index 30c8058..20836e2 100644 --- a/chrome/browser/extensions/extension_service.cc +++ b/chrome/browser/extensions/extension_service.cc @@ -569,34 +569,35 @@ ExtensionService::~ExtensionService() { ExternalExtensionProviderInterface* provider = i->get(); provider->ServiceShutdown(); } - -#if defined(OS_CHROMEOS) - if (event_routers_initialized_) { - ExtensionFileBrowserEventRouter::GetInstance()-> - StopObservingFileSystemEvents(); - } -#endif } void ExtensionService::InitEventRouters() { if (event_routers_initialized_) return; - ExtensionHistoryEventRouter::GetInstance()->ObserveProfile(profile_); - ExtensionAccessibilityEventRouter::GetInstance()->ObserveProfile(profile_); + history_event_router_.reset(new ExtensionHistoryEventRouter(profile_)); + history_event_router_->Init(); + accessibility_event_router_.reset(new ExtensionAccessibilityEventRouter()); + accessibility_event_router_->Init(); browser_event_router_.reset(new ExtensionBrowserEventRouter(profile_)); browser_event_router_->Init(); preference_event_router_.reset(new ExtensionPreferenceEventRouter(profile_)); - ExtensionBookmarkEventRouter::GetInstance()->Observe( - profile_->GetBookmarkModel()); - ExtensionCookiesEventRouter::GetInstance()->Init(); - ExtensionManagementEventRouter::GetInstance()->Init(); - ExtensionProcessesEventRouter::GetInstance()->ObserveProfile(profile_); - ExtensionWebNavigationEventRouter::GetInstance()->Init(); + preference_event_router_->Init(); + bookmark_event_router_.reset(new ExtensionBookmarkEventRouter()); + bookmark_event_router_->Observe(profile_->GetBookmarkModel()); + cookies_event_router_.reset(new ExtensionCookiesEventRouter()); + cookies_event_router_->Init(); + management_event_router_.reset(new ExtensionManagementEventRouter()); + management_event_router_->Init(); + processes_event_router_.reset(new ExtensionProcessesEventRouter(profile_)); + processes_event_router_->Init(); + web_navigation_event_router_.reset(new ExtensionWebNavigationEventRouter()); + 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(); #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 a30f875..ce1e256 100644 --- a/chrome/browser/extensions/extension_service.h +++ b/chrome/browser/extensions/extension_service.h @@ -39,10 +39,18 @@ #include "content/common/property_bag.h" class CrxInstaller; +class ExtensionAccessibilityEventRouter; +class ExtensionBookmarkEventRouter; class ExtensionBrowserEventRouter; class ExtensionContentSettingsStore; +class ExtensionCookiesEventRouter; +class ExtensionFileBrowserEventRouter; +class ExtensionHistoryEventRouter; class ExtensionInstallUI; +class ExtensionManagementEventRouter; class ExtensionPreferenceEventRouter; +class ExtensionProcessesEventRouter; +class ExtensionWebNavigationEventRouter; class ExtensionServiceBackend; struct ExtensionSyncData; class ExtensionToolbarModel; @@ -434,10 +442,18 @@ class ExtensionService ExtensionMenuManager* menu_manager() { return &menu_manager_; } + ExtensionAccessibilityEventRouter* accessibility_event_router() { + return accessibility_event_router_.get(); + } + ExtensionBrowserEventRouter* browser_event_router() { return browser_event_router_.get(); } + ExtensionProcessesEventRouter* processes_event_router() { + return processes_event_router_.get(); + } + // 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, @@ -675,9 +691,19 @@ class ExtensionService // Flag to make sure event routers are only initialized once. bool event_routers_initialized_; + scoped_ptr<ExtensionHistoryEventRouter> history_event_router_; + scoped_ptr<ExtensionAccessibilityEventRouter> accessibility_event_router_; scoped_ptr<ExtensionBrowserEventRouter> browser_event_router_; - scoped_ptr<ExtensionPreferenceEventRouter> preference_event_router_; + scoped_ptr<ExtensionBookmarkEventRouter> bookmark_event_router_; + scoped_ptr<ExtensionCookiesEventRouter> cookies_event_router_; + scoped_ptr<ExtensionManagementEventRouter> management_event_router_; + scoped_ptr<ExtensionProcessesEventRouter> processes_event_router_; + 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 diff --git a/chrome/browser/extensions/extension_webnavigation_api.cc b/chrome/browser/extensions/extension_webnavigation_api.cc index 04da675..14d6318 100644 --- a/chrome/browser/extensions/extension_webnavigation_api.cc +++ b/chrome/browser/extensions/extension_webnavigation_api.cc @@ -251,12 +251,6 @@ ExtensionWebNavigationEventRouter::ExtensionWebNavigationEventRouter() {} ExtensionWebNavigationEventRouter::~ExtensionWebNavigationEventRouter() {} -// static -ExtensionWebNavigationEventRouter* -ExtensionWebNavigationEventRouter::GetInstance() { - return Singleton<ExtensionWebNavigationEventRouter>::get(); -} - void ExtensionWebNavigationEventRouter::Init() { if (registrar_.IsEmpty()) { registrar_.Add(this, diff --git a/chrome/browser/extensions/extension_webnavigation_api.h b/chrome/browser/extensions/extension_webnavigation_api.h index 9f475dc..63938a5 100644 --- a/chrome/browser/extensions/extension_webnavigation_api.h +++ b/chrome/browser/extensions/extension_webnavigation_api.h @@ -12,7 +12,6 @@ #include <map> -#include "base/memory/singleton.h" #include "chrome/browser/extensions/extension_function.h" #include "content/browser/tab_contents/tab_contents_observer.h" #include "content/common/notification_observer.h" @@ -132,19 +131,12 @@ class ExtensionWebNavigationTabObserver : public TabContentsObserver { // system. class ExtensionWebNavigationEventRouter : public NotificationObserver { public: - // Returns the singleton instance of the event router. - static ExtensionWebNavigationEventRouter* GetInstance(); + explicit ExtensionWebNavigationEventRouter(); + virtual ~ExtensionWebNavigationEventRouter(); - // Invoked by the extensions service once the extension system is fully set - // up and can start dispatching events to extensions. void Init(); private: - friend struct DefaultSingletonTraits<ExtensionWebNavigationEventRouter>; - - ExtensionWebNavigationEventRouter(); - virtual ~ExtensionWebNavigationEventRouter(); - // NotificationObserver implementation. virtual void Observe(NotificationType type, const NotificationSource& source, |