1*3ac0a46fSAndroid Build Coastguard Worker // Copyright 2016 The PDFium Authors 2*3ac0a46fSAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be 3*3ac0a46fSAndroid Build Coastguard Worker // found in the LICENSE file. 4*3ac0a46fSAndroid Build Coastguard Worker 5*3ac0a46fSAndroid Build Coastguard Worker // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com 6*3ac0a46fSAndroid Build Coastguard Worker 7*3ac0a46fSAndroid Build Coastguard Worker #include "fxjs/xfa/cfxjse_runtimedata.h" 8*3ac0a46fSAndroid Build Coastguard Worker 9*3ac0a46fSAndroid Build Coastguard Worker #include <utility> 10*3ac0a46fSAndroid Build Coastguard Worker 11*3ac0a46fSAndroid Build Coastguard Worker #include "fxjs/cfxjs_engine.h" 12*3ac0a46fSAndroid Build Coastguard Worker #include "fxjs/fxv8.h" 13*3ac0a46fSAndroid Build Coastguard Worker #include "fxjs/xfa/cfxjse_isolatetracker.h" 14*3ac0a46fSAndroid Build Coastguard Worker #include "third_party/base/check_op.h" 15*3ac0a46fSAndroid Build Coastguard Worker #include "v8/include/v8-context.h" 16*3ac0a46fSAndroid Build Coastguard Worker #include "v8/include/v8-external.h" 17*3ac0a46fSAndroid Build Coastguard Worker #include "v8/include/v8-isolate.h" 18*3ac0a46fSAndroid Build Coastguard Worker #include "v8/include/v8-object.h" 19*3ac0a46fSAndroid Build Coastguard Worker #include "v8/include/v8-primitive.h" 20*3ac0a46fSAndroid Build Coastguard Worker #include "v8/include/v8-template.h" 21*3ac0a46fSAndroid Build Coastguard Worker 22*3ac0a46fSAndroid Build Coastguard Worker CFXJSE_RuntimeData::CFXJSE_RuntimeData() = default; 23*3ac0a46fSAndroid Build Coastguard Worker 24*3ac0a46fSAndroid Build Coastguard Worker CFXJSE_RuntimeData::~CFXJSE_RuntimeData() = default; 25*3ac0a46fSAndroid Build Coastguard Worker Create(v8::Isolate * pIsolate)26*3ac0a46fSAndroid Build Coastguard Workerstd::unique_ptr<CFXJSE_RuntimeData> CFXJSE_RuntimeData::Create( 27*3ac0a46fSAndroid Build Coastguard Worker v8::Isolate* pIsolate) { 28*3ac0a46fSAndroid Build Coastguard Worker std::unique_ptr<CFXJSE_RuntimeData> pRuntimeData(new CFXJSE_RuntimeData()); 29*3ac0a46fSAndroid Build Coastguard Worker CFXJSE_ScopeUtil_IsolateHandle scope(pIsolate); 30*3ac0a46fSAndroid Build Coastguard Worker v8::Local<v8::FunctionTemplate> hFuncTemplate = 31*3ac0a46fSAndroid Build Coastguard Worker v8::FunctionTemplate::New(pIsolate); 32*3ac0a46fSAndroid Build Coastguard Worker 33*3ac0a46fSAndroid Build Coastguard Worker v8::Local<v8::ObjectTemplate> hGlobalTemplate = 34*3ac0a46fSAndroid Build Coastguard Worker hFuncTemplate->InstanceTemplate(); 35*3ac0a46fSAndroid Build Coastguard Worker hGlobalTemplate->Set(v8::Symbol::GetToStringTag(pIsolate), 36*3ac0a46fSAndroid Build Coastguard Worker fxv8::NewStringHelper(pIsolate, "global")); 37*3ac0a46fSAndroid Build Coastguard Worker 38*3ac0a46fSAndroid Build Coastguard Worker v8::Local<v8::Context> hContext = 39*3ac0a46fSAndroid Build Coastguard Worker v8::Context::New(pIsolate, 0, hGlobalTemplate); 40*3ac0a46fSAndroid Build Coastguard Worker 41*3ac0a46fSAndroid Build Coastguard Worker DCHECK_EQ(hContext->Global()->InternalFieldCount(), 0); 42*3ac0a46fSAndroid Build Coastguard Worker DCHECK_EQ( 43*3ac0a46fSAndroid Build Coastguard Worker hContext->Global()->GetPrototype().As<v8::Object>()->InternalFieldCount(), 44*3ac0a46fSAndroid Build Coastguard Worker 0); 45*3ac0a46fSAndroid Build Coastguard Worker 46*3ac0a46fSAndroid Build Coastguard Worker hContext->SetSecurityToken(v8::External::New(pIsolate, pIsolate)); 47*3ac0a46fSAndroid Build Coastguard Worker pRuntimeData->m_hRootContextGlobalTemplate.Reset(pIsolate, hFuncTemplate); 48*3ac0a46fSAndroid Build Coastguard Worker pRuntimeData->m_hRootContext.Reset(pIsolate, hContext); 49*3ac0a46fSAndroid Build Coastguard Worker return pRuntimeData; 50*3ac0a46fSAndroid Build Coastguard Worker } 51*3ac0a46fSAndroid Build Coastguard Worker Get(v8::Isolate * pIsolate)52*3ac0a46fSAndroid Build Coastguard WorkerCFXJSE_RuntimeData* CFXJSE_RuntimeData::Get(v8::Isolate* pIsolate) { 53*3ac0a46fSAndroid Build Coastguard Worker FXJS_PerIsolateData::SetUp(pIsolate); 54*3ac0a46fSAndroid Build Coastguard Worker FXJS_PerIsolateData* pData = FXJS_PerIsolateData::Get(pIsolate); 55*3ac0a46fSAndroid Build Coastguard Worker if (!pData->GetExtension()) 56*3ac0a46fSAndroid Build Coastguard Worker pData->SetExtension(CFXJSE_RuntimeData::Create(pIsolate)); 57*3ac0a46fSAndroid Build Coastguard Worker return static_cast<CFXJSE_RuntimeData*>(pData->GetExtension()); 58*3ac0a46fSAndroid Build Coastguard Worker } 59