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 "content/renderer/pepper/content_renderer_pepper_host_factory.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h"
8868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_util.h"
9eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "content/public/common/content_client.h"
10eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "content/public/renderer/content_renderer_client.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/renderer/pepper/pepper_audio_input_host.h"
12f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "content/renderer/pepper/pepper_compositor_host.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/renderer/pepper/pepper_file_chooser_host.h"
14d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "content/renderer/pepper/pepper_file_ref_renderer_host.h"
15c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/renderer/pepper/pepper_file_system_host.h"
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/renderer/pepper/pepper_graphics_2d_host.h"
17010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "content/renderer/pepper/pepper_media_stream_video_track_host.h"
185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/renderer/pepper/pepper_plugin_instance_impl.h"
1990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "content/renderer/pepper/pepper_url_loader_host.h"
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/renderer/pepper/pepper_video_capture_host.h"
2146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "content/renderer/pepper/pepper_video_decoder_host.h"
22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/renderer/pepper/pepper_video_destination_host.h"
23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/renderer/pepper/pepper_video_source_host.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/renderer/pepper/pepper_websocket_host.h"
25f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "content/renderer/pepper/ppb_image_data_impl.h"
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/renderer/pepper/renderer_ppapi_host_impl.h"
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/host/resource_host.h"
28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ppapi/proxy/ppapi_message_utils.h"
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/proxy/ppapi_messages.h"
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/proxy/serialized_structs.h"
31f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "ppapi/shared_impl/ppb_image_data_shared.h"
32eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "third_party/WebKit/public/platform/WebURL.h"
33eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "third_party/WebKit/public/web/WebDocument.h"
34eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "third_party/WebKit/public/web/WebElement.h"
35eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "third_party/WebKit/public/web/WebPluginContainer.h"
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ppapi::host::ResourceHost;
38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)using ppapi::UnpackMessage;
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4058e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochnamespace content {
41f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
42eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochnamespace {
43eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
44116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#if defined(ENABLE_WEBRTC)
45a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochbool CanUseMediaStreamAPI(const RendererPpapiHost* host, PP_Instance instance) {
46f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  blink::WebPluginContainer* container =
47eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      host->GetContainerForInstance(instance);
48eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (!container)
49eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    return false;
50eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
51eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  GURL document_url = container->element().document().url();
5258e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch  ContentRendererClient* content_renderer_client =
5358e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch      GetContentClient()->renderer();
54eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  return content_renderer_client->AllowPepperMediaStreamAPI(document_url);
55eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
56116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif  // defined(ENABLE_WEBRTC)
57116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
58116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbool CanUseCompositorAPI(const RendererPpapiHost* host, PP_Instance instance) {
59116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  blink::WebPluginContainer* container =
60116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      host->GetContainerForInstance(instance);
61116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (!container)
62116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return false;
63116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
64116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  GURL document_url = container->element().document().url();
65116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ContentRendererClient* content_renderer_client =
66116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      GetContentClient()->renderer();
67116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return content_renderer_client->IsPluginAllowedToUseCompositorAPI(
68116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      document_url);
69116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
70116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
71116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbool CanUseVideoDecodeAPI(const RendererPpapiHost* host, PP_Instance instance) {
72116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  blink::WebPluginContainer* container =
73116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      host->GetContainerForInstance(instance);
74116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (!container)
75116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return false;
76116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
77116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  GURL document_url = container->element().document().url();
78116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ContentRendererClient* content_renderer_client =
79116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      GetContentClient()->renderer();
80116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return content_renderer_client->IsPluginAllowedToUseVideoDecodeAPI(
81116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      document_url);
82116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
83eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
84f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}  // namespace
85eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ContentRendererPepperHostFactory::ContentRendererPepperHostFactory(
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RendererPpapiHostImpl* host)
88a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    : host_(host) {}
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
90a02191e04bc25c4935f804f2c080ae28663d096dBen MurdochContentRendererPepperHostFactory::~ContentRendererPepperHostFactory() {}
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)scoped_ptr<ResourceHost> ContentRendererPepperHostFactory::CreateResourceHost(
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ppapi::host::PpapiHost* host,
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ppapi::proxy::ResourceMessageCallParams& params,
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PP_Instance instance,
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const IPC::Message& message) {
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(host == host_->GetPpapiHost());
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make sure the plugin is giving us a valid instance for this resource.
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!host_->IsValidInstance(instance))
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return scoped_ptr<ResourceHost>();
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  PepperPluginInstanceImpl* instance_impl =
1045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      host_->GetPluginInstanceImpl(instance);
1055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (!instance_impl->render_frame())
1065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return scoped_ptr<ResourceHost>();
1075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Public interfaces.
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (message.type()) {
110f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    case PpapiHostMsg_Compositor_Create::ID: {
111116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      if (!CanUseCompositorAPI(host_, instance))
112116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        return scoped_ptr<ResourceHost>();
113116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      return scoped_ptr<ResourceHost>(
114116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          new PepperCompositorHost(host_, instance, params.pp_resource()));
115116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    }
116a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    case PpapiHostMsg_FileRef_CreateForFileAPI::ID: {
117d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      PP_Resource file_system;
118d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      std::string internal_path;
119a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      if (!UnpackMessage<PpapiHostMsg_FileRef_CreateForFileAPI>(
120a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch              message, &file_system, &internal_path)) {
121d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        NOTREACHED();
122d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        return scoped_ptr<ResourceHost>();
123d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      }
124d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      return scoped_ptr<ResourceHost>(new PepperFileRefRendererHost(
125d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)          host_, instance, params.pp_resource(), file_system, internal_path));
126d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    }
127c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    case PpapiHostMsg_FileSystem_Create::ID: {
128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      PP_FileSystemType file_system_type;
129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      if (!UnpackMessage<PpapiHostMsg_FileSystem_Create>(message,
130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                                         &file_system_type)) {
131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        NOTREACHED();
132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        return scoped_ptr<ResourceHost>();
133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      }
134c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      return scoped_ptr<ResourceHost>(new PepperFileSystemHost(
135c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          host_, instance, params.pp_resource(), file_system_type));
136c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case PpapiHostMsg_Graphics2D_Create::ID: {
138c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      PP_Size size;
139c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      PP_Bool is_always_opaque;
140a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      if (!UnpackMessage<PpapiHostMsg_Graphics2D_Create>(
141a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch              message, &size, &is_always_opaque)) {
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        NOTREACHED();
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        return scoped_ptr<ResourceHost>();
1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      }
145f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      scoped_refptr<PPB_ImageData_Impl> image_data(new PPB_ImageData_Impl(
146f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)          instance, ppapi::PPB_ImageData_Shared::PLATFORM));
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return scoped_ptr<ResourceHost>(
148a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch          PepperGraphics2DHost::Create(host_,
149a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                                       instance,
150a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                                       params.pp_resource(),
151a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                                       size,
152a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                                       is_always_opaque,
153a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                                       image_data));
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
15590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    case PpapiHostMsg_URLLoader_Create::ID:
15690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      return scoped_ptr<ResourceHost>(new PepperURLLoaderHost(
15790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)          host_, false, instance, params.pp_resource()));
158116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    case PpapiHostMsg_VideoDecoder_Create::ID: {
159116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      if (!CanUseVideoDecodeAPI(host_, instance))
160116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        return scoped_ptr<ResourceHost>();
16146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      return scoped_ptr<ResourceHost>(
16246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)          new PepperVideoDecoderHost(host_, instance, params.pp_resource()));
163116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    }
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case PpapiHostMsg_WebSocket_Create::ID:
165a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      return scoped_ptr<ResourceHost>(
166a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch          new PepperWebSocketHost(host_, instance, params.pp_resource()));
167eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#if defined(ENABLE_WEBRTC)
168010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    case PpapiHostMsg_MediaStreamVideoTrack_Create::ID:
169010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      return scoped_ptr<ResourceHost>(new PepperMediaStreamVideoTrackHost(
170010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          host_, instance, params.pp_resource()));
171eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    // These private MediaStream interfaces are exposed as if they were public
172eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    // so they can be used by NaCl plugins. However, they are available only
173eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    // for whitelisted apps.
174eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    case PpapiHostMsg_VideoDestination_Create::ID:
175eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      if (CanUseMediaStreamAPI(host_, instance))
176eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        return scoped_ptr<ResourceHost>(new PepperVideoDestinationHost(
177eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch            host_, instance, params.pp_resource()));
178eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    case PpapiHostMsg_VideoSource_Create::ID:
179eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      if (CanUseMediaStreamAPI(host_, instance))
180a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch        return scoped_ptr<ResourceHost>(
181a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch            new PepperVideoSourceHost(host_, instance, params.pp_resource()));
182eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#endif  // defined(ENABLE_WEBRTC)
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Dev interfaces.
1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (GetPermissions().HasPermission(ppapi::PERMISSION_DEV)) {
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    switch (message.type()) {
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case PpapiHostMsg_AudioInput_Create::ID:
189a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch        return scoped_ptr<ResourceHost>(
190a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch            new PepperAudioInputHost(host_, instance, params.pp_resource()));
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case PpapiHostMsg_FileChooser_Create::ID:
192a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch        return scoped_ptr<ResourceHost>(
193a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch            new PepperFileChooserHost(host_, instance, params.pp_resource()));
1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case PpapiHostMsg_VideoCapture_Create::ID: {
195a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch        PepperVideoCaptureHost* host =
196a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch            new PepperVideoCaptureHost(host_, instance, params.pp_resource());
1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        if (!host->Init()) {
1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          delete host;
1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          return scoped_ptr<ResourceHost>();
2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        }
2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        return scoped_ptr<ResourceHost>(host);
2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      }
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return scoped_ptr<ResourceHost>();
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const ppapi::PpapiPermissions&
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ContentRendererPepperHostFactory::GetPermissions() const {
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return host_->GetPpapiHost()->permissions();
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace content
215