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/browser_ppapi_host_impl.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/browser/tracing/trace_message_filter.h" 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/common/pepper_renderer_instance_data.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/render_view_host.h" 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/common/process_type.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ipc/ipc_message_macros.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content { 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BrowserPpapiHost* BrowserPpapiHost::CreateExternalPluginProcess( 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC::Sender* sender, 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ppapi::PpapiPermissions permissions, 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::ProcessHandle plugin_child_process, 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC::ChannelProxy* channel, 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::HostResolver* host_resolver, 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int render_process_id, 23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int render_view_id, 24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const base::FilePath& profile_directory) { 252385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch scoped_refptr<PepperMessageFilter> pepper_message_filter( 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new PepperMessageFilter(permissions, 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) host_resolver, 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_process_id, 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) render_view_id)); 302385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 312385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch // The plugin name and path shouldn't be needed for external plugins. 322385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch BrowserPpapiHostImpl* browser_ppapi_host = 332385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch new BrowserPpapiHostImpl(sender, permissions, std::string(), 342385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch base::FilePath(), profile_directory, true, 352385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch pepper_message_filter); 362385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch browser_ppapi_host->set_plugin_process_handle(plugin_child_process); 372385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 382385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch channel->AddFilter(pepper_message_filter); 397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) channel->AddFilter(browser_ppapi_host->message_filter().get()); 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) channel->AddFilter(new TraceMessageFilter()); 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return browser_ppapi_host; 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BrowserPpapiHostImpl::BrowserPpapiHostImpl( 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC::Sender* sender, 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const ppapi::PpapiPermissions& permissions, 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& plugin_name, 497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) const base::FilePath& plugin_path, 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& profile_data_directory, 512385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch bool external_plugin, 522385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch const scoped_refptr<PepperMessageFilter>& pepper_message_filter) 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : ppapi_host_(new ppapi::host::PpapiHost(sender, permissions)), 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) plugin_process_handle_(base::kNullProcessHandle), 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) plugin_name_(plugin_name), 567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) plugin_path_(plugin_path), 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) profile_data_directory_(profile_data_directory), 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) external_plugin_(external_plugin) { 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) message_filter_ = new HostMessageFilter(ppapi_host_.get()); 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ppapi_host_->AddHostFactoryFilter(scoped_ptr<ppapi::host::HostFactory>( 612385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch new ContentBrowserPepperHostFactory(this, pepper_message_filter))); 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BrowserPpapiHostImpl::~BrowserPpapiHostImpl() { 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Notify the filter so it won't foward messages to us. 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message_filter_->OnHostDestroyed(); 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Delete the host explicitly first. This shutdown will destroy the 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // resources, which may want to do cleanup in their destructors and expect 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // their pointers to us to be valid. 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ppapi_host_.reset(); 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ppapi::host::PpapiHost* BrowserPpapiHostImpl::GetPpapiHost() { 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return ppapi_host_.get(); 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)base::ProcessHandle BrowserPpapiHostImpl::GetPluginProcessHandle() const { 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Handle should previously have been set before use. 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(plugin_process_handle_ != base::kNullProcessHandle); 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return plugin_process_handle_; 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool BrowserPpapiHostImpl::IsValidInstance(PP_Instance instance) const { 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return instance_map_.find(instance) != instance_map_.end(); 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool BrowserPpapiHostImpl::GetRenderViewIDsForInstance( 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_Instance instance, 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int* render_process_id, 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int* render_view_id) const { 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) InstanceMap::const_iterator found = instance_map_.find(instance); 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (found == instance_map_.end()) { 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *render_process_id = 0; 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *render_view_id = 0; 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *render_process_id = found->second.render_process_id; 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *render_view_id = found->second.render_view_id; 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const std::string& BrowserPpapiHostImpl::GetPluginName() { 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return plugin_name_; 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)const base::FilePath& BrowserPpapiHostImpl::GetPluginPath() { 1097d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return plugin_path_; 1107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 1117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const base::FilePath& BrowserPpapiHostImpl::GetProfileDataDirectory() { 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return profile_data_directory_; 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)GURL BrowserPpapiHostImpl::GetDocumentURLForInstance(PP_Instance instance) { 1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) InstanceMap::const_iterator found = instance_map_.find(instance); 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (found == instance_map_.end()) 1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return GURL(); 1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return found->second.document_url; 1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)GURL BrowserPpapiHostImpl::GetPluginURLForInstance(PP_Instance instance) { 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) InstanceMap::const_iterator found = instance_map_.find(instance); 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (found == instance_map_.end()) 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return GURL(); 1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return found->second.plugin_url; 1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void BrowserPpapiHostImpl::AddInstance( 1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PP_Instance instance, 1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const PepperRendererInstanceData& instance_data) { 1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(instance_map_.find(instance) == instance_map_.end()); 1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) instance_map_[instance] = instance_data; 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void BrowserPpapiHostImpl::DeleteInstance(PP_Instance instance) { 1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) InstanceMap::iterator found = instance_map_.find(instance); 1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (found == instance_map_.end()) { 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) instance_map_.erase(found); 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool BrowserPpapiHostImpl::HostMessageFilter::OnMessageReceived( 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const IPC::Message& msg) { 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Don't forward messages if our owner object has been destroyed. 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!ppapi_host_) 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* TODO(brettw) when we add messages, here, the code should look like this: 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool handled = true; 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_BEGIN_MESSAGE_MAP(BrowserPpapiHostImpl, msg) 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Add necessary message handlers here. 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_MESSAGE_UNHANDLED(handled = ppapi_host_->OnMessageReceived(msg)) 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPC_END_MESSAGE_MAP(); 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return handled; 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ppapi_host_->OnMessageReceived(msg); 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowserPpapiHostImpl::HostMessageFilter::OnHostDestroyed() { 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(ppapi_host_); 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ppapi_host_ = NULL; 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace content 169