| 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,
|
| + 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
|
|
|