| Index: chrome/browser/renderer_host/chrome_extension_message_filter.cc | 
| diff --git a/chrome/browser/renderer_host/chrome_extension_message_filter.cc b/chrome/browser/renderer_host/chrome_extension_message_filter.cc | 
| index a09871357796e9d19d257414095b9b422bc627a9..a0ae53cccb512a45dd470e2e1c613452cd41badc 100644 | 
| --- a/chrome/browser/renderer_host/chrome_extension_message_filter.cc | 
| +++ b/chrome/browser/renderer_host/chrome_extension_message_filter.cc | 
| @@ -84,10 +84,11 @@ bool ChromeExtensionMessageFilter::OnMessageReceived( | 
| IPC_MESSAGE_HANDLER(ExtensionHostMsg_OpenChannelToTab, OnOpenChannelToTab) | 
| IPC_MESSAGE_HANDLER(ExtensionHostMsg_OpenChannelToNativeApp, | 
| OnOpenChannelToNativeApp) | 
| +    IPC_MESSAGE_HANDLER(ExtensionHostMsg_OpenMessagePort, OnOpenMessagePort) | 
| +    IPC_MESSAGE_HANDLER(ExtensionHostMsg_CloseMessagePort, OnCloseMessagePort) | 
| IPC_MESSAGE_HANDLER(ExtensionHostMsg_PostMessage, OnPostMessage) | 
| IPC_MESSAGE_HANDLER_DELAY_REPLY(ExtensionHostMsg_GetMessageBundle, | 
| OnGetExtMessageBundle) | 
| -    IPC_MESSAGE_HANDLER(ExtensionHostMsg_CloseChannel, OnExtensionCloseChannel) | 
| IPC_MESSAGE_HANDLER(ExtensionHostMsg_AddAPIActionToActivityLog, | 
| OnAddAPIActionToExtensionActivityLog); | 
| IPC_MESSAGE_HANDLER(ExtensionHostMsg_AddDOMActionToActivityLog, | 
| @@ -103,8 +104,9 @@ bool ChromeExtensionMessageFilter::OnMessageReceived( | 
| void ChromeExtensionMessageFilter::OverrideThreadForMessage( | 
| const IPC::Message& message, BrowserThread::ID* thread) { | 
| switch (message.type()) { | 
| +    case ExtensionHostMsg_OpenMessagePort::ID: | 
| +    case ExtensionHostMsg_CloseMessagePort::ID: | 
| case ExtensionHostMsg_PostMessage::ID: | 
| -    case ExtensionHostMsg_CloseChannel::ID: | 
| case ExtensionHostMsg_AddAPIActionToActivityLog::ID: | 
| case ExtensionHostMsg_AddDOMActionToActivityLog::ID: | 
| case ExtensionHostMsg_AddEventToActivityLog::ID: | 
| @@ -192,6 +194,7 @@ void ChromeExtensionMessageFilter::OpenChannelToNativeAppOnUIThread( | 
| } | 
|  | 
| void ChromeExtensionMessageFilter::OnOpenChannelToTab( | 
| +    int routing_id, | 
| const ExtensionMsg_TabTargetConnectionInfo& info, | 
| const std::string& extension_id, | 
| const std::string& channel_name, | 
| @@ -202,12 +205,13 @@ void ChromeExtensionMessageFilter::OnOpenChannelToTab( | 
| BrowserThread::PostTask( | 
| BrowserThread::UI, FROM_HERE, | 
| base::Bind(&ChromeExtensionMessageFilter::OpenChannelToTabOnUIThread, | 
| -                 this, render_process_id_, port2_id, info, extension_id, | 
| -                 channel_name)); | 
| +                 this, render_process_id_, routing_id, port2_id, info, | 
| +                 extension_id, channel_name)); | 
| } | 
|  | 
| void ChromeExtensionMessageFilter::OpenChannelToTabOnUIThread( | 
| int source_process_id, | 
| +    int source_routing_id, | 
| int receiver_port_id, | 
| const ExtensionMsg_TabTargetConnectionInfo& info, | 
| const std::string& extension_id, | 
| @@ -216,6 +220,7 @@ void ChromeExtensionMessageFilter::OpenChannelToTabOnUIThread( | 
| if (profile_) { | 
| extensions::MessageService::Get(profile_) | 
| ->OpenChannelToTab(source_process_id, | 
| +                           source_routing_id, | 
| receiver_port_id, | 
| info.tab_id, | 
| info.frame_id, | 
| @@ -224,6 +229,25 @@ void ChromeExtensionMessageFilter::OpenChannelToTabOnUIThread( | 
| } | 
| } | 
|  | 
| +void ChromeExtensionMessageFilter::OnOpenMessagePort(int routing_id, | 
| +                                                     int port_id) { | 
| +  if (!profile_) | 
| +    return; | 
| + | 
| +  extensions::MessageService::Get(profile_)->OpenPort( | 
| +      port_id, render_process_id_, routing_id); | 
| +} | 
| + | 
| +void ChromeExtensionMessageFilter::OnCloseMessagePort(int routing_id, | 
| +                                                      int port_id, | 
| +                                                      bool force_close) { | 
| +  if (!profile_) | 
| +    return; | 
| + | 
| +  extensions::MessageService::Get(profile_)->ClosePort( | 
| +      port_id, render_process_id_, routing_id, force_close); | 
| +} | 
| + | 
| void ChromeExtensionMessageFilter::OnPostMessage( | 
| int port_id, | 
| const extensions::Message& message) { | 
| @@ -259,21 +283,6 @@ void ChromeExtensionMessageFilter::OnGetExtMessageBundleOnBlockingPool( | 
| Send(reply_msg); | 
| } | 
|  | 
| -void ChromeExtensionMessageFilter::OnExtensionCloseChannel( | 
| -    int port_id, | 
| -    const std::string& error_message) { | 
| -  if (!profile_) | 
| -    return; | 
| - | 
| -  if (!content::RenderProcessHost::FromID(render_process_id_)) | 
| -    return;  // To guard against crash in browser_tests shutdown. | 
| - | 
| -  extensions::MessageService* message_service = | 
| -      extensions::MessageService::Get(profile_); | 
| -  if (message_service) | 
| -    message_service->CloseChannel(port_id, error_message); | 
| -} | 
| - | 
| void ChromeExtensionMessageFilter::OnAddAPIActionToExtensionActivityLog( | 
| const std::string& extension_id, | 
| const ExtensionHostMsg_APIActionOrEvent_Params& params) { | 
|  |