summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--chrome/browser/chromeos/extensions/file_browser_event_router.cc37
-rw-r--r--chrome/browser/chromeos/extensions/file_browser_event_router.h12
-rw-r--r--chrome/browser/chromeos/login/wizard_accessibility_helper.cc3
-rw-r--r--chrome/browser/extensions/extension_accessibility_api.cc19
-rw-r--r--chrome/browser/extensions/extension_accessibility_api.h13
-rw-r--r--chrome/browser/extensions/extension_bookmarks_module.cc17
-rw-r--r--chrome/browser/extensions/extension_bookmarks_module.h15
-rw-r--r--chrome/browser/extensions/extension_cookies_api.cc7
-rw-r--r--chrome/browser/extensions/extension_cookies_api.h10
-rw-r--r--chrome/browser/extensions/extension_event_router.cc5
-rw-r--r--chrome/browser/extensions/extension_history_api.cc50
-rw-r--r--chrome/browser/extensions/extension_history_api.h20
-rw-r--r--chrome/browser/extensions/extension_management_api.cc5
-rw-r--r--chrome/browser/extensions/extension_management_api.h11
-rw-r--r--chrome/browser/extensions/extension_preference_api.cc7
-rw-r--r--chrome/browser/extensions/extension_preference_api.h2
-rw-r--r--chrome/browser/extensions/extension_processes_api.cc22
-rw-r--r--chrome/browser/extensions/extension_processes_api.h18
-rw-r--r--chrome/browser/extensions/extension_service.cc35
-rw-r--r--chrome/browser/extensions/extension_service.h28
-rw-r--r--chrome/browser/extensions/extension_webnavigation_api.cc6
-rw-r--r--chrome/browser/extensions/extension_webnavigation_api.h12
-rw-r--r--chrome/browser/ui/views/accessibility_event_router_views.cc35
-rw-r--r--chrome/browser/ui/views/accessibility_event_router_views.h11
-rw-r--r--chrome/browser/ui/views/accessibility_event_router_views_unittest.cc21
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));