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