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

Side by Side Diff: Source/bindings/v8/NPV8Object.cpp

Issue 23537048: Reduce usage of v8::Isolate::GetCurrent() in NPV8Object (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Created 7 years, 3 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 | Annotate | Revision Log
« no previous file with comments | « Source/bindings/v8/NPV8Object.h ('k') | Source/bindings/v8/ScriptController.cpp » ('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) 2004, 2006 Apple Computer, Inc. All rights reserved. 2 * Copyright (C) 2004, 2006 Apple Computer, Inc. All rights reserved.
3 * Copyright (C) 2007, 2008, 2009 Google, Inc. All rights reserved. 3 * Copyright (C) 2007, 2008, 2009 Google, Inc. All rights reserved.
4 * 4 *
5 * Redistribution and use in source and binary forms, with or without 5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions 6 * modification, are permitted provided that the following conditions
7 * are met: 7 * are met:
8 * 1. Redistributions of source code must retain the above copyright 8 * 1. 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 * 2. Redistributions in binary form must reproduce the above copyright 10 * 2. Redistributions in binary form must reproduce the above copyright
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
59 59
60 // FIXME: Comments on why use malloc and free. 60 // FIXME: Comments on why use malloc and free.
61 static NPObject* allocV8NPObject(NPP, NPClass*) 61 static NPObject* allocV8NPObject(NPP, NPClass*)
62 { 62 {
63 return static_cast<NPObject*>(malloc(sizeof(V8NPObject))); 63 return static_cast<NPObject*>(malloc(sizeof(V8NPObject)));
64 } 64 }
65 65
66 static void freeV8NPObject(NPObject* npObject) 66 static void freeV8NPObject(NPObject* npObject)
67 { 67 {
68 V8NPObject* v8NpObject = reinterpret_cast<V8NPObject*>(npObject); 68 V8NPObject* v8NpObject = reinterpret_cast<V8NPObject*>(npObject);
69 disposeUnderlyingV8Object(npObject); 69 disposeUnderlyingV8Object(npObject, v8::Isolate::GetCurrent());
70 free(v8NpObject); 70 free(v8NpObject);
71 } 71 }
72 72
73 static NPClass V8NPObjectClass = { 73 static NPClass V8NPObjectClass = {
74 NP_CLASS_STRUCT_VERSION, 74 NP_CLASS_STRUCT_VERSION,
75 allocV8NPObject, 75 allocV8NPObject,
76 freeV8NPObject, 76 freeV8NPObject,
77 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 77 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
78 }; 78 };
79 79
(...skipping 27 matching lines...) Expand all
107 char buffer[32]; 107 char buffer[32];
108 snprintf(buffer, sizeof(buffer), "%d", identifier->value.number); 108 snprintf(buffer, sizeof(buffer), "%d", identifier->value.number);
109 return v8::String::NewSymbol(buffer); 109 return v8::String::NewSymbol(buffer);
110 } 110 }
111 111
112 NPObject* v8ObjectToNPObject(v8::Handle<v8::Object> object) 112 NPObject* v8ObjectToNPObject(v8::Handle<v8::Object> object)
113 { 113 {
114 return reinterpret_cast<NPObject*>(object->GetAlignedPointerFromInternalFiel d(v8DOMWrapperObjectIndex)); 114 return reinterpret_cast<NPObject*>(object->GetAlignedPointerFromInternalFiel d(v8DOMWrapperObjectIndex));
115 } 115 }
116 116
117 NPObject* npCreateV8ScriptObject(NPP npp, v8::Handle<v8::Object> object, DOMWind ow* root) 117 NPObject* npCreateV8ScriptObject(NPP npp, v8::Handle<v8::Object> object, DOMWind ow* root, v8::Isolate* isolate)
118 { 118 {
119 // Check to see if this object is already wrapped. 119 // Check to see if this object is already wrapped.
120 if (object->InternalFieldCount() == npObjectInternalFieldCount) { 120 if (object->InternalFieldCount() == npObjectInternalFieldCount) {
121 WrapperTypeInfo* typeInfo = static_cast<WrapperTypeInfo*>(object->GetAli gnedPointerFromInternalField(v8DOMWrapperTypeIndex)); 121 WrapperTypeInfo* typeInfo = static_cast<WrapperTypeInfo*>(object->GetAli gnedPointerFromInternalField(v8DOMWrapperTypeIndex));
122 if (typeInfo == npObjectTypeInfo()) { 122 if (typeInfo == npObjectTypeInfo()) {
123 NPObject* returnValue = v8ObjectToNPObject(object); 123 NPObject* returnValue = v8ObjectToNPObject(object);
124 _NPN_RetainObject(returnValue); 124 _NPN_RetainObject(returnValue);
125 return returnValue; 125 return returnValue;
126 } 126 }
127 } 127 }
(...skipping 16 matching lines...) Expand all
144 } else { 144 } else {
145 iter = v8NPObjectMap->set(v8ObjectHash, V8NPObjectVector()).iterator ; 145 iter = v8NPObjectMap->set(v8ObjectHash, V8NPObjectVector()).iterator ;
146 } 146 }
147 objectVector = &iter->value; 147 objectVector = &iter->value;
148 } 148 }
149 149
150 V8NPObject* v8npObject = reinterpret_cast<V8NPObject*>(_NPN_CreateObject(npp , &V8NPObjectClass)); 150 V8NPObject* v8npObject = reinterpret_cast<V8NPObject*>(_NPN_CreateObject(npp , &V8NPObjectClass));
151 // This is uninitialized memory, we need to clear it so that 151 // This is uninitialized memory, we need to clear it so that
152 // Persistent::Reset won't try to Dispose anything bogus. 152 // Persistent::Reset won't try to Dispose anything bogus.
153 v8npObject->v8Object.Clear(); 153 v8npObject->v8Object.Clear();
154 v8npObject->v8Object.Reset(v8::Isolate::GetCurrent(), object); 154 v8npObject->v8Object.Reset(isolate, object);
155 v8npObject->rootObject = root; 155 v8npObject->rootObject = root;
156 156
157 if (objectVector) 157 if (objectVector)
158 objectVector->append(v8npObject); 158 objectVector->append(v8npObject);
159 159
160 return reinterpret_cast<NPObject*>(v8npObject); 160 return reinterpret_cast<NPObject*>(v8npObject);
161 } 161 }
162 162
163 V8NPObject* npObjectToV8NPObject(NPObject* npObject) 163 V8NPObject* npObjectToV8NPObject(NPObject* npObject)
164 { 164 {
165 if (npObject->_class != &V8NPObjectClass) 165 if (npObject->_class != &V8NPObjectClass)
166 return 0; 166 return 0;
167 V8NPObject* v8NpObject = reinterpret_cast<V8NPObject*>(npObject); 167 V8NPObject* v8NpObject = reinterpret_cast<V8NPObject*>(npObject);
168 if (v8NpObject->v8Object.IsEmpty()) 168 if (v8NpObject->v8Object.IsEmpty())
169 return 0; 169 return 0;
170 return v8NpObject; 170 return v8NpObject;
171 } 171 }
172 172
173 void disposeUnderlyingV8Object(NPObject* npObject) 173 void disposeUnderlyingV8Object(NPObject* npObject, v8::Isolate* isolate)
174 { 174 {
175 ASSERT(npObject); 175 ASSERT(npObject);
176 V8NPObject* v8NpObject = npObjectToV8NPObject(npObject); 176 V8NPObject* v8NpObject = npObjectToV8NPObject(npObject);
177 if (!v8NpObject) 177 if (!v8NpObject)
178 return; 178 return;
179 v8::Isolate* isolate = v8::Isolate::GetCurrent();
180 v8::HandleScope scope(isolate); 179 v8::HandleScope scope(isolate);
181 v8::Handle<v8::Object> v8Object = v8::Local<v8::Object>::New(isolate, v8NpOb ject->v8Object); 180 v8::Handle<v8::Object> v8Object = v8::Local<v8::Object>::New(isolate, v8NpOb ject->v8Object);
182 ASSERT(!v8Object->CreationContext().IsEmpty()); 181 ASSERT(!v8Object->CreationContext().IsEmpty());
183 if (V8PerContextData* perContextData = V8PerContextData::from(v8Object->Crea tionContext())) { 182 if (V8PerContextData* perContextData = V8PerContextData::from(v8Object->Crea tionContext())) {
184 V8NPObjectMap* v8NPObjectMap = perContextData->v8NPObjectMap(); 183 V8NPObjectMap* v8NPObjectMap = perContextData->v8NPObjectMap();
185 int v8ObjectHash = v8Object->GetIdentityHash(); 184 int v8ObjectHash = v8Object->GetIdentityHash();
186 ASSERT(v8ObjectHash); 185 ASSERT(v8ObjectHash);
187 V8NPObjectMap::iterator iter = v8NPObjectMap->find(v8ObjectHash); 186 V8NPObjectMap::iterator iter = v8NPObjectMap->find(v8ObjectHash);
188 if (iter != v8NPObjectMap->end()) { 187 if (iter != v8NPObjectMap->end()) {
189 V8NPObjectVector& objects = iter->value; 188 V8NPObjectVector& objects = iter->value;
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
258 // Call the function object. 257 // Call the function object.
259 v8::Handle<v8::Function> function = v8::Handle<v8::Function>::Cast(functionO bject); 258 v8::Handle<v8::Function> function = v8::Handle<v8::Function>::Cast(functionO bject);
260 OwnArrayPtr<v8::Handle<v8::Value> > argv = createValueListFromVariantArgs(ar guments, argumentCount, npObject, isolate); 259 OwnArrayPtr<v8::Handle<v8::Value> > argv = createValueListFromVariantArgs(ar guments, argumentCount, npObject, isolate);
261 v8::Local<v8::Value> resultObject = frame->script()->callFunction(function, v8Object, argumentCount, argv.get()); 260 v8::Local<v8::Value> resultObject = frame->script()->callFunction(function, v8Object, argumentCount, argv.get());
262 261
263 // If we had an error, return false. The spec is a little unclear here, but says "Returns true if the method was 262 // If we had an error, return false. The spec is a little unclear here, but says "Returns true if the method was
264 // successfully invoked". If we get an error return value, was that success fully invoked? 263 // successfully invoked". If we get an error return value, was that success fully invoked?
265 if (resultObject.IsEmpty()) 264 if (resultObject.IsEmpty())
266 return false; 265 return false;
267 266
268 convertV8ObjectToNPVariant(resultObject, npObject, result); 267 convertV8ObjectToNPVariant(resultObject, npObject, result, isolate);
269 return true; 268 return true;
270 } 269 }
271 270
272 // FIXME: Fix it same as _NPN_Invoke (HandleScope and such). 271 // FIXME: Fix it same as _NPN_Invoke (HandleScope and such).
273 bool _NPN_InvokeDefault(NPP npp, NPObject* npObject, const NPVariant* arguments, uint32_t argumentCount, NPVariant* result) 272 bool _NPN_InvokeDefault(NPP npp, NPObject* npObject, const NPVariant* arguments, uint32_t argumentCount, NPVariant* result)
274 { 273 {
275 if (!npObject) 274 if (!npObject)
276 return false; 275 return false;
277 276
278 v8::Isolate* isolate = v8::Isolate::GetCurrent(); 277 v8::Isolate* isolate = v8::Isolate::GetCurrent();
(...skipping 29 matching lines...) Expand all
308 ASSERT(frame); 307 ASSERT(frame);
309 308
310 OwnArrayPtr<v8::Handle<v8::Value> > argv = createValueListFromVariantArg s(arguments, argumentCount, npObject, isolate); 309 OwnArrayPtr<v8::Handle<v8::Value> > argv = createValueListFromVariantArg s(arguments, argumentCount, npObject, isolate);
311 resultObject = frame->script()->callFunction(function, functionObject, a rgumentCount, argv.get()); 310 resultObject = frame->script()->callFunction(function, functionObject, a rgumentCount, argv.get());
312 } 311 }
313 // If we had an error, return false. The spec is a little unclear here, but says "Returns true if the method was 312 // If we had an error, return false. The spec is a little unclear here, but says "Returns true if the method was
314 // successfully invoked". If we get an error return value, was that success fully invoked? 313 // successfully invoked". If we get an error return value, was that success fully invoked?
315 if (resultObject.IsEmpty()) 314 if (resultObject.IsEmpty())
316 return false; 315 return false;
317 316
318 convertV8ObjectToNPVariant(resultObject, npObject, result); 317 convertV8ObjectToNPVariant(resultObject, npObject, result, isolate);
319 return true; 318 return true;
320 } 319 }
321 320
322 bool _NPN_Evaluate(NPP npp, NPObject* npObject, NPString* npScript, NPVariant* r esult) 321 bool _NPN_Evaluate(NPP npp, NPObject* npObject, NPString* npScript, NPVariant* r esult)
323 { 322 {
324 // FIXME: Give the embedder a way to control this. 323 // FIXME: Give the embedder a way to control this.
325 bool popupsAllowed = false; 324 bool popupsAllowed = false;
326 return _NPN_EvaluateHelper(npp, popupsAllowed, npObject, npScript, result); 325 return _NPN_EvaluateHelper(npp, popupsAllowed, npObject, npScript, result);
327 } 326 }
328 327
329 bool _NPN_EvaluateHelper(NPP npp, bool popupsAllowed, NPObject* npObject, NPStri ng* npScript, NPVariant* result) 328 bool _NPN_EvaluateHelper(NPP npp, bool popupsAllowed, NPObject* npObject, NPStri ng* npScript, NPVariant* result)
330 { 329 {
331 VOID_TO_NPVARIANT(*result); 330 VOID_TO_NPVARIANT(*result);
332 if (!npObject) 331 if (!npObject)
333 return false; 332 return false;
334 333
335 V8NPObject* v8NpObject = npObjectToV8NPObject(npObject); 334 V8NPObject* v8NpObject = npObjectToV8NPObject(npObject);
336 if (!v8NpObject) 335 if (!v8NpObject)
337 return false; 336 return false;
338 337
339 v8::HandleScope handleScope(v8::Isolate::GetCurrent()); 338 v8::Isolate* isolate = v8::Isolate::GetCurrent();
339 v8::HandleScope handleScope(isolate);
340 v8::Handle<v8::Context> context = toV8Context(npp, npObject); 340 v8::Handle<v8::Context> context = toV8Context(npp, npObject);
341 if (context.IsEmpty()) 341 if (context.IsEmpty())
342 return false; 342 return false;
343 343
344 v8::Context::Scope scope(context); 344 v8::Context::Scope scope(context);
345 ExceptionCatcher exceptionCatcher; 345 ExceptionCatcher exceptionCatcher;
346 346
347 // FIXME: Is this branch still needed after switching to using UserGestureIn dicator? 347 // FIXME: Is this branch still needed after switching to using UserGestureIn dicator?
348 String filename; 348 String filename;
349 if (!popupsAllowed) 349 if (!popupsAllowed)
350 filename = "npscript"; 350 filename = "npscript";
351 351
352 Frame* frame = v8NpObject->rootObject->frame(); 352 Frame* frame = v8NpObject->rootObject->frame();
353 ASSERT(frame); 353 ASSERT(frame);
354 354
355 String script = String::fromUTF8(npScript->UTF8Characters, npScript->UTF8Len gth); 355 String script = String::fromUTF8(npScript->UTF8Characters, npScript->UTF8Len gth);
356 356
357 UserGestureIndicator gestureIndicator(popupsAllowed ? DefinitelyProcessingNe wUserGesture : PossiblyProcessingUserGesture); 357 UserGestureIndicator gestureIndicator(popupsAllowed ? DefinitelyProcessingNe wUserGesture : PossiblyProcessingUserGesture);
358 v8::Local<v8::Value> v8result = frame->script()->compileAndRunScript(ScriptS ourceCode(script, KURL(ParsedURLString, filename))); 358 v8::Local<v8::Value> v8result = frame->script()->compileAndRunScript(ScriptS ourceCode(script, KURL(ParsedURLString, filename)));
359 359
360 if (v8result.IsEmpty()) 360 if (v8result.IsEmpty())
361 return false; 361 return false;
362 362
363 if (_NPN_IsAlive(npObject)) 363 if (_NPN_IsAlive(npObject))
364 convertV8ObjectToNPVariant(v8result, npObject, result); 364 convertV8ObjectToNPVariant(v8result, npObject, result, isolate);
365 return true; 365 return true;
366 } 366 }
367 367
368 bool _NPN_GetProperty(NPP npp, NPObject* npObject, NPIdentifier propertyName, NP Variant* result) 368 bool _NPN_GetProperty(NPP npp, NPObject* npObject, NPIdentifier propertyName, NP Variant* result)
369 { 369 {
370 if (!npObject) 370 if (!npObject)
371 return false; 371 return false;
372 372
373 if (V8NPObject* object = npObjectToV8NPObject(npObject)) { 373 if (V8NPObject* object = npObjectToV8NPObject(npObject)) {
374 v8::Isolate* isolate = v8::Isolate::GetCurrent(); 374 v8::Isolate* isolate = v8::Isolate::GetCurrent();
375 v8::HandleScope handleScope(isolate); 375 v8::HandleScope handleScope(isolate);
376 v8::Handle<v8::Context> context = toV8Context(npp, npObject); 376 v8::Handle<v8::Context> context = toV8Context(npp, npObject);
377 if (context.IsEmpty()) 377 if (context.IsEmpty())
378 return false; 378 return false;
379 379
380 v8::Context::Scope scope(context); 380 v8::Context::Scope scope(context);
381 ExceptionCatcher exceptionCatcher; 381 ExceptionCatcher exceptionCatcher;
382 382
383 v8::Handle<v8::Object> obj = v8::Local<v8::Object>::New(isolate, object- >v8Object); 383 v8::Handle<v8::Object> obj = v8::Local<v8::Object>::New(isolate, object- >v8Object);
384 v8::Local<v8::Value> v8result = obj->Get(npIdentifierToV8Identifier(prop ertyName)); 384 v8::Local<v8::Value> v8result = obj->Get(npIdentifierToV8Identifier(prop ertyName));
385 385
386 if (v8result.IsEmpty()) 386 if (v8result.IsEmpty())
387 return false; 387 return false;
388 388
389 convertV8ObjectToNPVariant(v8result, npObject, result); 389 convertV8ObjectToNPVariant(v8result, npObject, result, isolate);
390 return true; 390 return true;
391 } 391 }
392 392
393 if (npObject->_class->hasProperty && npObject->_class->getProperty) { 393 if (npObject->_class->hasProperty && npObject->_class->getProperty) {
394 if (npObject->_class->hasProperty(npObject, propertyName)) 394 if (npObject->_class->hasProperty(npObject, propertyName))
395 return npObject->_class->getProperty(npObject, propertyName, result) ; 395 return npObject->_class->getProperty(npObject, propertyName, result) ;
396 } 396 }
397 397
398 VOID_TO_NPVARIANT(*result); 398 VOID_TO_NPVARIANT(*result);
399 return false; 399 return false;
(...skipping 196 matching lines...) Expand 10 before | Expand all | Expand 10 after
596 if (!ctor->IsNull()) { 596 if (!ctor->IsNull()) {
597 Frame* frame = object->rootObject->frame(); 597 Frame* frame = object->rootObject->frame();
598 ASSERT(frame); 598 ASSERT(frame);
599 OwnArrayPtr<v8::Handle<v8::Value> > argv = createValueListFromVarian tArgs(arguments, argumentCount, npObject, isolate); 599 OwnArrayPtr<v8::Handle<v8::Value> > argv = createValueListFromVarian tArgs(arguments, argumentCount, npObject, isolate);
600 resultObject = V8ObjectConstructor::newInstanceInDocument(ctor, argu mentCount, argv.get(), frame ? frame->document() : 0); 600 resultObject = V8ObjectConstructor::newInstanceInDocument(ctor, argu mentCount, argv.get(), frame ? frame->document() : 0);
601 } 601 }
602 602
603 if (resultObject.IsEmpty()) 603 if (resultObject.IsEmpty())
604 return false; 604 return false;
605 605
606 convertV8ObjectToNPVariant(resultObject, npObject, result); 606 convertV8ObjectToNPVariant(resultObject, npObject, result, isolate);
607 return true; 607 return true;
608 } 608 }
609 609
610 if (NP_CLASS_STRUCT_VERSION_HAS_CTOR(npObject->_class) && npObject->_class-> construct) 610 if (NP_CLASS_STRUCT_VERSION_HAS_CTOR(npObject->_class) && npObject->_class-> construct)
611 return npObject->_class->construct(npObject, arguments, argumentCount, r esult); 611 return npObject->_class->construct(npObject, arguments, argumentCount, r esult);
612 612
613 return false; 613 return false;
614 } 614 }
OLDNEW
« no previous file with comments | « Source/bindings/v8/NPV8Object.h ('k') | Source/bindings/v8/ScriptController.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698