| OLD | NEW |
| 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 * Copyright (C) 2014 Opera Software ASA. All rights reserved. | 4 * Copyright (C) 2014 Opera Software ASA. All rights reserved. |
| 5 * | 5 * |
| 6 * Redistribution and use in source and binary forms, with or without | 6 * Redistribution and use in source and binary forms, with or without |
| 7 * modification, are permitted provided that the following conditions | 7 * modification, are permitted provided that the following conditions |
| 8 * are met: | 8 * are met: |
| 9 * 1. Redistributions of source code must retain the above copyright | 9 * 1. Redistributions of source code must retain the above copyright |
| 10 * notice, this list of conditions and the following disclaimer. | 10 * notice, this list of conditions and the following disclaimer. |
| (...skipping 239 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 250 | 250 |
| 251 // FIXME: should use the plugin's owner frame as the security context. | 251 // FIXME: should use the plugin's owner frame as the security context. |
| 252 ScriptState* scriptState = mainWorldScriptState(isolate, npp, npObject); | 252 ScriptState* scriptState = mainWorldScriptState(isolate, npp, npObject); |
| 253 if (!scriptState) | 253 if (!scriptState) |
| 254 return false; | 254 return false; |
| 255 | 255 |
| 256 ScriptState::Scope scope(scriptState); | 256 ScriptState::Scope scope(scriptState); |
| 257 ExceptionCatcher exceptionCatcher; | 257 ExceptionCatcher exceptionCatcher; |
| 258 | 258 |
| 259 v8::Local<v8::Object> v8Object = v8::Local<v8::Object>::New(isolate, v8NpObj
ect->v8Object); | 259 v8::Local<v8::Object> v8Object = v8::Local<v8::Object>::New(isolate, v8NpObj
ect->v8Object); |
| 260 v8::Local<v8::Value> functionObject = v8Object->Get(v8AtomicString(isolate,
identifier->value.string)); | 260 v8::Local<v8::Value> functionObject; |
| 261 if (functionObject.IsEmpty() || functionObject->IsNull()) { | 261 if (!v8Object->Get(scriptState->context(), v8AtomicString(scriptState->isola
te(), identifier->value.string)).ToLocal(&functionObject) || functionObject->IsN
ull()) { |
| 262 NULL_TO_NPVARIANT(*result); | 262 NULL_TO_NPVARIANT(*result); |
| 263 return false; | 263 return false; |
| 264 } | 264 } |
| 265 if (functionObject->IsUndefined()) { | 265 if (functionObject->IsUndefined()) { |
| 266 VOID_TO_NPVARIANT(*result); | 266 VOID_TO_NPVARIANT(*result); |
| 267 return false; | 267 return false; |
| 268 } | 268 } |
| 269 | 269 |
| 270 LocalFrame* frame = v8NpObject->rootObject->frame(); | 270 LocalFrame* frame = v8NpObject->rootObject->frame(); |
| 271 ASSERT(frame); | 271 ASSERT(frame); |
| (...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 390 if (V8NPObject* object = npObjectToV8NPObject(npObject)) { | 390 if (V8NPObject* object = npObjectToV8NPObject(npObject)) { |
| 391 v8::Isolate* isolate = v8::Isolate::GetCurrent(); | 391 v8::Isolate* isolate = v8::Isolate::GetCurrent(); |
| 392 ScriptState* scriptState = mainWorldScriptState(isolate, npp, npObject); | 392 ScriptState* scriptState = mainWorldScriptState(isolate, npp, npObject); |
| 393 if (!scriptState) | 393 if (!scriptState) |
| 394 return false; | 394 return false; |
| 395 | 395 |
| 396 ScriptState::Scope scope(scriptState); | 396 ScriptState::Scope scope(scriptState); |
| 397 ExceptionCatcher exceptionCatcher; | 397 ExceptionCatcher exceptionCatcher; |
| 398 | 398 |
| 399 v8::Local<v8::Object> obj = v8::Local<v8::Object>::New(isolate, object->
v8Object); | 399 v8::Local<v8::Object> obj = v8::Local<v8::Object>::New(isolate, object->
v8Object); |
| 400 v8::Local<v8::Value> v8result = obj->Get(npIdentifierToV8Identifier(isol
ate, propertyName)); | 400 v8::Local<v8::Value> v8result; |
| 401 | 401 if (!obj->Get(scriptState->context(), npIdentifierToV8Identifier(scriptS
tate->isolate(), propertyName)).ToLocal(&v8result)) |
| 402 if (v8result.IsEmpty()) | |
| 403 return false; | 402 return false; |
| 404 | 403 |
| 405 convertV8ObjectToNPVariant(isolate, v8result, npObject, result); | 404 convertV8ObjectToNPVariant(isolate, v8result, npObject, result); |
| 406 return true; | 405 return true; |
| 407 } | 406 } |
| 408 | 407 |
| 409 if (npObject->_class->hasProperty && npObject->_class->getProperty) { | 408 if (npObject->_class->hasProperty && npObject->_class->getProperty) { |
| 410 if (npObject->_class->hasProperty(npObject, propertyName)) | 409 if (npObject->_class->hasProperty(npObject, propertyName)) |
| 411 return npObject->_class->getProperty(npObject, propertyName, result)
; | 410 return npObject->_class->getProperty(npObject, propertyName, result)
; |
| 412 } | 411 } |
| (...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 491 | 490 |
| 492 if (V8NPObject* object = npObjectToV8NPObject(npObject)) { | 491 if (V8NPObject* object = npObjectToV8NPObject(npObject)) { |
| 493 v8::Isolate* isolate = v8::Isolate::GetCurrent(); | 492 v8::Isolate* isolate = v8::Isolate::GetCurrent(); |
| 494 ScriptState* scriptState = mainWorldScriptState(isolate, npp, npObject); | 493 ScriptState* scriptState = mainWorldScriptState(isolate, npp, npObject); |
| 495 if (!scriptState) | 494 if (!scriptState) |
| 496 return false; | 495 return false; |
| 497 ScriptState::Scope scope(scriptState); | 496 ScriptState::Scope scope(scriptState); |
| 498 ExceptionCatcher exceptionCatcher; | 497 ExceptionCatcher exceptionCatcher; |
| 499 | 498 |
| 500 v8::Local<v8::Object> obj = v8::Local<v8::Object>::New(isolate, object->
v8Object); | 499 v8::Local<v8::Object> obj = v8::Local<v8::Object>::New(isolate, object->
v8Object); |
| 501 v8::Local<v8::Value> prop = obj->Get(npIdentifierToV8Identifier(isolate,
methodName)); | 500 v8::Local<v8::Value> prop; |
| 501 if (!obj->Get(scriptState->context(), npIdentifierToV8Identifier(scriptS
tate->isolate(), methodName)).ToLocal(&prop)) |
| 502 return false; |
| 502 return prop->IsFunction(); | 503 return prop->IsFunction(); |
| 503 } | 504 } |
| 504 | 505 |
| 505 if (npObject->_class->hasMethod) | 506 if (npObject->_class->hasMethod) |
| 506 return npObject->_class->hasMethod(npObject, methodName); | 507 return npObject->_class->hasMethod(npObject, methodName); |
| 507 return false; | 508 return false; |
| 508 } | 509 } |
| 509 | 510 |
| 510 void _NPN_SetException(NPObject* npObject, const NPUTF8 *message) | 511 void _NPN_SetException(NPObject* npObject, const NPUTF8 *message) |
| 511 { | 512 { |
| (...skipping 14 matching lines...) Expand all Loading... |
| 526 | 527 |
| 527 V8ThrowException::throwGeneralError(isolate, message); | 528 V8ThrowException::throwGeneralError(isolate, message); |
| 528 } | 529 } |
| 529 | 530 |
| 530 bool _NPN_Enumerate(NPP npp, NPObject* npObject, NPIdentifier** identifier, uint
32_t* count) | 531 bool _NPN_Enumerate(NPP npp, NPObject* npObject, NPIdentifier** identifier, uint
32_t* count) |
| 531 { | 532 { |
| 532 if (!npObject) | 533 if (!npObject) |
| 533 return false; | 534 return false; |
| 534 | 535 |
| 535 if (V8NPObject* object = npObjectToV8NPObject(npObject)) { | 536 if (V8NPObject* object = npObjectToV8NPObject(npObject)) { |
| 536 v8::Isolate* isolate = v8::Isolate::GetCurrent(); | 537 ScriptState* scriptState = mainWorldScriptState(v8::Isolate::GetCurrent(
), npp, npObject); |
| 537 ScriptState* scriptState = mainWorldScriptState(isolate, npp, npObject); | |
| 538 if (!scriptState) | 538 if (!scriptState) |
| 539 return false; | 539 return false; |
| 540 ScriptState::Scope scope(scriptState); | 540 ScriptState::Scope scope(scriptState); |
| 541 ExceptionCatcher exceptionCatcher; | 541 ExceptionCatcher exceptionCatcher; |
| 542 | 542 |
| 543 v8::Local<v8::Object> obj = v8::Local<v8::Object>::New(isolate, object->
v8Object); | 543 v8::Local<v8::Object> obj = v8::Local<v8::Object>::New(scriptState->isol
ate(), object->v8Object); |
| 544 | 544 |
| 545 // FIXME: http://b/issue?id=1210340: Use a v8::Object::Keys() method whe
n it exists, instead of evaluating javascript. | 545 // FIXME: http://b/issue?id=1210340: Use a v8::Object::Keys() method whe
n it exists, instead of evaluating javascript. |
| 546 | 546 |
| 547 // FIXME: Figure out how to cache this helper function. Run a helper fu
nction that collects the properties | 547 // FIXME: Figure out how to cache this helper function. Run a helper fu
nction that collects the properties |
| 548 // on the object into an array. | 548 // on the object into an array. |
| 549 const char enumeratorCode[] = | 549 const char enumeratorCode[] = |
| 550 "(function (obj) {" | 550 "(function (obj) {" |
| 551 " var props = [];" | 551 " var props = [];" |
| 552 " for (var prop in obj) {" | 552 " for (var prop in obj) {" |
| 553 " props[props.length] = prop;" | 553 " props[props.length] = prop;" |
| 554 " }" | 554 " }" |
| 555 " return props;" | 555 " return props;" |
| 556 "});"; | 556 "});"; |
| 557 v8::Local<v8::String> source = v8AtomicString(isolate, enumeratorCode); | 557 v8::Local<v8::String> source = v8AtomicString(scriptState->isolate(), en
umeratorCode); |
| 558 v8::Local<v8::Value> result; | 558 v8::Local<v8::Value> result; |
| 559 if (!V8ScriptRunner::compileAndRunInternalScript(source, isolate).ToLoca
l(&result)) | 559 if (!V8ScriptRunner::compileAndRunInternalScript(source, scriptState->is
olate()).ToLocal(&result)) |
| 560 return false; | 560 return false; |
| 561 ASSERT(result->IsFunction()); | 561 ASSERT(result->IsFunction()); |
| 562 v8::Local<v8::Function> enumerator = v8::Local<v8::Function>::Cast(resul
t); | 562 v8::Local<v8::Function> enumerator = v8::Local<v8::Function>::Cast(resul
t); |
| 563 v8::Local<v8::Value> argv[] = { obj }; | 563 v8::Local<v8::Value> argv[] = { obj }; |
| 564 v8::Local<v8::Value> propsObj; | 564 v8::Local<v8::Value> propsObj; |
| 565 if (!V8ScriptRunner::callInternalFunction(enumerator, v8::Local<v8::Obje
ct>::Cast(result), WTF_ARRAY_LENGTH(argv), argv, isolate).ToLocal(&propsObj)) | 565 if (!V8ScriptRunner::callInternalFunction(enumerator, v8::Local<v8::Obje
ct>::Cast(result), WTF_ARRAY_LENGTH(argv), argv, scriptState->isolate()).ToLocal
(&propsObj)) |
| 566 return false; | 566 return false; |
| 567 | 567 |
| 568 // Convert the results into an array of NPIdentifiers. | 568 // Convert the results into an array of NPIdentifiers. |
| 569 v8::Local<v8::Array> props = v8::Local<v8::Array>::Cast(propsObj); | 569 v8::Local<v8::Array> props = v8::Local<v8::Array>::Cast(propsObj); |
| 570 *count = props->Length(); | 570 *count = props->Length(); |
| 571 *identifier = static_cast<NPIdentifier*>(calloc(*count, sizeof(NPIdentif
ier))); | 571 *identifier = static_cast<NPIdentifier*>(calloc(*count, sizeof(NPIdentif
ier))); |
| 572 for (uint32_t i = 0; i < *count; ++i) { | 572 for (uint32_t i = 0; i < *count; ++i) { |
| 573 v8::Local<v8::Value> name = props->Get(v8::Integer::New(isolate, i))
; | 573 v8::Local<v8::Value> name; |
| 574 if (!props->Get(scriptState->context(), v8::Integer::New(scriptState
->isolate(), i)).ToLocal(&name)) |
| 575 return false; |
| 574 (*identifier)[i] = getStringIdentifier(v8::Local<v8::String>::Cast(n
ame)); | 576 (*identifier)[i] = getStringIdentifier(v8::Local<v8::String>::Cast(n
ame)); |
| 575 } | 577 } |
| 576 return true; | 578 return true; |
| 577 } | 579 } |
| 578 | 580 |
| 579 if (NP_CLASS_STRUCT_VERSION_HAS_ENUM(npObject->_class) && npObject->_class->
enumerate) | 581 if (NP_CLASS_STRUCT_VERSION_HAS_ENUM(npObject->_class) && npObject->_class->
enumerate) |
| 580 return npObject->_class->enumerate(npObject, identifier, count); | 582 return npObject->_class->enumerate(npObject, identifier, count); |
| 581 | 583 |
| 582 return false; | 584 return false; |
| 583 } | 585 } |
| 584 | 586 |
| 585 bool _NPN_Construct(NPP npp, NPObject* npObject, const NPVariant* arguments, uin
t32_t argumentCount, NPVariant* result) | 587 bool _NPN_Construct(NPP npp, NPObject* npObject, const NPVariant* arguments, uin
t32_t argumentCount, NPVariant* result) |
| 586 { | 588 { |
| 587 if (!npObject) | 589 if (!npObject) |
| 588 return false; | 590 return false; |
| 589 | 591 |
| 590 v8::Isolate* isolate = v8::Isolate::GetCurrent(); | |
| 591 | |
| 592 if (V8NPObject* object = npObjectToV8NPObject(npObject)) { | 592 if (V8NPObject* object = npObjectToV8NPObject(npObject)) { |
| 593 ScriptState* scriptState = mainWorldScriptState(isolate, npp, npObject); | 593 ScriptState* scriptState = mainWorldScriptState(v8::Isolate::GetCurrent(
), npp, npObject); |
| 594 if (!scriptState) | 594 if (!scriptState) |
| 595 return false; | 595 return false; |
| 596 ScriptState::Scope scope(scriptState); | 596 ScriptState::Scope scope(scriptState); |
| 597 ExceptionCatcher exceptionCatcher; | 597 ExceptionCatcher exceptionCatcher; |
| 598 | 598 |
| 599 // Lookup the constructor function. | 599 // Lookup the constructor function. |
| 600 v8::Local<v8::Object> ctorObj = v8::Local<v8::Object>::New(isolate, obje
ct->v8Object); | 600 v8::Local<v8::Object> ctorObj = v8::Local<v8::Object>::New(scriptState->
isolate(), object->v8Object); |
| 601 if (!ctorObj->IsFunction()) | 601 if (!ctorObj->IsFunction()) |
| 602 return false; | 602 return false; |
| 603 | 603 |
| 604 // Call the constructor. | 604 // Call the constructor. |
| 605 v8::Local<v8::Value> resultObject; | 605 v8::Local<v8::Value> resultObject; |
| 606 v8::Local<v8::Function> ctor = v8::Local<v8::Function>::Cast(ctorObj); | 606 v8::Local<v8::Function> ctor = v8::Local<v8::Function>::Cast(ctorObj); |
| 607 if (!ctor->IsNull()) { | 607 if (!ctor->IsNull()) { |
| 608 LocalFrame* frame = object->rootObject->frame(); | 608 LocalFrame* frame = object->rootObject->frame(); |
| 609 ASSERT(frame); | 609 ASSERT(frame); |
| 610 OwnPtr<v8::Local<v8::Value>[]> argv = createValueListFromVariantArgs
(arguments, argumentCount, npObject, isolate); | 610 OwnPtr<v8::Local<v8::Value>[]> argv = createValueListFromVariantArgs
(arguments, argumentCount, npObject, scriptState->isolate()); |
| 611 resultObject = V8ObjectConstructor::newInstanceInDocument(isolate, c
tor, argumentCount, argv.get(), frame ? frame->document() : 0); | 611 resultObject = V8ObjectConstructor::newInstanceInDocument(scriptStat
e->isolate(), ctor, argumentCount, argv.get(), frame ? frame->document() : 0); |
| 612 } | 612 } |
| 613 | 613 |
| 614 if (resultObject.IsEmpty()) | 614 if (resultObject.IsEmpty()) |
| 615 return false; | 615 return false; |
| 616 | 616 |
| 617 convertV8ObjectToNPVariant(isolate, resultObject, npObject, result); | 617 convertV8ObjectToNPVariant(scriptState->isolate(), resultObject, npObjec
t, result); |
| 618 return true; | 618 return true; |
| 619 } | 619 } |
| 620 | 620 |
| 621 if (NP_CLASS_STRUCT_VERSION_HAS_CTOR(npObject->_class) && npObject->_class->
construct) | 621 if (NP_CLASS_STRUCT_VERSION_HAS_CTOR(npObject->_class) && npObject->_class->
construct) |
| 622 return npObject->_class->construct(npObject, arguments, argumentCount, r
esult); | 622 return npObject->_class->construct(npObject, arguments, argumentCount, r
esult); |
| 623 | 623 |
| 624 return false; | 624 return false; |
| 625 } | 625 } |
| OLD | NEW |