Index: src/shared/ppapi_proxy/plugin_resource.h |
diff --git a/src/shared/ppapi_proxy/plugin_resource.h b/src/shared/ppapi_proxy/plugin_resource.h |
index 17637de4e9edb2c59595b52e25db8487af14f631..2e39f604122679749a64d4c9b86dc0d8cca2ed0a 100644 |
--- a/src/shared/ppapi_proxy/plugin_resource.h |
+++ b/src/shared/ppapi_proxy/plugin_resource.h |
@@ -21,6 +21,7 @@ namespace ppapi_proxy { |
F(PluginFont) \ |
F(PluginGraphics2D) \ |
F(PluginImageData) \ |
+ F(PluginInputEvent) \ |
F(PluginSurface3D) |
// Forward declaration of PluginResource classes. |
@@ -43,36 +44,30 @@ class PluginResource : public nacl::RefCounted<PluginResource> { |
return resource ? resource->Cast<T>() : NULL; |
} |
+ // Adopt the given PP_Resource as type T. Use this function for resources that |
+ // the browser provides to the plugin with an incremented ref count (i.e., |
+ // calls AddRefResource); it initializes the browser refcount to 1 or |
+ // increments it if the resource already exists. |
// Returns NULL if the resource is invalid or is a different type. |
template<typename T> |
static scoped_refptr<T> AdoptAs(PP_Resource res); |
+ // Adopt the given PP_Resource as type T. Use this function for resources |
+ // when the browser drops the refcount immediately. These resources are |
+ // typically meant to be cached on the plugin side, with little or no |
+ // interaction back to the browser. For an example, see PluginInputEvent. |
+ // This is like AdoptAs above, except it initializes the browser_refcount to |
+ // 0 for resources that are new to the plugin, and does not increment the |
+ // browser_refcount for resources that exist. |
+ // Returns NULL if the resource is invalid or is a different type. |
+ template<typename T> |
+ static scoped_refptr<T> AdoptAsWithNoBrowserCount(PP_Resource res); |
+ |
// Cast the resource into a specified type. This will return NULL if the |
// resource does not match the specified type. Specializations of this |
// template call into As* functions. |
template <typename T> T* Cast() { return NULL; } |
- // Returns an resource id of this object. If the object doesn't have a |
- // resource id, new one is created with plugin refcount of 1. If it does, |
- // the refcount is incremented. Use this when you need to return a new |
- // reference to the plugin. |
- PP_Resource GetReference(); |
- |
- // When you need to ensure that a resource has a reference, but you do not |
- // want to increase the refcount (for example, if you need to call a plugin |
- // callback function with a reference), you can use this class. For example: |
- // |
- // plugin_callback(.., ScopedResourceId(resource).id, ...); |
- class ScopedResourceId { |
- public: |
- explicit ScopedResourceId(PluginResource* resource) |
- : id(resource->GetReference()) {} |
- ~ScopedResourceId() { |
- PluginResourceTracker::Get()->UnrefResource(id); |
- } |
- const PP_Resource id; |
- }; |
- |
protected: |
virtual bool InitFromBrowserResource(PP_Resource resource) = 0; |
@@ -90,19 +85,6 @@ class PluginResource : public nacl::RefCounted<PluginResource> { |
#define IMPLEMENT_RESOURCE(RESOURCE) \ |
virtual RESOURCE* As##RESOURCE() { return this; } |
- // If referenced by a plugin, holds the id of this resource object. Do not |
- // access this member directly, because it is possible that the plugin holds |
- // no references to the object, and therefore the resource_id_ is zero. Use |
- // either GetReference() to obtain a new resource_id and increase the |
- // refcount, or TemporaryReference when you do not want to increase the |
- // refcount. |
- PP_Resource resource_id_; |
- |
- // Called by the resource tracker when the last plugin reference has been |
- // dropped. You cannot use resource_id_ after this function is called! |
- friend class PluginResourceTracker; |
- void StoppedTracking(); |
- |
DISALLOW_COPY_AND_ASSIGN(PluginResource); |
}; |
@@ -118,21 +100,22 @@ FOR_ALL_RESOURCES(DEFINE_RESOURCE_CAST) |
#undef FOR_ALL_RESOURCES |
template<typename T> scoped_refptr<T> |
-PluginResourceTracker::AdoptBrowserResource(PP_Resource res) { |
+PluginResourceTracker::AdoptBrowserResource(PP_Resource res, |
+ size_t browser_refcount) { |
ResourceMap::iterator result = live_resources_.find(res); |
// Do we have it already? |
if (result == live_resources_.end()) { |
// No - try to create a new one. |
scoped_refptr<T> new_resource = new T(); |
if (new_resource->InitFromBrowserResource(res)) { |
- AddResource(new_resource, res); |
+ AddResource(new_resource, res, browser_refcount); |
return new_resource; |
} else { |
return scoped_refptr<T>(); |
} |
} else { |
- // Consume one more browser refcount. |
- ++result->second.browser_refcount; |
+ // Consume more browser refcounts (unless browser_refcount is 0). |
+ result->second.browser_refcount += browser_refcount; |
return result->second.resource->Cast<T>(); |
} |
} |
@@ -143,8 +126,22 @@ scoped_refptr<T> PluginResource::AdoptAs(PP_Resource res) { |
if (!res) |
return NULL; |
- // Adopt the resource. |
- return PluginResourceTracker::Get()->AdoptBrowserResource<T>(res); |
+ // Adopt the resource with 1 browser-side refcount. |
+ const size_t browser_refcount = 1; |
+ return PluginResourceTracker::Get()->AdoptBrowserResource<T>( |
+ res, browser_refcount); |
+} |
+ |
+template<typename T> |
+scoped_refptr<T> PluginResource::AdoptAsWithNoBrowserCount(PP_Resource res) { |
+ // Short-circuit if null resource. |
+ if (!res) |
+ return NULL; |
+ |
+ // Adopt the resource with 0 browser-side refcount. |
+ const size_t browser_refcount = 0; |
+ return PluginResourceTracker::Get()->AdoptBrowserResource<T>( |
+ res, browser_refcount); |
} |
} // namespace ppapi_proxy |