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 "chrome/renderer/pepper/chrome_renderer_pepper_host_factory.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h"
87d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "chrome/renderer/pepper/pepper_flash_drm_renderer_host.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/renderer/pepper/pepper_flash_font_file_host.h"
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/renderer/pepper/pepper_flash_fullscreen_host.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/renderer/pepper/pepper_flash_menu_host.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/renderer/pepper/pepper_flash_renderer_host.h"
135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/renderer/pepper/pepper_uma_host.h"
141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "components/pdf/renderer/pepper_pdf_host.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/renderer/renderer_ppapi_host.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/host/ppapi_host.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/host/resource_host.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/proxy/ppapi_message_utils.h"
191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "ppapi/proxy/ppapi_messages.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/shared_impl/ppapi_permissions.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ppapi::host::ResourceHost;
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ChromeRendererPepperHostFactory::ChromeRendererPepperHostFactory(
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content::RendererPpapiHost* host)
26c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    : host_(host) {}
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochChromeRendererPepperHostFactory::~ChromeRendererPepperHostFactory() {}
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochscoped_ptr<ResourceHost> ChromeRendererPepperHostFactory::CreateResourceHost(
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ppapi::host::PpapiHost* host,
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ppapi::proxy::ResourceMessageCallParams& params,
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PP_Instance instance,
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const IPC::Message& message) {
350529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  DCHECK_EQ(host_->GetPpapiHost(), host);
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make sure the plugin is giving us a valid instance for this resource.
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!host_->IsValidInstance(instance))
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return scoped_ptr<ResourceHost>();
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (host_->GetPpapiHost()->permissions().HasPermission(
42c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch          ppapi::PERMISSION_FLASH)) {
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    switch (message.type()) {
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case PpapiHostMsg_Flash_Create::ID: {
45c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        return scoped_ptr<ResourceHost>(
46c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch            new PepperFlashRendererHost(host_, instance, params.pp_resource()));
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      }
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case PpapiHostMsg_FlashFullscreen_Create::ID: {
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        return scoped_ptr<ResourceHost>(new PepperFlashFullscreenHost(
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            host_, instance, params.pp_resource()));
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      }
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case PpapiHostMsg_FlashMenu_Create::ID: {
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ppapi::proxy::SerializedFlashMenu serialized_menu;
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        if (ppapi::UnpackMessage<PpapiHostMsg_FlashMenu_Create>(
55c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                message, &serialized_menu)) {
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          return scoped_ptr<ResourceHost>(new PepperFlashMenuHost(
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              host_, instance, params.pp_resource(), serialized_menu));
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        }
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      }
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // TODO(raymes): PDF also needs access to the FlashFontFileHost currently.
65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // We should either rename PPB_FlashFont_File to PPB_FontFile_Private or get
66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // rid of its use in PDF if possible.
67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (host_->GetPpapiHost()->permissions().HasPermission(
68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          ppapi::PERMISSION_FLASH) ||
69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      host_->GetPpapiHost()->permissions().HasPermission(
70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          ppapi::PERMISSION_PRIVATE)) {
71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    switch (message.type()) {
72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      case PpapiHostMsg_FlashFontFile_Create::ID: {
73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        ppapi::proxy::SerializedFontDescription description;
74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        PP_PrivateFontCharset charset;
75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        if (ppapi::UnpackMessage<PpapiHostMsg_FlashFontFile_Create>(
76c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                message, &description, &charset)) {
77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          return scoped_ptr<ResourceHost>(new PepperFlashFontFileHost(
78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)              host_, instance, params.pp_resource(), description, charset));
79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        }
80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        break;
81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      }
827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      case PpapiHostMsg_FlashDRM_Create::ID:
837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        return scoped_ptr<ResourceHost>(new PepperFlashDRMRendererHost(
847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)            host_, instance, params.pp_resource()));
85c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (host_->GetPpapiHost()->permissions().HasPermission(
89c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch          ppapi::PERMISSION_PRIVATE)) {
90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    switch (message.type()) {
91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      case PpapiHostMsg_PDF_Create::ID: {
92c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        return scoped_ptr<ResourceHost>(
931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            new pdf::PepperPDFHost(host_, instance, params.pp_resource()));
94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      }
95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Permissions for the following interfaces will be checked at the
995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // time of the corresponding instance's method calls.  Currently these
1005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // interfaces are available only for whitelisted apps which may not have
1015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // access to the other private interfaces.
1025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  switch (message.type()) {
1035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    case PpapiHostMsg_UMA_Create::ID: {
104c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      return scoped_ptr<ResourceHost>(
105c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch          new PepperUMAHost(host_, instance, params.pp_resource()));
1065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    }
1075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
1085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return scoped_ptr<ResourceHost>();
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
111