OLD | NEW |
---|---|
1 // Copyright 2014 PDFium Authors. All rights reserved. | 1 // Copyright 2014 PDFium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com | 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com |
6 | 6 |
7 #include "../../../core/include/fxcrt/fx_basic.h" | 7 #include "../../../core/include/fxcrt/fx_basic.h" |
8 #include "../../include/fsdk_define.h" | 8 #include "../../include/fsdk_define.h" |
9 #include "../../include/jsapi/fxjs_v8.h" | 9 #include "../../include/jsapi/fxjs_v8.h" |
10 | 10 |
11 const wchar_t kFXJSValueNameString[] = L"string"; | 11 const wchar_t kFXJSValueNameString[] = L"string"; |
12 const wchar_t kFXJSValueNameNumber[] = L"number"; | 12 const wchar_t kFXJSValueNameNumber[] = L"number"; |
13 const wchar_t kFXJSValueNameBoolean[] = L"boolean"; | 13 const wchar_t kFXJSValueNameBoolean[] = L"boolean"; |
14 const wchar_t kFXJSValueNameDate[] = L"date"; | 14 const wchar_t kFXJSValueNameDate[] = L"date"; |
15 const wchar_t kFXJSValueNameObject[] = L"object"; | 15 const wchar_t kFXJSValueNameObject[] = L"object"; |
16 const wchar_t kFXJSValueNameFxobj[] = L"fxobj"; | 16 const wchar_t kFXJSValueNameFxobj[] = L"fxobj"; |
17 const wchar_t kFXJSValueNameNull[] = L"null"; | 17 const wchar_t kFXJSValueNameNull[] = L"null"; |
18 const wchar_t kFXJSValueNameUndefined[] = L"undefined"; | 18 const wchar_t kFXJSValueNameUndefined[] = L"undefined"; |
19 | 19 |
20 static unsigned int g_embedderDataSlot = 0u; | 20 static unsigned int g_embedderDataSlot = 0u; |
21 static v8::Global<v8::ObjectTemplate> g_DefaultGloabalObjectTemplate; | |
jochen (gone - plz use gerrit)
2015/09/25 11:30:19
spelling of Global
Tom Sepez
2015/09/28 18:13:38
Done.
| |
21 | 22 |
22 class CFXJS_PrivateData { | 23 class CFXJS_PrivateData { |
23 public: | 24 public: |
24 CFXJS_PrivateData() : ObjDefID(-1), pPrivate(NULL) {} | 25 CFXJS_PrivateData() : ObjDefID(-1), pPrivate(NULL) {} |
25 int ObjDefID; | 26 int ObjDefID; |
26 void* pPrivate; | 27 void* pPrivate; |
27 }; | 28 }; |
28 | 29 |
29 class CFXJS_ObjDefintion { | 30 class CFXJS_ObjDefinition { |
30 public: | 31 public: |
31 CFXJS_ObjDefintion(v8::Isolate* isolate, | 32 CFXJS_ObjDefinition(v8::Isolate* isolate, |
32 const wchar_t* sObjName, | 33 const wchar_t* sObjName, |
33 FXJSOBJTYPE eObjType, | 34 FXJSOBJTYPE eObjType, |
34 FXJS_CONSTRUCTOR pConstructor, | 35 FXJS_CONSTRUCTOR pConstructor, |
35 FXJS_DESTRUCTOR pDestructor) | 36 FXJS_DESTRUCTOR pDestructor) |
36 : objName(sObjName), | 37 : objName(sObjName), |
37 objType(eObjType), | 38 objType(eObjType), |
38 m_pConstructor(pConstructor), | 39 m_pConstructor(pConstructor), |
39 m_pDestructor(pDestructor), | 40 m_pDestructor(pDestructor), |
40 m_bSetAsGlobalObject(FALSE) { | 41 m_bSetAsGlobalObject(FALSE), |
42 m_pIsolate(isolate) { | |
41 v8::Isolate::Scope isolate_scope(isolate); | 43 v8::Isolate::Scope isolate_scope(isolate); |
42 v8::HandleScope handle_scope(isolate); | 44 v8::HandleScope handle_scope(isolate); |
43 | 45 |
44 v8::Local<v8::ObjectTemplate> objTemplate = | 46 v8::Local<v8::FunctionTemplate> fun = v8::FunctionTemplate::New(isolate); |
45 v8::ObjectTemplate::New(isolate); | 47 v8::Local<v8::Signature> sig = v8::Signature::New(isolate, fun); |
46 objTemplate->SetInternalFieldCount(2); | 48 |
47 m_objTemplate.Reset(isolate, objTemplate); | 49 fun->InstanceTemplate()->SetInternalFieldCount(2); |
50 fun->PrototypeTemplate()->SetInternalFieldCount(2); | |
51 | |
52 m_Signature.Reset(isolate, sig); | |
53 m_FunctionTemplate.Reset(isolate, fun); | |
48 | 54 |
49 // Document as the global object. | 55 // Document as the global object. |
50 if (FXSYS_wcscmp(sObjName, L"Document") == 0) { | 56 if (FXSYS_wcscmp(sObjName, L"Document") == 0) { |
51 m_bSetAsGlobalObject = TRUE; | 57 m_bSetAsGlobalObject = TRUE; |
52 } | 58 } |
53 } | 59 } |
54 ~CFXJS_ObjDefintion() { | 60 |
55 m_objTemplate.Reset(); | 61 static CFXJS_ObjDefinition* FromID(v8::Isolate* pIsolate, int nObjDefnID) { |
56 m_StaticObj.Reset(); | 62 CFX_PtrArray* pArray = (CFX_PtrArray*)pIsolate->GetData(g_embedderDataSlot); |
63 // Note: GetAt() halts if out-of-range even in release builds. | |
64 return (CFXJS_ObjDefinition*)pArray->GetAt(nObjDefnID); | |
57 } | 65 } |
58 | 66 |
59 public: | 67 int AssignID() { |
68 CFX_PtrArray* pArray = | |
69 (CFX_PtrArray*)m_pIsolate->GetData(g_embedderDataSlot); | |
70 pArray->Add(this); | |
71 return pArray->GetSize() - 1; | |
72 } | |
73 | |
74 v8::Local<v8::ObjectTemplate> GetPrototypeTemplate() { | |
75 v8::EscapableHandleScope scope(m_pIsolate); | |
76 v8::Local<v8::FunctionTemplate> function = | |
77 m_FunctionTemplate.Get(m_pIsolate); | |
78 return scope.Escape(function->PrototypeTemplate()); | |
79 } | |
80 | |
81 v8::Local<v8::ObjectTemplate> GetInstanceTemplate() { | |
82 v8::EscapableHandleScope scope(m_pIsolate); | |
83 v8::Local<v8::FunctionTemplate> function = | |
84 m_FunctionTemplate.Get(m_pIsolate); | |
85 return scope.Escape(function->InstanceTemplate()); | |
86 } | |
87 | |
88 v8::Local<v8::Signature> GetSignature() { | |
89 v8::EscapableHandleScope scope(m_pIsolate); | |
90 return scope.Escape(m_Signature.Get(m_pIsolate)); | |
91 } | |
92 | |
60 const wchar_t* objName; | 93 const wchar_t* objName; |
61 FXJSOBJTYPE objType; | 94 const FXJSOBJTYPE objType; |
62 FXJS_CONSTRUCTOR m_pConstructor; | 95 const FXJS_CONSTRUCTOR m_pConstructor; |
63 FXJS_DESTRUCTOR m_pDestructor; | 96 const FXJS_DESTRUCTOR m_pDestructor; |
64 FX_BOOL m_bSetAsGlobalObject; | 97 FX_BOOL m_bSetAsGlobalObject; |
65 | 98 |
66 v8::Global<v8::ObjectTemplate> m_objTemplate; | 99 v8::Isolate* m_pIsolate; |
100 v8::Global<v8::FunctionTemplate> m_FunctionTemplate; | |
101 v8::Global<v8::Signature> m_Signature; | |
67 v8::Global<v8::Object> m_StaticObj; | 102 v8::Global<v8::Object> m_StaticObj; |
68 }; | 103 }; |
69 | 104 |
105 static v8::Local<v8::ObjectTemplate> GetGlobalObjectTemplate( | |
106 v8::Isolate* pIsolate) { | |
107 CFX_PtrArray* pArray = (CFX_PtrArray*)pIsolate->GetData(g_embedderDataSlot); | |
108 for (int i = 0; i < pArray->GetSize(); ++i) { | |
109 CFXJS_ObjDefinition* pObjDef = (CFXJS_ObjDefinition*)pArray->GetAt(i); | |
110 if (pObjDef->m_bSetAsGlobalObject) | |
111 return pObjDef->GetPrototypeTemplate(); | |
112 } | |
113 | |
114 if (g_DefaultGloabalObjectTemplate.IsEmpty()) | |
115 g_DefaultGloabalObjectTemplate.Reset(pIsolate, | |
116 v8::ObjectTemplate::New(pIsolate)); | |
117 | |
118 return g_DefaultGloabalObjectTemplate.Get(pIsolate); | |
119 } | |
120 | |
70 void* FXJS_ArrayBufferAllocator::Allocate(size_t length) { | 121 void* FXJS_ArrayBufferAllocator::Allocate(size_t length) { |
71 return calloc(1, length); | 122 return calloc(1, length); |
72 } | 123 } |
73 | 124 |
74 void* FXJS_ArrayBufferAllocator::AllocateUninitialized(size_t length) { | 125 void* FXJS_ArrayBufferAllocator::AllocateUninitialized(size_t length) { |
75 return malloc(length); | 126 return malloc(length); |
76 } | 127 } |
77 | 128 |
78 void FXJS_ArrayBufferAllocator::Free(void* data, size_t length) { | 129 void FXJS_ArrayBufferAllocator::Free(void* data, size_t length) { |
79 free(data); | 130 free(data); |
80 } | 131 } |
81 | 132 |
82 void FXJS_PrepareIsolate(v8::Isolate* pIsolate) { | 133 void FXJS_PrepareIsolate(v8::Isolate* pIsolate) { |
83 if (!pIsolate->GetData(g_embedderDataSlot)) | 134 if (!pIsolate->GetData(g_embedderDataSlot)) |
84 pIsolate->SetData(g_embedderDataSlot, new CFX_PtrArray()); | 135 pIsolate->SetData(g_embedderDataSlot, new CFX_PtrArray()); |
85 } | 136 } |
86 | 137 |
87 int FXJS_DefineObj(v8::Isolate* pIsolate, | 138 int FXJS_DefineObj(v8::Isolate* pIsolate, |
88 const wchar_t* sObjName, | 139 const wchar_t* sObjName, |
89 FXJSOBJTYPE eObjType, | 140 FXJSOBJTYPE eObjType, |
90 FXJS_CONSTRUCTOR pConstructor, | 141 FXJS_CONSTRUCTOR pConstructor, |
91 FXJS_DESTRUCTOR pDestructor) { | 142 FXJS_DESTRUCTOR pDestructor) { |
92 v8::Isolate::Scope isolate_scope(pIsolate); | 143 v8::Isolate::Scope isolate_scope(pIsolate); |
93 v8::HandleScope handle_scope(pIsolate); | 144 v8::HandleScope handle_scope(pIsolate); |
94 | |
95 FXJS_PrepareIsolate(pIsolate); | 145 FXJS_PrepareIsolate(pIsolate); |
96 CFX_PtrArray* pArray = (CFX_PtrArray*)pIsolate->GetData(g_embedderDataSlot); | 146 CFXJS_ObjDefinition* pObjDef = new CFXJS_ObjDefinition( |
97 CFXJS_ObjDefintion* pObjDef = new CFXJS_ObjDefintion( | |
98 pIsolate, sObjName, eObjType, pConstructor, pDestructor); | 147 pIsolate, sObjName, eObjType, pConstructor, pDestructor); |
99 pArray->Add(pObjDef); | 148 return pObjDef->AssignID(); |
100 return pArray->GetSize() - 1; | |
101 } | 149 } |
102 | 150 |
103 void FXJS_DefineObjMethod(v8::Isolate* pIsolate, | 151 void FXJS_DefineObjMethod(v8::Isolate* pIsolate, |
104 int nObjDefnID, | 152 int nObjDefnID, |
105 const wchar_t* sMethodName, | 153 const wchar_t* sMethodName, |
106 v8::FunctionCallback pMethodCall) { | 154 v8::FunctionCallback pMethodCall) { |
107 v8::Isolate::Scope isolate_scope(pIsolate); | 155 v8::Isolate::Scope isolate_scope(pIsolate); |
108 v8::HandleScope handle_scope(pIsolate); | 156 v8::HandleScope handle_scope(pIsolate); |
109 | 157 CFX_ByteString bsMethodName = CFX_WideString(sMethodName).UTF8Encode(); |
110 CFX_WideString ws = CFX_WideString(sMethodName); | 158 CFXJS_ObjDefinition* pObjDef = |
111 CFX_ByteString bsMethodName = ws.UTF8Encode(); | 159 CFXJS_ObjDefinition::FromID(pIsolate, nObjDefnID); |
112 CFX_PtrArray* pArray = (CFX_PtrArray*)pIsolate->GetData(g_embedderDataSlot); | 160 pObjDef->GetPrototypeTemplate()->Set( |
113 | |
114 // Note: GetAt() halts if out-of-range even in release builds. | |
115 CFXJS_ObjDefintion* pObjDef = (CFXJS_ObjDefintion*)pArray->GetAt(nObjDefnID); | |
116 v8::Local<v8::ObjectTemplate> objTemp = | |
117 v8::Local<v8::ObjectTemplate>::New(pIsolate, pObjDef->m_objTemplate); | |
118 objTemp->Set( | |
119 v8::String::NewFromUtf8(pIsolate, bsMethodName.c_str(), | 161 v8::String::NewFromUtf8(pIsolate, bsMethodName.c_str(), |
120 v8::NewStringType::kNormal).ToLocalChecked(), | 162 v8::NewStringType::kNormal).ToLocalChecked(), |
121 v8::FunctionTemplate::New(pIsolate, pMethodCall), v8::ReadOnly); | 163 v8::FunctionTemplate::New(pIsolate, pMethodCall, v8::Local<v8::Value>(), |
122 pObjDef->m_objTemplate.Reset(pIsolate, objTemp); | 164 pObjDef->GetSignature()), |
165 v8::ReadOnly); | |
123 } | 166 } |
124 | 167 |
125 void FXJS_DefineObjProperty(v8::Isolate* pIsolate, | 168 void FXJS_DefineObjProperty(v8::Isolate* pIsolate, |
126 int nObjDefnID, | 169 int nObjDefnID, |
127 const wchar_t* sPropName, | 170 const wchar_t* sPropName, |
128 v8::AccessorGetterCallback pPropGet, | 171 v8::AccessorGetterCallback pPropGet, |
129 v8::AccessorSetterCallback pPropPut) { | 172 v8::AccessorSetterCallback pPropPut) { |
130 v8::Isolate::Scope isolate_scope(pIsolate); | 173 v8::Isolate::Scope isolate_scope(pIsolate); |
131 v8::HandleScope handle_scope(pIsolate); | 174 v8::HandleScope handle_scope(pIsolate); |
132 | 175 CFX_ByteString bsPropertyName = CFX_WideString(sPropName).UTF8Encode(); |
133 CFX_WideString ws = CFX_WideString(sPropName); | 176 CFXJS_ObjDefinition* pObjDef = |
134 CFX_ByteString bsPropertyName = ws.UTF8Encode(); | 177 CFXJS_ObjDefinition::FromID(pIsolate, nObjDefnID); |
135 CFX_PtrArray* pArray = (CFX_PtrArray*)pIsolate->GetData(g_embedderDataSlot); | 178 pObjDef->GetPrototypeTemplate()->SetAccessor( |
136 | |
137 // Note: GetAt() halts if out-of-range even in release builds. | |
138 CFXJS_ObjDefintion* pObjDef = (CFXJS_ObjDefintion*)pArray->GetAt(nObjDefnID); | |
139 v8::Local<v8::ObjectTemplate> objTemp = | |
140 v8::Local<v8::ObjectTemplate>::New(pIsolate, pObjDef->m_objTemplate); | |
141 objTemp->SetAccessor( | |
142 v8::String::NewFromUtf8(pIsolate, bsPropertyName.c_str(), | 179 v8::String::NewFromUtf8(pIsolate, bsPropertyName.c_str(), |
143 v8::NewStringType::kNormal).ToLocalChecked(), | 180 v8::NewStringType::kNormal).ToLocalChecked(), |
144 pPropGet, pPropPut); | 181 pPropGet, pPropPut); |
145 pObjDef->m_objTemplate.Reset(pIsolate, objTemp); | |
146 } | 182 } |
147 | 183 |
148 void FXJS_DefineObjAllProperties(v8::Isolate* pIsolate, | 184 void FXJS_DefineObjAllProperties(v8::Isolate* pIsolate, |
149 int nObjDefnID, | 185 int nObjDefnID, |
150 v8::NamedPropertyQueryCallback pPropQurey, | 186 v8::NamedPropertyQueryCallback pPropQurey, |
151 v8::NamedPropertyGetterCallback pPropGet, | 187 v8::NamedPropertyGetterCallback pPropGet, |
152 v8::NamedPropertySetterCallback pPropPut, | 188 v8::NamedPropertySetterCallback pPropPut, |
153 v8::NamedPropertyDeleterCallback pPropDel) { | 189 v8::NamedPropertyDeleterCallback pPropDel) { |
154 v8::Isolate::Scope isolate_scope(pIsolate); | 190 v8::Isolate::Scope isolate_scope(pIsolate); |
155 v8::HandleScope handle_scope(pIsolate); | 191 v8::HandleScope handle_scope(pIsolate); |
156 CFX_PtrArray* pArray = (CFX_PtrArray*)pIsolate->GetData(g_embedderDataSlot); | 192 CFXJS_ObjDefinition* pObjDef = |
157 | 193 CFXJS_ObjDefinition::FromID(pIsolate, nObjDefnID); |
158 // Note: GetAt() halts if out-of-range even in release builds. | 194 pObjDef->GetPrototypeTemplate()->SetNamedPropertyHandler( |
159 CFXJS_ObjDefintion* pObjDef = (CFXJS_ObjDefintion*)pArray->GetAt(nObjDefnID); | 195 pPropGet, pPropPut, pPropQurey, pPropDel); |
160 v8::Local<v8::ObjectTemplate> objTemp = | |
161 v8::Local<v8::ObjectTemplate>::New(pIsolate, pObjDef->m_objTemplate); | |
162 objTemp->SetNamedPropertyHandler(pPropGet, pPropPut, pPropQurey, pPropDel); | |
163 pObjDef->m_objTemplate.Reset(pIsolate, objTemp); | |
164 } | 196 } |
165 | 197 |
166 void FXJS_DefineObjConst(v8::Isolate* pIsolate, | 198 void FXJS_DefineObjConst(v8::Isolate* pIsolate, |
167 int nObjDefnID, | 199 int nObjDefnID, |
168 const wchar_t* sConstName, | 200 const wchar_t* sConstName, |
169 v8::Local<v8::Value> pDefault) { | 201 v8::Local<v8::Value> pDefault) { |
170 v8::Isolate::Scope isolate_scope(pIsolate); | 202 v8::Isolate::Scope isolate_scope(pIsolate); |
171 v8::HandleScope handle_scope(pIsolate); | 203 v8::HandleScope handle_scope(pIsolate); |
172 | 204 CFX_ByteString bsConstName = CFX_WideString(sConstName).UTF8Encode(); |
173 CFX_WideString ws = CFX_WideString(sConstName); | 205 CFXJS_ObjDefinition* pObjDef = |
174 CFX_ByteString bsConstName = ws.UTF8Encode(); | 206 CFXJS_ObjDefinition::FromID(pIsolate, nObjDefnID); |
175 CFX_PtrArray* pArray = (CFX_PtrArray*)pIsolate->GetData(g_embedderDataSlot); | 207 pObjDef->GetPrototypeTemplate()->Set(pIsolate, bsConstName.c_str(), pDefault); |
176 | |
177 // Note: GetAt() halts if out-of-range even in release builds. | |
178 CFXJS_ObjDefintion* pObjDef = (CFXJS_ObjDefintion*)pArray->GetAt(nObjDefnID); | |
179 v8::Local<v8::ObjectTemplate> objTemp = | |
180 v8::Local<v8::ObjectTemplate>::New(pIsolate, pObjDef->m_objTemplate); | |
181 objTemp->Set(pIsolate, bsConstName.c_str(), pDefault); | |
182 pObjDef->m_objTemplate.Reset(pIsolate, objTemp); | |
183 } | |
184 | |
185 static v8::Global<v8::ObjectTemplate>& _getGlobalObjectTemplate( | |
186 v8::Isolate* pIsolate) { | |
187 v8::Isolate::Scope isolate_scope(pIsolate); | |
188 v8::HandleScope handle_scope(pIsolate); | |
189 | |
190 CFX_PtrArray* pArray = (CFX_PtrArray*)pIsolate->GetData(g_embedderDataSlot); | |
191 ASSERT(pArray != NULL); | |
192 for (int i = 0; i < pArray->GetSize(); i++) { | |
193 CFXJS_ObjDefintion* pObjDef = (CFXJS_ObjDefintion*)pArray->GetAt(i); | |
194 if (pObjDef->m_bSetAsGlobalObject) | |
195 return pObjDef->m_objTemplate; | |
196 } | |
197 static v8::Global<v8::ObjectTemplate> gloabalObjectTemplate; | |
198 return gloabalObjectTemplate; | |
199 } | 208 } |
200 | 209 |
201 void FXJS_DefineGlobalMethod(v8::Isolate* pIsolate, | 210 void FXJS_DefineGlobalMethod(v8::Isolate* pIsolate, |
202 const wchar_t* sMethodName, | 211 const wchar_t* sMethodName, |
203 v8::FunctionCallback pMethodCall) { | 212 v8::FunctionCallback pMethodCall) { |
204 v8::Isolate::Scope isolate_scope(pIsolate); | 213 v8::Isolate::Scope isolate_scope(pIsolate); |
205 v8::HandleScope handle_scope(pIsolate); | 214 v8::HandleScope handle_scope(pIsolate); |
206 | 215 CFX_ByteString bsMethodName = CFX_WideString(sMethodName).UTF8Encode(); |
207 CFX_WideString ws = CFX_WideString(sMethodName); | 216 GetGlobalObjectTemplate(pIsolate)->Set( |
208 CFX_ByteString bsMethodName = ws.UTF8Encode(); | |
209 | |
210 v8::Local<v8::FunctionTemplate> funTempl = | |
211 v8::FunctionTemplate::New(pIsolate, pMethodCall); | |
212 v8::Local<v8::ObjectTemplate> objTemp; | |
213 | |
214 v8::Global<v8::ObjectTemplate>& globalObjTemp = | |
215 _getGlobalObjectTemplate(pIsolate); | |
216 if (globalObjTemp.IsEmpty()) | |
217 objTemp = v8::ObjectTemplate::New(pIsolate); | |
218 else | |
219 objTemp = v8::Local<v8::ObjectTemplate>::New(pIsolate, globalObjTemp); | |
220 objTemp->Set( | |
221 v8::String::NewFromUtf8(pIsolate, bsMethodName.c_str(), | 217 v8::String::NewFromUtf8(pIsolate, bsMethodName.c_str(), |
222 v8::NewStringType::kNormal).ToLocalChecked(), | 218 v8::NewStringType::kNormal).ToLocalChecked(), |
223 funTempl, v8::ReadOnly); | 219 v8::FunctionTemplate::New(pIsolate, pMethodCall), v8::ReadOnly); |
224 | |
225 globalObjTemp.Reset(pIsolate, objTemp); | |
226 } | 220 } |
227 | 221 |
228 void FXJS_DefineGlobalConst(v8::Isolate* pIsolate, | 222 void FXJS_DefineGlobalConst(v8::Isolate* pIsolate, |
229 const wchar_t* sConstName, | 223 const wchar_t* sConstName, |
230 v8::Local<v8::Value> pDefault) { | 224 v8::Local<v8::Value> pDefault) { |
231 v8::Isolate::Scope isolate_scope(pIsolate); | 225 v8::Isolate::Scope isolate_scope(pIsolate); |
232 v8::HandleScope handle_scope(pIsolate); | 226 v8::HandleScope handle_scope(pIsolate); |
233 | 227 CFX_ByteString bsConst = CFX_WideString(sConstName).UTF8Encode(); |
234 CFX_WideString ws = CFX_WideString(sConstName); | 228 GetGlobalObjectTemplate(pIsolate)->Set( |
235 CFX_ByteString bsConst = ws.UTF8Encode(); | |
236 | |
237 v8::Local<v8::ObjectTemplate> objTemp; | |
238 | |
239 v8::Global<v8::ObjectTemplate>& globalObjTemp = | |
240 _getGlobalObjectTemplate(pIsolate); | |
241 if (globalObjTemp.IsEmpty()) | |
242 objTemp = v8::ObjectTemplate::New(pIsolate); | |
243 else | |
244 objTemp = v8::Local<v8::ObjectTemplate>::New(pIsolate, globalObjTemp); | |
245 objTemp->Set( | |
246 v8::String::NewFromUtf8(pIsolate, bsConst.c_str(), | 229 v8::String::NewFromUtf8(pIsolate, bsConst.c_str(), |
247 v8::NewStringType::kNormal).ToLocalChecked(), | 230 v8::NewStringType::kNormal).ToLocalChecked(), |
248 pDefault, v8::ReadOnly); | 231 pDefault, v8::ReadOnly); |
249 | |
250 globalObjTemp.Reset(pIsolate, objTemp); | |
251 } | 232 } |
252 | 233 |
253 void FXJS_InitializeRuntime(v8::Isolate* pIsolate, | 234 void FXJS_InitializeRuntime(v8::Isolate* pIsolate, |
254 IFXJS_Runtime* pFXRuntime, | 235 IFXJS_Runtime* pFXRuntime, |
255 IFXJS_Context* context, | 236 IFXJS_Context* context, |
256 v8::Global<v8::Context>& v8PersistentContext) { | 237 v8::Global<v8::Context>& v8PersistentContext) { |
257 v8::Isolate::Scope isolate_scope(pIsolate); | 238 v8::Isolate::Scope isolate_scope(pIsolate); |
258 v8::HandleScope handle_scope(pIsolate); | 239 v8::HandleScope handle_scope(pIsolate); |
259 | 240 v8::Local<v8::Context> v8Context = |
260 v8::Global<v8::ObjectTemplate>& globalObjTemp = | 241 v8::Context::New(pIsolate, NULL, GetGlobalObjectTemplate(pIsolate)); |
261 _getGlobalObjectTemplate(pIsolate); | |
262 v8::Local<v8::Context> v8Context = v8::Context::New( | |
263 pIsolate, NULL, | |
264 v8::Local<v8::ObjectTemplate>::New(pIsolate, globalObjTemp)); | |
265 v8::Context::Scope context_scope(v8Context); | 242 v8::Context::Scope context_scope(v8Context); |
266 | 243 |
267 v8::Local<v8::External> ptr = v8::External::New(pIsolate, pFXRuntime); | 244 v8::Local<v8::External> ptr = v8::External::New(pIsolate, pFXRuntime); |
268 v8Context->SetEmbedderData(1, ptr); | 245 v8Context->SetEmbedderData(1, ptr); |
269 | 246 |
270 CFX_PtrArray* pArray = (CFX_PtrArray*)pIsolate->GetData(g_embedderDataSlot); | 247 CFX_PtrArray* pArray = (CFX_PtrArray*)pIsolate->GetData(g_embedderDataSlot); |
271 if (!pArray) | 248 if (!pArray) |
272 return; | 249 return; |
273 | 250 |
274 for (int i = 0; i < pArray->GetSize(); i++) { | 251 for (int i = 0; i < pArray->GetSize(); i++) { |
275 CFXJS_ObjDefintion* pObjDef = (CFXJS_ObjDefintion*)pArray->GetAt(i); | 252 CFXJS_ObjDefinition* pObjDef = (CFXJS_ObjDefinition*)pArray->GetAt(i); |
276 CFX_WideString ws = CFX_WideString(pObjDef->objName); | 253 CFX_WideString ws = CFX_WideString(pObjDef->objName); |
277 CFX_ByteString bs = ws.UTF8Encode(); | 254 CFX_ByteString bs = ws.UTF8Encode(); |
278 v8::Local<v8::String> objName = | 255 v8::Local<v8::String> objName = |
279 v8::String::NewFromUtf8(pIsolate, bs.c_str(), | 256 v8::String::NewFromUtf8(pIsolate, bs.c_str(), |
280 v8::NewStringType::kNormal, | 257 v8::NewStringType::kNormal, |
281 bs.GetLength()).ToLocalChecked(); | 258 bs.GetLength()).ToLocalChecked(); |
282 | 259 |
283 if (pObjDef->objType == FXJS_DYNAMIC) { | 260 if (pObjDef->objType == FXJS_DYNAMIC) { |
284 // Document is set as global object, need to construct it first. | 261 // Document is set as global object, need to construct it first. |
285 if (ws.Equal(L"Document")) { | 262 if (ws.Equal(L"Document")) { |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
317 v8::HandleScope handle_scope(pIsolate); | 294 v8::HandleScope handle_scope(pIsolate); |
318 v8::Local<v8::Context> context = | 295 v8::Local<v8::Context> context = |
319 v8::Local<v8::Context>::New(pIsolate, v8PersistentContext); | 296 v8::Local<v8::Context>::New(pIsolate, v8PersistentContext); |
320 v8::Context::Scope context_scope(context); | 297 v8::Context::Scope context_scope(context); |
321 | 298 |
322 CFX_PtrArray* pArray = (CFX_PtrArray*)pIsolate->GetData(g_embedderDataSlot); | 299 CFX_PtrArray* pArray = (CFX_PtrArray*)pIsolate->GetData(g_embedderDataSlot); |
323 if (!pArray) | 300 if (!pArray) |
324 return; | 301 return; |
325 | 302 |
326 for (int i = 0; i < pArray->GetSize(); i++) { | 303 for (int i = 0; i < pArray->GetSize(); i++) { |
327 CFXJS_ObjDefintion* pObjDef = (CFXJS_ObjDefintion*)pArray->GetAt(i); | 304 CFXJS_ObjDefinition* pObjDef = (CFXJS_ObjDefinition*)pArray->GetAt(i); |
328 if (!pObjDef->m_StaticObj.IsEmpty()) { | 305 if (!pObjDef->m_StaticObj.IsEmpty()) { |
329 v8::Local<v8::Object> pObj = | 306 v8::Local<v8::Object> pObj = |
330 v8::Local<v8::Object>::New(pIsolate, pObjDef->m_StaticObj); | 307 v8::Local<v8::Object>::New(pIsolate, pObjDef->m_StaticObj); |
331 if (pObjDef->m_pDestructor) | 308 if (pObjDef->m_pDestructor) |
332 pObjDef->m_pDestructor(pObj); | 309 pObjDef->m_pDestructor(pObj); |
333 FXJS_FreePrivate(pObj); | 310 FXJS_FreePrivate(pObj); |
334 } | 311 } |
335 delete pObjDef; | 312 delete pObjDef; |
336 } | 313 } |
337 delete pArray; | 314 delete pArray; |
338 pIsolate->SetData(g_embedderDataSlot, NULL); | 315 pIsolate->SetData(g_embedderDataSlot, NULL); |
339 } | 316 } |
340 | 317 |
341 void FXJS_Initialize(unsigned int embedderDataSlot) { | 318 void FXJS_Initialize(unsigned int embedderDataSlot) { |
342 g_embedderDataSlot = embedderDataSlot; | 319 g_embedderDataSlot = embedderDataSlot; |
343 } | 320 } |
344 | 321 |
345 void FXJS_Release() { | 322 void FXJS_Release() { |
346 } | 323 } |
347 | 324 |
348 int FXJS_Execute(v8::Isolate* pIsolate, | 325 int FXJS_Execute(v8::Isolate* pIsolate, |
349 IFXJS_Context* pJSContext, | 326 IFXJS_Context* pJSContext, |
350 const wchar_t* script, | 327 const wchar_t* script, |
351 long length, | 328 long length, |
352 FXJSErr* pError) { | 329 FXJSErr* pError) { |
353 v8::Isolate::Scope isolate_scope(pIsolate); | 330 v8::Isolate::Scope isolate_scope(pIsolate); |
354 v8::TryCatch try_catch(pIsolate); | 331 v8::TryCatch try_catch(pIsolate); |
355 | 332 CFX_ByteString bsScript = CFX_WideString(script).UTF8Encode(); |
356 CFX_WideString wsScript(script); | |
357 CFX_ByteString bsScript = wsScript.UTF8Encode(); | |
358 | |
359 v8::Local<v8::Context> context = pIsolate->GetCurrentContext(); | 333 v8::Local<v8::Context> context = pIsolate->GetCurrentContext(); |
360 v8::Local<v8::Script> compiled_script; | 334 v8::Local<v8::Script> compiled_script; |
361 if (!v8::Script::Compile( | 335 if (!v8::Script::Compile( |
362 context, v8::String::NewFromUtf8( | 336 context, v8::String::NewFromUtf8( |
363 pIsolate, bsScript.c_str(), v8::NewStringType::kNormal, | 337 pIsolate, bsScript.c_str(), v8::NewStringType::kNormal, |
364 bsScript.GetLength()).ToLocalChecked()) | 338 bsScript.GetLength()).ToLocalChecked()) |
365 .ToLocal(&compiled_script)) { | 339 .ToLocal(&compiled_script)) { |
366 v8::String::Utf8Value error(try_catch.Exception()); | 340 v8::String::Utf8Value error(try_catch.Exception()); |
367 // TODO(tsepez): return error via pError->message. | 341 // TODO(tsepez): return error via pError->message. |
368 return -1; | 342 return -1; |
369 } | 343 } |
370 | 344 |
371 v8::Local<v8::Value> result; | 345 v8::Local<v8::Value> result; |
372 if (!compiled_script->Run(context).ToLocal(&result)) { | 346 if (!compiled_script->Run(context).ToLocal(&result)) { |
373 v8::String::Utf8Value error(try_catch.Exception()); | 347 v8::String::Utf8Value error(try_catch.Exception()); |
374 // TODO(tsepez): return error via pError->message. | 348 // TODO(tsepez): return error via pError->message. |
375 return -1; | 349 return -1; |
376 } | 350 } |
377 return 0; | 351 return 0; |
378 } | 352 } |
379 | 353 |
380 v8::Local<v8::Object> FXJS_NewFxDynamicObj(v8::Isolate* pIsolate, | 354 v8::Local<v8::Object> FXJS_NewFxDynamicObj(v8::Isolate* pIsolate, |
381 IFXJS_Context* pJSContext, | 355 IFXJS_Context* pJSContext, |
382 int nObjDefnID) { | 356 int nObjDefnID) { |
383 v8::Isolate::Scope isolate_scope(pIsolate); | 357 v8::Isolate::Scope isolate_scope(pIsolate); |
384 v8::Local<v8::Context> context = pIsolate->GetCurrentContext(); | 358 v8::Local<v8::Context> context = pIsolate->GetCurrentContext(); |
385 if (-1 == nObjDefnID) { | 359 if (-1 == nObjDefnID) { |
386 v8::Local<v8::ObjectTemplate> objTempl = v8::ObjectTemplate::New(pIsolate); | 360 v8::Local<v8::ObjectTemplate> objTempl = v8::ObjectTemplate::New(pIsolate); |
387 v8::Local<v8::Object> obj; | 361 v8::Local<v8::Object> obj; |
388 if (objTempl->NewInstance(context).ToLocal(&obj)) | 362 if (!objTempl->NewInstance(context).ToLocal(&obj)) |
389 return obj; | 363 return v8::Local<v8::Object>(); |
390 return v8::Local<v8::Object>(); | 364 return obj; |
391 } | 365 } |
392 | 366 |
393 CFX_PtrArray* pArray = (CFX_PtrArray*)pIsolate->GetData(g_embedderDataSlot); | 367 if (!pIsolate->GetData(g_embedderDataSlot)) |
394 if (!pArray) | |
395 return v8::Local<v8::Object>(); | 368 return v8::Local<v8::Object>(); |
396 | 369 |
397 if (nObjDefnID < 0 || nObjDefnID >= pArray->GetSize()) | 370 CFXJS_ObjDefinition* pObjDef = |
398 return v8::Local<v8::Object>(); | 371 CFXJS_ObjDefinition::FromID(pIsolate, nObjDefnID); |
399 CFXJS_ObjDefintion* pObjDef = (CFXJS_ObjDefintion*)pArray->GetAt(nObjDefnID); | |
400 | |
401 v8::Local<v8::ObjectTemplate> objTemp = | |
402 v8::Local<v8::ObjectTemplate>::New(pIsolate, pObjDef->m_objTemplate); | |
403 v8::Local<v8::Object> obj; | 372 v8::Local<v8::Object> obj; |
404 if (!objTemp->NewInstance(context).ToLocal(&obj)) | 373 if (!pObjDef->GetInstanceTemplate()->NewInstance(context).ToLocal(&obj)) |
405 return v8::Local<v8::Object>(); | 374 return v8::Local<v8::Object>(); |
406 | 375 |
407 CFXJS_PrivateData* pPrivateData = new CFXJS_PrivateData; | 376 CFXJS_PrivateData* pPrivateData = new CFXJS_PrivateData; |
408 pPrivateData->ObjDefID = nObjDefnID; | 377 pPrivateData->ObjDefID = nObjDefnID; |
409 | 378 |
410 obj->SetAlignedPointerInInternalField(0, pPrivateData); | 379 obj->SetAlignedPointerInInternalField(0, pPrivateData); |
411 if (pObjDef->m_pConstructor) | 380 if (pObjDef->m_pConstructor) |
412 pObjDef->m_pConstructor( | 381 pObjDef->m_pConstructor( |
413 pJSContext, obj, | 382 pJSContext, obj, |
414 context->Global()->GetPrototype()->ToObject(context).ToLocalChecked()); | 383 context->Global()->GetPrototype()->ToObject(context).ToLocalChecked()); |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
446 return context->GetIsolate(); | 415 return context->GetIsolate(); |
447 } | 416 } |
448 | 417 |
449 int FXJS_GetObjDefnID(v8::Isolate* pIsolate, const wchar_t* pObjName) { | 418 int FXJS_GetObjDefnID(v8::Isolate* pIsolate, const wchar_t* pObjName) { |
450 v8::Isolate::Scope isolate_scope(pIsolate); | 419 v8::Isolate::Scope isolate_scope(pIsolate); |
451 CFX_PtrArray* pArray = (CFX_PtrArray*)pIsolate->GetData(g_embedderDataSlot); | 420 CFX_PtrArray* pArray = (CFX_PtrArray*)pIsolate->GetData(g_embedderDataSlot); |
452 if (!pArray) | 421 if (!pArray) |
453 return -1; | 422 return -1; |
454 | 423 |
455 for (int i = 0; i < pArray->GetSize(); i++) { | 424 for (int i = 0; i < pArray->GetSize(); i++) { |
456 CFXJS_ObjDefintion* pObjDef = (CFXJS_ObjDefintion*)pArray->GetAt(i); | 425 CFXJS_ObjDefinition* pObjDef = (CFXJS_ObjDefinition*)pArray->GetAt(i); |
457 if (FXSYS_wcscmp(pObjDef->objName, pObjName) == 0) | 426 if (FXSYS_wcscmp(pObjDef->objName, pObjName) == 0) |
458 return i; | 427 return i; |
459 } | 428 } |
460 return -1; | 429 return -1; |
461 } | 430 } |
462 | 431 |
463 void FXJS_Error(v8::Isolate* pIsolate, const CFX_WideString& message) { | 432 void FXJS_Error(v8::Isolate* pIsolate, const CFX_WideString& message) { |
464 // Conversion from pdfium's wchar_t wide-strings to v8's uint16_t | 433 // Conversion from pdfium's wchar_t wide-strings to v8's uint16_t |
465 // wide-strings isn't handled by v8, so use UTF8 as a common | 434 // wide-strings isn't handled by v8, so use UTF8 as a common |
466 // intermediate format. | 435 // intermediate format. |
(...skipping 293 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
760 return v8::Local<v8::Array>(); | 729 return v8::Local<v8::Array>(); |
761 v8::Local<v8::Context> context = pIsolate->GetCurrentContext(); | 730 v8::Local<v8::Context> context = pIsolate->GetCurrentContext(); |
762 return v8::Local<v8::Array>::Cast(pValue->ToObject(context).ToLocalChecked()); | 731 return v8::Local<v8::Array>::Cast(pValue->ToObject(context).ToLocalChecked()); |
763 } | 732 } |
764 | 733 |
765 void FXJS_ValueCopy(v8::Local<v8::Value>& pTo, v8::Local<v8::Value> pFrom) { | 734 void FXJS_ValueCopy(v8::Local<v8::Value>& pTo, v8::Local<v8::Value> pFrom) { |
766 pTo = pFrom; | 735 pTo = pFrom; |
767 } | 736 } |
768 | 737 |
769 | 738 |
OLD | NEW |