Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(282)

Side by Side Diff: fpdfsdk/src/jsapi/fxjs_v8.cpp

Issue 1353193004: Add signatures to FXJS_V8. (Closed) Base URL: https://pdfium.googlesource.com/pdfium.git@master
Patch Set: Created 5 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698