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

Side by Side Diff: content/renderer/pepper/pepper_plugin_delegate_impl.cc

Issue 11368019: Add support for external out-of-process PPAPI plugins in the browser. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: Created 8 years, 1 month 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/renderer/pepper/pepper_plugin_delegate_impl.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) 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 89 matching lines...) Expand 10 before | Expand all | Expand 10 after
100 namespace { 100 namespace {
101 101
102 // This class wraps a dispatcher and has the same lifetime. A dispatcher has 102 // This class wraps a dispatcher and has the same lifetime. A dispatcher has
103 // the same lifetime as a plugin module, which is longer than any particular 103 // the same lifetime as a plugin module, which is longer than any particular
104 // RenderView or plugin instance. 104 // RenderView or plugin instance.
105 class HostDispatcherWrapper 105 class HostDispatcherWrapper
106 : public webkit::ppapi::PluginDelegate::OutOfProcessProxy { 106 : public webkit::ppapi::PluginDelegate::OutOfProcessProxy {
107 public: 107 public:
108 HostDispatcherWrapper(webkit::ppapi::PluginModule* module, 108 HostDispatcherWrapper(webkit::ppapi::PluginModule* module,
109 int plugin_child_id, 109 int plugin_child_id,
110 const ppapi::PpapiPermissions& perms) 110 const ppapi::PpapiPermissions& perms,
111 bool is_external)
111 : module_(module), 112 : module_(module),
112 plugin_child_id_(plugin_child_id), 113 plugin_child_id_(plugin_child_id),
113 permissions_(perms) { 114 permissions_(perms),
115 is_external_(is_external) {
114 } 116 }
115 virtual ~HostDispatcherWrapper() {} 117 virtual ~HostDispatcherWrapper() {}
116 118
117 bool Init(const IPC::ChannelHandle& channel_handle, 119 bool Init(const IPC::ChannelHandle& channel_handle,
118 PP_GetInterface_Func local_get_interface, 120 PP_GetInterface_Func local_get_interface,
119 const ppapi::Preferences& preferences, 121 const ppapi::Preferences& preferences,
120 const ppapi::PpapiPermissions& permissions,
121 PepperHungPluginFilter* filter) { 122 PepperHungPluginFilter* filter) {
122 if (channel_handle.name.empty()) 123 if (channel_handle.name.empty())
123 return false; 124 return false;
124 125
125 #if defined(OS_POSIX) 126 #if defined(OS_POSIX)
126 DCHECK_NE(-1, channel_handle.socket.fd); 127 DCHECK_NE(-1, channel_handle.socket.fd);
127 if (channel_handle.socket.fd == -1) 128 if (channel_handle.socket.fd == -1)
128 return false; 129 return false;
129 #endif 130 #endif
130 131
(...skipping 25 matching lines...) Expand all
156 RendererPpapiHostImpl::GetForPPInstance(instance); 157 RendererPpapiHostImpl::GetForPPInstance(instance);
157 // TODO(brettw) remove this null check when the old-style pepper-based 158 // TODO(brettw) remove this null check when the old-style pepper-based
158 // browser tag is removed from this file. Getting this notification should 159 // browser tag is removed from this file. Getting this notification should
159 // always give us an instance we can find in the map otherwise, but that 160 // always give us an instance we can find in the map otherwise, but that
160 // isn't true for browser tag support. 161 // isn't true for browser tag support.
161 if (host) { 162 if (host) {
162 RenderView* render_view = host->GetRenderViewForInstance(instance); 163 RenderView* render_view = host->GetRenderViewForInstance(instance);
163 render_view->Send(new ViewHostMsg_DidCreateOutOfProcessPepperInstance( 164 render_view->Send(new ViewHostMsg_DidCreateOutOfProcessPepperInstance(
164 plugin_child_id_, 165 plugin_child_id_,
165 instance, 166 instance,
166 render_view->GetRoutingID())); 167 render_view->GetRoutingID(),
168 is_external_));
167 } 169 }
168 } 170 }
169 virtual void RemoveInstance(PP_Instance instance) { 171 virtual void RemoveInstance(PP_Instance instance) {
170 ppapi::proxy::HostDispatcher::RemoveForInstance(instance); 172 ppapi::proxy::HostDispatcher::RemoveForInstance(instance);
171 173
172 RendererPpapiHostImpl* host = 174 RendererPpapiHostImpl* host =
173 RendererPpapiHostImpl::GetForPPInstance(instance); 175 RendererPpapiHostImpl::GetForPPInstance(instance);
174 // TODO(brettw) remove null check as described in AddInstance. 176 // TODO(brettw) remove null check as described in AddInstance.
175 if (host) { 177 if (host) {
176 RenderView* render_view = host->GetRenderViewForInstance(instance); 178 RenderView* render_view = host->GetRenderViewForInstance(instance);
177 render_view->Send(new ViewHostMsg_DidDeleteOutOfProcessPepperInstance( 179 render_view->Send(new ViewHostMsg_DidDeleteOutOfProcessPepperInstance(
178 plugin_child_id_, 180 plugin_child_id_,
179 instance)); 181 instance,
182 is_external_));
180 } 183 }
181 } 184 }
182 185
183 ppapi::proxy::HostDispatcher* dispatcher() { return dispatcher_.get(); } 186 ppapi::proxy::HostDispatcher* dispatcher() { return dispatcher_.get(); }
184 187
185 private: 188 private:
186 webkit::ppapi::PluginModule* module_; 189 webkit::ppapi::PluginModule* module_;
187 190
188 // ID that the browser process uses to idetify the child process for the 191 // ID that the browser process uses to idetify the child process for the
189 // plugin. This isn't directly useful from our process (the renderer) except 192 // plugin. This isn't directly useful from our process (the renderer) except
190 // in messages to the browser to disambiguate plugins. 193 // in messages to the browser to disambiguate plugins.
191 int plugin_child_id_; 194 int plugin_child_id_;
192 195
193 ppapi::PpapiPermissions permissions_; 196 ppapi::PpapiPermissions permissions_;
197 bool is_external_;
194 198
195 scoped_ptr<ppapi::proxy::HostDispatcher> dispatcher_; 199 scoped_ptr<ppapi::proxy::HostDispatcher> dispatcher_;
196 scoped_ptr<ppapi::proxy::ProxyChannel::Delegate> dispatcher_delegate_; 200 scoped_ptr<ppapi::proxy::ProxyChannel::Delegate> dispatcher_delegate_;
197 }; 201 };
198 202
199 class QuotaCallbackTranslator : public QuotaDispatcher::Callback { 203 class QuotaCallbackTranslator : public QuotaDispatcher::Callback {
200 public: 204 public:
201 typedef webkit::ppapi::PluginDelegate::AvailableSpaceCallback PluginCallback; 205 typedef webkit::ppapi::PluginDelegate::AvailableSpaceCallback PluginCallback;
202 explicit QuotaCallbackTranslator(const PluginCallback& cb) : callback_(cb) {} 206 explicit QuotaCallbackTranslator(const PluginCallback& cb) : callback_(cb) {}
203 virtual void DidQueryStorageUsageAndQuota(int64 usage, int64 quota) OVERRIDE { 207 virtual void DidQueryStorageUsageAndQuota(int64 usage, int64 quota) OVERRIDE {
(...skipping 181 matching lines...) Expand 10 before | Expand all | Expand 10 after
385 } 389 }
386 390
387 // AddLiveModule must be called before any early returns since the 391 // AddLiveModule must be called before any early returns since the
388 // module's destructor will remove itself. 392 // module's destructor will remove itself.
389 module = new webkit::ppapi::PluginModule( 393 module = new webkit::ppapi::PluginModule(
390 info->name, path, 394 info->name, path,
391 PepperPluginRegistry::GetInstance(), 395 PepperPluginRegistry::GetInstance(),
392 permissions); 396 permissions);
393 PepperPluginRegistry::GetInstance()->AddLiveModule(path, module); 397 PepperPluginRegistry::GetInstance()->AddLiveModule(path, module);
394 398
395 if (!CreateOutOfProcessModule( 399 if (!CreateOutOfProcessModule(module,
396 module, path, permissions, channel_handle, plugin_child_id)) { 400 path,
401 permissions,
402 channel_handle,
403 plugin_child_id,
404 false)) // is_external = false
397 return scoped_refptr<webkit::ppapi::PluginModule>(); 405 return scoped_refptr<webkit::ppapi::PluginModule>();
398 } 406
399 return module; 407 return module;
400 } 408 }
401 409
402 RendererPpapiHost* PepperPluginDelegateImpl::CreateExternalPluginModule( 410 RendererPpapiHost* PepperPluginDelegateImpl::CreateExternalPluginModule(
403 scoped_refptr<webkit::ppapi::PluginModule> module, 411 scoped_refptr<webkit::ppapi::PluginModule> module,
404 const FilePath& path, 412 const FilePath& path,
405 ppapi::PpapiPermissions permissions, 413 ppapi::PpapiPermissions permissions,
406 const IPC::ChannelHandle& channel_handle, 414 const IPC::ChannelHandle& channel_handle,
407 int plugin_child_id) { 415 int plugin_child_id) {
408 // We don't call PepperPluginRegistry::AddLiveModule, as this module is 416 // We don't call PepperPluginRegistry::AddLiveModule, as this module is
409 // managed externally. 417 // managed externally.
410 // TODO(bbudge) pass plugin_child_id when PpapiPluginProcessHost receives 418 return CreateOutOfProcessModule(module,
411 // a message notifying it that the external plugin process has been created. 419 path,
412 return CreateOutOfProcessModule( 420 permissions,
413 module, path, permissions, channel_handle, 0); 421 channel_handle,
422 plugin_child_id,
423 true); // is_external = true
414 } 424 }
415 425
416 scoped_refptr<PepperBrokerImpl> PepperPluginDelegateImpl::CreateBroker( 426 scoped_refptr<PepperBrokerImpl> PepperPluginDelegateImpl::CreateBroker(
417 webkit::ppapi::PluginModule* plugin_module) { 427 webkit::ppapi::PluginModule* plugin_module) {
418 DCHECK(plugin_module); 428 DCHECK(plugin_module);
419 DCHECK(!plugin_module->GetBroker()); 429 DCHECK(!plugin_module->GetBroker());
420 430
421 // The broker path is the same as the plugin. 431 // The broker path is the same as the plugin.
422 const FilePath& broker_path = plugin_module->path(); 432 const FilePath& broker_path = plugin_module->path();
423 433
(...skipping 14 matching lines...) Expand all
438 } 448 }
439 449
440 return broker; 450 return broker;
441 } 451 }
442 452
443 RendererPpapiHost* PepperPluginDelegateImpl::CreateOutOfProcessModule( 453 RendererPpapiHost* PepperPluginDelegateImpl::CreateOutOfProcessModule(
444 webkit::ppapi::PluginModule* module, 454 webkit::ppapi::PluginModule* module,
445 const FilePath& path, 455 const FilePath& path,
446 ppapi::PpapiPermissions permissions, 456 ppapi::PpapiPermissions permissions,
447 const IPC::ChannelHandle& channel_handle, 457 const IPC::ChannelHandle& channel_handle,
448 int plugin_child_id) { 458 int plugin_child_id,
459 bool is_external) {
449 scoped_refptr<PepperHungPluginFilter> hung_filter( 460 scoped_refptr<PepperHungPluginFilter> hung_filter(
450 new PepperHungPluginFilter(path, 461 new PepperHungPluginFilter(path,
451 render_view_->routing_id(), 462 render_view_->routing_id(),
452 plugin_child_id)); 463 plugin_child_id));
453 scoped_ptr<HostDispatcherWrapper> dispatcher( 464 scoped_ptr<HostDispatcherWrapper> dispatcher(
454 new HostDispatcherWrapper(module, plugin_child_id, permissions)); 465 new HostDispatcherWrapper(module,
466 plugin_child_id,
467 permissions,
468 is_external));
455 if (!dispatcher->Init( 469 if (!dispatcher->Init(
456 channel_handle, 470 channel_handle,
457 webkit::ppapi::PluginModule::GetLocalGetInterfaceFunc(), 471 webkit::ppapi::PluginModule::GetLocalGetInterfaceFunc(),
458 GetPreferences(), 472 GetPreferences(),
459 permissions,
460 hung_filter.get())) 473 hung_filter.get()))
461 return NULL; 474 return NULL;
462 475
463 RendererPpapiHostImpl* host_impl = 476 RendererPpapiHostImpl* host_impl =
464 RendererPpapiHostImpl::CreateOnModuleForOutOfProcess( 477 RendererPpapiHostImpl::CreateOnModuleForOutOfProcess(
465 module, dispatcher->dispatcher(), permissions); 478 module, dispatcher->dispatcher(), permissions);
466 render_view_->PpapiPluginCreated(host_impl); 479 render_view_->PpapiPluginCreated(host_impl);
467 480
468 module->InitAsProxied(dispatcher.release()); 481 module->InitAsProxied(dispatcher.release());
469 return host_impl; 482 return host_impl;
(...skipping 1388 matching lines...) Expand 10 before | Expand all | Expand 10 after
1858 RenderWidgetFullscreenPepper* container = 1871 RenderWidgetFullscreenPepper* container =
1859 static_cast<RenderWidgetFullscreenPepper*>( 1872 static_cast<RenderWidgetFullscreenPepper*>(
1860 instance->fullscreen_container()); 1873 instance->fullscreen_container());
1861 return container->mouse_lock_dispatcher(); 1874 return container->mouse_lock_dispatcher();
1862 } else { 1875 } else {
1863 return render_view_->mouse_lock_dispatcher(); 1876 return render_view_->mouse_lock_dispatcher();
1864 } 1877 }
1865 } 1878 }
1866 1879
1867 } // namespace content 1880 } // namespace content
OLDNEW
« no previous file with comments | « content/renderer/pepper/pepper_plugin_delegate_impl.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698