ppapi_plugin_process_host.h revision a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7
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_PPAPI_PLUGIN_PROCESS_HOST_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CONTENT_BROWSER_PPAPI_PLUGIN_PROCESS_HOST_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <queue>
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <vector>
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/file_path.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/ref_counted.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
15a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch#include "base/process/process.h"
16868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string16.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/renderer_host/pepper/browser_ppapi_host_impl.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/renderer_host/pepper/pepper_message_filter.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_child_process_host_delegate.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_child_process_host_iterator.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ipc/ipc_sender.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/shared_impl/ppapi_permissions.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content {
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BrowserChildProcessHostImpl;
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ResourceContext;
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct PepperPluginInfo;
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Process host for PPAPI plugin and broker processes.
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// When used for the broker, interpret all references to "plugin" with "broker".
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PpapiPluginProcessHost : public BrowserChildProcessHostDelegate,
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               public IPC::Sender {
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  class Client {
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   public:
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Gets the information about the renderer that's requesting the channel.
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual void GetPpapiChannelInfo(base::ProcessHandle* renderer_handle,
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     int* renderer_id) = 0;
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Called when the channel is asynchronously opened to the plugin or on
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // error. On error, the parameters should be:
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    //   base::kNullProcessHandle
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    //   IPC::ChannelHandle(),
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    //   0
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual void OnPpapiChannelOpened(
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        const IPC::ChannelHandle& channel_handle,
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        base::ProcessId plugin_pid,
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        int plugin_child_id) = 0;
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Returns true if the current connection is off-the-record.
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual bool OffTheRecord() = 0;
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   protected:
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual ~Client() {}
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  class PluginClient : public Client {
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   public:
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Returns the resource context for the renderer requesting the channel.
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual ResourceContext* GetResourceContext() = 0;
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   protected:
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual ~PluginClient() {}
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  class BrokerClient : public Client {
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   protected:
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual ~BrokerClient() {}
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~PpapiPluginProcessHost();
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static PpapiPluginProcessHost* CreatePluginHost(
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const PepperPluginInfo& info,
75424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      const base::FilePath& profile_data_directory);
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static PpapiPluginProcessHost* CreateBrokerHost(
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const PepperPluginInfo& info);
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Notification that a PP_Instance has been created and the associated
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // renderer related data including the RenderView/Process pair for the given
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // plugin. This is necessary so that when the plugin calls us with a
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // PP_Instance we can find the RenderView associated with it without trusting
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // the plugin.
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static void DidCreateOutOfProcessInstance(
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      int plugin_process_id,
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      int32 pp_instance,
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const PepperRendererInstanceData& instance_data);
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The opposite of DIdCreate... above.
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static void DidDeleteOutOfProcessInstance(int plugin_process_id,
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            int32 pp_instance);
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Returns the instances that match the specified process name.
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // It can only be called on the IO thread.
95a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  static void FindByName(const base::string16& name,
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                         std::vector<PpapiPluginProcessHost*>* hosts);
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // IPC::Sender implementation:
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool Send(IPC::Message* message) OVERRIDE;
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Opens a new channel to the plugin. The client will be notified when the
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // channel is ready or if there's an error.
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OpenChannelToPlugin(Client* client);
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  BrowserPpapiHostImpl* host_impl() { return host_impl_.get(); }
106868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  const BrowserChildProcessHostImpl* process() { return process_.get(); }
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const base::FilePath& plugin_path() const { return plugin_path_; }
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const base::FilePath& profile_data_directory() const {
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return profile_data_directory_;
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The client pointer must remain valid until its callback is issued.
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  class PluginNetworkObserver;
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Constructors for plugin and broker process hosts, respectively.
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // You must call Init before doing anything else.
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PpapiPluginProcessHost(const PepperPluginInfo& info,
120424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)                         const base::FilePath& profile_data_directory);
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PpapiPluginProcessHost();
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Actually launches the process with the given plugin info. Returns true
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // on success (the process was spawned).
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool Init(const PepperPluginInfo& info);
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void RequestPluginChannel(Client* client);
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnProcessLaunched() OVERRIDE;
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnProcessCrashed(int exit_code) OVERRIDE;
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool OnMessageReceived(const IPC::Message& msg) OVERRIDE;
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnChannelConnected(int32 peer_pid) OVERRIDE;
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnChannelError() OVERRIDE;
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void CancelRequests();
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // IPC message handlers.
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnRendererPluginChannelCreated(const IPC::ChannelHandle& handle);
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Handles most requests from the plugin. May be NULL.
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<PepperMessageFilter> filter_;
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ppapi::PpapiPermissions permissions_;
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<BrowserPpapiHostImpl> host_impl_;
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Observes network changes. May be NULL.
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<PluginNetworkObserver> network_observer_;
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Channel requests that we are waiting to send to the plugin process once
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the channel is opened.
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<Client*> pending_requests_;
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Channel requests that we have already sent to the plugin process, but
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // haven't heard back about yet.
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::queue<Client*> sent_requests_;
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Path to the plugin library.
1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath plugin_path_;
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Path to the top-level plugin data directory (differs based upon profile).
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath profile_data_directory_;
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const bool is_broker_;
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<BrowserChildProcessHostImpl> process_;
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(PpapiPluginProcessHost);
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PpapiPluginProcessHostIterator
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : public BrowserChildProcessHostTypeIterator<
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          PpapiPluginProcessHost> {
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PpapiPluginProcessHostIterator()
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : BrowserChildProcessHostTypeIterator<
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          PpapiPluginProcessHost>(PROCESS_TYPE_PPAPI_PLUGIN) {}
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PpapiBrokerProcessHostIterator
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : public BrowserChildProcessHostTypeIterator<
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          PpapiPluginProcessHost> {
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PpapiBrokerProcessHostIterator()
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : BrowserChildProcessHostTypeIterator<
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          PpapiPluginProcessHost>(PROCESS_TYPE_PPAPI_BROKER) {}
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace content
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // CONTENT_BROWSER_PPAPI_PLUGIN_PROCESS_HOST_H_
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
193