| Index: fpdfsdk/include/jsapi/fxjs_v8.h
|
| diff --git a/fpdfsdk/include/jsapi/fxjs_v8.h b/fpdfsdk/include/jsapi/fxjs_v8.h
|
| index b0845a396f400209092a7a537130375732e6130f..50b2656e9122185d4015b79cf9480cdefa3988ef 100644
|
| --- a/fpdfsdk/include/jsapi/fxjs_v8.h
|
| +++ b/fpdfsdk/include/jsapi/fxjs_v8.h
|
| @@ -15,6 +15,7 @@
|
| #define FPDFSDK_INCLUDE_JSAPI_FXJS_V8_H_
|
|
|
| #include <v8.h>
|
| +#include <v8-util.h>
|
|
|
| #include <vector>
|
|
|
| @@ -45,21 +46,76 @@ struct FXJSErr {
|
| unsigned linnum;
|
| };
|
|
|
| +// Global weak map to save dynamic objects.
|
| +class V8TemplateMapTraits : public v8::StdMapTraits<void*, v8::Object> {
|
| + public:
|
| + typedef v8::GlobalValueMap<void*, v8::Object, V8TemplateMapTraits> MapType;
|
| + typedef void WeakCallbackDataType;
|
| +
|
| + static WeakCallbackDataType* WeakCallbackParameter(
|
| + MapType* map,
|
| + void* key,
|
| + const v8::Local<v8::Object>& value) {
|
| + return key;
|
| + }
|
| + static MapType* MapFromWeakCallbackInfo(
|
| + const v8::WeakCallbackInfo<WeakCallbackDataType>&);
|
| +
|
| + static void* KeyFromWeakCallbackInfo(
|
| + const v8::WeakCallbackInfo<WeakCallbackDataType>& data) {
|
| + return data.GetParameter();
|
| + }
|
| + static const v8::PersistentContainerCallbackType kCallbackType =
|
| + v8::kWeakWithInternalFields;
|
| + static void DisposeWeak(
|
| + const v8::WeakCallbackInfo<WeakCallbackDataType>& data) {}
|
| + static void OnWeakCallback(
|
| + const v8::WeakCallbackInfo<WeakCallbackDataType>& data) {}
|
| + static void Dispose(v8::Isolate* isolate,
|
| + v8::Global<v8::Object> value,
|
| + void* key);
|
| + static void DisposeCallbackData(WeakCallbackDataType* callbackData) {}
|
| +};
|
| +
|
| +class V8TemplateMap {
|
| + public:
|
| + typedef v8::GlobalValueMap<void*, v8::Object, V8TemplateMapTraits> MapType;
|
| +
|
| + void set(void* key, v8::Local<v8::Object> handle) {
|
| + ASSERT(!m_map.Contains(key));
|
| + m_map.Set(key, handle);
|
| + }
|
| + explicit V8TemplateMap(v8::Isolate* isolate) : m_map(isolate) {}
|
| + friend class V8TemplateMapTraits;
|
| +
|
| + private:
|
| + MapType m_map;
|
| +};
|
| +
|
| class FXJS_PerIsolateData {
|
| public:
|
| static void SetUp(v8::Isolate* pIsolate);
|
| static FXJS_PerIsolateData* Get(v8::Isolate* pIsolate);
|
| + void CreateDynamicObjsMap(v8::Isolate* pIsolate) {
|
| + m_pDynamicObjsMap = new V8TemplateMap(pIsolate);
|
| + }
|
| + void ReleaseDynamicObjsMap() {
|
| + delete m_pDynamicObjsMap;
|
| + m_pDynamicObjsMap = nullptr;
|
| + }
|
|
|
| std::vector<CFXJS_ObjDefinition*> m_ObjectDefnArray;
|
| #ifdef PDF_ENABLE_XFA
|
| CFXJSE_RuntimeData* m_pFXJSERuntimeData;
|
| #endif // PDF_ENABLE_XFA
|
| + V8TemplateMap* m_pDynamicObjsMap;
|
|
|
| protected:
|
| #ifndef PDF_ENABLE_XFA
|
| - FXJS_PerIsolateData() {}
|
| + FXJS_PerIsolateData() : m_pDynamicObjsMap(nullptr) {}
|
| #else // PDF_ENABLE_XFA
|
| - FXJS_PerIsolateData() : m_pFXJSERuntimeData(nullptr) {}
|
| + FXJS_PerIsolateData()
|
| + : m_pFXJSERuntimeData(nullptr), m_pDynamicObjsMap(nullptr) {}
|
| #endif // PDF_ENABLE_XFA
|
| };
|
|
|
| @@ -160,7 +216,8 @@ int FXJS_Execute(v8::Isolate* pIsolate,
|
|
|
| v8::Local<v8::Object> FXJS_NewFxDynamicObj(v8::Isolate* pIsolate,
|
| IJS_Runtime* pJSContext,
|
| - int nObjDefnID);
|
| + int nObjDefnID,
|
| + bool bStatic = false);
|
| v8::Local<v8::Object> FXJS_GetThisObj(v8::Isolate* pIsolate);
|
| int FXJS_GetObjDefnID(v8::Local<v8::Object> pObj);
|
| const wchar_t* FXJS_GetTypeof(v8::Local<v8::Value> pObj);
|
|
|