chrome_browser_pepper_host_factory.cc revision a1401311d1ab56c4ed0a474bd38c108f75cb0cd9
1bc40e898e153c9b81f246a7971eaac7b14446c49Chris Lattner// Copyright (c) 2012 The Chromium Authors. All rights reserved. 2edf128a7fa90f2b0b7ee24741a04a7ae1ecd6f7eMisha Brukman// Use of this source code is governed by a BSD-style license that can be 3b576c94c15af9a440f69d9d03c2afead7971118cJohn Criswell// found in the LICENSE file. 4b576c94c15af9a440f69d9d03c2afead7971118cJohn Criswell 54ee451de366474b9c228b4e5fa573795a715216dChris Lattner#include "chrome/browser/renderer_host/pepper/chrome_browser_pepper_host_factory.h" 64ee451de366474b9c228b4e5fa573795a715216dChris Lattner 7edf128a7fa90f2b0b7ee24741a04a7ae1ecd6f7eMisha Brukman#include "build/build_config.h" 8b576c94c15af9a440f69d9d03c2afead7971118cJohn Criswell#include "chrome/browser/renderer_host/pepper/pepper_broker_message_filter.h" 9bc40e898e153c9b81f246a7971eaac7b14446c49Chris Lattner#include "chrome/browser/renderer_host/pepper/pepper_extensions_common_message_filter.h" 10bc40e898e153c9b81f246a7971eaac7b14446c49Chris Lattner#include "chrome/browser/renderer_host/pepper/pepper_flash_browser_host.h" 11bc40e898e153c9b81f246a7971eaac7b14446c49Chris Lattner#include "chrome/browser/renderer_host/pepper/pepper_flash_clipboard_message_filter.h" 12bc40e898e153c9b81f246a7971eaac7b14446c49Chris Lattner#include "chrome/browser/renderer_host/pepper/pepper_flash_drm_host.h" 13bc40e898e153c9b81f246a7971eaac7b14446c49Chris Lattner#include "chrome/browser/renderer_host/pepper/pepper_isolated_file_system_message_filter.h" 14bc40e898e153c9b81f246a7971eaac7b14446c49Chris Lattner#include "chrome/browser/renderer_host/pepper/pepper_output_protection_message_filter.h" 15bc40e898e153c9b81f246a7971eaac7b14446c49Chris Lattner#include "chrome/browser/renderer_host/pepper/pepper_platform_verification_message_filter.h" 16d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "chrome/browser/renderer_host/pepper/pepper_talk_host.h" 17a474685d069a900ab931ee1540c9a79fdd6607a9Cameron Zwarich#include "content/public/browser/browser_ppapi_host.h" 18d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "ppapi/host/message_filter_host.h" 19d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "ppapi/host/ppapi_host.h" 20d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "ppapi/host/resource_host.h" 21b7cfac32f32f17e64a5addfdb833702160650f14Cameron Zwarich#include "ppapi/proxy/ppapi_messages.h" 22d7a10c8566c1f2e979f8f3abcaab441297a0c44cMisha Brukman#include "ppapi/shared_impl/ppapi_permissions.h" 239aebb61daf4d787aa7dcff9e3caa89bac88e11d1Jakob Stoklund Olesen 24bc40e898e153c9b81f246a7971eaac7b14446c49Chris Lattnerusing ppapi::host::MessageFilterHost; 25f870fbc554ac862ad6d45cf97148739802a3ed12Evan Chengusing ppapi::host::ResourceHost; 2697b9b97853d7e4fbb5c8460ef28126013c76e9a9Evan Chengusing ppapi::host::ResourceMessageFilter; 2784bc5427d6883f73cfeae3da640acd011d35c006Chris Lattner 280b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruthnamespace chrome { 296a951ac63fd6a9aa769c6d98b544b886e5b5d307Cameron Zwarich 30a4f0b3a084d120cfc5b5bb06f64b222f5cb72740Chris LattnerChromeBrowserPepperHostFactory::ChromeBrowserPepperHostFactory( 31f235f13931835b3335f3f2ff2d3060381b93626cJakob Stoklund Olesen content::BrowserPpapiHost* host) 32d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth : host_(host) { 33d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth} 346db0756f021a7b9c84d3bb7ae50498feb080a013Chris Lattner 350742b59913a7760eb26f08121cd244a37e83e3b3Chris LattnerChromeBrowserPepperHostFactory::~ChromeBrowserPepperHostFactory() { 36d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke} 37dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 38dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesscoped_ptr<ResourceHost> ChromeBrowserPepperHostFactory::CreateResourceHost( 396a951ac63fd6a9aa769c6d98b544b886e5b5d307Cameron Zwarich ppapi::host::PpapiHost* host, 406a951ac63fd6a9aa769c6d98b544b886e5b5d307Cameron Zwarich const ppapi::proxy::ResourceMessageCallParams& params, 416a951ac63fd6a9aa769c6d98b544b886e5b5d307Cameron Zwarich PP_Instance instance, 426a951ac63fd6a9aa769c6d98b544b886e5b5d307Cameron Zwarich const IPC::Message& message) { 436a951ac63fd6a9aa769c6d98b544b886e5b5d307Cameron Zwarich DCHECK(host == host_->GetPpapiHost()); 445758a711f4e593d1daff3bae0fa9d694e5980719Cameron Zwarich 455758a711f4e593d1daff3bae0fa9d694e5980719Cameron Zwarich // Make sure the plugin is giving us a valid instance for this resource. 465758a711f4e593d1daff3bae0fa9d694e5980719Cameron Zwarich if (!host_->IsValidInstance(instance)) 475758a711f4e593d1daff3bae0fa9d694e5980719Cameron Zwarich return scoped_ptr<ResourceHost>(); 485758a711f4e593d1daff3bae0fa9d694e5980719Cameron Zwarich 490a3fdd6e11cd351737b4451c05ec5d794e6855cfCameron Zwarich // Dev interfaces. 500a3fdd6e11cd351737b4451c05ec5d794e6855cfCameron Zwarich if (host_->GetPpapiHost()->permissions().HasPermission( 510a3fdd6e11cd351737b4451c05ec5d794e6855cfCameron Zwarich ppapi::PERMISSION_DEV)) { 52fe0fd35d5339467fedd59f0cf5bdadb163a8d766Cameron Zwarich switch (message.type()) { 53b7cfac32f32f17e64a5addfdb833702160650f14Cameron Zwarich case PpapiHostMsg_ExtensionsCommon_Create::ID: { 540a3fdd6e11cd351737b4451c05ec5d794e6855cfCameron Zwarich scoped_refptr<ResourceMessageFilter> extensions_common_filter( 550a3fdd6e11cd351737b4451c05ec5d794e6855cfCameron Zwarich PepperExtensionsCommonMessageFilter::Create(host_, instance)); 560a3fdd6e11cd351737b4451c05ec5d794e6855cfCameron Zwarich if (!extensions_common_filter.get()) 570a3fdd6e11cd351737b4451c05ec5d794e6855cfCameron Zwarich return scoped_ptr<ResourceHost>(); 580a3fdd6e11cd351737b4451c05ec5d794e6855cfCameron Zwarich return scoped_ptr<ResourceHost>(new MessageFilterHost( 590a3fdd6e11cd351737b4451c05ec5d794e6855cfCameron Zwarich host_->GetPpapiHost(), instance, params.pp_resource(), 600a3fdd6e11cd351737b4451c05ec5d794e6855cfCameron Zwarich extensions_common_filter)); 6136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 6236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 630a3fdd6e11cd351737b4451c05ec5d794e6855cfCameron Zwarich } 640a3fdd6e11cd351737b4451c05ec5d794e6855cfCameron Zwarich 650a3fdd6e11cd351737b4451c05ec5d794e6855cfCameron Zwarich // Private interfaces. 660a3fdd6e11cd351737b4451c05ec5d794e6855cfCameron Zwarich if (host_->GetPpapiHost()->permissions().HasPermission( 670a3fdd6e11cd351737b4451c05ec5d794e6855cfCameron Zwarich ppapi::PERMISSION_PRIVATE)) { 680a3fdd6e11cd351737b4451c05ec5d794e6855cfCameron Zwarich switch (message.type()) { 6902513c05c6333e2f7418b1327eded162b2791828Cameron Zwarich case PpapiHostMsg_Broker_Create::ID: { 7003fae50cfa5631349fbd47f4c232fc78f5b3b8afCameron Zwarich scoped_refptr<ResourceMessageFilter> broker_filter( 710a3fdd6e11cd351737b4451c05ec5d794e6855cfCameron Zwarich new PepperBrokerMessageFilter(instance, host_)); 720a3fdd6e11cd351737b4451c05ec5d794e6855cfCameron Zwarich return scoped_ptr<ResourceHost>(new MessageFilterHost( 730a3fdd6e11cd351737b4451c05ec5d794e6855cfCameron Zwarich host_->GetPpapiHost(), instance, params.pp_resource(), 740a3fdd6e11cd351737b4451c05ec5d794e6855cfCameron Zwarich broker_filter)); 750a3fdd6e11cd351737b4451c05ec5d794e6855cfCameron Zwarich } 760a3fdd6e11cd351737b4451c05ec5d794e6855cfCameron Zwarich#if defined(OS_CHROMEOS) 770a3fdd6e11cd351737b4451c05ec5d794e6855cfCameron Zwarich case PpapiHostMsg_PlatformVerification_Create::ID: { 780a3fdd6e11cd351737b4451c05ec5d794e6855cfCameron Zwarich scoped_refptr<ResourceMessageFilter> pv_filter( 790a3fdd6e11cd351737b4451c05ec5d794e6855cfCameron Zwarich new PepperPlatformVerificationMessageFilter(host_, instance)); 800a3fdd6e11cd351737b4451c05ec5d794e6855cfCameron Zwarich return scoped_ptr<ResourceHost>(new MessageFilterHost( 810a3fdd6e11cd351737b4451c05ec5d794e6855cfCameron Zwarich host_->GetPpapiHost(), instance, params.pp_resource(), pv_filter)); 82fe0fd35d5339467fedd59f0cf5bdadb163a8d766Cameron Zwarich } 830a3fdd6e11cd351737b4451c05ec5d794e6855cfCameron Zwarich#endif 8436f54480f83d47404aceea5d41f8f6b95da2d00bCameron Zwarich case PpapiHostMsg_Talk_Create::ID: 8536f54480f83d47404aceea5d41f8f6b95da2d00bCameron Zwarich return scoped_ptr<ResourceHost>(new PepperTalkHost( 8636f54480f83d47404aceea5d41f8f6b95da2d00bCameron Zwarich host_, instance, params.pp_resource())); 8736f54480f83d47404aceea5d41f8f6b95da2d00bCameron Zwarich#if defined(OS_CHROMEOS) 8836f54480f83d47404aceea5d41f8f6b95da2d00bCameron Zwarich case PpapiHostMsg_OutputProtection_Create::ID: { 890a3fdd6e11cd351737b4451c05ec5d794e6855cfCameron Zwarich scoped_refptr<ResourceMessageFilter> output_protection_filter( 900a3fdd6e11cd351737b4451c05ec5d794e6855cfCameron Zwarich new PepperOutputProtectionMessageFilter(host_, instance)); 910a3fdd6e11cd351737b4451c05ec5d794e6855cfCameron Zwarich return scoped_ptr<ResourceHost>(new MessageFilterHost( 920a3fdd6e11cd351737b4451c05ec5d794e6855cfCameron Zwarich host_->GetPpapiHost(), instance, params.pp_resource(), 930a3fdd6e11cd351737b4451c05ec5d794e6855cfCameron Zwarich output_protection_filter)); 940a3fdd6e11cd351737b4451c05ec5d794e6855cfCameron Zwarich } 950a3fdd6e11cd351737b4451c05ec5d794e6855cfCameron Zwarich#endif 960a3fdd6e11cd351737b4451c05ec5d794e6855cfCameron Zwarich } 970a3fdd6e11cd351737b4451c05ec5d794e6855cfCameron Zwarich } 980a3fdd6e11cd351737b4451c05ec5d794e6855cfCameron Zwarich 990a3fdd6e11cd351737b4451c05ec5d794e6855cfCameron Zwarich // Flash interfaces. 1000a3fdd6e11cd351737b4451c05ec5d794e6855cfCameron Zwarich if (host_->GetPpapiHost()->permissions().HasPermission( 1010a3fdd6e11cd351737b4451c05ec5d794e6855cfCameron Zwarich ppapi::PERMISSION_FLASH)) { 1020a3fdd6e11cd351737b4451c05ec5d794e6855cfCameron Zwarich switch (message.type()) { 1030a3fdd6e11cd351737b4451c05ec5d794e6855cfCameron Zwarich case PpapiHostMsg_Flash_Create::ID: 10402513c05c6333e2f7418b1327eded162b2791828Cameron Zwarich return scoped_ptr<ResourceHost>(new PepperFlashBrowserHost( 105117be03cc6cfb91d385938ed94a3cf877bd8c12aCameron Zwarich host_, instance, params.pp_resource())); 10674215fc29fa748e006c0309671555d5873bac56aJakob Stoklund Olesen case PpapiHostMsg_FlashClipboard_Create::ID: { 107f235f13931835b3335f3f2ff2d3060381b93626cJakob Stoklund Olesen scoped_refptr<ResourceMessageFilter> clipboard_filter( 108fae02a2ab19abdf12854356e19aeb1da62a0b8eaLang Hames new PepperFlashClipboardMessageFilter); 1090a3fdd6e11cd351737b4451c05ec5d794e6855cfCameron Zwarich return scoped_ptr<ResourceHost>(new MessageFilterHost( 110bc40e898e153c9b81f246a7971eaac7b14446c49Chris Lattner host_->GetPpapiHost(), instance, params.pp_resource(), 1118dd26253f54247e77e5accfdd70e7b4bf27b39c2Andrew Trick clipboard_filter)); 1128dd26253f54247e77e5accfdd70e7b4bf27b39c2Andrew Trick } 1138dd26253f54247e77e5accfdd70e7b4bf27b39c2Andrew Trick case PpapiHostMsg_FlashDRM_Create::ID: 1148dd26253f54247e77e5accfdd70e7b4bf27b39c2Andrew Trick return scoped_ptr<ResourceHost>(new PepperFlashDRMHost( 1158dd26253f54247e77e5accfdd70e7b4bf27b39c2Andrew Trick host_, instance, params.pp_resource())); 1168dd26253f54247e77e5accfdd70e7b4bf27b39c2Andrew Trick } 1178dd26253f54247e77e5accfdd70e7b4bf27b39c2Andrew Trick } 1180a3fdd6e11cd351737b4451c05ec5d794e6855cfCameron Zwarich 119845012e6d31799c7fbd1193fa1af8ee2d12e9231Dan Gohman // Permissions for the following interfaces will be checked at the 1204f659eccafe34efea2a4ba6e57ad09977e9157c2Cameron Zwarich // time of the corresponding instance's methods calls (because 121b7cfac32f32f17e64a5addfdb833702160650f14Cameron Zwarich // permission check can be performed only on the UI 1229aebb61daf4d787aa7dcff9e3caa89bac88e11d1Jakob Stoklund Olesen // thread). Currently these interfaces are available only for 123148341cc9b60d7d88be9c07a2b32b436e0cd301dEvan Cheng // whitelisted apps which may not have access to the other private 124845012e6d31799c7fbd1193fa1af8ee2d12e9231Dan Gohman // interfaces. 125845012e6d31799c7fbd1193fa1af8ee2d12e9231Dan Gohman if (message.type() == PpapiHostMsg_IsolatedFileSystem_Create::ID) { 126fae02a2ab19abdf12854356e19aeb1da62a0b8eaLang Hames PepperIsolatedFileSystemMessageFilter* isolated_fs_filter = 1270a3fdd6e11cd351737b4451c05ec5d794e6855cfCameron Zwarich PepperIsolatedFileSystemMessageFilter::Create(instance, host_); 12828428cd6f31c1ea3cf4cea03e64189a4c32b84a3Evan Cheng if (!isolated_fs_filter) 129fe0fd35d5339467fedd59f0cf5bdadb163a8d766Cameron Zwarich return scoped_ptr<ResourceHost>(); 130b7cfac32f32f17e64a5addfdb833702160650f14Cameron Zwarich return scoped_ptr<ResourceHost>(new MessageFilterHost( 131576a27043d95d0b9b8a010bccfd38ed9c0afa739Evan Cheng host, instance, params.pp_resource(), isolated_fs_filter)); 132576a27043d95d0b9b8a010bccfd38ed9c0afa739Evan Cheng } 133576a27043d95d0b9b8a010bccfd38ed9c0afa739Evan Cheng 13473e7dced3892f2abb4344526147d4df0f62aee61Jakob Stoklund Olesen return scoped_ptr<ResourceHost>(); 13573e7dced3892f2abb4344526147d4df0f62aee61Jakob Stoklund Olesen} 13673e7dced3892f2abb4344526147d4df0f62aee61Jakob Stoklund Olesen 137b7cfac32f32f17e64a5addfdb833702160650f14Cameron Zwarich} // namespace chrome 138b7cfac32f32f17e64a5addfdb833702160650f14Cameron Zwarich