summaryrefslogtreecommitdiffstats
path: root/chrome
diff options
context:
space:
mode:
authoryoz@chromium.org <yoz@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-05-27 21:07:11 +0000
committeryoz@chromium.org <yoz@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-05-27 21:07:11 +0000
commit7da9a823b8f64e7502e83ca0fc2c1cb68e63cdc4 (patch)
tree7c3586db16e97868451cd245849972f22fd14188 /chrome
parent6bb26a170b75285b9256ab8987fd26a8b57a6a6e (diff)
downloadchromium_src-7da9a823b8f64e7502e83ca0fc2c1cb68e63cdc4.zip
chromium_src-7da9a823b8f64e7502e83ca0fc2c1cb68e63cdc4.tar.gz
chromium_src-7da9a823b8f64e7502e83ca0fc2c1cb68e63cdc4.tar.bz2
Revert "Change event routers from singletons to being owned by the ExtensionService."
This breaks, among other things, multi-profile and the first run dialog. Reverting at least for M13. This reverts commit 45758c29485736d7164085e6b7f8bf0999df1c4f. BUG=81745 TEST=none Review URL: http://codereview.chromium.org/7084006 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@87083 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome')
-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, 229 insertions, 192 deletions
diff --git a/chrome/browser/chromeos/extensions/file_browser_event_router.cc b/chrome/browser/chromeos/extensions/file_browser_event_router.cc
index 51f5b6a..723cdc6 100644
--- a/chrome/browser/chromeos/extensions/file_browser_event_router.cc
+++ b/chrome/browser/chromeos/extensions/file_browser_event_router.cc
@@ -47,24 +47,18 @@ DictionaryValue* DiskToDictionaryValue(
return result;
}
-ExtensionFileBrowserEventRouter::ExtensionFileBrowserEventRouter(
- Profile* profile)
- : profile_(profile) {
- DCHECK(profile);
+ExtensionFileBrowserEventRouter::ExtensionFileBrowserEventRouter()
+ : profile_(NULL) {
}
ExtensionFileBrowserEventRouter::~ExtensionFileBrowserEventRouter() {
- if (!profile_)
- return;
- if (!chromeos::CrosLibrary::Get()->EnsureLoaded())
- return;
- chromeos::MountLibrary* lib =
- chromeos::CrosLibrary::Get()->GetMountLibrary();
- lib->RemoveObserver(this);
- profile_ = NULL;
}
-void ExtensionFileBrowserEventRouter::ObserveFileSystemEvents() {
+void ExtensionFileBrowserEventRouter::ObserveFileSystemEvents(
+ Profile* profile) {
+ if (!profile)
+ return;
+ profile_ = profile;
if (!chromeos::CrosLibrary::Get()->EnsureLoaded())
return;
if (chromeos::UserManager::Get()->user_is_logged_in()) {
@@ -76,6 +70,23 @@ void ExtensionFileBrowserEventRouter::ObserveFileSystemEvents() {
}
}
+void ExtensionFileBrowserEventRouter::StopObservingFileSystemEvents() {
+ if (!profile_)
+ return;
+ if (!chromeos::CrosLibrary::Get()->EnsureLoaded())
+ return;
+ chromeos::MountLibrary* lib =
+ chromeos::CrosLibrary::Get()->GetMountLibrary();
+ lib->RemoveObserver(this);
+ profile_ = NULL;
+}
+
+// static
+ExtensionFileBrowserEventRouter*
+ ExtensionFileBrowserEventRouter::GetInstance() {
+ return Singleton<ExtensionFileBrowserEventRouter>::get();
+}
+
void ExtensionFileBrowserEventRouter::DiskChanged(
chromeos::MountLibraryEventType event,
const chromeos::MountLibrary::Disk* disk) {
diff --git a/chrome/browser/chromeos/extensions/file_browser_event_router.h b/chrome/browser/chromeos/extensions/file_browser_event_router.h
index 9b58656..320a80d 100644
--- a/chrome/browser/chromeos/extensions/file_browser_event_router.h
+++ b/chrome/browser/chromeos/extensions/file_browser_event_router.h
@@ -24,12 +24,12 @@ class SystemNotification;
class ExtensionFileBrowserEventRouter
: public chromeos::MountLibrary::Observer {
public:
- explicit ExtensionFileBrowserEventRouter(Profile* profile);
- virtual ~ExtensionFileBrowserEventRouter();
+ static ExtensionFileBrowserEventRouter* GetInstance();
- // Starts observing file system change events. Currently only
+ // Starts/stops observing file system change events. Currently only
// MountLibrary events are being observed.
- void ObserveFileSystemEvents();
+ void ObserveFileSystemEvents(Profile* profile);
+ void StopObservingFileSystemEvents();
// MountLibrary::Observer overrides.
virtual void DiskChanged(chromeos::MountLibraryEventType event,
@@ -38,10 +38,14 @@ class ExtensionFileBrowserEventRouter
const std::string& device_path);
private:
+ friend struct DefaultSingletonTraits<ExtensionFileBrowserEventRouter>;
typedef std::map<std::string, linked_ptr<chromeos::SystemNotification> >
NotificationMap;
typedef std::map<std::string, std::string> MountPointMap;
+ ExtensionFileBrowserEventRouter();
+ virtual ~ExtensionFileBrowserEventRouter();
+
// USB mount event handlers.
void OnDiskAdded(const chromeos::MountLibrary::Disk* disk);
void OnDiskRemoved(const chromeos::MountLibrary::Disk* disk);
diff --git a/chrome/browser/chromeos/login/wizard_accessibility_helper.cc b/chrome/browser/chromeos/login/wizard_accessibility_helper.cc
index e8dd4cf..6d152fa 100644
--- a/chrome/browser/chromeos/login/wizard_accessibility_helper.cc
+++ b/chrome/browser/chromeos/login/wizard_accessibility_helper.cc
@@ -8,7 +8,6 @@
#include "base/stl_util-inl.h"
#include "chrome/browser/browser_process.h"
#include "chrome/browser/extensions/extension_accessibility_api.h"
-#include "chrome/browser/extensions/extension_service.h"
#include "chrome/browser/prefs/pref_service.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/profiles/profile_manager.h"
@@ -115,7 +114,7 @@ void WizardAccessibilityHelper::SetAccessibilityEnabled(bool enabled) {
prefService->SetBoolean(prefs::kAccessibilityEnabled, enabled);
prefService->ScheduleSavePersistentPrefs();
}
- profile_->GetExtensionService()->accessibility_event_router()->
+ ExtensionAccessibilityEventRouter::GetInstance()->
SetAccessibilityEnabled(enabled);
if (doSpeak) {
accessibility_handler_->Speak(enabled ?
diff --git a/chrome/browser/extensions/extension_accessibility_api.cc b/chrome/browser/extensions/extension_accessibility_api.cc
index 8b8042a..cc694d1 100644
--- a/chrome/browser/extensions/extension_accessibility_api.cc
+++ b/chrome/browser/extensions/extension_accessibility_api.cc
@@ -34,16 +34,20 @@ std::string ControlInfoToJsonString(const AccessibilityControlInfo* info) {
return json_args;
}
-ExtensionAccessibilityEventRouter::ExtensionAccessibilityEventRouter()
- : enabled_(false) {
+ExtensionAccessibilityEventRouter*
+ ExtensionAccessibilityEventRouter::GetInstance() {
+ return Singleton<ExtensionAccessibilityEventRouter>::get();
}
+ExtensionAccessibilityEventRouter::ExtensionAccessibilityEventRouter()
+ : enabled_(false) {}
+
ExtensionAccessibilityEventRouter::~ExtensionAccessibilityEventRouter() {
STLDeleteElements(&on_enabled_listeners_);
STLDeleteElements(&on_disabled_listeners_);
}
-void ExtensionAccessibilityEventRouter::Init() {
+void ExtensionAccessibilityEventRouter::ObserveProfile(Profile* profile) {
last_focused_control_dict_.Clear();
if (registrar_.IsEmpty()) {
@@ -188,9 +192,8 @@ void ExtensionAccessibilityEventRouter::DispatchEvent(
bool SetAccessibilityEnabledFunction::RunImpl() {
bool enabled;
EXTENSION_FUNCTION_VALIDATE(args_->GetBoolean(0, &enabled));
- ExtensionAccessibilityEventRouter* accessibility_event_router =
- profile()->GetExtensionService()->accessibility_event_router();
- accessibility_event_router->SetAccessibilityEnabled(enabled);
+ ExtensionAccessibilityEventRouter::GetInstance()
+ ->SetAccessibilityEnabled(enabled);
return true;
}
@@ -198,8 +201,8 @@ bool GetFocusedControlFunction::RunImpl() {
// Get the serialized dict from the last focused control and return it.
// However, if the dict is empty, that means we haven't seen any focus
// events yet, so return null instead.
- ExtensionAccessibilityEventRouter* accessibility_event_router =
- profile()->GetExtensionService()->accessibility_event_router();
+ ExtensionAccessibilityEventRouter *accessibility_event_router =
+ ExtensionAccessibilityEventRouter::GetInstance();
DictionaryValue *last_focused_control_dict =
accessibility_event_router->last_focused_control_dict();
if (last_focused_control_dict->size()) {
diff --git a/chrome/browser/extensions/extension_accessibility_api.h b/chrome/browser/extensions/extension_accessibility_api.h
index 93eac1ff..2dfc4c1 100644
--- a/chrome/browser/extensions/extension_accessibility_api.h
+++ b/chrome/browser/extensions/extension_accessibility_api.h
@@ -10,6 +10,7 @@
#include <vector>
#include "base/callback_old.h"
+#include "base/memory/singleton.h"
#include "base/values.h"
#include "chrome/browser/accessibility_events.h"
#include "chrome/browser/extensions/extension_function.h"
@@ -20,10 +21,11 @@
// to the extension system.
class ExtensionAccessibilityEventRouter : public NotificationObserver {
public:
- explicit ExtensionAccessibilityEventRouter();
- virtual ~ExtensionAccessibilityEventRouter();
+ // Single instance of the event router.
+ static ExtensionAccessibilityEventRouter* GetInstance();
- void Init();
+ // Safe to call multiple times.
+ void ObserveProfile(Profile* profile);
// Get the dict representing the last control that received an
// OnControlFocus event.
@@ -43,6 +45,11 @@ class ExtensionAccessibilityEventRouter : public NotificationObserver {
void AddOnDisabledListener(Callback* callback);
private:
+ friend struct DefaultSingletonTraits<ExtensionAccessibilityEventRouter>;
+
+ ExtensionAccessibilityEventRouter();
+ virtual ~ExtensionAccessibilityEventRouter();
+
// NotificationObserver::Observe.
virtual void Observe(NotificationType type,
const NotificationSource& source,
diff --git a/chrome/browser/extensions/extension_bookmarks_module.cc b/chrome/browser/extensions/extension_bookmarks_module.cc
index 1358ee6..3e3a769 100644
--- a/chrome/browser/extensions/extension_bookmarks_module.cc
+++ b/chrome/browser/extensions/extension_bookmarks_module.cc
@@ -118,13 +118,22 @@ void BookmarksFunction::Observe(NotificationType type,
Release(); // Balanced in Run().
}
-ExtensionBookmarkEventRouter::ExtensionBookmarkEventRouter() {}
+// static
+ExtensionBookmarkEventRouter* ExtensionBookmarkEventRouter::GetInstance() {
+ return Singleton<ExtensionBookmarkEventRouter>::get();
+}
+
+ExtensionBookmarkEventRouter::ExtensionBookmarkEventRouter() {
+}
-ExtensionBookmarkEventRouter::~ExtensionBookmarkEventRouter() {}
+ExtensionBookmarkEventRouter::~ExtensionBookmarkEventRouter() {
+}
void ExtensionBookmarkEventRouter::Observe(BookmarkModel* model) {
- model->AddObserver(this);
- model_ = model;
+ if (models_.find(model) == models_.end()) {
+ model->AddObserver(this);
+ models_.insert(model);
+ }
}
void ExtensionBookmarkEventRouter::DispatchEvent(Profile *profile,
diff --git a/chrome/browser/extensions/extension_bookmarks_module.h b/chrome/browser/extensions/extension_bookmarks_module.h
index eff5c92..1b8efed 100644
--- a/chrome/browser/extensions/extension_bookmarks_module.h
+++ b/chrome/browser/extensions/extension_bookmarks_module.h
@@ -12,6 +12,7 @@
#include "base/compiler_specific.h"
#include "base/memory/ref_counted.h"
+#include "base/memory/singleton.h"
#include "chrome/browser/bookmarks/bookmark_model_observer.h"
#include "chrome/browser/extensions/extension_function.h"
#include "chrome/browser/ui/shell_dialogs.h"
@@ -24,10 +25,11 @@ class FilePath;
// the extension system.
class ExtensionBookmarkEventRouter : public BookmarkModelObserver {
public:
- explicit ExtensionBookmarkEventRouter();
+ static ExtensionBookmarkEventRouter* GetInstance();
virtual ~ExtensionBookmarkEventRouter();
- // Initialize to observe this bookmark model.
+ // Call this for each model to observe. Safe to call multiple times per
+ // model.
void Observe(BookmarkModel* model);
// BookmarkModelObserver:
@@ -55,13 +57,18 @@ class ExtensionBookmarkEventRouter : public BookmarkModelObserver {
virtual void BookmarkImportEnding(BookmarkModel* model) OVERRIDE;
private:
+ ExtensionBookmarkEventRouter();
+ friend struct DefaultSingletonTraits<ExtensionBookmarkEventRouter>;
+
// Helper to actually dispatch an event to extension listeners.
void DispatchEvent(Profile* profile,
const char* event_name,
const std::string& json_args);
- // The model being observed.
- BookmarkModel* model_;
+ // These are stored so that Observe can be called multiple times safely.
+ // This way the caller doesn't have to know whether it's already observing
+ // a particular model or not. The pointers are not owned by this object.
+ std::set<BookmarkModel*> models_;
DISALLOW_COPY_AND_ASSIGN(ExtensionBookmarkEventRouter);
};
diff --git a/chrome/browser/extensions/extension_cookies_api.cc b/chrome/browser/extensions/extension_cookies_api.cc
index d5eabaa..83c535d 100644
--- a/chrome/browser/extensions/extension_cookies_api.cc
+++ b/chrome/browser/extensions/extension_cookies_api.cc
@@ -25,9 +25,10 @@
namespace keys = extension_cookies_api_constants;
-ExtensionCookiesEventRouter::ExtensionCookiesEventRouter() {}
-
-ExtensionCookiesEventRouter::~ExtensionCookiesEventRouter() {}
+// static
+ExtensionCookiesEventRouter* ExtensionCookiesEventRouter::GetInstance() {
+ return Singleton<ExtensionCookiesEventRouter>::get();
+}
void ExtensionCookiesEventRouter::Init() {
if (registrar_.IsEmpty()) {
diff --git a/chrome/browser/extensions/extension_cookies_api.h b/chrome/browser/extensions/extension_cookies_api.h
index 276c336..286c8ba 100644
--- a/chrome/browser/extensions/extension_cookies_api.h
+++ b/chrome/browser/extensions/extension_cookies_api.h
@@ -12,6 +12,7 @@
#include <string>
#include "base/memory/ref_counted.h"
+#include "base/memory/singleton.h"
#include "base/time.h"
#include "chrome/browser/extensions/extension_function.h"
#include "chrome/browser/net/chrome_cookie_notification_details.h"
@@ -30,12 +31,17 @@ class URLRequestContextGetter;
// extension system.
class ExtensionCookiesEventRouter : public NotificationObserver {
public:
- explicit ExtensionCookiesEventRouter();
- virtual ~ExtensionCookiesEventRouter();
+ // Single instance of the event router.
+ static ExtensionCookiesEventRouter* GetInstance();
void Init();
private:
+ friend struct DefaultSingletonTraits<ExtensionCookiesEventRouter>;
+
+ ExtensionCookiesEventRouter() {}
+ virtual ~ExtensionCookiesEventRouter() {}
+
// NotificationObserver implementation.
virtual void Observe(NotificationType type,
const NotificationSource& source,
diff --git a/chrome/browser/extensions/extension_event_router.cc b/chrome/browser/extensions/extension_event_router.cc
index 76a419c..a86bf1c 100644
--- a/chrome/browser/extensions/extension_event_router.cc
+++ b/chrome/browser/extensions/extension_event_router.cc
@@ -106,7 +106,7 @@ void ExtensionEventRouter::AddEventListener(
// We lazily tell the TaskManager to start updating when listeners to the
// processes.onUpdated event arrive.
if (event_name.compare(extension_processes_api_constants::kOnUpdated) == 0)
- profile_->GetExtensionService()->processes_event_router()->ListenerAdded();
+ ExtensionProcessesEventRouter::GetInstance()->ListenerAdded();
}
void ExtensionEventRouter::RemoveEventListener(
@@ -127,8 +127,7 @@ void ExtensionEventRouter::RemoveEventListener(
// If a processes.onUpdated event listener is removed (or a process with one
// exits), then we let the TaskManager know that it has one fewer listener.
if (event_name.compare(extension_processes_api_constants::kOnUpdated) == 0)
- profile_->GetExtensionService()->processes_event_router()->
- ListenerRemoved();
+ ExtensionProcessesEventRouter::GetInstance()->ListenerRemoved();
BrowserThread::PostTask(
BrowserThread::IO, FROM_HERE,
diff --git a/chrome/browser/extensions/extension_history_api.cc b/chrome/browser/extensions/extension_history_api.cc
index 3287184..9ead422 100644
--- a/chrome/browser/extensions/extension_history_api.cc
+++ b/chrome/browser/extensions/extension_history_api.cc
@@ -64,39 +64,49 @@ void AddVisitNode(const history::VisitRow& row, ListValue* list) {
} // namespace
-ExtensionHistoryEventRouter::ExtensionHistoryEventRouter(Profile* profile)
- : profile_(profile) {}
+ExtensionHistoryEventRouter* ExtensionHistoryEventRouter::GetInstance() {
+ return Singleton<ExtensionHistoryEventRouter>::get();
+}
-ExtensionHistoryEventRouter::~ExtensionHistoryEventRouter() {}
+void ExtensionHistoryEventRouter::ObserveProfile(Profile* profile) {
+ NotificationSource source = Source<Profile>(profile);
+ if (profiles_.find(source.map_key()) == profiles_.end())
+ profiles_[source.map_key()] = profile;
-void ExtensionHistoryEventRouter::Init() {
- NotificationSource source = Source<Profile>(profile_);
if (registrar_.IsEmpty()) {
registrar_.Add(this,
NotificationType::HISTORY_URL_VISITED,
- source);
+ NotificationService::AllSources());
registrar_.Add(this,
NotificationType::HISTORY_URLS_DELETED,
- source);
+ NotificationService::AllSources());
}
}
+ExtensionHistoryEventRouter::ExtensionHistoryEventRouter() {}
+
+ExtensionHistoryEventRouter::~ExtensionHistoryEventRouter() {}
+
void ExtensionHistoryEventRouter::Observe(NotificationType type,
const NotificationSource& source,
const NotificationDetails& details) {
- switch (type.value) {
- case NotificationType::HISTORY_URL_VISITED:
- HistoryUrlVisited(
- profile_,
- Details<const history::URLVisitedDetails>(details).ptr());
- break;
- case NotificationType::HISTORY_URLS_DELETED:
- HistoryUrlsRemoved(
- profile_,
- Details<const history::URLsDeletedDetails>(details).ptr());
- break;
- default:
- NOTREACHED();
+ ProfileMap::iterator it = profiles_.find(source.map_key());
+ if (it != profiles_.end()) {
+ Profile* profile = it->second;
+ switch (type.value) {
+ case NotificationType::HISTORY_URL_VISITED:
+ HistoryUrlVisited(
+ profile,
+ Details<const history::URLVisitedDetails>(details).ptr());
+ break;
+ case NotificationType::HISTORY_URLS_DELETED:
+ HistoryUrlsRemoved(
+ profile,
+ Details<const history::URLsDeletedDetails>(details).ptr());
+ break;
+ default:
+ NOTREACHED();
+ }
}
}
diff --git a/chrome/browser/extensions/extension_history_api.h b/chrome/browser/extensions/extension_history_api.h
index b5f7208..f6ddcdc 100644
--- a/chrome/browser/extensions/extension_history_api.h
+++ b/chrome/browser/extensions/extension_history_api.h
@@ -9,23 +9,28 @@
#include <map>
#include <string>
+#include "base/memory/singleton.h"
#include "chrome/browser/extensions/extension_function.h"
#include "chrome/browser/history/history.h"
#include "chrome/browser/history/history_notifications.h"
#include "content/common/notification_registrar.h"
-class Profile;
-
// Observes History service and routes the notifications as events to the
// extension system.
class ExtensionHistoryEventRouter : public NotificationObserver {
public:
- explicit ExtensionHistoryEventRouter(Profile* profile);
- virtual ~ExtensionHistoryEventRouter();
+ // Single instance of the event router.
+ static ExtensionHistoryEventRouter* GetInstance();
- void Init();
+ // Safe to call multiple times.
+ void ObserveProfile(Profile* profile);
private:
+ friend struct DefaultSingletonTraits<ExtensionHistoryEventRouter>;
+
+ ExtensionHistoryEventRouter();
+ virtual ~ExtensionHistoryEventRouter();
+
// NotificationObserver::Observe.
virtual void Observe(NotificationType type,
const NotificationSource& source,
@@ -44,8 +49,9 @@ class ExtensionHistoryEventRouter : public NotificationObserver {
// Used for tracking registrations to history service notifications.
NotificationRegistrar registrar_;
- // The associated Profile owns us transitively via ExtensionService.
- Profile* profile_;
+ // Registered profiles.
+ typedef std::map<uintptr_t, Profile*> ProfileMap;
+ ProfileMap profiles_;
DISALLOW_COPY_AND_ASSIGN(ExtensionHistoryEventRouter);
};
diff --git a/chrome/browser/extensions/extension_management_api.cc b/chrome/browser/extensions/extension_management_api.cc
index 73b905b..0053b1d 100644
--- a/chrome/browser/extensions/extension_management_api.cc
+++ b/chrome/browser/extensions/extension_management_api.cc
@@ -248,6 +248,11 @@ bool UninstallFunction::RunImpl() {
return true;
}
+// static
+ExtensionManagementEventRouter* ExtensionManagementEventRouter::GetInstance() {
+ return Singleton<ExtensionManagementEventRouter>::get();
+}
+
ExtensionManagementEventRouter::ExtensionManagementEventRouter() {}
ExtensionManagementEventRouter::~ExtensionManagementEventRouter() {}
diff --git a/chrome/browser/extensions/extension_management_api.h b/chrome/browser/extensions/extension_management_api.h
index 68aae0b..04b2c8c 100644
--- a/chrome/browser/extensions/extension_management_api.h
+++ b/chrome/browser/extensions/extension_management_api.h
@@ -6,6 +6,7 @@
#define CHROME_BROWSER_EXTENSIONS_EXTENSION_MANAGEMENT_API_H__
#pragma once
+#include "base/memory/singleton.h"
#include "chrome/browser/extensions/extension_function.h"
#include "content/common/notification_observer.h"
#include "content/common/notification_registrar.h"
@@ -49,12 +50,18 @@ class UninstallFunction : public ExtensionManagementFunction {
class ExtensionManagementEventRouter : public NotificationObserver {
public:
- explicit ExtensionManagementEventRouter();
- virtual ~ExtensionManagementEventRouter();
+ // Get the singleton instance of the event router.
+ static ExtensionManagementEventRouter* GetInstance();
+ // Performs one-time initialization of our singleton.
void Init();
private:
+ friend struct DefaultSingletonTraits<ExtensionManagementEventRouter>;
+
+ ExtensionManagementEventRouter();
+ virtual ~ExtensionManagementEventRouter();
+
// NotificationObserver implementation.
virtual void Observe(NotificationType type,
const NotificationSource& source,
diff --git a/chrome/browser/extensions/extension_preference_api.cc b/chrome/browser/extensions/extension_preference_api.cc
index b297905..ae65a58 100644
--- a/chrome/browser/extensions/extension_preference_api.cc
+++ b/chrome/browser/extensions/extension_preference_api.cc
@@ -222,11 +222,6 @@ class PrefMapping {
ExtensionPreferenceEventRouter::ExtensionPreferenceEventRouter(
Profile* profile) : profile_(profile) {
-}
-
-ExtensionPreferenceEventRouter::~ExtensionPreferenceEventRouter() {}
-
-void ExtensionPreferenceEventRouter::Init() {
registrar_.Init(profile_->GetPrefs());
incognito_registrar_.Init(profile_->GetOffTheRecordPrefs());
for (size_t i = 0; i < arraysize(kPrefMapping); ++i) {
@@ -235,6 +230,8 @@ void ExtensionPreferenceEventRouter::Init() {
}
}
+ExtensionPreferenceEventRouter::~ExtensionPreferenceEventRouter() { }
+
void ExtensionPreferenceEventRouter::Observe(
NotificationType type,
const NotificationSource& source,
diff --git a/chrome/browser/extensions/extension_preference_api.h b/chrome/browser/extensions/extension_preference_api.h
index 6f6b3da..06897ce 100644
--- a/chrome/browser/extensions/extension_preference_api.h
+++ b/chrome/browser/extensions/extension_preference_api.h
@@ -17,8 +17,6 @@ class ExtensionPreferenceEventRouter : public NotificationObserver {
explicit ExtensionPreferenceEventRouter(Profile* profile);
virtual ~ExtensionPreferenceEventRouter();
- void Init();
-
private:
// NotificationObserver implementation.
virtual void Observe(NotificationType type,
diff --git a/chrome/browser/extensions/extension_processes_api.cc b/chrome/browser/extensions/extension_processes_api.cc
index 92d61b8..266afdc 100644
--- a/chrome/browser/extensions/extension_processes_api.cc
+++ b/chrome/browser/extensions/extension_processes_api.cc
@@ -42,17 +42,21 @@ DictionaryValue* CreateProcessValue(int process_id,
return result;
}
-ExtensionProcessesEventRouter::ExtensionProcessesEventRouter(Profile* profile)
- : profile_(profile) {
+ExtensionProcessesEventRouter* ExtensionProcessesEventRouter::GetInstance() {
+ return Singleton<ExtensionProcessesEventRouter>::get();
+}
+
+ExtensionProcessesEventRouter::ExtensionProcessesEventRouter() {
+ model_ = TaskManager::GetInstance()->model();
+ model_->AddObserver(this);
}
ExtensionProcessesEventRouter::~ExtensionProcessesEventRouter() {
model_->RemoveObserver(this);
}
-void ExtensionProcessesEventRouter::Init() {
- model_ = TaskManager::GetInstance()->model();
- model_->AddObserver(this);
+void ExtensionProcessesEventRouter::ObserveProfile(Profile* profile) {
+ profiles_.insert(profile);
}
void ExtensionProcessesEventRouter::ListenerAdded() {
@@ -134,8 +138,12 @@ void ExtensionProcessesEventRouter::OnItemsChanged(int start, int length) {
std::string json_args;
base::JSONWriter::Write(&args, false, &json_args);
- // Notify the profile.
- DispatchEvent(profile_, keys::kOnUpdated, json_args);
+ // Notify each profile that is interested.
+ for (ProfileSet::iterator it = profiles_.begin();
+ it != profiles_.end(); it++) {
+ Profile* profile = *it;
+ DispatchEvent(profile, keys::kOnUpdated, json_args);
+ }
}
}
diff --git a/chrome/browser/extensions/extension_processes_api.h b/chrome/browser/extensions/extension_processes_api.h
index 18e871f..fe0a2f9 100644
--- a/chrome/browser/extensions/extension_processes_api.h
+++ b/chrome/browser/extensions/extension_processes_api.h
@@ -13,16 +13,15 @@
#include "chrome/browser/task_manager/task_manager.h"
#include "content/common/notification_registrar.h"
-class Profile;
-
// Observes the Task Manager and routes the notifications as events to the
// extension system.
class ExtensionProcessesEventRouter : public TaskManagerModelObserver {
public:
- explicit ExtensionProcessesEventRouter(Profile* profile);
- virtual ~ExtensionProcessesEventRouter();
+ // Single instance of the event router.
+ static ExtensionProcessesEventRouter* GetInstance();
- void Init();
+ // Safe to call multiple times.
+ void ObserveProfile(Profile* profile);
// Called when an extension process wants to listen to process events.
void ListenerAdded();
@@ -31,6 +30,10 @@ class ExtensionProcessesEventRouter : public TaskManagerModelObserver {
void ListenerRemoved();
private:
+ friend struct DefaultSingletonTraits<ExtensionProcessesEventRouter>;
+
+ ExtensionProcessesEventRouter();
+ virtual ~ExtensionProcessesEventRouter();
// TaskManagerModelObserver methods.
virtual void OnModelChanged() {}
@@ -45,8 +48,9 @@ class ExtensionProcessesEventRouter : public TaskManagerModelObserver {
// Used for tracking registrations to process related notifications.
NotificationRegistrar registrar_;
- // The associated Profile owns us transitively via ExtensionService.
- Profile* profile_;
+ // Registered profiles.
+ typedef std::set<Profile*> ProfileSet;
+ ProfileSet profiles_;
// TaskManager to observe for updates.
TaskManagerModel* model_;
diff --git a/chrome/browser/extensions/extension_service.cc b/chrome/browser/extensions/extension_service.cc
index ecf60b1..a409420 100644
--- a/chrome/browser/extensions/extension_service.cc
+++ b/chrome/browser/extensions/extension_service.cc
@@ -537,35 +537,34 @@ ExtensionService::~ExtensionService() {
ExternalExtensionProviderInterface* provider = i->get();
provider->ServiceShutdown();
}
+
+#if defined(OS_CHROMEOS)
+ if (event_routers_initialized_) {
+ ExtensionFileBrowserEventRouter::GetInstance()->
+ StopObservingFileSystemEvents();
+ }
+#endif
}
void ExtensionService::InitEventRouters() {
if (event_routers_initialized_)
return;
- history_event_router_.reset(new ExtensionHistoryEventRouter(profile_));
- history_event_router_->Init();
- accessibility_event_router_.reset(new ExtensionAccessibilityEventRouter());
- accessibility_event_router_->Init();
+ ExtensionHistoryEventRouter::GetInstance()->ObserveProfile(profile_);
+ ExtensionAccessibilityEventRouter::GetInstance()->ObserveProfile(profile_);
browser_event_router_.reset(new ExtensionBrowserEventRouter(profile_));
browser_event_router_->Init();
preference_event_router_.reset(new ExtensionPreferenceEventRouter(profile_));
- preference_event_router_->Init();
- bookmark_event_router_.reset(new ExtensionBookmarkEventRouter());
- bookmark_event_router_->Observe(profile_->GetBookmarkModel());
- cookies_event_router_.reset(new ExtensionCookiesEventRouter());
- cookies_event_router_->Init();
- management_event_router_.reset(new ExtensionManagementEventRouter());
- management_event_router_->Init();
- processes_event_router_.reset(new ExtensionProcessesEventRouter(profile_));
- processes_event_router_->Init();
- web_navigation_event_router_.reset(new ExtensionWebNavigationEventRouter());
- web_navigation_event_router_->Init();
+ ExtensionBookmarkEventRouter::GetInstance()->Observe(
+ profile_->GetBookmarkModel());
+ ExtensionCookiesEventRouter::GetInstance()->Init();
+ ExtensionManagementEventRouter::GetInstance()->Init();
+ ExtensionProcessesEventRouter::GetInstance()->ObserveProfile(profile_);
+ ExtensionWebNavigationEventRouter::GetInstance()->Init();
#if defined(OS_CHROMEOS)
- file_browser_event_router_.reset(
- new ExtensionFileBrowserEventRouter(profile_));
- file_browser_event_router_->ObserveFileSystemEvents();
+ ExtensionFileBrowserEventRouter::GetInstance()->ObserveFileSystemEvents(
+ profile_);
ExtensionMediaPlayerEventRouter::GetInstance()->Init(profile_);
#endif
diff --git a/chrome/browser/extensions/extension_service.h b/chrome/browser/extensions/extension_service.h
index bdc78ca..1771e4e 100644
--- a/chrome/browser/extensions/extension_service.h
+++ b/chrome/browser/extensions/extension_service.h
@@ -39,18 +39,10 @@
#include "content/common/property_bag.h"
class CrxInstaller;
-class ExtensionAccessibilityEventRouter;
-class ExtensionBookmarkEventRouter;
class ExtensionBrowserEventRouter;
class ExtensionContentSettingsStore;
-class ExtensionCookiesEventRouter;
-class ExtensionFileBrowserEventRouter;
-class ExtensionHistoryEventRouter;
class ExtensionInstallUI;
-class ExtensionManagementEventRouter;
class ExtensionPreferenceEventRouter;
-class ExtensionProcessesEventRouter;
-class ExtensionWebNavigationEventRouter;
class ExtensionServiceBackend;
struct ExtensionSyncData;
class ExtensionToolbarModel;
@@ -442,18 +434,10 @@ class ExtensionService
ExtensionMenuManager* menu_manager() { return &menu_manager_; }
- ExtensionAccessibilityEventRouter* accessibility_event_router() {
- return accessibility_event_router_.get();
- }
-
ExtensionBrowserEventRouter* browser_event_router() {
return browser_event_router_.get();
}
- ExtensionProcessesEventRouter* processes_event_router() {
- return processes_event_router_.get();
- }
-
// Notify the frontend that there was an error loading an extension.
// This method is public because ExtensionServiceBackend can post to here.
void ReportExtensionLoadError(const FilePath& extension_path,
@@ -695,19 +679,9 @@ class ExtensionService
// Flag to make sure event routers are only initialized once.
bool event_routers_initialized_;
- scoped_ptr<ExtensionHistoryEventRouter> history_event_router_;
- scoped_ptr<ExtensionAccessibilityEventRouter> accessibility_event_router_;
scoped_ptr<ExtensionBrowserEventRouter> browser_event_router_;
+
scoped_ptr<ExtensionPreferenceEventRouter> preference_event_router_;
- scoped_ptr<ExtensionBookmarkEventRouter> bookmark_event_router_;
- scoped_ptr<ExtensionCookiesEventRouter> cookies_event_router_;
- scoped_ptr<ExtensionManagementEventRouter> management_event_router_;
- scoped_ptr<ExtensionProcessesEventRouter> processes_event_router_;
- scoped_ptr<ExtensionWebNavigationEventRouter> web_navigation_event_router_;
-
-#if defined(OS_CHROMEOS)
- scoped_ptr<ExtensionFileBrowserEventRouter> file_browser_event_router_;
-#endif
// A collection of external extension providers. Each provider reads
// a source of external extension information. Examples include the
diff --git a/chrome/browser/extensions/extension_webnavigation_api.cc b/chrome/browser/extensions/extension_webnavigation_api.cc
index 14d6318..04da675 100644
--- a/chrome/browser/extensions/extension_webnavigation_api.cc
+++ b/chrome/browser/extensions/extension_webnavigation_api.cc
@@ -251,6 +251,12 @@ ExtensionWebNavigationEventRouter::ExtensionWebNavigationEventRouter() {}
ExtensionWebNavigationEventRouter::~ExtensionWebNavigationEventRouter() {}
+// static
+ExtensionWebNavigationEventRouter*
+ExtensionWebNavigationEventRouter::GetInstance() {
+ return Singleton<ExtensionWebNavigationEventRouter>::get();
+}
+
void ExtensionWebNavigationEventRouter::Init() {
if (registrar_.IsEmpty()) {
registrar_.Add(this,
diff --git a/chrome/browser/extensions/extension_webnavigation_api.h b/chrome/browser/extensions/extension_webnavigation_api.h
index 63938a5..9f475dc 100644
--- a/chrome/browser/extensions/extension_webnavigation_api.h
+++ b/chrome/browser/extensions/extension_webnavigation_api.h
@@ -12,6 +12,7 @@
#include <map>
+#include "base/memory/singleton.h"
#include "chrome/browser/extensions/extension_function.h"
#include "content/browser/tab_contents/tab_contents_observer.h"
#include "content/common/notification_observer.h"
@@ -131,12 +132,19 @@ class ExtensionWebNavigationTabObserver : public TabContentsObserver {
// system.
class ExtensionWebNavigationEventRouter : public NotificationObserver {
public:
- explicit ExtensionWebNavigationEventRouter();
- virtual ~ExtensionWebNavigationEventRouter();
+ // Returns the singleton instance of the event router.
+ static ExtensionWebNavigationEventRouter* GetInstance();
+ // Invoked by the extensions service once the extension system is fully set
+ // up and can start dispatching events to extensions.
void Init();
private:
+ friend struct DefaultSingletonTraits<ExtensionWebNavigationEventRouter>;
+
+ ExtensionWebNavigationEventRouter();
+ virtual ~ExtensionWebNavigationEventRouter();
+
// NotificationObserver implementation.
virtual void Observe(NotificationType type,
const NotificationSource& source,
diff --git a/chrome/browser/ui/views/accessibility_event_router_views.cc b/chrome/browser/ui/views/accessibility_event_router_views.cc
index 58aa6aa..34fb85e 100644
--- a/chrome/browser/ui/views/accessibility_event_router_views.cc
+++ b/chrome/browser/ui/views/accessibility_event_router_views.cc
@@ -10,7 +10,6 @@
#include "base/utf_string_conversions.h"
#include "chrome/browser/browser_process.h"
#include "chrome/browser/extensions/extension_accessibility_api.h"
-#include "chrome/browser/extensions/extension_service.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/profiles/profile_manager.h"
#include "chrome/browser/ui/views/location_bar/location_bar_view.h"
@@ -35,9 +34,7 @@ using views::FocusManager;
AccessibilityEventRouterViews::AccessibilityEventRouterViews()
: most_recent_profile_(NULL),
- ALLOW_THIS_IN_INITIALIZER_LIST(method_factory_(this)),
- accessibility_enabled_overridden_for_testing_(false),
- accessibility_enabled_override_value_(false) {
+ ALLOW_THIS_IN_INITIALIZER_LIST(method_factory_(this)) {
}
AccessibilityEventRouterViews::~AccessibilityEventRouterViews() {
@@ -50,6 +47,11 @@ AccessibilityEventRouterViews* AccessibilityEventRouterViews::GetInstance() {
void AccessibilityEventRouterViews::HandleAccessibilityEvent(
views::View* view, ui::AccessibilityTypes::Event event_type) {
+ if (!ExtensionAccessibilityEventRouter::GetInstance()->
+ IsAccessibilityEnabled()) {
+ return;
+ }
+
switch (event_type) {
case ui::AccessibilityTypes::EVENT_FOCUS:
DispatchAccessibilityNotification(
@@ -90,12 +92,13 @@ void AccessibilityEventRouterViews::HandleMenuItemFocused(
int item_index,
int item_count,
bool has_submenu) {
- if (!most_recent_profile_)
+ if (!ExtensionAccessibilityEventRouter::GetInstance()->
+ IsAccessibilityEnabled()) {
return;
+ }
- if (!IsAccessibilityEnabled(most_recent_profile_)) {
+ if (!most_recent_profile_)
return;
- }
AccessibilityMenuItemInfo info(
most_recent_profile_,
@@ -111,15 +114,6 @@ void AccessibilityEventRouterViews::HandleMenuItemFocused(
// Private methods
//
-bool AccessibilityEventRouterViews::IsAccessibilityEnabled(Profile* profile) {
- if (accessibility_enabled_overridden_for_testing_) {
- return accessibility_enabled_override_value_;
- }
- DCHECK(profile);
- return profile->GetExtensionService()->accessibility_event_router()->
- IsAccessibilityEnabled();
-}
-
std::string AccessibilityEventRouterViews::GetViewName(views::View* view) {
ui::AccessibleViewState state;
view->GetAccessibleState(&state);
@@ -147,10 +141,6 @@ void AccessibilityEventRouterViews::DispatchAccessibilityNotification(
return;
}
- if (!IsAccessibilityEnabled(profile)) {
- return;
- }
-
most_recent_profile_ = profile;
std::string class_name = view->GetClassName();
@@ -305,8 +295,3 @@ void AccessibilityEventRouterViews::SendCheckboxNotification(
SendAccessibilityNotification(type, &info);
}
-void AccessibilityEventRouterViews::SetAccessibilityEnabledForTesting(
- bool enabled) {
- accessibility_enabled_overridden_for_testing_ = true;
- accessibility_enabled_override_value_ = enabled;
-}
diff --git a/chrome/browser/ui/views/accessibility_event_router_views.h b/chrome/browser/ui/views/accessibility_event_router_views.h
index 7039a8b..44908bd 100644
--- a/chrome/browser/ui/views/accessibility_event_router_views.h
+++ b/chrome/browser/ui/views/accessibility_event_router_views.h
@@ -73,8 +73,6 @@ class AccessibilityEventRouterViews {
FRIEND_TEST_ALL_PREFIXES(AccessibilityEventRouterViewsTest,
TestFocusNotification);
- bool IsAccessibilityEnabled(Profile* profile);
-
// Checks the type of the view and calls one of the more specific
// Send*Notification methods, below.
void DispatchAccessibilityNotification(
@@ -113,11 +111,6 @@ class AccessibilityEventRouterViews {
void RecursiveGetMenuItemIndexAndCount(
views::View* menu, views::View* item, int* index, int* count);
- // Used for testing only. Overrides the accessibility enabled setting
- // so the test doesn't depend directly on the ExtensionService and
- // ExtensionAccessibilityEventRouter.
- void SetAccessibilityEnabledForTesting(bool enabled);
-
// The profile associated with the most recent window event - used to
// figure out where to route a few events that can't be directly traced
// to a window with a profile (like menu events).
@@ -126,10 +119,6 @@ class AccessibilityEventRouterViews {
// Used to defer handling of some events until the next time
// through the event loop.
ScopedRunnableMethodFactory<AccessibilityEventRouterViews> method_factory_;
-
- // Used for testing only, with SetAccessibilityEnabledForTesting.
- bool accessibility_enabled_overridden_for_testing_;
- bool accessibility_enabled_override_value_;
};
#endif // CHROME_BROWSER_UI_VIEWS_ACCESSIBILITY_EVENT_ROUTER_VIEWS_H_
diff --git a/chrome/browser/ui/views/accessibility_event_router_views_unittest.cc b/chrome/browser/ui/views/accessibility_event_router_views_unittest.cc
index 3dee35fb..3ca6466 100644
--- a/chrome/browser/ui/views/accessibility_event_router_views_unittest.cc
+++ b/chrome/browser/ui/views/accessibility_event_router_views_unittest.cc
@@ -8,8 +8,6 @@
#include "base/string_util.h"
#include "base/utf_string_conversions.h"
#include "chrome/browser/extensions/extension_accessibility_api.h"
-#include "chrome/browser/extensions/extension_service.h"
-#include "chrome/browser/extensions/test_extension_service.h"
#include "chrome/browser/ui/views/accessibility_event_router_views.h"
#include "chrome/test/testing_profile.h"
#include "content/common/notification_registrar.h"
@@ -149,15 +147,6 @@ TEST_F(AccessibilityEventRouterViewsTest, TestFocusNotification) {
// Put the view in a window.
views::Window* window = CreateWindowWithContents(contents);
- // Create a profile and associate it with this window.
- TestingProfile profile;
- window->AsWidget()->native_widget()->SetNativeWindowProperty(
- Profile::kProfileKey, &profile);
-
- // To begin with, accessibility event notifications are off.
- AccessibilityEventRouterViews::GetInstance()->
- SetAccessibilityEnabledForTesting(false);
-
// Set focus to the first button initially.
button1->RequestFocus();
@@ -168,8 +157,14 @@ TEST_F(AccessibilityEventRouterViewsTest, TestFocusNotification) {
NotificationService::AllSources());
// Switch on accessibility event notifications.
- AccessibilityEventRouterViews::GetInstance()->
- SetAccessibilityEnabledForTesting(true);
+ ExtensionAccessibilityEventRouter* accessibility_event_router =
+ ExtensionAccessibilityEventRouter::GetInstance();
+ accessibility_event_router->SetAccessibilityEnabled(true);
+
+ // Create a profile and associate it with this window.
+ TestingProfile profile;
+ window->AsWidget()->native_widget()->SetNativeWindowProperty(
+ Profile::kProfileKey, &profile);
// Change the accessible name of button3.
button3->SetAccessibleName(ASCIIToUTF16(kButton3NewASCII));