Chromium Code Reviews| Index: content/browser/message_port_provider.cc |
| diff --git a/content/browser/message_port_provider.cc b/content/browser/message_port_provider.cc |
| index 12be06530fdaa872e592fe2b5e541241f2bc6cb8..0fd141db519f56fb9a743c3ebb2d455d428993cb 100644 |
| --- a/content/browser/message_port_provider.cc |
| +++ b/content/browser/message_port_provider.cc |
| @@ -12,59 +12,77 @@ |
| #include "content/browser/renderer_host/render_view_host_impl.h" |
| #include "content/browser/web_contents/web_contents_impl.h" |
| #include "content/common/view_messages.h" |
| +#include "content/public/browser/message_port_delegate.h" |
| namespace content { |
| +namespace { |
| + |
| +void PostMessageOnIOThread(MessagePortMessageFilter* filter, |
|
mnaganov (inactive)
2015/01/13 10:37:51
Perhaps, you can now make this function a public m
sgurun-gerrit only
2015/01/14 23:53:13
Let's leave it to later in case there is a demand,
mnaganov (inactive)
2015/01/15 09:49:33
Oh, again -- I was wrongly supposing that MessageP
|
| + int routing_id, |
| + ViewMsg_PostMessage_Params* params) { |
| + if (!params->message_port_ids.empty()) { |
| + filter->UpdateMessagePortsWithNewRoutes(params->message_port_ids, |
| + ¶ms->new_routing_ids); |
| + } |
| + filter->Send(new ViewMsg_PostMessageEvent(routing_id, *params)); |
| +} |
| + |
| +} // namespace |
| + |
| +// static |
| void MessagePortProvider::PostMessageToFrame( |
| WebContents* web_contents, |
| const base::string16& source_origin, |
| const base::string16& target_origin, |
| const base::string16& data, |
| const std::vector<int>& ports) { |
| - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| + DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| - RenderViewHost* rvh = web_contents->GetRenderViewHost(); |
| - if (!rvh) |
| - return; |
| + ViewMsg_PostMessage_Params* params = new ViewMsg_PostMessage_Params(); |
| + params->is_data_raw_string = true; |
| + params->data = data; |
| + // Blink requires a source frame to transfer ports. This is why a |
| + // source routing id is set here. See WebDOMMessageEvent::initMessageEvent() |
| + params->source_routing_id = web_contents->GetRoutingID(); |
| + params->source_origin = source_origin; |
| + params->target_origin = target_origin; |
| + params->message_port_ids = ports; |
| - ViewMsg_PostMessage_Params params; |
| - params.is_data_raw_string = true; |
| - params.data = data; |
| - params.source_routing_id = web_contents->GetRoutingID(); |
| - params.source_origin = source_origin; |
| - params.target_origin = target_origin; |
| RenderProcessHostImpl* rph = |
| - static_cast<RenderProcessHostImpl*>( |
| - web_contents->GetRenderProcessHost()); |
| + static_cast<RenderProcessHostImpl*>(web_contents->GetRenderProcessHost()); |
| MessagePortMessageFilter* mf = rph->message_port_message_filter(); |
| - |
| - if (!ports.empty()) { |
| - params.message_port_ids = ports; |
| - mf->UpdateMessagePortsWithNewRoutes(params.message_port_ids, |
| - ¶ms.new_routing_ids); |
| - } |
| - rvh->Send(new ViewMsg_PostMessageEvent( |
| - web_contents->GetRenderViewHost()->GetRoutingID(), |
| - params)); |
| + BrowserThread::PostTask( |
| + BrowserThread::IO, |
| + FROM_HERE, |
| + base::Bind(&PostMessageOnIOThread, |
| + make_scoped_refptr(mf), |
| + web_contents->GetRoutingID(), |
| + base::Owned(params))); |
| } |
| -void MessagePortProvider::CreateMessageChannel(WebContents* web_contents, |
| +// static |
| +void MessagePortProvider::CreateMessageChannel(MessagePortDelegate* delegate, |
| int* port1, |
| int* port2) { |
| - DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| - |
| + DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| *port1 = 0; |
| *port2 = 0; |
| - |
| - RenderProcessHostImpl* rph = |
| - static_cast<RenderProcessHostImpl*>( |
| - web_contents->GetRenderProcessHost()); |
| - MessagePortMessageFilter* mf = rph->message_port_message_filter(); |
| MessagePortService* msp = MessagePortService::GetInstance(); |
| - msp->Create(mf->GetNextRoutingID(), mf, port1); |
| - msp->Create(mf->GetNextRoutingID(), mf, port2); |
| + msp->Create(MSG_ROUTING_NONE, delegate, port1); |
| + msp->Create(MSG_ROUTING_NONE, delegate, port2); |
| + // Update the routing number of the message ports to be equal to the message |
| + // port numbers. |
| + msp->UpdateMessagePort(*port1, delegate, *port1); |
| + msp->UpdateMessagePort(*port2, delegate, *port2); |
| msp->Entangle(*port1, *port2); |
| msp->Entangle(*port2, *port1); |
| } |
| +// static |
| +void MessagePortProvider::OnMessagePortDelegateClosing( |
| + MessagePortDelegate* delegate) { |
| + MessagePortService::GetInstance()->OnMessagePortDelegateClosing(delegate); |
| +} |
| + |
| } // namespace content |