Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(154)

Side by Side Diff: content/browser/renderer_host/java/java_bridge_dispatcher_host.cc

Issue 8890018: Update Java Bridge to use its own thread in the browser process (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Use class rather than traits Created 9 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « content/browser/renderer_host/java/java_bridge_dispatcher_host.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 "base/lazy_instance.h"
9 #include "base/threading/thread.h"
9 #include "content/browser/renderer_host/java/java_bridge_channel_host.h" 10 #include "content/browser/renderer_host/java/java_bridge_channel_host.h"
10 #include "content/browser/renderer_host/render_view_host.h" 11 #include "content/browser/renderer_host/render_view_host.h"
11 #include "content/common/child_process.h" 12 #include "content/common/child_process.h"
12 #include "content/common/java_bridge_messages.h" 13 #include "content/common/java_bridge_messages.h"
13 #include "content/common/npobject_stub.h" 14 #include "content/common/npobject_stub.h"
14 #include "content/common/npobject_util.h" // For CreateNPVariantParam() 15 #include "content/common/npobject_util.h" // For CreateNPVariantParam()
15 #include "content/public/browser/browser_thread.h" 16 #include "content/public/browser/browser_thread.h"
16 #include "third_party/WebKit/Source/WebKit/chromium/public/WebBindings.h" 17 #include "third_party/WebKit/Source/WebKit/chromium/public/WebBindings.h"
17 18
18 using content::BrowserThread; 19 using content::BrowserThread;
19 20
21 namespace {
22 class JavaBridgeThread : public base::Thread {
23 public:
24 JavaBridgeThread() : base::Thread("JavaBridge") {
25 Start();
26 }
27 virtual ~JavaBridgeThread() {
28 Stop();
29 }
30 };
31 base::LazyInstance<JavaBridgeThread> g_background_thread =
32 LAZY_INSTANCE_INITIALIZER;
33 } // namespace
34
20 JavaBridgeDispatcherHost::JavaBridgeDispatcherHost( 35 JavaBridgeDispatcherHost::JavaBridgeDispatcherHost(
21 RenderViewHost* render_view_host) 36 RenderViewHost* render_view_host)
22 : RenderViewHostObserver(render_view_host), 37 : RenderViewHostObserver(render_view_host),
23 is_renderer_initialized_(false) { 38 is_renderer_initialized_(false) {
24 } 39 }
25 40
26 JavaBridgeDispatcherHost::~JavaBridgeDispatcherHost() { 41 JavaBridgeDispatcherHost::~JavaBridgeDispatcherHost() {
27 } 42 }
28 43
29 void JavaBridgeDispatcherHost::AddNamedObject(const string16& name, 44 void JavaBridgeDispatcherHost::AddNamedObject(const string16& name,
(...skipping 25 matching lines...) Expand all
55 bool handled = true; 70 bool handled = true;
56 IPC_BEGIN_MESSAGE_MAP(JavaBridgeDispatcherHost, msg) 71 IPC_BEGIN_MESSAGE_MAP(JavaBridgeDispatcherHost, msg)
57 IPC_MESSAGE_HANDLER_DELAY_REPLY(JavaBridgeHostMsg_GetChannelHandle, 72 IPC_MESSAGE_HANDLER_DELAY_REPLY(JavaBridgeHostMsg_GetChannelHandle,
58 OnGetChannelHandle) 73 OnGetChannelHandle)
59 IPC_MESSAGE_UNHANDLED(handled = false) 74 IPC_MESSAGE_UNHANDLED(handled = false)
60 IPC_END_MESSAGE_MAP() 75 IPC_END_MESSAGE_MAP()
61 return handled; 76 return handled;
62 } 77 }
63 78
64 void JavaBridgeDispatcherHost::OnGetChannelHandle(IPC::Message* reply_msg) { 79 void JavaBridgeDispatcherHost::OnGetChannelHandle(IPC::Message* reply_msg) {
65 if (RenderProcessHost::run_renderer_in_process()) { 80 g_background_thread.Get().message_loop()->PostTask(
66 // TODO(steveblock): Fix Java Bridge with in-process renderer. See
67 // http://code.google.com/p/chromium/issues/detail?id=106838
68 CHECK(false) << "Java Bridge does not support in-process renderer";
69 }
70 BrowserThread::PostTask(
71 BrowserThread::WEBKIT,
72 FROM_HERE, 81 FROM_HERE,
73 base::Bind(&JavaBridgeDispatcherHost::GetChannelHandle, this, reply_msg)); 82 base::Bind(&JavaBridgeDispatcherHost::GetChannelHandle, this, reply_msg));
74 } 83 }
75 84
76 void JavaBridgeDispatcherHost::GetChannelHandle(IPC::Message* reply_msg) { 85 void JavaBridgeDispatcherHost::GetChannelHandle(IPC::Message* reply_msg) {
77 // The channel creates the channel handle based on the renderer ID we passed 86 // The channel creates the channel handle based on the renderer ID we passed
78 // to GetJavaBridgeChannelHost() and, on POSIX, the file descriptor used by 87 // to GetJavaBridgeChannelHost() and, on POSIX, the file descriptor used by
79 // the underlying channel. 88 // the underlying channel.
80 JavaBridgeHostMsg_GetChannelHandle::WriteReplyParams( 89 JavaBridgeHostMsg_GetChannelHandle::WriteReplyParams(
81 reply_msg, 90 reply_msg,
82 channel_->channel_handle()); 91 channel_->channel_handle());
83 Send(reply_msg); 92 Send(reply_msg);
84 } 93 }
85 94
86 void JavaBridgeDispatcherHost::CreateNPVariantParam(NPObject* object, 95 void JavaBridgeDispatcherHost::CreateNPVariantParam(NPObject* object,
87 NPVariant_Param* param) { 96 NPVariant_Param* param) {
88 // The JavaBridgeChannelHost needs to be created on the WEBKIT thread, as 97 // The JavaBridgeChannelHost needs to be created on the background thread, as
89 // that is where Java objects will live, and CreateNPVariantParam() needs the 98 // that is where Java objects will live, and CreateNPVariantParam() needs the
90 // channel to create the NPObjectStub. To avoid blocking here until the 99 // channel to create the NPObjectStub. To avoid blocking here until the
91 // channel is ready, create the NPVariant_Param by hand, then post a message 100 // channel is ready, create the NPVariant_Param by hand, then post a message
92 // to the WEBKIT thread to set up the channel and create the corresponding 101 // to the background thread to set up the channel and create the corresponding
93 // NPObjectStub. Post that message before doing any IPC, to make sure that 102 // NPObjectStub. Post that message before doing any IPC, to make sure that
94 // the channel and object proxies are ready before responses are received 103 // the channel and object proxies are ready before responses are received
95 // from the renderer. 104 // from the renderer.
96 105
97 // Create an NPVariantParam suitable for serialization over IPC from our 106 // Create an NPVariantParam suitable for serialization over IPC from our
98 // NPVariant. See CreateNPVariantParam() in npobject_utils. 107 // NPVariant. See CreateNPVariantParam() in npobject_utils.
99 param->type = NPVARIANT_PARAM_SENDER_OBJECT_ROUTING_ID; 108 param->type = NPVARIANT_PARAM_SENDER_OBJECT_ROUTING_ID;
100 int route_id = JavaBridgeChannelHost::ThreadsafeGenerateRouteID(); 109 int route_id = JavaBridgeChannelHost::ThreadsafeGenerateRouteID();
101 param->npobject_routing_id = route_id; 110 param->npobject_routing_id = route_id;
102 111
103 WebKit::WebBindings::retainObject(object); 112 WebKit::WebBindings::retainObject(object);
104 BrowserThread::PostTask( 113 g_background_thread.Get().message_loop()->PostTask(
105 BrowserThread::WEBKIT,
106 FROM_HERE, 114 FROM_HERE,
107 base::Bind(&JavaBridgeDispatcherHost::CreateObjectStub, this, object, 115 base::Bind(&JavaBridgeDispatcherHost::CreateObjectStub, this, object,
108 route_id)); 116 route_id));
109 } 117 }
110 118
111 void JavaBridgeDispatcherHost::CreateObjectStub(NPObject* object, 119 void JavaBridgeDispatcherHost::CreateObjectStub(NPObject* object,
112 int route_id) { 120 int route_id) {
113 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::WEBKIT)); 121 DCHECK_EQ(g_background_thread.Get().message_loop(), MessageLoop::current());
114
115 if (!channel_) { 122 if (!channel_) {
116 channel_ = JavaBridgeChannelHost::GetJavaBridgeChannelHost( 123 channel_ = JavaBridgeChannelHost::GetJavaBridgeChannelHost(
117 render_view_host()->process()->id(), 124 render_view_host()->process()->id(),
118 BrowserThread::GetMessageLoopProxyForThread(BrowserThread::IO)); 125 BrowserThread::GetMessageLoopProxyForThread(BrowserThread::IO));
119 } 126 }
120 127
128 // NPObjectStub takes a ref to the NPObject. The lifetime of the NPObjectStub
129 // is governed by that of the NPObjectProxy in the renderer, via the channel.
121 // We don't need the containing window or the page URL, as we don't do 130 // We don't need the containing window or the page URL, as we don't do
122 // re-entrant sync IPC. 131 // re-entrant sync IPC.
123 new NPObjectStub(object, channel_, route_id, 0, GURL()); 132 new NPObjectStub(object, channel_, route_id, 0, GURL());
124 // The NPObjectStub takes a reference to the NPObject. Release the ref added 133 // The NPObjectStub takes a reference to the NPObject. Release the ref added
125 // in CreateNPVariantParam(). 134 // in CreateNPVariantParam().
126 WebKit::WebBindings::releaseObject(object); 135 WebKit::WebBindings::releaseObject(object);
127 } 136 }
OLDNEW
« no previous file with comments | « content/browser/renderer_host/java/java_bridge_dispatcher_host.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698