diff options
author | mpcomplete@chromium.org <mpcomplete@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-10-15 18:22:41 +0000 |
---|---|---|
committer | mpcomplete@chromium.org <mpcomplete@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-10-15 18:22:41 +0000 |
commit | 2c699655d5ed9cbf296a9389c3efe2a9fe01973e (patch) | |
tree | 843da73da9228499bf88063490fba73845740740 /chrome | |
parent | 731ae5165404c2ccf32af50ac3fda3364d41fbb1 (diff) | |
download | chromium_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')
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; |