browser_ppapi_host_impl.h revision 2385ea399aae016c0806a4f9ef3c9cfe3d2a39df
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)#ifndef CONTENT_BROWSER_RENDERER_HOST_PEPPER_BROWSER_PPAPI_HOST_IMPL_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CONTENT_BROWSER_RENDERER_HOST_PEPPER_BROWSER_PPAPI_HOST_IMPL_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <map>
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <string>
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/file_path.h"
142385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch#include "base/memory/ref_counted.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/renderer_host/pepper/content_browser_pepper_host_factory.h"
162385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch#include "content/browser/renderer_host/pepper/pepper_message_filter.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/content_export.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_ppapi_host.h"
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/common/process_type.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ipc/ipc_channel_proxy.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/host/ppapi_host.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content {
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)struct PepperRendererInstanceData;
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class CONTENT_EXPORT BrowserPpapiHostImpl : public BrowserPpapiHost {
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The creator is responsible for calling set_plugin_process_handle as soon
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // as it is known (we start the process asynchronously so it won't be known
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // when this object is created).
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // |external_plugin| signfies that this is a proxy created for an embedder's
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // plugin, i.e. using BrowserPpapiHost::CreateExternalPluginProcess.
342385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  BrowserPpapiHostImpl(
352385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch      IPC::Sender* sender,
362385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch      const ppapi::PpapiPermissions& permissions,
372385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch      const std::string& plugin_name,
382385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch      const base::FilePath& plugin_path,
392385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch      const base::FilePath& profile_data_directory,
402385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch      bool external_plugin,
412385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch      // TODO (ygorshenin@): remove this once TCP sockets are
422385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch      // converted to the new design.
432385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch      const scoped_refptr<PepperMessageFilter>& pepper_message_filter);
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~BrowserPpapiHostImpl();
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // BrowserPpapiHost.
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ppapi::host::PpapiHost* GetPpapiHost() OVERRIDE;
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual base::ProcessHandle GetPluginProcessHandle() const OVERRIDE;
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool IsValidInstance(PP_Instance instance) const OVERRIDE;
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool GetRenderViewIDsForInstance(PP_Instance instance,
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           int* render_process_id,
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           int* render_view_id) const OVERRIDE;
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual const std::string& GetPluginName() OVERRIDE;
547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual const base::FilePath& GetPluginPath() OVERRIDE;
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual const base::FilePath& GetProfileDataDirectory() OVERRIDE;
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual GURL GetDocumentURLForInstance(PP_Instance instance) OVERRIDE;
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual GURL GetPluginURLForInstance(PP_Instance instance) OVERRIDE;
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_plugin_process_handle(base::ProcessHandle handle) {
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    plugin_process_handle_ = handle;
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool external_plugin() { return external_plugin_; }
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // These two functions are notifications that an instance has been created
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // or destroyed. They allow us to maintain a mapping of PP_Instance to data
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // associated with the instance including view IDs in the browser process.
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void AddInstance(PP_Instance instance,
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                   const PepperRendererInstanceData& instance_data);
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void DeleteInstance(PP_Instance instance);
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<IPC::ChannelProxy::MessageFilter> message_filter() {
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return message_filter_;
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend class BrowserPpapiHostTest;
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Implementing MessageFilter on BrowserPpapiHostImpl makes it ref-counted,
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // preventing us from returning these to embedders without holding a
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // reference. To avoid that, define a message filter object.
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  class HostMessageFilter : public IPC::ChannelProxy::MessageFilter {
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   public:
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    explicit HostMessageFilter(ppapi::host::PpapiHost* ppapi_host)
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        : ppapi_host_(ppapi_host) {}
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // IPC::ChannelProxy::MessageFilter.
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual bool OnMessageReceived(const IPC::Message& msg) OVERRIDE;
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void OnHostDestroyed();
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   private:
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual ~HostMessageFilter() {}
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ppapi::host::PpapiHost* ppapi_host_;
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<ppapi::host::PpapiHost> ppapi_host_;
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::ProcessHandle plugin_process_handle_;
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string plugin_name_;
1007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  base::FilePath plugin_path_;
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath profile_data_directory_;
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // If true, this is an external plugin, i.e. created by the embedder using
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // BrowserPpapiHost::CreateExternalPluginProcess.
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool external_plugin_;
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Tracks all PP_Instances in this plugin and associated renderer-related
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // data.
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  typedef std::map<PP_Instance, PepperRendererInstanceData> InstanceMap;
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  InstanceMap instance_map_;
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<HostMessageFilter> message_filter_;
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(BrowserPpapiHostImpl);
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace content
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // CONTENT_BROWSER_RENDERER_HOST_PEPPER_BROWSER_PPAPI_HOST_IMPL_H_
120