| 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_;
 | 
| 
 |