diff options
Diffstat (limited to 'webkit')
-rw-r--r-- | webkit/plugins/ppapi/npapi_glue.cc | 11 | ||||
-rw-r--r-- | webkit/plugins/ppapi/npobject_var.cc | 8 | ||||
-rw-r--r-- | webkit/plugins/ppapi/npobject_var.h | 1 | ||||
-rw-r--r-- | webkit/plugins/ppapi/plugin_object.cc | 6 | ||||
-rw-r--r-- | webkit/plugins/ppapi/ppapi_plugin_instance.cc | 6 | ||||
-rw-r--r-- | webkit/plugins/ppapi/ppb_url_util_impl.cc | 34 | ||||
-rw-r--r-- | webkit/plugins/ppapi/ppb_var_impl.cc | 16 | ||||
-rw-r--r-- | webkit/plugins/ppapi/resource_tracker.cc | 110 | ||||
-rw-r--r-- | webkit/plugins/ppapi/resource_tracker.h | 15 | ||||
-rw-r--r-- | webkit/plugins/ppapi/resource_tracker_unittest.cc | 7 |
10 files changed, 71 insertions, 143 deletions
diff --git a/webkit/plugins/ppapi/npapi_glue.cc b/webkit/plugins/ppapi/npapi_glue.cc index 93c57ed..7e90a1e 100644 --- a/webkit/plugins/ppapi/npapi_glue.cc +++ b/webkit/plugins/ppapi/npapi_glue.cc @@ -159,7 +159,7 @@ PPResultAndExceptionToNPResult::~PPResultAndExceptionToNPResult() { // been lost. DCHECK(checked_exception_); - NPObjectVar::PluginReleasePPVar(exception_); + ResourceTracker::Get()->GetVarTracker()->ReleaseVar(exception_); } // Call this with the return value of the PPAPI function. It will convert @@ -184,7 +184,7 @@ bool PPResultAndExceptionToNPResult::SetResult(PP_Var result) { // No matter what happened, we need to release the reference to the // value passed in. On success, a reference to this value will be in // the np_result_. - ::ppapi::Var::PluginReleasePPVar(result); + ResourceTracker::Get()->GetVarTracker()->ReleaseVar(result); return success_; } @@ -237,8 +237,9 @@ PPVarArrayFromNPVariantArray::PPVarArrayFromNPVariantArray( } PPVarArrayFromNPVariantArray::~PPVarArrayFromNPVariantArray() { + ::ppapi::VarTracker* var_tracker = ResourceTracker::Get()->GetVarTracker(); for (size_t i = 0; i < size_; i++) - ::ppapi::Var::PluginReleasePPVar(array_[i]); + var_tracker->ReleaseVar(array_[i]); } // PPVarFromNPObject ----------------------------------------------------------- @@ -248,7 +249,7 @@ PPVarFromNPObject::PPVarFromNPObject(PluginInstance* instance, NPObject* object) } PPVarFromNPObject::~PPVarFromNPObject() { - ::ppapi::Var::PluginReleasePPVar(var_); + ResourceTracker::Get()->GetVarTracker()->ReleaseVar(var_); } // NPObjectAccessorWithIdentifier ---------------------------------------------- @@ -268,7 +269,7 @@ NPObjectAccessorWithIdentifier::NPObjectAccessorWithIdentifier( } NPObjectAccessorWithIdentifier::~NPObjectAccessorWithIdentifier() { - ::ppapi::Var::PluginReleasePPVar(identifier_); + ResourceTracker::Get()->GetVarTracker()->ReleaseVar(identifier_); } // TryCatch -------------------------------------------------------------------- diff --git a/webkit/plugins/ppapi/npobject_var.cc b/webkit/plugins/ppapi/npobject_var.cc index b951cde..e430dd2 100644 --- a/webkit/plugins/ppapi/npobject_var.cc +++ b/webkit/plugins/ppapi/npobject_var.cc @@ -46,6 +46,10 @@ PP_Var NPObjectVar::GetPPVar() { return result; } +PP_VarType NPObjectVar::GetType() const { + return PP_VARTYPE_OBJECT; +} + void NPObjectVar::InstanceDeleted() { DCHECK(pp_instance_); pp_instance_ = 0; @@ -55,8 +59,8 @@ void NPObjectVar::InstanceDeleted() { scoped_refptr<NPObjectVar> NPObjectVar::FromPPVar(PP_Var var) { if (var.type != PP_VARTYPE_OBJECT) return scoped_refptr<NPObjectVar>(NULL); - scoped_refptr<Var> var_object(webkit::ppapi::ResourceTracker::Get()->GetVar( - static_cast<int32>(var.value.as_id))); + scoped_refptr<Var> var_object( + webkit::ppapi::ResourceTracker::Get()->GetVarTracker()->GetVar(var)); if (!var_object) return scoped_refptr<NPObjectVar>(); return scoped_refptr<NPObjectVar>(var_object->AsNPObjectVar()); diff --git a/webkit/plugins/ppapi/npobject_var.h b/webkit/plugins/ppapi/npobject_var.h index d0ba122..f82861a 100644 --- a/webkit/plugins/ppapi/npobject_var.h +++ b/webkit/plugins/ppapi/npobject_var.h @@ -39,6 +39,7 @@ class NPObjectVar : public Var { // Var overrides. virtual NPObjectVar* AsNPObjectVar() OVERRIDE; virtual PP_Var GetPPVar() OVERRIDE; + virtual PP_VarType GetType() const OVERRIDE; // Returns the underlying NPObject corresponding to this NPObjectVar. // Guaranteed non-NULL. diff --git a/webkit/plugins/ppapi/plugin_object.cc b/webkit/plugins/ppapi/plugin_object.cc index 95d8fba..5362fa4 100644 --- a/webkit/plugins/ppapi/plugin_object.cc +++ b/webkit/plugins/ppapi/plugin_object.cc @@ -21,6 +21,7 @@ #include "webkit/plugins/ppapi/plugin_module.h" #include "webkit/plugins/ppapi/ppapi_plugin_instance.h" #include "webkit/plugins/ppapi/resource.h" +#include "webkit/plugins/ppapi/resource_tracker.h" #include "webkit/plugins/ppapi/string.h" using ppapi::StringVar; @@ -136,7 +137,7 @@ bool WrapperClass_SetProperty(NPObject* object, NPIdentifier property_name, accessor.object()->ppp_class()->SetProperty( accessor.object()->ppp_class_data(), accessor.identifier(), value_var, result_converter.exception()); - Var::PluginReleasePPVar(value_var); + ResourceTracker::Get()->GetVarTracker()->ReleaseVar(value_var); return result_converter.CheckExceptionForNoResult(); } @@ -201,8 +202,9 @@ bool WrapperClass_Enumerate(NPObject* object, NPIdentifier** values, // Release the PP_Var that the plugin allocated. On success, they will all // be converted to NPVariants, and on failure, we want them to just go away. + ::ppapi::VarTracker* var_tracker = ResourceTracker::Get()->GetVarTracker(); for (uint32_t i = 0; i < property_count; ++i) - Var::PluginReleasePPVar(properties[i]); + var_tracker->ReleaseVar(properties[i]); free(properties); return result_converter.success(); } diff --git a/webkit/plugins/ppapi/ppapi_plugin_instance.cc b/webkit/plugins/ppapi/ppapi_plugin_instance.cc index 5770ca8..242c246 100644 --- a/webkit/plugins/ppapi/ppapi_plugin_instance.cc +++ b/webkit/plugins/ppapi/ppapi_plugin_instance.cc @@ -609,7 +609,8 @@ string16 PluginInstance::GetSelectedText(bool html) { PP_Var rv = plugin_selection_interface_->GetSelectedText(pp_instance(), PP_FromBool(html)); scoped_refptr<StringVar> string(StringVar::FromPPVar(rv)); - Var::PluginReleasePPVar(rv); // Release the ref the plugin transfered to us. + // Release the ref the plugin transfered to us. + ResourceTracker::Get()->GetVarTracker()->ReleaseVar(rv); if (!string) return string16(); return UTF8ToUTF16(string->value()); @@ -626,7 +627,8 @@ string16 PluginInstance::GetLinkAtPosition(const gfx::Point& point) { p.y = point.y(); PP_Var rv = plugin_pdf_interface_->GetLinkAtPosition(pp_instance(), p); scoped_refptr<StringVar> string(StringVar::FromPPVar(rv)); - Var::PluginReleasePPVar(rv); // Release the ref the plugin transfered to us. + // Release the ref the plugin transfered to us. + ResourceTracker::Get()->GetVarTracker()->ReleaseVar(rv); if (!string) return string16(); return UTF8ToUTF16(string->value()); diff --git a/webkit/plugins/ppapi/ppb_url_util_impl.cc b/webkit/plugins/ppapi/ppb_url_util_impl.cc index ebd8921..1900731 100644 --- a/webkit/plugins/ppapi/ppb_url_util_impl.cc +++ b/webkit/plugins/ppapi/ppb_url_util_impl.cc @@ -39,13 +39,6 @@ PP_Module GetModuleFromVar(PP_Var string_var) { return str->pp_module(); } -const std::string* StringFromVar(PP_Var var) { - scoped_refptr<StringVar> string(StringVar::FromPPVar(var)); - if (!string) - return NULL; - return &string->value(); -} - // Sets |*security_origin| to be the WebKit security origin associated with the // document containing the given plugin instance. On success, returns true. If // the instance is invalid, returns false and |*security_origin| will be @@ -62,20 +55,14 @@ bool SecurityOriginForInstance(PP_Instance instance_id, } PP_Var Canonicalize(PP_Var url, PP_URLComponents_Dev* components) { - return URLUtilImpl::Canonicalize(&StringFromVar, - PPB_Var_Impl::GetVarInterface()->VarFromUtf8, - GetModuleFromVar(url), - url, components); + return URLUtilImpl::Canonicalize(GetModuleFromVar(url), url, components); } PP_Var ResolveRelativeToURL(PP_Var base_url, PP_Var relative, PP_URLComponents_Dev* components) { - return URLUtilImpl::ResolveRelativeToURL( - &StringFromVar, - PPB_Var_Impl::GetVarInterface()->VarFromUtf8, - GetModuleFromVar(base_url), - base_url, relative, components); + return URLUtilImpl::ResolveRelativeToURL(GetModuleFromVar(base_url), + base_url, relative, components); } PP_Var ResolveRelativeToDocument(PP_Instance instance_id, @@ -92,14 +79,13 @@ PP_Var ResolveRelativeToDocument(PP_Instance instance_id, WebKit::WebElement plugin_element = instance->container()->element(); GURL document_url = plugin_element.document().baseURL(); return URLUtilImpl::GenerateURLReturn( - PPB_Var_Impl::GetVarInterface()->VarFromUtf8, instance->module()->pp_module(), document_url.Resolve(relative_string->value()), components); } PP_Bool IsSameSecurityOrigin(PP_Var url_a, PP_Var url_b) { - return URLUtilImpl::IsSameSecurityOrigin(&StringFromVar, url_a, url_b); + return URLUtilImpl::IsSameSecurityOrigin(url_a, url_b); } PP_Bool DocumentCanRequest(PP_Instance instance, PP_Var url) { @@ -137,10 +123,8 @@ PP_Var GetDocumentURL(PP_Instance instance_id, return PP_MakeNull(); WebKit::WebDocument document = instance->container()->element().document(); - return URLUtilImpl::GenerateURLReturn( - PPB_Var_Impl::GetVarInterface()->VarFromUtf8, - instance->module()->pp_module(), - document.url(), components); + return URLUtilImpl::GenerateURLReturn(instance->module()->pp_module(), + document.url(), components); } PP_Var GetPluginInstanceURL(PP_Instance instance_id, @@ -150,10 +134,8 @@ PP_Var GetPluginInstanceURL(PP_Instance instance_id, return PP_MakeNull(); const GURL& url = instance->plugin_url(); - return URLUtilImpl::GenerateURLReturn( - PPB_Var_Impl::GetVarInterface()->VarFromUtf8, - instance->module()->pp_module(), - url, components); + return URLUtilImpl::GenerateURLReturn(instance->module()->pp_module(), + url, components); } const PPB_URLUtil_Dev ppb_url_util = { diff --git a/webkit/plugins/ppapi/ppb_var_impl.cc b/webkit/plugins/ppapi/ppb_var_impl.cc index 49576b3..160b972 100644 --- a/webkit/plugins/ppapi/ppb_var_impl.cc +++ b/webkit/plugins/ppapi/ppb_var_impl.cc @@ -169,6 +169,14 @@ class ObjectAccessorWithIdentifierTryCatch : public ObjectAccessorTryCatch { // PPB_Var methods ------------------------------------------------------------- +void AddRefVar(PP_Var var) { + ResourceTracker::Get()->GetVarTracker()->AddRefVar(var); +} + +void ReleaseVar(PP_Var var) { + ResourceTracker::Get()->GetVarTracker()->ReleaseVar(var); +} + PP_Var VarFromUtf8(PP_Module module, const char* data, uint32_t len) { return StringVar::StringToPPVar(module, data, len); } @@ -418,8 +426,8 @@ PP_Var CreateObjectWithModuleDeprecated(PP_Module module_id, } const PPB_Var_Deprecated var_deprecated_interface = { - &Var::PluginAddRefPPVar, - &Var::PluginReleasePPVar, + &AddRefVar, + &ReleaseVar, &VarFromUtf8, &VarToUtf8, &HasPropertyDeprecated, @@ -436,8 +444,8 @@ const PPB_Var_Deprecated var_deprecated_interface = { }; const PPB_Var var_interface = { - &Var::PluginAddRefPPVar, - &Var::PluginReleasePPVar, + &AddRefVar, + &ReleaseVar, &VarFromUtf8, &VarToUtf8 }; diff --git a/webkit/plugins/ppapi/resource_tracker.cc b/webkit/plugins/ppapi/resource_tracker.cc index 3d050a5..5e15103 100644 --- a/webkit/plugins/ppapi/resource_tracker.cc +++ b/webkit/plugins/ppapi/resource_tracker.cc @@ -12,6 +12,7 @@ #include "ppapi/c/pp_resource.h" #include "ppapi/c/pp_var.h" #include "ppapi/shared_impl/function_group_base.h" +#include "ppapi/shared_impl/id_assignment.h" #include "ppapi/shared_impl/tracker_base.h" #include "webkit/plugins/ppapi/npobject_var.h" #include "webkit/plugins/ppapi/plugin_module.h" @@ -23,36 +24,12 @@ #include "webkit/plugins/ppapi/resource.h" #include "webkit/plugins/ppapi/resource_creation_impl.h" +using ppapi::CheckIdType; +using ppapi::MakeTypedId; using ppapi::NPObjectVar; +using ppapi::PPIdType; using ppapi::Var; -enum PPIdType { - PP_ID_TYPE_MODULE, - PP_ID_TYPE_INSTANCE, - PP_ID_TYPE_RESOURCE, - PP_ID_TYPE_VAR, - PP_ID_TYPE_COUNT -}; - -static const unsigned int kPPIdTypeBits = 2; -COMPILE_ASSERT(PP_ID_TYPE_COUNT <= (1<<kPPIdTypeBits), - kPPIdTypeBits_is_too_small_for_all_id_types); - -static const int32 kMaxPPIdType = - std::numeric_limits<int32>::max() >> kPPIdTypeBits; - -template <typename T> static inline T MakeTypedId(T value, PPIdType type) { - return (value << kPPIdTypeBits) | static_cast<T>(type); -} - -template <typename T> static inline bool CheckIdType(T id, PPIdType type) { - // 0 is a valid resource. - if (!id) - return true; - const T mask = (static_cast<T>(1) << kPPIdTypeBits) - 1; - return (id & mask) == type; -} - namespace webkit { namespace ppapi { @@ -89,7 +66,7 @@ struct ResourceTracker::InstanceData { }; scoped_refptr<Resource> ResourceTracker::GetResource(PP_Resource res) const { - DLOG_IF(ERROR, !CheckIdType(res, PP_ID_TYPE_RESOURCE)) + DLOG_IF(ERROR, !CheckIdType(res, ::ppapi::PP_ID_TYPE_RESOURCE)) << res << " is not a PP_Resource."; ResourceMap::const_iterator result = live_resources_.find(res); if (result == live_resources_.end()) { @@ -103,8 +80,7 @@ ResourceTracker* ResourceTracker::global_tracker_ = NULL; ResourceTracker* ResourceTracker::singleton_override_ = NULL; ResourceTracker::ResourceTracker() - : last_resource_id_(0), - last_var_id_(0) { + : last_resource_id_(0) { // Wire up the new shared resource tracker base to use our implementation. ::ppapi::TrackerBase::Init(&GetTrackerBase); } @@ -145,11 +121,12 @@ void ResourceTracker::ResourceDestroyed(Resource* resource) { PP_Resource ResourceTracker::AddResource(Resource* resource) { // If the plugin manages to create 1 billion resources, don't do crazy stuff. if (last_resource_id_ == - (std::numeric_limits<PP_Resource>::max() >> kPPIdTypeBits)) + (std::numeric_limits<PP_Resource>::max() >> ::ppapi::kPPIdTypeBits)) return 0; // Add the resource with plugin use-count 1. - PP_Resource new_id = MakeTypedId(++last_resource_id_, PP_ID_TYPE_RESOURCE); + PP_Resource new_id = MakeTypedId(++last_resource_id_, + ::ppapi::PP_ID_TYPE_RESOURCE); live_resources_.insert(std::make_pair(new_id, std::make_pair(resource, 1))); // Track associated with the instance. @@ -160,7 +137,7 @@ PP_Resource ResourceTracker::AddResource(Resource* resource) { } bool ResourceTracker::AddRefResource(PP_Resource res) { - DLOG_IF(ERROR, !CheckIdType(res, PP_ID_TYPE_RESOURCE)) + DLOG_IF(ERROR, !CheckIdType(res, ::ppapi::PP_ID_TYPE_RESOURCE)) << res << " is not a PP_Resource."; ResourceMap::iterator i = live_resources_.find(res); if (i != live_resources_.end()) { @@ -175,7 +152,7 @@ bool ResourceTracker::AddRefResource(PP_Resource res) { } bool ResourceTracker::UnrefResource(PP_Resource res) { - DLOG_IF(ERROR, !CheckIdType(res, PP_ID_TYPE_RESOURCE)) + DLOG_IF(ERROR, !CheckIdType(res, ::ppapi::PP_ID_TYPE_RESOURCE)) << res << " is not a PP_Resource."; ResourceMap::iterator i = live_resources_.find(res); if (i != live_resources_.end()) { @@ -197,7 +174,7 @@ bool ResourceTracker::UnrefResource(PP_Resource res) { void ResourceTracker::CleanupInstanceData(PP_Instance instance, bool delete_instance) { - DLOG_IF(ERROR, !CheckIdType(instance, PP_ID_TYPE_INSTANCE)) + DLOG_IF(ERROR, !CheckIdType(instance, ::ppapi::PP_ID_TYPE_INSTANCE)) << instance << " is not a PP_Instance."; InstanceMap::iterator found = instance_map_.find(instance); if (found == instance_map_.end()) { @@ -270,7 +247,7 @@ uint32 ResourceTracker::GetLiveObjectsForInstance( ::ppapi::ResourceObjectBase* ResourceTracker::GetResourceAPI( PP_Resource res) { - DLOG_IF(ERROR, !CheckIdType(res, PP_ID_TYPE_RESOURCE)) + DLOG_IF(ERROR, !CheckIdType(res, ::ppapi::PP_ID_TYPE_RESOURCE)) << res << " is not a PP_Resource."; ResourceMap::const_iterator result = live_resources_.find(res); if (result == live_resources_.end()) @@ -327,55 +304,8 @@ PP_Instance ResourceTracker::GetInstanceForResource(PP_Resource pp_resource) { return resource->instance()->pp_instance(); } -int32 ResourceTracker::AddVar(Var* var) { - // If the plugin manages to create 1B strings... - if (last_var_id_ == kMaxPPIdType) - return 0; - - // Validate the module. - if (!GetModule(var->pp_module())) - return 0; - - // Add the resource with plugin use-count 1. - int32 new_id = MakeTypedId(++last_var_id_, PP_ID_TYPE_VAR); - live_vars_.insert(std::make_pair(new_id, std::make_pair(var, 1))); - - return new_id; -} - -scoped_refptr<Var> ResourceTracker::GetVar(int32 var_id) const { - DLOG_IF(ERROR, !CheckIdType(var_id, PP_ID_TYPE_VAR)) - << var_id << " is not a PP_Var ID."; - VarMap::const_iterator result = live_vars_.find(var_id); - if (result == live_vars_.end()) - return scoped_refptr<Var>(); - return result->second.first; -} - -bool ResourceTracker::AddRefVar(int32 var_id) { - DLOG_IF(ERROR, !CheckIdType(var_id, PP_ID_TYPE_VAR)) - << var_id << " is not a PP_Var ID."; - VarMap::iterator i = live_vars_.find(var_id); - if (i != live_vars_.end()) { - // We don't protect against overflow, since a plugin as malicious as to ref - // once per every byte in the address space could have just as well unrefed - // one time too many. - ++i->second.second; - return true; - } - return false; -} - -bool ResourceTracker::UnrefVar(int32 var_id) { - DLOG_IF(ERROR, !CheckIdType(var_id, PP_ID_TYPE_VAR)) - << var_id << " is not a PP_Var ID."; - VarMap::iterator i = live_vars_.find(var_id); - if (i != live_vars_.end()) { - if (!--i->second.second) - live_vars_.erase(i); - return true; - } - return false; +::ppapi::VarTracker* ResourceTracker::GetVarTracker() { + return &var_tracker_; } void ResourceTracker::AddNPObjectVar(NPObjectVar* object_var) { @@ -426,7 +356,7 @@ PP_Instance ResourceTracker::AddInstance(PluginInstance* instance) { PP_Instance new_instance; do { new_instance = MakeTypedId(static_cast<PP_Instance>(base::RandUint64()), - PP_ID_TYPE_INSTANCE); + ::ppapi::PP_ID_TYPE_INSTANCE); } while (!new_instance || instance_map_.find(new_instance) != instance_map_.end() || !instance->module()->ReserveInstanceID(new_instance)); @@ -445,7 +375,7 @@ void ResourceTracker::InstanceCrashed(PP_Instance instance) { } PluginInstance* ResourceTracker::GetInstance(PP_Instance instance) { - DLOG_IF(ERROR, !CheckIdType(instance, PP_ID_TYPE_INSTANCE)) + DLOG_IF(ERROR, !CheckIdType(instance, ::ppapi::PP_ID_TYPE_INSTANCE)) << instance << " is not a PP_Instance."; InstanceMap::iterator found = instance_map_.find(instance); if (found == instance_map_.end()) @@ -465,7 +395,7 @@ PP_Module ResourceTracker::AddModule(PluginModule* module) { PP_Module new_module; do { new_module = MakeTypedId(static_cast<PP_Module>(base::RandUint64()), - PP_ID_TYPE_MODULE); + ::ppapi::PP_ID_TYPE_MODULE); } while (!new_module || module_map_.find(new_module) != module_map_.end()); module_map_[new_module] = module; @@ -473,7 +403,7 @@ PP_Module ResourceTracker::AddModule(PluginModule* module) { } void ResourceTracker::ModuleDeleted(PP_Module module) { - DLOG_IF(ERROR, !CheckIdType(module, PP_ID_TYPE_MODULE)) + DLOG_IF(ERROR, !CheckIdType(module, ::ppapi::PP_ID_TYPE_MODULE)) << module << " is not a PP_Module."; ModuleMap::iterator found = module_map_.find(module); if (found == module_map_.end()) { @@ -484,7 +414,7 @@ void ResourceTracker::ModuleDeleted(PP_Module module) { } PluginModule* ResourceTracker::GetModule(PP_Module module) { - DLOG_IF(ERROR, !CheckIdType(module, PP_ID_TYPE_MODULE)) + DLOG_IF(ERROR, !CheckIdType(module, ::ppapi::PP_ID_TYPE_MODULE)) << module << " is not a PP_Module."; ModuleMap::iterator found = module_map_.find(module); if (found == module_map_.end()) diff --git a/webkit/plugins/ppapi/resource_tracker.h b/webkit/plugins/ppapi/resource_tracker.h index faf5aec..7fd445b 100644 --- a/webkit/plugins/ppapi/resource_tracker.h +++ b/webkit/plugins/ppapi/resource_tracker.h @@ -21,6 +21,7 @@ #include "ppapi/proxy/interface_id.h" #include "ppapi/shared_impl/function_group_base.h" #include "ppapi/shared_impl/tracker_base.h" +#include "ppapi/shared_impl/var_tracker.h" typedef struct NPObject NPObject; @@ -63,22 +64,17 @@ class ResourceTracker : public ::ppapi::TrackerBase { // Returns the number of resources associated with this module. uint32 GetLiveObjectsForInstance(PP_Instance instance) const; - // ResourceTrackerBase. + // TrackerBase. virtual ::ppapi::ResourceObjectBase* GetResourceAPI( PP_Resource res) OVERRIDE; virtual ::ppapi::FunctionGroupBase* GetFunctionAPI( PP_Instance pp_instance, pp::proxy::InterfaceID id) OVERRIDE; virtual PP_Instance GetInstanceForResource(PP_Resource resource) OVERRIDE; + virtual ::ppapi::VarTracker* GetVarTracker() OVERRIDE; // PP_Vars ------------------------------------------------------------------- - // TrackerBase implementation. - virtual int32 AddVar(::ppapi::Var* var) OVERRIDE; - virtual scoped_refptr< ::ppapi::Var > GetVar(int32 var_id) const OVERRIDE; - virtual bool AddRefVar(int32 var_id) OVERRIDE; - virtual bool UnrefVar(int32 var_id) OVERRIDE; - // Tracks all live NPObjectVar. This is so we can map between instance + // NPObject and get the NPObjectVar corresponding to it. This Add/Remove // function is called by the NPObjectVar when it is created and @@ -182,9 +178,10 @@ class ResourceTracker : public ::ppapi::TrackerBase { // See SetSingletonOverride above. static ResourceTracker* singleton_override_; - // Last assigned resource & var ID. + // Last assigned resource ID. PP_Resource last_resource_id_; - int32 last_var_id_; + + ::ppapi::VarTracker var_tracker_; // For each PP_Resource, keep the Resource* (as refptr) and plugin use count. // This use count is different then Resource's RefCount, and is manipulated diff --git a/webkit/plugins/ppapi/resource_tracker_unittest.cc b/webkit/plugins/ppapi/resource_tracker_unittest.cc index 89590e8..1f2720c 100644 --- a/webkit/plugins/ppapi/resource_tracker_unittest.cc +++ b/webkit/plugins/ppapi/resource_tracker_unittest.cc @@ -216,14 +216,15 @@ TEST_F(ResourceTrackerTest, ReuseVar) { } // Remove both of the refs we made above. - tracker().UnrefVar(static_cast<int32_t>(pp_object2.value.as_id)); - tracker().UnrefVar(static_cast<int32_t>(pp_object1.value.as_id)); + ::ppapi::VarTracker* var_tracker = tracker().GetVarTracker(); + var_tracker->ReleaseVar(static_cast<int32_t>(pp_object2.value.as_id)); + var_tracker->ReleaseVar(static_cast<int32_t>(pp_object1.value.as_id)); // Releasing the resource should free the internal ref, and so making a new // one now should generate a new ID. PP_Var pp_object3 = NPObjectToPPVar(instance(), npobject.get()); EXPECT_NE(pp_object1.value.as_id, pp_object3.value.as_id); - tracker().UnrefVar(static_cast<int32_t>(pp_object3.value.as_id)); + var_tracker->ReleaseVar(static_cast<int32_t>(pp_object3.value.as_id)); } } // namespace ppapi |