OLD | NEW |
(Empty) | |
| 1 // Copyright 2016 PDFium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. |
| 4 |
| 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com |
| 6 |
| 7 #ifndef FXJSE_INCLUDE_FXJS_PERISOLATEDATA_H_ |
| 8 #define FXJSE_INCLUDE_FXJS_PERISOLATEDATA_H_ |
| 9 |
| 10 #include <v8-util.h> |
| 11 #include <v8.h> |
| 12 |
| 13 #include "core/fxcrt/include/fx_string.h" |
| 14 |
| 15 class CFXJSE_RuntimeData; |
| 16 class CFXJS_ObjDefinition; |
| 17 class IJS_Runtime; // A native runtime, typically owns the v8::Context. |
| 18 |
| 19 using FXJS_CONSTRUCTOR = void (*)(IJS_Runtime* cc, v8::Local<v8::Object> obj); |
| 20 using FXJS_DESTRUCTOR = void (*)(v8::Local<v8::Object> obj); |
| 21 |
| 22 enum FXJSOBJTYPE { |
| 23 FXJSOBJTYPE_DYNAMIC = 0, // Created by native method and returned to JS. |
| 24 FXJSOBJTYPE_STATIC, // Created by init and hung off of global object. |
| 25 FXJSOBJTYPE_GLOBAL, // The global object itself (may only appear once). |
| 26 }; |
| 27 |
| 28 // Global weak map to save dynamic objects. |
| 29 class V8TemplateMapTraits : public v8::StdMapTraits<void*, v8::Object> { |
| 30 public: |
| 31 typedef v8::GlobalValueMap<void*, v8::Object, V8TemplateMapTraits> MapType; |
| 32 typedef void WeakCallbackDataType; |
| 33 |
| 34 static WeakCallbackDataType* WeakCallbackParameter( |
| 35 MapType* map, |
| 36 void* key, |
| 37 const v8::Local<v8::Object>& value) { |
| 38 return key; |
| 39 } |
| 40 static MapType* MapFromWeakCallbackInfo( |
| 41 const v8::WeakCallbackInfo<WeakCallbackDataType>&); |
| 42 |
| 43 static void* KeyFromWeakCallbackInfo( |
| 44 const v8::WeakCallbackInfo<WeakCallbackDataType>& data) { |
| 45 return data.GetParameter(); |
| 46 } |
| 47 static const v8::PersistentContainerCallbackType kCallbackType = |
| 48 v8::kWeakWithInternalFields; |
| 49 static void DisposeWeak( |
| 50 const v8::WeakCallbackInfo<WeakCallbackDataType>& data) {} |
| 51 static void OnWeakCallback( |
| 52 const v8::WeakCallbackInfo<WeakCallbackDataType>& data) {} |
| 53 static void Dispose(v8::Isolate* isolate, |
| 54 v8::Global<v8::Object> value, |
| 55 void* key); |
| 56 static void DisposeCallbackData(WeakCallbackDataType* callbackData) {} |
| 57 }; |
| 58 |
| 59 class V8TemplateMap { |
| 60 public: |
| 61 typedef v8::GlobalValueMap<void*, v8::Object, V8TemplateMapTraits> MapType; |
| 62 |
| 63 void set(void* key, v8::Local<v8::Object> handle) { |
| 64 ASSERT(!m_map.Contains(key)); |
| 65 m_map.Set(key, handle); |
| 66 } |
| 67 explicit V8TemplateMap(v8::Isolate* isolate) : m_map(isolate) {} |
| 68 friend class V8TemplateMapTraits; |
| 69 |
| 70 private: |
| 71 MapType m_map; |
| 72 }; |
| 73 |
| 74 class FXJS_PerIsolateData { |
| 75 public: |
| 76 static void SetEmbedderDataSlot(unsigned int slot); |
| 77 static unsigned int EmbedderDataSlot(); |
| 78 |
| 79 static void SetUp(v8::Isolate* pIsolate); |
| 80 static FXJS_PerIsolateData* Get(v8::Isolate* pIsolate); |
| 81 |
| 82 void CreateDynamicObjsMap(v8::Isolate* pIsolate) { |
| 83 if (!m_pDynamicObjsMap) |
| 84 m_pDynamicObjsMap = new V8TemplateMap(pIsolate); |
| 85 } |
| 86 void ReleaseDynamicObjsMap() { |
| 87 delete m_pDynamicObjsMap; |
| 88 m_pDynamicObjsMap = nullptr; |
| 89 } |
| 90 |
| 91 std::vector<CFXJS_ObjDefinition*> m_ObjectDefnArray; |
| 92 #ifdef PDF_ENABLE_XFA |
| 93 CFXJSE_RuntimeData* m_pFXJSERuntimeData; |
| 94 #endif // PDF_ENABLE_XFA |
| 95 V8TemplateMap* m_pDynamicObjsMap; |
| 96 |
| 97 protected: |
| 98 #ifndef PDF_ENABLE_XFA |
| 99 FXJS_PerIsolateData() : m_pDynamicObjsMap(nullptr) {} |
| 100 #else // PDF_ENABLE_XFA |
| 101 FXJS_PerIsolateData() |
| 102 : m_pFXJSERuntimeData(nullptr), m_pDynamicObjsMap(nullptr) {} |
| 103 #endif // PDF_ENABLE_XFA |
| 104 }; |
| 105 |
| 106 class CFXJS_ObjDefinition { |
| 107 public: |
| 108 static int MaxID(v8::Isolate* pIsolate) { |
| 109 return FXJS_PerIsolateData::Get(pIsolate)->m_ObjectDefnArray.size(); |
| 110 } |
| 111 |
| 112 static CFXJS_ObjDefinition* ForID(v8::Isolate* pIsolate, int id) { |
| 113 // Note: GetAt() halts if out-of-range even in release builds. |
| 114 return FXJS_PerIsolateData::Get(pIsolate)->m_ObjectDefnArray[id]; |
| 115 } |
| 116 |
| 117 CFXJS_ObjDefinition(v8::Isolate* isolate, |
| 118 const wchar_t* sObjName, |
| 119 FXJSOBJTYPE eObjType, |
| 120 FXJS_CONSTRUCTOR pConstructor, |
| 121 FXJS_DESTRUCTOR pDestructor) |
| 122 : m_ObjName(sObjName), |
| 123 m_ObjType(eObjType), |
| 124 m_pConstructor(pConstructor), |
| 125 m_pDestructor(pDestructor), |
| 126 m_pIsolate(isolate) { |
| 127 v8::Isolate::Scope isolate_scope(isolate); |
| 128 v8::HandleScope handle_scope(isolate); |
| 129 |
| 130 v8::Local<v8::FunctionTemplate> fun = v8::FunctionTemplate::New(isolate); |
| 131 fun->InstanceTemplate()->SetInternalFieldCount(2); |
| 132 m_FunctionTemplate.Reset(isolate, fun); |
| 133 |
| 134 v8::Local<v8::Signature> sig = v8::Signature::New(isolate, fun); |
| 135 m_Signature.Reset(isolate, sig); |
| 136 } |
| 137 |
| 138 int AssignID() { |
| 139 FXJS_PerIsolateData* pData = FXJS_PerIsolateData::Get(m_pIsolate); |
| 140 pData->m_ObjectDefnArray.push_back(this); |
| 141 return pData->m_ObjectDefnArray.size() - 1; |
| 142 } |
| 143 |
| 144 v8::Local<v8::ObjectTemplate> GetInstanceTemplate() { |
| 145 v8::EscapableHandleScope scope(m_pIsolate); |
| 146 v8::Local<v8::FunctionTemplate> function = |
| 147 m_FunctionTemplate.Get(m_pIsolate); |
| 148 return scope.Escape(function->InstanceTemplate()); |
| 149 } |
| 150 |
| 151 v8::Local<v8::Signature> GetSignature() { |
| 152 v8::EscapableHandleScope scope(m_pIsolate); |
| 153 return scope.Escape(m_Signature.Get(m_pIsolate)); |
| 154 } |
| 155 |
| 156 const wchar_t* const m_ObjName; |
| 157 const FXJSOBJTYPE m_ObjType; |
| 158 const FXJS_CONSTRUCTOR m_pConstructor; |
| 159 const FXJS_DESTRUCTOR m_pDestructor; |
| 160 |
| 161 v8::Isolate* m_pIsolate; |
| 162 v8::Global<v8::FunctionTemplate> m_FunctionTemplate; |
| 163 v8::Global<v8::Signature> m_Signature; |
| 164 }; |
| 165 |
| 166 #endif // FXJSE_INCLUDE_FXJS_PERISOLATEDATA_H_ |
OLD | NEW |