| Index: ppapi/proxy/plugin_resource_tracker.h | 
| =================================================================== | 
| --- ppapi/proxy/plugin_resource_tracker.h	(revision 72840) | 
| +++ ppapi/proxy/plugin_resource_tracker.h	(working copy) | 
| @@ -6,12 +6,15 @@ | 
| #define PPAPI_PROXY_PLUGIN_RESOURCE_TRACKER_H_ | 
|  | 
| #include <map> | 
| +#include <utility> | 
|  | 
| #include "base/linked_ptr.h" | 
| #include "ppapi/c/pp_completion_callback.h" | 
| +#include "ppapi/c/pp_instance.h" | 
| #include "ppapi/c/pp_stdint.h" | 
| #include "ppapi/c/pp_resource.h" | 
| #include "ppapi/c/pp_var.h" | 
| +#include "ppapi/proxy/host_resource.h" | 
|  | 
| template<typename T> struct DefaultSingletonTraits; | 
|  | 
| @@ -23,6 +26,11 @@ | 
|  | 
| class PluginResourceTracker { | 
| public: | 
| +  // Called by tests that want to specify a specific ResourceTracker. This | 
| +  // allows them to use a unique one each time and avoids singletons sticking | 
| +  // around across tests. | 
| +  static void SetInstanceForTest(PluginResourceTracker* tracker); | 
| + | 
| // Returns the global singleton resource tracker for the plugin. | 
| static PluginResourceTracker* GetInstance(); | 
|  | 
| @@ -30,38 +38,24 @@ | 
| // there isn't one. | 
| PluginResource* GetResourceObject(PP_Resource pp_resource); | 
|  | 
| -  void AddResource(PP_Resource pp_resource, linked_ptr<PluginResource> object); | 
| +  // Adds the given resource object to the tracked list, and returns the | 
| +  // plugin-local PP_Resource ID that identifies the resource. Note that this | 
| +  // PP_Resource is not valid to send to the host, use | 
| +  // PluginResource.host_resource() to get that. | 
| +  PP_Resource AddResource(linked_ptr<PluginResource> object); | 
|  | 
| void AddRefResource(PP_Resource resource); | 
| void ReleaseResource(PP_Resource resource); | 
|  | 
| -  // Checks if the resource just returned from the renderer is already | 
| -  // tracked by the plugin side and adjusts the refcounts if so. | 
| -  // | 
| -  // When the browser returns a PP_Resource, it could be a new one, in which | 
| -  // case the proxy wants to create a corresponding object and call | 
| -  // AddResource() on it. However, if the resouce is already known, then the | 
| -  // refcount needs to be adjusted in both the plugin and the renderer side | 
| -  // and no such object needs to be created. | 
| -  // | 
| -  // Returns true if the resource was previously known. The refcount will be | 
| -  // fixed up such that it's ready to use by the plugin. A proxy can then | 
| -  // just return the resource without doing any more work. | 
| -  // | 
| -  // Typical usage: | 
| -  // | 
| -  //   PP_Resource result; | 
| -  //   dispatcher->Send(new MyMessage(..., &result)); | 
| -  //   if (PluginResourceTracker::GetInstance()-> | 
| -  //           PreparePreviouslyTrackedResource(result)) | 
| -  //     return result; | 
| -  //   ... create resource object ... | 
| -  //   PluginResourceTracker::GetInstance()->AddResource(result, object); | 
| -  //   return result; | 
| -  bool PreparePreviouslyTrackedResource(PP_Resource resource); | 
| +  // Given a host resource, maps it to an existing plugin resource ID if it | 
| +  // exists, or returns 0 on failure. | 
| +  PP_Resource PluginResourceForHostResource( | 
| +      const HostResource& resource) const; | 
|  | 
| private: | 
| friend struct DefaultSingletonTraits<PluginResourceTracker>; | 
| +  friend class PluginResourceTrackerTest; | 
| +  friend class PluginProxyTest; | 
|  | 
| PluginResourceTracker(); | 
| ~PluginResourceTracker(); | 
| @@ -86,8 +80,19 @@ | 
| void SendReleaseResourceToHost(PP_Resource resource_id, | 
| PluginResource* resource); | 
|  | 
| +  // Map of plugin resource IDs to the information tracking that resource. | 
| typedef std::map<PP_Resource, ResourceInfo> ResourceMap; | 
| ResourceMap resource_map_; | 
| + | 
| +  // Map of host instance/resource pairs to a plugin resource ID. | 
| +  typedef std::map<HostResource, PP_Resource> HostResourceMap; | 
| +  HostResourceMap host_resource_map_; | 
| + | 
| +  // Tracks the last ID we've sent out as a plugin resource so we don't send | 
| +  // duplicates. | 
| +  PP_Resource last_resource_id_; | 
| + | 
| +  DISALLOW_COPY_AND_ASSIGN(PluginResourceTracker); | 
| }; | 
|  | 
| }  // namespace proxy | 
|  |