Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1090)

Side by Side Diff: Source/bindings/core/v8/V8NPObject.cpp

Issue 1071963002: Replace Handle<> with Local<> in bindings/core/v8 (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Created 5 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « Source/bindings/core/v8/V8IteratorResultValue.cpp ('k') | Source/bindings/core/v8/V8NPUtils.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2006, 2007, 2008, 2009 Google Inc. All rights reserved. 2 * Copyright (C) 2006, 2007, 2008, 2009 Google Inc. All rights reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are 5 * modification, are permitted provided that the following conditions are
6 * met: 6 * met:
7 * 7 *
8 * * Redistributions of source code must retain the above copyright 8 * * Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer. 9 * notice, this list of conditions and the following disclaimer.
10 * * Redistributions in binary form must reproduce the above 10 * * Redistributions in binary form must reproduce the above
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after
111 for (int i = 0; i < numArgs; i++) 111 for (int i = 0; i < numArgs; i++)
112 convertV8ObjectToNPVariant(isolate, info[i], npObject, &npArgs[i]); 112 convertV8ObjectToNPVariant(isolate, info[i], npObject, &npArgs[i]);
113 113
114 NPVariant result; 114 NPVariant result;
115 VOID_TO_NPVARIANT(result); 115 VOID_TO_NPVARIANT(result);
116 116
117 bool retval = true; 117 bool retval = true;
118 switch (functionId) { 118 switch (functionId) {
119 case InvokeMethod: 119 case InvokeMethod:
120 if (npObject->_class->invoke) { 120 if (npObject->_class->invoke) {
121 v8::Handle<v8::String> functionName = v8::Handle<v8::String>::Cast(i nfo.Data()); 121 v8::Local<v8::String> functionName = v8::Local<v8::String>::Cast(inf o.Data());
122 NPIdentifier identifier = getStringIdentifier(functionName); 122 NPIdentifier identifier = getStringIdentifier(functionName);
123 retval = npObject->_class->invoke(npObject, identifier, npArgs.get() , numArgs, &result); 123 retval = npObject->_class->invoke(npObject, identifier, npArgs.get() , numArgs, &result);
124 } 124 }
125 break; 125 break;
126 case InvokeConstruct: 126 case InvokeConstruct:
127 if (npObject->_class->construct) 127 if (npObject->_class->construct)
128 retval = npObject->_class->construct(npObject, npArgs.get(), numArgs , &result); 128 retval = npObject->_class->construct(npObject, npArgs.get(), numArgs , &result);
129 break; 129 break;
130 case InvokeDefault: 130 case InvokeDefault:
131 if (npObject->_class->invokeDefault) 131 if (npObject->_class->invokeDefault)
132 retval = npObject->_class->invokeDefault(npObject, npArgs.get(), num Args, &result); 132 retval = npObject->_class->invokeDefault(npObject, npArgs.get(), num Args, &result);
133 break; 133 break;
134 default: 134 default:
135 break; 135 break;
136 } 136 }
137 137
138 if (!retval) 138 if (!retval)
139 V8ThrowException::throwGeneralError(isolate, "Error calling method on NP Object."); 139 V8ThrowException::throwGeneralError(isolate, "Error calling method on NP Object.");
140 140
141 for (int i = 0; i < numArgs; i++) 141 for (int i = 0; i < numArgs; i++)
142 _NPN_ReleaseVariantValue(&npArgs[i]); 142 _NPN_ReleaseVariantValue(&npArgs[i]);
143 143
144 // Unwrap return values. 144 // Unwrap return values.
145 v8::Handle<v8::Value> returnValue; 145 v8::Local<v8::Value> returnValue;
146 if (_NPN_IsAlive(npObject)) 146 if (_NPN_IsAlive(npObject))
147 returnValue = convertNPVariantToV8Object(isolate, &result, npObject); 147 returnValue = convertNPVariantToV8Object(isolate, &result, npObject);
148 _NPN_ReleaseVariantValue(&result); 148 _NPN_ReleaseVariantValue(&result);
149 149
150 v8SetReturnValue(info, returnValue); 150 v8SetReturnValue(info, returnValue);
151 } 151 }
152 152
153 153
154 void npObjectMethodHandler(const v8::FunctionCallbackInfo<v8::Value>& info) 154 void npObjectMethodHandler(const v8::FunctionCallbackInfo<v8::Value>& info)
155 { 155 {
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
196 class V8NPTemplateMap { 196 class V8NPTemplateMap {
197 public: 197 public:
198 // NPIdentifier is PrivateIdentifier*. 198 // NPIdentifier is PrivateIdentifier*.
199 typedef v8::PersistentValueMap<PrivateIdentifier*, v8::FunctionTemplate, V8T emplateMapTraits> MapType; 199 typedef v8::PersistentValueMap<PrivateIdentifier*, v8::FunctionTemplate, V8T emplateMapTraits> MapType;
200 200
201 v8::Local<v8::FunctionTemplate> get(PrivateIdentifier* key) 201 v8::Local<v8::FunctionTemplate> get(PrivateIdentifier* key)
202 { 202 {
203 return m_map.Get(key); 203 return m_map.Get(key);
204 } 204 }
205 205
206 void set(PrivateIdentifier* key, v8::Handle<v8::FunctionTemplate> handle) 206 void set(PrivateIdentifier* key, v8::Local<v8::FunctionTemplate> handle)
207 { 207 {
208 ASSERT(!m_map.Contains(key)); 208 ASSERT(!m_map.Contains(key));
209 m_map.Set(key, handle); 209 m_map.Set(key, handle);
210 } 210 }
211 211
212 static V8NPTemplateMap& sharedInstance(v8::Isolate* isolate) 212 static V8NPTemplateMap& sharedInstance(v8::Isolate* isolate)
213 { 213 {
214 DEFINE_STATIC_LOCAL(V8NPTemplateMap, map, (isolate)); 214 DEFINE_STATIC_LOCAL(V8NPTemplateMap, map, (isolate));
215 ASSERT(isolate == map.m_map.GetIsolate()); 215 ASSERT(isolate == map.m_map.GetIsolate());
216 return map; 216 return map;
217 } 217 }
218 218
219 friend class V8TemplateMapTraits; 219 friend class V8TemplateMapTraits;
220 220
221 private: 221 private:
222 explicit V8NPTemplateMap(v8::Isolate* isolate) 222 explicit V8NPTemplateMap(v8::Isolate* isolate)
223 : m_map(isolate) 223 : m_map(isolate)
224 { 224 {
225 } 225 }
226 226
227 MapType m_map; 227 MapType m_map;
228 }; 228 };
229 229
230 V8TemplateMapTraits::MapType* V8TemplateMapTraits::MapFromWeakCallbackData(const v8::WeakCallbackData<v8::FunctionTemplate, WeakCallbackDataType>& data) 230 V8TemplateMapTraits::MapType* V8TemplateMapTraits::MapFromWeakCallbackData(const v8::WeakCallbackData<v8::FunctionTemplate, WeakCallbackDataType>& data)
231 { 231 {
232 return &V8NPTemplateMap::sharedInstance(data.GetIsolate()).m_map; 232 return &V8NPTemplateMap::sharedInstance(data.GetIsolate()).m_map;
233 } 233 }
234 234
235 235
236 static v8::Handle<v8::Value> npObjectGetProperty(v8::Local<v8::Object> self, NPI dentifier identifier, v8::Local<v8::Value> key, v8::Isolate* isolate) 236 static v8::Local<v8::Value> npObjectGetProperty(v8::Local<v8::Object> self, NPId entifier identifier, v8::Local<v8::Value> key, v8::Isolate* isolate)
237 { 237 {
238 NPObject* npObject = v8ObjectToNPObject(self); 238 NPObject* npObject = v8ObjectToNPObject(self);
239 239
240 // Verify that our wrapper wasn't using a NPObject which 240 // Verify that our wrapper wasn't using a NPObject which
241 // has already been deleted. 241 // has already been deleted.
242 if (!npObject || !_NPN_IsAlive(npObject)) 242 if (!npObject || !_NPN_IsAlive(npObject))
243 return V8ThrowException::throwReferenceError(isolate, "NPObject deleted" ); 243 return V8ThrowException::throwReferenceError(isolate, "NPObject deleted" );
244 244
245 245
246 if (npObject->_class->hasProperty && npObject->_class->getProperty && npObje ct->_class->hasProperty(npObject, identifier)) { 246 if (npObject->_class->hasProperty && npObject->_class->getProperty && npObje ct->_class->hasProperty(npObject, identifier)) {
247 if (!_NPN_IsAlive(npObject)) 247 if (!_NPN_IsAlive(npObject))
248 return V8ThrowException::throwReferenceError(isolate, "NPObject dele ted"); 248 return V8ThrowException::throwReferenceError(isolate, "NPObject dele ted");
249 249
250 NPVariant result; 250 NPVariant result;
251 VOID_TO_NPVARIANT(result); 251 VOID_TO_NPVARIANT(result);
252 if (!npObject->_class->getProperty(npObject, identifier, &result)) 252 if (!npObject->_class->getProperty(npObject, identifier, &result))
253 return v8Undefined(); 253 return v8Undefined();
254 254
255 v8::Handle<v8::Value> returnValue; 255 v8::Local<v8::Value> returnValue;
256 if (_NPN_IsAlive(npObject)) 256 if (_NPN_IsAlive(npObject))
257 returnValue = convertNPVariantToV8Object(isolate, &result, npObject) ; 257 returnValue = convertNPVariantToV8Object(isolate, &result, npObject) ;
258 _NPN_ReleaseVariantValue(&result); 258 _NPN_ReleaseVariantValue(&result);
259 return returnValue; 259 return returnValue;
260 260
261 } 261 }
262 262
263 if (!_NPN_IsAlive(npObject)) 263 if (!_NPN_IsAlive(npObject))
264 return V8ThrowException::throwReferenceError(isolate, "NPObject deleted" ); 264 return V8ThrowException::throwReferenceError(isolate, "NPObject deleted" );
265 265
266 if (key->IsString() && npObject->_class->hasMethod && npObject->_class->hasM ethod(npObject, identifier)) { 266 if (key->IsString() && npObject->_class->hasMethod && npObject->_class->hasM ethod(npObject, identifier)) {
267 if (!_NPN_IsAlive(npObject)) 267 if (!_NPN_IsAlive(npObject))
268 return V8ThrowException::throwReferenceError(isolate, "NPObject dele ted"); 268 return V8ThrowException::throwReferenceError(isolate, "NPObject dele ted");
269 269
270 PrivateIdentifier* id = static_cast<PrivateIdentifier*>(identifier); 270 PrivateIdentifier* id = static_cast<PrivateIdentifier*>(identifier);
271 v8::Local<v8::FunctionTemplate> functionTemplate = V8NPTemplateMap::shar edInstance(isolate).get(id); 271 v8::Local<v8::FunctionTemplate> functionTemplate = V8NPTemplateMap::shar edInstance(isolate).get(id);
272 // Cache templates using identifier as the key. 272 // Cache templates using identifier as the key.
273 if (functionTemplate.IsEmpty()) { 273 if (functionTemplate.IsEmpty()) {
274 // Create a new template. 274 // Create a new template.
275 functionTemplate = v8::FunctionTemplate::New(isolate); 275 functionTemplate = v8::FunctionTemplate::New(isolate);
276 functionTemplate->SetCallHandler(npObjectMethodHandler, key); 276 functionTemplate->SetCallHandler(npObjectMethodHandler, key);
277 V8NPTemplateMap::sharedInstance(isolate).set(id, functionTemplate); 277 V8NPTemplateMap::sharedInstance(isolate).set(id, functionTemplate);
278 } 278 }
279 v8::Local<v8::Function> v8Function = functionTemplate->GetFunction(); 279 v8::Local<v8::Function> v8Function = functionTemplate->GetFunction();
280 v8Function->SetName(v8::Handle<v8::String>::Cast(key)); 280 v8Function->SetName(v8::Local<v8::String>::Cast(key));
281 return v8Function; 281 return v8Function;
282 } 282 }
283 283
284 return v8Undefined(); 284 return v8Undefined();
285 } 285 }
286 286
287 void npObjectNamedPropertyGetter(v8::Local<v8::String> name, const v8::PropertyC allbackInfo<v8::Value>& info) 287 void npObjectNamedPropertyGetter(v8::Local<v8::String> name, const v8::PropertyC allbackInfo<v8::Value>& info)
288 { 288 {
289 NPIdentifier identifier = getStringIdentifier(name); 289 NPIdentifier identifier = getStringIdentifier(name);
290 v8SetReturnValue(info, npObjectGetProperty(info.Holder(), identifier, name, info.GetIsolate())); 290 v8SetReturnValue(info, npObjectGetProperty(info.Holder(), identifier, name, info.GetIsolate()));
(...skipping 18 matching lines...) Expand all
309 } 309 }
310 310
311 void npObjectQueryProperty(v8::Local<v8::String> name, const v8::PropertyCallbac kInfo<v8::Integer>& info) 311 void npObjectQueryProperty(v8::Local<v8::String> name, const v8::PropertyCallbac kInfo<v8::Integer>& info)
312 { 312 {
313 NPIdentifier identifier = getStringIdentifier(name); 313 NPIdentifier identifier = getStringIdentifier(name);
314 if (npObjectGetProperty(info.Holder(), identifier, name, info.GetIsolate()). IsEmpty()) 314 if (npObjectGetProperty(info.Holder(), identifier, name, info.GetIsolate()). IsEmpty())
315 return; 315 return;
316 v8SetReturnValueInt(info, 0); 316 v8SetReturnValueInt(info, 0);
317 } 317 }
318 318
319 static v8::Handle<v8::Value> npObjectSetProperty(v8::Local<v8::Object> self, NPI dentifier identifier, v8::Local<v8::Value> value, v8::Isolate* isolate) 319 static v8::Local<v8::Value> npObjectSetProperty(v8::Local<v8::Object> self, NPId entifier identifier, v8::Local<v8::Value> value, v8::Isolate* isolate)
320 { 320 {
321 NPObject* npObject = v8ObjectToNPObject(self); 321 NPObject* npObject = v8ObjectToNPObject(self);
322 322
323 // Verify that our wrapper wasn't using a NPObject which has already been de leted. 323 // Verify that our wrapper wasn't using a NPObject which has already been de leted.
324 if (!npObject || !_NPN_IsAlive(npObject)) { 324 if (!npObject || !_NPN_IsAlive(npObject)) {
325 V8ThrowException::throwReferenceError(isolate, "NPObject deleted"); 325 V8ThrowException::throwReferenceError(isolate, "NPObject deleted");
326 return value; // Intercepted, but an exception was thrown. 326 return value; // Intercepted, but an exception was thrown.
327 } 327 }
328 328
329 if (npObject->_class->hasProperty && npObject->_class->setProperty && npObje ct->_class->hasProperty(npObject, identifier)) { 329 if (npObject->_class->hasProperty && npObject->_class->setProperty && npObje ct->_class->hasProperty(npObject, identifier)) {
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
381 if (NP_CLASS_STRUCT_VERSION_HAS_ENUM(npObject->_class) && npObject->_class-> enumerate) { 381 if (NP_CLASS_STRUCT_VERSION_HAS_ENUM(npObject->_class) && npObject->_class-> enumerate) {
382 uint32_t count; 382 uint32_t count;
383 NPIdentifier* identifiers; 383 NPIdentifier* identifiers;
384 if (npObject->_class->enumerate(npObject, &identifiers, &count)) { 384 if (npObject->_class->enumerate(npObject, &identifiers, &count)) {
385 uint32_t propertiesCount = 0; 385 uint32_t propertiesCount = 0;
386 for (uint32_t i = 0; i < count; ++i) { 386 for (uint32_t i = 0; i < count; ++i) {
387 IdentifierRep* identifier = static_cast<IdentifierRep*>(identifi ers[i]); 387 IdentifierRep* identifier = static_cast<IdentifierRep*>(identifi ers[i]);
388 if (namedProperty == identifier->m_isString) 388 if (namedProperty == identifier->m_isString)
389 ++propertiesCount; 389 ++propertiesCount;
390 } 390 }
391 v8::Handle<v8::Array> properties = v8::Array::New(info.GetIsolate(), propertiesCount); 391 v8::Local<v8::Array> properties = v8::Array::New(info.GetIsolate(), propertiesCount);
392 for (uint32_t i = 0, propertyIndex = 0; i < count; ++i) { 392 for (uint32_t i = 0, propertyIndex = 0; i < count; ++i) {
393 IdentifierRep* identifier = static_cast<IdentifierRep*>(identifi ers[i]); 393 IdentifierRep* identifier = static_cast<IdentifierRep*>(identifi ers[i]);
394 if (namedProperty == identifier->m_isString) { 394 if (namedProperty == identifier->m_isString) {
395 ASSERT(propertyIndex < propertiesCount); 395 ASSERT(propertyIndex < propertiesCount);
396 if (namedProperty) 396 if (namedProperty)
397 properties->Set(v8::Integer::New(info.GetIsolate(), prop ertyIndex++), v8AtomicString(info.GetIsolate(), identifier->string())); 397 properties->Set(v8::Integer::New(info.GetIsolate(), prop ertyIndex++), v8AtomicString(info.GetIsolate(), identifier->string()));
398 else 398 else
399 properties->Set(v8::Integer::New(info.GetIsolate(), prop ertyIndex++), v8::Integer::New(info.GetIsolate(), identifier->number())); 399 properties->Set(v8::Integer::New(info.GetIsolate(), prop ertyIndex++), v8::Integer::New(info.GetIsolate(), identifier->number()));
400 } 400 }
401 } 401 }
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
438 static v8::Eternal<v8::FunctionTemplate> npObjectDesc; 438 static v8::Eternal<v8::FunctionTemplate> npObjectDesc;
439 439
440 ASSERT(isolate->InContext()); 440 ASSERT(isolate->InContext());
441 441
442 // If this is a v8 object, just return it. 442 // If this is a v8 object, just return it.
443 V8NPObject* v8NPObject = npObjectToV8NPObject(object); 443 V8NPObject* v8NPObject = npObjectToV8NPObject(object);
444 if (v8NPObject) 444 if (v8NPObject)
445 return v8::Local<v8::Object>::New(isolate, v8NPObject->v8Object); 445 return v8::Local<v8::Object>::New(isolate, v8NPObject->v8Object);
446 446
447 // If we've already wrapped this object, just return it. 447 // If we've already wrapped this object, just return it.
448 v8::Handle<v8::Object> wrapper = staticNPObjectMap().newLocal(object, isolat e); 448 v8::Local<v8::Object> wrapper = staticNPObjectMap().newLocal(object, isolate );
449 if (!wrapper.IsEmpty()) 449 if (!wrapper.IsEmpty())
450 return wrapper; 450 return wrapper;
451 451
452 // FIXME: we should create a Wrapper type as a subclass of JSObject. It has two internal fields, field 0 is the wrapped 452 // FIXME: we should create a Wrapper type as a subclass of JSObject. It has two internal fields, field 0 is the wrapped
453 // pointer, and field 1 is the type. There should be an api function that re turns unused type id. The same Wrapper type 453 // pointer, and field 1 is the type. There should be an api function that re turns unused type id. The same Wrapper type
454 // can be used by DOM bindings. 454 // can be used by DOM bindings.
455 if (npObjectDesc.IsEmpty()) { 455 if (npObjectDesc.IsEmpty()) {
456 v8::Local<v8::FunctionTemplate> templ = v8::FunctionTemplate::New(isolat e); 456 v8::Local<v8::FunctionTemplate> templ = v8::FunctionTemplate::New(isolat e);
457 templ->InstanceTemplate()->SetInternalFieldCount(npObjectInternalFieldCo unt); 457 templ->InstanceTemplate()->SetInternalFieldCount(npObjectInternalFieldCo unt);
458 templ->InstanceTemplate()->SetNamedPropertyHandler(npObjectNamedProperty Getter, npObjectNamedPropertySetter, npObjectQueryProperty, 0, npObjectNamedProp ertyEnumerator); 458 templ->InstanceTemplate()->SetNamedPropertyHandler(npObjectNamedProperty Getter, npObjectNamedPropertySetter, npObjectQueryProperty, 0, npObjectNamedProp ertyEnumerator);
459 templ->InstanceTemplate()->SetIndexedPropertyHandler(npObjectIndexedProp ertyGetter, npObjectIndexedPropertySetter, 0, 0, npObjectIndexedPropertyEnumerat or); 459 templ->InstanceTemplate()->SetIndexedPropertyHandler(npObjectIndexedProp ertyGetter, npObjectIndexedPropertySetter, 0, 0, npObjectIndexedPropertyEnumerat or);
460 templ->InstanceTemplate()->SetCallAsFunctionHandler(npObjectInvokeDefaul tHandler); 460 templ->InstanceTemplate()->SetCallAsFunctionHandler(npObjectInvokeDefaul tHandler);
461 npObjectDesc.Set(isolate, templ); 461 npObjectDesc.Set(isolate, templ);
462 } 462 }
463 463
464 // FIXME: Move staticNPObjectMap() to DOMDataStore. 464 // FIXME: Move staticNPObjectMap() to DOMDataStore.
465 // Use V8DOMWrapper::createWrapper() and 465 // Use V8DOMWrapper::createWrapper() and
466 // V8DOMWrapper::associateObjectWithWrapper() 466 // V8DOMWrapper::associateObjectWithWrapper()
467 // to create a wrapper object. 467 // to create a wrapper object.
468 v8::Handle<v8::Function> v8Function = npObjectDesc.Get(isolate)->GetFunction (); 468 v8::Local<v8::Function> v8Function = npObjectDesc.Get(isolate)->GetFunction( );
469 v8::Local<v8::Object> value = V8ObjectConstructor::newInstance(isolate, v8Fu nction); 469 v8::Local<v8::Object> value = V8ObjectConstructor::newInstance(isolate, v8Fu nction);
470 if (value.IsEmpty()) 470 if (value.IsEmpty())
471 return value; 471 return value;
472 472
473 V8DOMWrapper::setNativeInfo(value, npObjectTypeInfo(), npObjectToScriptWrapp able(object)); 473 V8DOMWrapper::setNativeInfo(value, npObjectTypeInfo(), npObjectToScriptWrapp able(object));
474 474
475 // KJS retains the object as part of its wrapper (see Bindings::CInstance). 475 // KJS retains the object as part of its wrapper (see Bindings::CInstance).
476 _NPN_RetainObject(object); 476 _NPN_RetainObject(object);
477 _NPN_RegisterObject(object, root); 477 _NPN_RegisterObject(object, root);
478 478
479 staticNPObjectMap().set(object, value, npObjectTypeInfo()); 479 staticNPObjectMap().set(object, value, npObjectTypeInfo());
480 ASSERT(V8DOMWrapper::hasInternalFieldsSet(value)); 480 ASSERT(V8DOMWrapper::hasInternalFieldsSet(value));
481 return value; 481 return value;
482 } 482 }
483 483
484 void forgetV8ObjectForNPObject(NPObject* object) 484 void forgetV8ObjectForNPObject(NPObject* object)
485 { 485 {
486 v8::Isolate* isolate = v8::Isolate::GetCurrent(); 486 v8::Isolate* isolate = v8::Isolate::GetCurrent();
487 v8::HandleScope scope(isolate); 487 v8::HandleScope scope(isolate);
488 v8::Handle<v8::Object> wrapper = staticNPObjectMap().newLocal(object, isolat e); 488 v8::Local<v8::Object> wrapper = staticNPObjectMap().newLocal(object, isolate );
489 if (!wrapper.IsEmpty()) { 489 if (!wrapper.IsEmpty()) {
490 V8DOMWrapper::clearNativeInfo(wrapper, npObjectTypeInfo()); 490 V8DOMWrapper::clearNativeInfo(wrapper, npObjectTypeInfo());
491 staticNPObjectMap().removeAndDispose(object); 491 staticNPObjectMap().removeAndDispose(object);
492 _NPN_ReleaseObject(object); 492 _NPN_ReleaseObject(object);
493 } 493 }
494 } 494 }
495 495
496 } // namespace blink 496 } // namespace blink
OLDNEW
« no previous file with comments | « Source/bindings/core/v8/V8IteratorResultValue.cpp ('k') | Source/bindings/core/v8/V8NPUtils.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698