Index: chrome/browser/extensions/extension_message_service.cc |
diff --git a/chrome/browser/extensions/extension_message_service.cc b/chrome/browser/extensions/extension_message_service.cc |
index a4b1fd6dac7f6bcf97d959a9f8a59178608020d7..edc2cf9710c3af7768cf8578cd8bd5821b75a435 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; |
} |