1868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
2868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// found in the LICENSE file.
4868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
5868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "content/browser/renderer_host/pepper/pepper_renderer_connection.h"
6868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
70f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "base/bind.h"
80f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "base/memory/ref_counted.h"
9868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "content/browser/browser_child_process_host_impl.h"
10868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "content/browser/ppapi_plugin_process_host.h"
11868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "content/browser/renderer_host/pepper/browser_ppapi_host_impl.h"
12a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "content/common/pepper_renderer_instance_data.h"
13a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "content/common/view_messages.h"
147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "content/browser/renderer_host/pepper/pepper_file_ref_host.h"
150f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "content/browser/renderer_host/pepper/pepper_file_system_browser_host.h"
16868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "content/public/browser/content_browser_client.h"
17868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "content/public/common/content_client.h"
18868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "ipc/ipc_message_macros.h"
19868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "ppapi/host/resource_host.h"
20ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "ppapi/proxy/ppapi_message_utils.h"
21868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "ppapi/proxy/ppapi_messages.h"
22868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "ppapi/proxy/resource_message_params.h"
23868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
24868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)namespace content {
25868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
260f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)namespace {
270f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
28a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochconst uint32 kFilteredMessageClasses[] = {PpapiMsgStart, ViewMsgStart, };
295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
300f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)// Responsible for creating the pending resource hosts, holding their IDs until
310f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)// all of them have been created for a single message, and sending the reply to
320f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)// say that the hosts have been created.
33a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochclass PendingHostCreator : public base::RefCounted<PendingHostCreator> {
340f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) public:
350f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  PendingHostCreator(BrowserPpapiHostImpl* host,
360f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                     BrowserMessageFilter* connection,
370f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                     int routing_id,
380f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                     int sequence_id,
390f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                     size_t nested_msgs_size);
400f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
410f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  // Adds the given resource host as a pending one. The host is remembered as
420f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  // host number |index|, and will ultimately be sent to the plugin to be
430f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  // attached to a real resource.
440f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  void AddPendingResourceHost(
450f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      size_t index,
460f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      scoped_ptr<ppapi::host::ResourceHost> resource_host);
470f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
480f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) private:
490f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  friend class base::RefCounted<PendingHostCreator>;
500f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
510f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  // When the last reference to this class is released, all of the resource
520f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  // hosts would have been added. This destructor sends the message to the
530f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  // plugin to tell it to attach real hosts to all of the pending hosts that
540f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  // have been added by this object.
550f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  ~PendingHostCreator();
560f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
570f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  BrowserPpapiHostImpl* host_;
580f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  BrowserMessageFilter* connection_;
590f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  int routing_id_;
600f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  int sequence_id_;
610f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  std::vector<int> pending_resource_host_ids_;
620f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)};
630f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
640f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)PendingHostCreator::PendingHostCreator(BrowserPpapiHostImpl* host,
650f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                                       BrowserMessageFilter* connection,
660f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                                       int routing_id,
670f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                                       int sequence_id,
680f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                                       size_t nested_msgs_size)
690f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    : host_(host),
700f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      connection_(connection),
710f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      routing_id_(routing_id),
720f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      sequence_id_(sequence_id),
730f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      pending_resource_host_ids_(nested_msgs_size, 0) {}
740f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
750f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)void PendingHostCreator::AddPendingResourceHost(
760f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    size_t index,
770f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    scoped_ptr<ppapi::host::ResourceHost> resource_host) {
780f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  pending_resource_host_ids_[index] =
790f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      host_->GetPpapiHost()->AddPendingResourceHost(resource_host.Pass());
800f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)}
810f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
820f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)PendingHostCreator::~PendingHostCreator() {
830f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  connection_->Send(new PpapiHostMsg_CreateResourceHostsFromHostReply(
840f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      routing_id_, sequence_id_, pending_resource_host_ids_));
850f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)}
860f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
870f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)}  // namespace
880f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
89a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)PepperRendererConnection::PepperRendererConnection(int render_process_id)
90a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    : BrowserMessageFilter(kFilteredMessageClasses,
91a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                           arraysize(kFilteredMessageClasses)),
925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      render_process_id_(render_process_id) {
93a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // Only give the renderer permission for stable APIs.
94a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  in_process_host_.reset(new BrowserPpapiHostImpl(this,
95a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                                                  ppapi::PpapiPermissions(),
96a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                                                  "",
97a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                                                  base::FilePath(),
98a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                                                  base::FilePath(),
991e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                                                  true /* in_process */,
1001e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                                                  false /* external_plugin */));
101a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
102a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
103a02191e04bc25c4935f804f2c080ae28663d096dBen MurdochPepperRendererConnection::~PepperRendererConnection() {}
104a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
105a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)BrowserPpapiHostImpl* PepperRendererConnection::GetHostForChildProcess(
106a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    int child_process_id) const {
107effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  DCHECK_CURRENTLY_ON(BrowserThread::IO);
1087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // Find the plugin which this message refers to. Check NaCl plugins first.
1107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  BrowserPpapiHostImpl* host = static_cast<BrowserPpapiHostImpl*>(
1117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      GetContentClient()->browser()->GetExternalBrowserPpapiHost(
1127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch          child_process_id));
1137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if (!host) {
1157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    // Check trusted pepper plugins.
1167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    for (PpapiPluginProcessHostIterator iter; !iter.Done(); ++iter) {
1177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      if (iter->process() &&
1187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch          iter->process()->GetData().id == child_process_id) {
1197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        // Found the plugin.
1207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        host = iter->host_impl();
1217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        break;
1227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      }
1237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    }
1247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
1257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
126a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // If the message is being sent from an in-process plugin, we own the
127a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // BrowserPpapiHost.
128a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  if (!host && child_process_id == 0) {
129a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    host = in_process_host_.get();
130a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
131868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
132a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  return host;
133868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
134868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
135cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)bool PepperRendererConnection::OnMessageReceived(const IPC::Message& msg) {
136a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  if (in_process_host_->GetPpapiHost()->OnMessageReceived(msg))
137a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    return true;
138a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
139868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  bool handled = true;
140cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  IPC_BEGIN_MESSAGE_MAP(PepperRendererConnection, msg)
141cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    IPC_MESSAGE_HANDLER(PpapiHostMsg_CreateResourceHostsFromHost,
142cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                        OnMsgCreateResourceHostsFromHost)
143cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    IPC_MESSAGE_HANDLER(ViewHostMsg_DidCreateInProcessInstance,
144cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                        OnMsgDidCreateInProcessInstance)
145cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    IPC_MESSAGE_HANDLER(ViewHostMsg_DidDeleteInProcessInstance,
146cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                        OnMsgDidDeleteInProcessInstance)
147cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    IPC_MESSAGE_UNHANDLED(handled = false)
148cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  IPC_END_MESSAGE_MAP()
149868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
150868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  return handled;
151868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
152868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1533551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)void PepperRendererConnection::OnMsgCreateResourceHostsFromHost(
1547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    int routing_id,
155868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    int child_process_id,
156868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    const ppapi::proxy::ResourceMessageCallParams& params,
157868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    PP_Instance instance,
1583551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    const std::vector<IPC::Message>& nested_msgs) {
1597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  BrowserPpapiHostImpl* host = GetHostForChildProcess(child_process_id);
160868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (!host) {
161868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    DLOG(ERROR) << "Invalid plugin process ID.";
1620f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    return;
1630f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  }
164ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
1650f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  scoped_refptr<PendingHostCreator> creator = new PendingHostCreator(
1660f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      host, this, routing_id, params.sequence(), nested_msgs.size());
1670f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  for (size_t i = 0; i < nested_msgs.size(); ++i) {
1680f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    const IPC::Message& nested_msg = nested_msgs[i];
1690f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    scoped_ptr<ppapi::host::ResourceHost> resource_host;
1700f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    if (host->IsValidInstance(instance)) {
171a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      if (nested_msg.type() == PpapiHostMsg_FileRef_CreateForRawFS::ID) {
172a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch        // FileRef_CreateForRawFS is only permitted from the renderer. Because
1730f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)        // of this, we handle this message here and not in
1740f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)        // content_browser_pepper_host_factory.cc.
1750f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)        base::FilePath external_path;
176a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch        if (ppapi::UnpackMessage<PpapiHostMsg_FileRef_CreateForRawFS>(
1770f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                nested_msg, &external_path)) {
1780f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)          resource_host.reset(new PepperFileRefHost(
1790f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)              host, instance, params.pp_resource(), external_path));
1800f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)        }
1810f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      } else if (nested_msg.type() ==
1820f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                 PpapiHostMsg_FileSystem_CreateFromRenderer::ID) {
1830f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)        // Similarly, FileSystem_CreateFromRenderer is only permitted from the
1840f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)        // renderer.
1850f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)        std::string root_url;
1860f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)        PP_FileSystemType file_system_type;
1870f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)        if (ppapi::UnpackMessage<PpapiHostMsg_FileSystem_CreateFromRenderer>(
1880f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                nested_msg, &root_url, &file_system_type)) {
1890f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)          PepperFileSystemBrowserHost* browser_host =
190a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch              new PepperFileSystemBrowserHost(
191a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                  host, instance, params.pp_resource(), file_system_type);
1920f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)          resource_host.reset(browser_host);
1930f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)          // Open the file system resource host. This is an asynchronous
1940f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)          // operation, and we must only add the pending resource host and
1950f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)          // send the message once it completes.
1960f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)          browser_host->OpenExisting(
1970f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)              GURL(root_url),
198a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch              base::Bind(&PendingHostCreator::AddPendingResourceHost,
199a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                         creator,
200a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                         i,
201a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                         base::Passed(&resource_host)));
2020f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)          // Do not fall through; the fall-through case adds the pending
2030f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)          // resource host to the list. We must do this asynchronously.
2040f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)          continue;
2050f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)        }
2063551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      }
2070f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    }
2083551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
2090f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    if (!resource_host.get()) {
2100f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      resource_host = host->GetPpapiHost()->CreateResourceHost(
2110f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)          params, instance, nested_msg);
212ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    }
2130f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
2140f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    if (resource_host.get())
2150f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      creator->AddPendingResourceHost(i, resource_host.Pass());
216868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
217868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
2180f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  // Note: All of the pending host IDs that were added as part of this
2190f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  // operation will automatically be sent to the plugin when |creator| is
2200f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  // released. This may happen immediately, or (if there are asynchronous
2210f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  // requests to create resource hosts), once all of them complete.
2227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
2237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
224a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void PepperRendererConnection::OnMsgDidCreateInProcessInstance(
225a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    PP_Instance instance,
226a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    const PepperRendererInstanceData& instance_data) {
227a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  PepperRendererInstanceData data = instance_data;
228a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  data.render_process_id = render_process_id_;
229a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  in_process_host_->AddInstance(instance, data);
230a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
231a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
232a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void PepperRendererConnection::OnMsgDidDeleteInProcessInstance(
233a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    PP_Instance instance) {
234a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  in_process_host_->DeleteInstance(instance);
235868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
236868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
237868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}  // namespace content
238