OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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/renderer/pepper/pepper_plugin_delegate_impl.h" | 5 #include "content/renderer/pepper/pepper_plugin_delegate_impl.h" |
6 | 6 |
7 #include <cmath> | 7 #include <cmath> |
8 #include <cstddef> | 8 #include <cstddef> |
9 #include <map> | 9 #include <map> |
10 #include <queue> | 10 #include <queue> |
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
95 namespace content { | 95 namespace content { |
96 | 96 |
97 namespace { | 97 namespace { |
98 | 98 |
99 class HostDispatcherWrapper | 99 class HostDispatcherWrapper |
100 : public webkit::ppapi::PluginDelegate::OutOfProcessProxy { | 100 : public webkit::ppapi::PluginDelegate::OutOfProcessProxy { |
101 public: | 101 public: |
102 HostDispatcherWrapper() {} | 102 HostDispatcherWrapper() {} |
103 virtual ~HostDispatcherWrapper() {} | 103 virtual ~HostDispatcherWrapper() {} |
104 | 104 |
105 bool Init(base::ProcessHandle plugin_process_handle, | 105 bool Init(const IPC::ChannelHandle& channel_handle, |
106 const IPC::ChannelHandle& channel_handle, | |
107 PP_Module pp_module, | 106 PP_Module pp_module, |
108 PP_GetInterface_Func local_get_interface, | 107 PP_GetInterface_Func local_get_interface, |
109 const ppapi::Preferences& preferences, | 108 const ppapi::Preferences& preferences, |
110 PepperHungPluginFilter* filter) { | 109 PepperHungPluginFilter* filter) { |
111 if (channel_handle.name.empty()) | 110 if (channel_handle.name.empty()) |
112 return false; | 111 return false; |
113 | 112 |
114 #if defined(OS_POSIX) | 113 #if defined(OS_POSIX) |
115 DCHECK_NE(-1, channel_handle.socket.fd); | 114 DCHECK_NE(-1, channel_handle.socket.fd); |
116 if (channel_handle.socket.fd == -1) | 115 if (channel_handle.socket.fd == -1) |
117 return false; | 116 return false; |
118 #endif | 117 #endif |
119 | 118 |
120 dispatcher_delegate_.reset(new PepperProxyChannelDelegateImpl); | 119 dispatcher_delegate_.reset(new PepperProxyChannelDelegateImpl); |
121 dispatcher_.reset(new ppapi::proxy::HostDispatcher( | 120 dispatcher_.reset(new ppapi::proxy::HostDispatcher( |
122 plugin_process_handle, pp_module, local_get_interface, filter)); | 121 pp_module, local_get_interface, filter)); |
123 | 122 |
124 if (!dispatcher_->InitHostWithChannel(dispatcher_delegate_.get(), | 123 if (!dispatcher_->InitHostWithChannel(dispatcher_delegate_.get(), |
125 channel_handle, | 124 channel_handle, |
126 true, // Client. | 125 true, // Client. |
127 preferences)) { | 126 preferences)) { |
128 dispatcher_.reset(); | 127 dispatcher_.reset(); |
129 dispatcher_delegate_.reset(); | 128 dispatcher_delegate_.reset(); |
130 return false; | 129 return false; |
131 } | 130 } |
132 dispatcher_->channel()->SetRestrictDispatchChannelGroup( | 131 dispatcher_->channel()->SetRestrictDispatchChannelGroup( |
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
227 PepperPluginRegistry::GetInstance()->GetInfoForPlugin(webplugin_info); | 226 PepperPluginRegistry::GetInstance()->GetInfoForPlugin(webplugin_info); |
228 if (!info) { | 227 if (!info) { |
229 *pepper_plugin_was_registered = false; | 228 *pepper_plugin_was_registered = false; |
230 return scoped_refptr<webkit::ppapi::PluginModule>(); | 229 return scoped_refptr<webkit::ppapi::PluginModule>(); |
231 } else if (!info->is_out_of_process) { | 230 } else if (!info->is_out_of_process) { |
232 // In-process plugin not preloaded, it probably couldn't be initialized. | 231 // In-process plugin not preloaded, it probably couldn't be initialized. |
233 return scoped_refptr<webkit::ppapi::PluginModule>(); | 232 return scoped_refptr<webkit::ppapi::PluginModule>(); |
234 } | 233 } |
235 | 234 |
236 // Out of process: have the browser start the plugin process for us. | 235 // Out of process: have the browser start the plugin process for us. |
237 base::ProcessHandle plugin_process_handle = base::kNullProcessHandle; | |
238 IPC::ChannelHandle channel_handle; | 236 IPC::ChannelHandle channel_handle; |
239 int plugin_child_id = 0; | 237 int plugin_child_id = 0; |
240 render_view_->Send(new ViewHostMsg_OpenChannelToPepperPlugin( | 238 render_view_->Send(new ViewHostMsg_OpenChannelToPepperPlugin( |
241 path, &plugin_process_handle, &channel_handle, &plugin_child_id)); | 239 path, &channel_handle, &plugin_child_id)); |
242 if (channel_handle.name.empty()) { | 240 if (channel_handle.name.empty()) { |
243 // Couldn't be initialized. | 241 // Couldn't be initialized. |
244 return scoped_refptr<webkit::ppapi::PluginModule>(); | 242 return scoped_refptr<webkit::ppapi::PluginModule>(); |
245 } | 243 } |
246 | 244 |
247 scoped_refptr<PepperHungPluginFilter> hung_filter( | 245 scoped_refptr<PepperHungPluginFilter> hung_filter( |
248 new PepperHungPluginFilter(path, render_view_->routing_id(), | 246 new PepperHungPluginFilter(path, render_view_->routing_id(), |
249 plugin_child_id)); | 247 plugin_child_id)); |
250 | 248 |
251 // Create a new HostDispatcher for the proxying, and hook it to a new | 249 // Create a new HostDispatcher for the proxying, and hook it to a new |
252 // PluginModule. Note that AddLiveModule must be called before any early | 250 // PluginModule. Note that AddLiveModule must be called before any early |
253 // returns since the module's destructor will remove itself. | 251 // returns since the module's destructor will remove itself. |
254 module = new webkit::ppapi::PluginModule(info->name, path, | 252 module = new webkit::ppapi::PluginModule(info->name, path, |
255 PepperPluginRegistry::GetInstance()); | 253 PepperPluginRegistry::GetInstance()); |
256 PepperPluginRegistry::GetInstance()->AddLiveModule(path, module); | 254 PepperPluginRegistry::GetInstance()->AddLiveModule(path, module); |
257 scoped_ptr<HostDispatcherWrapper> dispatcher(new HostDispatcherWrapper); | 255 scoped_ptr<HostDispatcherWrapper> dispatcher(new HostDispatcherWrapper); |
258 if (!dispatcher->Init( | 256 if (!dispatcher->Init( |
259 plugin_process_handle, | |
260 channel_handle, | 257 channel_handle, |
261 module->pp_module(), | 258 module->pp_module(), |
262 webkit::ppapi::PluginModule::GetLocalGetInterfaceFunc(), | 259 webkit::ppapi::PluginModule::GetLocalGetInterfaceFunc(), |
263 GetPreferences(), | 260 GetPreferences(), |
264 hung_filter.get())) | 261 hung_filter.get())) |
265 return scoped_refptr<webkit::ppapi::PluginModule>(); | 262 return scoped_refptr<webkit::ppapi::PluginModule>(); |
266 module->InitAsProxied(dispatcher.release()); | 263 module->InitAsProxied(dispatcher.release()); |
267 return module; | 264 return module; |
268 } | 265 } |
269 | 266 |
(...skipping 19 matching lines...) Expand all Loading... |
289 if (!render_view_->Send(msg)) { | 286 if (!render_view_->Send(msg)) { |
290 pending_connect_broker_.Remove(request_id); | 287 pending_connect_broker_.Remove(request_id); |
291 return scoped_refptr<PepperBrokerImpl>(); | 288 return scoped_refptr<PepperBrokerImpl>(); |
292 } | 289 } |
293 | 290 |
294 return broker; | 291 return broker; |
295 } | 292 } |
296 | 293 |
297 void PepperPluginDelegateImpl::OnPpapiBrokerChannelCreated( | 294 void PepperPluginDelegateImpl::OnPpapiBrokerChannelCreated( |
298 int request_id, | 295 int request_id, |
299 base::ProcessHandle broker_process_handle, | |
300 const IPC::ChannelHandle& handle) { | 296 const IPC::ChannelHandle& handle) { |
301 scoped_refptr<PepperBrokerImpl>* broker_ptr = | 297 scoped_refptr<PepperBrokerImpl>* broker_ptr = |
302 pending_connect_broker_.Lookup(request_id); | 298 pending_connect_broker_.Lookup(request_id); |
303 if (broker_ptr) { | 299 if (broker_ptr) { |
304 scoped_refptr<PepperBrokerImpl> broker = *broker_ptr; | 300 scoped_refptr<PepperBrokerImpl> broker = *broker_ptr; |
305 pending_connect_broker_.Remove(request_id); | 301 pending_connect_broker_.Remove(request_id); |
306 broker->OnBrokerChannelConnected(broker_process_handle, handle); | 302 broker->OnBrokerChannelConnected(handle); |
307 } else { | 303 } else { |
308 // There is no broker waiting for this channel. Close it so the broker can | 304 // There is no broker waiting for this channel. Close it so the broker can |
309 // clean up and possibly exit. | 305 // clean up and possibly exit. |
310 // The easiest way to clean it up is to just put it in an object | 306 // The easiest way to clean it up is to just put it in an object |
311 // and then close them. This failure case is not performance critical. | 307 // and then close them. This failure case is not performance critical. |
312 PepperBrokerDispatcherWrapper temp_dispatcher; | 308 PepperBrokerDispatcherWrapper temp_dispatcher; |
313 temp_dispatcher.Init(broker_process_handle, handle); | 309 temp_dispatcher.Init(handle); |
314 } | 310 } |
315 } | 311 } |
316 | 312 |
317 // Iterates through pending_connect_broker_ to find the broker. | 313 // Iterates through pending_connect_broker_ to find the broker. |
318 // Cannot use Lookup() directly because pending_connect_broker_ does not store | 314 // Cannot use Lookup() directly because pending_connect_broker_ does not store |
319 // the raw pointer to the broker. Assumes maximum of one copy of broker exists. | 315 // the raw pointer to the broker. Assumes maximum of one copy of broker exists. |
320 bool PepperPluginDelegateImpl::StopWaitingForBrokerConnection( | 316 bool PepperPluginDelegateImpl::StopWaitingForBrokerConnection( |
321 PepperBrokerImpl* broker) { | 317 PepperBrokerImpl* broker) { |
322 for (BrokerMap::iterator i(&pending_connect_broker_); | 318 for (BrokerMap::iterator i(&pending_connect_broker_); |
323 !i.IsAtEnd(); i.Advance()) { | 319 !i.IsAtEnd(); i.Advance()) { |
(...skipping 506 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
830 virtual void DidFail(base::PlatformFileError error_code) { | 826 virtual void DidFail(base::PlatformFileError error_code) { |
831 base::PlatformFile invalid_file = base::kInvalidPlatformFileValue; | 827 base::PlatformFile invalid_file = base::kInvalidPlatformFileValue; |
832 callback_.Run(error_code, base::PassPlatformFile(&invalid_file)); | 828 callback_.Run(error_code, base::PassPlatformFile(&invalid_file)); |
833 } | 829 } |
834 | 830 |
835 virtual void DidWrite(int64 bytes, bool complete) { | 831 virtual void DidWrite(int64 bytes, bool complete) { |
836 NOTREACHED(); | 832 NOTREACHED(); |
837 } | 833 } |
838 | 834 |
839 virtual void DidOpenFile( | 835 virtual void DidOpenFile( |
840 base::PlatformFile file, | 836 base::PlatformFile file) { |
841 base::ProcessHandle unused) { | |
842 callback_.Run(base::PLATFORM_FILE_OK, base::PassPlatformFile(&file)); | 837 callback_.Run(base::PLATFORM_FILE_OK, base::PassPlatformFile(&file)); |
843 // Make sure we won't leak file handle if the requester has died. | 838 // Make sure we won't leak file handle if the requester has died. |
844 if (file != base::kInvalidPlatformFileValue) { | 839 if (file != base::kInvalidPlatformFileValue) { |
845 base::FileUtilProxy::Close( | 840 base::FileUtilProxy::Close( |
846 RenderThreadImpl::current()->GetFileThreadMessageLoopProxy(), file, | 841 RenderThreadImpl::current()->GetFileThreadMessageLoopProxy(), file, |
847 base::FileUtilProxy::StatusCallback()); | 842 base::FileUtilProxy::StatusCallback()); |
848 } | 843 } |
849 } | 844 } |
850 | 845 |
851 private: // TODO(ericu): Delete this? | 846 private: // TODO(ericu): Delete this? |
(...skipping 776 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1628 mouse_lock_instances_.erase(it); | 1623 mouse_lock_instances_.erase(it); |
1629 } | 1624 } |
1630 } | 1625 } |
1631 | 1626 |
1632 webkit_glue::ClipboardClient* | 1627 webkit_glue::ClipboardClient* |
1633 PepperPluginDelegateImpl::CreateClipboardClient() const { | 1628 PepperPluginDelegateImpl::CreateClipboardClient() const { |
1634 return new RendererClipboardClient; | 1629 return new RendererClipboardClient; |
1635 } | 1630 } |
1636 | 1631 |
1637 } // namespace content | 1632 } // namespace content |
OLD | NEW |