summaryrefslogtreecommitdiffstats
path: root/chrome
diff options
context:
space:
mode:
authormpcomplete@chromium.org <mpcomplete@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-10-15 18:22:41 +0000
committermpcomplete@chromium.org <mpcomplete@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-10-15 18:22:41 +0000
commit2c699655d5ed9cbf296a9389c3efe2a9fe01973e (patch)
tree843da73da9228499bf88063490fba73845740740 /chrome
parent731ae5165404c2ccf32af50ac3fda3364d41fbb1 (diff)
downloadchromium_src-2c699655d5ed9cbf296a9389c3efe2a9fe01973e.zip
chromium_src-2c699655d5ed9cbf296a9389c3efe2a9fe01973e.tar.gz
chromium_src-2c699655d5ed9cbf296a9389c3efe2a9fe01973e.tar.bz2
Pull events-related code out of ExtensionMessageService into its own class.
The events code is independent of the messaging code and didn't belong in the same class. This is part 1 of an extension event refactor. See bug for more details. BUG=58214 TEST=covered by tests Review URL: http://codereview.chromium.org/3758005 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@62764 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome')
-rw-r--r--chrome/browser/automation/automation_provider_win.cc6
-rw-r--r--chrome/browser/extensions/extension_accessibility_api.cc6
-rw-r--r--chrome/browser/extensions/extension_bookmark_manager_api.cc6
-rw-r--r--chrome/browser/extensions/extension_bookmarks_module.cc6
-rw-r--r--chrome/browser/extensions/extension_browser_event_router.cc10
-rw-r--r--chrome/browser/extensions/extension_cookies_api.cc6
-rw-r--r--chrome/browser/extensions/extension_devtools_bridge.cc5
-rw-r--r--chrome/browser/extensions/extension_event_router.cc147
-rw-r--r--chrome/browser/extensions/extension_event_router.h76
-rw-r--r--chrome/browser/extensions/extension_history_api.cc6
-rw-r--r--chrome/browser/extensions/extension_idle_api.cc4
-rw-r--r--chrome/browser/extensions/extension_management_api.cc10
-rw-r--r--chrome/browser/extensions/extension_menu_manager.cc9
-rw-r--r--chrome/browser/extensions/extension_menu_manager_unittest.cc22
-rw-r--r--chrome/browser/extensions/extension_message_service.cc115
-rw-r--r--chrome/browser/extensions/extension_message_service.h49
-rw-r--r--chrome/browser/extensions/extension_messages_apitest.cc14
-rw-r--r--chrome/browser/extensions/extension_omnibox_api.cc14
-rw-r--r--chrome/browser/extensions/extension_popup_api.cc4
-rw-r--r--chrome/browser/extensions/extension_sidebar_api.cc4
-rw-r--r--chrome/browser/extensions/extension_webnavigation_api.cc6
-rw-r--r--chrome/browser/profile.cc4
-rw-r--r--chrome/browser/profile.h6
-rw-r--r--chrome/browser/profile_impl.cc6
-rw-r--r--chrome/browser/profile_impl.h2
-rw-r--r--chrome/browser/renderer_host/browser_render_process_host.cc15
-rw-r--r--chrome/chrome_browser.gypi2
-rw-r--r--chrome/test/testing_profile.h1
28 files changed, 328 insertions, 233 deletions
diff --git a/chrome/browser/automation/automation_provider_win.cc b/chrome/browser/automation/automation_provider_win.cc
index 85bb7c2..3a30d25 100644
--- a/chrome/browser/automation/automation_provider_win.cc
+++ b/chrome/browser/automation/automation_provider_win.cc
@@ -16,7 +16,7 @@
#include "chrome/browser/automation/extension_port_container.h"
#include "chrome/browser/automation/ui_controls.h"
#include "chrome/browser/browser_window.h"
-#include "chrome/browser/extensions/extension_message_service.h"
+#include "chrome/browser/extensions/extension_event_router.h"
#include "chrome/browser/external_tab_container_win.h"
#include "chrome/browser/profile.h"
#include "chrome/browser/renderer_host/render_view_host.h"
@@ -495,8 +495,8 @@ bool AutomationProvider::InterceptBrowserEventMessageFromExternalHost(
return false;
}
- if (profile()->GetExtensionMessageService()) {
- profile()->GetExtensionMessageService()->DispatchEventToRenderers(
+ if (profile()->GetExtensionEventRouter()) {
+ profile()->GetExtensionEventRouter()->DispatchEventToRenderers(
event_name, json_args, profile(), GURL());
}
diff --git a/chrome/browser/extensions/extension_accessibility_api.cc b/chrome/browser/extensions/extension_accessibility_api.cc
index 235a521..3a24759 100644
--- a/chrome/browser/extensions/extension_accessibility_api.cc
+++ b/chrome/browser/extensions/extension_accessibility_api.cc
@@ -13,8 +13,8 @@
#include "chrome/browser/browser_window.h"
#include "chrome/browser/extensions/extension_accessibility_api.h"
#include "chrome/browser/extensions/extension_accessibility_api_constants.h"
+#include "chrome/browser/extensions/extension_event_router.h"
#include "chrome/browser/extensions/extension_function_dispatcher.h"
-#include "chrome/browser/extensions/extension_message_service.h"
#include "chrome/browser/extensions/extensions_service.h"
#include "chrome/browser/profile.h"
#include "chrome/common/extensions/extension.h"
@@ -181,8 +181,8 @@ void ExtensionAccessibilityEventRouter::DispatchEvent(
Profile* profile,
const char* event_name,
const std::string& json_args) {
- if (enabled_ && profile && profile->GetExtensionMessageService()) {
- profile->GetExtensionMessageService()->DispatchEventToRenderers(
+ if (enabled_ && profile && profile->GetExtensionEventRouter()) {
+ profile->GetExtensionEventRouter()->DispatchEventToRenderers(
event_name, json_args, NULL, GURL());
}
}
diff --git a/chrome/browser/extensions/extension_bookmark_manager_api.cc b/chrome/browser/extensions/extension_bookmark_manager_api.cc
index f5db93f..1b17384 100644
--- a/chrome/browser/extensions/extension_bookmark_manager_api.cc
+++ b/chrome/browser/extensions/extension_bookmark_manager_api.cc
@@ -17,7 +17,7 @@
#include "chrome/browser/extensions/extension_bookmark_helpers.h"
#include "chrome/browser/extensions/extension_bookmarks_module_constants.h"
#include "chrome/browser/extensions/extension_dom_ui.h"
-#include "chrome/browser/extensions/extension_message_service.h"
+#include "chrome/browser/extensions/extension_event_router.h"
#include "chrome/browser/profile.h"
#include "chrome/browser/renderer_host/render_view_host.h"
#include "chrome/browser/tab_contents/tab_contents.h"
@@ -155,12 +155,12 @@ ExtensionBookmarkManagerEventRouter::~ExtensionBookmarkManagerEventRouter() {
void ExtensionBookmarkManagerEventRouter::DispatchEvent(const char* event_name,
const ListValue* args) {
- if (!profile_->GetExtensionMessageService())
+ if (!profile_->GetExtensionEventRouter())
return;
std::string json_args;
base::JSONWriter::Write(args, false, &json_args);
- profile_->GetExtensionMessageService()->DispatchEventToRenderers(
+ profile_->GetExtensionEventRouter()->DispatchEventToRenderers(
event_name, json_args, NULL, GURL());
}
diff --git a/chrome/browser/extensions/extension_bookmarks_module.cc b/chrome/browser/extensions/extension_bookmarks_module.cc
index 1f6e4ee..791b4f9 100644
--- a/chrome/browser/extensions/extension_bookmarks_module.cc
+++ b/chrome/browser/extensions/extension_bookmarks_module.cc
@@ -17,7 +17,7 @@
#include "chrome/browser/browser_list.h"
#include "chrome/browser/extensions/extension_bookmark_helpers.h"
#include "chrome/browser/extensions/extension_bookmarks_module_constants.h"
-#include "chrome/browser/extensions/extension_message_service.h"
+#include "chrome/browser/extensions/extension_event_router.h"
#include "chrome/browser/extensions/extensions_quota_service.h"
#include "chrome/browser/importer/importer.h"
#include "chrome/browser/importer/importer_data_types.h"
@@ -95,8 +95,8 @@ void ExtensionBookmarkEventRouter::Observe(BookmarkModel* model) {
void ExtensionBookmarkEventRouter::DispatchEvent(Profile *profile,
const char* event_name,
const std::string json_args) {
- if (profile->GetExtensionMessageService()) {
- profile->GetExtensionMessageService()->DispatchEventToRenderers(
+ if (profile->GetExtensionEventRouter()) {
+ profile->GetExtensionEventRouter()->DispatchEventToRenderers(
event_name, json_args, NULL, GURL());
}
}
diff --git a/chrome/browser/extensions/extension_browser_event_router.cc b/chrome/browser/extensions/extension_browser_event_router.cc
index 6728c8d..ed37fa9 100644
--- a/chrome/browser/extensions/extension_browser_event_router.cc
+++ b/chrome/browser/extensions/extension_browser_event_router.cc
@@ -9,7 +9,7 @@
#include "chrome/browser/browser.h"
#include "chrome/browser/profile.h"
#include "chrome/browser/extensions/extension_event_names.h"
-#include "chrome/browser/extensions/extension_message_service.h"
+#include "chrome/browser/extensions/extension_event_router.h"
#include "chrome/browser/extensions/extension_tabs_module_constants.h"
#include "chrome/browser/extensions/extension_page_actions_module_constants.h"
#include "chrome/browser/tab_contents/navigation_entry.h"
@@ -67,8 +67,8 @@ ExtensionBrowserEventRouter* ExtensionBrowserEventRouter::GetInstance() {
static void DispatchEvent(Profile* profile,
const char* event_name,
const std::string json_args) {
- if (profile->GetExtensionMessageService()) {
- profile->GetExtensionMessageService()->DispatchEventToRenderers(
+ if (profile->GetExtensionEventRouter()) {
+ profile->GetExtensionEventRouter()->DispatchEventToRenderers(
event_name, json_args, profile, GURL());
}
}
@@ -476,7 +476,7 @@ void ExtensionBrowserEventRouter::PageActionExecuted(
NULL, NULL, &tab_contents, NULL)) {
return;
}
- std::string event_name = ExtensionMessageService::GetPerExtensionEventName(
+ std::string event_name = ExtensionEventRouter::GetPerExtensionEventName(
"pageAction.onClicked", extension_id);
DispatchEventWithTab(profile, event_name.c_str(), tab_contents);
}
@@ -487,7 +487,7 @@ void ExtensionBrowserEventRouter::BrowserActionExecuted(
int tab_id = 0;
if (!ExtensionTabUtil::GetDefaultTab(browser, &tab_contents, &tab_id))
return;
- std::string event_name = ExtensionMessageService::GetPerExtensionEventName(
+ std::string event_name = ExtensionEventRouter::GetPerExtensionEventName(
"browserAction.onClicked", extension_id);
DispatchEventWithTab(profile, event_name.c_str(), tab_contents);
}
diff --git a/chrome/browser/extensions/extension_cookies_api.cc b/chrome/browser/extensions/extension_cookies_api.cc
index 7a6e918..b97c74d 100644
--- a/chrome/browser/extensions/extension_cookies_api.cc
+++ b/chrome/browser/extensions/extension_cookies_api.cc
@@ -13,7 +13,7 @@
#include "chrome/browser/browser_thread.h"
#include "chrome/browser/extensions/extension_cookies_api_constants.h"
#include "chrome/browser/extensions/extension_cookies_helpers.h"
-#include "chrome/browser/extensions/extension_message_service.h"
+#include "chrome/browser/extensions/extension_event_router.h"
#include "chrome/browser/profile.h"
#include "chrome/common/extensions/extension.h"
#include "chrome/common/extensions/extension_error_utils.h"
@@ -75,8 +75,8 @@ void ExtensionCookiesEventRouter::DispatchEvent(Profile* profile,
const char* event_name,
const std::string& json_args,
GURL& cookie_domain) {
- if (profile && profile->GetExtensionMessageService()) {
- profile->GetExtensionMessageService()->DispatchEventToRenderers(
+ if (profile && profile->GetExtensionEventRouter()) {
+ profile->GetExtensionEventRouter()->DispatchEventToRenderers(
event_name, json_args, profile, cookie_domain);
}
}
diff --git a/chrome/browser/extensions/extension_devtools_bridge.cc b/chrome/browser/extensions/extension_devtools_bridge.cc
index 83cefdb..d1731ce 100644
--- a/chrome/browser/extensions/extension_devtools_bridge.cc
+++ b/chrome/browser/extensions/extension_devtools_bridge.cc
@@ -10,6 +10,7 @@
#include "chrome/browser/debugger/devtools_manager.h"
#include "chrome/browser/extensions/extension_devtools_events.h"
#include "chrome/browser/extensions/extension_devtools_manager.h"
+#include "chrome/browser/extensions/extension_event_router.h"
#include "chrome/browser/extensions/extension_tabs_module.h"
#include "chrome/browser/profile.h"
#include "chrome/browser/tab_contents/tab_contents.h"
@@ -65,7 +66,7 @@ void ExtensionDevToolsBridge::InspectedTabClosing() {
// TODO(knorton): Remove this event in favor of the standard tabs.onRemoved
// event in extensions.
std::string json("[{}]");
- profile_->GetExtensionMessageService()->DispatchEventToRenderers(
+ profile_->GetExtensionEventRouter()->DispatchEventToRenderers(
on_tab_close_event_name_, json, profile_, GURL());
// This may result in this object being destroyed.
@@ -83,7 +84,7 @@ void ExtensionDevToolsBridge::OnDispatchToAPU(const std::string& data) {
DCHECK_EQ(MessageLoop::current()->type(), MessageLoop::TYPE_UI);
std::string json = base::StringPrintf("[%s]", data.c_str());
- profile_->GetExtensionMessageService()->DispatchEventToRenderers(
+ profile_->GetExtensionEventRouter()->DispatchEventToRenderers(
on_page_event_name_, json, profile_, GURL());
}
diff --git a/chrome/browser/extensions/extension_event_router.cc b/chrome/browser/extensions/extension_event_router.cc
new file mode 100644
index 0000000..830f8ca5
--- /dev/null
+++ b/chrome/browser/extensions/extension_event_router.cc
@@ -0,0 +1,147 @@
+// Copyright (c) 2010 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/extensions/extension_event_router.h"
+
+#include "base/values.h"
+#include "chrome/browser/child_process_security_policy.h"
+#include "chrome/browser/extensions/extension_devtools_manager.h"
+#include "chrome/browser/extensions/extension_tabs_module.h"
+#include "chrome/browser/profile.h"
+#include "chrome/browser/renderer_host/render_process_host.h"
+#include "chrome/common/extensions/extension.h"
+#include "chrome/common/notification_service.h"
+#include "chrome/common/render_messages.h"
+
+namespace {
+
+const char kDispatchEvent[] = "Event.dispatchJSON";
+
+static void DispatchEvent(RenderProcessHost* renderer,
+ const std::string& event_name,
+ const std::string& event_args,
+ bool cross_incognito,
+ const GURL& event_url) {
+ ListValue args;
+ args.Set(0, Value::CreateStringValue(event_name));
+ args.Set(1, Value::CreateStringValue(event_args));
+ renderer->Send(new ViewMsg_ExtensionMessageInvoke(MSG_ROUTING_CONTROL,
+ kDispatchEvent, args, cross_incognito, event_url));
+}
+
+} // namespace
+
+// static
+std::string ExtensionEventRouter::GetPerExtensionEventName(
+ const std::string& event_name, const std::string& extension_id) {
+ // This should match the method we use in extension_process_binding.js when
+ // setting up the corresponding chrome.Event object.
+ return event_name + "/" + extension_id;
+}
+
+ExtensionEventRouter::ExtensionEventRouter(Profile* profile)
+ : profile_(profile),
+ extension_devtools_manager_(profile->GetExtensionDevToolsManager()) {
+ registrar_.Add(this, NotificationType::RENDERER_PROCESS_TERMINATED,
+ NotificationService::AllSources());
+ registrar_.Add(this, NotificationType::RENDERER_PROCESS_CLOSED,
+ NotificationService::AllSources());
+}
+
+ExtensionEventRouter::~ExtensionEventRouter() {
+}
+
+void ExtensionEventRouter::AddEventListener(
+ const std::string& event_name,
+ int render_process_id) {
+ DCHECK_EQ(listeners_[event_name].count(render_process_id), 0u) << event_name;
+ listeners_[event_name].insert(render_process_id);
+
+ if (extension_devtools_manager_.get()) {
+ extension_devtools_manager_->AddEventListener(event_name,
+ render_process_id);
+ }
+}
+
+void ExtensionEventRouter::RemoveEventListener(
+ const std::string& event_name,
+ int render_process_id) {
+ DCHECK_EQ(listeners_[event_name].count(render_process_id), 1u) <<
+ " PID=" << render_process_id << " event=" << event_name;
+ listeners_[event_name].erase(render_process_id);
+
+ if (extension_devtools_manager_.get()) {
+ extension_devtools_manager_->RemoveEventListener(event_name,
+ render_process_id);
+ }
+}
+
+bool ExtensionEventRouter::HasEventListener(const std::string& event_name) {
+ return (listeners_.find(event_name) != listeners_.end() &&
+ !listeners_[event_name].empty());
+}
+
+void ExtensionEventRouter::DispatchEventToRenderers(
+ const std::string& event_name, const std::string& event_args,
+ Profile* restrict_to_profile, const GURL& event_url) {
+ if (!profile_)
+ return;
+
+ // We don't expect to get events from a completely different profile.
+ DCHECK(!restrict_to_profile || profile_->IsSameProfile(restrict_to_profile));
+
+ ListenerMap::iterator it = listeners_.find(event_name);
+ if (it == listeners_.end())
+ return;
+
+ std::set<int>& pids = it->second;
+
+ // Send the event only to renderers that are listening for it.
+ for (std::set<int>::iterator pid = pids.begin(); pid != pids.end(); ++pid) {
+ RenderProcessHost* renderer = RenderProcessHost::FromID(*pid);
+ if (!renderer)
+ continue;
+ if (!ChildProcessSecurityPolicy::GetInstance()->
+ HasExtensionBindings(*pid)) {
+ // Don't send browser-level events to unprivileged processes.
+ continue;
+ }
+
+ // Is this event from a different profile than the renderer (ie, an
+ // incognito tab event sent to a normal process, or vice versa).
+ bool cross_incognito =
+ restrict_to_profile && renderer->profile() != restrict_to_profile;
+ DispatchEvent(renderer, event_name, event_args, cross_incognito, event_url);
+ }
+}
+
+void ExtensionEventRouter::DispatchEventToExtension(
+ const std::string& extension_id,
+ const std::string& event_name, const std::string& event_args,
+ Profile* restrict_to_profile, const GURL& event_url) {
+ DispatchEventToRenderers(GetPerExtensionEventName(event_name, extension_id),
+ event_args, restrict_to_profile, event_url);
+}
+
+void ExtensionEventRouter::Observe(NotificationType type,
+ const NotificationSource& source,
+ const NotificationDetails& details) {
+ switch (type.value) {
+ case NotificationType::RENDERER_PROCESS_TERMINATED:
+ case NotificationType::RENDERER_PROCESS_CLOSED: {
+ RenderProcessHost* renderer = Source<RenderProcessHost>(source).ptr();
+ // Remove all event listeners associated with this renderer
+ for (ListenerMap::iterator it = listeners_.begin();
+ it != listeners_.end(); ) {
+ ListenerMap::iterator current = it++;
+ if (current->second.count(renderer->id()) != 0)
+ RemoveEventListener(current->first, renderer->id());
+ }
+ break;
+ }
+ default:
+ NOTREACHED();
+ return;
+ }
+}
diff --git a/chrome/browser/extensions/extension_event_router.h b/chrome/browser/extensions/extension_event_router.h
new file mode 100644
index 0000000..5fb29e4
--- /dev/null
+++ b/chrome/browser/extensions/extension_event_router.h
@@ -0,0 +1,76 @@
+// Copyright (c) 2010 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_EXTENSIONS_EXTENSION_EVENT_ROUTER_H_
+#define CHROME_BROWSER_EXTENSIONS_EXTENSION_EVENT_ROUTER_H_
+#pragma once
+
+#include <map>
+#include <set>
+#include <string>
+
+#include "base/ref_counted.h"
+#include "chrome/common/notification_observer.h"
+#include "chrome/common/notification_registrar.h"
+
+class GURL;
+class ExtensionDevToolsManager;
+class Profile;
+class RenderProcessHost;
+
+class ExtensionEventRouter : public NotificationObserver {
+ public:
+ explicit ExtensionEventRouter(Profile* profile);
+ ~ExtensionEventRouter();
+
+ // Returns the event name for an event that is extension-specific.
+ static std::string GetPerExtensionEventName(const std::string& event_name,
+ const std::string& extension_id);
+
+ // Add or remove |render_process_id| as a listener for |event_name|.
+ void AddEventListener(const std::string& event_name,
+ int render_process_id);
+ void RemoveEventListener(const std::string& event_name,
+ int render_process_id);
+
+ // Returns true if there is at least one listener for the given event.
+ bool HasEventListener(const std::string& event_name);
+
+ // Send an event to every registered extension renderer. If
+ // |restrict_to_profile| is non-NULL, then the event will not be sent to other
+ // profiles unless the extension has permission (e.g. incognito tab update ->
+ // normal profile only works if extension is allowed incognito access). If
+ // |event_url| is not empty, the event is only sent to extension with host
+ // permissions for this url.
+ virtual void DispatchEventToRenderers(
+ const std::string& event_name, const std::string& event_args,
+ Profile* restrict_to_profile, const GURL& event_url);
+
+ // Same as above, except use the extension-specific naming scheme for the
+ // event. This is used by events that are per-extension.
+ void DispatchEventToExtension(
+ const std::string& extension_id,
+ const std::string& event_name, const std::string& event_args,
+ Profile* restrict_to_profile, const GURL& event_url);
+
+ private:
+ virtual void Observe(NotificationType type,
+ const NotificationSource& source,
+ const NotificationDetails& details);
+
+ Profile* profile_;
+
+ NotificationRegistrar registrar_;
+
+ scoped_refptr<ExtensionDevToolsManager> extension_devtools_manager_;
+
+ // A map between an event name and a set of process id's that are listening
+ // to that event.
+ typedef std::map<std::string, std::set<int> > ListenerMap;
+ ListenerMap listeners_;
+
+ DISALLOW_COPY_AND_ASSIGN(ExtensionEventRouter);
+};
+
+#endif // CHROME_BROWSER_EXTENSIONS_EXTENSION_EVENT_ROUTER_H_
diff --git a/chrome/browser/extensions/extension_history_api.cc b/chrome/browser/extensions/extension_history_api.cc
index fac0e1f..412c091 100644
--- a/chrome/browser/extensions/extension_history_api.cc
+++ b/chrome/browser/extensions/extension_history_api.cc
@@ -10,8 +10,8 @@
#include "base/string_number_conversions.h"
#include "base/task.h"
#include "base/values.h"
+#include "chrome/browser/extensions/extension_event_router.h"
#include "chrome/browser/extensions/extension_history_api_constants.h"
-#include "chrome/browser/extensions/extension_message_service.h"
#include "chrome/browser/history/history.h"
#include "chrome/browser/history/history_types.h"
#include "chrome/browser/profile.h"
@@ -141,8 +141,8 @@ void ExtensionHistoryEventRouter::HistoryUrlsRemoved(
void ExtensionHistoryEventRouter::DispatchEvent(Profile* profile,
const char* event_name,
const std::string& json_args) {
- if (profile && profile->GetExtensionMessageService()) {
- profile->GetExtensionMessageService()->DispatchEventToRenderers(
+ if (profile && profile->GetExtensionEventRouter()) {
+ profile->GetExtensionEventRouter()->DispatchEventToRenderers(
event_name, json_args, profile, GURL());
}
}
diff --git a/chrome/browser/extensions/extension_idle_api.cc b/chrome/browser/extensions/extension_idle_api.cc
index 0de5032..8af7d97 100644
--- a/chrome/browser/extensions/extension_idle_api.cc
+++ b/chrome/browser/extensions/extension_idle_api.cc
@@ -15,9 +15,9 @@
#include "base/task.h"
#include "base/time.h"
#include "chrome/browser/browser.h"
+#include "chrome/browser/extensions/extension_event_router.h"
#include "chrome/browser/extensions/extension_host.h"
#include "chrome/browser/extensions/extension_idle_api_constants.h"
-#include "chrome/browser/extensions/extension_message_service.h"
#include "chrome/browser/extensions/extensions_service.h"
#include "chrome/browser/renderer_host/render_view_host.h"
#include "chrome/common/extensions/extension.h"
@@ -152,6 +152,6 @@ void ExtensionIdleEventRouter::OnIdleStateChange(Profile* profile,
std::string json_args;
base::JSONWriter::Write(&args, false, &json_args);
- profile->GetExtensionMessageService()->DispatchEventToRenderers(
+ profile->GetExtensionEventRouter()->DispatchEventToRenderers(
keys::kOnStateChanged, json_args, profile, GURL());
}
diff --git a/chrome/browser/extensions/extension_management_api.cc b/chrome/browser/extensions/extension_management_api.cc
index 9c900de..50777db 100644
--- a/chrome/browser/extensions/extension_management_api.cc
+++ b/chrome/browser/extensions/extension_management_api.cc
@@ -13,7 +13,7 @@
#include "base/string_util.h"
#include "chrome/browser/browser.h"
#include "chrome/browser/extensions/extension_event_names.h"
-#include "chrome/browser/extensions/extension_message_service.h"
+#include "chrome/browser/extensions/extension_event_router.h"
#include "chrome/browser/extensions/extension_updater.h"
#include "chrome/browser/extensions/extensions_service.h"
#include "chrome/browser/profile.h"
@@ -229,10 +229,6 @@ void ExtensionManagementEventRouter::Observe(
std::string args_json;
base::JSONWriter::Write(&args, false /* pretty_print */, &args_json);
- ExtensionMessageService* message_service =
- profile->GetExtensionMessageService();
- message_service->DispatchEventToRenderers(event_name,
- args_json,
- NULL,
- GURL());
+ profile->GetExtensionEventRouter()->DispatchEventToRenderers(
+ event_name, args_json, NULL, GURL());
}
diff --git a/chrome/browser/extensions/extension_menu_manager.cc b/chrome/browser/extensions/extension_menu_manager.cc
index e4bda71..d5f33e6 100644
--- a/chrome/browser/extensions/extension_menu_manager.cc
+++ b/chrome/browser/extensions/extension_menu_manager.cc
@@ -13,7 +13,7 @@
#include "base/utf_string_conversions.h"
#include "base/values.h"
#include "base/json/json_writer.h"
-#include "chrome/browser/extensions/extension_message_service.h"
+#include "chrome/browser/extensions/extension_event_router.h"
#include "chrome/browser/extensions/extension_tabs_module.h"
#include "chrome/browser/profile.h"
#include "chrome/common/extensions/extension.h"
@@ -373,8 +373,8 @@ void ExtensionMenuManager::ExecuteCommand(
TabContents* tab_contents,
const ContextMenuParams& params,
const ExtensionMenuItem::Id& menuItemId) {
- ExtensionMessageService* service = profile->GetExtensionMessageService();
- if (!service)
+ ExtensionEventRouter* event_router = profile->GetExtensionEventRouter();
+ if (!event_router)
return;
ExtensionMenuItem* item = GetItemById(menuItemId);
@@ -441,7 +441,8 @@ void ExtensionMenuManager::ExecuteCommand(
std::string json_args;
base::JSONWriter::Write(&args, false, &json_args);
std::string event_name = "contextMenus/" + item->extension_id();
- service->DispatchEventToRenderers(event_name, json_args, profile, GURL());
+ event_router->DispatchEventToRenderers(
+ event_name, json_args, profile, GURL());
}
void ExtensionMenuManager::Observe(NotificationType type,
diff --git a/chrome/browser/extensions/extension_menu_manager_unittest.cc b/chrome/browser/extensions/extension_menu_manager_unittest.cc
index 490db51..3dc6f69 100644
--- a/chrome/browser/extensions/extension_menu_manager_unittest.cc
+++ b/chrome/browser/extensions/extension_menu_manager_unittest.cc
@@ -10,8 +10,8 @@
#include "base/scoped_vector.h"
#include "base/values.h"
#include "chrome/browser/browser_thread.h"
+#include "chrome/browser/extensions/extension_event_router.h"
#include "chrome/browser/extensions/extension_menu_manager.h"
-#include "chrome/browser/extensions/extension_message_service.h"
#include "chrome/browser/extensions/test_extension_prefs.h"
#include "chrome/common/chrome_paths.h"
#include "chrome/common/extensions/extension.h"
@@ -331,10 +331,10 @@ TEST_F(ExtensionMenuManagerTest, ExtensionUnloadRemovesMenuItems) {
}
// A mock message service for tests of ExtensionMenuManager::ExecuteCommand.
-class MockExtensionMessageService : public ExtensionMessageService {
+class MockExtensionEventRouter : public ExtensionEventRouter {
public:
- explicit MockExtensionMessageService(Profile* profile) :
- ExtensionMessageService(profile) {}
+ explicit MockExtensionEventRouter(Profile* profile) :
+ ExtensionEventRouter(profile) {}
MOCK_METHOD4(DispatchEventToRenderers, void(const std::string& event_name,
const std::string& event_args,
@@ -342,14 +342,14 @@ class MockExtensionMessageService : public ExtensionMessageService {
const GURL& event_url));
private:
- DISALLOW_COPY_AND_ASSIGN(MockExtensionMessageService);
+ DISALLOW_COPY_AND_ASSIGN(MockExtensionEventRouter);
};
// A mock profile for tests of ExtensionMenuManager::ExecuteCommand.
class MockTestingProfile : public TestingProfile {
public:
MockTestingProfile() {}
- MOCK_METHOD0(GetExtensionMessageService, ExtensionMessageService*());
+ MOCK_METHOD0(GetExtensionEventRouter, ExtensionEventRouter*());
MOCK_METHOD0(IsOffTheRecord, bool());
private:
@@ -394,8 +394,8 @@ TEST_F(ExtensionMenuManagerTest, ExecuteCommand) {
MockTestingProfile profile;
- scoped_refptr<MockExtensionMessageService> mock_message_service =
- new MockExtensionMessageService(&profile);
+ scoped_ptr<MockExtensionEventRouter> mock_event_router(
+ new MockExtensionEventRouter(&profile));
ContextMenuParams params;
params.media_type = WebKit::WebContextMenuData::MediaTypeImage;
@@ -409,15 +409,15 @@ TEST_F(ExtensionMenuManagerTest, ExecuteCommand) {
ExtensionMenuItem::Id id = item->id();
ASSERT_TRUE(manager_.AddContextItem(extension, item));
- EXPECT_CALL(profile, GetExtensionMessageService())
+ EXPECT_CALL(profile, GetExtensionEventRouter())
.Times(1)
- .WillOnce(Return(mock_message_service.get()));
+ .WillOnce(Return(mock_event_router.get()));
// Use the magic of googlemock to save a parameter to our mock's
// DispatchEventToRenderers method into event_args.
std::string event_args;
std::string expected_event_name = "contextMenus/" + item->extension_id();
- EXPECT_CALL(*mock_message_service.get(),
+ EXPECT_CALL(*mock_event_router.get(),
DispatchEventToRenderers(expected_event_name, _,
&profile,
GURL()))
diff --git a/chrome/browser/extensions/extension_message_service.cc b/chrome/browser/extensions/extension_message_service.cc
index 531c06b..e8562ff 100644
--- a/chrome/browser/extensions/extension_message_service.cc
+++ b/chrome/browser/extensions/extension_message_service.cc
@@ -14,7 +14,6 @@
#include "chrome/browser/profile.h"
#include "chrome/browser/renderer_host/render_process_host.h"
#include "chrome/browser/renderer_host/render_view_host.h"
-#include "chrome/browser/renderer_host/resource_message_filter.h"
#include "chrome/browser/tab_contents/tab_contents.h"
#include "chrome/browser/tab_contents/tab_util.h"
#include "chrome/common/extensions/extension.h"
@@ -36,9 +35,9 @@
struct ExtensionMessageService::MessagePort {
IPC::Message::Sender* sender;
int routing_id;
- MessagePort(IPC::Message::Sender* sender = NULL,
- int routing_id = MSG_ROUTING_CONTROL) :
- sender(sender), routing_id(routing_id) {}
+ explicit MessagePort(IPC::Message::Sender* sender = NULL,
+ int routing_id = MSG_ROUTING_CONTROL)
+ : sender(sender), routing_id(routing_id) {}
};
struct ExtensionMessageService::MessageChannel {
@@ -52,8 +51,6 @@ const char ExtensionMessageService::kDispatchOnDisconnect[] =
"Port.dispatchOnDisconnect";
const char ExtensionMessageService::kDispatchOnMessage[] =
"Port.dispatchOnMessage";
-const char ExtensionMessageService::kDispatchEvent[] =
- "Event.dispatchJSON";
namespace {
@@ -93,30 +90,9 @@ static void DispatchOnMessage(const ExtensionMessageService::MessagePort& port,
ExtensionMessageService::kDispatchOnMessage, args, false, GURL()));
}
-static void DispatchEvent(const ExtensionMessageService::MessagePort& port,
- const std::string& event_name,
- const std::string& event_args,
- bool cross_incognito,
- const GURL& event_url) {
- ListValue args;
- args.Set(0, Value::CreateStringValue(event_name));
- args.Set(1, Value::CreateStringValue(event_args));
- port.sender->Send(new ViewMsg_ExtensionMessageInvoke(port.routing_id,
- ExtensionMessageService::kDispatchEvent, args, cross_incognito,
- event_url));
-}
-
} // namespace
// static
-std::string ExtensionMessageService::GetPerExtensionEventName(
- const std::string& event_name, const std::string& extension_id) {
- // This should match the method we use in extension_process_binding.js when
- // setting up the corresponding chrome.Event object.
- return event_name + "/" + extension_id;
-}
-
-// static
void ExtensionMessageService::AllocatePortIdPair(int* port1, int* port2) {
int channel_id = g_next_channel_id.GetNext();
int port1_id = channel_id * 2;
@@ -136,16 +112,13 @@ void ExtensionMessageService::AllocatePortIdPair(int* port1, int* port2) {
}
ExtensionMessageService::ExtensionMessageService(Profile* profile)
- : profile_(profile),
- extension_devtools_manager_(NULL) {
+ : profile_(profile) {
registrar_.Add(this, NotificationType::RENDERER_PROCESS_TERMINATED,
NotificationService::AllSources());
registrar_.Add(this, NotificationType::RENDERER_PROCESS_CLOSED,
NotificationService::AllSources());
registrar_.Add(this, NotificationType::RENDER_VIEW_HOST_DELETED,
NotificationService::AllSources());
-
- extension_devtools_manager_ = profile_->GetExtensionDevToolsManager();
}
ExtensionMessageService::~ExtensionMessageService() {
@@ -159,35 +132,6 @@ void ExtensionMessageService::DestroyingProfile() {
registrar_.RemoveAll();
}
-void ExtensionMessageService::AddEventListener(const std::string& event_name,
- int render_process_id) {
- DCHECK_EQ(listeners_[event_name].count(render_process_id), 0u) << event_name;
- listeners_[event_name].insert(render_process_id);
-
- if (extension_devtools_manager_.get()) {
- extension_devtools_manager_->AddEventListener(event_name,
- render_process_id);
- }
-}
-
-void ExtensionMessageService::RemoveEventListener(const std::string& event_name,
- int render_process_id) {
- DCHECK_EQ(listeners_[event_name].count(render_process_id), 1u)
- << " PID=" << render_process_id << " event=" << event_name;
- listeners_[event_name].erase(render_process_id);
-
- if (extension_devtools_manager_.get()) {
- extension_devtools_manager_->RemoveEventListener(event_name,
- render_process_id);
- }
-}
-
-bool ExtensionMessageService::HasEventListener(
- const std::string& event_name) {
- return (listeners_.find(event_name) != listeners_.end() &&
- !listeners_[event_name].empty());
-}
-
void ExtensionMessageService::OpenChannelToExtension(
int source_process_id, int source_routing_id, int receiver_port_id,
const std::string& source_extension_id,
@@ -378,49 +322,6 @@ void ExtensionMessageService::PostMessageFromRenderer(
DispatchOnMessage(port, message, dest_port_id);
}
-
-void ExtensionMessageService::DispatchEventToRenderers(
- const std::string& event_name, const std::string& event_args,
- Profile* restrict_to_profile, const GURL& event_url) {
- if (!profile_)
- return;
-
- // We don't expect to get events from a completely different profile.
- DCHECK(!restrict_to_profile || profile_->IsSameProfile(restrict_to_profile));
-
- ListenerMap::iterator it = listeners_.find(event_name);
- if (it == listeners_.end())
- return;
-
- std::set<int>& pids = it->second;
-
- // Send the event only to renderers that are listening for it.
- for (std::set<int>::iterator pid = pids.begin(); pid != pids.end(); ++pid) {
- RenderProcessHost* renderer = RenderProcessHost::FromID(*pid);
- if (!renderer)
- continue;
- if (!ChildProcessSecurityPolicy::GetInstance()->
- HasExtensionBindings(*pid)) {
- // Don't send browser-level events to unprivileged processes.
- continue;
- }
-
- // Is this event from a different profile than the renderer (ie, an
- // incognito tab event sent to a normal process, or vice versa).
- bool cross_incognito =
- restrict_to_profile && renderer->profile() != restrict_to_profile;
- DispatchEvent(renderer, event_name, event_args, cross_incognito, event_url);
- }
-}
-
-void ExtensionMessageService::DispatchEventToExtension(
- const std::string& extension_id,
- const std::string& event_name, const std::string& event_args,
- Profile* restrict_to_profile, const GURL& event_url) {
- DispatchEventToRenderers(GetPerExtensionEventName(event_name, extension_id),
- event_args, restrict_to_profile, event_url);
-}
-
void ExtensionMessageService::Observe(NotificationType type,
const NotificationSource& source,
const NotificationDetails& details) {
@@ -429,14 +330,6 @@ void ExtensionMessageService::Observe(NotificationType type,
case NotificationType::RENDERER_PROCESS_CLOSED: {
RenderProcessHost* renderer = Source<RenderProcessHost>(source).ptr();
OnSenderClosed(renderer);
-
- // Remove all event listeners associated with this renderer
- for (ListenerMap::iterator it = listeners_.begin();
- it != listeners_.end(); ) {
- ListenerMap::iterator current = it++;
- if (current->second.count(renderer->id()) != 0)
- RemoveEventListener(current->first, renderer->id());
- }
break;
}
case NotificationType::RENDER_VIEW_HOST_DELETED:
diff --git a/chrome/browser/extensions/extension_message_service.h b/chrome/browser/extensions/extension_message_service.h
index 79ef344..9135a1c 100644
--- a/chrome/browser/extensions/extension_message_service.h
+++ b/chrome/browser/extensions/extension_message_service.h
@@ -11,7 +11,6 @@
#include <string>
#include "base/ref_counted.h"
-#include "chrome/browser/extensions/extension_devtools_manager.h"
#include "chrome/common/notification_observer.h"
#include "chrome/common/notification_registrar.h"
#include "ipc/ipc_message.h"
@@ -48,21 +47,15 @@ class ExtensionMessageService
: public base::RefCounted<ExtensionMessageService>,
public NotificationObserver {
public:
- // Javascript function name constants.
- static const char kDispatchOnConnect[];
- static const char kDispatchOnDisconnect[];
- static const char kDispatchOnMessage[];
- static const char kDispatchEvent[];
- static const char kDispatchError[];
-
- // A messaging channel. Note that the opening port can be the same as the
+ // A messaging channel. Note that the opening port can be the same as the
// receiver, if an extension toolstrip wants to talk to its tab (for example).
struct MessageChannel;
struct MessagePort;
- // Returns the event name for an event that is extension-specific.
- static std::string GetPerExtensionEventName(const std::string& event_name,
- const std::string& extension_id);
+ // Javascript function name constants.
+ static const char kDispatchOnConnect[];
+ static const char kDispatchOnDisconnect[];
+ static const char kDispatchOnMessage[];
// Allocates a pair of port ids.
// NOTE: this can be called from any thread.
@@ -73,31 +66,6 @@ class ExtensionMessageService
// Notification that our owning profile is going away.
void DestroyingProfile();
- // Add or remove |render_process_pid| as a listener for |event_name|.
- void AddEventListener(const std::string& event_name, int render_process_id);
- void RemoveEventListener(const std::string& event_name,
- int render_process_id);
-
- // Returns true if there is at least one listener for the given event.
- bool HasEventListener(const std::string& event_name);
-
- // Send an event to every registered extension renderer. If
- // |restrict_to_profile| is non-NULL, then the event will not be sent to other
- // profiles unless the extension has permission (e.g. incognito tab update ->
- // normal profile only works if extension is allowed incognito access). If
- // |event_url| is not empty, the event is only sent to extension with host
- // permissions for this url.
- virtual void DispatchEventToRenderers(
- const std::string& event_name, const std::string& event_args,
- Profile* restrict_to_profile, const GURL& event_url);
-
- // Same as above, except use the extension-specific naming scheme for the
- // event. This is used by events that are per-extension.
- void DispatchEventToExtension(
- const std::string& extension_id,
- const std::string& event_name, const std::string& event_args,
- Profile* restrict_to_profile, const GURL& event_url);
-
// Given an extension's ID, opens a channel between the given renderer "port"
// and every listening context owned by that extension. |channel_name| is
// an optional identifier for use by extension developers.
@@ -179,13 +147,6 @@ class ExtensionMessageService
MessageChannelMap channels_;
- scoped_refptr<ExtensionDevToolsManager> extension_devtools_manager_;
-
- // A map between an event name and a set of process id's that are listening
- // to that event.
- typedef std::map<std::string, std::set<int> > ListenerMap;
- ListenerMap listeners_;
-
DISALLOW_COPY_AND_ASSIGN(ExtensionMessageService);
};
diff --git a/chrome/browser/extensions/extension_messages_apitest.cc b/chrome/browser/extensions/extension_messages_apitest.cc
index 533b840..b76a944 100644
--- a/chrome/browser/extensions/extension_messages_apitest.cc
+++ b/chrome/browser/extensions/extension_messages_apitest.cc
@@ -3,7 +3,7 @@
// found in the LICENSE file.
#include "chrome/browser/extensions/extension_apitest.h"
-#include "chrome/browser/extensions/extension_message_service.h"
+#include "chrome/browser/extensions/extension_event_router.h"
#include "chrome/browser/profile.h"
#include "chrome/common/notification_registrar.h"
#include "googleurl/src/gurl.h"
@@ -21,24 +21,24 @@ class MessageSender : public NotificationObserver {
virtual void Observe(NotificationType type,
const NotificationSource& source,
const NotificationDetails& details) {
- ExtensionMessageService* message_service =
- Source<Profile>(source).ptr()->GetExtensionMessageService();
+ ExtensionEventRouter* event_router =
+ Source<Profile>(source).ptr()->GetExtensionEventRouter();
// Sends four messages to the extension. All but the third message sent
// from the origin http://b.com/ are supposed to arrive.
- message_service->DispatchEventToRenderers("test.onMessage",
+ event_router->DispatchEventToRenderers("test.onMessage",
"[{\"lastMessage\":false,\"data\":\"no restriction\"}]",
Source<Profile>(source).ptr(),
GURL());
- message_service->DispatchEventToRenderers("test.onMessage",
+ event_router->DispatchEventToRenderers("test.onMessage",
"[{\"lastMessage\":false,\"data\":\"http://a.com/\"}]",
Source<Profile>(source).ptr(),
GURL("http://a.com/"));
- message_service->DispatchEventToRenderers("test.onMessage",
+ event_router->DispatchEventToRenderers("test.onMessage",
"[{\"lastMessage\":false,\"data\":\"http://b.com/\"}]",
Source<Profile>(source).ptr(),
GURL("http://b.com/"));
- message_service->DispatchEventToRenderers("test.onMessage",
+ event_router->DispatchEventToRenderers("test.onMessage",
"[{\"lastMessage\":true,\"data\":\"last message\"}]",
Source<Profile>(source).ptr(),
GURL());
diff --git a/chrome/browser/extensions/extension_omnibox_api.cc b/chrome/browser/extensions/extension_omnibox_api.cc
index 26c91bb..a5da1fb 100644
--- a/chrome/browser/extensions/extension_omnibox_api.cc
+++ b/chrome/browser/extensions/extension_omnibox_api.cc
@@ -7,7 +7,7 @@
#include "base/json/json_writer.h"
#include "base/string_util.h"
#include "base/values.h"
-#include "chrome/browser/extensions/extension_message_service.h"
+#include "chrome/browser/extensions/extension_event_router.h"
#include "chrome/browser/profile.h"
#include "chrome/common/notification_service.h"
@@ -35,7 +35,7 @@ const char kDescriptionStylesOffset[] = "offset";
// static
void ExtensionOmniboxEventRouter::OnInputStarted(
Profile* profile, const std::string& extension_id) {
- profile->GetExtensionMessageService()->DispatchEventToExtension(
+ profile->GetExtensionEventRouter()->DispatchEventToExtension(
extension_id, events::kOnInputStarted, "[]", profile, GURL());
}
@@ -43,9 +43,9 @@ void ExtensionOmniboxEventRouter::OnInputStarted(
bool ExtensionOmniboxEventRouter::OnInputChanged(
Profile* profile, const std::string& extension_id,
const std::string& input, int suggest_id) {
- std::string event_name = ExtensionMessageService::GetPerExtensionEventName(
+ std::string event_name = ExtensionEventRouter::GetPerExtensionEventName(
events::kOnInputChanged, extension_id);
- if (!profile->GetExtensionMessageService()->HasEventListener(event_name))
+ if (!profile->GetExtensionEventRouter()->HasEventListener(event_name))
return false;
ListValue args;
@@ -54,7 +54,7 @@ bool ExtensionOmniboxEventRouter::OnInputChanged(
std::string json_args;
base::JSONWriter::Write(&args, false, &json_args);
- profile->GetExtensionMessageService()->DispatchEventToExtension(
+ profile->GetExtensionEventRouter()->DispatchEventToExtension(
extension_id, events::kOnInputChanged, json_args, profile, GURL());
return true;
}
@@ -70,7 +70,7 @@ void ExtensionOmniboxEventRouter::OnInputEntered(
std::string json_args;
base::JSONWriter::Write(&args, false, &json_args);
- profile->GetExtensionMessageService()->DispatchEventToExtension(
+ profile->GetExtensionEventRouter()->DispatchEventToExtension(
extension_id, events::kOnInputEntered, json_args, profile, GURL());
NotificationService::current()->Notify(
@@ -81,7 +81,7 @@ void ExtensionOmniboxEventRouter::OnInputEntered(
// static
void ExtensionOmniboxEventRouter::OnInputCancelled(
Profile* profile, const std::string& extension_id) {
- profile->GetExtensionMessageService()->DispatchEventToExtension(
+ profile->GetExtensionEventRouter()->DispatchEventToExtension(
extension_id, events::kOnInputCancelled, "[]", profile, GURL());
}
diff --git a/chrome/browser/extensions/extension_popup_api.cc b/chrome/browser/extensions/extension_popup_api.cc
index 8b12d5b..72f3962 100644
--- a/chrome/browser/extensions/extension_popup_api.cc
+++ b/chrome/browser/extensions/extension_popup_api.cc
@@ -9,8 +9,8 @@
#include "base/stringprintf.h"
#include "base/values.h"
#include "chrome/browser/extensions/extension_dom_ui.h"
+#include "chrome/browser/extensions/extension_event_router.h"
#include "chrome/browser/extensions/extension_host.h"
-#include "chrome/browser/extensions/extension_message_service.h"
#include "chrome/browser/browser.h"
#include "chrome/browser/browser_window.h"
#include "chrome/browser/profile.h"
@@ -508,6 +508,6 @@ void PopupEventRouter::OnPopupClosed(Profile* profile,
extension_popup_module_events::kOnPopupClosed,
routing_id);
- profile->GetExtensionMessageService()->DispatchEventToRenderers(
+ profile->GetExtensionEventRouter()->DispatchEventToRenderers(
full_event_name, base::JSONWriter::kEmptyArray, profile, GURL());
}
diff --git a/chrome/browser/extensions/extension_sidebar_api.cc b/chrome/browser/extensions/extension_sidebar_api.cc
index 462815f..8b6913e 100644
--- a/chrome/browser/extensions/extension_sidebar_api.cc
+++ b/chrome/browser/extensions/extension_sidebar_api.cc
@@ -9,7 +9,7 @@
#include "base/string_util.h"
#include "base/string16.h"
#include "base/values.h"
-#include "chrome/browser/extensions/extension_message_service.h"
+#include "chrome/browser/extensions/extension_event_router.h"
#include "chrome/browser/extensions/extensions_service.h"
#include "chrome/browser/extensions/extension_tabs_module.h"
#include "chrome/browser/profile.h"
@@ -89,7 +89,7 @@ void ExtensionSidebarEventRouter::OnStateChanged(
base::JSONWriter::Write(&args, false, &json_args);
const std::string& extension_id(content_id);
- profile->GetExtensionMessageService()->DispatchEventToExtension(
+ profile->GetExtensionEventRouter()->DispatchEventToExtension(
extension_id, kOnStateChanged, json_args, profile, GURL());
}
diff --git a/chrome/browser/extensions/extension_webnavigation_api.cc b/chrome/browser/extensions/extension_webnavigation_api.cc
index 6281a06..159fdb7 100644
--- a/chrome/browser/extensions/extension_webnavigation_api.cc
+++ b/chrome/browser/extensions/extension_webnavigation_api.cc
@@ -9,7 +9,7 @@
#include "base/json/json_writer.h"
#include "base/time.h"
#include "base/values.h"
-#include "chrome/browser/extensions/extension_message_service.h"
+#include "chrome/browser/extensions/extension_event_router.h"
#include "chrome/browser/extensions/extension_tabs_module.h"
#include "chrome/browser/extensions/extension_webnavigation_api_constants.h"
#include "chrome/browser/profile.h"
@@ -148,8 +148,8 @@ void ExtensionWebNavigationEventRouter::DispatchEvent(
Profile* profile,
const char* event_name,
const std::string& json_args) {
- if (profile && profile->GetExtensionMessageService()) {
- profile->GetExtensionMessageService()->DispatchEventToRenderers(
+ if (profile && profile->GetExtensionEventRouter()) {
+ profile->GetExtensionEventRouter()->DispatchEventToRenderers(
event_name, json_args, profile, GURL());
}
}
diff --git a/chrome/browser/profile.cc b/chrome/browser/profile.cc
index 79c091b..0478e5c 100644
--- a/chrome/browser/profile.cc
+++ b/chrome/browser/profile.cc
@@ -231,6 +231,10 @@ class OffTheRecordProfileImpl : public Profile,
return GetOriginalProfile()->GetExtensionMessageService();
}
+ virtual ExtensionEventRouter* GetExtensionEventRouter() {
+ return GetOriginalProfile()->GetExtensionEventRouter();
+ }
+
virtual SSLHostState* GetSSLHostState() {
if (!ssl_host_state_.get())
ssl_host_state_.reset(new SSLHostState());
diff --git a/chrome/browser/profile.h b/chrome/browser/profile.h
index 3ef99bf..c99981b 100644
--- a/chrome/browser/profile.h
+++ b/chrome/browser/profile.h
@@ -47,8 +47,9 @@ class DesktopNotificationService;
class DownloadManager;
class Extension;
class ExtensionDevToolsManager;
-class ExtensionProcessManager;
+class ExtensionEventRouter;
class ExtensionMessageService;
+class ExtensionProcessManager;
class ExtensionsService;
class FaviconService;
class FilePath;
@@ -198,6 +199,9 @@ class Profile {
// profile. The instance is created at startup.
virtual ExtensionMessageService* GetExtensionMessageService() = 0;
+ // Accessor. The instance is created at startup.
+ virtual ExtensionEventRouter* GetExtensionEventRouter() = 0;
+
// Retrieves a pointer to the SSLHostState associated with this profile.
// The SSLHostState is lazily created the first time that this method is
// called.
diff --git a/chrome/browser/profile_impl.cc b/chrome/browser/profile_impl.cc
index 9b0f887..18ac330 100644
--- a/chrome/browser/profile_impl.cc
+++ b/chrome/browser/profile_impl.cc
@@ -31,6 +31,7 @@
#include "chrome/browser/extensions/extension_devtools_manager.h"
#include "chrome/browser/extensions/extension_error_reporter.h"
#include "chrome/browser/extensions/extension_info_map.h"
+#include "chrome/browser/extensions/extension_event_router.h"
#include "chrome/browser/extensions/extension_message_service.h"
#include "chrome/browser/extensions/extension_process_manager.h"
#include "chrome/browser/extensions/extensions_service.h"
@@ -353,6 +354,7 @@ void ProfileImpl::InitExtensions() {
}
extension_process_manager_.reset(ExtensionProcessManager::Create(this));
+ extension_event_router_.reset(new ExtensionEventRouter(this));
extension_message_service_ = new ExtensionMessageService(this);
ExtensionErrorReporter::Init(true); // allow noisy errors.
@@ -648,6 +650,10 @@ ExtensionMessageService* ProfileImpl::GetExtensionMessageService() {
return extension_message_service_.get();
}
+ExtensionEventRouter* ProfileImpl::GetExtensionEventRouter() {
+ return extension_event_router_.get();
+}
+
SSLHostState* ProfileImpl::GetSSLHostState() {
if (!ssl_host_state_.get())
ssl_host_state_.reset(new SSLHostState());
diff --git a/chrome/browser/profile_impl.h b/chrome/browser/profile_impl.h
index 7b926e6..1abb00d 100644
--- a/chrome/browser/profile_impl.h
+++ b/chrome/browser/profile_impl.h
@@ -56,6 +56,7 @@ class ProfileImpl : public Profile,
virtual ExtensionDevToolsManager* GetExtensionDevToolsManager();
virtual ExtensionProcessManager* GetExtensionProcessManager();
virtual ExtensionMessageService* GetExtensionMessageService();
+ virtual ExtensionEventRouter* GetExtensionEventRouter();
virtual FaviconService* GetFaviconService(ServiceAccessType sat);
virtual HistoryService* GetHistoryService(ServiceAccessType sat);
virtual HistoryService* GetHistoryServiceWithoutCreating();
@@ -166,6 +167,7 @@ class ProfileImpl : public Profile,
scoped_refptr<ExtensionDevToolsManager> extension_devtools_manager_;
scoped_ptr<ExtensionProcessManager> extension_process_manager_;
scoped_refptr<ExtensionMessageService> extension_message_service_;
+ scoped_ptr<ExtensionEventRouter> extension_event_router_;
scoped_ptr<SSLHostState> ssl_host_state_;
scoped_refptr<net::TransportSecurityState>
transport_security_state_;
diff --git a/chrome/browser/renderer_host/browser_render_process_host.cc b/chrome/browser/renderer_host/browser_render_process_host.cc
index fcf6c0b..4543eb4 100644
--- a/chrome/browser/renderer_host/browser_render_process_host.cc
+++ b/chrome/browser/renderer_host/browser_render_process_host.cc
@@ -27,6 +27,7 @@
#include "chrome/browser/browser_child_process_host.h"
#include "chrome/browser/browser_process.h"
#include "chrome/browser/child_process_security_policy.h"
+#include "chrome/browser/extensions/extension_event_router.h"
#include "chrome/browser/extensions/extension_function_dispatcher.h"
#include "chrome/browser/extensions/extension_message_service.h"
#include "chrome/browser/extensions/extensions_service.h"
@@ -490,9 +491,9 @@ void BrowserRenderProcessHost::AppendRendererCommandLine(
const std::string locale = g_browser_process->GetApplicationLocale();
command_line->AppendSwitchASCII(switches::kLang, locale);
- // If we run base::FieldTrials, we want to pass to their state to the renderer so
- // that it can act in accordance with each state, or record histograms
- // relating to the base::FieldTrial states.
+ // If we run base::FieldTrials, we want to pass to their state to the
+ // renderer so that it can act in accordance with each state, or record
+ // histograms relating to the base::FieldTrial states.
std::string field_trial_states;
base::FieldTrialList::StatesToString(&field_trial_states);
if (!field_trial_states.empty()) {
@@ -1059,16 +1060,16 @@ void BrowserRenderProcessHost::OnProcessLaunched() {
void BrowserRenderProcessHost::OnExtensionAddListener(
const std::string& event_name) {
- if (profile()->GetExtensionMessageService()) {
- profile()->GetExtensionMessageService()->AddEventListener(
+ if (profile()->GetExtensionEventRouter()) {
+ profile()->GetExtensionEventRouter()->AddEventListener(
event_name, id());
}
}
void BrowserRenderProcessHost::OnExtensionRemoveListener(
const std::string& event_name) {
- if (profile()->GetExtensionMessageService()) {
- profile()->GetExtensionMessageService()->RemoveEventListener(
+ if (profile()->GetExtensionEventRouter()) {
+ profile()->GetExtensionEventRouter()->RemoveEventListener(
event_name, id());
}
}
diff --git a/chrome/chrome_browser.gypi b/chrome/chrome_browser.gypi
index 29ea45f..cd7309f 100644
--- a/chrome/chrome_browser.gypi
+++ b/chrome/chrome_browser.gypi
@@ -1476,6 +1476,8 @@
'browser/extensions/extension_error_reporter.h',
'browser/extensions/extension_event_names.cc',
'browser/extensions/extension_event_names.h',
+ 'browser/extensions/extension_event_router.cc',
+ 'browser/extensions/extension_event_router.h',
'browser/extensions/execute_code_in_tab_function.cc',
'browser/extensions/execute_code_in_tab_function.h',
'browser/extensions/extension_browser_event_router.cc',
diff --git a/chrome/test/testing_profile.h b/chrome/test/testing_profile.h
index e570970..b1395c0 100644
--- a/chrome/test/testing_profile.h
+++ b/chrome/test/testing_profile.h
@@ -132,6 +132,7 @@ class TestingProfile : public Profile {
}
virtual ExtensionProcessManager* GetExtensionProcessManager() { return NULL; }
virtual ExtensionMessageService* GetExtensionMessageService() { return NULL; }
+ virtual ExtensionEventRouter* GetExtensionEventRouter() { return NULL; }
virtual SSLHostState* GetSSLHostState() { return NULL; }
virtual net::TransportSecurityState* GetTransportSecurityState() {
return NULL;