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/browser/renderer_host/pepper/content_browser_pepper_host_factory.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/renderer_host/pepper/browser_ppapi_host_impl.h"
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/browser/renderer_host/pepper/pepper_browser_font_singleton_host.h"
90f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "content/browser/renderer_host/pepper/pepper_file_io_host.h"
107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "content/browser/renderer_host/pepper/pepper_file_ref_host.h"
117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "content/browser/renderer_host/pepper/pepper_file_system_browser_host.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/browser/renderer_host/pepper/pepper_flash_file_message_filter.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/renderer_host/pepper/pepper_gamepad_host.h"
14eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "content/browser/renderer_host/pepper/pepper_host_resolver_message_filter.h"
15d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "content/browser/renderer_host/pepper/pepper_network_monitor_host.h"
16eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "content/browser/renderer_host/pepper/pepper_network_proxy_host.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/renderer_host/pepper/pepper_print_settings_manager.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/renderer_host/pepper/pepper_printing_host.h"
192385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch#include "content/browser/renderer_host/pepper/pepper_tcp_server_socket_message_filter.h"
20424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "content/browser/renderer_host/pepper/pepper_tcp_socket_message_filter.h"
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/browser/renderer_host/pepper/pepper_truetype_font_list_host.h"
22eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "content/browser/renderer_host/pepper/pepper_udp_socket_message_filter.h"
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/host/message_filter_host.h"
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/host/ppapi_host.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/host/resource_host.h"
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/proxy/ppapi_messages.h"
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ppapi/shared_impl/ppapi_permissions.h"
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using ppapi::host::MessageFilterHost;
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ppapi::host::ResourceHost;
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using ppapi::host::ResourceMessageFilter;
327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)using ppapi::UnpackMessage;
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content {
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
362385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdochnamespace {
372385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
382385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdochconst size_t kMaxSocketsAllowed = 1024;
392385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
402385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdochbool CanCreateSocket() {
41a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  return PepperTCPServerSocketMessageFilter::GetNumInstances() +
42a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch             PepperTCPSocketMessageFilter::GetNumInstances() +
43a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch             PepperUDPSocketMessageFilter::GetNumInstances() <
44a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch         kMaxSocketsAllowed;
452385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch}
462385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
472385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch}  // namespace
482385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ContentBrowserPepperHostFactory::ContentBrowserPepperHostFactory(
50424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    BrowserPpapiHostImpl* host)
51a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    : host_(host) {}
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
53a02191e04bc25c4935f804f2c080ae28663d096dBen MurdochContentBrowserPepperHostFactory::~ContentBrowserPepperHostFactory() {}
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)scoped_ptr<ResourceHost> ContentBrowserPepperHostFactory::CreateResourceHost(
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ppapi::host::PpapiHost* host,
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ppapi::proxy::ResourceMessageCallParams& params,
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PP_Instance instance,
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const IPC::Message& message) {
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(host == host_->GetPpapiHost());
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make sure the plugin is giving us a valid instance for this resource.
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!host_->IsValidInstance(instance))
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return scoped_ptr<ResourceHost>();
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Public interfaces.
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (message.type()) {
680f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    case PpapiHostMsg_FileIO_Create::ID: {
69a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      return scoped_ptr<ResourceHost>(
70a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch          new PepperFileIOHost(host_, instance, params.pp_resource()));
710f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    }
727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    case PpapiHostMsg_FileSystem_Create::ID: {
737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      PP_FileSystemType file_system_type;
74a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      if (!ppapi::UnpackMessage<PpapiHostMsg_FileSystem_Create>(
75a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch              message, &file_system_type)) {
767d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        NOTREACHED();
777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        return scoped_ptr<ResourceHost>();
787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      }
797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      return scoped_ptr<ResourceHost>(new PepperFileSystemBrowserHost(
807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)          host_, instance, params.pp_resource(), file_system_type));
817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    }
82eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    case PpapiHostMsg_Gamepad_Create::ID: {
83a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      return scoped_ptr<ResourceHost>(
84a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch          new PepperGamepadHost(host_, instance, params.pp_resource()));
85eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    }
86eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    case PpapiHostMsg_NetworkProxy_Create::ID: {
87a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      return scoped_ptr<ResourceHost>(
88a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch          new PepperNetworkProxyHost(host_, instance, params.pp_resource()));
89eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    }
90eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    case PpapiHostMsg_HostResolver_Create::ID: {
91eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      scoped_refptr<ResourceMessageFilter> host_resolver(
92eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch          new PepperHostResolverMessageFilter(host_, instance, false));
93a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      return scoped_ptr<ResourceHost>(
94a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch          new MessageFilterHost(host_->GetPpapiHost(),
95a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                                instance,
96a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                                params.pp_resource(),
97a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                                host_resolver));
98eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    }
99a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    case PpapiHostMsg_FileRef_CreateForFileAPI::ID: {
1007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      PP_Resource file_system;
1017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      std::string internal_path;
102a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      if (!UnpackMessage<PpapiHostMsg_FileRef_CreateForFileAPI>(
103a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch              message, &file_system, &internal_path)) {
1047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        NOTREACHED();
1057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        return scoped_ptr<ResourceHost>();
1067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      }
1077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      return scoped_ptr<ResourceHost>(new PepperFileRefHost(
1087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)          host_, instance, params.pp_resource(), file_system, internal_path));
1097d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    }
110424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    case PpapiHostMsg_TCPSocket_Create::ID: {
11168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      ppapi::TCPSocketVersion version;
11268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      if (!UnpackMessage<PpapiHostMsg_TCPSocket_Create>(message, &version) ||
11368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)          version == ppapi::TCP_SOCKET_VERSION_PRIVATE) {
114424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        return scoped_ptr<ResourceHost>();
115424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      }
11668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
11768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      return CreateNewTCPSocket(instance, params.pp_resource(), version);
118424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    }
119eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    case PpapiHostMsg_UDPSocket_Create::ID: {
1202385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch      if (CanCreateSocket()) {
1212385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch        scoped_refptr<ResourceMessageFilter> udp_socket(
1222385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch            new PepperUDPSocketMessageFilter(host_, instance, false));
1232385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch        return scoped_ptr<ResourceHost>(new MessageFilterHost(
1242385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch            host_->GetPpapiHost(), instance, params.pp_resource(), udp_socket));
1252385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch      } else {
1262385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch        return scoped_ptr<ResourceHost>();
1272385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch      }
128eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    }
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Dev interfaces.
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (GetPermissions().HasPermission(ppapi::PERMISSION_DEV)) {
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    switch (message.type()) {
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case PpapiHostMsg_Printing_Create::ID: {
135eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        scoped_ptr<PepperPrintSettingsManager> manager(
136eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch            new PepperPrintSettingsManagerImpl());
137a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch        return scoped_ptr<ResourceHost>(
138a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch            new PepperPrintingHost(host_->GetPpapiHost(),
139a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                                   instance,
140a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                                   params.pp_resource(),
141a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                                   manager.Pass()));
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      }
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case PpapiHostMsg_TrueTypeFontSingleton_Create::ID: {
1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        return scoped_ptr<ResourceHost>(new PepperTrueTypeFontListHost(
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            host_, instance, params.pp_resource()));
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      }
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Private interfaces.
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (GetPermissions().HasPermission(ppapi::PERMISSION_PRIVATE)) {
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    switch (message.type()) {
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case PpapiHostMsg_BrowserFontSingleton_Create::ID:
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        return scoped_ptr<ResourceHost>(new PepperBrowserFontSingletonHost(
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            host_, instance, params.pp_resource()));
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Permissions for the following interfaces will be checked at the
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // time of the corresponding instance's methods calls (because
1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // permission check can be performed only on the UI
162868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // thread). Currently these interfaces are available only for
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // whitelisted apps which may not have access to the other private
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // interfaces.
165eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (message.type() == PpapiHostMsg_HostResolver_CreatePrivate::ID) {
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_refptr<ResourceMessageFilter> host_resolver(
167eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        new PepperHostResolverMessageFilter(host_, instance, true));
1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return scoped_ptr<ResourceHost>(new MessageFilterHost(
1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        host_->GetPpapiHost(), instance, params.pp_resource(), host_resolver));
1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1712385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  if (message.type() == PpapiHostMsg_TCPServerSocket_CreatePrivate::ID) {
1722385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch    if (CanCreateSocket()) {
1732385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch      scoped_refptr<ResourceMessageFilter> tcp_server_socket(
174424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)          new PepperTCPServerSocketMessageFilter(this, host_, instance, true));
175a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      return scoped_ptr<ResourceHost>(
176a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch          new MessageFilterHost(host_->GetPpapiHost(),
177a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                                instance,
178a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                                params.pp_resource(),
179a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                                tcp_server_socket));
1802385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch    } else {
1812385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch      return scoped_ptr<ResourceHost>();
1822385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch    }
1832385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  }
184424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  if (message.type() == PpapiHostMsg_TCPSocket_CreatePrivate::ID) {
185a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    return CreateNewTCPSocket(
186a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch        instance, params.pp_resource(), ppapi::TCP_SOCKET_VERSION_PRIVATE);
187424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  }
188eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (message.type() == PpapiHostMsg_UDPSocket_CreatePrivate::ID) {
1892385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch    if (CanCreateSocket()) {
1902385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch      scoped_refptr<ResourceMessageFilter> udp_socket(
1912385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch          new PepperUDPSocketMessageFilter(host_, instance, true));
1922385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch      return scoped_ptr<ResourceHost>(new MessageFilterHost(
1932385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch          host_->GetPpapiHost(), instance, params.pp_resource(), udp_socket));
1942385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch    } else {
1952385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch      return scoped_ptr<ResourceHost>();
1962385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch    }
1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
198d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  if (message.type() == PpapiHostMsg_NetworkMonitor_Create::ID) {
199d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    return scoped_ptr<ResourceHost>(
200d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        new PepperNetworkMonitorHost(host_, instance, params.pp_resource()));
201d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  }
2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Flash interfaces.
2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (GetPermissions().HasPermission(ppapi::PERMISSION_FLASH)) {
2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    switch (message.type()) {
2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case PpapiHostMsg_FlashFile_Create::ID: {
2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        scoped_refptr<ResourceMessageFilter> file_filter(
2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            new PepperFlashFileMessageFilter(instance, host_));
209a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch        return scoped_ptr<ResourceHost>(
210a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch            new MessageFilterHost(host_->GetPpapiHost(),
211a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                                  instance,
212a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                                  params.pp_resource(),
213a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                                  file_filter));
2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      }
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return scoped_ptr<ResourceHost>();
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
221424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)scoped_ptr<ppapi::host::ResourceHost>
222424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)ContentBrowserPepperHostFactory::CreateAcceptedTCPSocket(
223424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    PP_Instance instance,
22468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    ppapi::TCPSocketVersion version,
22568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    scoped_ptr<net::TCPSocket> socket) {
226424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  if (!CanCreateSocket())
227424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    return scoped_ptr<ResourceHost>();
228424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  scoped_refptr<ResourceMessageFilter> tcp_socket(
229a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      new PepperTCPSocketMessageFilter(
230a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch          host_, instance, version, socket.Pass()));
231a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  return scoped_ptr<ResourceHost>(
232a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      new MessageFilterHost(host_->GetPpapiHost(), instance, 0, tcp_socket));
233424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)}
234424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
23568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)scoped_ptr<ppapi::host::ResourceHost>
23668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)ContentBrowserPepperHostFactory::CreateNewTCPSocket(
23768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    PP_Instance instance,
23868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    PP_Resource resource,
23968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    ppapi::TCPSocketVersion version) {
24068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  if (!CanCreateSocket())
24168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    return scoped_ptr<ResourceHost>();
24268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
24368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  scoped_refptr<ResourceMessageFilter> tcp_socket(
24468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      new PepperTCPSocketMessageFilter(this, host_, instance, version));
24568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  if (!tcp_socket)
24668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    return scoped_ptr<ResourceHost>();
24768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
24868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  return scoped_ptr<ResourceHost>(new MessageFilterHost(
24968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      host_->GetPpapiHost(), instance, resource, tcp_socket));
25068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
25168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
252a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochconst ppapi::PpapiPermissions& ContentBrowserPepperHostFactory::GetPermissions()
253a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    const {
2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return host_->GetPpapiHost()->permissions();
2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace content
258