| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "content/browser/renderer_host/java/java_bridge_dispatcher_host.h" | 5 #include "content/browser/renderer_host/java/java_bridge_dispatcher_host.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "content/browser/renderer_host/browser_render_process_host.h" | 8 #include "content/browser/renderer_host/browser_render_process_host.h" |
| 9 #include "content/browser/renderer_host/java/java_bridge_channel_host.h" | 9 #include "content/browser/renderer_host/java/java_bridge_channel_host.h" |
| 10 #include "content/browser/renderer_host/render_view_host.h" | 10 #include "content/browser/renderer_host/render_view_host.h" |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 55 bool handled = true; | 55 bool handled = true; |
| 56 IPC_BEGIN_MESSAGE_MAP(JavaBridgeDispatcherHost, msg) | 56 IPC_BEGIN_MESSAGE_MAP(JavaBridgeDispatcherHost, msg) |
| 57 IPC_MESSAGE_HANDLER_DELAY_REPLY(JavaBridgeHostMsg_GetChannelHandle, | 57 IPC_MESSAGE_HANDLER_DELAY_REPLY(JavaBridgeHostMsg_GetChannelHandle, |
| 58 OnGetChannelHandle) | 58 OnGetChannelHandle) |
| 59 IPC_MESSAGE_UNHANDLED(handled = false) | 59 IPC_MESSAGE_UNHANDLED(handled = false) |
| 60 IPC_END_MESSAGE_MAP() | 60 IPC_END_MESSAGE_MAP() |
| 61 return handled; | 61 return handled; |
| 62 } | 62 } |
| 63 | 63 |
| 64 void JavaBridgeDispatcherHost::OnGetChannelHandle(IPC::Message* reply_msg) { | 64 void JavaBridgeDispatcherHost::OnGetChannelHandle(IPC::Message* reply_msg) { |
| 65 // In renderer-in-process mode, this sync IPC is coming from the WEBKIT | 65 BrowserThread::PostTask( |
| 66 // thread, so we can't post to the WEBKIT thread. | 66 BrowserThread::JAVA_BRIDGE, |
| 67 if (RenderProcessHost::run_renderer_in_process()) { | 67 FROM_HERE, |
| 68 GetChannelHandle(reply_msg); | 68 base::Bind(&JavaBridgeDispatcherHost::GetChannelHandle, this, |
| 69 } else { | 69 reply_msg)); |
| 70 BrowserThread::PostTask( | |
| 71 BrowserThread::WEBKIT, | |
| 72 FROM_HERE, | |
| 73 base::Bind(&JavaBridgeDispatcherHost::GetChannelHandle, this, | |
| 74 reply_msg)); | |
| 75 } | |
| 76 } | 70 } |
| 77 | 71 |
| 78 void JavaBridgeDispatcherHost::GetChannelHandle(IPC::Message* reply_msg) { | 72 void JavaBridgeDispatcherHost::GetChannelHandle(IPC::Message* reply_msg) { |
| 79 // The channel creates the channel handle based on the renderer ID we passed | 73 // The channel creates the channel handle based on the renderer ID we passed |
| 80 // to GetJavaBridgeChannelHost() and, on POSIX, the file descriptor used by | 74 // to GetJavaBridgeChannelHost() and, on POSIX, the file descriptor used by |
| 81 // the underlying channel. | 75 // the underlying channel. |
| 82 JavaBridgeHostMsg_GetChannelHandle::WriteReplyParams( | 76 JavaBridgeHostMsg_GetChannelHandle::WriteReplyParams( |
| 83 reply_msg, | 77 reply_msg, |
| 84 channel_->channel_handle()); | 78 channel_->channel_handle()); |
| 85 Send(reply_msg); | 79 Send(reply_msg); |
| 86 } | 80 } |
| 87 | 81 |
| 88 void JavaBridgeDispatcherHost::CreateNPVariantParam(NPObject* object, | 82 void JavaBridgeDispatcherHost::CreateNPVariantParam(NPObject* object, |
| 89 NPVariant_Param* param) { | 83 NPVariant_Param* param) { |
| 90 // The JavaBridgeChannelHost needs to be created on the WEBKIT thread, as | 84 // The JavaBridgeChannelHost needs to be created on the JAVA_BRIDGE thread, as |
| 91 // that is where Java objects will live, and CreateNPVariantParam() needs the | 85 // that is where Java objects will live, and CreateNPVariantParam() needs the |
| 92 // channel to create the NPObjectStub. To avoid blocking here until the | 86 // channel to create the NPObjectStub. To avoid blocking here until the |
| 93 // channel is ready, create the NPVariant_Param by hand, then post a message | 87 // channel is ready, create the NPVariant_Param by hand, then post a message |
| 94 // to the WEBKIT thread to set up the channel and create the corresponding | 88 // to the JAVA_BRIDGE thread to set up the channel and create the |
| 95 // NPObjectStub. Post that message before doing any IPC, to make sure that | 89 // corresponding NPObjectStub. Post that message before doing any IPC, to |
| 96 // the channel and object proxies are ready before responses are received | 90 // make sure that the channel and object proxies are ready before responses |
| 97 // from the renderer. | 91 // are received from the renderer. |
| 98 | 92 |
| 99 // Create an NPVariantParam suitable for serialization over IPC from our | 93 // Create an NPVariantParam suitable for serialization over IPC from our |
| 100 // NPVariant. See CreateNPVariantParam() in npobject_utils. | 94 // NPVariant. See CreateNPVariantParam() in npobject_utils. |
| 101 param->type = NPVARIANT_PARAM_SENDER_OBJECT_ROUTING_ID; | 95 param->type = NPVARIANT_PARAM_SENDER_OBJECT_ROUTING_ID; |
| 102 int route_id = JavaBridgeChannelHost::ThreadsafeGenerateRouteID(); | 96 int route_id = JavaBridgeChannelHost::ThreadsafeGenerateRouteID(); |
| 103 param->npobject_routing_id = route_id; | 97 param->npobject_routing_id = route_id; |
| 104 | 98 |
| 105 WebKit::WebBindings::retainObject(object); | 99 WebKit::WebBindings::retainObject(object); |
| 106 BrowserThread::PostTask( | 100 BrowserThread::PostTask( |
| 107 BrowserThread::WEBKIT, | 101 BrowserThread::JAVA_BRIDGE, |
| 108 FROM_HERE, | 102 FROM_HERE, |
| 109 base::Bind(&JavaBridgeDispatcherHost::CreateObjectStub, this, object, | 103 base::Bind(&JavaBridgeDispatcherHost::CreateObjectStub, this, object, |
| 110 route_id)); | 104 route_id)); |
| 111 } | 105 } |
| 112 | 106 |
| 113 void JavaBridgeDispatcherHost::CreateObjectStub(NPObject* object, | 107 void JavaBridgeDispatcherHost::CreateObjectStub(NPObject* object, |
| 114 int route_id) { | 108 int route_id) { |
| 115 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::WEBKIT)); | 109 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::JAVA_BRIDGE)); |
| 116 | 110 |
| 117 if (!channel_) { | 111 if (!channel_) { |
| 118 channel_ = JavaBridgeChannelHost::GetJavaBridgeChannelHost( | 112 channel_ = JavaBridgeChannelHost::GetJavaBridgeChannelHost( |
| 119 render_view_host()->process()->id(), | 113 render_view_host()->process()->id(), |
| 120 BrowserThread::GetMessageLoopProxyForThread(BrowserThread::IO)); | 114 BrowserThread::GetMessageLoopProxyForThread(BrowserThread::IO)); |
| 121 } | 115 } |
| 122 | 116 |
| 123 // We don't need the containing window or the page URL, as we don't do | 117 // We don't need the containing window or the page URL, as we don't do |
| 124 // re-entrant sync IPC. | 118 // re-entrant sync IPC. |
| 125 new NPObjectStub(object, channel_, route_id, 0, GURL()); | 119 new NPObjectStub(object, channel_, route_id, 0, GURL()); |
| 126 // The NPObjectStub takes a reference to the NPObject. Release the ref added | 120 // The NPObjectStub takes a reference to the NPObject. Release the ref added |
| 127 // in CreateNPVariantParam(). | 121 // in CreateNPVariantParam(). |
| 128 WebKit::WebBindings::releaseObject(object); | 122 WebKit::WebBindings::releaseObject(object); |
| 129 } | 123 } |
| OLD | NEW |