diff options
author | brettw@chromium.org <brettw@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-08-09 23:14:13 +0000 |
---|---|---|
committer | brettw@chromium.org <brettw@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-08-09 23:14:13 +0000 |
commit | 2bbd2c670008e30aaaef6c3c25ae37e0c17f8c3f (patch) | |
tree | 79595eeb026dd29841a7380fd7753f992c2e466b /webkit | |
parent | 32131b9030d8313f7adc9b765f706ffbee7ca709 (diff) | |
download | chromium_src-2bbd2c670008e30aaaef6c3c25ae37e0c17f8c3f.zip chromium_src-2bbd2c670008e30aaaef6c3c25ae37e0c17f8c3f.tar.gz chromium_src-2bbd2c670008e30aaaef6c3c25ae37e0c17f8c3f.tar.bz2 |
Unify var tracking between webkit and the proxy.
This replaces the var tracking in the proxy with the var tracking in the
shared_impl that's used by the implementation. It adds a new ProxyObjectVar
to be the proxied plugin analog of NPObjectVar in the impl. This new object
just keeps track of the host data.
The tricky part is to make the var tracker able to do all the crazy messaging.
This adds some virtual functions to the shared var tracker that we override
in the plugin in PluginVarTracker.
This removes the calls to the GetLiveObjectsForInstance in the var deprecated
test. It turns out this function really can't be implemented properly in the
proxy, and I don't know why it even worked before. A Release() call posts a
non-nestable task so the object isn't released until later. So to implement
the proxy for GetLiveObjectsForInstance we would also need to post a
non-nestable task. But when the test runs we're getting called from within
the plugin, so blocking on a non-nestable task deadlocks. So I just gave up
and deleted the parts of the test that uses it.
TEST=included
BUG=none
Review URL: http://codereview.chromium.org/7578001
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@96094 0039d316-1c4b-4281-b951-d872f2087c98
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 |