v8::Handle<v8::Object> JS_NewFxDynamicObj(IJS_Runtime* pJSRuntime, IFXJS_Context* pJSContext, int nObjDefnID) { v8::Isolate* isolate = (v8::Isolate*)pJSRuntime; v8::Isolate::Scope isolate_scope(isolate); if(-1 == nObjDefnID) { v8::Local<v8::ObjectTemplate> objTempl = v8::ObjectTemplate::New(isolate); return objTempl->NewInstance(); } CFX_PtrArray* pArray = (CFX_PtrArray*)isolate->GetData(0); if(!pArray) return v8::Handle<v8::Object>(); if(nObjDefnID<0 || nObjDefnID>= pArray->GetSize()) return v8::Handle<v8::Object>(); CJS_ObjDefintion* pObjDef = (CJS_ObjDefintion*)pArray->GetAt(nObjDefnID); v8::Local<v8::Context> context = isolate->GetCurrentContext(); v8::Local<v8::ObjectTemplate> objTemp = v8::Local<v8::ObjectTemplate>::New(isolate, pObjDef->m_objTemplate); v8::Local<v8::Object> obj = objTemp->NewInstance(); CJS_PrivateData* pPrivateData = new CJS_PrivateData; pPrivateData->ObjDefID = nObjDefnID; obj->SetAlignedPointerInInternalField(0, pPrivateData); if(pObjDef->m_pConstructor) pObjDef->m_pConstructor(pJSContext, obj, context->Global()->GetPrototype()->ToObject()); return obj; }
CJS_Runtime::CJS_Runtime(CPDFSDK_FormFillEnvironment* pFormFillEnv) : m_pFormFillEnv(pFormFillEnv), m_bBlocking(false), m_isolateManaged(false) { v8::Isolate* pIsolate = nullptr; IPDF_JSPLATFORM* pPlatform = m_pFormFillEnv->GetFormFillInfo()->m_pJsPlatform; if (pPlatform->version <= 2) { unsigned int embedderDataSlot = 0; v8::Isolate* pExternalIsolate = nullptr; if (pPlatform->version == 2) { pExternalIsolate = reinterpret_cast<v8::Isolate*>(pPlatform->m_isolate); embedderDataSlot = pPlatform->m_v8EmbedderSlot; } FXJS_Initialize(embedderDataSlot, pExternalIsolate); } m_isolateManaged = FXJS_GetIsolate(&pIsolate); SetIsolate(pIsolate); #ifdef PDF_ENABLE_XFA v8::Isolate::Scope isolate_scope(pIsolate); v8::HandleScope handle_scope(pIsolate); #endif if (m_isolateManaged || FXJS_GlobalIsolateRefCount() == 0) DefineJSObjects(); IJS_EventContext* pContext = NewEventContext(); InitializeEngine(); ReleaseEventContext(pContext); SetFormFillEnvToDocument(); }
FX_BOOL CJS_Runtime::GetValueByName(const CFX_ByteStringC& utf8Name, CFXJSE_Value* pValue) { const FX_CHAR* name = utf8Name.c_str(); v8::Isolate::Scope isolate_scope(GetIsolate()); v8::HandleScope handle_scope(GetIsolate()); v8::Local<v8::Context> old_context = GetIsolate()->GetCurrentContext(); v8::Local<v8::Context> context = v8::Local<v8::Context>::New(GetIsolate(), m_context); v8::Context::Scope context_scope(context); // Caution: We're about to hand to XFA an object that in order to invoke // methods will require that the current v8::Context always has a pointer // to a CJS_Runtime in its embedder data slot. Unfortunately, XFA creates // its own v8::Context which has not initialized the embedder data slot. // Do so now. // TODO(tsepez): redesign PDF-side objects to not rely on v8::Context's // embedder data slots, and/or to always use the right context. FXJS_SetRuntimeForV8Context(old_context, this); v8::Local<v8::Value> propvalue = context->Global()->Get(v8::String::NewFromUtf8( GetIsolate(), name, v8::String::kNormalString, utf8Name.GetLength())); if (propvalue.IsEmpty()) { pValue->SetUndefined(); return FALSE; } pValue->ForceSetValue(propvalue); return TRUE; }
void JS_ReleaseRuntime(IJS_Runtime* pJSRuntime, v8::Persistent<v8::Context>& v8PersistentContext) { v8::Isolate* isolate = (v8::Isolate*)pJSRuntime; v8::Isolate::Scope isolate_scope(isolate); v8::HandleScope handle_scope(isolate); v8::Local<v8::Context> context = v8::Local<v8::Context>::New(isolate, v8PersistentContext); v8::Context::Scope context_scope(context); CFX_PtrArray* pArray = (CFX_PtrArray*)isolate->GetData(0); if(!pArray) return ; for(int i=0; i<pArray->GetSize(); i++) { CJS_ObjDefintion* pObjDef = (CJS_ObjDefintion*)pArray->GetAt(i); if(!pObjDef->m_StaticObj.IsEmpty()) { v8::Local<v8::Object> pObj = v8::Local<v8::Object>::New(isolate, pObjDef->m_StaticObj); if(pObjDef->m_pDestructor) pObjDef->m_pDestructor(pObj); JS_FreePrivate(pObj); } delete pObjDef; } delete pArray; isolate->SetData(0,NULL); }
v8::Local<v8::Object> FXJS_NewFxDynamicObj(v8::Isolate* pIsolate, IJS_Runtime* pIRuntime, int nObjDefnID) { v8::Isolate::Scope isolate_scope(pIsolate); v8::Local<v8::Context> context = pIsolate->GetCurrentContext(); if (nObjDefnID == -1) { v8::Local<v8::ObjectTemplate> objTempl = v8::ObjectTemplate::New(pIsolate); v8::Local<v8::Object> obj; if (!objTempl->NewInstance(context).ToLocal(&obj)) return v8::Local<v8::Object>(); return obj; } FXJS_PerIsolateData* pData = FXJS_PerIsolateData::Get(pIsolate); if (!pData) return v8::Local<v8::Object>(); if (nObjDefnID < 0 || nObjDefnID >= CFXJS_ObjDefinition::MaxID(pIsolate)) return v8::Local<v8::Object>(); CFXJS_ObjDefinition* pObjDef = CFXJS_ObjDefinition::ForID(pIsolate, nObjDefnID); v8::Local<v8::Object> obj; if (!pObjDef->GetInstanceTemplate()->NewInstance(context).ToLocal(&obj)) return v8::Local<v8::Object>(); obj->SetAlignedPointerInInternalField(0, new CFXJS_PerObjectData(nObjDefnID)); if (pObjDef->m_pConstructor) pObjDef->m_pConstructor(pIRuntime, obj); return obj; }
void FXJS_ReleaseRuntime(v8::Isolate* pIsolate, v8::Global<v8::Context>& v8PersistentContext) { v8::Isolate::Scope isolate_scope(pIsolate); v8::HandleScope handle_scope(pIsolate); v8::Local<v8::Context> context = v8::Local<v8::Context>::New(pIsolate, v8PersistentContext); v8::Context::Scope context_scope(context); FXJS_PerIsolateData* pData = FXJS_PerIsolateData::Get(pIsolate); if (!pData) return; int maxID = CFXJS_ObjDefinition::MaxID(pIsolate); for (int i = 0; i < maxID; ++i) { CFXJS_ObjDefinition* pObjDef = CFXJS_ObjDefinition::ForID(pIsolate, i); if (!pObjDef->m_StaticObj.IsEmpty()) { v8::Local<v8::Object> pObj = v8::Local<v8::Object>::New(pIsolate, pObjDef->m_StaticObj); if (pObjDef->m_pDestructor) pObjDef->m_pDestructor(pObj); FXJS_FreePrivate(pObj); } delete pObjDef; } pIsolate->SetData(g_embedderDataSlot, nullptr); delete pData; }
Status PreludeScript::try_run() { v8::Isolate::Scope isolate_scope(get_isolate()); v8::Context::Scope context_scope(get_context()); global_template_factory.reset(); if (!enter_cancellable_region()) return S_TERMINATED; v8::Handle<v8::Value> prelude_result = run_script(get_isolate(), get_context()); if (!exit_cancellable_region()) return S_TERMINATED; if (prelude_result.IsEmpty()) { set_last_error(get_isolate(), "Prelude script did not return any value"); return S_ERROR; } if (!prelude_result->IsFunction()) { set_last_error(get_isolate(), "Prelude script must return a function"); return S_ERROR; } global_template_factory = std::shared_ptr<v8::Persistent<v8::Function>>( new v8::Persistent<v8::Function>(get_isolate(), prelude_result.As<v8::Function>())); return S_OK; }
int Fragment::Script::ScriptEngine::Init(int argc, char* argv[]) { v8::V8::InitializeICU(); v8::V8::InitializeExternalStartupData(argv[0]); v8::Platform *platform = v8::platform::CreateDefaultPlatform(); v8::V8::InitializePlatform(platform); v8::V8::Initialize(); v8::V8::SetFlagsFromCommandLine(&argc, argv, true); ShellArrayBufferAllocator array_buffer_allocator; v8::Isolate::CreateParams create_params; create_params.array_buffer_allocator = &array_buffer_allocator; v8::Isolate *isolate = v8::Isolate::New(create_params); run_shell = (argc == 1); int result; { v8::Isolate::Scope isolate_scope(isolate); v8::HandleScope handle_scope(isolate); v8::Local<v8::Context> context = CreateShellContext(isolate); if (context.IsEmpty()) { fprintf(stderr, "Error creating context\n"); return 1; } v8::Context::Scope context_scope(context); result = RunMain(isolate, platform, argc, argv); if (run_shell) RunShell(context, platform); } isolate->Dispose(); v8::V8::Dispose(); v8::V8::ShutdownPlatform(); delete platform; return result; }
void JsEngine::DisposeObject(Persistent<Object>* obj) { Locker locker(isolate_); Isolate::Scope isolate_scope(isolate_); obj->Dispose(isolate_); }
CFXJS_ObjDefinition(v8::Isolate* isolate, const wchar_t* sObjName, FXJSOBJTYPE eObjType, CFXJS_Engine::Constructor pConstructor, CFXJS_Engine::Destructor pDestructor) : m_ObjName(sObjName), m_ObjType(eObjType), m_pConstructor(pConstructor), m_pDestructor(pDestructor), m_pIsolate(isolate) { v8::Isolate::Scope isolate_scope(isolate); v8::HandleScope handle_scope(isolate); v8::Local<v8::FunctionTemplate> fun = v8::FunctionTemplate::New(isolate); fun->InstanceTemplate()->SetInternalFieldCount(2); if (eObjType == FXJSOBJTYPE_GLOBAL) { fun->InstanceTemplate()->Set( v8::Symbol::GetToStringTag(isolate), v8::String::NewFromUtf8(isolate, "global", v8::NewStringType::kNormal) .ToLocalChecked()); } m_FunctionTemplate.Reset(isolate, fun); v8::Local<v8::Signature> sig = v8::Signature::New(isolate, fun); m_Signature.Reset(isolate, sig); }
int FXJS_Execute(v8::Isolate* pIsolate, IJS_Context* pJSContext, const wchar_t* script, FXJSErr* pError) { v8::Isolate::Scope isolate_scope(pIsolate); v8::TryCatch try_catch(pIsolate); CFX_ByteString bsScript = CFX_WideString(script).UTF8Encode(); v8::Local<v8::Context> context = pIsolate->GetCurrentContext(); v8::Local<v8::Script> compiled_script; if (!v8::Script::Compile( context, v8::String::NewFromUtf8( pIsolate, bsScript.c_str(), v8::NewStringType::kNormal, bsScript.GetLength()).ToLocalChecked()) .ToLocal(&compiled_script)) { v8::String::Utf8Value error(try_catch.Exception()); // TODO(tsepez): return error via pError->message. return -1; } v8::Local<v8::Value> result; if (!compiled_script->Run(context).ToLocal(&result)) { v8::String::Utf8Value error(try_catch.Exception()); // TODO(tsepez): return error via pError->message. return -1; } return 0; }
/* Create and return a v8 context. Thread safe. */ void msV8CreateContext(mapObj *map) { Isolate *isolate = Isolate::GetCurrent(); Isolate::Scope isolate_scope(isolate); HandleScope handle_scope(isolate); V8Context *v8context = new V8Context(isolate); Handle<ObjectTemplate> global_templ = ObjectTemplate::New(); global_templ->Set(String::New("require"), FunctionTemplate::New(msV8Require)); global_templ->Set(String::New("print"), FunctionTemplate::New(msV8Print)); global_templ->Set(String::New("alert"), FunctionTemplate::New(msV8Print)); Handle<Context> context_ = Context::New(v8context->isolate, NULL, global_templ); v8context->context.Reset(v8context->isolate, context_); /* we have to enter the context before getting global instance */ Context::Scope context_scope(context_); Handle<Object> global = context_->Global(); Shape::Initialize(global); Point::Initialize(global); Line::Initialize(global); v8context->paths.push(map->mappath); v8context->isolate->SetData(v8context); v8context->layer = NULL; map->v8context = (void*)v8context; }
void CJS_Runtime::SetReaderDocument(CPDFSDK_Document* pReaderDoc) { if (m_pDocument != pReaderDoc) { v8::Isolate::Scope isolate_scope(m_isolate); v8::HandleScope handle_scope(m_isolate); v8::Local<v8::Context> context =v8::Local<v8::Context>::New(m_isolate, m_context); v8::Context::Scope context_scope(context); m_pDocument = pReaderDoc; if (pReaderDoc) { JSObject pThis = JS_GetThisObj(*this); if(!pThis.IsEmpty()) { if (JS_GetObjDefnID(pThis) == JS_GetObjDefnID(*this, L"Document")) { if (CJS_Document* pJSDocument = (CJS_Document*)JS_GetPrivate(pThis)) { if (Document * pDocument = (Document*)pJSDocument->GetEmbedObject()) pDocument->AttachDoc(pReaderDoc); } } } JS_SetThisObj(*this, JS_GetObjDefnID(*this, L"Document")); } else { JS_SetThisObj(*this, JS_GetObjDefnID(*this, L"app")); } } }
Persistent<Script> *JsEngine::CompileScript(const uint16_t* str, const uint16_t *resourceName, jsvalue *error) { Locker locker(isolate_); Isolate::Scope isolate_scope(isolate_); HandleScope scope; TryCatch trycatch; (*global_context_)->Enter(); Handle<String> source = String::New(str); Handle<Script> script; if (resourceName != NULL) { Handle<String> name = String::New(resourceName); script = Script::New(source, name); } else { script = Script::New(source); } if (script.IsEmpty()) { *error = ErrorFromV8(trycatch); } (*global_context_)->Exit(); Persistent<Script> *pScript = new Persistent<Script>(Persistent<Script>::New(script)); return pScript; }
double JS_DateParse(const wchar_t* string) { v8::Isolate* pIsolate = v8::Isolate::GetCurrent(); v8::Isolate::Scope isolate_scope(pIsolate); v8::HandleScope scope(pIsolate); v8::Local<v8::Context> context = pIsolate->GetCurrentContext(); //Use the built-in object method. v8::Local<v8::Value> v = context->Global()->Get(v8::String::NewFromUtf8(pIsolate, "Date")); if(v->IsObject()) { v8::Local<v8::Object> o = v->ToObject(); v = o->Get(v8::String::NewFromUtf8(pIsolate, "parse")); if(v->IsFunction()) { v8::Local<v8::Function> funC = v8::Handle<v8::Function>::Cast(v); const int argc = 1; v8::Local<v8::String> timeStr = WSToJSString(pIsolate, string); v8::Handle<v8::Value> argv[argc] = {timeStr}; v = funC->Call(context->Global(), argc, argv); if(v->IsNumber()) { double date = v->ToNumber()->Value(); if(!_isfinite(date)) return date; return date + _getLocalTZA() + _getDaylightSavingTA(date); } } } return 0; }
TEST_F(FXJSV8EmbedderTest, Getters) { v8::Isolate::Scope isolate_scope(isolate()); v8::HandleScope handle_scope(isolate()); v8::Context::Scope context_scope(GetV8Context()); ExecuteInCurrentContext(CFX_WideString(kScript1)); CheckAssignmentInCurrentContext(kExpected1); }
CJS_Runtime::CJS_Runtime(CPDFDoc_Environment* pApp) : m_pApp(pApp), m_pDocument(nullptr), m_bBlocking(FALSE), m_isolate(nullptr), m_isolateManaged(false) { #ifndef PDF_ENABLE_XFA IPDF_JSPLATFORM* pPlatform = m_pApp->GetFormFillInfo()->m_pJsPlatform; if (pPlatform->version <= 2) { unsigned int embedderDataSlot = 0; v8::Isolate* pExternalIsolate = nullptr; if (pPlatform->version == 2) { pExternalIsolate = reinterpret_cast<v8::Isolate*>(pPlatform->m_isolate); embedderDataSlot = pPlatform->m_v8EmbedderSlot; } FXJS_Initialize(embedderDataSlot, pExternalIsolate); } m_isolateManaged = FXJS_GetIsolate(&m_isolate); #else if (CPDFXFA_App::GetInstance()->GetJSERuntime()) { // TODO(tsepez): CPDFXFA_App should also use the embedder provided isolate. m_isolate = (v8::Isolate*)CPDFXFA_App::GetInstance()->GetJSERuntime(); } else { IPDF_JSPLATFORM* pPlatform = m_pApp->GetFormFillInfo()->m_pJsPlatform; if (pPlatform->version <= 2) { unsigned int embedderDataSlot = 0; v8::Isolate* pExternalIsolate = nullptr; if (pPlatform->version == 2) { pExternalIsolate = reinterpret_cast<v8::Isolate*>(pPlatform->m_isolate); embedderDataSlot = pPlatform->m_v8EmbedderSlot; } FXJS_Initialize(embedderDataSlot, pExternalIsolate); } m_isolateManaged = FXJS_GetIsolate(&m_isolate); } v8::Isolate* isolate = m_isolate; v8::Isolate::Scope isolate_scope(isolate); v8::HandleScope handle_scope(isolate); if (CPDFXFA_App::GetInstance()->IsJavaScriptInitialized()) { CJS_Context* pContext = (CJS_Context*)NewContext(); FXJS_InitializeRuntime(GetIsolate(), this, &m_context, &m_StaticObjects); ReleaseContext(pContext); return; } #endif if (m_isolateManaged || FXJS_GlobalIsolateRefCount() == 0) DefineJSObjects(); #ifdef PDF_ENABLE_XFA CPDFXFA_App::GetInstance()->SetJavaScriptInitialized(TRUE); #endif CJS_Context* pContext = (CJS_Context*)NewContext(); FXJS_InitializeRuntime(GetIsolate(), this, &m_context, &m_StaticObjects); ReleaseContext(pContext); }
FX_BOOL CJS_Context::Compile(const CFX_WideString& script, CFX_WideString& info) { v8::Isolate::Scope isolate_scope(m_pRuntime->GetIsolate()); v8::HandleScope handle_scope(m_pRuntime->GetIsolate()); v8::Local<v8::Context> context = m_pRuntime->NewJSContext(); v8::Context::Scope context_scope(context); return DoJob(1, script, info); }
v8::Local<v8::Object> FXJS_GetThisObj(v8::Isolate* pIsolate) { v8::Isolate::Scope isolate_scope(pIsolate); if (!FXJS_PerIsolateData::Get(pIsolate)) return v8::Local<v8::Object>(); // Return the global object. v8::Local<v8::Context> context = pIsolate->GetCurrentContext(); return context->Global()->GetPrototype()->ToObject(context).ToLocalChecked(); }
void JsScript::Dispose() { Isolate *isolate = engine_->GetIsolate(); if(isolate != NULL) { Locker locker(isolate); Isolate::Scope isolate_scope(isolate); script_->Dispose(); delete script_; } }
void requestAnimationFrame(const FunctionCallbackInfo<Value>& args) { Isolate *isolate = JS::GetIsolate(); Isolate::Scope isolate_scope(isolate); Local<Function> callback = Local<Function>::Cast(args[0]); Persistent<Function, CopyablePersistentTraits<Function>> value(isolate, callback); animationFrameCalls.push_back(value); }
void CFXJS_Engine::DefineObjConst(int nObjDefnID, const wchar_t* sConstName, v8::Local<v8::Value> pDefault) { v8::Isolate::Scope isolate_scope(m_isolate); v8::HandleScope handle_scope(m_isolate); CFX_ByteString bsConstName = CFX_WideString(sConstName).UTF8Encode(); CFXJS_ObjDefinition* pObjDef = CFXJS_ObjDefinition::ForID(m_isolate, nObjDefnID); pObjDef->GetInstanceTemplate()->Set(m_isolate, bsConstName.c_str(), pDefault); }
void SetUp() override { EmbedderTest::SetExternalIsolate(m_pIsolate); EmbedderTest::SetUp(); v8::Isolate::Scope isolate_scope(m_pIsolate); v8::HandleScope handle_scope(m_pIsolate); FXJS_PerIsolateData::SetUp(m_pIsolate); FXJS_InitializeRuntime(m_pIsolate, nullptr, &m_pPersistentContext, &m_StaticObjects); }
int CFXJS_Engine::DefineObj(const wchar_t* sObjName, FXJSOBJTYPE eObjType, CFXJS_Engine::Constructor pConstructor, CFXJS_Engine::Destructor pDestructor) { v8::Isolate::Scope isolate_scope(m_isolate); v8::HandleScope handle_scope(m_isolate); FXJS_PerIsolateData::SetUp(m_isolate); CFXJS_ObjDefinition* pObjDef = new CFXJS_ObjDefinition( m_isolate, sObjName, eObjType, pConstructor, pDestructor); return pObjDef->AssignID(); }
void FXJS_DefineGlobalConst(v8::Isolate* pIsolate, const wchar_t* sConstName, v8::Local<v8::Value> pDefault) { v8::Isolate::Scope isolate_scope(pIsolate); v8::HandleScope handle_scope(pIsolate); CFX_ByteString bsConst = CFX_WideString(sConstName).UTF8Encode(); GetGlobalObjectTemplate(pIsolate)->Set( v8::String::NewFromUtf8(pIsolate, bsConst.c_str(), v8::NewStringType::kNormal).ToLocalChecked(), pDefault, v8::ReadOnly); }
void FXJS_DefineGlobalMethod(v8::Isolate* pIsolate, const wchar_t* sMethodName, v8::FunctionCallback pMethodCall) { v8::Isolate::Scope isolate_scope(pIsolate); v8::HandleScope handle_scope(pIsolate); CFX_ByteString bsMethodName = CFX_WideString(sMethodName).UTF8Encode(); GetGlobalObjectTemplate(pIsolate)->Set( v8::String::NewFromUtf8(pIsolate, bsMethodName.c_str(), v8::NewStringType::kNormal).ToLocalChecked(), v8::FunctionTemplate::New(pIsolate, pMethodCall), v8::ReadOnly); }
void MD_Runner::run() { fprintf(stderr, "V8 version %s [mordor shell]\n", v8::V8::GetVersion()); v8::Platform* v8_platform = v8::platform::CreateDefaultPlatform(1); v8::V8::InitializeICU(); v8::V8::InitializePlatform(v8_platform); v8::V8::Initialize(); int argc = g_argc; v8::V8::SetFlagsFromCommandLine(&argc, g_argv, true); v8::V8::SetFlagsFromString(MD_V8_OPTIONS, sizeof(MD_V8_OPTIONS) - 1); v8::V8::SetArrayBufferAllocator(&ArrayBufferAllocator::the_singleton); v8::Isolate* isolate = v8::Isolate::New(); { v8::Isolate::Scope isolate_scope(isolate); v8::Locker locker(isolate); v8::HandleScope handle_scope(isolate); v8::Local<v8::Context> context = v8::Context::New(isolate); v8::Context::Scope context_scope(context); Environment* env = Environment::New(context, Scheduler::getThis()); ProcessObject po(env); po.setup(); { Coroutine<const char*> coReadScript(&readScript); const char* script; bool running = true; do { script = coReadScript.call(); if (coReadScript.state() == Fiber::State::TERM) { break; } v8::HandleScope handle_scope(context->GetIsolate()); v8::Local<v8::String> script_str = Utf8String(isolate, script); ExecuteString(env, script_str, Utf8String(isolate, "md_shell")); running = env->running(); } while (running); std::cout << "bye." << std::endl; } Environment::environment.reset(); } isolate->Dispose(); LineEditor* line_editor = LineEditor::Get(); if (line_editor) line_editor->Close(); v8::V8::Dispose(); v8::V8::ShutdownPlatform(); delete v8_platform; this->over(); }
void FXJS_InitializeRuntime(v8::Isolate* pIsolate, IFXJS_Runtime* pFXRuntime, IFXJS_Context* context, v8::Global<v8::Context>& v8PersistentContext) { v8::Isolate::Scope isolate_scope(pIsolate); v8::HandleScope handle_scope(pIsolate); v8::Global<v8::ObjectTemplate>& globalObjTemp = _getGlobalObjectTemplate(pIsolate); v8::Local<v8::Context> v8Context = v8::Context::New( pIsolate, NULL, v8::Local<v8::ObjectTemplate>::New(pIsolate, globalObjTemp)); v8::Context::Scope context_scope(v8Context); FXJS_PerIsolateData::SetUp(pIsolate); v8Context->SetAlignedPointerInEmbedderData(kPerContextDataIndex, pFXRuntime); int maxID = CFXJS_ObjDefinition::MaxID(pIsolate); for (int i = 0; i < maxID; ++i) { CFXJS_ObjDefinition* pObjDef = CFXJS_ObjDefinition::ForID(pIsolate, i); CFX_WideString ws = CFX_WideString(pObjDef->objName); CFX_ByteString bs = ws.UTF8Encode(); v8::Local<v8::String> objName = v8::String::NewFromUtf8(pIsolate, bs.c_str(), v8::NewStringType::kNormal, bs.GetLength()).ToLocalChecked(); if (pObjDef->objType == FXJS_DYNAMIC) { // Document is set as global object, need to construct it first. if (ws.Equal(L"Document")) { v8Context->Global() ->GetPrototype() ->ToObject(v8Context) .ToLocalChecked() ->SetAlignedPointerInInternalField(0, new CFXJS_PrivateData(i)); if (pObjDef->m_pConstructor) pObjDef->m_pConstructor(context, v8Context->Global() ->GetPrototype() ->ToObject(v8Context) .ToLocalChecked(), v8Context->Global() ->GetPrototype() ->ToObject(v8Context) .ToLocalChecked()); } } else { v8::Local<v8::Object> obj = FXJS_NewFxDynamicObj(pIsolate, context, i); v8Context->Global()->Set(v8Context, objName, obj).FromJust(); pObjDef->m_StaticObj.Reset(pIsolate, obj); } } v8PersistentContext.Reset(pIsolate, v8Context); }
v8::Handle<v8::Object> JS_GetThisObj(IJS_Runtime * pJSRuntime) { //Return the global object. v8::Isolate* isolate = (v8::Isolate*)pJSRuntime; v8::Isolate::Scope isolate_scope(isolate); CFX_PtrArray* pArray = (CFX_PtrArray*)isolate->GetData(0); if(!pArray) return v8::Handle<v8::Object>(); v8::Local<v8::Context> context = isolate->GetCurrentContext(); return context->Global()->GetPrototype()->ToObject(); }
void Isolate::init() { s_isolates.putTail(this); v8::Locker locker(m_isolate); v8::Isolate::Scope isolate_scope(m_isolate); v8::HandleScope handle_scope(m_isolate); JSFiber::scope s; v8::Local<v8::Context> _context = v8::Context::New(m_isolate); m_context.Reset(m_isolate, _context); v8::Context::Scope context_scope(_context); if (g_cov && m_id == 1) beginCoverage(m_isolate); _context->SetEmbedderData(1, v8::Object::New(m_isolate)->GetPrototype()); static const char* skips[] = { "Master", "repl", "argv", "__filename", "__dirname", NULL }; global_base::class_info().Attach(this, _context->Global(), skips); m_topSandbox = new SandBox(); m_topSandbox->initRoot(); auto assertion_error = "class AssertionError extends Error {" " constructor(options) {" " var { actual, expected, message, operator } = options;" " if (message) {" " super(message);" " } else {" " if (actual && actual.stack && actual instanceof Error)" " actual = `${actual.name}: ${actual.message}`;" " if (expected && expected.stack && expected instanceof Error)" " expected = `${expected.name}: ${expected.message}`;" " super(`${JSON.stringify(actual).slice(0, 128)} ` +" " `${operator} ${JSON.stringify(expected).slice(0, 128)}`);" " }" " this.generatedMessage = !message;" " this.name = 'AssertionError [ERR_ASSERTION]';" " this.code = 'ERR_ASSERTION';" " this.actual = actual;" " this.expected = expected;" " this.operator = operator;" " }" "}" "AssertionError;"; v8::Local<v8::Script> script = v8::Script::Compile(NewString(assertion_error)); v8::Local<v8::Object> AssertionError = script->Run().As<v8::Object>(); m_AssertionError.Reset(m_isolate, AssertionError); }