Index: chrome/browser/ppapi_plugin_process_host.h |
=================================================================== |
--- chrome/browser/ppapi_plugin_process_host.h (revision 74733) |
+++ chrome/browser/ppapi_plugin_process_host.h (working copy) |
@@ -6,20 +6,48 @@ |
#define CHROME_BROWSER_PPAPI_PLUGIN_PROCESS_HOST_H_ |
#pragma once |
+#include <queue> |
+ |
#include "base/basictypes.h" |
#include "base/file_path.h" |
#include "chrome/browser/browser_child_process_host.h" |
-class RenderMessageFilter; |
- |
class PpapiPluginProcessHost : public BrowserChildProcessHost { |
public: |
- explicit PpapiPluginProcessHost(RenderMessageFilter* filter); |
+ class Client { |
+ public: |
+ // Gets the information about the renderer that's requesting the channel. |
+ virtual void GetChannelInfo(base::ProcessHandle* renderer_handle, |
+ int* renderer_id) = 0; |
+ |
+ // Called when the channel is asynchronously opened to the plugin or on |
+ // error. On error, the parameters should be: |
+ // base::kNullProcessHandle |
+ // IPC::ChannelHandle() |
+ virtual void OnChannelOpened(base::ProcessHandle plugin_process_handle, |
+ const IPC::ChannelHandle& channel_handle) = 0; |
+ }; |
+ |
+ // You must call init before doing anything else. |
+ explicit PpapiPluginProcessHost(); |
virtual ~PpapiPluginProcessHost(); |
- void Init(const FilePath& path, IPC::Message* reply_msg); |
+ // Actually launches the process with the given plugin path. Returns true |
+ // on success (the process was spawned). |
+ bool Init(const FilePath& path); |
+ // Opens a new channel to the plugin. The client will be notified when the |
+ // channel is ready or if there's an error. |
+ void OpenChannelToPlugin(Client* client); |
+ |
+ const FilePath& plugin_path() const { return plugin_path_; } |
+ |
+ // The client pointer must remain valid until its callback is issued. |
+ |
private: |
+ |
+ void RequestPluginChannel(Client* client); |
+ |
virtual bool CanShutdown(); |
virtual void OnProcessLaunched(); |
@@ -27,22 +55,22 @@ |
virtual void OnChannelConnected(int32 peer_pid); |
virtual void OnChannelError(); |
+ void CancelRequests(); |
+ |
// IPC message handlers. |
- void OnPluginLoaded(const IPC::ChannelHandle& handle); |
+ void OnRendererPluginChannelCreated(const IPC::ChannelHandle& handle); |
- // Sends the reply_msg_ to the renderer with the given channel info. |
- void ReplyToRenderer(base::ProcessHandle plugin_handle, |
- const IPC::ChannelHandle& channel_handle); |
+ // Channel requests that we are waiting to send to the plugin process once |
+ // the channel is opened. |
+ std::vector<Client*> pending_requests_; |
- RenderMessageFilter* filter_; |
+ // Channel requests that we have already sent to the plugin process, but |
+ // haven't heard back about yet. |
+ std::queue<Client*> sent_requests_; |
// Path to the plugin library. |
FilePath plugin_path_; |
- // When we're waiting for initialization of the plugin, this contains the |
- // reply message for the renderer to tell it that it can continue. |
- scoped_ptr<IPC::Message> reply_msg_; |
- |
DISALLOW_COPY_AND_ASSIGN(PpapiPluginProcessHost); |
}; |