browser_ppapi_host_impl.cc revision 5821806d5e7f356e8fa4b058a389a808ea183019
1// Copyright (c) 2012 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#include "content/browser/renderer_host/pepper/browser_ppapi_host_impl.h" 6#include "content/browser/renderer_host/pepper/pepper_message_filter.h" 7 8#include "content/public/browser/browser_thread.h" 9#include "content/public/browser/render_view_host.h" 10#include "ipc/ipc_message_macros.h" 11 12namespace content { 13 14// static 15BrowserPpapiHost* BrowserPpapiHost::CreateExternalPluginProcess( 16 IPC::Sender* sender, 17 ppapi::PpapiPermissions permissions, 18 base::ProcessHandle plugin_child_process, 19 IPC::ChannelProxy* channel, 20 net::HostResolver* host_resolver, 21 int render_process_id, 22 int render_view_id) { 23 BrowserPpapiHostImpl* browser_ppapi_host = 24 new BrowserPpapiHostImpl(sender, permissions); 25 browser_ppapi_host->set_plugin_process_handle(plugin_child_process); 26 27 channel->AddFilter( 28 new PepperMessageFilter(PepperMessageFilter::NACL, 29 permissions, 30 host_resolver, 31 render_process_id, 32 render_view_id)); 33 34 return browser_ppapi_host; 35} 36 37BrowserPpapiHostImpl::BrowserPpapiHostImpl( 38 IPC::Sender* sender, 39 const ppapi::PpapiPermissions& permissions) 40 : ppapi_host_(sender, permissions), 41 plugin_process_handle_(base::kNullProcessHandle) { 42 message_filter_ = new HostMessageFilter(&ppapi_host_); 43 ppapi_host_.AddHostFactoryFilter(scoped_ptr<ppapi::host::HostFactory>( 44 new ContentBrowserPepperHostFactory(this))); 45} 46 47BrowserPpapiHostImpl::~BrowserPpapiHostImpl() { 48 // Notify the filter so it won't foward messages to us. 49 message_filter_->OnHostDestroyed(); 50} 51 52ppapi::host::PpapiHost* BrowserPpapiHostImpl::GetPpapiHost() { 53 return &ppapi_host_; 54} 55 56base::ProcessHandle BrowserPpapiHostImpl::GetPluginProcessHandle() const { 57 // Handle should previously have been set before use. 58 DCHECK(plugin_process_handle_ != base::kNullProcessHandle); 59 return plugin_process_handle_; 60} 61 62bool BrowserPpapiHostImpl::IsValidInstance(PP_Instance instance) const { 63 return instance_to_view_.find(instance) != instance_to_view_.end(); 64} 65 66bool BrowserPpapiHostImpl::GetRenderViewIDsForInstance( 67 PP_Instance instance, 68 int* render_process_id, 69 int* render_view_id) const { 70 InstanceToViewMap::const_iterator found = instance_to_view_.find(instance); 71 if (found == instance_to_view_.end()) { 72 *render_process_id = 0; 73 *render_view_id = 0; 74 return false; 75 } 76 77 *render_process_id = found->second.process_id; 78 *render_view_id = found->second.view_id; 79 return true; 80} 81 82void BrowserPpapiHostImpl::AddInstanceForView(PP_Instance instance, 83 int render_process_id, 84 int render_view_id) { 85 DCHECK(instance_to_view_.find(instance) == instance_to_view_.end()); 86 87 RenderViewIDs ids; 88 ids.process_id = render_process_id; 89 ids.view_id = render_view_id; 90 instance_to_view_[instance] = ids; 91} 92 93void BrowserPpapiHostImpl::DeleteInstanceForView(PP_Instance instance) { 94 InstanceToViewMap::iterator found = instance_to_view_.find(instance); 95 if (found == instance_to_view_.end()) { 96 NOTREACHED(); 97 return; 98 } 99 instance_to_view_.erase(found); 100} 101 102bool BrowserPpapiHostImpl::HostMessageFilter::OnMessageReceived( 103 const IPC::Message& msg) { 104 // Don't forward messages if our owner object has been destroyed. 105 if (!ppapi_host_) 106 return false; 107 108 /* TODO(brettw) when we add messages, here, the code should look like this: 109 bool handled = true; 110 IPC_BEGIN_MESSAGE_MAP(BrowserPpapiHostImpl, msg) 111 // Add necessary message handlers here. 112 IPC_MESSAGE_UNHANDLED(handled = ppapi_host_->OnMessageReceived(msg)) 113 IPC_END_MESSAGE_MAP(); 114 return handled; 115 */ 116 return ppapi_host_->OnMessageReceived(msg); 117} 118 119void BrowserPpapiHostImpl::HostMessageFilter::OnHostDestroyed() { 120 DCHECK(ppapi_host_); 121 ppapi_host_ = NULL; 122} 123 124} // namespace content 125