| 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 95ff7f3b35a17c1f295f1b963d66e7f9bef71d26..c864efb9f8d1892b33be7122ae4bbbcd4a35f7e0 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);
|
| }
|
| }
|
| }
|
|
|