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