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 | |
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')
25 files changed, 192 insertions, 229 deletions
diff --git a/chrome/browser/chromeos/extensions/file_browser_event_router.cc b/chrome/browser/chromeos/extensions/file_browser_event_router.cc index d5aef36..9e8f7e6 100644 --- a/chrome/browser/chromeos/extensions/file_browser_event_router.cc +++ b/chrome/browser/chromeos/extensions/file_browser_event_router.cc @@ -47,18 +47,24 @@ DictionaryValue* DiskToDictionaryValue( return result; } -ExtensionFileBrowserEventRouter::ExtensionFileBrowserEventRouter() - : profile_(NULL) { +ExtensionFileBrowserEventRouter::ExtensionFileBrowserEventRouter( + Profile* profile) + : profile_(profile) { + DCHECK(profile); } 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( - Profile* profile) { - if (!profile) - return; - profile_ = profile; +void ExtensionFileBrowserEventRouter::ObserveFileSystemEvents() { if (!chromeos::CrosLibrary::Get()->EnsureLoaded()) return; if (chromeos::UserManager::Get()->user_is_logged_in()) { @@ -70,23 +76,6 @@ 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 320a80d..9b58656 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: - static ExtensionFileBrowserEventRouter* GetInstance(); + explicit ExtensionFileBrowserEventRouter(Profile* profile); + virtual ~ExtensionFileBrowserEventRouter(); - // Starts/stops observing file system change events. Currently only + // Starts observing file system change events. Currently only // MountLibrary events are being observed. - void ObserveFileSystemEvents(Profile* profile); - void StopObservingFileSystemEvents(); + void ObserveFileSystemEvents(); // MountLibrary::Observer overrides. virtual void DiskChanged(chromeos::MountLibraryEventType event, @@ -38,14 +38,10 @@ 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 6d152fa..e8dd4cf 100644 --- a/chrome/browser/chromeos/login/wizard_accessibility_helper.cc +++ b/chrome/browser/chromeos/login/wizard_accessibility_helper.cc @@ -8,6 +8,7 @@ #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" @@ -114,7 +115,7 @@ void WizardAccessibilityHelper::SetAccessibilityEnabled(bool enabled) { prefService->SetBoolean(prefs::kAccessibilityEnabled, enabled); prefService->ScheduleSavePersistentPrefs(); } - ExtensionAccessibilityEventRouter::GetInstance()-> + profile_->GetExtensionService()->accessibility_event_router()-> 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 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, diff --git a/chrome/browser/ui/views/accessibility_event_router_views.cc b/chrome/browser/ui/views/accessibility_event_router_views.cc index 34fb85e..58aa6aa 100644 --- a/chrome/browser/ui/views/accessibility_event_router_views.cc +++ b/chrome/browser/ui/views/accessibility_event_router_views.cc @@ -10,6 +10,7 @@ #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" @@ -34,7 +35,9 @@ using views::FocusManager; AccessibilityEventRouterViews::AccessibilityEventRouterViews() : most_recent_profile_(NULL), - ALLOW_THIS_IN_INITIALIZER_LIST(method_factory_(this)) { + ALLOW_THIS_IN_INITIALIZER_LIST(method_factory_(this)), + accessibility_enabled_overridden_for_testing_(false), + accessibility_enabled_override_value_(false) { } AccessibilityEventRouterViews::~AccessibilityEventRouterViews() { @@ -47,11 +50,6 @@ 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( @@ -92,13 +90,12 @@ void AccessibilityEventRouterViews::HandleMenuItemFocused( int item_index, int item_count, bool has_submenu) { - if (!ExtensionAccessibilityEventRouter::GetInstance()-> - IsAccessibilityEnabled()) { + if (!most_recent_profile_) return; - } - if (!most_recent_profile_) + if (!IsAccessibilityEnabled(most_recent_profile_)) { return; + } AccessibilityMenuItemInfo info( most_recent_profile_, @@ -114,6 +111,15 @@ 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); @@ -141,6 +147,10 @@ void AccessibilityEventRouterViews::DispatchAccessibilityNotification( return; } + if (!IsAccessibilityEnabled(profile)) { + return; + } + most_recent_profile_ = profile; std::string class_name = view->GetClassName(); @@ -295,3 +305,8 @@ 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 44908bd..7039a8b 100644 --- a/chrome/browser/ui/views/accessibility_event_router_views.h +++ b/chrome/browser/ui/views/accessibility_event_router_views.h @@ -73,6 +73,8 @@ 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( @@ -111,6 +113,11 @@ 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). @@ -119,6 +126,10 @@ 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 3ca6466..3dee35fb 100644 --- a/chrome/browser/ui/views/accessibility_event_router_views_unittest.cc +++ b/chrome/browser/ui/views/accessibility_event_router_views_unittest.cc @@ -8,6 +8,8 @@ #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" @@ -147,6 +149,15 @@ 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(); @@ -157,14 +168,8 @@ TEST_F(AccessibilityEventRouterViewsTest, TestFocusNotification) { NotificationService::AllSources()); // Switch on accessibility event notifications. - 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); + AccessibilityEventRouterViews::GetInstance()-> + SetAccessibilityEnabledForTesting(true); // Change the accessible name of button3. button3->SetAccessibleName(ASCIIToUTF16(kButton3NewASCII)); |