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