diff options
author | mpcomplete@chromium.org <mpcomplete@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-09-09 19:09:15 +0000 |
---|---|---|
committer | mpcomplete@chromium.org <mpcomplete@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-09-09 19:09:15 +0000 |
commit | 66425cd30c72e042a39e6bff690c0eb15f49ca6e (patch) | |
tree | 706c3f9ff619e81d957a37286511f2e63429b746 /chrome/browser | |
parent | 9df9771b3b653d95e9524fc2d7ecb84c047004c9 (diff) | |
download | chromium_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.cc | 19 | ||||
-rw-r--r-- | chrome/browser/extensions/extension_message_service.h | 3 |
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_; |