Index: content/renderer/pepper/renderer_ppapi_host_impl.cc |
diff --git a/content/renderer/pepper/renderer_ppapi_host_impl.cc b/content/renderer/pepper/renderer_ppapi_host_impl.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..feafc2ed5eb61ff32ad1417f936057de6e691301 |
--- /dev/null |
+++ b/content/renderer/pepper/renderer_ppapi_host_impl.cc |
@@ -0,0 +1,130 @@ |
+// Copyright (c) 2012 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "content/renderer/pepper/renderer_ppapi_host_impl.h" |
+ |
+#include "base/logging.h" |
+#include "content/renderer/pepper/pepper_in_process_resource_creation.h" |
+#include "content/renderer/pepper/pepper_in_process_router.h" |
+#include "content/renderer/pepper/pepper_plugin_delegate_impl.h" |
+#include "content/renderer/render_view_impl.h" |
+#include "ppapi/proxy/host_dispatcher.h" |
+#include "webkit/plugins/ppapi/host_globals.h" |
+#include "webkit/plugins/ppapi/ppapi_plugin_instance.h" |
+ |
+using webkit::ppapi::HostGlobals; |
+using webkit::ppapi::PluginInstance; |
+ |
+namespace content { |
+ |
+// Out-of-process constructor. |
+RendererPpapiHostImpl::RendererPpapiHostImpl( |
+ webkit::ppapi::PluginModule* module, |
+ ppapi::proxy::HostDispatcher* dispatcher, |
+ const ppapi::PpapiPermissions& permissions) |
+ : module_(module), |
+ host_factory_(ALLOW_THIS_IN_INITIALIZER_LIST(this)) { |
+ // Hook the PpapiHost up to the dispatcher for out-of-process communication. |
+ ppapi_host_.reset( |
+ new ppapi::host::PpapiHost(dispatcher, &host_factory_, permissions)); |
+ dispatcher->AddFilter(ppapi_host_.get()); |
+} |
+ |
+// In-process constructor. |
+RendererPpapiHostImpl::RendererPpapiHostImpl( |
+ webkit::ppapi::PluginModule* module, |
+ const ppapi::PpapiPermissions& permissions) |
+ : module_(module), |
+ host_factory_(ALLOW_THIS_IN_INITIALIZER_LIST(this)) { |
+ // Hook the host up to the in-process router. |
+ in_process_router_.reset(new PepperInProcessRouter(this)); |
+ ppapi_host_.reset(new ppapi::host::PpapiHost( |
+ in_process_router_->GetRendererToPluginSender(), |
+ &host_factory_, permissions)); |
+} |
+ |
+RendererPpapiHostImpl::~RendererPpapiHostImpl() { |
+} |
+ |
+// static |
+RendererPpapiHostImpl* RendererPpapiHostImpl::CreateOnModuleForOutOfProcess( |
+ webkit::ppapi::PluginModule* module, |
+ ppapi::proxy::HostDispatcher* dispatcher, |
+ const ppapi::PpapiPermissions& permissions) { |
+ DCHECK(!module->GetEmbedderState()); |
+ RendererPpapiHostImpl* result = new RendererPpapiHostImpl( |
+ module, dispatcher, permissions); |
+ |
+ // Takes ownership of pointer. |
+ module->SetEmbedderState( |
+ scoped_ptr<webkit::ppapi::PluginModule::EmbedderState>(result)); |
+ |
+ return result; |
+} |
+ |
+// static |
+RendererPpapiHostImpl* RendererPpapiHostImpl::CreateOnModuleForInProcess( |
+ webkit::ppapi::PluginModule* module, |
+ const ppapi::PpapiPermissions& permissions) { |
+ DCHECK(!module->GetEmbedderState()); |
+ RendererPpapiHostImpl* result = new RendererPpapiHostImpl( |
+ module, permissions); |
+ |
+ // Takes ownership of pointer. |
+ module->SetEmbedderState( |
+ scoped_ptr<webkit::ppapi::PluginModule::EmbedderState>(result)); |
+ |
+ return result; |
+} |
+ |
+scoped_ptr< ::ppapi::thunk::ResourceCreationAPI> |
+RendererPpapiHostImpl::CreateInProcessResourceCreationAPI( |
+ webkit::ppapi::PluginInstance* instance) { |
+ return scoped_ptr< ::ppapi::thunk::ResourceCreationAPI>( |
+ new PepperInProcessResourceCreation(this, instance)); |
+} |
+ |
+ppapi::host::PpapiHost* RendererPpapiHostImpl::GetPpapiHost() { |
+ return ppapi_host_.get(); |
+} |
+ |
+RenderView* RendererPpapiHostImpl::GetRenderViewForInstance( |
+ PP_Instance instance) const { |
+ PluginInstance* instance_object = GetAndValidateInstance(instance); |
+ if (!instance_object) |
+ return NULL; |
+ |
+ // Since we're the embedder, we can make assumptions about the delegate on |
+ // the instance and get back to our RenderView. |
+ return static_cast<PepperPluginDelegateImpl*>( |
+ instance_object->delegate())->render_view(); |
+} |
+ |
+bool RendererPpapiHostImpl::IsValidInstance( |
+ PP_Instance instance) const { |
+ return !!GetAndValidateInstance(instance); |
+} |
+ |
+bool RendererPpapiHostImpl::HasUserGesture(PP_Instance instance) const { |
+ PluginInstance* instance_object = GetAndValidateInstance(instance); |
+ if (!instance_object) |
+ return false; |
+ |
+ if (instance_object->module()->permissions().HasPermission( |
+ ppapi::PERMISSION_BYPASS_USER_GESTURE)) |
+ return true; |
+ return instance_object->IsProcessingUserGesture(); |
+} |
+ |
+PluginInstance* RendererPpapiHostImpl::GetAndValidateInstance( |
+ PP_Instance pp_instance) const { |
+ PluginInstance* instance = HostGlobals::Get()->GetInstance(pp_instance); |
+ if (!instance) |
+ return NULL; |
+ if (instance->module() != module_) |
+ return NULL; |
+ return instance; |
+} |
+ |
+} // namespace content |