diff options
author | yoz@chromium.org <yoz@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-05-27 21:07:11 +0000 |
---|---|---|
committer | yoz@chromium.org <yoz@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-05-27 21:07:11 +0000 |
commit | 7da9a823b8f64e7502e83ca0fc2c1cb68e63cdc4 (patch) | |
tree | 7c3586db16e97868451cd245849972f22fd14188 /chrome | |
parent | 6bb26a170b75285b9256ab8987fd26a8b57a6a6e (diff) | |
download | chromium_src-7da9a823b8f64e7502e83ca0fc2c1cb68e63cdc4.zip chromium_src-7da9a823b8f64e7502e83ca0fc2c1cb68e63cdc4.tar.gz chromium_src-7da9a823b8f64e7502e83ca0fc2c1cb68e63cdc4.tar.bz2 |
Revert "Change event routers from singletons to being owned by the ExtensionService."
This breaks, among other things, multi-profile and the first run dialog.
Reverting at least for M13.
This reverts commit 45758c29485736d7164085e6b7f8bf0999df1c4f.
BUG=81745
TEST=none
Review URL: http://codereview.chromium.org/7084006
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@87083 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome')
25 files changed, 229 insertions, 192 deletions
diff --git a/chrome/browser/chromeos/extensions/file_browser_event_router.cc b/chrome/browser/chromeos/extensions/file_browser_event_router.cc index 51f5b6a..723cdc6 100644 --- a/chrome/browser/chromeos/extensions/file_browser_event_router.cc +++ b/chrome/browser/chromeos/extensions/file_browser_event_router.cc @@ -47,24 +47,18 @@ DictionaryValue* DiskToDictionaryValue( return result; } -ExtensionFileBrowserEventRouter::ExtensionFileBrowserEventRouter( - Profile* profile) - : profile_(profile) { - DCHECK(profile); +ExtensionFileBrowserEventRouter::ExtensionFileBrowserEventRouter() + : profile_(NULL) { } ExtensionFileBrowserEventRouter::~ExtensionFileBrowserEventRouter() { - if (!profile_) - return; - if (!chromeos::CrosLibrary::Get()->EnsureLoaded()) - return; - chromeos::MountLibrary* lib = - chromeos::CrosLibrary::Get()->GetMountLibrary(); - lib->RemoveObserver(this); - profile_ = NULL; } -void ExtensionFileBrowserEventRouter::ObserveFileSystemEvents() { +void ExtensionFileBrowserEventRouter::ObserveFileSystemEvents( + Profile* profile) { + if (!profile) + return; + profile_ = profile; if (!chromeos::CrosLibrary::Get()->EnsureLoaded()) return; if (chromeos::UserManager::Get()->user_is_logged_in()) { @@ -76,6 +70,23 @@ void ExtensionFileBrowserEventRouter::ObserveFileSystemEvents() { } } +void ExtensionFileBrowserEventRouter::StopObservingFileSystemEvents() { + if (!profile_) + return; + if (!chromeos::CrosLibrary::Get()->EnsureLoaded()) + return; + chromeos::MountLibrary* lib = + chromeos::CrosLibrary::Get()->GetMountLibrary(); + lib->RemoveObserver(this); + profile_ = NULL; +} + +// static +ExtensionFileBrowserEventRouter* + ExtensionFileBrowserEventRouter::GetInstance() { + return Singleton<ExtensionFileBrowserEventRouter>::get(); +} + 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 9b58656..320a80d 100644 --- a/chrome/browser/chromeos/extensions/file_browser_event_router.h +++ b/chrome/browser/chromeos/extensions/file_browser_event_router.h @@ -24,12 +24,12 @@ class SystemNotification; class ExtensionFileBrowserEventRouter : public chromeos::MountLibrary::Observer { public: - explicit ExtensionFileBrowserEventRouter(Profile* profile); - virtual ~ExtensionFileBrowserEventRouter(); + static ExtensionFileBrowserEventRouter* GetInstance(); - // Starts observing file system change events. Currently only + // Starts/stops observing file system change events. Currently only // MountLibrary events are being observed. - void ObserveFileSystemEvents(); + void ObserveFileSystemEvents(Profile* profile); + void StopObservingFileSystemEvents(); // MountLibrary::Observer overrides. virtual void DiskChanged(chromeos::MountLibraryEventType event, @@ -38,10 +38,14 @@ class ExtensionFileBrowserEventRouter 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; + 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/chromeos/login/wizard_accessibility_helper.cc b/chrome/browser/chromeos/login/wizard_accessibility_helper.cc index e8dd4cf..6d152fa 100644 --- a/chrome/browser/chromeos/login/wizard_accessibility_helper.cc +++ b/chrome/browser/chromeos/login/wizard_accessibility_helper.cc @@ -8,7 +8,6 @@ #include "base/stl_util-inl.h" #include "chrome/browser/browser_process.h" #include "chrome/browser/extensions/extension_accessibility_api.h" -#include "chrome/browser/extensions/extension_service.h" #include "chrome/browser/prefs/pref_service.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/profiles/profile_manager.h" @@ -115,7 +114,7 @@ void WizardAccessibilityHelper::SetAccessibilityEnabled(bool enabled) { prefService->SetBoolean(prefs::kAccessibilityEnabled, enabled); prefService->ScheduleSavePersistentPrefs(); } - profile_->GetExtensionService()->accessibility_event_router()-> + ExtensionAccessibilityEventRouter::GetInstance()-> SetAccessibilityEnabled(enabled); if (doSpeak) { accessibility_handler_->Speak(enabled ? diff --git a/chrome/browser/extensions/extension_accessibility_api.cc b/chrome/browser/extensions/extension_accessibility_api.cc index 8b8042a..cc694d1 100644 --- a/chrome/browser/extensions/extension_accessibility_api.cc +++ b/chrome/browser/extensions/extension_accessibility_api.cc @@ -34,16 +34,20 @@ std::string ControlInfoToJsonString(const AccessibilityControlInfo* info) { return json_args; } -ExtensionAccessibilityEventRouter::ExtensionAccessibilityEventRouter() - : enabled_(false) { +ExtensionAccessibilityEventRouter* + ExtensionAccessibilityEventRouter::GetInstance() { + return Singleton<ExtensionAccessibilityEventRouter>::get(); } +ExtensionAccessibilityEventRouter::ExtensionAccessibilityEventRouter() + : enabled_(false) {} + ExtensionAccessibilityEventRouter::~ExtensionAccessibilityEventRouter() { STLDeleteElements(&on_enabled_listeners_); STLDeleteElements(&on_disabled_listeners_); } -void ExtensionAccessibilityEventRouter::Init() { +void ExtensionAccessibilityEventRouter::ObserveProfile(Profile* profile) { last_focused_control_dict_.Clear(); if (registrar_.IsEmpty()) { @@ -188,9 +192,8 @@ void ExtensionAccessibilityEventRouter::DispatchEvent( bool SetAccessibilityEnabledFunction::RunImpl() { bool enabled; EXTENSION_FUNCTION_VALIDATE(args_->GetBoolean(0, &enabled)); - ExtensionAccessibilityEventRouter* accessibility_event_router = - profile()->GetExtensionService()->accessibility_event_router(); - accessibility_event_router->SetAccessibilityEnabled(enabled); + ExtensionAccessibilityEventRouter::GetInstance() + ->SetAccessibilityEnabled(enabled); return true; } @@ -198,8 +201,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 = - profile()->GetExtensionService()->accessibility_event_router(); + ExtensionAccessibilityEventRouter *accessibility_event_router = + ExtensionAccessibilityEventRouter::GetInstance(); 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 93eac1ff..2dfc4c1 100644 --- a/chrome/browser/extensions/extension_accessibility_api.h +++ b/chrome/browser/extensions/extension_accessibility_api.h @@ -10,6 +10,7 @@ #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" @@ -20,10 +21,11 @@ // to the extension system. class ExtensionAccessibilityEventRouter : public NotificationObserver { public: - explicit ExtensionAccessibilityEventRouter(); - virtual ~ExtensionAccessibilityEventRouter(); + // Single instance of the event router. + static ExtensionAccessibilityEventRouter* GetInstance(); - void Init(); + // Safe to call multiple times. + void ObserveProfile(Profile* profile); // Get the dict representing the last control that received an // OnControlFocus event. @@ -43,6 +45,11 @@ 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 1358ee6..3e3a769 100644 --- a/chrome/browser/extensions/extension_bookmarks_module.cc +++ b/chrome/browser/extensions/extension_bookmarks_module.cc @@ -118,13 +118,22 @@ void BookmarksFunction::Observe(NotificationType type, Release(); // Balanced in Run(). } -ExtensionBookmarkEventRouter::ExtensionBookmarkEventRouter() {} +// static +ExtensionBookmarkEventRouter* ExtensionBookmarkEventRouter::GetInstance() { + return Singleton<ExtensionBookmarkEventRouter>::get(); +} + +ExtensionBookmarkEventRouter::ExtensionBookmarkEventRouter() { +} -ExtensionBookmarkEventRouter::~ExtensionBookmarkEventRouter() {} +ExtensionBookmarkEventRouter::~ExtensionBookmarkEventRouter() { +} void ExtensionBookmarkEventRouter::Observe(BookmarkModel* model) { - model->AddObserver(this); - model_ = model; + if (models_.find(model) == models_.end()) { + model->AddObserver(this); + models_.insert(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 eff5c92..1b8efed 100644 --- a/chrome/browser/extensions/extension_bookmarks_module.h +++ b/chrome/browser/extensions/extension_bookmarks_module.h @@ -12,6 +12,7 @@ #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" @@ -24,10 +25,11 @@ class FilePath; // the extension system. class ExtensionBookmarkEventRouter : public BookmarkModelObserver { public: - explicit ExtensionBookmarkEventRouter(); + static ExtensionBookmarkEventRouter* GetInstance(); virtual ~ExtensionBookmarkEventRouter(); - // Initialize to observe this bookmark model. + // Call this for each model to observe. Safe to call multiple times per + // model. void Observe(BookmarkModel* model); // BookmarkModelObserver: @@ -55,13 +57,18 @@ 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); - // The model being observed. - BookmarkModel* model_; + // 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_; DISALLOW_COPY_AND_ASSIGN(ExtensionBookmarkEventRouter); }; diff --git a/chrome/browser/extensions/extension_cookies_api.cc b/chrome/browser/extensions/extension_cookies_api.cc index d5eabaa..83c535d 100644 --- a/chrome/browser/extensions/extension_cookies_api.cc +++ b/chrome/browser/extensions/extension_cookies_api.cc @@ -25,9 +25,10 @@ namespace keys = extension_cookies_api_constants; -ExtensionCookiesEventRouter::ExtensionCookiesEventRouter() {} - -ExtensionCookiesEventRouter::~ExtensionCookiesEventRouter() {} +// static +ExtensionCookiesEventRouter* ExtensionCookiesEventRouter::GetInstance() { + return Singleton<ExtensionCookiesEventRouter>::get(); +} 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 276c336..286c8ba 100644 --- a/chrome/browser/extensions/extension_cookies_api.h +++ b/chrome/browser/extensions/extension_cookies_api.h @@ -12,6 +12,7 @@ #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" @@ -30,12 +31,17 @@ class URLRequestContextGetter; // extension system. class ExtensionCookiesEventRouter : public NotificationObserver { public: - explicit ExtensionCookiesEventRouter(); - virtual ~ExtensionCookiesEventRouter(); + // Single instance of the event router. + static ExtensionCookiesEventRouter* GetInstance(); 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 76a419c..a86bf1c 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) - profile_->GetExtensionService()->processes_event_router()->ListenerAdded(); + ExtensionProcessesEventRouter::GetInstance()->ListenerAdded(); } void ExtensionEventRouter::RemoveEventListener( @@ -127,8 +127,7 @@ 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) - profile_->GetExtensionService()->processes_event_router()-> - ListenerRemoved(); + ExtensionProcessesEventRouter::GetInstance()->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 3287184..9ead422 100644 --- a/chrome/browser/extensions/extension_history_api.cc +++ b/chrome/browser/extensions/extension_history_api.cc @@ -64,39 +64,49 @@ void AddVisitNode(const history::VisitRow& row, ListValue* list) { } // namespace -ExtensionHistoryEventRouter::ExtensionHistoryEventRouter(Profile* profile) - : profile_(profile) {} +ExtensionHistoryEventRouter* ExtensionHistoryEventRouter::GetInstance() { + return Singleton<ExtensionHistoryEventRouter>::get(); +} -ExtensionHistoryEventRouter::~ExtensionHistoryEventRouter() {} +void ExtensionHistoryEventRouter::ObserveProfile(Profile* profile) { + NotificationSource source = Source<Profile>(profile); + if (profiles_.find(source.map_key()) == profiles_.end()) + profiles_[source.map_key()] = profile; -void ExtensionHistoryEventRouter::Init() { - NotificationSource source = Source<Profile>(profile_); if (registrar_.IsEmpty()) { registrar_.Add(this, NotificationType::HISTORY_URL_VISITED, - source); + NotificationService::AllSources()); registrar_.Add(this, NotificationType::HISTORY_URLS_DELETED, - source); + NotificationService::AllSources()); } } +ExtensionHistoryEventRouter::ExtensionHistoryEventRouter() {} + +ExtensionHistoryEventRouter::~ExtensionHistoryEventRouter() {} + void ExtensionHistoryEventRouter::Observe(NotificationType type, const NotificationSource& source, const NotificationDetails& details) { - 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(); + 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(); + } } } diff --git a/chrome/browser/extensions/extension_history_api.h b/chrome/browser/extensions/extension_history_api.h index b5f7208..f6ddcdc 100644 --- a/chrome/browser/extensions/extension_history_api.h +++ b/chrome/browser/extensions/extension_history_api.h @@ -9,23 +9,28 @@ #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: - explicit ExtensionHistoryEventRouter(Profile* profile); - virtual ~ExtensionHistoryEventRouter(); + // Single instance of the event router. + static ExtensionHistoryEventRouter* GetInstance(); - void Init(); + // Safe to call multiple times. + void ObserveProfile(Profile* profile); private: + friend struct DefaultSingletonTraits<ExtensionHistoryEventRouter>; + + ExtensionHistoryEventRouter(); + virtual ~ExtensionHistoryEventRouter(); + // NotificationObserver::Observe. virtual void Observe(NotificationType type, const NotificationSource& source, @@ -44,8 +49,9 @@ class ExtensionHistoryEventRouter : public NotificationObserver { // Used for tracking registrations to history service notifications. NotificationRegistrar registrar_; - // The associated Profile owns us transitively via ExtensionService. - Profile* profile_; + // Registered profiles. + typedef std::map<uintptr_t, Profile*> ProfileMap; + ProfileMap profiles_; DISALLOW_COPY_AND_ASSIGN(ExtensionHistoryEventRouter); }; diff --git a/chrome/browser/extensions/extension_management_api.cc b/chrome/browser/extensions/extension_management_api.cc index 73b905b..0053b1d 100644 --- a/chrome/browser/extensions/extension_management_api.cc +++ b/chrome/browser/extensions/extension_management_api.cc @@ -248,6 +248,11 @@ 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 68aae0b..04b2c8c 100644 --- a/chrome/browser/extensions/extension_management_api.h +++ b/chrome/browser/extensions/extension_management_api.h @@ -6,6 +6,7 @@ #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" @@ -49,12 +50,18 @@ class UninstallFunction : public ExtensionManagementFunction { class ExtensionManagementEventRouter : public NotificationObserver { public: - explicit ExtensionManagementEventRouter(); - virtual ~ExtensionManagementEventRouter(); + // Get the singleton instance of the event router. + static ExtensionManagementEventRouter* GetInstance(); + // 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 b297905..ae65a58 100644 --- a/chrome/browser/extensions/extension_preference_api.cc +++ b/chrome/browser/extensions/extension_preference_api.cc @@ -222,11 +222,6 @@ 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) { @@ -235,6 +230,8 @@ void ExtensionPreferenceEventRouter::Init() { } } +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 6f6b3da..06897ce 100644 --- a/chrome/browser/extensions/extension_preference_api.h +++ b/chrome/browser/extensions/extension_preference_api.h @@ -17,8 +17,6 @@ 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 92d61b8..266afdc 100644 --- a/chrome/browser/extensions/extension_processes_api.cc +++ b/chrome/browser/extensions/extension_processes_api.cc @@ -42,17 +42,21 @@ DictionaryValue* CreateProcessValue(int process_id, return result; } -ExtensionProcessesEventRouter::ExtensionProcessesEventRouter(Profile* profile) - : profile_(profile) { +ExtensionProcessesEventRouter* ExtensionProcessesEventRouter::GetInstance() { + return Singleton<ExtensionProcessesEventRouter>::get(); +} + +ExtensionProcessesEventRouter::ExtensionProcessesEventRouter() { + model_ = TaskManager::GetInstance()->model(); + model_->AddObserver(this); } ExtensionProcessesEventRouter::~ExtensionProcessesEventRouter() { model_->RemoveObserver(this); } -void ExtensionProcessesEventRouter::Init() { - model_ = TaskManager::GetInstance()->model(); - model_->AddObserver(this); +void ExtensionProcessesEventRouter::ObserveProfile(Profile* profile) { + profiles_.insert(profile); } void ExtensionProcessesEventRouter::ListenerAdded() { @@ -134,8 +138,12 @@ void ExtensionProcessesEventRouter::OnItemsChanged(int start, int length) { std::string json_args; base::JSONWriter::Write(&args, false, &json_args); - // Notify the profile. - DispatchEvent(profile_, keys::kOnUpdated, 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); + } } } diff --git a/chrome/browser/extensions/extension_processes_api.h b/chrome/browser/extensions/extension_processes_api.h index 18e871f..fe0a2f9 100644 --- a/chrome/browser/extensions/extension_processes_api.h +++ b/chrome/browser/extensions/extension_processes_api.h @@ -13,16 +13,15 @@ #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: - explicit ExtensionProcessesEventRouter(Profile* profile); - virtual ~ExtensionProcessesEventRouter(); + // Single instance of the event router. + static ExtensionProcessesEventRouter* GetInstance(); - void Init(); + // Safe to call multiple times. + void ObserveProfile(Profile* profile); // Called when an extension process wants to listen to process events. void ListenerAdded(); @@ -31,6 +30,10 @@ class ExtensionProcessesEventRouter : public TaskManagerModelObserver { void ListenerRemoved(); private: + friend struct DefaultSingletonTraits<ExtensionProcessesEventRouter>; + + ExtensionProcessesEventRouter(); + virtual ~ExtensionProcessesEventRouter(); // TaskManagerModelObserver methods. virtual void OnModelChanged() {} @@ -45,8 +48,9 @@ class ExtensionProcessesEventRouter : public TaskManagerModelObserver { // Used for tracking registrations to process related notifications. NotificationRegistrar registrar_; - // The associated Profile owns us transitively via ExtensionService. - Profile* profile_; + // Registered profiles. + typedef std::set<Profile*> ProfileSet; + ProfileSet profiles_; // TaskManager to observe for updates. TaskManagerModel* model_; diff --git a/chrome/browser/extensions/extension_service.cc b/chrome/browser/extensions/extension_service.cc index ecf60b1..a409420 100644 --- a/chrome/browser/extensions/extension_service.cc +++ b/chrome/browser/extensions/extension_service.cc @@ -537,35 +537,34 @@ 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; - history_event_router_.reset(new ExtensionHistoryEventRouter(profile_)); - history_event_router_->Init(); - accessibility_event_router_.reset(new ExtensionAccessibilityEventRouter()); - accessibility_event_router_->Init(); + ExtensionHistoryEventRouter::GetInstance()->ObserveProfile(profile_); + ExtensionAccessibilityEventRouter::GetInstance()->ObserveProfile(profile_); browser_event_router_.reset(new ExtensionBrowserEventRouter(profile_)); browser_event_router_->Init(); preference_event_router_.reset(new ExtensionPreferenceEventRouter(profile_)); - 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(); + ExtensionBookmarkEventRouter::GetInstance()->Observe( + profile_->GetBookmarkModel()); + ExtensionCookiesEventRouter::GetInstance()->Init(); + ExtensionManagementEventRouter::GetInstance()->Init(); + ExtensionProcessesEventRouter::GetInstance()->ObserveProfile(profile_); + ExtensionWebNavigationEventRouter::GetInstance()->Init(); #if defined(OS_CHROMEOS) - file_browser_event_router_.reset( - new ExtensionFileBrowserEventRouter(profile_)); - file_browser_event_router_->ObserveFileSystemEvents(); + ExtensionFileBrowserEventRouter::GetInstance()->ObserveFileSystemEvents( + profile_); ExtensionMediaPlayerEventRouter::GetInstance()->Init(profile_); #endif diff --git a/chrome/browser/extensions/extension_service.h b/chrome/browser/extensions/extension_service.h index bdc78ca..1771e4e 100644 --- a/chrome/browser/extensions/extension_service.h +++ b/chrome/browser/extensions/extension_service.h @@ -39,18 +39,10 @@ #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; @@ -442,18 +434,10 @@ 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, @@ -695,19 +679,9 @@ 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 14d6318..04da675 100644 --- a/chrome/browser/extensions/extension_webnavigation_api.cc +++ b/chrome/browser/extensions/extension_webnavigation_api.cc @@ -251,6 +251,12 @@ 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 63938a5..9f475dc 100644 --- a/chrome/browser/extensions/extension_webnavigation_api.h +++ b/chrome/browser/extensions/extension_webnavigation_api.h @@ -12,6 +12,7 @@ #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" @@ -131,12 +132,19 @@ class ExtensionWebNavigationTabObserver : public TabContentsObserver { // system. class ExtensionWebNavigationEventRouter : public NotificationObserver { public: - explicit ExtensionWebNavigationEventRouter(); - virtual ~ExtensionWebNavigationEventRouter(); + // Returns the singleton instance of the event router. + static ExtensionWebNavigationEventRouter* GetInstance(); + // 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, diff --git a/chrome/browser/ui/views/accessibility_event_router_views.cc b/chrome/browser/ui/views/accessibility_event_router_views.cc index 58aa6aa..34fb85e 100644 --- a/chrome/browser/ui/views/accessibility_event_router_views.cc +++ b/chrome/browser/ui/views/accessibility_event_router_views.cc @@ -10,7 +10,6 @@ #include "base/utf_string_conversions.h" #include "chrome/browser/browser_process.h" #include "chrome/browser/extensions/extension_accessibility_api.h" -#include "chrome/browser/extensions/extension_service.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/profiles/profile_manager.h" #include "chrome/browser/ui/views/location_bar/location_bar_view.h" @@ -35,9 +34,7 @@ using views::FocusManager; AccessibilityEventRouterViews::AccessibilityEventRouterViews() : most_recent_profile_(NULL), - ALLOW_THIS_IN_INITIALIZER_LIST(method_factory_(this)), - accessibility_enabled_overridden_for_testing_(false), - accessibility_enabled_override_value_(false) { + ALLOW_THIS_IN_INITIALIZER_LIST(method_factory_(this)) { } AccessibilityEventRouterViews::~AccessibilityEventRouterViews() { @@ -50,6 +47,11 @@ AccessibilityEventRouterViews* AccessibilityEventRouterViews::GetInstance() { void AccessibilityEventRouterViews::HandleAccessibilityEvent( views::View* view, ui::AccessibilityTypes::Event event_type) { + if (!ExtensionAccessibilityEventRouter::GetInstance()-> + IsAccessibilityEnabled()) { + return; + } + switch (event_type) { case ui::AccessibilityTypes::EVENT_FOCUS: DispatchAccessibilityNotification( @@ -90,12 +92,13 @@ void AccessibilityEventRouterViews::HandleMenuItemFocused( int item_index, int item_count, bool has_submenu) { - if (!most_recent_profile_) + if (!ExtensionAccessibilityEventRouter::GetInstance()-> + IsAccessibilityEnabled()) { return; + } - if (!IsAccessibilityEnabled(most_recent_profile_)) { + if (!most_recent_profile_) return; - } AccessibilityMenuItemInfo info( most_recent_profile_, @@ -111,15 +114,6 @@ void AccessibilityEventRouterViews::HandleMenuItemFocused( // Private methods // -bool AccessibilityEventRouterViews::IsAccessibilityEnabled(Profile* profile) { - if (accessibility_enabled_overridden_for_testing_) { - return accessibility_enabled_override_value_; - } - DCHECK(profile); - return profile->GetExtensionService()->accessibility_event_router()-> - IsAccessibilityEnabled(); -} - std::string AccessibilityEventRouterViews::GetViewName(views::View* view) { ui::AccessibleViewState state; view->GetAccessibleState(&state); @@ -147,10 +141,6 @@ void AccessibilityEventRouterViews::DispatchAccessibilityNotification( return; } - if (!IsAccessibilityEnabled(profile)) { - return; - } - most_recent_profile_ = profile; std::string class_name = view->GetClassName(); @@ -305,8 +295,3 @@ void AccessibilityEventRouterViews::SendCheckboxNotification( SendAccessibilityNotification(type, &info); } -void AccessibilityEventRouterViews::SetAccessibilityEnabledForTesting( - bool enabled) { - accessibility_enabled_overridden_for_testing_ = true; - accessibility_enabled_override_value_ = enabled; -} diff --git a/chrome/browser/ui/views/accessibility_event_router_views.h b/chrome/browser/ui/views/accessibility_event_router_views.h index 7039a8b..44908bd 100644 --- a/chrome/browser/ui/views/accessibility_event_router_views.h +++ b/chrome/browser/ui/views/accessibility_event_router_views.h @@ -73,8 +73,6 @@ class AccessibilityEventRouterViews { FRIEND_TEST_ALL_PREFIXES(AccessibilityEventRouterViewsTest, TestFocusNotification); - bool IsAccessibilityEnabled(Profile* profile); - // Checks the type of the view and calls one of the more specific // Send*Notification methods, below. void DispatchAccessibilityNotification( @@ -113,11 +111,6 @@ class AccessibilityEventRouterViews { void RecursiveGetMenuItemIndexAndCount( views::View* menu, views::View* item, int* index, int* count); - // Used for testing only. Overrides the accessibility enabled setting - // so the test doesn't depend directly on the ExtensionService and - // ExtensionAccessibilityEventRouter. - void SetAccessibilityEnabledForTesting(bool enabled); - // The profile associated with the most recent window event - used to // figure out where to route a few events that can't be directly traced // to a window with a profile (like menu events). @@ -126,10 +119,6 @@ class AccessibilityEventRouterViews { // Used to defer handling of some events until the next time // through the event loop. ScopedRunnableMethodFactory<AccessibilityEventRouterViews> method_factory_; - - // Used for testing only, with SetAccessibilityEnabledForTesting. - bool accessibility_enabled_overridden_for_testing_; - bool accessibility_enabled_override_value_; }; #endif // CHROME_BROWSER_UI_VIEWS_ACCESSIBILITY_EVENT_ROUTER_VIEWS_H_ diff --git a/chrome/browser/ui/views/accessibility_event_router_views_unittest.cc b/chrome/browser/ui/views/accessibility_event_router_views_unittest.cc index 3dee35fb..3ca6466 100644 --- a/chrome/browser/ui/views/accessibility_event_router_views_unittest.cc +++ b/chrome/browser/ui/views/accessibility_event_router_views_unittest.cc @@ -8,8 +8,6 @@ #include "base/string_util.h" #include "base/utf_string_conversions.h" #include "chrome/browser/extensions/extension_accessibility_api.h" -#include "chrome/browser/extensions/extension_service.h" -#include "chrome/browser/extensions/test_extension_service.h" #include "chrome/browser/ui/views/accessibility_event_router_views.h" #include "chrome/test/testing_profile.h" #include "content/common/notification_registrar.h" @@ -149,15 +147,6 @@ TEST_F(AccessibilityEventRouterViewsTest, TestFocusNotification) { // Put the view in a window. views::Window* window = CreateWindowWithContents(contents); - // Create a profile and associate it with this window. - TestingProfile profile; - window->AsWidget()->native_widget()->SetNativeWindowProperty( - Profile::kProfileKey, &profile); - - // To begin with, accessibility event notifications are off. - AccessibilityEventRouterViews::GetInstance()-> - SetAccessibilityEnabledForTesting(false); - // Set focus to the first button initially. button1->RequestFocus(); @@ -168,8 +157,14 @@ TEST_F(AccessibilityEventRouterViewsTest, TestFocusNotification) { NotificationService::AllSources()); // Switch on accessibility event notifications. - AccessibilityEventRouterViews::GetInstance()-> - SetAccessibilityEnabledForTesting(true); + ExtensionAccessibilityEventRouter* accessibility_event_router = + ExtensionAccessibilityEventRouter::GetInstance(); + accessibility_event_router->SetAccessibilityEnabled(true); + + // Create a profile and associate it with this window. + TestingProfile profile; + window->AsWidget()->native_widget()->SetNativeWindowProperty( + Profile::kProfileKey, &profile); // Change the accessible name of button3. button3->SetAccessibleName(ASCIIToUTF16(kButton3NewASCII)); |