diff options
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)); |