From 8569eafc863900c15ba3df7da5b05ac8ec145ec5 Mon Sep 17 00:00:00 2001 From: "mpcomplete@chromium.org" Date: Fri, 24 Jul 2009 00:04:33 +0000 Subject: Another try at enabling the content script messaging test. Also fixes some issues that that test exposes. My previous attempt (http://src.chromium.org/viewvc/chrome?view=rev&revision=21324) was reverted. TEST=no BUG=no Review URL: http://codereview.chromium.org/160048 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@21483 0039d316-1c4b-4281-b951-d872f2087c98 --- .../browser/extensions/extension_message_service.cc | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) (limited to '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 5424ad2..d4e6d0f 100644 --- a/chrome/browser/extensions/extension_message_service.cc +++ b/chrome/browser/extensions/extension_message_service.cc @@ -130,15 +130,23 @@ void ExtensionMessageService::ProfileDestroyed() { void ExtensionMessageService::AddEventListener(std::string event_name, int render_process_id) { + DCHECK(RenderProcessHost::FromID(render_process_id)) << + "Adding event listener to a non-existant RenderProcessHost."; DCHECK_EQ(MessageLoop::current()->type(), MessageLoop::TYPE_UI); - DCHECK(listeners_[event_name].count(render_process_id) == 0); + DCHECK_EQ(listeners_[event_name].count(render_process_id), 0u) << event_name; listeners_[event_name].insert(render_process_id); } void ExtensionMessageService::RemoveEventListener(std::string event_name, int render_process_id) { + // It is possible that this RenderProcessHost is being destroyed. If that is + // the case, we'll have already removed his listeners, so do nothing here. + RenderProcessHost* rph = RenderProcessHost::FromID(render_process_id); + if (!rph) + return; + DCHECK_EQ(MessageLoop::current()->type(), MessageLoop::TYPE_UI); - DCHECK(listeners_[event_name].count(render_process_id) == 1); + DCHECK_EQ(listeners_[event_name].count(render_process_id), 1u) << event_name; listeners_[event_name].erase(render_process_id); } @@ -245,9 +253,15 @@ void ExtensionMessageService::OpenChannelOnUIThreadImpl( DCHECK_EQ(MessageLoop::current()->type(), MessageLoop::TYPE_UI); // TODO(mpcomplete): notify source if reciever doesn't exist - if (!source || !receiver.sender) + if (!source) return; // Closed while in flight. + if (!receiver.sender) { + // Treat it as a disconnect. + DispatchOnDisconnect(MessagePort(source, MSG_ROUTING_CONTROL), + GET_OPPOSITE_PORT_ID(receiver_port_id)); + } + linked_ptr channel(new MessageChannel); channel->opener = MessagePort(source, MSG_ROUTING_CONTROL); channel->receiver = receiver; -- cgit v1.1