| Index: content/renderer/pepper/host_var_tracker.cc
|
| diff --git a/content/renderer/pepper/host_var_tracker.cc b/content/renderer/pepper/host_var_tracker.cc
|
| index 700fbaf28be3d8246c3d56965e81ba90d73c5c4b..7b603c42b88d2a9ad08b8ac605494788a706933f 100644
|
| --- a/content/renderer/pepper/host_var_tracker.cc
|
| +++ b/content/renderer/pepper/host_var_tracker.cc
|
| @@ -6,16 +6,44 @@
|
|
|
| #include "base/logging.h"
|
| #include "content/renderer/pepper/host_array_buffer_var.h"
|
| +#include "content/renderer/pepper/host_globals.h"
|
| #include "content/renderer/pepper/host_resource_var.h"
|
| -#include "content/renderer/pepper/npobject_var.h"
|
| #include "content/renderer/pepper/pepper_plugin_instance_impl.h"
|
| +#include "content/renderer/pepper/pepper_try_catch.h"
|
| +#include "content/renderer/pepper/v8object_var.h"
|
| #include "ppapi/c/pp_var.h"
|
|
|
| using ppapi::ArrayBufferVar;
|
| -using ppapi::NPObjectVar;
|
| +using ppapi::V8ObjectVar;
|
|
|
| namespace content {
|
|
|
| +HostVarTracker::V8ObjectVarKey::V8ObjectVarKey(V8ObjectVar* object_var)
|
| + : instance(object_var->instance()) {
|
| + v8::Handle<v8::Object> object = object_var->GetHandle();
|
| + hash = object.IsEmpty() ? 0 : object->GetIdentityHash();
|
| +}
|
| +
|
| +HostVarTracker::V8ObjectVarKey::V8ObjectVarKey(PP_Instance instance,
|
| + v8::Handle<v8::Object> object)
|
| + : instance(instance),
|
| + hash(object.IsEmpty() ? 0 : object->GetIdentityHash()) {}
|
| +
|
| +HostVarTracker::V8ObjectVarKey::~V8ObjectVarKey() {}
|
| +
|
| +
|
| +bool HostVarTracker::V8ObjectVarKey::operator<(
|
| + const V8ObjectVarKey& other) const {
|
| + if (instance == other.instance)
|
| + return hash < other.hash;
|
| + return instance < other.instance;
|
| +}
|
| +
|
| +bool HostVarTracker::V8ObjectVarKey::operator==(
|
| + const V8ObjectVarKey& other) const {
|
| + return instance == other.instance && hash == other.hash;
|
| +}
|
| +
|
| HostVarTracker::HostVarTracker()
|
| : VarTracker(SINGLE_THREADED), last_shared_memory_map_id_(0) {}
|
|
|
| @@ -31,74 +59,44 @@ ArrayBufferVar* HostVarTracker::CreateShmArrayBuffer(
|
| return new HostArrayBufferVar(size_in_bytes, handle);
|
| }
|
|
|
| -void HostVarTracker::AddNPObjectVar(NPObjectVar* object_var) {
|
| +void HostVarTracker::AddV8ObjectVar(V8ObjectVar* object_var) {
|
| CheckThreadingPreconditions();
|
| -
|
| - InstanceMap::iterator found_instance =
|
| - instance_map_.find(object_var->pp_instance());
|
| - if (found_instance == instance_map_.end()) {
|
| - // Lazily create the instance map.
|
| - DCHECK(object_var->pp_instance() != 0);
|
| - found_instance =
|
| - instance_map_.insert(std::make_pair(
|
| - object_var->pp_instance(),
|
| - linked_ptr<NPObjectToNPObjectVarMap>(
|
| - new NPObjectToNPObjectVarMap))).first;
|
| - }
|
| - NPObjectToNPObjectVarMap* np_object_map = found_instance->second.get();
|
| -
|
| - DCHECK(np_object_map->find(object_var->np_object()) == np_object_map->end())
|
| - << "NPObjectVar already in map";
|
| - np_object_map->insert(std::make_pair(object_var->np_object(), object_var));
|
| + PepperTryCatchVar try_catch(
|
| + HostGlobals::Get()->GetInstance(object_var->instance()), false, NULL);
|
| + DCHECK(GetForV8Object(object_var->instance(),
|
| + object_var->GetHandle()) == object_map_.end());
|
| + object_map_.insert(std::make_pair(V8ObjectVarKey(object_var), object_var));
|
| }
|
|
|
| -void HostVarTracker::RemoveNPObjectVar(NPObjectVar* object_var) {
|
| +void HostVarTracker::RemoveV8ObjectVar(V8ObjectVar* object_var) {
|
| CheckThreadingPreconditions();
|
| -
|
| - InstanceMap::iterator found_instance =
|
| - instance_map_.find(object_var->pp_instance());
|
| - if (found_instance == instance_map_.end()) {
|
| - NOTREACHED() << "NPObjectVar has invalid instance.";
|
| - return;
|
| - }
|
| - NPObjectToNPObjectVarMap* np_object_map = found_instance->second.get();
|
| -
|
| - NPObjectToNPObjectVarMap::iterator found_object =
|
| - np_object_map->find(object_var->np_object());
|
| - if (found_object == np_object_map->end()) {
|
| - NOTREACHED() << "NPObjectVar not registered.";
|
| - return;
|
| - }
|
| - if (found_object->second != object_var) {
|
| - NOTREACHED() << "NPObjectVar doesn't match.";
|
| - return;
|
| - }
|
| - np_object_map->erase(found_object);
|
| + PepperTryCatchVar try_catch(
|
| + HostGlobals::Get()->GetInstance(object_var->instance()), false, NULL);
|
| + ObjectMap::const_iterator it = GetForV8Object(object_var->instance(),
|
| + object_var->GetHandle());
|
| + DCHECK(it != object_map_.end());
|
| + object_map_.erase(it);
|
| }
|
|
|
| -NPObjectVar* HostVarTracker::NPObjectVarForNPObject(PP_Instance instance,
|
| - NPObject* np_object) {
|
| +PP_Var HostVarTracker::V8ObjectVarForV8Object(PP_Instance instance,
|
| + v8::Handle<v8::Object> object) {
|
| CheckThreadingPreconditions();
|
| -
|
| - InstanceMap::iterator found_instance = instance_map_.find(instance);
|
| - if (found_instance == instance_map_.end())
|
| - return NULL; // No such instance.
|
| - NPObjectToNPObjectVarMap* np_object_map = found_instance->second.get();
|
| -
|
| - NPObjectToNPObjectVarMap::iterator found_object =
|
| - np_object_map->find(np_object);
|
| - if (found_object == np_object_map->end())
|
| - return NULL; // No such object.
|
| - return found_object->second;
|
| + ObjectMap::const_iterator it = GetForV8Object(instance, object);
|
| + if (it == object_map_.end())
|
| + return (new V8ObjectVar(instance, object))->GetPPVar();
|
| + return it->second->GetPPVar();
|
| }
|
|
|
| -int HostVarTracker::GetLiveNPObjectVarsForInstance(PP_Instance instance) const {
|
| +int HostVarTracker::GetLiveV8ObjectVarsForInstance(PP_Instance instance) const {
|
| CheckThreadingPreconditions();
|
| -
|
| - InstanceMap::const_iterator found = instance_map_.find(instance);
|
| - if (found == instance_map_.end())
|
| - return 0;
|
| - return static_cast<int>(found->second->size());
|
| + int count = 0;
|
| + ObjectMap::const_iterator it = object_map_.lower_bound(
|
| + V8ObjectVarKey(instance, v8::Handle<v8::Object>()));
|
| + while (it != object_map_.end() && it->first.instance == instance) {
|
| + ++count;
|
| + ++it;
|
| + }
|
| + return count;
|
| }
|
|
|
| PP_Var HostVarTracker::MakeResourcePPVarFromMessage(
|
| @@ -119,24 +117,20 @@ ppapi::ResourceVar* HostVarTracker::MakeResourceVar(PP_Resource pp_resource) {
|
| void HostVarTracker::DidDeleteInstance(PP_Instance instance) {
|
| CheckThreadingPreconditions();
|
|
|
| - InstanceMap::iterator found_instance = instance_map_.find(instance);
|
| - if (found_instance == instance_map_.end())
|
| - return; // Nothing to do.
|
| - NPObjectToNPObjectVarMap* np_object_map = found_instance->second.get();
|
| -
|
| - // Force delete all var references. ForceReleaseNPObject() will cause
|
| + PepperTryCatchVar try_catch(
|
| + HostGlobals::Get()->GetInstance(instance), false, NULL);
|
| + // Force delete all var references. ForceReleaseV8Object() will cause
|
| // this object, and potentially others it references, to be removed from
|
| - // |np_object_map|.
|
| - while (!np_object_map->empty()) {
|
| - ForceReleaseNPObject(np_object_map->begin()->second);
|
| + // |live_vars_|.
|
| + ObjectMap::const_iterator it = object_map_.lower_bound(
|
| + V8ObjectVarKey(instance, v8::Handle<v8::Object>()));
|
| + while (it != object_map_.end() && it->first.instance == instance) {
|
| + ForceReleaseV8Object(it->second);
|
| + object_map_.erase(it++);
|
| }
|
| -
|
| - // Remove the record for this instance since it should be empty.
|
| - DCHECK(np_object_map->empty());
|
| - instance_map_.erase(found_instance);
|
| }
|
|
|
| -void HostVarTracker::ForceReleaseNPObject(ppapi::NPObjectVar* object_var) {
|
| +void HostVarTracker::ForceReleaseV8Object(ppapi::V8ObjectVar* object_var) {
|
| object_var->InstanceDeleted();
|
| VarMap::iterator iter = live_vars_.find(object_var->GetExistingVarID());
|
| if (iter == live_vars_.end()) {
|
| @@ -148,6 +142,20 @@ void HostVarTracker::ForceReleaseNPObject(ppapi::NPObjectVar* object_var) {
|
| DeleteObjectInfoIfNecessary(iter);
|
| }
|
|
|
| +HostVarTracker::ObjectMap::const_iterator HostVarTracker::GetForV8Object(
|
| + PP_Instance instance,
|
| + v8::Handle<v8::Object> object) const {
|
| + V8ObjectVarKey key(instance, object);
|
| + ObjectMap::const_iterator it = object_map_.lower_bound(key);
|
| +
|
| + while (it != object_map_.end() && it->first == key) {
|
| + if (object == it->second->GetHandle())
|
| + return it;
|
| + ++it;
|
| + }
|
| + return object_map_.end();
|
| +}
|
| +
|
| int HostVarTracker::TrackSharedMemoryHandle(PP_Instance instance,
|
| base::SharedMemoryHandle handle,
|
| uint32 size_in_bytes) {
|
|
|