| Index: chrome/browser/extensions/extension_message_service.cc
|
| ===================================================================
|
| --- chrome/browser/extensions/extension_message_service.cc (revision 14939)
|
| +++ chrome/browser/extensions/extension_message_service.cc (working copy)
|
| @@ -64,12 +64,29 @@
|
|
|
| void ExtensionMessageService::RegisterExtension(
|
| const std::string& extension_id, int render_process_id) {
|
| + DCHECK(MessageLoop::current()->type() == MessageLoop::TYPE_UI);
|
| AutoLock lock(process_ids_lock_);
|
| DCHECK(process_ids_.find(extension_id) == process_ids_.end() ||
|
| process_ids_[extension_id] == render_process_id);
|
| process_ids_[extension_id] = render_process_id;
|
| }
|
|
|
| +void ExtensionMessageService::AddEventListener(std::string event_name,
|
| + int render_process_id) {
|
| + DCHECK(MessageLoop::current()->type() == MessageLoop::TYPE_UI);
|
| + AutoLock lock(listener_lock_);
|
| + DCHECK(listeners_[event_name].count(render_process_id) == 0);
|
| + listeners_[event_name].insert(render_process_id);
|
| +}
|
| +
|
| +void ExtensionMessageService::RemoveEventListener(std::string event_name,
|
| + int render_process_id) {
|
| + DCHECK(MessageLoop::current()->type() == MessageLoop::TYPE_UI);
|
| + AutoLock lock(listener_lock_);
|
| + DCHECK(listeners_[event_name].count(render_process_id) == 1);
|
| + listeners_[event_name].erase(render_process_id);
|
| +}
|
| +
|
| int ExtensionMessageService::OpenChannelToExtension(
|
| const std::string& extension_id, ResourceMessageFilter* source) {
|
| DCHECK(MessageLoop::current() ==
|
| @@ -138,6 +155,13 @@
|
|
|
| void ExtensionMessageService::DispatchEventToRenderers(
|
| const std::string& event_name, const std::string& event_args) {
|
| + std::set<int> pids;
|
| + {
|
| + AutoLock lock(listener_lock_);
|
| + pids = listeners_[event_name];
|
| + if (pids.empty())
|
| + return;
|
| + }
|
| MessageLoop* io_thread = ChromeThread::GetMessageLoop(ChromeThread::IO);
|
| if (MessageLoop::current() != io_thread) {
|
| // Do the actual work on the IO thread.
|
| @@ -147,18 +171,19 @@
|
| return;
|
| }
|
|
|
| - // TODO(mpcomplete): we should only send messages to extension process
|
| - // renderers.
|
| - std::set<ResourceMessageFilter*>::iterator renderer;
|
| - for (renderer = renderers_unique_.begin();
|
| - renderer != renderers_unique_.end(); ++renderer) {
|
| - (*renderer)->Send(new ViewMsg_ExtensionHandleEvent(event_name, event_args));
|
| + // Send the event only to renderers that are listening for it.
|
| + for (std::set<int>::iterator pid = pids.begin(); pid != pids.end(); ++pid) {
|
| + RendererMap::iterator renderer = renderers_.find(*pid);
|
| + if (renderer == renderers_.end())
|
| + continue;
|
| + ResourceMessageFilter* filter = renderer->second;
|
| + filter->Send(new ViewMsg_ExtensionHandleEvent(event_name, event_args));
|
| }
|
| }
|
|
|
| void ExtensionMessageService::RendererReady(ResourceMessageFilter* renderer) {
|
| DCHECK(MessageLoop::current() ==
|
| - ChromeThread::GetMessageLoop(ChromeThread::IO));
|
| + ChromeThread::GetMessageLoop(ChromeThread::IO));
|
|
|
| DCHECK(renderers_.find(renderer->GetProcessId()) == renderers_.end());
|
| renderers_[renderer->GetProcessId()] = renderer;
|
| @@ -177,7 +202,7 @@
|
| const NotificationSource& source,
|
| const NotificationDetails& details) {
|
| DCHECK(MessageLoop::current() ==
|
| - ChromeThread::GetMessageLoop(ChromeThread::IO));
|
| + ChromeThread::GetMessageLoop(ChromeThread::IO));
|
|
|
| DCHECK(type.value == NotificationType::RESOURCE_MESSAGE_FILTER_SHUTDOWN);
|
| ResourceMessageFilter* renderer = Source<ResourceMessageFilter>(source).ptr();
|
|
|