Index: fxjse/include/fxjs_perisolatedata.h |
diff --git a/fxjse/include/fxjs_perisolatedata.h b/fxjse/include/fxjs_perisolatedata.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..8f22176ecd5b0d7b6b9d461acf4eea38c747882e |
--- /dev/null |
+++ b/fxjse/include/fxjs_perisolatedata.h |
@@ -0,0 +1,166 @@ |
+// Copyright 2016 PDFium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com |
+ |
+#ifndef FXJSE_INCLUDE_FXJS_PERISOLATEDATA_H_ |
+#define FXJSE_INCLUDE_FXJS_PERISOLATEDATA_H_ |
+ |
+#include <v8-util.h> |
+#include <v8.h> |
+ |
+#include "core/fxcrt/include/fx_string.h" |
+ |
+class CFXJSE_RuntimeData; |
+class CFXJS_ObjDefinition; |
+class IJS_Runtime; // A native runtime, typically owns the v8::Context. |
+ |
+using FXJS_CONSTRUCTOR = void (*)(IJS_Runtime* cc, v8::Local<v8::Object> obj); |
+using FXJS_DESTRUCTOR = void (*)(v8::Local<v8::Object> obj); |
+ |
+enum FXJSOBJTYPE { |
+ FXJSOBJTYPE_DYNAMIC = 0, // Created by native method and returned to JS. |
+ FXJSOBJTYPE_STATIC, // Created by init and hung off of global object. |
+ FXJSOBJTYPE_GLOBAL, // The global object itself (may only appear once). |
+}; |
+ |
+// 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 SetEmbedderDataSlot(unsigned int slot); |
+ static unsigned int EmbedderDataSlot(); |
+ |
+ static void SetUp(v8::Isolate* pIsolate); |
+ static FXJS_PerIsolateData* Get(v8::Isolate* pIsolate); |
+ |
+ void CreateDynamicObjsMap(v8::Isolate* pIsolate) { |
+ if (!m_pDynamicObjsMap) |
+ 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() : m_pDynamicObjsMap(nullptr) {} |
+#else // PDF_ENABLE_XFA |
+ FXJS_PerIsolateData() |
+ : m_pFXJSERuntimeData(nullptr), m_pDynamicObjsMap(nullptr) {} |
+#endif // PDF_ENABLE_XFA |
+}; |
+ |
+class CFXJS_ObjDefinition { |
+ public: |
+ static int MaxID(v8::Isolate* pIsolate) { |
+ return FXJS_PerIsolateData::Get(pIsolate)->m_ObjectDefnArray.size(); |
+ } |
+ |
+ static CFXJS_ObjDefinition* ForID(v8::Isolate* pIsolate, int id) { |
+ // Note: GetAt() halts if out-of-range even in release builds. |
+ return FXJS_PerIsolateData::Get(pIsolate)->m_ObjectDefnArray[id]; |
+ } |
+ |
+ CFXJS_ObjDefinition(v8::Isolate* isolate, |
+ const wchar_t* sObjName, |
+ FXJSOBJTYPE eObjType, |
+ FXJS_CONSTRUCTOR pConstructor, |
+ FXJS_DESTRUCTOR pDestructor) |
+ : m_ObjName(sObjName), |
+ m_ObjType(eObjType), |
+ m_pConstructor(pConstructor), |
+ m_pDestructor(pDestructor), |
+ m_pIsolate(isolate) { |
+ v8::Isolate::Scope isolate_scope(isolate); |
+ v8::HandleScope handle_scope(isolate); |
+ |
+ v8::Local<v8::FunctionTemplate> fun = v8::FunctionTemplate::New(isolate); |
+ fun->InstanceTemplate()->SetInternalFieldCount(2); |
+ m_FunctionTemplate.Reset(isolate, fun); |
+ |
+ v8::Local<v8::Signature> sig = v8::Signature::New(isolate, fun); |
+ m_Signature.Reset(isolate, sig); |
+ } |
+ |
+ int AssignID() { |
+ FXJS_PerIsolateData* pData = FXJS_PerIsolateData::Get(m_pIsolate); |
+ pData->m_ObjectDefnArray.push_back(this); |
+ return pData->m_ObjectDefnArray.size() - 1; |
+ } |
+ |
+ v8::Local<v8::ObjectTemplate> GetInstanceTemplate() { |
+ v8::EscapableHandleScope scope(m_pIsolate); |
+ v8::Local<v8::FunctionTemplate> function = |
+ m_FunctionTemplate.Get(m_pIsolate); |
+ return scope.Escape(function->InstanceTemplate()); |
+ } |
+ |
+ v8::Local<v8::Signature> GetSignature() { |
+ v8::EscapableHandleScope scope(m_pIsolate); |
+ return scope.Escape(m_Signature.Get(m_pIsolate)); |
+ } |
+ |
+ const wchar_t* const m_ObjName; |
+ const FXJSOBJTYPE m_ObjType; |
+ const FXJS_CONSTRUCTOR m_pConstructor; |
+ const FXJS_DESTRUCTOR m_pDestructor; |
+ |
+ v8::Isolate* m_pIsolate; |
+ v8::Global<v8::FunctionTemplate> m_FunctionTemplate; |
+ v8::Global<v8::Signature> m_Signature; |
+}; |
+ |
+#endif // FXJSE_INCLUDE_FXJS_PERISOLATEDATA_H_ |