browser_ppapi_host_impl.cc revision 5821806d5e7f356e8fa4b058a389a808ea183019
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)#include "content/browser/renderer_host/pepper/pepper_message_filter.h"
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_thread.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/render_view_host.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ipc/ipc_message_macros.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content {
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BrowserPpapiHost* BrowserPpapiHost::CreateExternalPluginProcess(
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC::Sender* sender,
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ppapi::PpapiPermissions permissions,
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::ProcessHandle plugin_child_process,
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC::ChannelProxy* channel,
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    net::HostResolver* host_resolver,
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int render_process_id,
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int render_view_id) {
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BrowserPpapiHostImpl* browser_ppapi_host =
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new BrowserPpapiHostImpl(sender, permissions);
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  browser_ppapi_host->set_plugin_process_handle(plugin_child_process);
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  channel->AddFilter(
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new PepperMessageFilter(PepperMessageFilter::NACL,
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              permissions,
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              host_resolver,
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              render_process_id,
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              render_view_id));
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return browser_ppapi_host;
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BrowserPpapiHostImpl::BrowserPpapiHostImpl(
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC::Sender* sender,
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ppapi::PpapiPermissions& permissions)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : ppapi_host_(sender, permissions),
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      plugin_process_handle_(base::kNullProcessHandle) {
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  message_filter_ = new HostMessageFilter(&ppapi_host_);
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ppapi_host_.AddHostFactoryFilter(scoped_ptr<ppapi::host::HostFactory>(
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new ContentBrowserPepperHostFactory(this)));
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BrowserPpapiHostImpl::~BrowserPpapiHostImpl() {
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Notify the filter so it won't foward messages to us.
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  message_filter_->OnHostDestroyed();
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ppapi::host::PpapiHost* BrowserPpapiHostImpl::GetPpapiHost() {
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return &ppapi_host_;
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)base::ProcessHandle BrowserPpapiHostImpl::GetPluginProcessHandle() const {
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Handle should previously have been set before use.
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(plugin_process_handle_ != base::kNullProcessHandle);
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return plugin_process_handle_;
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool BrowserPpapiHostImpl::IsValidInstance(PP_Instance instance) const {
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return instance_to_view_.find(instance) != instance_to_view_.end();
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool BrowserPpapiHostImpl::GetRenderViewIDsForInstance(
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PP_Instance instance,
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int* render_process_id,
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int* render_view_id) const {
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InstanceToViewMap::const_iterator found = instance_to_view_.find(instance);
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (found == instance_to_view_.end()) {
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *render_process_id = 0;
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *render_view_id = 0;
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *render_process_id = found->second.process_id;
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *render_view_id = found->second.view_id;
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowserPpapiHostImpl::AddInstanceForView(PP_Instance instance,
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                              int render_process_id,
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                              int render_view_id) {
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(instance_to_view_.find(instance) == instance_to_view_.end());
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RenderViewIDs ids;
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ids.process_id = render_process_id;
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ids.view_id = render_view_id;
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  instance_to_view_[instance] = ids;
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowserPpapiHostImpl::DeleteInstanceForView(PP_Instance instance) {
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InstanceToViewMap::iterator found = instance_to_view_.find(instance);
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (found == instance_to_view_.end()) {
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NOTREACHED();
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  instance_to_view_.erase(found);
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool BrowserPpapiHostImpl::HostMessageFilter::OnMessageReceived(
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const IPC::Message& msg) {
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Don't forward messages if our owner object has been destroyed.
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!ppapi_host_)
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* TODO(brettw) when we add messages, here, the code should look like this:
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool handled = true;
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IPC_BEGIN_MESSAGE_MAP(BrowserPpapiHostImpl, msg)
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Add necessary message handlers here.
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPC_MESSAGE_UNHANDLED(handled = ppapi_host_->OnMessageReceived(msg))
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IPC_END_MESSAGE_MAP();
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return handled;
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  */
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return ppapi_host_->OnMessageReceived(msg);
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowserPpapiHostImpl::HostMessageFilter::OnHostDestroyed() {
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(ppapi_host_);
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ppapi_host_ = NULL;
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace content
125