summaryrefslogtreecommitdiffstats
path: root/chrome/browser
diff options
context:
space:
mode:
authormpcomplete@chromium.org <mpcomplete@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-09-09 19:09:15 +0000
committermpcomplete@chromium.org <mpcomplete@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-09-09 19:09:15 +0000
commit66425cd30c72e042a39e6bff690c0eb15f49ca6e (patch)
tree706c3f9ff619e81d957a37286511f2e63429b746 /chrome/browser
parent9df9771b3b653d95e9524fc2d7ecb84c047004c9 (diff)
downloadchromium_src-66425cd30c72e042a39e6bff690c0eb15f49ca6e.zip
chromium_src-66425cd30c72e042a39e6bff690c0eb15f49ca6e.tar.gz
chromium_src-66425cd30c72e042a39e6bff690c0eb15f49ca6e.tar.bz2
Don't send the channel-disconnect message if the recipient is in the process
of closing. This is an attempt to fix a crash bug. TEST=no BUG=21201 Review URL: http://codereview.chromium.org/197054 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@25767 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser')
-rw-r--r--chrome/browser/extensions/extension_message_service.cc19
-rw-r--r--chrome/browser/extensions/extension_message_service.h3
2 files changed, 15 insertions, 7 deletions
diff --git a/chrome/browser/extensions/extension_message_service.cc b/chrome/browser/extensions/extension_message_service.cc
index 95ff7f3..c864efb 100644
--- a/chrome/browser/extensions/extension_message_service.cc
+++ b/chrome/browser/extensions/extension_message_service.cc
@@ -367,22 +367,23 @@ void ExtensionMessageService::CloseChannel(int port_id) {
// Note: The channel might be gone already, if the other side closed first.
MessageChannelMap::iterator it = channels_.find(GET_CHANNEL_ID(port_id));
if (it != channels_.end())
- CloseChannelImpl(it, port_id);
+ CloseChannelImpl(it, port_id, true);
}
void ExtensionMessageService::CloseChannelImpl(
- MessageChannelMap::iterator channel_iter, int closing_port_id) {
+ MessageChannelMap::iterator channel_iter, int closing_port_id,
+ bool notify_other_port) {
DCHECK_EQ(MessageLoop::current()->type(), MessageLoop::TYPE_UI);
// Notify the other side.
const MessagePort& port = IS_OPENER_PORT_ID(closing_port_id) ?
channel_iter->second->receiver : channel_iter->second->opener;
- DispatchOnDisconnect(port, GET_OPPOSITE_PORT_ID(closing_port_id));
+ if (notify_other_port)
+ DispatchOnDisconnect(port, GET_OPPOSITE_PORT_ID(closing_port_id));
channels_.erase(channel_iter);
}
-
void ExtensionMessageService::PostMessageFromRenderer(
int source_port_id, const std::string& message) {
DCHECK_EQ(MessageLoop::current()->type(), MessageLoop::TYPE_UI);
@@ -456,10 +457,16 @@ void ExtensionMessageService::OnSenderClosed(IPC::Message::Sender* sender) {
for (MessageChannelMap::iterator it = channels_.begin();
it != channels_.end(); ) {
MessageChannelMap::iterator current = it++;
+ // If both sides are the same renderer, and it is closing, there is no
+ // "other" port, so there's no need to notify it.
+ bool notify_other_port =
+ current->second->opener.sender != current->second->receiver.sender;
if (current->second->opener.sender == sender) {
- CloseChannelImpl(current, GET_CHANNEL_OPENER_ID(current->first));
+ CloseChannelImpl(current, GET_CHANNEL_OPENER_ID(current->first),
+ notify_other_port);
} else if (current->second->receiver.sender == sender) {
- CloseChannelImpl(current, GET_CHANNEL_RECEIVERS_ID(current->first));
+ CloseChannelImpl(current, GET_CHANNEL_RECEIVERS_ID(current->first),
+ notify_other_port);
}
}
}
diff --git a/chrome/browser/extensions/extension_message_service.h b/chrome/browser/extensions/extension_message_service.h
index debef75..10c579f 100644
--- a/chrome/browser/extensions/extension_message_service.h
+++ b/chrome/browser/extensions/extension_message_service.h
@@ -134,7 +134,8 @@ class ExtensionMessageService
// NOTE: this can be called from any thread.
void AllocatePortIdPair(int* port1, int* port2);
- void CloseChannelImpl(MessageChannelMap::iterator channel_iter, int port_id);
+ void CloseChannelImpl(MessageChannelMap::iterator channel_iter, int port_id,
+ bool notify_other_port);
// The UI message loop, used for posting tasks.
MessageLoop* ui_loop_;