OLD | NEW |
---|---|
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 "fpdfsdk/include/jsapi/fxjs_v8.h" | 7 #include "fpdfsdk/include/jsapi/fxjs_v8.h" |
8 | 8 |
9 #include "core/include/fxcrt/fx_basic.h" | 9 #include "core/include/fxcrt/fx_basic.h" |
10 | 10 |
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
118 } | 118 } |
119 | 119 |
120 void* FXJS_ArrayBufferAllocator::AllocateUninitialized(size_t length) { | 120 void* FXJS_ArrayBufferAllocator::AllocateUninitialized(size_t length) { |
121 return malloc(length); | 121 return malloc(length); |
122 } | 122 } |
123 | 123 |
124 void FXJS_ArrayBufferAllocator::Free(void* data, size_t length) { | 124 void FXJS_ArrayBufferAllocator::Free(void* data, size_t length) { |
125 free(data); | 125 free(data); |
126 } | 126 } |
127 | 127 |
128 void V8TemplateMapTraits::Dispose(v8::Isolate* isolate, | |
129 v8::Global<v8::Object> value, | |
130 void* key) { | |
131 v8::Local<v8::Object> obj = value.Get(isolate); | |
132 int id = FXJS_GetObjDefnID(obj); | |
133 if (id == -1) | |
jun_fang
2016/01/26 05:56:15
if (id == -1 || obj.IsEmpty())
| |
134 return; | |
135 | |
136 CFXJS_ObjDefinition* pObjDef = CFXJS_ObjDefinition::ForID(isolate, id); | |
137 if (!pObjDef) | |
138 return; | |
139 if (!obj.IsEmpty()) { | |
jun_fang
2016/01/26 05:56:15
Test obj at line 133.
| |
140 if (pObjDef->m_pDestructor) | |
141 pObjDef->m_pDestructor(obj); | |
142 FXJS_FreePrivate(obj); | |
143 } | |
144 } | |
145 | |
146 V8TemplateMapTraits::MapType* V8TemplateMapTraits::MapFromWeakCallbackInfo( | |
147 const v8::WeakCallbackInfo<WeakCallbackDataType>& data) { | |
148 if (V8TemplateMap* pMap = | |
jun_fang
2016/01/26 05:56:15
V8TemplateMap* pMap = FXJS_PerIsolateData::Get(dat
| |
149 (FXJS_PerIsolateData::Get(data.GetIsolate()))->m_pDynamicObjsMap) | |
150 return &pMap->m_map; | |
151 return nullptr; | |
152 } | |
153 | |
128 void FXJS_Initialize(unsigned int embedderDataSlot, v8::Isolate* pIsolate) { | 154 void FXJS_Initialize(unsigned int embedderDataSlot, v8::Isolate* pIsolate) { |
129 if (g_isolate) { | 155 if (g_isolate) { |
130 ASSERT(g_embedderDataSlot == embedderDataSlot); | 156 ASSERT(g_embedderDataSlot == embedderDataSlot); |
131 ASSERT(g_isolate == pIsolate); | 157 ASSERT(g_isolate == pIsolate); |
132 return; | 158 return; |
133 } | 159 } |
134 g_embedderDataSlot = embedderDataSlot; | 160 g_embedderDataSlot = embedderDataSlot; |
135 g_isolate = pIsolate; | 161 g_isolate = pIsolate; |
136 } | 162 } |
137 | 163 |
(...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
283 v8::Isolate::Scope isolate_scope(pIsolate); | 309 v8::Isolate::Scope isolate_scope(pIsolate); |
284 #ifdef PDF_ENABLE_XFA | 310 #ifdef PDF_ENABLE_XFA |
285 v8::Locker locker(pIsolate); | 311 v8::Locker locker(pIsolate); |
286 #endif // PDF_ENABLE_XFA | 312 #endif // PDF_ENABLE_XFA |
287 v8::HandleScope handle_scope(pIsolate); | 313 v8::HandleScope handle_scope(pIsolate); |
288 v8::Local<v8::Context> v8Context = | 314 v8::Local<v8::Context> v8Context = |
289 v8::Context::New(pIsolate, NULL, GetGlobalObjectTemplate(pIsolate)); | 315 v8::Context::New(pIsolate, NULL, GetGlobalObjectTemplate(pIsolate)); |
290 v8::Context::Scope context_scope(v8Context); | 316 v8::Context::Scope context_scope(v8Context); |
291 | 317 |
292 FXJS_PerIsolateData::SetUp(pIsolate); | 318 FXJS_PerIsolateData::SetUp(pIsolate); |
319 FXJS_PerIsolateData* pData = FXJS_PerIsolateData::Get(pIsolate); | |
320 if (!pData) | |
321 return; | |
322 pData->CreateDynamicObjsMap(pIsolate); | |
293 v8Context->SetAlignedPointerInEmbedderData(kPerContextDataIndex, pIRuntime); | 323 v8Context->SetAlignedPointerInEmbedderData(kPerContextDataIndex, pIRuntime); |
294 | 324 |
295 int maxID = CFXJS_ObjDefinition::MaxID(pIsolate); | 325 int maxID = CFXJS_ObjDefinition::MaxID(pIsolate); |
296 pStaticObjects->resize(maxID + 1); | 326 pStaticObjects->resize(maxID + 1); |
297 for (int i = 0; i < maxID; ++i) { | 327 for (int i = 0; i < maxID; ++i) { |
298 CFXJS_ObjDefinition* pObjDef = CFXJS_ObjDefinition::ForID(pIsolate, i); | 328 CFXJS_ObjDefinition* pObjDef = CFXJS_ObjDefinition::ForID(pIsolate, i); |
299 if (pObjDef->m_ObjType == FXJSOBJTYPE_GLOBAL) { | 329 if (pObjDef->m_ObjType == FXJSOBJTYPE_GLOBAL) { |
300 v8Context->Global() | 330 v8Context->Global() |
301 ->GetPrototype() | 331 ->GetPrototype() |
302 ->ToObject(v8Context) | 332 ->ToObject(v8Context) |
303 .ToLocalChecked() | 333 .ToLocalChecked() |
304 ->SetAlignedPointerInInternalField(0, new CFXJS_PerObjectData(i)); | 334 ->SetAlignedPointerInInternalField(0, new CFXJS_PerObjectData(i)); |
305 | 335 |
306 if (pObjDef->m_pConstructor) | 336 if (pObjDef->m_pConstructor) |
307 pObjDef->m_pConstructor(pIRuntime, v8Context->Global() | 337 pObjDef->m_pConstructor(pIRuntime, v8Context->Global() |
308 ->GetPrototype() | 338 ->GetPrototype() |
309 ->ToObject(v8Context) | 339 ->ToObject(v8Context) |
310 .ToLocalChecked()); | 340 .ToLocalChecked()); |
311 } else if (pObjDef->m_ObjType == FXJSOBJTYPE_STATIC) { | 341 } else if (pObjDef->m_ObjType == FXJSOBJTYPE_STATIC) { |
312 CFX_ByteString bs = CFX_WideString(pObjDef->m_ObjName).UTF8Encode(); | 342 CFX_ByteString bs = CFX_WideString(pObjDef->m_ObjName).UTF8Encode(); |
313 v8::Local<v8::String> m_ObjName = | 343 v8::Local<v8::String> m_ObjName = |
314 v8::String::NewFromUtf8(pIsolate, bs.c_str(), | 344 v8::String::NewFromUtf8(pIsolate, bs.c_str(), |
315 v8::NewStringType::kNormal, | 345 v8::NewStringType::kNormal, |
316 bs.GetLength()).ToLocalChecked(); | 346 bs.GetLength()).ToLocalChecked(); |
317 | 347 |
318 v8::Local<v8::Object> obj = FXJS_NewFxDynamicObj(pIsolate, pIRuntime, i); | 348 v8::Local<v8::Object> obj = |
349 FXJS_NewFxDynamicObj(pIsolate, pIRuntime, i, TRUE); | |
319 v8Context->Global()->Set(v8Context, m_ObjName, obj).FromJust(); | 350 v8Context->Global()->Set(v8Context, m_ObjName, obj).FromJust(); |
320 pStaticObjects->at(i) = new v8::Global<v8::Object>(pIsolate, obj); | 351 pStaticObjects->at(i) = new v8::Global<v8::Object>(pIsolate, obj); |
321 } | 352 } |
322 } | 353 } |
323 pV8PersistentContext->Reset(pIsolate, v8Context); | 354 pV8PersistentContext->Reset(pIsolate, v8Context); |
324 } | 355 } |
325 | 356 |
326 void FXJS_ReleaseRuntime(v8::Isolate* pIsolate, | 357 void FXJS_ReleaseRuntime(v8::Isolate* pIsolate, |
327 v8::Global<v8::Context>* pV8PersistentContext, | 358 v8::Global<v8::Context>* pV8PersistentContext, |
328 std::vector<v8::Global<v8::Object>*>* pStaticObjects) { | 359 std::vector<v8::Global<v8::Object>*>* pStaticObjects) { |
329 v8::Isolate::Scope isolate_scope(pIsolate); | 360 v8::Isolate::Scope isolate_scope(pIsolate); |
330 #ifdef PDF_ENABLE_XFA | 361 #ifdef PDF_ENABLE_XFA |
331 v8::Locker locker(pIsolate); | 362 v8::Locker locker(pIsolate); |
332 #endif // PDF_ENABLE_XFA | 363 #endif // PDF_ENABLE_XFA |
333 v8::HandleScope handle_scope(pIsolate); | 364 v8::HandleScope handle_scope(pIsolate); |
334 v8::Local<v8::Context> context = | 365 v8::Local<v8::Context> context = |
335 v8::Local<v8::Context>::New(pIsolate, *pV8PersistentContext); | 366 v8::Local<v8::Context>::New(pIsolate, *pV8PersistentContext); |
336 v8::Context::Scope context_scope(context); | 367 v8::Context::Scope context_scope(context); |
337 | 368 |
338 FXJS_PerIsolateData* pData = FXJS_PerIsolateData::Get(pIsolate); | 369 FXJS_PerIsolateData* pData = FXJS_PerIsolateData::Get(pIsolate); |
339 if (!pData) | 370 if (!pData) |
340 return; | 371 return; |
372 pData->ReleaseDynamicObjsMap(); | |
341 | 373 |
342 #ifdef PDF_ENABLE_XFA | 374 #ifdef PDF_ENABLE_XFA |
343 // XFA, if present, should have already cleaned itself up. | 375 // XFA, if present, should have already cleaned itself up. |
344 FXSYS_assert(!pData->m_pFXJSERuntimeData); | 376 FXSYS_assert(!pData->m_pFXJSERuntimeData); |
345 #endif // PDF_ENABLE_XFA | 377 #endif // PDF_ENABLE_XFA |
346 | 378 |
347 int maxID = CFXJS_ObjDefinition::MaxID(pIsolate); | 379 int maxID = CFXJS_ObjDefinition::MaxID(pIsolate); |
348 for (int i = 0; i < maxID; ++i) { | 380 for (int i = 0; i < maxID; ++i) { |
349 CFXJS_ObjDefinition* pObjDef = CFXJS_ObjDefinition::ForID(pIsolate, i); | 381 CFXJS_ObjDefinition* pObjDef = CFXJS_ObjDefinition::ForID(pIsolate, i); |
350 v8::Local<v8::Object> pObj; | 382 v8::Local<v8::Object> pObj; |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
410 if (!compiled_script->Run(context).ToLocal(&result)) { | 442 if (!compiled_script->Run(context).ToLocal(&result)) { |
411 v8::String::Utf8Value error(try_catch.Exception()); | 443 v8::String::Utf8Value error(try_catch.Exception()); |
412 // TODO(tsepez): return error via pError->message. | 444 // TODO(tsepez): return error via pError->message. |
413 return -1; | 445 return -1; |
414 } | 446 } |
415 return 0; | 447 return 0; |
416 } | 448 } |
417 | 449 |
418 v8::Local<v8::Object> FXJS_NewFxDynamicObj(v8::Isolate* pIsolate, | 450 v8::Local<v8::Object> FXJS_NewFxDynamicObj(v8::Isolate* pIsolate, |
419 IJS_Runtime* pIRuntime, | 451 IJS_Runtime* pIRuntime, |
420 int nObjDefnID) { | 452 int nObjDefnID, |
453 FX_BOOL bStatic) { | |
421 v8::Isolate::Scope isolate_scope(pIsolate); | 454 v8::Isolate::Scope isolate_scope(pIsolate); |
422 v8::Local<v8::Context> context = pIsolate->GetCurrentContext(); | 455 v8::Local<v8::Context> context = pIsolate->GetCurrentContext(); |
423 if (nObjDefnID == -1) { | 456 if (nObjDefnID == -1) { |
424 v8::Local<v8::ObjectTemplate> objTempl = v8::ObjectTemplate::New(pIsolate); | 457 v8::Local<v8::ObjectTemplate> objTempl = v8::ObjectTemplate::New(pIsolate); |
425 v8::Local<v8::Object> obj; | 458 v8::Local<v8::Object> obj; |
426 if (!objTempl->NewInstance(context).ToLocal(&obj)) | 459 if (!objTempl->NewInstance(context).ToLocal(&obj)) |
427 return v8::Local<v8::Object>(); | 460 return v8::Local<v8::Object>(); |
428 return obj; | 461 return obj; |
429 } | 462 } |
430 | 463 |
431 FXJS_PerIsolateData* pData = FXJS_PerIsolateData::Get(pIsolate); | 464 FXJS_PerIsolateData* pData = FXJS_PerIsolateData::Get(pIsolate); |
432 if (!pData) | 465 if (!pData) |
433 return v8::Local<v8::Object>(); | 466 return v8::Local<v8::Object>(); |
434 | 467 |
435 if (nObjDefnID < 0 || nObjDefnID >= CFXJS_ObjDefinition::MaxID(pIsolate)) | 468 if (nObjDefnID < 0 || nObjDefnID >= CFXJS_ObjDefinition::MaxID(pIsolate)) |
436 return v8::Local<v8::Object>(); | 469 return v8::Local<v8::Object>(); |
437 | 470 |
438 CFXJS_ObjDefinition* pObjDef = | 471 CFXJS_ObjDefinition* pObjDef = |
439 CFXJS_ObjDefinition::ForID(pIsolate, nObjDefnID); | 472 CFXJS_ObjDefinition::ForID(pIsolate, nObjDefnID); |
440 v8::Local<v8::Object> obj; | 473 v8::Local<v8::Object> obj; |
441 if (!pObjDef->GetInstanceTemplate()->NewInstance(context).ToLocal(&obj)) | 474 if (!pObjDef->GetInstanceTemplate()->NewInstance(context).ToLocal(&obj)) |
442 return v8::Local<v8::Object>(); | 475 return v8::Local<v8::Object>(); |
443 | 476 |
444 obj->SetAlignedPointerInInternalField(0, new CFXJS_PerObjectData(nObjDefnID)); | 477 CFXJS_PerObjectData* pPerObjData = new CFXJS_PerObjectData(nObjDefnID); |
478 obj->SetAlignedPointerInInternalField(0, pPerObjData); | |
445 if (pObjDef->m_pConstructor) | 479 if (pObjDef->m_pConstructor) |
446 pObjDef->m_pConstructor(pIRuntime, obj); | 480 pObjDef->m_pConstructor(pIRuntime, obj); |
447 | 481 |
482 if (!bStatic && FXJS_PerIsolateData::Get(pIsolate)->m_pDynamicObjsMap) | |
483 FXJS_PerIsolateData::Get(pIsolate) | |
484 ->m_pDynamicObjsMap->set(pPerObjData, obj); | |
485 | |
448 return obj; | 486 return obj; |
449 } | 487 } |
450 | 488 |
451 v8::Local<v8::Object> FXJS_GetThisObj(v8::Isolate* pIsolate) { | 489 v8::Local<v8::Object> FXJS_GetThisObj(v8::Isolate* pIsolate) { |
452 v8::Isolate::Scope isolate_scope(pIsolate); | 490 v8::Isolate::Scope isolate_scope(pIsolate); |
453 if (!FXJS_PerIsolateData::Get(pIsolate)) | 491 if (!FXJS_PerIsolateData::Get(pIsolate)) |
454 return v8::Local<v8::Object>(); | 492 return v8::Local<v8::Object>(); |
455 | 493 |
456 // Return the global object. | 494 // Return the global object. |
457 v8::Local<v8::Context> context = pIsolate->GetCurrentContext(); | 495 v8::Local<v8::Context> context = pIsolate->GetCurrentContext(); |
(...skipping 311 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
769 return v8::Local<v8::Array>(); | 807 return v8::Local<v8::Array>(); |
770 v8::Local<v8::Context> context = pIsolate->GetCurrentContext(); | 808 v8::Local<v8::Context> context = pIsolate->GetCurrentContext(); |
771 return v8::Local<v8::Array>::Cast(pValue->ToObject(context).ToLocalChecked()); | 809 return v8::Local<v8::Array>::Cast(pValue->ToObject(context).ToLocalChecked()); |
772 } | 810 } |
773 | 811 |
774 void FXJS_ValueCopy(v8::Local<v8::Value>& pTo, v8::Local<v8::Value> pFrom) { | 812 void FXJS_ValueCopy(v8::Local<v8::Value>& pTo, v8::Local<v8::Value> pFrom) { |
775 pTo = pFrom; | 813 pTo = pFrom; |
776 } | 814 } |
777 | 815 |
778 | 816 |
OLD | NEW |