chrome_browser_pepper_host_factory.cc revision d0247b1b59f9c528cb6df88b4f2b9afaf80d181e
1// Copyright (c) 2012 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#include "chrome/browser/renderer_host/pepper/chrome_browser_pepper_host_factory.h" 6 7#include "build/build_config.h" 8#include "chrome/browser/renderer_host/pepper/pepper_broker_message_filter.h" 9#include "chrome/browser/renderer_host/pepper/pepper_crx_file_system_message_filter.h" 10#include "chrome/browser/renderer_host/pepper/pepper_extensions_common_message_filter.h" 11#include "chrome/browser/renderer_host/pepper/pepper_flash_browser_host.h" 12#include "chrome/browser/renderer_host/pepper/pepper_flash_clipboard_message_filter.h" 13#include "chrome/browser/renderer_host/pepper/pepper_flash_drm_host.h" 14#include "chrome/browser/renderer_host/pepper/pepper_platform_verification_message_filter.h" 15#include "chrome/browser/renderer_host/pepper/pepper_talk_host.h" 16#include "content/public/browser/browser_ppapi_host.h" 17#include "ppapi/host/message_filter_host.h" 18#include "ppapi/host/ppapi_host.h" 19#include "ppapi/host/resource_host.h" 20#include "ppapi/proxy/ppapi_messages.h" 21#include "ppapi/shared_impl/ppapi_permissions.h" 22 23using ppapi::host::MessageFilterHost; 24using ppapi::host::ResourceHost; 25using ppapi::host::ResourceMessageFilter; 26 27namespace chrome { 28 29ChromeBrowserPepperHostFactory::ChromeBrowserPepperHostFactory( 30 content::BrowserPpapiHost* host) 31 : host_(host) { 32} 33 34ChromeBrowserPepperHostFactory::~ChromeBrowserPepperHostFactory() { 35} 36 37scoped_ptr<ResourceHost> ChromeBrowserPepperHostFactory::CreateResourceHost( 38 ppapi::host::PpapiHost* host, 39 const ppapi::proxy::ResourceMessageCallParams& params, 40 PP_Instance instance, 41 const IPC::Message& message) { 42 DCHECK(host == host_->GetPpapiHost()); 43 44 // Make sure the plugin is giving us a valid instance for this resource. 45 if (!host_->IsValidInstance(instance)) 46 return scoped_ptr<ResourceHost>(); 47 48 // Dev interfaces. 49 if (host_->GetPpapiHost()->permissions().HasPermission( 50 ppapi::PERMISSION_DEV)) { 51 switch (message.type()) { 52 case PpapiHostMsg_ExtensionsCommon_Create::ID: { 53 scoped_refptr<ResourceMessageFilter> extensions_common_filter( 54 PepperExtensionsCommonMessageFilter::Create(host_, instance)); 55 if (!extensions_common_filter.get()) 56 return scoped_ptr<ResourceHost>(); 57 return scoped_ptr<ResourceHost>(new MessageFilterHost( 58 host_->GetPpapiHost(), instance, params.pp_resource(), 59 extensions_common_filter)); 60 } 61 } 62 } 63 64 // Private interfaces. 65 if (host_->GetPpapiHost()->permissions().HasPermission( 66 ppapi::PERMISSION_PRIVATE)) { 67 switch (message.type()) { 68 case PpapiHostMsg_Broker_Create::ID: { 69 scoped_refptr<ResourceMessageFilter> broker_filter( 70 new PepperBrokerMessageFilter(instance, host_)); 71 return scoped_ptr<ResourceHost>(new MessageFilterHost( 72 host_->GetPpapiHost(), instance, params.pp_resource(), 73 broker_filter)); 74 } 75#if defined(OS_CHROMEOS) 76 case PpapiHostMsg_PlatformVerification_Create::ID: { 77 scoped_refptr<ResourceMessageFilter> pv_filter( 78 new PepperPlatformVerificationMessageFilter(host_, instance)); 79 return scoped_ptr<ResourceHost>(new MessageFilterHost( 80 host_->GetPpapiHost(), instance, params.pp_resource(), pv_filter)); 81 } 82#endif 83 case PpapiHostMsg_Talk_Create::ID: 84 return scoped_ptr<ResourceHost>(new PepperTalkHost( 85 host_, instance, params.pp_resource())); 86 } 87 } 88 89 // Flash interfaces. 90 if (host_->GetPpapiHost()->permissions().HasPermission( 91 ppapi::PERMISSION_FLASH)) { 92 switch (message.type()) { 93 case PpapiHostMsg_Flash_Create::ID: 94 return scoped_ptr<ResourceHost>(new PepperFlashBrowserHost( 95 host_, instance, params.pp_resource())); 96 case PpapiHostMsg_FlashClipboard_Create::ID: { 97 scoped_refptr<ResourceMessageFilter> clipboard_filter( 98 new PepperFlashClipboardMessageFilter); 99 return scoped_ptr<ResourceHost>(new MessageFilterHost( 100 host_->GetPpapiHost(), instance, params.pp_resource(), 101 clipboard_filter)); 102 } 103 case PpapiHostMsg_FlashDRM_Create::ID: 104 return scoped_ptr<ResourceHost>(new PepperFlashDRMHost( 105 host_, instance, params.pp_resource())); 106 } 107 } 108 109 // Permissions for the following interfaces will be checked at the 110 // time of the corresponding instance's methods calls (because 111 // permission check can be performed only on the UI 112 // thread). Currently these interfaces are available only for 113 // whitelisted apps which may not have access to the other private 114 // interfaces. 115 if (message.type() == PpapiHostMsg_Ext_CrxFileSystem_Create::ID) { 116 PepperCrxFileSystemMessageFilter* crxfs_filter = 117 PepperCrxFileSystemMessageFilter::Create(instance, host_); 118 if (!crxfs_filter) 119 return scoped_ptr<ResourceHost>(); 120 return scoped_ptr<ResourceHost>(new MessageFilterHost( 121 host, instance, params.pp_resource(), crxfs_filter)); 122 } 123 124 return scoped_ptr<ResourceHost>(); 125} 126 127} // namespace chrome 128