Index: fpdfsdk/src/jsapi/fxjs_v8.cpp |
diff --git a/fpdfsdk/src/jsapi/fxjs_v8.cpp b/fpdfsdk/src/jsapi/fxjs_v8.cpp |
index b06f747edb60c0b64742cc517eef31135a8141a2..9b6b5fa445c46f7cadc61dae8fbc6a8c33551d66 100644 |
--- a/fpdfsdk/src/jsapi/fxjs_v8.cpp |
+++ b/fpdfsdk/src/jsapi/fxjs_v8.cpp |
@@ -125,6 +125,31 @@ void FXJS_ArrayBufferAllocator::Free(void* data, size_t length) { |
free(data); |
} |
+void V8TemplateMapTraits::Dispose(v8::Isolate* isolate, |
+ v8::Global<v8::Object> value, |
+ void* key) { |
+ v8::Local<v8::Object> obj = value.Get(isolate); |
+ if (obj.IsEmpty()) |
+ return; |
+ int id = FXJS_GetObjDefnID(obj); |
+ if (id == -1) |
+ return; |
+ |
+ CFXJS_ObjDefinition* pObjDef = CFXJS_ObjDefinition::ForID(isolate, id); |
+ if (!pObjDef) |
+ return; |
+ if (pObjDef->m_pDestructor) |
+ pObjDef->m_pDestructor(obj); |
+ FXJS_FreePrivate(obj); |
+} |
+ |
+V8TemplateMapTraits::MapType* V8TemplateMapTraits::MapFromWeakCallbackInfo( |
+ const v8::WeakCallbackInfo<WeakCallbackDataType>& data) { |
+ V8TemplateMap* pMap = |
+ (FXJS_PerIsolateData::Get(data.GetIsolate()))->m_pDynamicObjsMap; |
+ return pMap ? &pMap->m_map : nullptr; |
+} |
+ |
void FXJS_Initialize(unsigned int embedderDataSlot, v8::Isolate* pIsolate) { |
if (g_isolate) { |
ASSERT(g_embedderDataSlot == embedderDataSlot); |
@@ -290,6 +315,10 @@ void FXJS_InitializeRuntime( |
v8::Context::Scope context_scope(v8Context); |
FXJS_PerIsolateData::SetUp(pIsolate); |
+ FXJS_PerIsolateData* pData = FXJS_PerIsolateData::Get(pIsolate); |
+ if (!pData) |
+ return; |
+ pData->CreateDynamicObjsMap(pIsolate); |
v8Context->SetAlignedPointerInEmbedderData(kPerContextDataIndex, pIRuntime); |
int maxID = CFXJS_ObjDefinition::MaxID(pIsolate); |
@@ -315,7 +344,8 @@ void FXJS_InitializeRuntime( |
v8::NewStringType::kNormal, |
bs.GetLength()).ToLocalChecked(); |
- v8::Local<v8::Object> obj = FXJS_NewFxDynamicObj(pIsolate, pIRuntime, i); |
+ v8::Local<v8::Object> obj = |
+ FXJS_NewFxDynamicObj(pIsolate, pIRuntime, i, true); |
v8Context->Global()->Set(v8Context, m_ObjName, obj).FromJust(); |
pStaticObjects->at(i) = new v8::Global<v8::Object>(pIsolate, obj); |
} |
@@ -338,6 +368,7 @@ void FXJS_ReleaseRuntime(v8::Isolate* pIsolate, |
FXJS_PerIsolateData* pData = FXJS_PerIsolateData::Get(pIsolate); |
if (!pData) |
return; |
+ pData->ReleaseDynamicObjsMap(); |
#ifdef PDF_ENABLE_XFA |
// XFA, if present, should have already cleaned itself up. |
@@ -417,7 +448,8 @@ int FXJS_Execute(v8::Isolate* pIsolate, |
v8::Local<v8::Object> FXJS_NewFxDynamicObj(v8::Isolate* pIsolate, |
IJS_Runtime* pIRuntime, |
- int nObjDefnID) { |
+ int nObjDefnID, |
+ bool bStatic) { |
v8::Isolate::Scope isolate_scope(pIsolate); |
v8::Local<v8::Context> context = pIsolate->GetCurrentContext(); |
if (nObjDefnID == -1) { |
@@ -441,10 +473,15 @@ v8::Local<v8::Object> FXJS_NewFxDynamicObj(v8::Isolate* pIsolate, |
if (!pObjDef->GetInstanceTemplate()->NewInstance(context).ToLocal(&obj)) |
return v8::Local<v8::Object>(); |
- obj->SetAlignedPointerInInternalField(0, new CFXJS_PerObjectData(nObjDefnID)); |
+ CFXJS_PerObjectData* pPerObjData = new CFXJS_PerObjectData(nObjDefnID); |
+ obj->SetAlignedPointerInInternalField(0, pPerObjData); |
if (pObjDef->m_pConstructor) |
pObjDef->m_pConstructor(pIRuntime, obj); |
+ if (!bStatic && FXJS_PerIsolateData::Get(pIsolate)->m_pDynamicObjsMap) { |
+ FXJS_PerIsolateData::Get(pIsolate) |
+ ->m_pDynamicObjsMap->set(pPerObjData, obj); |
+ } |
return obj; |
} |