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

Side by Side Diff: fxjs/fxjs_v8.cpp

Issue 2245863002: Push v8::Isolate into CFXJS_Engine class (Closed) Base URL: https://pdfium.googlesource.com/pdfium.git@master
Patch Set: Null isolate before letting CFXJS_Engine dtor invoked Created 4 years, 4 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 | « fpdfsdk/javascript/util.cpp ('k') | fxjs/fxjs_v8_embeddertest.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 // Copyright 2014 PDFium Authors. All rights reserved. 1 // Copyright 2014 PDFium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6 6
7 #include "fxjs/include/fxjs_v8.h" 7 #include "fxjs/include/fxjs_v8.h"
8 8
9 #include <vector> 9 #include <vector>
10 10
(...skipping 26 matching lines...) Expand all
37 } 37 }
38 38
39 static CFXJS_ObjDefinition* ForID(v8::Isolate* pIsolate, int id) { 39 static CFXJS_ObjDefinition* ForID(v8::Isolate* pIsolate, int id) {
40 // Note: GetAt() halts if out-of-range even in release builds. 40 // Note: GetAt() halts if out-of-range even in release builds.
41 return FXJS_PerIsolateData::Get(pIsolate)->m_ObjectDefnArray[id]; 41 return FXJS_PerIsolateData::Get(pIsolate)->m_ObjectDefnArray[id];
42 } 42 }
43 43
44 CFXJS_ObjDefinition(v8::Isolate* isolate, 44 CFXJS_ObjDefinition(v8::Isolate* isolate,
45 const wchar_t* sObjName, 45 const wchar_t* sObjName,
46 FXJSOBJTYPE eObjType, 46 FXJSOBJTYPE eObjType,
47 FXJS_CONSTRUCTOR pConstructor, 47 CFXJS_Engine::Constructor pConstructor,
48 FXJS_DESTRUCTOR pDestructor) 48 CFXJS_Engine::Destructor pDestructor)
49 : m_ObjName(sObjName), 49 : m_ObjName(sObjName),
50 m_ObjType(eObjType), 50 m_ObjType(eObjType),
51 m_pConstructor(pConstructor), 51 m_pConstructor(pConstructor),
52 m_pDestructor(pDestructor), 52 m_pDestructor(pDestructor),
53 m_pIsolate(isolate) { 53 m_pIsolate(isolate) {
54 v8::Isolate::Scope isolate_scope(isolate); 54 v8::Isolate::Scope isolate_scope(isolate);
55 v8::HandleScope handle_scope(isolate); 55 v8::HandleScope handle_scope(isolate);
56 56
57 v8::Local<v8::FunctionTemplate> fun = v8::FunctionTemplate::New(isolate); 57 v8::Local<v8::FunctionTemplate> fun = v8::FunctionTemplate::New(isolate);
58 fun->InstanceTemplate()->SetInternalFieldCount(2); 58 fun->InstanceTemplate()->SetInternalFieldCount(2);
(...skipping 22 matching lines...) Expand all
81 return scope.Escape(function->InstanceTemplate()); 81 return scope.Escape(function->InstanceTemplate());
82 } 82 }
83 83
84 v8::Local<v8::Signature> GetSignature() { 84 v8::Local<v8::Signature> GetSignature() {
85 v8::EscapableHandleScope scope(m_pIsolate); 85 v8::EscapableHandleScope scope(m_pIsolate);
86 return scope.Escape(m_Signature.Get(m_pIsolate)); 86 return scope.Escape(m_Signature.Get(m_pIsolate));
87 } 87 }
88 88
89 const wchar_t* const m_ObjName; 89 const wchar_t* const m_ObjName;
90 const FXJSOBJTYPE m_ObjType; 90 const FXJSOBJTYPE m_ObjType;
91 const FXJS_CONSTRUCTOR m_pConstructor; 91 const CFXJS_Engine::Constructor m_pConstructor;
92 const FXJS_DESTRUCTOR m_pDestructor; 92 const CFXJS_Engine::Destructor m_pDestructor;
93 93
94 v8::Isolate* m_pIsolate; 94 v8::Isolate* m_pIsolate;
95 v8::Global<v8::FunctionTemplate> m_FunctionTemplate; 95 v8::Global<v8::FunctionTemplate> m_FunctionTemplate;
96 v8::Global<v8::Signature> m_Signature; 96 v8::Global<v8::Signature> m_Signature;
97 }; 97 };
98 98
99 static v8::Local<v8::ObjectTemplate> GetGlobalObjectTemplate( 99 static v8::Local<v8::ObjectTemplate> GetGlobalObjectTemplate(
100 v8::Isolate* pIsolate) { 100 v8::Isolate* pIsolate) {
101 int maxID = CFXJS_ObjDefinition::MaxID(pIsolate); 101 int maxID = CFXJS_ObjDefinition::MaxID(pIsolate);
102 for (int i = 0; i < maxID; ++i) { 102 for (int i = 0; i < maxID; ++i) {
(...skipping 25 matching lines...) Expand all
128 void FXJS_ArrayBufferAllocator::Free(void* data, size_t length) { 128 void FXJS_ArrayBufferAllocator::Free(void* data, size_t length) {
129 free(data); 129 free(data);
130 } 130 }
131 131
132 void V8TemplateMapTraits::Dispose(v8::Isolate* isolate, 132 void V8TemplateMapTraits::Dispose(v8::Isolate* isolate,
133 v8::Global<v8::Object> value, 133 v8::Global<v8::Object> value,
134 void* key) { 134 void* key) {
135 v8::Local<v8::Object> obj = value.Get(isolate); 135 v8::Local<v8::Object> obj = value.Get(isolate);
136 if (obj.IsEmpty()) 136 if (obj.IsEmpty())
137 return; 137 return;
138 int id = FXJS_GetObjDefnID(obj); 138 CFXJS_Engine* pEngine = CFXJS_Engine::CurrentEngineFromIsolate(isolate);
139 int id = pEngine->GetObjDefnID(obj);
139 if (id == -1) 140 if (id == -1)
140 return; 141 return;
141
142 CFXJS_ObjDefinition* pObjDef = CFXJS_ObjDefinition::ForID(isolate, id); 142 CFXJS_ObjDefinition* pObjDef = CFXJS_ObjDefinition::ForID(isolate, id);
143 if (!pObjDef) 143 if (!pObjDef)
144 return; 144 return;
145 if (pObjDef->m_pDestructor) 145 if (pObjDef->m_pDestructor)
146 pObjDef->m_pDestructor(obj); 146 pObjDef->m_pDestructor(pEngine, obj);
147 FXJS_FreePrivate(obj); 147 CFXJS_Engine::FreeObjectPrivate(obj);
148 } 148 }
149 149
150 V8TemplateMapTraits::MapType* V8TemplateMapTraits::MapFromWeakCallbackInfo( 150 V8TemplateMapTraits::MapType* V8TemplateMapTraits::MapFromWeakCallbackInfo(
151 const v8::WeakCallbackInfo<WeakCallbackDataType>& data) { 151 const v8::WeakCallbackInfo<WeakCallbackDataType>& data) {
152 V8TemplateMap* pMap = 152 V8TemplateMap* pMap =
153 (FXJS_PerIsolateData::Get(data.GetIsolate()))->m_pDynamicObjsMap; 153 (FXJS_PerIsolateData::Get(data.GetIsolate()))->m_pDynamicObjsMap;
154 return pMap ? &pMap->m_map : nullptr; 154 return pMap ? &pMap->m_map : nullptr;
155 } 155 }
156 156
157 void FXJS_Initialize(unsigned int embedderDataSlot, v8::Isolate* pIsolate) { 157 void FXJS_Initialize(unsigned int embedderDataSlot, v8::Isolate* pIsolate) {
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
216 } 216 }
217 217
218 #ifndef PDF_ENABLE_XFA 218 #ifndef PDF_ENABLE_XFA
219 FXJS_PerIsolateData::FXJS_PerIsolateData() : m_pDynamicObjsMap(nullptr) {} 219 FXJS_PerIsolateData::FXJS_PerIsolateData() : m_pDynamicObjsMap(nullptr) {}
220 #else // PDF_ENABLE_XFA 220 #else // PDF_ENABLE_XFA
221 FXJS_PerIsolateData::FXJS_PerIsolateData() 221 FXJS_PerIsolateData::FXJS_PerIsolateData()
222 : m_pFXJSERuntimeData(nullptr), m_pDynamicObjsMap(nullptr) {} 222 : m_pFXJSERuntimeData(nullptr), m_pDynamicObjsMap(nullptr) {}
223 #endif // PDF_ENABLE_XFA 223 #endif // PDF_ENABLE_XFA
224 224
225 CFXJS_Engine::CFXJS_Engine() : m_isolate(nullptr) {} 225 CFXJS_Engine::CFXJS_Engine() : m_isolate(nullptr) {}
226 CFXJS_Engine::~CFXJS_Engine() {}
227 226
228 int FXJS_DefineObj(v8::Isolate* pIsolate, 227 CFXJS_Engine::~CFXJS_Engine() {
229 const wchar_t* sObjName, 228 m_V8PersistentContext.Reset();
230 FXJSOBJTYPE eObjType, 229 }
231 FXJS_CONSTRUCTOR pConstructor,
232 FXJS_DESTRUCTOR pDestructor) {
233 v8::Isolate::Scope isolate_scope(pIsolate);
234 v8::HandleScope handle_scope(pIsolate);
235 230
236 FXJS_PerIsolateData::SetUp(pIsolate); 231 // static
232 CFXJS_Engine* CFXJS_Engine::CurrentEngineFromIsolate(v8::Isolate* pIsolate) {
233 return static_cast<CFXJS_Engine*>(
234 pIsolate->GetCurrentContext()->GetAlignedPointerFromEmbedderData(
235 kPerContextDataIndex));
236 }
237
238 #ifdef PDF_ENABLE_XFA
239 // static
240 void CFXJS_Engine::SetForV8Context(v8::Local<v8::Context> v8Context,
241 CFXJS_Engine* pEngine) {
242 v8Context->SetAlignedPointerInEmbedderData(kPerContextDataIndex, pEngine);
243 }
244 #endif // PDF_ENABLE_XFA
245
246 // static
247 int CFXJS_Engine::GetObjDefnID(v8::Local<v8::Object> pObj) {
248 if (pObj.IsEmpty() || !pObj->InternalFieldCount())
249 return -1;
250 CFXJS_PerObjectData* pPerObjectData = static_cast<CFXJS_PerObjectData*>(
251 pObj->GetAlignedPointerFromInternalField(0));
252 if (!pPerObjectData)
253 return -1;
254 return pPerObjectData->m_ObjDefID;
255 }
256
257 // static
258 void CFXJS_Engine::FreeObjectPrivate(void* pPerObjectData) {
259 delete static_cast<CFXJS_PerObjectData*>(pPerObjectData);
260 }
261
262 // static
263 void CFXJS_Engine::FreeObjectPrivate(v8::Local<v8::Object> pObj) {
264 if (pObj.IsEmpty() || !pObj->InternalFieldCount())
265 return;
266 FreeObjectPrivate(pObj->GetAlignedPointerFromInternalField(0));
267 pObj->SetAlignedPointerInInternalField(0, nullptr);
268 }
269
270 int CFXJS_Engine::DefineObj(const wchar_t* sObjName,
271 FXJSOBJTYPE eObjType,
272 CFXJS_Engine::Constructor pConstructor,
273 CFXJS_Engine::Destructor pDestructor) {
274 v8::Isolate::Scope isolate_scope(m_isolate);
275 v8::HandleScope handle_scope(m_isolate);
276 FXJS_PerIsolateData::SetUp(m_isolate);
237 CFXJS_ObjDefinition* pObjDef = new CFXJS_ObjDefinition( 277 CFXJS_ObjDefinition* pObjDef = new CFXJS_ObjDefinition(
238 pIsolate, sObjName, eObjType, pConstructor, pDestructor); 278 m_isolate, sObjName, eObjType, pConstructor, pDestructor);
239 return pObjDef->AssignID(); 279 return pObjDef->AssignID();
240 } 280 }
241 281
242 void FXJS_DefineObjMethod(v8::Isolate* pIsolate, 282 void CFXJS_Engine::DefineObjMethod(int nObjDefnID,
243 int nObjDefnID, 283 const wchar_t* sMethodName,
244 const wchar_t* sMethodName, 284 v8::FunctionCallback pMethodCall) {
245 v8::FunctionCallback pMethodCall) { 285 v8::Isolate::Scope isolate_scope(m_isolate);
246 v8::Isolate::Scope isolate_scope(pIsolate); 286 v8::HandleScope handle_scope(m_isolate);
247 v8::HandleScope handle_scope(pIsolate);
248 CFX_ByteString bsMethodName = CFX_WideString(sMethodName).UTF8Encode(); 287 CFX_ByteString bsMethodName = CFX_WideString(sMethodName).UTF8Encode();
249 CFXJS_ObjDefinition* pObjDef = 288 CFXJS_ObjDefinition* pObjDef =
250 CFXJS_ObjDefinition::ForID(pIsolate, nObjDefnID); 289 CFXJS_ObjDefinition::ForID(m_isolate, nObjDefnID);
251 v8::Local<v8::FunctionTemplate> fun = v8::FunctionTemplate::New( 290 v8::Local<v8::FunctionTemplate> fun = v8::FunctionTemplate::New(
252 pIsolate, pMethodCall, v8::Local<v8::Value>(), pObjDef->GetSignature()); 291 m_isolate, pMethodCall, v8::Local<v8::Value>(), pObjDef->GetSignature());
253 fun->RemovePrototype(); 292 fun->RemovePrototype();
254 pObjDef->GetInstanceTemplate()->Set( 293 pObjDef->GetInstanceTemplate()->Set(
255 v8::String::NewFromUtf8(pIsolate, bsMethodName.c_str(), 294 v8::String::NewFromUtf8(m_isolate, bsMethodName.c_str(),
256 v8::NewStringType::kNormal) 295 v8::NewStringType::kNormal)
257 .ToLocalChecked(), 296 .ToLocalChecked(),
258 fun, v8::ReadOnly); 297 fun, v8::ReadOnly);
259 } 298 }
260 299
261 void FXJS_DefineObjProperty(v8::Isolate* pIsolate, 300 void CFXJS_Engine::DefineObjProperty(int nObjDefnID,
262 int nObjDefnID, 301 const wchar_t* sPropName,
263 const wchar_t* sPropName, 302 v8::AccessorGetterCallback pPropGet,
264 v8::AccessorGetterCallback pPropGet, 303 v8::AccessorSetterCallback pPropPut) {
265 v8::AccessorSetterCallback pPropPut) { 304 v8::Isolate::Scope isolate_scope(m_isolate);
266 v8::Isolate::Scope isolate_scope(pIsolate); 305 v8::HandleScope handle_scope(m_isolate);
267 v8::HandleScope handle_scope(pIsolate);
268 CFX_ByteString bsPropertyName = CFX_WideString(sPropName).UTF8Encode(); 306 CFX_ByteString bsPropertyName = CFX_WideString(sPropName).UTF8Encode();
269 CFXJS_ObjDefinition* pObjDef = 307 CFXJS_ObjDefinition* pObjDef =
270 CFXJS_ObjDefinition::ForID(pIsolate, nObjDefnID); 308 CFXJS_ObjDefinition::ForID(m_isolate, nObjDefnID);
271 pObjDef->GetInstanceTemplate()->SetAccessor( 309 pObjDef->GetInstanceTemplate()->SetAccessor(
272 v8::String::NewFromUtf8(pIsolate, bsPropertyName.c_str(), 310 v8::String::NewFromUtf8(m_isolate, bsPropertyName.c_str(),
273 v8::NewStringType::kNormal) 311 v8::NewStringType::kNormal)
274 .ToLocalChecked(), 312 .ToLocalChecked(),
275 pPropGet, pPropPut); 313 pPropGet, pPropPut);
276 } 314 }
277 315
278 void FXJS_DefineObjAllProperties(v8::Isolate* pIsolate, 316 void CFXJS_Engine::DefineObjAllProperties(
279 int nObjDefnID, 317 int nObjDefnID,
280 v8::NamedPropertyQueryCallback pPropQurey, 318 v8::NamedPropertyQueryCallback pPropQurey,
281 v8::NamedPropertyGetterCallback pPropGet, 319 v8::NamedPropertyGetterCallback pPropGet,
282 v8::NamedPropertySetterCallback pPropPut, 320 v8::NamedPropertySetterCallback pPropPut,
283 v8::NamedPropertyDeleterCallback pPropDel) { 321 v8::NamedPropertyDeleterCallback pPropDel) {
284 v8::Isolate::Scope isolate_scope(pIsolate); 322 v8::Isolate::Scope isolate_scope(m_isolate);
285 v8::HandleScope handle_scope(pIsolate); 323 v8::HandleScope handle_scope(m_isolate);
286 CFXJS_ObjDefinition* pObjDef = 324 CFXJS_ObjDefinition* pObjDef =
287 CFXJS_ObjDefinition::ForID(pIsolate, nObjDefnID); 325 CFXJS_ObjDefinition::ForID(m_isolate, nObjDefnID);
288 pObjDef->GetInstanceTemplate()->SetNamedPropertyHandler(pPropGet, pPropPut, 326 pObjDef->GetInstanceTemplate()->SetNamedPropertyHandler(pPropGet, pPropPut,
289 pPropQurey, pPropDel); 327 pPropQurey, pPropDel);
290 } 328 }
291 329
292 void FXJS_DefineObjConst(v8::Isolate* pIsolate, 330 void CFXJS_Engine::DefineObjConst(int nObjDefnID,
293 int nObjDefnID, 331 const wchar_t* sConstName,
294 const wchar_t* sConstName, 332 v8::Local<v8::Value> pDefault) {
295 v8::Local<v8::Value> pDefault) { 333 v8::Isolate::Scope isolate_scope(m_isolate);
296 v8::Isolate::Scope isolate_scope(pIsolate); 334 v8::HandleScope handle_scope(m_isolate);
297 v8::HandleScope handle_scope(pIsolate);
298 CFX_ByteString bsConstName = CFX_WideString(sConstName).UTF8Encode(); 335 CFX_ByteString bsConstName = CFX_WideString(sConstName).UTF8Encode();
299 CFXJS_ObjDefinition* pObjDef = 336 CFXJS_ObjDefinition* pObjDef =
300 CFXJS_ObjDefinition::ForID(pIsolate, nObjDefnID); 337 CFXJS_ObjDefinition::ForID(m_isolate, nObjDefnID);
301 pObjDef->GetInstanceTemplate()->Set(pIsolate, bsConstName.c_str(), pDefault); 338 pObjDef->GetInstanceTemplate()->Set(m_isolate, bsConstName.c_str(), pDefault);
302 } 339 }
303 340
304 void FXJS_DefineGlobalMethod(v8::Isolate* pIsolate, 341 void CFXJS_Engine::DefineGlobalMethod(const wchar_t* sMethodName,
305 const wchar_t* sMethodName, 342 v8::FunctionCallback pMethodCall) {
306 v8::FunctionCallback pMethodCall) { 343 v8::Isolate::Scope isolate_scope(m_isolate);
307 v8::Isolate::Scope isolate_scope(pIsolate); 344 v8::HandleScope handle_scope(m_isolate);
308 v8::HandleScope handle_scope(pIsolate);
309 CFX_ByteString bsMethodName = CFX_WideString(sMethodName).UTF8Encode(); 345 CFX_ByteString bsMethodName = CFX_WideString(sMethodName).UTF8Encode();
310 v8::Local<v8::FunctionTemplate> fun = 346 v8::Local<v8::FunctionTemplate> fun =
311 v8::FunctionTemplate::New(pIsolate, pMethodCall); 347 v8::FunctionTemplate::New(m_isolate, pMethodCall);
312 fun->RemovePrototype(); 348 fun->RemovePrototype();
313 GetGlobalObjectTemplate(pIsolate)->Set( 349 GetGlobalObjectTemplate(m_isolate)->Set(
314 v8::String::NewFromUtf8(pIsolate, bsMethodName.c_str(), 350 v8::String::NewFromUtf8(m_isolate, bsMethodName.c_str(),
315 v8::NewStringType::kNormal) 351 v8::NewStringType::kNormal)
316 .ToLocalChecked(), 352 .ToLocalChecked(),
317 fun, v8::ReadOnly); 353 fun, v8::ReadOnly);
318 } 354 }
319 355
320 void FXJS_DefineGlobalConst(v8::Isolate* pIsolate, 356 void CFXJS_Engine::DefineGlobalConst(const wchar_t* sConstName,
321 const wchar_t* sConstName, 357 v8::FunctionCallback pConstGetter) {
322 v8::FunctionCallback pConstGetter) { 358 v8::Isolate::Scope isolate_scope(m_isolate);
323 v8::Isolate::Scope isolate_scope(pIsolate); 359 v8::HandleScope handle_scope(m_isolate);
324 v8::HandleScope handle_scope(pIsolate);
325 CFX_ByteString bsConst = CFX_WideString(sConstName).UTF8Encode(); 360 CFX_ByteString bsConst = CFX_WideString(sConstName).UTF8Encode();
326 v8::Local<v8::FunctionTemplate> fun = 361 v8::Local<v8::FunctionTemplate> fun =
327 v8::FunctionTemplate::New(pIsolate, pConstGetter); 362 v8::FunctionTemplate::New(m_isolate, pConstGetter);
328 fun->RemovePrototype(); 363 fun->RemovePrototype();
329 GetGlobalObjectTemplate(pIsolate)->SetAccessorProperty( 364 GetGlobalObjectTemplate(m_isolate)->SetAccessorProperty(
330 v8::String::NewFromUtf8(pIsolate, bsConst.c_str(), 365 v8::String::NewFromUtf8(m_isolate, bsConst.c_str(),
331 v8::NewStringType::kNormal) 366 v8::NewStringType::kNormal)
332 .ToLocalChecked(), 367 .ToLocalChecked(),
333 fun); 368 fun);
334 } 369 }
335 370
336 void FXJS_InitializeEngine( 371 void CFXJS_Engine::InitializeEngine() {
337 v8::Isolate* pIsolate, 372 if (m_isolate == g_isolate)
338 CFXJS_Engine* pEngine,
339 v8::Global<v8::Context>* pV8PersistentContext,
340 std::vector<v8::Global<v8::Object>*>* pStaticObjects) {
341 if (pIsolate == g_isolate)
342 ++g_isolate_ref_count; 373 ++g_isolate_ref_count;
343 374
344 v8::Isolate::Scope isolate_scope(pIsolate); 375 v8::Isolate::Scope isolate_scope(m_isolate);
345 v8::HandleScope handle_scope(pIsolate); 376 v8::HandleScope handle_scope(m_isolate);
346 377
347 // This has to happen before we call GetGlobalObjectTemplate because that 378 // This has to happen before we call GetGlobalObjectTemplate because that
348 // method gets the PerIsolateData from pIsolate. 379 // method gets the PerIsolateData from m_isolate.
349 FXJS_PerIsolateData::SetUp(pIsolate); 380 FXJS_PerIsolateData::SetUp(m_isolate);
350 381
351 v8::Local<v8::Context> v8Context = 382 v8::Local<v8::Context> v8Context =
352 v8::Context::New(pIsolate, nullptr, GetGlobalObjectTemplate(pIsolate)); 383 v8::Context::New(m_isolate, nullptr, GetGlobalObjectTemplate(m_isolate));
353 v8::Context::Scope context_scope(v8Context); 384 v8::Context::Scope context_scope(v8Context);
354 385
355 FXJS_PerIsolateData* pData = FXJS_PerIsolateData::Get(pIsolate); 386 FXJS_PerIsolateData* pData = FXJS_PerIsolateData::Get(m_isolate);
356 if (!pData) 387 if (!pData)
357 return; 388 return;
358 pData->CreateDynamicObjsMap(pIsolate); 389 pData->CreateDynamicObjsMap(m_isolate);
359 v8Context->SetAlignedPointerInEmbedderData(kPerContextDataIndex, pEngine); 390 v8Context->SetAlignedPointerInEmbedderData(kPerContextDataIndex, this);
360 391
361 int maxID = CFXJS_ObjDefinition::MaxID(pIsolate); 392 int maxID = CFXJS_ObjDefinition::MaxID(m_isolate);
362 pStaticObjects->resize(maxID + 1); 393 m_StaticObjects.resize(maxID + 1);
363 for (int i = 0; i < maxID; ++i) { 394 for (int i = 0; i < maxID; ++i) {
364 CFXJS_ObjDefinition* pObjDef = CFXJS_ObjDefinition::ForID(pIsolate, i); 395 CFXJS_ObjDefinition* pObjDef = CFXJS_ObjDefinition::ForID(m_isolate, i);
365 if (pObjDef->m_ObjType == FXJSOBJTYPE_GLOBAL) { 396 if (pObjDef->m_ObjType == FXJSOBJTYPE_GLOBAL) {
366 v8Context->Global() 397 v8Context->Global()
367 ->GetPrototype() 398 ->GetPrototype()
368 ->ToObject(v8Context) 399 ->ToObject(v8Context)
369 .ToLocalChecked() 400 .ToLocalChecked()
370 ->SetAlignedPointerInInternalField(0, new CFXJS_PerObjectData(i)); 401 ->SetAlignedPointerInInternalField(0, new CFXJS_PerObjectData(i));
371 402
372 if (pObjDef->m_pConstructor) 403 if (pObjDef->m_pConstructor)
373 pObjDef->m_pConstructor(pEngine, v8Context->Global() 404 pObjDef->m_pConstructor(this, v8Context->Global()
374 ->GetPrototype() 405 ->GetPrototype()
375 ->ToObject(v8Context) 406 ->ToObject(v8Context)
376 .ToLocalChecked()); 407 .ToLocalChecked());
377 } else if (pObjDef->m_ObjType == FXJSOBJTYPE_STATIC) { 408 } else if (pObjDef->m_ObjType == FXJSOBJTYPE_STATIC) {
378 CFX_ByteString bs = CFX_WideString(pObjDef->m_ObjName).UTF8Encode(); 409 CFX_ByteString bs = CFX_WideString(pObjDef->m_ObjName).UTF8Encode();
379 v8::Local<v8::String> m_ObjName = 410 v8::Local<v8::String> m_ObjName =
380 v8::String::NewFromUtf8(pIsolate, bs.c_str(), 411 v8::String::NewFromUtf8(m_isolate, bs.c_str(),
381 v8::NewStringType::kNormal, bs.GetLength()) 412 v8::NewStringType::kNormal, bs.GetLength())
382 .ToLocalChecked(); 413 .ToLocalChecked();
383 414
384 v8::Local<v8::Object> obj = 415 v8::Local<v8::Object> obj = NewFxDynamicObj(i, true);
385 FXJS_NewFxDynamicObj(pIsolate, pEngine, i, true);
386 v8Context->Global()->Set(v8Context, m_ObjName, obj).FromJust(); 416 v8Context->Global()->Set(v8Context, m_ObjName, obj).FromJust();
387 pStaticObjects->at(i) = new v8::Global<v8::Object>(pIsolate, obj); 417 m_StaticObjects[i] = new v8::Global<v8::Object>(m_isolate, obj);
388 } 418 }
389 } 419 }
390 pV8PersistentContext->Reset(pIsolate, v8Context); 420 m_V8PersistentContext.Reset(m_isolate, v8Context);
391 } 421 }
392 422
393 void FXJS_ReleaseEngine(v8::Isolate* pIsolate, 423 void CFXJS_Engine::ReleaseEngine() {
394 v8::Global<v8::Context>* pV8PersistentContext, 424 v8::Isolate::Scope isolate_scope(m_isolate);
395 std::vector<v8::Global<v8::Object>*>* pStaticObjects) { 425 v8::HandleScope handle_scope(m_isolate);
396 v8::Isolate::Scope isolate_scope(pIsolate);
397 v8::HandleScope handle_scope(pIsolate);
398 v8::Local<v8::Context> context = 426 v8::Local<v8::Context> context =
399 v8::Local<v8::Context>::New(pIsolate, *pV8PersistentContext); 427 v8::Local<v8::Context>::New(m_isolate, m_V8PersistentContext);
400 v8::Context::Scope context_scope(context); 428 v8::Context::Scope context_scope(context);
401 429
402 FXJS_PerIsolateData* pData = FXJS_PerIsolateData::Get(pIsolate); 430 FXJS_PerIsolateData* pData = FXJS_PerIsolateData::Get(m_isolate);
403 if (!pData) 431 if (!pData)
404 return; 432 return;
405 433
406 int maxID = CFXJS_ObjDefinition::MaxID(pIsolate); 434 m_ConstArrays.clear();
435
436 int maxID = CFXJS_ObjDefinition::MaxID(m_isolate);
407 for (int i = 0; i < maxID; ++i) { 437 for (int i = 0; i < maxID; ++i) {
408 CFXJS_ObjDefinition* pObjDef = CFXJS_ObjDefinition::ForID(pIsolate, i); 438 CFXJS_ObjDefinition* pObjDef = CFXJS_ObjDefinition::ForID(m_isolate, i);
409 v8::Local<v8::Object> pObj; 439 v8::Local<v8::Object> pObj;
410 if (pObjDef->m_ObjType == FXJSOBJTYPE_GLOBAL) { 440 if (pObjDef->m_ObjType == FXJSOBJTYPE_GLOBAL) {
411 pObj = 441 pObj =
412 context->Global()->GetPrototype()->ToObject(context).ToLocalChecked(); 442 context->Global()->GetPrototype()->ToObject(context).ToLocalChecked();
413 } else if (pStaticObjects->at(i) && !pStaticObjects->at(i)->IsEmpty()) { 443 } else if (m_StaticObjects[i] && !m_StaticObjects[i]->IsEmpty()) {
414 pObj = v8::Local<v8::Object>::New(pIsolate, *pStaticObjects->at(i)); 444 pObj = v8::Local<v8::Object>::New(m_isolate, *m_StaticObjects[i]);
415 delete pStaticObjects->at(i); 445 delete m_StaticObjects[i];
416 pStaticObjects->at(i) = nullptr; 446 m_StaticObjects[i] = nullptr;
417 } 447 }
418 448
419 if (!pObj.IsEmpty()) { 449 if (!pObj.IsEmpty()) {
420 if (pObjDef->m_pDestructor) 450 if (pObjDef->m_pDestructor)
421 pObjDef->m_pDestructor(pObj); 451 pObjDef->m_pDestructor(this, pObj);
422 FXJS_FreePrivate(pObj); 452 FreeObjectPrivate(pObj);
423 } 453 }
424 } 454 }
425 455
426 if (pIsolate == g_isolate && --g_isolate_ref_count > 0) 456 m_V8PersistentContext.Reset();
457
458 if (m_isolate == g_isolate && --g_isolate_ref_count > 0)
427 return; 459 return;
428 460
429 pData->ReleaseDynamicObjsMap(); 461 pData->ReleaseDynamicObjsMap();
430 for (int i = 0; i < maxID; ++i) 462 for (int i = 0; i < maxID; ++i)
431 delete CFXJS_ObjDefinition::ForID(pIsolate, i); 463 delete CFXJS_ObjDefinition::ForID(m_isolate, i);
432 464
433 pIsolate->SetData(g_embedderDataSlot, nullptr); 465 m_isolate->SetData(g_embedderDataSlot, nullptr);
434 delete pData; 466 delete pData;
435 } 467 }
436 468
437 CFXJS_Engine* FXJS_GetCurrentEngineFromIsolate(v8::Isolate* pIsolate) { 469 int CFXJS_Engine::Execute(const CFX_WideString& script, FXJSErr* pError) {
438 v8::Local<v8::Context> context = pIsolate->GetCurrentContext(); 470 v8::Isolate::Scope isolate_scope(m_isolate);
439 return static_cast<CFXJS_Engine*>( 471 v8::TryCatch try_catch(m_isolate);
440 context->GetAlignedPointerFromEmbedderData(kPerContextDataIndex));
441 }
442
443 #ifdef PDF_ENABLE_XFA
444 void FXJS_SetEngineForV8Context(v8::Local<v8::Context> v8Context,
445 CFXJS_Engine* pEngine) {
446 v8Context->SetAlignedPointerInEmbedderData(kPerContextDataIndex, pEngine);
447 }
448 #endif // PDF_ENABLE_XFA
449
450 int FXJS_Execute(v8::Isolate* pIsolate,
451 const CFX_WideString& script,
452 FXJSErr* pError) {
453 v8::Isolate::Scope isolate_scope(pIsolate);
454 v8::TryCatch try_catch(pIsolate);
455 CFX_ByteString bsScript = script.UTF8Encode(); 472 CFX_ByteString bsScript = script.UTF8Encode();
456 v8::Local<v8::Context> context = pIsolate->GetCurrentContext(); 473 v8::Local<v8::Context> context = m_isolate->GetCurrentContext();
457 v8::Local<v8::Script> compiled_script; 474 v8::Local<v8::Script> compiled_script;
458 if (!v8::Script::Compile(context, 475 if (!v8::Script::Compile(context,
459 v8::String::NewFromUtf8(pIsolate, bsScript.c_str(), 476 v8::String::NewFromUtf8(m_isolate, bsScript.c_str(),
460 v8::NewStringType::kNormal, 477 v8::NewStringType::kNormal,
461 bsScript.GetLength()) 478 bsScript.GetLength())
462 .ToLocalChecked()) 479 .ToLocalChecked())
463 .ToLocal(&compiled_script)) { 480 .ToLocal(&compiled_script)) {
464 v8::String::Utf8Value error(try_catch.Exception()); 481 v8::String::Utf8Value error(try_catch.Exception());
465 // TODO(tsepez): return error via pError->message. 482 // TODO(tsepez): return error via pError->message.
466 return -1; 483 return -1;
467 } 484 }
468 485
469 v8::Local<v8::Value> result; 486 v8::Local<v8::Value> result;
470 if (!compiled_script->Run(context).ToLocal(&result)) { 487 if (!compiled_script->Run(context).ToLocal(&result)) {
471 v8::String::Utf8Value error(try_catch.Exception()); 488 v8::String::Utf8Value error(try_catch.Exception());
472 // TODO(tsepez): return error via pError->message. 489 // TODO(tsepez): return error via pError->message.
473 return -1; 490 return -1;
474 } 491 }
475 return 0; 492 return 0;
476 } 493 }
477 494
478 v8::Local<v8::Object> FXJS_NewFxDynamicObj(v8::Isolate* pIsolate, 495 v8::Local<v8::Object> CFXJS_Engine::NewFxDynamicObj(int nObjDefnID,
479 CFXJS_Engine* pEngine, 496 bool bStatic) {
480 int nObjDefnID, 497 v8::Isolate::Scope isolate_scope(m_isolate);
481 bool bStatic) { 498 v8::Local<v8::Context> context = m_isolate->GetCurrentContext();
482 v8::Isolate::Scope isolate_scope(pIsolate);
483 v8::Local<v8::Context> context = pIsolate->GetCurrentContext();
484 if (nObjDefnID == -1) { 499 if (nObjDefnID == -1) {
485 v8::Local<v8::ObjectTemplate> objTempl = v8::ObjectTemplate::New(pIsolate); 500 v8::Local<v8::ObjectTemplate> objTempl = v8::ObjectTemplate::New(m_isolate);
486 v8::Local<v8::Object> obj; 501 v8::Local<v8::Object> obj;
487 if (!objTempl->NewInstance(context).ToLocal(&obj)) 502 if (!objTempl->NewInstance(context).ToLocal(&obj))
488 return v8::Local<v8::Object>(); 503 return v8::Local<v8::Object>();
489 return obj; 504 return obj;
490 } 505 }
491 506
492 FXJS_PerIsolateData* pData = FXJS_PerIsolateData::Get(pIsolate); 507 FXJS_PerIsolateData* pData = FXJS_PerIsolateData::Get(m_isolate);
493 if (!pData) 508 if (!pData)
494 return v8::Local<v8::Object>(); 509 return v8::Local<v8::Object>();
495 510
496 if (nObjDefnID < 0 || nObjDefnID >= CFXJS_ObjDefinition::MaxID(pIsolate)) 511 if (nObjDefnID < 0 || nObjDefnID >= CFXJS_ObjDefinition::MaxID(m_isolate))
497 return v8::Local<v8::Object>(); 512 return v8::Local<v8::Object>();
498 513
499 CFXJS_ObjDefinition* pObjDef = 514 CFXJS_ObjDefinition* pObjDef =
500 CFXJS_ObjDefinition::ForID(pIsolate, nObjDefnID); 515 CFXJS_ObjDefinition::ForID(m_isolate, nObjDefnID);
501 v8::Local<v8::Object> obj; 516 v8::Local<v8::Object> obj;
502 if (!pObjDef->GetInstanceTemplate()->NewInstance(context).ToLocal(&obj)) 517 if (!pObjDef->GetInstanceTemplate()->NewInstance(context).ToLocal(&obj))
503 return v8::Local<v8::Object>(); 518 return v8::Local<v8::Object>();
504 519
505 CFXJS_PerObjectData* pPerObjData = new CFXJS_PerObjectData(nObjDefnID); 520 CFXJS_PerObjectData* pPerObjData = new CFXJS_PerObjectData(nObjDefnID);
506 obj->SetAlignedPointerInInternalField(0, pPerObjData); 521 obj->SetAlignedPointerInInternalField(0, pPerObjData);
507 if (pObjDef->m_pConstructor) 522 if (pObjDef->m_pConstructor)
508 pObjDef->m_pConstructor(pEngine, obj); 523 pObjDef->m_pConstructor(this, obj);
509 524
510 if (!bStatic && FXJS_PerIsolateData::Get(pIsolate)->m_pDynamicObjsMap) { 525 if (!bStatic && FXJS_PerIsolateData::Get(m_isolate)->m_pDynamicObjsMap) {
511 FXJS_PerIsolateData::Get(pIsolate)->m_pDynamicObjsMap->set(pPerObjData, 526 FXJS_PerIsolateData::Get(m_isolate)->m_pDynamicObjsMap->set(pPerObjData,
512 obj); 527 obj);
513 } 528 }
514 return obj; 529 return obj;
515 } 530 }
516 531
517 v8::Local<v8::Object> FXJS_GetThisObj(v8::Isolate* pIsolate) { 532 v8::Local<v8::Object> CFXJS_Engine::GetThisObj() {
518 v8::Isolate::Scope isolate_scope(pIsolate); 533 v8::Isolate::Scope isolate_scope(m_isolate);
519 if (!FXJS_PerIsolateData::Get(pIsolate)) 534 if (!FXJS_PerIsolateData::Get(m_isolate))
520 return v8::Local<v8::Object>(); 535 return v8::Local<v8::Object>();
521 536
522 // Return the global object. 537 // Return the global object.
523 v8::Local<v8::Context> context = pIsolate->GetCurrentContext(); 538 v8::Local<v8::Context> context = m_isolate->GetCurrentContext();
524 return context->Global()->GetPrototype()->ToObject(context).ToLocalChecked(); 539 return context->Global()->GetPrototype()->ToObject(context).ToLocalChecked();
525 } 540 }
526 541
527 int FXJS_GetObjDefnID(v8::Local<v8::Object> pObj) { 542 void CFXJS_Engine::Error(const CFX_WideString& message) {
528 if (pObj.IsEmpty() || !pObj->InternalFieldCount())
529 return -1;
530 CFXJS_PerObjectData* pPerObjectData = static_cast<CFXJS_PerObjectData*>(
531 pObj->GetAlignedPointerFromInternalField(0));
532 if (pPerObjectData)
533 return pPerObjectData->m_ObjDefID;
534 return -1;
535 }
536
537 void FXJS_Error(v8::Isolate* pIsolate, const CFX_WideString& message) {
538 // Conversion from pdfium's wchar_t wide-strings to v8's uint16_t 543 // Conversion from pdfium's wchar_t wide-strings to v8's uint16_t
539 // wide-strings isn't handled by v8, so use UTF8 as a common 544 // wide-strings isn't handled by v8, so use UTF8 as a common
540 // intermediate format. 545 // intermediate format.
541 CFX_ByteString utf8_message = message.UTF8Encode(); 546 CFX_ByteString utf8_message = message.UTF8Encode();
542 pIsolate->ThrowException(v8::String::NewFromUtf8(pIsolate, 547 m_isolate->ThrowException(v8::String::NewFromUtf8(m_isolate,
543 utf8_message.c_str(), 548 utf8_message.c_str(),
544 v8::NewStringType::kNormal) 549 v8::NewStringType::kNormal)
545 .ToLocalChecked()); 550 .ToLocalChecked());
546 } 551 }
547 552
548 void FXJS_SetPrivate(v8::Isolate* pIsolate, 553 void CFXJS_Engine::SetObjectPrivate(v8::Local<v8::Object> pObj, void* p) {
549 v8::Local<v8::Object> pObj,
550 void* p) {
551 if (pObj.IsEmpty() || !pObj->InternalFieldCount()) 554 if (pObj.IsEmpty() || !pObj->InternalFieldCount())
552 return; 555 return;
553 CFXJS_PerObjectData* pPerObjectData = static_cast<CFXJS_PerObjectData*>( 556 CFXJS_PerObjectData* pPerObjectData = static_cast<CFXJS_PerObjectData*>(
554 pObj->GetAlignedPointerFromInternalField(0)); 557 pObj->GetAlignedPointerFromInternalField(0));
555 if (!pPerObjectData) 558 if (!pPerObjectData)
556 return; 559 return;
557 pPerObjectData->m_pPrivate = p; 560 pPerObjectData->m_pPrivate = p;
558 } 561 }
559 562
560 void* FXJS_GetPrivate(v8::Isolate* pIsolate, v8::Local<v8::Object> pObj) { 563 void* CFXJS_Engine::GetObjectPrivate(v8::Local<v8::Object> pObj) {
561 if (pObj.IsEmpty()) 564 if (pObj.IsEmpty())
562 return nullptr; 565 return nullptr;
563 CFXJS_PerObjectData* pPerObjectData = nullptr; 566 CFXJS_PerObjectData* pPerObjectData = nullptr;
564 if (pObj->InternalFieldCount()) { 567 if (pObj->InternalFieldCount()) {
565 pPerObjectData = static_cast<CFXJS_PerObjectData*>( 568 pPerObjectData = static_cast<CFXJS_PerObjectData*>(
566 pObj->GetAlignedPointerFromInternalField(0)); 569 pObj->GetAlignedPointerFromInternalField(0));
567 } else { 570 } else {
568 // It could be a global proxy object. 571 // It could be a global proxy object.
569 v8::Local<v8::Value> v = pObj->GetPrototype(); 572 v8::Local<v8::Value> v = pObj->GetPrototype();
570 v8::Local<v8::Context> context = pIsolate->GetCurrentContext(); 573 v8::Local<v8::Context> context = m_isolate->GetCurrentContext();
571 if (v->IsObject()) { 574 if (v->IsObject()) {
572 pPerObjectData = static_cast<CFXJS_PerObjectData*>( 575 pPerObjectData = static_cast<CFXJS_PerObjectData*>(
573 v->ToObject(context) 576 v->ToObject(context)
574 .ToLocalChecked() 577 .ToLocalChecked()
575 ->GetAlignedPointerFromInternalField(0)); 578 ->GetAlignedPointerFromInternalField(0));
576 } 579 }
577 } 580 }
578 return pPerObjectData ? pPerObjectData->m_pPrivate : nullptr; 581 return pPerObjectData ? pPerObjectData->m_pPrivate : nullptr;
579 } 582 }
580 583
581 void FXJS_FreePrivate(void* pPerObjectData) { 584 v8::Local<v8::String> CFXJS_Engine::WSToJSString(
582 delete static_cast<CFXJS_PerObjectData*>(pPerObjectData); 585 const CFX_WideString& wsPropertyName) {
583 } 586 v8::Isolate* pIsolate = m_isolate ? m_isolate : v8::Isolate::GetCurrent();
584
585 void FXJS_FreePrivate(v8::Local<v8::Object> pObj) {
586 if (pObj.IsEmpty() || !pObj->InternalFieldCount())
587 return;
588 FXJS_FreePrivate(pObj->GetAlignedPointerFromInternalField(0));
589 pObj->SetAlignedPointerInInternalField(0, nullptr);
590 }
591
592 v8::Local<v8::String> FXJS_WSToJSString(v8::Isolate* pIsolate,
593 const CFX_WideString& wsPropertyName) {
594 CFX_ByteString bs = wsPropertyName.UTF8Encode(); 587 CFX_ByteString bs = wsPropertyName.UTF8Encode();
595 if (!pIsolate)
596 pIsolate = v8::Isolate::GetCurrent();
597 return v8::String::NewFromUtf8(pIsolate, bs.c_str(), 588 return v8::String::NewFromUtf8(pIsolate, bs.c_str(),
598 v8::NewStringType::kNormal, bs.GetLength()) 589 v8::NewStringType::kNormal, bs.GetLength())
599 .ToLocalChecked(); 590 .ToLocalChecked();
600 } 591 }
601 592
602 v8::Local<v8::Value> FXJS_GetObjectProperty( 593 v8::Local<v8::Value> CFXJS_Engine::GetObjectProperty(
603 v8::Isolate* pIsolate,
604 v8::Local<v8::Object> pObj, 594 v8::Local<v8::Object> pObj,
605 const CFX_WideString& wsPropertyName) { 595 const CFX_WideString& wsPropertyName) {
606 if (pObj.IsEmpty()) 596 if (pObj.IsEmpty())
607 return v8::Local<v8::Value>(); 597 return v8::Local<v8::Value>();
608 v8::Local<v8::Value> val; 598 v8::Local<v8::Value> val;
609 if (!pObj->Get(pIsolate->GetCurrentContext(), 599 if (!pObj->Get(m_isolate->GetCurrentContext(), WSToJSString(wsPropertyName))
610 FXJS_WSToJSString(pIsolate, wsPropertyName))
611 .ToLocal(&val)) 600 .ToLocal(&val))
612 return v8::Local<v8::Value>(); 601 return v8::Local<v8::Value>();
613 return val; 602 return val;
614 } 603 }
615 604
616 std::vector<CFX_WideString> FXJS_GetObjectPropertyNames( 605 std::vector<CFX_WideString> CFXJS_Engine::GetObjectPropertyNames(
617 v8::Isolate* pIsolate,
618 v8::Local<v8::Object> pObj) { 606 v8::Local<v8::Object> pObj) {
619 if (pObj.IsEmpty()) 607 if (pObj.IsEmpty())
620 return std::vector<CFX_WideString>(); 608 return std::vector<CFX_WideString>();
621 609
622 v8::Local<v8::Array> val; 610 v8::Local<v8::Array> val;
623 if (!pObj->GetPropertyNames(pIsolate->GetCurrentContext()).ToLocal(&val)) 611 v8::Local<v8::Context> context = m_isolate->GetCurrentContext();
612 if (!pObj->GetPropertyNames(context).ToLocal(&val))
624 return std::vector<CFX_WideString>(); 613 return std::vector<CFX_WideString>();
625 614
626 std::vector<CFX_WideString> result; 615 std::vector<CFX_WideString> result;
627 for (uint32_t i = 0; i < val->Length(); ++i) { 616 for (uint32_t i = 0; i < val->Length(); ++i) {
628 result.push_back(FXJS_ToString( 617 result.push_back(ToString(val->Get(context, i).ToLocalChecked()));
629 pIsolate, val->Get(pIsolate->GetCurrentContext(), i).ToLocalChecked()));
630 } 618 }
631 619
632 return result; 620 return result;
633 } 621 }
634 622
635 void FXJS_PutObjectString(v8::Isolate* pIsolate, 623 void CFXJS_Engine::PutObjectString(v8::Local<v8::Object> pObj,
636 v8::Local<v8::Object> pObj, 624 const CFX_WideString& wsPropertyName,
637 const CFX_WideString& wsPropertyName, 625 const CFX_WideString& wsValue) {
638 const CFX_WideString& wsValue) { 626 if (pObj.IsEmpty())
639 if (pObj.IsEmpty()) 627 return;
640 return; 628 pObj->Set(m_isolate->GetCurrentContext(), WSToJSString(wsPropertyName),
641 pObj->Set(pIsolate->GetCurrentContext(), 629 WSToJSString(wsValue))
642 FXJS_WSToJSString(pIsolate, wsPropertyName), 630 .FromJust();
643 FXJS_WSToJSString(pIsolate, wsValue)) 631 }
644 .FromJust(); 632
645 } 633 void CFXJS_Engine::PutObjectNumber(v8::Local<v8::Object> pObj,
646 634 const CFX_WideString& wsPropertyName,
647 void FXJS_PutObjectNumber(v8::Isolate* pIsolate, 635 int nValue) {
648 v8::Local<v8::Object> pObj, 636 if (pObj.IsEmpty())
649 const CFX_WideString& wsPropertyName, 637 return;
650 int nValue) { 638 pObj->Set(m_isolate->GetCurrentContext(), WSToJSString(wsPropertyName),
651 if (pObj.IsEmpty()) 639 v8::Int32::New(m_isolate, nValue))
652 return; 640 .FromJust();
653 pObj->Set(pIsolate->GetCurrentContext(), 641 }
654 FXJS_WSToJSString(pIsolate, wsPropertyName), 642
655 v8::Int32::New(pIsolate, nValue)) 643 void CFXJS_Engine::PutObjectNumber(v8::Local<v8::Object> pObj,
656 .FromJust(); 644 const CFX_WideString& wsPropertyName,
657 } 645 float fValue) {
658 646 if (pObj.IsEmpty())
659 void FXJS_PutObjectNumber(v8::Isolate* pIsolate, 647 return;
660 v8::Local<v8::Object> pObj, 648 pObj->Set(m_isolate->GetCurrentContext(), WSToJSString(wsPropertyName),
661 const CFX_WideString& wsPropertyName, 649 v8::Number::New(m_isolate, (double)fValue))
662 float fValue) { 650 .FromJust();
663 if (pObj.IsEmpty()) 651 }
664 return; 652
665 pObj->Set(pIsolate->GetCurrentContext(), 653 void CFXJS_Engine::PutObjectNumber(v8::Local<v8::Object> pObj,
666 FXJS_WSToJSString(pIsolate, wsPropertyName), 654 const CFX_WideString& wsPropertyName,
667 v8::Number::New(pIsolate, (double)fValue)) 655 double dValue) {
668 .FromJust(); 656 if (pObj.IsEmpty())
669 } 657 return;
670 658 pObj->Set(m_isolate->GetCurrentContext(), WSToJSString(wsPropertyName),
671 void FXJS_PutObjectNumber(v8::Isolate* pIsolate, 659 v8::Number::New(m_isolate, (double)dValue))
672 v8::Local<v8::Object> pObj, 660 .FromJust();
673 const CFX_WideString& wsPropertyName, 661 }
674 double dValue) { 662
675 if (pObj.IsEmpty()) 663 void CFXJS_Engine::PutObjectBoolean(v8::Local<v8::Object> pObj,
676 return; 664 const CFX_WideString& wsPropertyName,
677 pObj->Set(pIsolate->GetCurrentContext(), 665 bool bValue) {
678 FXJS_WSToJSString(pIsolate, wsPropertyName), 666 if (pObj.IsEmpty())
679 v8::Number::New(pIsolate, (double)dValue)) 667 return;
680 .FromJust(); 668 pObj->Set(m_isolate->GetCurrentContext(), WSToJSString(wsPropertyName),
681 } 669 v8::Boolean::New(m_isolate, bValue))
682 670 .FromJust();
683 void FXJS_PutObjectBoolean(v8::Isolate* pIsolate, 671 }
684 v8::Local<v8::Object> pObj, 672
685 const CFX_WideString& wsPropertyName, 673 void CFXJS_Engine::PutObjectObject(v8::Local<v8::Object> pObj,
686 bool bValue) { 674 const CFX_WideString& wsPropertyName,
687 if (pObj.IsEmpty()) 675 v8::Local<v8::Object> pPut) {
688 return; 676 if (pObj.IsEmpty())
689 pObj->Set(pIsolate->GetCurrentContext(), 677 return;
690 FXJS_WSToJSString(pIsolate, wsPropertyName), 678 pObj->Set(m_isolate->GetCurrentContext(), WSToJSString(wsPropertyName), pPut)
691 v8::Boolean::New(pIsolate, bValue)) 679 .FromJust();
692 .FromJust(); 680 }
693 } 681
694 682 void CFXJS_Engine::PutObjectNull(v8::Local<v8::Object> pObj,
695 void FXJS_PutObjectObject(v8::Isolate* pIsolate, 683 const CFX_WideString& wsPropertyName) {
696 v8::Local<v8::Object> pObj, 684 if (pObj.IsEmpty())
697 const CFX_WideString& wsPropertyName, 685 return;
698 v8::Local<v8::Object> pPut) { 686 pObj->Set(m_isolate->GetCurrentContext(), WSToJSString(wsPropertyName),
699 if (pObj.IsEmpty())
700 return;
701 pObj->Set(pIsolate->GetCurrentContext(),
702 FXJS_WSToJSString(pIsolate, wsPropertyName), pPut)
703 .FromJust();
704 }
705
706 void FXJS_PutObjectNull(v8::Isolate* pIsolate,
707 v8::Local<v8::Object> pObj,
708 const CFX_WideString& wsPropertyName) {
709 if (pObj.IsEmpty())
710 return;
711 pObj->Set(pIsolate->GetCurrentContext(),
712 FXJS_WSToJSString(pIsolate, wsPropertyName),
713 v8::Local<v8::Object>()) 687 v8::Local<v8::Object>())
714 .FromJust(); 688 .FromJust();
715 } 689 }
716 690
717 v8::Local<v8::Array> FXJS_NewArray(v8::Isolate* pIsolate) { 691 v8::Local<v8::Array> CFXJS_Engine::NewArray() {
718 return v8::Array::New(pIsolate); 692 return v8::Array::New(m_isolate);
719 } 693 }
720 694
721 unsigned FXJS_PutArrayElement(v8::Isolate* pIsolate, 695 unsigned CFXJS_Engine::PutArrayElement(v8::Local<v8::Array> pArray,
722 v8::Local<v8::Array> pArray, 696 unsigned index,
723 unsigned index, 697 v8::Local<v8::Value> pValue) {
724 v8::Local<v8::Value> pValue) {
725 if (pArray.IsEmpty()) 698 if (pArray.IsEmpty())
726 return 0; 699 return 0;
727 if (pArray->Set(pIsolate->GetCurrentContext(), index, pValue).IsNothing()) 700 if (pArray->Set(m_isolate->GetCurrentContext(), index, pValue).IsNothing())
728 return 0; 701 return 0;
729 return 1; 702 return 1;
730 } 703 }
731 704
732 v8::Local<v8::Value> FXJS_GetArrayElement(v8::Isolate* pIsolate, 705 v8::Local<v8::Value> CFXJS_Engine::GetArrayElement(v8::Local<v8::Array> pArray,
733 v8::Local<v8::Array> pArray, 706 unsigned index) {
734 unsigned index) {
735 if (pArray.IsEmpty()) 707 if (pArray.IsEmpty())
736 return v8::Local<v8::Value>(); 708 return v8::Local<v8::Value>();
737 v8::Local<v8::Value> val; 709 v8::Local<v8::Value> val;
738 if (!pArray->Get(pIsolate->GetCurrentContext(), index).ToLocal(&val)) 710 if (!pArray->Get(m_isolate->GetCurrentContext(), index).ToLocal(&val))
739 return v8::Local<v8::Value>(); 711 return v8::Local<v8::Value>();
740 return val; 712 return val;
741 } 713 }
742 714
743 unsigned FXJS_GetArrayLength(v8::Local<v8::Array> pArray) { 715 unsigned CFXJS_Engine::GetArrayLength(v8::Local<v8::Array> pArray) {
744 if (pArray.IsEmpty()) 716 if (pArray.IsEmpty())
745 return 0; 717 return 0;
746 return pArray->Length(); 718 return pArray->Length();
747 } 719 }
748 720
749 v8::Local<v8::Value> FXJS_NewNumber(v8::Isolate* pIsolate, int number) { 721 v8::Local<v8::Context> CFXJS_Engine::NewLocalContext() {
750 return v8::Int32::New(pIsolate, number); 722 return v8::Local<v8::Context>::New(m_isolate, m_V8PersistentContext);
751 } 723 }
752 724
753 v8::Local<v8::Value> FXJS_NewNumber(v8::Isolate* pIsolate, double number) { 725 v8::Local<v8::Context> CFXJS_Engine::GetPersistentContext() {
754 return v8::Number::New(pIsolate, number); 726 return m_V8PersistentContext.Get(m_isolate);
755 } 727 }
756 728
757 v8::Local<v8::Value> FXJS_NewNumber(v8::Isolate* pIsolate, float number) { 729 v8::Local<v8::Value> CFXJS_Engine::NewNumber(int number) {
758 return v8::Number::New(pIsolate, (float)number); 730 return v8::Int32::New(m_isolate, number);
759 } 731 }
760 732
761 v8::Local<v8::Value> FXJS_NewBoolean(v8::Isolate* pIsolate, bool b) { 733 v8::Local<v8::Value> CFXJS_Engine::NewNumber(double number) {
762 return v8::Boolean::New(pIsolate, b); 734 return v8::Number::New(m_isolate, number);
763 } 735 }
764 736
765 v8::Local<v8::Value> FXJS_NewString(v8::Isolate* pIsolate, const wchar_t* str) { 737 v8::Local<v8::Value> CFXJS_Engine::NewNumber(float number) {
766 return FXJS_WSToJSString(pIsolate, str); 738 return v8::Number::New(m_isolate, (float)number);
767 } 739 }
768 740
769 v8::Local<v8::Value> FXJS_NewNull(v8::Isolate* pIsolate) { 741 v8::Local<v8::Value> CFXJS_Engine::NewBoolean(bool b) {
742 return v8::Boolean::New(m_isolate, b);
743 }
744
745 v8::Local<v8::Value> CFXJS_Engine::NewString(const wchar_t* str) {
746 return WSToJSString(str);
747 }
748
749 v8::Local<v8::Value> CFXJS_Engine::NewNull() {
770 return v8::Local<v8::Value>(); 750 return v8::Local<v8::Value>();
771 } 751 }
772 752
773 v8::Local<v8::Date> FXJS_NewDate(v8::Isolate* pIsolate, double d) { 753 v8::Local<v8::Date> CFXJS_Engine::NewDate(double d) {
774 return v8::Date::New(pIsolate->GetCurrentContext(), d) 754 return v8::Date::New(m_isolate->GetCurrentContext(), d)
775 .ToLocalChecked() 755 .ToLocalChecked()
776 .As<v8::Date>(); 756 .As<v8::Date>();
777 } 757 }
778 758
779 int FXJS_ToInt32(v8::Isolate* pIsolate, v8::Local<v8::Value> pValue) { 759 int CFXJS_Engine::ToInt32(v8::Local<v8::Value> pValue) {
780 if (pValue.IsEmpty()) 760 if (pValue.IsEmpty())
781 return 0; 761 return 0;
782 v8::Local<v8::Context> context = pIsolate->GetCurrentContext(); 762 v8::Local<v8::Context> context = m_isolate->GetCurrentContext();
783 return pValue->ToInt32(context).ToLocalChecked()->Value(); 763 return pValue->ToInt32(context).ToLocalChecked()->Value();
784 } 764 }
785 765
786 bool FXJS_ToBoolean(v8::Isolate* pIsolate, v8::Local<v8::Value> pValue) { 766 bool CFXJS_Engine::ToBoolean(v8::Local<v8::Value> pValue) {
787 if (pValue.IsEmpty()) 767 if (pValue.IsEmpty())
788 return false; 768 return false;
789 v8::Local<v8::Context> context = pIsolate->GetCurrentContext(); 769 v8::Local<v8::Context> context = m_isolate->GetCurrentContext();
790 return pValue->ToBoolean(context).ToLocalChecked()->Value(); 770 return pValue->ToBoolean(context).ToLocalChecked()->Value();
791 } 771 }
792 772
793 double FXJS_ToNumber(v8::Isolate* pIsolate, v8::Local<v8::Value> pValue) { 773 double CFXJS_Engine::ToNumber(v8::Local<v8::Value> pValue) {
794 if (pValue.IsEmpty()) 774 if (pValue.IsEmpty())
795 return 0.0; 775 return 0.0;
796 v8::Local<v8::Context> context = pIsolate->GetCurrentContext(); 776 v8::Local<v8::Context> context = m_isolate->GetCurrentContext();
797 return pValue->ToNumber(context).ToLocalChecked()->Value(); 777 return pValue->ToNumber(context).ToLocalChecked()->Value();
798 } 778 }
799 779
800 v8::Local<v8::Object> FXJS_ToObject(v8::Isolate* pIsolate, 780 v8::Local<v8::Object> CFXJS_Engine::ToObject(v8::Local<v8::Value> pValue) {
801 v8::Local<v8::Value> pValue) {
802 if (pValue.IsEmpty()) 781 if (pValue.IsEmpty())
803 return v8::Local<v8::Object>(); 782 return v8::Local<v8::Object>();
804 v8::Local<v8::Context> context = pIsolate->GetCurrentContext(); 783 v8::Local<v8::Context> context = m_isolate->GetCurrentContext();
805 return pValue->ToObject(context).ToLocalChecked(); 784 return pValue->ToObject(context).ToLocalChecked();
806 } 785 }
807 786
808 CFX_WideString FXJS_ToString(v8::Isolate* pIsolate, 787 CFX_WideString CFXJS_Engine::ToString(v8::Local<v8::Value> pValue) {
809 v8::Local<v8::Value> pValue) {
810 if (pValue.IsEmpty()) 788 if (pValue.IsEmpty())
811 return L""; 789 return L"";
812 v8::Local<v8::Context> context = pIsolate->GetCurrentContext(); 790 v8::Local<v8::Context> context = m_isolate->GetCurrentContext();
813 v8::String::Utf8Value s(pValue->ToString(context).ToLocalChecked()); 791 v8::String::Utf8Value s(pValue->ToString(context).ToLocalChecked());
814 return CFX_WideString::FromUTF8(CFX_ByteStringC(*s, s.length())); 792 return CFX_WideString::FromUTF8(CFX_ByteStringC(*s, s.length()));
815 } 793 }
816 794
817 v8::Local<v8::Array> FXJS_ToArray(v8::Isolate* pIsolate, 795 v8::Local<v8::Array> CFXJS_Engine::ToArray(v8::Local<v8::Value> pValue) {
818 v8::Local<v8::Value> pValue) {
819 if (pValue.IsEmpty()) 796 if (pValue.IsEmpty())
820 return v8::Local<v8::Array>(); 797 return v8::Local<v8::Array>();
821 v8::Local<v8::Context> context = pIsolate->GetCurrentContext(); 798 v8::Local<v8::Context> context = m_isolate->GetCurrentContext();
822 return v8::Local<v8::Array>::Cast(pValue->ToObject(context).ToLocalChecked()); 799 return v8::Local<v8::Array>::Cast(pValue->ToObject(context).ToLocalChecked());
823 } 800 }
801
802 void CFXJS_Engine::SetConstArray(const CFX_WideString& name,
803 v8::Local<v8::Array> array) {
804 m_ConstArrays[name] = v8::Global<v8::Array>(GetIsolate(), array);
805 }
806
807 v8::Local<v8::Array> CFXJS_Engine::GetConstArray(const CFX_WideString& name) {
808 return v8::Local<v8::Array>::New(GetIsolate(), m_ConstArrays[name]);
809 }
OLDNEW
« no previous file with comments | « fpdfsdk/javascript/util.cpp ('k') | fxjs/fxjs_v8_embeddertest.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698