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