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