15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/renderer/pepper/renderer_ppapi_host_impl.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "base/bind.h"
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/file_path.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h"
10424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "base/message_loop/message_loop.h"
11bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "base/process/process_handle.h"
12c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/common/sandbox_util.h"
13bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "content/renderer/pepper/fullscreen_container.h"
14bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "content/renderer/pepper/host_globals.h"
15868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "content/renderer/pepper/pepper_browser_connection.h"
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/renderer/pepper/pepper_graphics_2d_host.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/renderer/pepper/pepper_in_process_resource_creation.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/renderer/pepper/pepper_in_process_router.h"
1958e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch#include "content/renderer/pepper/pepper_plugin_instance_impl.h"
20bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "content/renderer/pepper/plugin_module.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/renderer/render_view_impl.h"
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/renderer/render_widget_fullscreen_pepper.h"
23868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "ipc/ipc_message.h"
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/host/ppapi_host.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/proxy/host_dispatcher.h"
26868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebRect.h"
277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebDocument.h"
287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebElement.h"
297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebPluginContainer.h"
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/point.h"
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content {
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static
34a02191e04bc25c4935f804f2c080ae28663d096dBen MurdochCONTENT_EXPORT RendererPpapiHost* RendererPpapiHost::GetForPPInstance(
35a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    PP_Instance instance) {
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return RendererPpapiHostImpl::GetForPPInstance(instance);
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Out-of-process constructor.
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RendererPpapiHostImpl::RendererPpapiHostImpl(
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PluginModule* module,
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ppapi::proxy::HostDispatcher* dispatcher,
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ppapi::PpapiPermissions& permissions)
44cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    : module_(module),
45cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      dispatcher_(dispatcher),
46cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      is_external_plugin_host_(false) {
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Hook the PpapiHost up to the dispatcher for out-of-process communication.
48a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  ppapi_host_.reset(new ppapi::host::PpapiHost(dispatcher, permissions));
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ppapi_host_->AddHostFactoryFilter(scoped_ptr<ppapi::host::HostFactory>(
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new ContentRendererPepperHostFactory(this)));
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dispatcher->AddFilter(ppapi_host_.get());
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  is_running_in_process_ = false;
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// In-process constructor.
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RendererPpapiHostImpl::RendererPpapiHostImpl(
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PluginModule* module,
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ppapi::PpapiPermissions& permissions)
59cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    : module_(module), dispatcher_(NULL), is_external_plugin_host_(false) {
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Hook the host up to the in-process router.
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  in_process_router_.reset(new PepperInProcessRouter(this));
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ppapi_host_.reset(new ppapi::host::PpapiHost(
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      in_process_router_->GetRendererToPluginSender(), permissions));
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ppapi_host_->AddHostFactoryFilter(scoped_ptr<ppapi::host::HostFactory>(
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new ContentRendererPepperHostFactory(this)));
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  is_running_in_process_ = true;
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RendererPpapiHostImpl::~RendererPpapiHostImpl() {
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Delete the host explicitly first. This shutdown will destroy the
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // resources, which may want to do cleanup in their destructors and expect
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // their pointers to us to be valid.
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ppapi_host_.reset();
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RendererPpapiHostImpl* RendererPpapiHostImpl::CreateOnModuleForOutOfProcess(
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PluginModule* module,
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ppapi::proxy::HostDispatcher* dispatcher,
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ppapi::PpapiPermissions& permissions) {
81558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  DCHECK(!module->renderer_ppapi_host());
82a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  RendererPpapiHostImpl* result =
83a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      new RendererPpapiHostImpl(module, dispatcher, permissions);
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Takes ownership of pointer.
86558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  module->SetRendererPpapiHost(scoped_ptr<RendererPpapiHostImpl>(result));
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return result;
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RendererPpapiHostImpl* RendererPpapiHostImpl::CreateOnModuleForInProcess(
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PluginModule* module,
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ppapi::PpapiPermissions& permissions) {
95558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  DCHECK(!module->renderer_ppapi_host());
96a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  RendererPpapiHostImpl* result =
97a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      new RendererPpapiHostImpl(module, permissions);
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Takes ownership of pointer.
100558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  module->SetRendererPpapiHost(scoped_ptr<RendererPpapiHostImpl>(result));
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return result;
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RendererPpapiHostImpl* RendererPpapiHostImpl::GetForPPInstance(
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PP_Instance pp_instance) {
10858e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch  PepperPluginInstanceImpl* instance =
10958e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch      HostGlobals::Get()->GetInstance(pp_instance);
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!instance)
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return NULL;
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // All modules created by content will have their embedder state be the
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // host impl.
115558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  return instance->module()->renderer_ppapi_host();
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
118ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochscoped_ptr<ppapi::thunk::ResourceCreationAPI>
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RendererPpapiHostImpl::CreateInProcessResourceCreationAPI(
12058e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch    PepperPluginInstanceImpl* instance) {
121ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  return scoped_ptr<ppapi::thunk::ResourceCreationAPI>(
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new PepperInProcessResourceCreation(this, instance));
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12558e6fbe4ee35d65e14b626c557d37565bf8ad179Ben MurdochPepperPluginInstanceImpl* RendererPpapiHostImpl::GetPluginInstanceImpl(
126bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    PP_Instance instance) const {
127bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch  return GetAndValidateInstance(instance);
128bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch}
129bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch
130cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)bool RendererPpapiHostImpl::IsExternalPluginHost() const {
131cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return is_external_plugin_host_;
132cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
133cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ppapi::host::PpapiHost* RendererPpapiHostImpl::GetPpapiHost() {
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return ppapi_host_.get();
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
138a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)RenderFrame* RendererPpapiHostImpl::GetRenderFrameForInstance(
139a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    PP_Instance instance) const {
140a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  PepperPluginInstanceImpl* instance_object = GetAndValidateInstance(instance);
141a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  if (!instance_object)
142a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    return NULL;
143a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
144a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Since we're the embedder, we can make assumptions about the helper on
145a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // the instance and get back to our RenderFrame.
146a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  return instance_object->render_frame();
147a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
148a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RenderView* RendererPpapiHostImpl::GetRenderViewForInstance(
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PP_Instance instance) const {
15158e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch  PepperPluginInstanceImpl* instance_object = GetAndValidateInstance(instance);
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!instance_object)
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return NULL;
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
155fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch  // Since we're the embedder, we can make assumptions about the helper on
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the instance and get back to our RenderView.
157a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  return instance_object->render_frame()->render_view();
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
160bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdochbool RendererPpapiHostImpl::IsValidInstance(PP_Instance instance) const {
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return !!GetAndValidateInstance(instance);
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16458e6fbe4ee35d65e14b626c557d37565bf8ad179Ben MurdochPepperPluginInstance* RendererPpapiHostImpl::GetPluginInstance(
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PP_Instance instance) const {
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return GetAndValidateInstance(instance);
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
169f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)blink::WebPluginContainer* RendererPpapiHostImpl::GetContainerForInstance(
170a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    PP_Instance instance) const {
17158e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch  PepperPluginInstanceImpl* instance_object = GetAndValidateInstance(instance);
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!instance_object)
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return NULL;
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return instance_object->container();
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)base::ProcessId RendererPpapiHostImpl::GetPluginPID() const {
17890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (dispatcher_)
17946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    return dispatcher_->channel()->GetPeerPID();
18090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  return base::kNullProcessId;
18190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
18290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RendererPpapiHostImpl::HasUserGesture(PP_Instance instance) const {
18458e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch  PepperPluginInstanceImpl* instance_object = GetAndValidateInstance(instance);
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!instance_object)
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (instance_object->module()->permissions().HasPermission(
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          ppapi::PERMISSION_BYPASS_USER_GESTURE))
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return true;
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return instance_object->IsProcessingUserGesture();
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int RendererPpapiHostImpl::GetRoutingIDForWidget(PP_Instance instance) const {
19558e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch  PepperPluginInstanceImpl* plugin_instance = GetAndValidateInstance(instance);
1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!plugin_instance)
1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return 0;
1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (plugin_instance->flash_fullscreen()) {
19958e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch    FullscreenContainer* container = plugin_instance->fullscreen_container();
2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return static_cast<RenderWidgetFullscreenPepper*>(container)->routing_id();
2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return GetRenderViewForInstance(instance)->GetRoutingID();
2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
205a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)gfx::Point RendererPpapiHostImpl::PluginPointToRenderFrame(
2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    PP_Instance instance,
2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const gfx::Point& pt) const {
20858e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch  PepperPluginInstanceImpl* plugin_instance = GetAndValidateInstance(instance);
209a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (!plugin_instance || plugin_instance->flash_fullscreen()) {
210a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    // Flash fullscreen is special in that it renders into its own separate,
211a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    // dedicated window.  So, do not offset the point.
2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return pt;
2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return gfx::Point(pt.x() + plugin_instance->view_data().rect.point.x,
2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    pt.y() + plugin_instance->view_data().rect.point.y);
2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IPC::PlatformFileForTransit RendererPpapiHostImpl::ShareHandleWithRemote(
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::PlatformFile handle,
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool should_close_source) {
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!dispatcher_) {
222c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    DCHECK(is_running_in_process_);
223c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Duplicate the file handle for in process mode so this function
224c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // has the same semantics for both in process mode and out of
225c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // process mode (i.e., the remote side must cloes the handle).
226a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    return BrokerGetFileHandleForProcess(
227a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch        handle, base::GetCurrentProcId(), should_close_source);
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return dispatcher_->ShareHandleWithRemote(handle, should_close_source);
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool RendererPpapiHostImpl::IsRunningInProcess() const {
2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return is_running_in_process_;
2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
236cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)std::string RendererPpapiHostImpl::GetPluginName() const {
237cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return module_->name();
238cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
239cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
240cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void RendererPpapiHostImpl::SetToExternalPluginHost() {
241cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  is_external_plugin_host_ = true;
242cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
243cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
2443551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)void RendererPpapiHostImpl::CreateBrowserResourceHosts(
245868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    PP_Instance instance,
2463551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    const std::vector<IPC::Message>& nested_msgs,
2473551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    const base::Callback<void(const std::vector<int>&)>& callback) const {
248a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  RenderFrame* render_frame = GetRenderFrameForInstance(instance);
2492385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  PepperBrowserConnection* browser_connection =
250a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      PepperBrowserConnection::Get(render_frame);
2512385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  if (!browser_connection) {
252a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    base::MessageLoop::current()->PostTask(
253a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch        FROM_HERE,
254424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        base::Bind(callback, std::vector<int>(nested_msgs.size(), 0)));
255eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  } else {
256a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    browser_connection->SendBrowserCreate(
257a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch        module_->GetPluginChildId(), instance, nested_msgs, callback);
258eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
259868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
260868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
261f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)GURL RendererPpapiHostImpl::GetDocumentURL(PP_Instance instance) const {
262f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  PepperPluginInstanceImpl* instance_object = GetAndValidateInstance(instance);
263f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (!instance_object)
264f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    return GURL();
265f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
266f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return instance_object->container()->element().document().url();
267f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
268f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
26958e6fbe4ee35d65e14b626c557d37565bf8ad179Ben MurdochPepperPluginInstanceImpl* RendererPpapiHostImpl::GetAndValidateInstance(
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PP_Instance pp_instance) const {
27158e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch  PepperPluginInstanceImpl* instance =
27258e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch      HostGlobals::Get()->GetInstance(pp_instance);
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!instance)
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return NULL;
2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!instance->IsValidInstanceOf(module_))
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return NULL;
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return instance;
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace content
281