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/browser/renderer_host/pepper/chrome_browser_pepper_host_factory.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "build/build_config.h" 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/renderer_host/pepper/pepper_broker_message_filter.h" 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/renderer_host/pepper/pepper_flash_browser_host.h" 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/renderer_host/pepper/pepper_flash_clipboard_message_filter.h" 1190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "chrome/browser/renderer_host/pepper/pepper_flash_drm_host.h" 12f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/renderer_host/pepper/pepper_isolated_file_system_message_filter.h" 134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "chrome/browser/renderer_host/pepper/pepper_output_protection_message_filter.h" 14d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "chrome/browser/renderer_host/pepper/pepper_platform_verification_message_filter.h" 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/renderer_host/pepper/pepper_talk_host.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_ppapi_host.h" 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/host/message_filter_host.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/host/ppapi_host.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/host/resource_host.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/proxy/ppapi_messages.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/shared_impl/ppapi_permissions.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using ppapi::host::MessageFilterHost; 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ppapi::host::ResourceHost; 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using ppapi::host::ResourceMessageFilter; 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace chrome { 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ChromeBrowserPepperHostFactory::ChromeBrowserPepperHostFactory( 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::BrowserPpapiHost* host) 31a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch : host_(host) {} 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33a02191e04bc25c4935f804f2c080ae28663d096dBen MurdochChromeBrowserPepperHostFactory::~ChromeBrowserPepperHostFactory() {} 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)scoped_ptr<ResourceHost> ChromeBrowserPepperHostFactory::CreateResourceHost( 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ppapi::host::PpapiHost* host, 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ppapi::proxy::ResourceMessageCallParams& params, 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_Instance instance, 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const IPC::Message& message) { 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(host == host_->GetPpapiHost()); 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure the plugin is giving us a valid instance for this resource. 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!host_->IsValidInstance(instance)) 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return scoped_ptr<ResourceHost>(); 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Private interfaces. 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (host_->GetPpapiHost()->permissions().HasPermission( 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ppapi::PERMISSION_PRIVATE)) { 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (message.type()) { 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case PpapiHostMsg_Broker_Create::ID: { 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<ResourceMessageFilter> broker_filter( 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new PepperBrokerMessageFilter(instance, host_)); 53a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch return scoped_ptr<ResourceHost>( 54a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch new MessageFilterHost(host_->GetPpapiHost(), 55a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch instance, 56a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch params.pp_resource(), 57a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch broker_filter)); 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 59d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#if defined(OS_CHROMEOS) 60d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) case PpapiHostMsg_PlatformVerification_Create::ID: { 61d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) scoped_refptr<ResourceMessageFilter> pv_filter( 62d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) new PepperPlatformVerificationMessageFilter(host_, instance)); 63d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) return scoped_ptr<ResourceHost>(new MessageFilterHost( 64d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) host_->GetPpapiHost(), instance, params.pp_resource(), pv_filter)); 65d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) } 66d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#endif 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case PpapiHostMsg_Talk_Create::ID: 68a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch return scoped_ptr<ResourceHost>( 69a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch new PepperTalkHost(host_, instance, params.pp_resource())); 704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#if defined(OS_CHROMEOS) 714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) case PpapiHostMsg_OutputProtection_Create::ID: { 724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) scoped_refptr<ResourceMessageFilter> output_protection_filter( 734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) new PepperOutputProtectionMessageFilter(host_, instance)); 74a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch return scoped_ptr<ResourceHost>( 75a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch new MessageFilterHost(host_->GetPpapiHost(), 76a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch instance, 77a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch params.pp_resource(), 78a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch output_protection_filter)); 794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#endif 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Flash interfaces. 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (host_->GetPpapiHost()->permissions().HasPermission( 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ppapi::PERMISSION_FLASH)) { 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) switch (message.type()) { 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case PpapiHostMsg_Flash_Create::ID: 89a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch return scoped_ptr<ResourceHost>( 90a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch new PepperFlashBrowserHost(host_, instance, params.pp_resource())); 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case PpapiHostMsg_FlashClipboard_Create::ID: { 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<ResourceMessageFilter> clipboard_filter( 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new PepperFlashClipboardMessageFilter); 94a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch return scoped_ptr<ResourceHost>( 95a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch new MessageFilterHost(host_->GetPpapiHost(), 96a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch instance, 97a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch params.pp_resource(), 98a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch clipboard_filter)); 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 10090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) case PpapiHostMsg_FlashDRM_Create::ID: 101a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch return scoped_ptr<ResourceHost>( 102a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch new PepperFlashDRMHost(host_, instance, params.pp_resource())); 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 105868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 106868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Permissions for the following interfaces will be checked at the 107868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // time of the corresponding instance's methods calls (because 108868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // permission check can be performed only on the UI 109868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // thread). Currently these interfaces are available only for 110868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // whitelisted apps which may not have access to the other private 111868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // interfaces. 112f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (message.type() == PpapiHostMsg_IsolatedFileSystem_Create::ID) { 113f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) PepperIsolatedFileSystemMessageFilter* isolated_fs_filter = 114f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) PepperIsolatedFileSystemMessageFilter::Create(instance, host_); 115f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (!isolated_fs_filter) 116868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return scoped_ptr<ResourceHost>(); 117868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return scoped_ptr<ResourceHost>(new MessageFilterHost( 118f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) host, instance, params.pp_resource(), isolated_fs_filter)); 119868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 120868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return scoped_ptr<ResourceHost>(); 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace chrome 125