NPObject* npCreateV8ScriptObject(NPP npp, v8::Handle<v8::Object> object, DOMWindow* root, v8::Isolate* isolate) { // Check to see if this object is already wrapped. if (object->InternalFieldCount() == npObjectInternalFieldCount) { const WrapperTypeInfo* typeInfo = static_cast<const WrapperTypeInfo*>(object->GetAlignedPointerFromInternalField(v8DOMWrapperTypeIndex)); if (typeInfo == npObjectTypeInfo()) { NPObject* returnValue = v8ObjectToNPObject(object); _NPN_RetainObject(returnValue); return returnValue; } } V8NPObjectVector* objectVector = 0; if (V8PerContextData* perContextData = V8PerContextData::from(object->CreationContext())) { int v8ObjectHash = object->GetIdentityHash(); ASSERT(v8ObjectHash); V8NPObjectMap* v8NPObjectMap = perContextData->v8NPObjectMap(); V8NPObjectMap::iterator iter = v8NPObjectMap->find(v8ObjectHash); if (iter != v8NPObjectMap->end()) { V8NPObjectVector& objects = iter->value; for (size_t index = 0; index < objects.size(); ++index) { V8NPObject* v8npObject = objects.at(index); if (v8npObject->v8Object == object && v8npObject->rootObject == root) { _NPN_RetainObject(&v8npObject->object); return reinterpret_cast<NPObject*>(v8npObject); } } } else { iter = v8NPObjectMap->set(v8ObjectHash, V8NPObjectVector()).iterator; } objectVector = &iter->value; } V8NPObject* v8npObject = reinterpret_cast<V8NPObject*>(_NPN_CreateObject(npp, &V8NPObjectClass)); // This is uninitialized memory, we need to clear it so that // Persistent::Reset won't try to Dispose anything bogus. v8npObject->v8Object.Clear(); v8npObject->v8Object.Reset(isolate, object); v8npObject->rootObject = root; if (objectVector) objectVector->append(v8npObject); return reinterpret_cast<NPObject*>(v8npObject); }
NPObject* npCreateV8ScriptObject(NPP npp, v8::Handle<v8::Object> object, DOMWindow* root) { // Check to see if this object is already wrapped. if (object->InternalFieldCount() == npObjectInternalFieldCount) { WrapperTypeInfo* typeInfo = static_cast<WrapperTypeInfo*>(object->GetAlignedPointerFromInternalField(v8DOMWrapperTypeIndex)); if (typeInfo == npObjectTypeInfo()) { NPObject* returnValue = v8ObjectToNPObject(object); _NPN_RetainObject(returnValue); return returnValue; } } V8NPObjectVector* objectVector = 0; if (V8PerContextData* perContextData = V8PerContextData::from(object->CreationContext())) { int v8ObjectHash = object->GetIdentityHash(); ASSERT(v8ObjectHash); V8NPObjectMap* v8NPObjectMap = perContextData->v8NPObjectMap(); V8NPObjectMap::iterator iter = v8NPObjectMap->find(v8ObjectHash); if (iter != v8NPObjectMap->end()) { V8NPObjectVector& objects = iter->value; for (size_t index = 0; index < objects.size(); ++index) { V8NPObject* v8npObject = objects.at(index); if (v8npObject->v8Object == object && v8npObject->rootObject == root) { _NPN_RetainObject(&v8npObject->object); return reinterpret_cast<NPObject*>(v8npObject); } } } else { iter = v8NPObjectMap->set(v8ObjectHash, V8NPObjectVector()).iterator; } objectVector = &iter->value; } V8NPObject* v8npObject = reinterpret_cast<V8NPObject*>(_NPN_CreateObject(npp, &V8NPObjectClass)); v8npObject->v8Object = v8::Persistent<v8::Object>::New(v8::Isolate::GetCurrent(), object); v8npObject->rootObject = root; if (objectVector) objectVector->append(v8npObject); return reinterpret_cast<NPObject*>(v8npObject); }