| Index: content/browser/renderer_host/pepper/browser_ppapi_host_impl.h
|
| diff --git a/content/browser/renderer_host/pepper/browser_ppapi_host_impl.h b/content/browser/renderer_host/pepper/browser_ppapi_host_impl.h
|
| index bd0c61d7c59d72ecb34c47b4ea16e2e704b65c2b..11e912e430706f19d95df3bb9b6914ba7f93a3d7 100644
|
| --- a/content/browser/renderer_host/pepper/browser_ppapi_host_impl.h
|
| +++ b/content/browser/renderer_host/pepper/browser_ppapi_host_impl.h
|
| @@ -10,6 +10,7 @@
|
|
|
| #include "base/basictypes.h"
|
| #include "base/compiler_specific.h"
|
| +#include "base/containers/scoped_ptr_hash_map.h"
|
| #include "base/files/file_path.h"
|
| #include "base/memory/ref_counted.h"
|
| #include "base/memory/weak_ptr.h"
|
| @@ -28,6 +29,89 @@
|
|
|
| namespace content {
|
|
|
| +class BrowserMessageFilter;
|
| +class BrowserPpapiHostImpl;
|
| +class PendingHostCreator {
|
| + public:
|
| + PendingHostCreator(int routing_id,
|
| + int sequence_id,
|
| + size_t nested_msgs_size);
|
| + ~PendingHostCreator();
|
| +
|
| + // Adds the given resource host as a pending one. The host is remembered as
|
| + // host number |index|, and will ultimately be sent to the plugin to be
|
| + // attached to a real resource.
|
| + void AddPendingResourceHost(size_t index, int host_id);
|
| +
|
| + bool finished() const {
|
| + return completed_so_far_ == host_ids_.size();
|
| + }
|
| +
|
| + int routing_id() const { return routing_id_; }
|
| + int sequence_id() const { return sequence_id_; }
|
| + const std::vector<int>& host_ids() const { return host_ids_; }
|
| +
|
| + // Swap host_ids with host_ids_, to avoid copying.
|
| + void TakePendingResourceHostIdsAndReset(std::vector<int>* host_ids);
|
| +
|
| + private:
|
| + int routing_id_;
|
| + int sequence_id_;
|
| + std::vector<int> host_ids_;
|
| + size_t completed_so_far_;
|
| +};
|
| +
|
| +// TODO(dmichael) Rename and move this to its own file.
|
| +class InstanceData {
|
| + public:
|
| + explicit InstanceData(PP_Instance instance,
|
| + BrowserPpapiHostImpl* host,
|
| + IPC::Sender* renderer_sender,
|
| + PepperRendererInstanceData renderer_data);
|
| + InstanceData(const InstanceData& instance_data);
|
| + ~InstanceData();
|
| +
|
| + const PepperRendererInstanceData& renderer_data() const {
|
| + return renderer_data_;
|
| + }
|
| +
|
| + void CreateResourceHostsFromHost(
|
| + int routing_id,
|
| + const ppapi::proxy::ResourceMessageCallParams& params,
|
| + const std::vector<IPC::Message>& nested_msgs);
|
| + void GetAllPendingResourceHosts(scoped_ptr<IPC::Message> reply_msg);
|
| + void RendererDidReceiveHosts(int sequence);
|
| + private:
|
| + typedef base::ScopedPtrHashMap<int, PendingHostCreator> HostCreatorMap;
|
| +
|
| + void SendCompletedResourceHosts(const PendingHostCreator& creator);
|
| + void SendSyncReplyIfNecessary();
|
| + void AddPendingResourceHost(PendingHostCreator* creator,
|
| + int sequence,
|
| + size_t index,
|
| + scoped_ptr<ppapi::host::ResourceHost> host);
|
| + PP_Instance instance_;
|
| +
|
| + // Weak; host_ owns the InstanceData.
|
| + BrowserPpapiHostImpl* host_;
|
| +
|
| + IPC::Sender* renderer_sender_;
|
| +
|
| + // Maps sequence number to PendingHostCreator.
|
| + HostCreatorMap host_creator_map_;
|
| + size_t finished_creators_;
|
| + // Valid if we are building up a reply to a sync request for this instance.
|
| + // If null, we are in "normal" mode, where we send created hosts
|
| + // asynchronously. If valid, this is the reply message to send back to the
|
| + // renderer to unblock it. Note we only need 1, because the renderer will
|
| + // be blocked and unable to make another sync request until after we are
|
| + // finished servicing this one.
|
| + scoped_ptr<IPC::Message> reply_for_sync_request_;
|
| + PepperRendererInstanceData renderer_data_;
|
| +
|
| + base::WeakPtrFactory<InstanceData> weak_ptr_factory_;
|
| +};
|
| +
|
| class CONTENT_EXPORT BrowserPpapiHostImpl : public BrowserPpapiHost {
|
| public:
|
| // The creator is responsible for calling set_plugin_process_handle as soon
|
| @@ -69,9 +153,20 @@ class CONTENT_EXPORT BrowserPpapiHostImpl : public BrowserPpapiHost {
|
| // or destroyed. They allow us to maintain a mapping of PP_Instance to data
|
| // associated with the instance including view IDs in the browser process.
|
| void AddInstance(PP_Instance instance,
|
| - const PepperRendererInstanceData& instance_data);
|
| + const PepperRendererInstanceData& instance_data,
|
| + IPC::Sender* renderer_sender);
|
| void DeleteInstance(PP_Instance instance);
|
|
|
| + void CreateResourceHostsFromHost(
|
| + int routing_id,
|
| + const ppapi::proxy::ResourceMessageCallParams& params,
|
| + PP_Instance instance,
|
| + const std::vector<IPC::Message>& nested_msgs);
|
| + void RendererDidReceiveHosts(PP_Instance instance, int sequence);
|
| + bool GetAllPendingResourceHosts(
|
| + PP_Instance instance,
|
| + scoped_ptr<IPC::Message> reply_msg);
|
| +
|
| scoped_refptr<IPC::MessageFilter> message_filter() {
|
| return message_filter_;
|
| }
|
| @@ -125,9 +220,14 @@ class CONTENT_EXPORT BrowserPpapiHostImpl : public BrowserPpapiHost {
|
|
|
| scoped_refptr<SSLContextHelper> ssl_context_helper_;
|
|
|
| + // PendingHostCreator keeps track of a set of hosts that are being created
|
| + // for a single request message from the renderer. See the body for its
|
| + // definition.
|
| + class PendingHostCreator;
|
| +
|
| // Tracks all PP_Instances in this plugin and associated renderer-related
|
| // data.
|
| - typedef std::map<PP_Instance, PepperRendererInstanceData> InstanceMap;
|
| + typedef std::map<PP_Instance, InstanceData> InstanceMap;
|
| InstanceMap instance_map_;
|
|
|
| scoped_refptr<HostMessageFilter> message_filter_;
|
|
|