diff options
author | mpcomplete@chromium.org <mpcomplete@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-08-24 22:11:07 +0000 |
---|---|---|
committer | mpcomplete@chromium.org <mpcomplete@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-08-24 22:11:07 +0000 |
commit | 89ebc7edb982ebf5f8b185aa6e3aae6904eed965 (patch) | |
tree | ba32c69980b01c7c7d8d3f9d3cabebcb9ed88711 /chrome/browser/extensions/extension_message_service.cc | |
parent | 5101c0073bf723b6e6bc81273264eaf7ac124937 (diff) | |
download | chromium_src-89ebc7edb982ebf5f8b185aa6e3aae6904eed965.zip chromium_src-89ebc7edb982ebf5f8b185aa6e3aae6904eed965.tar.gz chromium_src-89ebc7edb982ebf5f8b185aa6e3aae6904eed965.tar.bz2 |
Exposes a chrome.devtools object to extensions. This allows extensions to call chrome.devtools.connect() to open up a Port by which it can receive devtools messages to implement the proposed perf trace extensions API documented here:
http://code.google.com/p/chromium/wiki/ExtensionsPerfTraceAPI
Review URL: http://codereview.chromium.org/159882
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@24158 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/extensions/extension_message_service.cc')
-rw-r--r-- | chrome/browser/extensions/extension_message_service.cc | 25 |
1 files changed, 20 insertions, 5 deletions
diff --git a/chrome/browser/extensions/extension_message_service.cc b/chrome/browser/extensions/extension_message_service.cc index a4b1fd6d..edc2cf9 100644 --- a/chrome/browser/extensions/extension_message_service.cc +++ b/chrome/browser/extensions/extension_message_service.cc @@ -105,7 +105,10 @@ const char ExtensionMessageService::kDispatchEvent[] = "Event.dispatchJSON"; ExtensionMessageService::ExtensionMessageService(Profile* profile) - : ui_loop_(MessageLoop::current()), profile_(profile), next_port_id_(0) { + : ui_loop_(MessageLoop::current()), + profile_(profile), + extension_devtools_manager_(NULL), + next_port_id_(0) { DCHECK_EQ(ui_loop_->type(), MessageLoop::TYPE_UI); registrar_.Add(this, NotificationType::RENDERER_PROCESS_TERMINATED, @@ -114,6 +117,8 @@ ExtensionMessageService::ExtensionMessageService(Profile* profile) NotificationService::AllSources()); registrar_.Add(this, NotificationType::RENDER_VIEW_HOST_DELETED, NotificationService::AllSources()); + + extension_devtools_manager_ = profile_->GetExtensionDevToolsManager(); } ExtensionMessageService::~ExtensionMessageService() { @@ -136,6 +141,11 @@ void ExtensionMessageService::AddEventListener(const std::string& event_name, DCHECK_EQ(MessageLoop::current()->type(), MessageLoop::TYPE_UI); 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, @@ -149,6 +159,11 @@ void ExtensionMessageService::RemoveEventListener(const std::string& event_name, DCHECK_EQ(MessageLoop::current()->type(), MessageLoop::TYPE_UI); DCHECK_EQ(listeners_[event_name].count(render_process_id), 1u) << event_name; listeners_[event_name].erase(render_process_id); + + if (extension_devtools_manager_.get()) { + extension_devtools_manager_->RemoveEventListener(event_name, + render_process_id); + } } void ExtensionMessageService::AllocatePortIdPair(int* port1, int* port2) { @@ -345,6 +360,7 @@ void ExtensionMessageService::CloseChannelImpl( channels_.erase(channel_iter); } + void ExtensionMessageService::PostMessageFromRenderer( int source_port_id, const std::string& message) { DCHECK_EQ(MessageLoop::current()->type(), MessageLoop::TYPE_UI); @@ -394,13 +410,12 @@ void ExtensionMessageService::Observe(NotificationType type, RenderProcessHost* renderer = Source<RenderProcessHost>(source).ptr(); OnSenderClosed(renderer); - // Remove this renderer from our listener maps. + // Remove all event listeners associated with this renderer for (ListenerMap::iterator it = listeners_.begin(); it != listeners_.end(); ) { ListenerMap::iterator current = it++; - current->second.erase(renderer->pid()); - if (current->second.empty()) - listeners_.erase(current); + if (current->second.count(renderer->pid()) != 0) + RemoveEventListener(current->first, renderer->pid()); } break; } |