Index: ppapi/proxy/plugin_resource_tracker.h |
=================================================================== |
--- ppapi/proxy/plugin_resource_tracker.h (revision 72517) |
+++ ppapi/proxy/plugin_resource_tracker.h (working copy) |
@@ -5,10 +5,12 @@ |
#ifndef PPAPI_PROXY_PLUGIN_RESOURCE_TRACKER_H_ |
#define PPAPI_PROXY_PLUGIN_RESOURCE_TRACKER_H_ |
+#include <utility> |
viettrungluu
2011/01/27 16:52:58
Nit: alphabetical order.
|
#include <map> |
#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" |
@@ -20,9 +22,15 @@ |
class PluginDispatcher; |
class PluginResource; |
+class SerializedResource; |
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.serialized_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(PP_Instance instance, |
+ SerializedResource resource) const; |
private: |
friend struct DefaultSingletonTraits<PluginResourceTracker>; |
+ friend class PluginResourceTrackerTest; |
+ friend class PluginProxyTest; |
PluginResourceTracker(); |
~PluginResourceTracker(); |
@@ -86,8 +80,20 @@ |
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::pair<PP_Instance, PP_Resource> HostResource; |
+ 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 |