Chromium Code Reviews| 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..c9f50eade2a5dea3d8692ca07c635b488606ac30 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,6 +46,52 @@ struct FXJSErr { |
| unsigned linnum; |
| }; |
| +// Global week map to put the dynamic objects. |
|
jun_fang
2016/01/26 05:18:58
nit: no 'the'
jun_fang
2016/01/26 05:18:58
weak?
|
| +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); |
| @@ -54,12 +101,22 @@ class FXJS_PerIsolateData { |
| #ifdef PDF_ENABLE_XFA |
| CFXJSE_RuntimeData* m_pFXJSERuntimeData; |
| #endif // PDF_ENABLE_XFA |
| + V8TemplateMap* m_pDynamicObjsMap; |
| + void CreateDynamicObjsMap(v8::Isolate* pIsolate) { |
| + m_pDynamicObjsMap = new V8TemplateMap(pIsolate); |
| + } |
| + void ReleaseDynamicObjsMap() { |
| + if (m_pDynamicObjsMap) |
|
jun_fang
2016/01/26 05:18:58
No need to test |m_pDynamicObjsMap| when we try to
|
| + delete m_pDynamicObjsMap; |
| + m_pDynamicObjsMap = nullptr; |
| + } |
| protected: |
| #ifndef PDF_ENABLE_XFA |
| FXJS_PerIsolateData() {} |
|
jun_fang
2016/01/26 05:18:58
Should add |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 +217,8 @@ int FXJS_Execute(v8::Isolate* pIsolate, |
| v8::Local<v8::Object> FXJS_NewFxDynamicObj(v8::Isolate* pIsolate, |
| IJS_Runtime* pJSContext, |
| - int nObjDefnID); |
| + int nObjDefnID, |
| + FX_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); |