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

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

Issue 453133004: clang-format all code (Closed) Base URL: https://pdfium.googlesource.com/pdfium.git@master
Patch Set: Created 6 years, 4 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
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 "../../../core/include/fxcrt/fx_ext.h" 8 #include "../../../core/include/fxcrt/fx_ext.h"
9 #include "../../include/jsapi/fxjs_v8.h" 9 #include "../../include/jsapi/fxjs_v8.h"
10 #include "../../include/fsdk_define.h" 10 #include "../../include/fsdk_define.h"
11 #include "time.h" 11 #include "time.h"
12 #include <cmath> 12 #include <cmath>
13 #include <limits> 13 #include <limits>
14 14
15 #define VALUE_NAME_STRING L"string" 15 #define VALUE_NAME_STRING L"string"
16 #define VALUE_NAME_NUMBER L"number" 16 #define VALUE_NAME_NUMBER L"number"
17 #define VALUE_NAME_BOOLEAN L"boolean" 17 #define VALUE_NAME_BOOLEAN L"boolean"
18 #define VALUE_NAME_DATE L"date" 18 #define VALUE_NAME_DATE L"date"
19 #define VALUE_NAME_OBJECT L"object" 19 #define VALUE_NAME_OBJECT L"object"
20 #define VALUE_NAME_FXOBJ L"fxobj" 20 #define VALUE_NAME_FXOBJ L"fxobj"
21 #define VALUE_NAME_NULL L"null" 21 #define VALUE_NAME_NULL L"null"
22 #define VALUE_NAME_UNDEFINED L"undefined" 22 #define VALUE_NAME_UNDEFINED L"undefined"
23 23
24 static FX_DWORD g_nan[2] = {0,0x7FF80000 }; 24 static FX_DWORD g_nan[2] = { 0, 0x7FF80000 };
25 double g_NaN = (*(double *)g_nan); 25 double g_NaN = (*(double*)g_nan);
26 26
27 27 class CJS_PrivateData : public CFX_Object {
28 class CJS_PrivateData: public CFX_Object 28 public:
29 CJS_PrivateData() : ObjDefID(-1), pPrivate(NULL) {}
30 int ObjDefID;
31 FX_LPVOID pPrivate;
32 };
33
34 class CJS_ObjDefintion : public CFX_Object {
35 public:
36 CJS_ObjDefintion(v8::Isolate* isolate,
37 const wchar_t* sObjName,
38 FXJSOBJTYPE eObjType,
39 LP_CONSTRUCTOR pConstructor,
40 LP_DESTRUCTOR pDestructor,
41 unsigned bApplyNew)
42 : objName(sObjName),
43 objType(eObjType),
44 m_pConstructor(pConstructor),
45 m_pDestructor(pDestructor),
46 m_bApplyNew(bApplyNew),
47 m_bSetAsGlobalObject(FALSE) {
48 v8::Isolate::Scope isolate_scope(isolate);
49 v8::HandleScope handle_scope(isolate);
50
51 v8::Handle<v8::ObjectTemplate> objTemplate =
52 v8::ObjectTemplate::New(isolate);
53 objTemplate->SetInternalFieldCount(1);
54 m_objTemplate.Reset(isolate, objTemplate);
55
56 // Document as the global object.
57 if (FXSYS_wcscmp(sObjName, L"Document") == 0) {
58 m_bSetAsGlobalObject = TRUE;
59 }
60 }
61 ~CJS_ObjDefintion() {
62 m_objTemplate.Reset();
63 m_StaticObj.Reset();
64 }
65
66 public:
67 const wchar_t* objName;
68 FXJSOBJTYPE objType;
69 LP_CONSTRUCTOR m_pConstructor;
70 LP_DESTRUCTOR m_pDestructor;
71 unsigned m_bApplyNew;
72 FX_BOOL m_bSetAsGlobalObject;
73
74 v8::Persistent<v8::ObjectTemplate> m_objTemplate;
75 v8::Persistent<v8::Object> m_StaticObj;
76 };
77
78 int JS_DefineObj(IJS_Runtime* pJSRuntime,
79 const wchar_t* sObjName,
80 FXJSOBJTYPE eObjType,
81 LP_CONSTRUCTOR pConstructor,
82 LP_DESTRUCTOR pDestructor,
83 unsigned bApplyNew) {
84 v8::Isolate* isolate = (v8::Isolate*)pJSRuntime;
85 v8::Isolate::Scope isolate_scope(isolate);
86 v8::HandleScope handle_scope(isolate);
87 CFX_PtrArray* pArray = (CFX_PtrArray*)isolate->GetData(0);
88 if (!pArray) {
89 pArray = FX_NEW CFX_PtrArray();
90 isolate->SetData(0, pArray);
91 }
92 CJS_ObjDefintion* pObjDef = FX_NEW CJS_ObjDefintion(
93 isolate, sObjName, eObjType, pConstructor, pDestructor, bApplyNew);
94 pArray->Add(pObjDef);
95 return pArray->GetSize() - 1;
96 }
97
98 int JS_DefineObjMethod(IJS_Runtime* pJSRuntime,
99 int nObjDefnID,
100 const wchar_t* sMethodName,
101 v8::FunctionCallback pMethodCall,
102 unsigned nParamNum) {
103 v8::Isolate* isolate = (v8::Isolate*)pJSRuntime;
104 v8::Isolate::Scope isolate_scope(isolate);
105 v8::HandleScope handle_scope(isolate);
106
107 CFX_WideString ws = CFX_WideString((FX_LPCWSTR)sMethodName);
108 CFX_ByteString bsMethodName = ws.UTF8Encode();
109
110 CFX_PtrArray* pArray = (CFX_PtrArray*)isolate->GetData(0);
111 if (!pArray)
112 return 0;
113
114 if (nObjDefnID < 0 || nObjDefnID >= pArray->GetSize())
115 return 0;
116 CJS_ObjDefintion* pObjDef = (CJS_ObjDefintion*)pArray->GetAt(nObjDefnID);
117 v8::Local<v8::ObjectTemplate> objTemp =
118 v8::Local<v8::ObjectTemplate>::New(isolate, pObjDef->m_objTemplate);
119 objTemp->Set(v8::String::NewFromUtf8(isolate, FX_LPCSTR(bsMethodName)),
120 v8::FunctionTemplate::New(isolate, pMethodCall),
121 v8::ReadOnly);
122 pObjDef->m_objTemplate.Reset(isolate, objTemp);
123 return 0;
124 }
125
126 int JS_DefineObjProperty(IJS_Runtime* pJSRuntime,
127 int nObjDefnID,
128 const wchar_t* sPropName,
129 v8::AccessorGetterCallback pPropGet,
130 v8::AccessorSetterCallback pPropPut) {
131 v8::Isolate* isolate = (v8::Isolate*)pJSRuntime;
132 v8::Isolate::Scope isolate_scope(isolate);
133 v8::HandleScope handle_scope(isolate);
134
135 CFX_WideString ws = CFX_WideString((FX_LPCWSTR)sPropName);
136 CFX_ByteString bsPropertyName = ws.UTF8Encode();
137
138 CFX_PtrArray* pArray = (CFX_PtrArray*)isolate->GetData(0);
139 if (!pArray)
140 return 0;
141
142 if (nObjDefnID < 0 || nObjDefnID >= pArray->GetSize())
143 return 0;
144 CJS_ObjDefintion* pObjDef = (CJS_ObjDefintion*)pArray->GetAt(nObjDefnID);
145 v8::Local<v8::ObjectTemplate> objTemp =
146 v8::Local<v8::ObjectTemplate>::New(isolate, pObjDef->m_objTemplate);
147 objTemp->SetAccessor(
148 v8::String::NewFromUtf8(isolate, FX_LPCSTR(bsPropertyName)),
149 pPropGet,
150 pPropPut);
151 pObjDef->m_objTemplate.Reset(isolate, objTemp);
152 return 0;
153 }
154
155 int JS_DefineObjAllProperties(IJS_Runtime* pJSRuntime,
156 int nObjDefnID,
157 v8::NamedPropertyQueryCallback pPropQurey,
158 v8::NamedPropertyGetterCallback pPropGet,
159 v8::NamedPropertySetterCallback pPropPut,
160 v8::NamedPropertyDeleterCallback pPropDel) {
161 v8::Isolate* isolate = (v8::Isolate*)pJSRuntime;
162 v8::Isolate::Scope isolate_scope(isolate);
163 v8::HandleScope handle_scope(isolate);
164
165 CFX_PtrArray* pArray = (CFX_PtrArray*)isolate->GetData(0);
166 if (!pArray)
167 return 0;
168
169 if (nObjDefnID < 0 || nObjDefnID >= pArray->GetSize())
170 return 0;
171 CJS_ObjDefintion* pObjDef = (CJS_ObjDefintion*)pArray->GetAt(nObjDefnID);
172 v8::Local<v8::ObjectTemplate> objTemp =
173 v8::Local<v8::ObjectTemplate>::New(isolate, pObjDef->m_objTemplate);
174 objTemp->SetNamedPropertyHandler(pPropGet, pPropPut, pPropQurey, pPropDel);
175 pObjDef->m_objTemplate.Reset(isolate, objTemp);
176 return 0;
177 }
178
179 int JS_DefineObjConst(IJS_Runtime* pJSRuntime,
180 int nObjDefnID,
181 const wchar_t* sConstName,
182 v8::Handle<v8::Value> pDefault) {
183 v8::Isolate* isolate = (v8::Isolate*)pJSRuntime;
184 v8::Isolate::Scope isolate_scope(isolate);
185 v8::HandleScope handle_scope(isolate);
186
187 CFX_PtrArray* pArray = (CFX_PtrArray*)isolate->GetData(0);
188 if (!pArray)
189 return 0;
190
191 CFX_WideString ws = CFX_WideString((FX_LPCWSTR)sConstName);
192 CFX_ByteString bsConstName = ws.UTF8Encode();
193
194 if (nObjDefnID < 0 || nObjDefnID >= pArray->GetSize())
195 return 0;
196 CJS_ObjDefintion* pObjDef = (CJS_ObjDefintion*)pArray->GetAt(nObjDefnID);
197 v8::Local<v8::ObjectTemplate> objTemp =
198 v8::Local<v8::ObjectTemplate>::New(isolate, pObjDef->m_objTemplate);
199 objTemp->Set(isolate, FX_LPCSTR(bsConstName), pDefault);
200 pObjDef->m_objTemplate.Reset(isolate, objTemp);
201 return 0;
202 }
203
204 static v8::Persistent<v8::ObjectTemplate>& _getGlobalObjectTemplate(
205 IJS_Runtime* pJSRuntime) {
206 v8::Isolate* isolate = (v8::Isolate*)pJSRuntime;
207 v8::Isolate::Scope isolate_scope(isolate);
208 v8::HandleScope handle_scope(isolate);
209
210 CFX_PtrArray* pArray = (CFX_PtrArray*)isolate->GetData(0);
211 ASSERT(pArray != NULL);
212 for (int i = 0; i < pArray->GetSize(); i++) {
213 CJS_ObjDefintion* pObjDef = (CJS_ObjDefintion*)pArray->GetAt(i);
214 if (pObjDef->m_bSetAsGlobalObject)
215 return pObjDef->m_objTemplate;
216 }
217 static v8::Persistent<v8::ObjectTemplate> gloabalObjectTemplate;
218 return gloabalObjectTemplate;
219 }
220
221 int JS_DefineGlobalMethod(IJS_Runtime* pJSRuntime,
222 const wchar_t* sMethodName,
223 v8::FunctionCallback pMethodCall,
224 unsigned nParamNum) {
225 v8::Isolate* isolate = (v8::Isolate*)pJSRuntime;
226 v8::Isolate::Scope isolate_scope(isolate);
227 v8::HandleScope handle_scope(isolate);
228
229 CFX_WideString ws = CFX_WideString((FX_LPCWSTR)sMethodName);
230 CFX_ByteString bsMethodName = ws.UTF8Encode();
231
232 v8::Local<v8::FunctionTemplate> funTempl =
233 v8::FunctionTemplate::New(isolate, pMethodCall);
234 v8::Local<v8::ObjectTemplate> objTemp;
235
236 v8::Persistent<v8::ObjectTemplate>& globalObjTemp =
237 _getGlobalObjectTemplate(pJSRuntime);
238 if (globalObjTemp.IsEmpty())
239 objTemp = v8::ObjectTemplate::New(isolate);
240 else
241 objTemp = v8::Local<v8::ObjectTemplate>::New(isolate, globalObjTemp);
242 objTemp->Set(v8::String::NewFromUtf8(isolate, FX_LPCSTR(bsMethodName)),
243 funTempl,
244 v8::ReadOnly);
245
246 globalObjTemp.Reset(isolate, objTemp);
247
248 return 0;
249 }
250
251 int JS_DefineGlobalConst(IJS_Runtime* pJSRuntime,
252 const wchar_t* sConstName,
253 v8::Handle<v8::Value> pDefault) {
254 v8::Isolate* isolate = (v8::Isolate*)pJSRuntime;
255 v8::Isolate::Scope isolate_scope(isolate);
256 v8::HandleScope handle_scope(isolate);
257
258 CFX_WideString ws = CFX_WideString((FX_LPCWSTR)sConstName);
259 CFX_ByteString bsConst = ws.UTF8Encode();
260
261 v8::Local<v8::ObjectTemplate> objTemp;
262
263 v8::Persistent<v8::ObjectTemplate>& globalObjTemp =
264 _getGlobalObjectTemplate(pJSRuntime);
265 if (globalObjTemp.IsEmpty())
266 objTemp = v8::ObjectTemplate::New(isolate);
267 else
268 objTemp = v8::Local<v8::ObjectTemplate>::New(isolate, globalObjTemp);
269 objTemp->Set(v8::String::NewFromUtf8(isolate, FX_LPCSTR(bsConst)),
270 pDefault,
271 v8::ReadOnly);
272
273 globalObjTemp.Reset(isolate, objTemp);
274
275 return 0;
276 }
277
278 void JS_InitialRuntime(IJS_Runtime* pJSRuntime,
279 IFXJS_Runtime* pFXRuntime,
280 IFXJS_Context* context,
281 v8::Persistent<v8::Context>& v8PersistentContext) {
282 v8::Isolate* isolate = (v8::Isolate*)pJSRuntime;
283 v8::Isolate::Scope isolate_scope(isolate);
284 v8::HandleScope handle_scope(isolate);
285
286 v8::Persistent<v8::ObjectTemplate>& globalObjTemp =
287 _getGlobalObjectTemplate(pJSRuntime);
288 v8::Handle<v8::Context> v8Context = v8::Context::New(
289 isolate,
290 NULL,
291 v8::Local<v8::ObjectTemplate>::New(isolate, globalObjTemp));
292 v8::Context::Scope context_scope(v8Context);
293
294 v8::Handle<v8::External> ptr = v8::External::New(isolate, pFXRuntime);
295 v8Context->SetEmbedderData(1, ptr);
296
297 CFX_PtrArray* pArray = (CFX_PtrArray*)isolate->GetData(0);
298 if (!pArray)
299 return;
300
301 for (int i = 0; i < pArray->GetSize(); i++) {
302 CJS_ObjDefintion* pObjDef = (CJS_ObjDefintion*)pArray->GetAt(i);
303 CFX_WideString ws = CFX_WideString(pObjDef->objName);
304 CFX_ByteString bs = ws.UTF8Encode();
305 v8::Handle<v8::String> objName = v8::String::NewFromUtf8(
306 isolate, (FX_LPCSTR)bs, v8::String::kNormalString, bs.GetLength());
307
308 if (pObjDef->objType == JS_DYNAMIC) {
309 // Document is set as global object, need to construct it first.
310 if (ws.Equal(L"Document")) {
311 CJS_PrivateData* pPrivateData = FX_NEW CJS_PrivateData;
312 pPrivateData->ObjDefID = i;
313 v8::Handle<v8::External> ptr = v8::External::New(isolate, pPrivateData);
314
315 v8Context->Global()->GetPrototype()->ToObject()->SetInternalField(0,
316 ptr);
317
318 if (pObjDef->m_pConstructor)
319 pObjDef->m_pConstructor(
320 context,
321 v8Context->Global()->GetPrototype()->ToObject(),
322 v8Context->Global()->GetPrototype()->ToObject());
323 }
324 } else {
325 v8::Handle<v8::Object> obj = JS_NewFxDynamicObj(pJSRuntime, context, i);
326 v8Context->Global()->Set(objName, obj);
327 pObjDef->m_StaticObj.Reset(isolate, obj);
328 }
329 }
330 v8PersistentContext.Reset(isolate, v8Context);
331 }
332
333 void JS_ReleaseRuntime(IJS_Runtime* pJSRuntime,
334 v8::Persistent<v8::Context>& v8PersistentContext) {
335 v8::Isolate* isolate = (v8::Isolate*)pJSRuntime;
336 v8::Isolate::Scope isolate_scope(isolate);
337 v8::HandleScope handle_scope(isolate);
338 v8::Local<v8::Context> context =
339 v8::Local<v8::Context>::New(isolate, v8PersistentContext);
340 v8::Context::Scope context_scope(context);
341
342 CFX_PtrArray* pArray = (CFX_PtrArray*)isolate->GetData(0);
343 if (!pArray)
344 return;
345
346 for (int i = 0; i < pArray->GetSize(); i++) {
347 CJS_ObjDefintion* pObjDef = (CJS_ObjDefintion*)pArray->GetAt(i);
348 if (!pObjDef->m_StaticObj.IsEmpty()) {
349 v8::Local<v8::Object> pObj =
350 v8::Local<v8::Object>::New(isolate, pObjDef->m_StaticObj);
351 if (pObjDef->m_pDestructor)
352 pObjDef->m_pDestructor(pObj);
353 JS_FreePrivate(pObj);
354 }
355 delete pObjDef;
356 }
357 delete pArray;
358 isolate->SetData(0, NULL);
359 }
360
361 void JS_Initial() {
362 #ifndef FOXIT_CHROME_BUILD
363 v8::V8::InitializeICU();
364 #endif
365 }
366 void JS_Release() {
367 }
368 int JS_Parse(IJS_Runtime* pJSRuntime,
369 IFXJS_Context* pJSContext,
370 const wchar_t* script,
371 long length,
372 FXJSErr* perror) {
373 v8::Isolate* isolate = (v8::Isolate*)pJSRuntime;
374 v8::Isolate::Scope isolate_scope(isolate);
375 v8::TryCatch try_catch;
376
377 CFX_WideString wsScript(script);
378 CFX_ByteString bsScript = wsScript.UTF8Encode();
379
380 v8::Handle<v8::Script> compiled_script =
381 v8::Script::Compile(v8::String::NewFromUtf8(isolate,
382 (FX_LPCSTR)bsScript,
383 v8::String::kNormalString,
384 bsScript.GetLength()));
385 if (compiled_script.IsEmpty()) {
386 v8::String::Utf8Value error(try_catch.Exception());
387 return -1;
388 }
389 return 0;
390 }
391
392 int JS_Execute(IJS_Runtime* pJSRuntime,
393 IFXJS_Context* pJSContext,
394 const wchar_t* script,
395 long length,
396 FXJSErr* perror) {
397 v8::Isolate* isolate = (v8::Isolate*)pJSRuntime;
398 v8::Isolate::Scope isolate_scope(isolate);
399 v8::TryCatch try_catch;
400
401 CFX_WideString wsScript(script);
402 CFX_ByteString bsScript = wsScript.UTF8Encode();
403
404 v8::Handle<v8::Script> compiled_script =
405 v8::Script::Compile(v8::String::NewFromUtf8(isolate,
406 (FX_LPCSTR)bsScript,
407 v8::String::kNormalString,
408 bsScript.GetLength()));
409 if (compiled_script.IsEmpty()) {
410 v8::String::Utf8Value error(try_catch.Exception());
411 return -1;
412 }
413
414 v8::Handle<v8::Value> result = compiled_script->Run();
415 if (result.IsEmpty()) {
416 v8::String::Utf8Value error(try_catch.Exception());
417 return -1;
418 }
419 return 0;
420 }
421
422 v8::Handle<v8::Object> JS_NewFxDynamicObj(IJS_Runtime* pJSRuntime,
423 IFXJS_Context* pJSContext,
424 int nObjDefnID) {
425 v8::Isolate* isolate = (v8::Isolate*)pJSRuntime;
426 v8::Isolate::Scope isolate_scope(isolate);
427 if (-1 == nObjDefnID) {
428 v8::Local<v8::ObjectTemplate> objTempl = v8::ObjectTemplate::New(isolate);
429 return objTempl->NewInstance();
430 }
431
432 CFX_PtrArray* pArray = (CFX_PtrArray*)isolate->GetData(0);
433 if (!pArray)
434 return v8::Handle<v8::Object>();
435
436 if (nObjDefnID < 0 || nObjDefnID >= pArray->GetSize())
437 return v8::Handle<v8::Object>();
438 CJS_ObjDefintion* pObjDef = (CJS_ObjDefintion*)pArray->GetAt(nObjDefnID);
439
440 v8::Local<v8::Context> context = isolate->GetCurrentContext();
441 v8::Local<v8::ObjectTemplate> objTemp =
442 v8::Local<v8::ObjectTemplate>::New(isolate, pObjDef->m_objTemplate);
443
444 v8::Local<v8::Object> obj = objTemp->NewInstance();
445
446 CJS_PrivateData* pPrivateData = FX_NEW CJS_PrivateData;
447 pPrivateData->ObjDefID = nObjDefnID;
448 v8::Handle<v8::External> ptr = v8::External::New(isolate, pPrivateData);
449 obj->SetInternalField(0, ptr);
450
451 if (pObjDef->m_pConstructor)
452 pObjDef->m_pConstructor(
453 pJSContext, obj, context->Global()->GetPrototype()->ToObject());
454
455 return obj;
456 }
457
458 v8::Handle<v8::Object> JS_GetStaticObj(IJS_Runtime* pJSRuntime,
459 int nObjDefnID) {
460 v8::Isolate* isolate = (v8::Isolate*)pJSRuntime;
461 v8::Isolate::Scope isolate_scope(isolate);
462
463 CFX_PtrArray* pArray = (CFX_PtrArray*)isolate->GetData(0);
464 if (!pArray)
465 return v8::Handle<v8::Object>();
466
467 if (nObjDefnID < 0 || nObjDefnID >= pArray->GetSize())
468 return v8::Handle<v8::Object>();
469 CJS_ObjDefintion* pObjDef = (CJS_ObjDefintion*)pArray->GetAt(nObjDefnID);
470 v8::Local<v8::Object> obj =
471 v8::Local<v8::Object>::New(isolate, pObjDef->m_StaticObj);
472 return obj;
473 }
474
475 void JS_SetThisObj(IJS_Runtime* pJSRuntime, int nThisObjID) {
476 // Do nothing.
477 }
478 v8::Handle<v8::Object> JS_GetThisObj(IJS_Runtime* pJSRuntime) {
479 // Return the global object.
480 v8::Isolate* isolate = (v8::Isolate*)pJSRuntime;
481 v8::Isolate::Scope isolate_scope(isolate);
482
483 CFX_PtrArray* pArray = (CFX_PtrArray*)isolate->GetData(0);
484 if (!pArray)
485 return v8::Handle<v8::Object>();
486
487 v8::Local<v8::Context> context = isolate->GetCurrentContext();
488 return context->Global()->GetPrototype()->ToObject();
489 }
490
491 int JS_GetObjDefnID(v8::Handle<v8::Object> pObj) {
492 if (pObj.IsEmpty() || !pObj->InternalFieldCount())
493 return -1;
494 v8::Handle<v8::External> field =
495 v8::Handle<v8::External>::Cast(pObj->GetInternalField(0));
496 CJS_PrivateData* pPrivateData = (CJS_PrivateData*)field->Value();
497 if (pPrivateData)
498 return pPrivateData->ObjDefID;
499 return -1;
500 }
501
502 IJS_Runtime* JS_GetRuntime(v8::Handle<v8::Object> pObj) {
503 if (pObj.IsEmpty())
504 return NULL;
505 v8::Local<v8::Context> context = pObj->CreationContext();
506 if (context.IsEmpty())
507 return NULL;
508 return context->GetIsolate();
509 }
510
511 int JS_GetObjDefnID(IJS_Runtime* pJSRuntime, const wchar_t* pObjName) {
512 v8::Isolate* isolate = (v8::Isolate*)pJSRuntime;
513 v8::Isolate::Scope isolate_scope(isolate);
514
515 CFX_PtrArray* pArray = (CFX_PtrArray*)isolate->GetData(0);
516 if (!pArray)
517 return -1;
518
519 for (int i = 0; i < pArray->GetSize(); i++) {
520 CJS_ObjDefintion* pObjDef = (CJS_ObjDefintion*)pArray->GetAt(i);
521 if (FXSYS_wcscmp(pObjDef->objName, pObjName) == 0)
522 return i;
523 }
524 return -1;
525 }
526
527 void JS_Error(v8::Value* pError, const wchar_t* main, const wchar_t* sub) {
528 }
529
530 unsigned JS_CalcHash(const wchar_t* main, unsigned nLen) {
531 return (unsigned)FX_HashCode_String_GetW(main, nLen);
532 }
533
534 unsigned JS_CalcHash(const wchar_t* main) {
535 return (unsigned)FX_HashCode_String_GetW(main, FXSYS_wcslen(main));
536 }
537 const wchar_t* JS_GetTypeof(v8::Handle<v8::Value> pObj) {
538 if (pObj.IsEmpty())
539 return NULL;
540 if (pObj->IsString())
541 return VALUE_NAME_STRING;
542 if (pObj->IsNumber())
543 return VALUE_NAME_NUMBER;
544 if (pObj->IsBoolean())
545 return VALUE_NAME_BOOLEAN;
546 if (pObj->IsDate())
547 return VALUE_NAME_DATE;
548 if (pObj->IsObject())
549 return VALUE_NAME_OBJECT;
550 if (pObj->IsNull())
551 return VALUE_NAME_NULL;
552 if (pObj->IsUndefined())
553 return VALUE_NAME_UNDEFINED;
554 return NULL;
555 }
556 const wchar_t* JS_GetClassname(v8::Handle<v8::Object> pObj) {
557 return NULL;
558 }
559
560 void JS_SetPrivate(v8::Handle<v8::Object> pObj, void* p) {
561 JS_SetPrivate(NULL, pObj, p);
562 }
563
564 void* JS_GetPrivate(v8::Handle<v8::Object> pObj) {
565 return JS_GetPrivate(NULL, pObj);
566 }
567
568 void JS_SetPrivate(IJS_Runtime* pJSRuntime,
569 v8::Handle<v8::Object> pObj,
570 void* p) {
571 if (pObj.IsEmpty() || !pObj->InternalFieldCount())
572 return;
573 v8::Handle<v8::External> ptr =
574 v8::Handle<v8::External>::Cast(pObj->GetInternalField(0));
575 CJS_PrivateData* pPrivateData = (CJS_PrivateData*)ptr->Value();
576 if (!pPrivateData)
577 return;
578 pPrivateData->pPrivate = p;
579 }
580
581 void* JS_GetPrivate(IJS_Runtime* pJSRuntime, v8::Handle<v8::Object> pObj) {
582 if (pObj.IsEmpty())
583 return NULL;
584 v8::Local<v8::Value> value;
585 if (pObj->InternalFieldCount())
586 value = pObj->GetInternalField(0);
587 else {
588 // It could be a global proxy object.
589 v8::Local<v8::Value> v = pObj->GetPrototype();
590 if (v->IsObject())
591 value = v->ToObject()->GetInternalField(0);
592 }
593 if (value.IsEmpty() || value->IsUndefined())
594 return NULL;
595 v8::Handle<v8::External> ptr = v8::Handle<v8::External>::Cast(value);
596 CJS_PrivateData* pPrivateData = (CJS_PrivateData*)ptr->Value();
597 if (!pPrivateData)
598 return NULL;
599 return pPrivateData->pPrivate;
600 }
601
602 void JS_FreePrivate(v8::Handle<v8::Object> pObj) {
603 if (pObj.IsEmpty() || !pObj->InternalFieldCount())
604 return;
605 v8::Handle<v8::External> ptr =
606 v8::Handle<v8::External>::Cast(pObj->GetInternalField(0));
607 delete (CJS_PrivateData*)ptr->Value();
608 v8::Local<v8::Context> context = pObj->CreationContext();
609
610 pObj->SetInternalField(0, v8::External::New(context->GetIsolate(), NULL));
611 }
612
613 v8::Handle<v8::Value> JS_GetObjectValue(v8::Handle<v8::Object> pObj) {
614 return pObj;
615 }
616
617 v8::Handle<v8::String> WSToJSString(IJS_Runtime* pJSRuntime,
618 const wchar_t* PropertyName,
619 int Len = -1) {
620 CFX_WideString ws = CFX_WideString(PropertyName, Len);
621 CFX_ByteString bs = ws.UTF8Encode();
622 if (!pJSRuntime)
623 pJSRuntime = v8::Isolate::GetCurrent();
624 return v8::String::NewFromUtf8(pJSRuntime, (FX_LPCSTR)bs);
625 }
626
627 v8::Handle<v8::Value> JS_GetObjectElement(IJS_Runtime* pJSRuntime,
628 v8::Handle<v8::Object> pObj,
629 const wchar_t* PropertyName) {
630 if (pObj.IsEmpty())
631 return v8::Handle<v8::Value>();
632 return pObj->Get(WSToJSString(pJSRuntime, PropertyName));
633 }
634
635 v8::Handle<v8::Array> JS_GetObjectElementNames(v8::Handle<v8::Object> pObj) {
636 if (pObj.IsEmpty())
637 return v8::Handle<v8::Array>();
638 return pObj->GetPropertyNames();
639 }
640
641 void JS_PutObjectString(IJS_Runtime* pJSRuntime,
642 v8::Handle<v8::Object> pObj,
643 const wchar_t* PropertyName,
644 const wchar_t* sValue) // VT_string
29 { 645 {
30 public: 646 if (pObj.IsEmpty())
31 CJS_PrivateData():ObjDefID(-1), pPrivate(NULL) {} 647 return;
32 int ObjDefID; 648 pObj->Set(WSToJSString(pJSRuntime, PropertyName),
33 FX_LPVOID pPrivate; 649 WSToJSString(pJSRuntime, sValue));
34 }; 650 }
35 651
36 652 void JS_PutObjectNumber(IJS_Runtime* pJSRuntime,
37 class CJS_ObjDefintion: public CFX_Object 653 v8::Handle<v8::Object> pObj,
38 { 654 const wchar_t* PropertyName,
39 public: 655 int nValue) {
40 CJS_ObjDefintion(v8::Isolate* isolate, const wchar_t* sObjName, FXJSOBJT YPE eObjType, LP_CONSTRUCTOR pConstructor, LP_DESTRUCTOR pDestructor, unsigned b ApplyNew): 656 if (pObj.IsEmpty())
41 objName(sObjName), objType(eObjType), m_pConstructor(pConstructor), m_ pDestructor(pDestructor),m_bApplyNew(bApplyNew),m_bSetAsGlobalObject(FALSE) 657 return;
42 { 658 pObj->Set(WSToJSString(pJSRuntime, PropertyName),
43 v8::Isolate::Scope isolate_scope(isolate); 659 v8::Int32::New(pJSRuntime, nValue));
44 v8::HandleScope handle_scope(isolate); 660 }
45 661
46 v8::Handle<v8::ObjectTemplate> objTemplate = v8::ObjectTemplat e::New(isolate); 662 void JS_PutObjectNumber(IJS_Runtime* pJSRuntime,
47 objTemplate->SetInternalFieldCount(1); 663 v8::Handle<v8::Object> pObj,
48 m_objTemplate.Reset(isolate, objTemplate); 664 const wchar_t* PropertyName,
49 665 float fValue) {
50 //Document as the global object. 666 if (pObj.IsEmpty())
51 if(FXSYS_wcscmp(sObjName, L"Document") == 0) 667 return;
52 { 668 pObj->Set(WSToJSString(pJSRuntime, PropertyName),
53 m_bSetAsGlobalObject = TRUE; 669 v8::Number::New(pJSRuntime, (double)fValue));
54 } 670 }
55 671
56 } 672 void JS_PutObjectNumber(IJS_Runtime* pJSRuntime,
57 ~CJS_ObjDefintion() 673 v8::Handle<v8::Object> pObj,
58 { 674 const wchar_t* PropertyName,
59 m_objTemplate.Reset(); 675 double dValue) {
60 m_StaticObj.Reset(); 676 if (pObj.IsEmpty())
61 } 677 return;
62 public: 678 pObj->Set(WSToJSString(pJSRuntime, PropertyName),
63 const wchar_t* objName; 679 v8::Number::New(pJSRuntime, (double)dValue));
64 FXJSOBJTYPE objType; 680 }
65 LP_CONSTRUCTOR m_pConstructor; 681
66 LP_DESTRUCTOR m_pDestructor; 682 void JS_PutObjectBoolean(IJS_Runtime* pJSRuntime,
67 unsigned m_bApplyNew; 683 v8::Handle<v8::Object> pObj,
68 FX_BOOL m_bSetAsGlobalObject; 684 const wchar_t* PropertyName,
69 685 bool bValue) {
70 v8::Persistent<v8::ObjectTemplate> m_objTemplate; 686 if (pObj.IsEmpty())
71 v8::Persistent<v8::Object> m_StaticObj; 687 return;
72 }; 688 pObj->Set(WSToJSString(pJSRuntime, PropertyName),
73 689 v8::Boolean::New(pJSRuntime, bValue));
74 int JS_DefineObj(IJS_Runtime* pJSRuntime, const wchar_t* sObjName, FXJSOBJTYPE e ObjType, LP_CONSTRUCTOR pConstructor, LP_DESTRUCTOR pDestructor, unsigned bApply New) 690 }
75 { 691
76 v8::Isolate* isolate = (v8::Isolate*)pJSRuntime; 692 void JS_PutObjectObject(IJS_Runtime* pJSRuntime,
77 v8::Isolate::Scope isolate_scope(isolate); 693 v8::Handle<v8::Object> pObj,
78 v8::HandleScope handle_scope(isolate); 694 const wchar_t* PropertyName,
79 CFX_PtrArray* pArray = (CFX_PtrArray*)isolate->GetData(0); 695 v8::Handle<v8::Object> pPut) {
80 if(!pArray) 696 if (pObj.IsEmpty())
81 { 697 return;
82 pArray = FX_NEW CFX_PtrArray(); 698 pObj->Set(WSToJSString(pJSRuntime, PropertyName), pPut);
83 isolate->SetData(0, pArray); 699 }
84 } 700
85 CJS_ObjDefintion* pObjDef = FX_NEW CJS_ObjDefintion(isolate, sObjName, e ObjType, pConstructor, pDestructor, bApplyNew); 701 void JS_PutObjectNull(IJS_Runtime* pJSRuntime,
86 pArray->Add(pObjDef); 702 v8::Handle<v8::Object> pObj,
87 return pArray->GetSize()-1; 703 const wchar_t* PropertyName) {
88 } 704 if (pObj.IsEmpty())
89 705 return;
90 int JS_DefineObjMethod(IJS_Runtime* pJSRuntime, int nObjDefnID, const wchar_t* s MethodName, v8::FunctionCallback pMethodCall, unsigned nParamNum) 706 pObj->Set(WSToJSString(pJSRuntime, PropertyName), v8::Handle<v8::Object>());
91 { 707 }
92 v8::Isolate* isolate = (v8::Isolate*)pJSRuntime; 708
93 v8::Isolate::Scope isolate_scope(isolate); 709 v8::Handle<v8::Array> JS_NewArray(IJS_Runtime* pJSRuntime) {
94 v8::HandleScope handle_scope(isolate); 710 return v8::Array::New(pJSRuntime);
95 711 }
96 CFX_WideString ws = CFX_WideString((FX_LPCWSTR)sMethodName); 712
97 CFX_ByteString bsMethodName = ws.UTF8Encode(); 713 unsigned JS_PutArrayElement(v8::Handle<v8::Array> pArray,
98 714 unsigned index,
99 CFX_PtrArray* pArray = (CFX_PtrArray*)isolate->GetData(0); 715 v8::Handle<v8::Value> pValue,
100 if(!pArray) return 0; 716 FXJSVALUETYPE eType) {
101 717 if (pArray.IsEmpty())
102 if(nObjDefnID<0 || nObjDefnID>= pArray->GetSize()) return 0; 718 return 0;
103 CJS_ObjDefintion* pObjDef = (CJS_ObjDefintion*)pArray->GetAt(nObjDefnID) ; 719 pArray->Set(index, pValue);
104 v8::Local<v8::ObjectTemplate> objTemp = v8::Local<v8::ObjectTemplate>::N ew(isolate, pObjDef->m_objTemplate); 720 return 1;
105 objTemp->Set(v8::String::NewFromUtf8(isolate, FX_LPCSTR(bsMethodName)), v8::FunctionTemplate::New(isolate, pMethodCall), v8::ReadOnly); 721 }
106 pObjDef->m_objTemplate.Reset(isolate,objTemp); 722
107 return 0; 723 v8::Handle<v8::Value> JS_GetArrayElemnet(v8::Handle<v8::Array> pArray,
108 } 724 unsigned index) {
109 725 if (pArray.IsEmpty())
110 int JS_DefineObjProperty(IJS_Runtime* pJSRuntime, int nObjDefnID, const wchar_t* sPropName, v8::AccessorGetterCallback pPropGet, v8::AccessorSetterCallback pPro pPut) 726 return v8::Handle<v8::Value>();
111 { 727 return pArray->Get(index);
112 v8::Isolate* isolate = (v8::Isolate*)pJSRuntime; 728 }
113 v8::Isolate::Scope isolate_scope(isolate); 729
114 v8::HandleScope handle_scope(isolate); 730 unsigned JS_GetArrayLength(v8::Handle<v8::Array> pArray) {
115 731 if (pArray.IsEmpty())
116 CFX_WideString ws = CFX_WideString((FX_LPCWSTR)sPropName); 732 return 0;
117 CFX_ByteString bsPropertyName = ws.UTF8Encode(); 733 return pArray->Length();
118 734 }
119 CFX_PtrArray* pArray = (CFX_PtrArray*)isolate->GetData(0); 735
120 if(!pArray) return 0; 736 v8::Handle<v8::Value> JS_NewNumber(IJS_Runtime* pJSRuntime, int number) {
121 737 return v8::Int32::New(pJSRuntime, number);
122 if(nObjDefnID<0 || nObjDefnID>= pArray->GetSize()) return 0; 738 }
123 CJS_ObjDefintion* pObjDef = (CJS_ObjDefintion*)pArray->GetAt(nObjDefnID) ; 739
124 v8::Local<v8::ObjectTemplate> objTemp = v8::Local<v8::ObjectTemplate>::N ew(isolate, pObjDef->m_objTemplate); 740 v8::Handle<v8::Value> JS_NewNumber(IJS_Runtime* pJSRuntime, double number) {
125 objTemp->SetAccessor(v8::String::NewFromUtf8(isolate, FX_LPCSTR(bsProper tyName)), pPropGet, pPropPut); 741 return v8::Number::New(pJSRuntime, number);
126 pObjDef->m_objTemplate.Reset(isolate,objTemp); 742 }
127 return 0; 743
128 } 744 v8::Handle<v8::Value> JS_NewNumber(IJS_Runtime* pJSRuntime, float number) {
129 745 return v8::Number::New(pJSRuntime, (float)number);
130 int JS_DefineObjAllProperties(IJS_Runtime* pJSRuntime, int nObjDefnID, v8::N amedPropertyQueryCallback pPropQurey, v8::NamedPropertyGetterCallback pPropGet, v8::NamedPropertySetterCallback pPropPut, v8::NamedPropertyDeleterCallback pProp Del) 746 }
131 { 747
132 v8::Isolate* isolate = (v8::Isolate*)pJSRuntime; 748 v8::Handle<v8::Value> JS_NewBoolean(IJS_Runtime* pJSRuntime, bool b) {
133 v8::Isolate::Scope isolate_scope(isolate); 749 return v8::Boolean::New(pJSRuntime, b);
134 v8::HandleScope handle_scope(isolate); 750 }
135 751
136 CFX_PtrArray* pArray = (CFX_PtrArray*)isolate->GetData(0); 752 v8::Handle<v8::Value> JS_NewObject(IJS_Runtime* pJSRuntime,
137 if(!pArray) return 0; 753 v8::Handle<v8::Object> pObj) {
138 754 if (pObj.IsEmpty())
139 if(nObjDefnID<0 || nObjDefnID>= pArray->GetSize()) return 0; 755 return v8::Handle<v8::Value>();
140 CJS_ObjDefintion* pObjDef = (CJS_ObjDefintion*)pArray->GetAt(nObjDefnID) ; 756 return pObj->Clone();
141 v8::Local<v8::ObjectTemplate> objTemp = v8::Local<v8::ObjectTemplate>::N ew(isolate, pObjDef->m_objTemplate); 757 }
142 objTemp->SetNamedPropertyHandler(pPropGet, pPropPut, pPropQurey, pPropDe l); 758
143 pObjDef->m_objTemplate.Reset(isolate,objTemp); 759 v8::Handle<v8::Value> JS_NewObject2(IJS_Runtime* pJSRuntime,
144 return 0; 760 v8::Handle<v8::Array> pObj) {
145 } 761 if (pObj.IsEmpty())
146 762 return v8::Handle<v8::Value>();
147 int JS_DefineObjConst(IJS_Runtime* pJSRuntime, int nObjDefnID, const wchar_t* sC onstName, v8::Handle<v8::Value> pDefault) 763 return pObj->Clone();
148 { 764 }
149 v8::Isolate* isolate = (v8::Isolate*)pJSRuntime; 765
150 v8::Isolate::Scope isolate_scope(isolate); 766 v8::Handle<v8::Value> JS_NewString(IJS_Runtime* pJSRuntime,
151 v8::HandleScope handle_scope(isolate); 767 const wchar_t* string) {
152 768 return WSToJSString(pJSRuntime, string);
153 CFX_PtrArray* pArray = (CFX_PtrArray*)isolate->GetData(0); 769 }
154 if(!pArray) return 0; 770
155 771 v8::Handle<v8::Value> JS_NewString(IJS_Runtime* pJSRuntime,
156 CFX_WideString ws = CFX_WideString((FX_LPCWSTR)sConstName); 772 const wchar_t* string,
157 CFX_ByteString bsConstName = ws.UTF8Encode(); 773 unsigned nLen) {
158 774 return WSToJSString(pJSRuntime, string, nLen);
159 if(nObjDefnID<0 || nObjDefnID>= pArray->GetSize()) return 0; 775 }
160 CJS_ObjDefintion* pObjDef = (CJS_ObjDefintion*)pArray->GetAt(nObjDefnID) ; 776
161 v8::Local<v8::ObjectTemplate> objTemp = v8::Local<v8::ObjectTemplate>::N ew(isolate, pObjDef->m_objTemplate); 777 v8::Handle<v8::Value> JS_NewNull() {
162 objTemp->Set(isolate, FX_LPCSTR(bsConstName), pDefault); 778 return v8::Handle<v8::Value>();
163 pObjDef->m_objTemplate.Reset(isolate,objTemp); 779 }
164 return 0; 780
165 } 781 v8::Handle<v8::Value> JS_NewDate(IJS_Runtime* pJSRuntime, double d) {
166 782 return v8::Date::New(pJSRuntime, d);
167 static v8::Persistent<v8::ObjectTemplate>& _getGlobalObjectTemplate(IJS_Runtime* pJSRuntime) 783 }
168 { 784
169 v8::Isolate* isolate = (v8::Isolate*)pJSRuntime; 785 v8::Handle<v8::Value> JS_NewValue(IJS_Runtime* pJSRuntime) {
170 v8::Isolate::Scope isolate_scope(isolate); 786 return v8::Handle<v8::Value>();
171 v8::HandleScope handle_scope(isolate); 787 }
172 788
173 CFX_PtrArray* pArray = (CFX_PtrArray*)isolate->GetData(0); 789 v8::Handle<v8::Value> JS_GetListValue(v8::Handle<v8::Value> pList, int index) {
174 ASSERT(pArray != NULL); 790 if (!pList.IsEmpty() && pList->IsObject()) {
175 for(int i=0; i<pArray->GetSize(); i++) 791 v8::Local<v8::Object> obj = pList->ToObject();
176 { 792 return obj->Get(index);
177 CJS_ObjDefintion* pObjDef = (CJS_ObjDefintion*)pArray->GetAt(i); 793 }
178 if(pObjDef->m_bSetAsGlobalObject) 794 return v8::Handle<v8::Value>();
179 return pObjDef->m_objTemplate; 795 }
180 } 796
181 static v8::Persistent<v8::ObjectTemplate> gloabalObjectTemplate; 797 int JS_ToInt32(v8::Handle<v8::Value> pValue) {
182 return gloabalObjectTemplate; 798 if (pValue.IsEmpty())
183 } 799 return 0;
184 800 return pValue->ToInt32()->Value();
185 int JS_DefineGlobalMethod(IJS_Runtime* pJSRuntime, const wchar_t* sMethodName, v 8::FunctionCallback pMethodCall, unsigned nParamNum) 801 }
186 { 802
187 v8::Isolate* isolate = (v8::Isolate*)pJSRuntime; 803 bool JS_ToBoolean(v8::Handle<v8::Value> pValue) {
188 v8::Isolate::Scope isolate_scope(isolate); 804 if (pValue.IsEmpty())
189 v8::HandleScope handle_scope(isolate); 805 return false;
190 806 return pValue->ToBoolean()->Value();
191 CFX_WideString ws = CFX_WideString((FX_LPCWSTR)sMethodName); 807 }
192 CFX_ByteString bsMethodName = ws.UTF8Encode(); 808
193 809 double JS_ToNumber(v8::Handle<v8::Value> pValue) {
194 v8::Local<v8::FunctionTemplate> funTempl = v8::FunctionTemplate::New(iso late, pMethodCall); 810 if (pValue.IsEmpty())
195 v8::Local<v8::ObjectTemplate> objTemp; 811 return 0.0;
196 812 return pValue->ToNumber()->Value();
197 v8::Persistent<v8::ObjectTemplate>& globalObjTemp = _getGlobalObjectTemp late(pJSRuntime); 813 }
198 if(globalObjTemp.IsEmpty()) 814
199 objTemp = v8::ObjectTemplate::New(isolate); 815 v8::Handle<v8::Object> JS_ToObject(v8::Handle<v8::Value> pValue) {
200 else 816 if (pValue.IsEmpty())
201 objTemp = v8::Local<v8::ObjectTemplate>::New(isolate, globalObjT emp); 817 return v8::Handle<v8::Object>();
202 objTemp->Set(v8::String::NewFromUtf8(isolate, FX_LPCSTR(bsMethodName)), funTempl, v8::ReadOnly); 818 return pValue->ToObject();
203 819 }
204 globalObjTemp.Reset(isolate,objTemp); 820
205 821 CFX_WideString JS_ToString(v8::Handle<v8::Value> pValue) {
206 return 0; 822 if (pValue.IsEmpty())
207 } 823 return L"";
208 824 v8::String::Utf8Value s(pValue->ToString());
209 int JS_DefineGlobalConst(IJS_Runtime* pJSRuntime, const wchar_t* sConstName, v8: :Handle<v8::Value> pDefault) 825 return CFX_WideString::FromUTF8(*s, s.length());
210 { 826 }
211 v8::Isolate* isolate = (v8::Isolate*)pJSRuntime; 827
212 v8::Isolate::Scope isolate_scope(isolate); 828 v8::Handle<v8::Array> JS_ToArray(v8::Handle<v8::Value> pValue) {
213 v8::HandleScope handle_scope(isolate); 829 if (pValue.IsEmpty())
214 830 return v8::Handle<v8::Array>();
215 CFX_WideString ws = CFX_WideString((FX_LPCWSTR)sConstName); 831 return v8::Handle<v8::Array>::Cast(pValue->ToObject());
216 CFX_ByteString bsConst= ws.UTF8Encode(); 832 }
217 833
218 v8::Local<v8::ObjectTemplate> objTemp; 834 void JS_ValueCopy(v8::Handle<v8::Value>& pTo, v8::Handle<v8::Value> pFrom) {
219 835 pTo = pFrom;
220 v8::Persistent<v8::ObjectTemplate>& globalObjTemp = _getGlobalObjectTemp late(pJSRuntime); 836 }
221 if(globalObjTemp.IsEmpty()) 837
222 objTemp = v8::ObjectTemplate::New(isolate); 838 // JavaScript time implement begin.
223 else 839
224 objTemp = v8::Local<v8::ObjectTemplate>::New(isolate, globalObjT emp); 840 double _getLocalTZA() {
225 objTemp->Set(v8::String::NewFromUtf8(isolate, FX_LPCSTR(bsConst)), pDefa ult, v8::ReadOnly); 841 if (!FSDK_IsSandBoxPolicyEnabled(FPDF_POLICY_MACHINETIME_ACCESS))
226 842 return 0;
227 globalObjTemp.Reset(isolate,objTemp); 843 time_t t = 0;
228 844 time(&t);
229 return 0; 845 localtime(&t);
230 } 846 return (double)(-(timezone * 1000));
231 847 }
232 848
233 void JS_InitialRuntime(IJS_Runtime* pJSRuntime,IFXJS_Runtime* pFXRuntime, IFXJS_ Context* context, v8::Persistent<v8::Context>& v8PersistentContext) 849 int _getDaylightSavingTA(double d) {
234 { 850 if (!FSDK_IsSandBoxPolicyEnabled(FPDF_POLICY_MACHINETIME_ACCESS))
235 v8::Isolate* isolate = (v8::Isolate*)pJSRuntime; 851 return 0;
236 v8::Isolate::Scope isolate_scope(isolate); 852 time_t t = (time_t)(d / 1000);
237 v8::HandleScope handle_scope(isolate); 853 struct tm* tmp = localtime(&t);
238 854 if (tmp == NULL)
239 v8::Persistent<v8::ObjectTemplate>& globalObjTemp = _getGlobalObjectTemp late(pJSRuntime); 855 return 0;
240 v8::Handle<v8::Context> v8Context = v8::Context::New(isolate, NULL, v8:: Local<v8::ObjectTemplate>::New(isolate, globalObjTemp)); 856 if (tmp->tm_isdst > 0)
241 v8::Context::Scope context_scope(v8Context); 857 // One hour.
242 858 return (int)60 * 60 * 1000;
243 v8::Handle<v8::External> ptr = v8::External::New(isolate, pFXRuntime); 859 return 0;
244 v8Context->SetEmbedderData(1, ptr); 860 }
245 861
246 CFX_PtrArray* pArray = (CFX_PtrArray*)isolate->GetData(0); 862 double _Mod(double x, double y) {
247 if(!pArray) return; 863 double r = fmod(x, y);
248 864 if (r < 0)
249 for(int i=0; i<pArray->GetSize(); i++) 865 r += y;
250 { 866 return r;
251 CJS_ObjDefintion* pObjDef = (CJS_ObjDefintion*)pArray->GetAt(i); 867 }
252 CFX_WideString ws = CFX_WideString(pObjDef->objName); 868
253 CFX_ByteString bs = ws.UTF8Encode(); 869 int _isfinite(double v) {
254 v8::Handle<v8::String> objName = v8::String::NewFromUtf8(isolate ,(FX_LPCSTR)bs, v8::String::kNormalString, bs.GetLength()); 870 #if _MSC_VER
255 871 return ::_finite(v);
256 872 #else
257 if(pObjDef->objType == JS_DYNAMIC) 873 return std::fabs(v) < std::numeric_limits<double>::max();
258 {
259 //Document is set as global object, need to construct it first.
260 if(ws.Equal(L"Document"))
261 {
262
263 CJS_PrivateData* pPrivateData = FX_NEW CJS_Priva teData;
264 pPrivateData->ObjDefID = i;
265 v8::Handle<v8::External> ptr = v8::External::New (isolate, pPrivateData);
266
267 v8Context->Global()->GetPrototype()->ToObject()- >SetInternalField(0, ptr);
268
269 if(pObjDef->m_pConstructor)
270 pObjDef->m_pConstructor(context, v8Conte xt->Global()->GetPrototype()->ToObject(), v8Context->Global()->GetPrototype()->T oObject());
271 }
272 }
273 else
274 {
275 v8::Handle<v8::Object> obj = JS_NewFxDynamicObj(pJSRunti me, context, i);
276 v8Context->Global()->Set(objName, obj);
277 pObjDef->m_StaticObj.Reset(isolate, obj);
278 }
279 }
280 v8PersistentContext.Reset(isolate, v8Context);
281 }
282
283 void JS_ReleaseRuntime(IJS_Runtime* pJSRuntime, v8::Persistent<v8::Context>& v8P ersistentContext)
284 {
285 v8::Isolate* isolate = (v8::Isolate*)pJSRuntime;
286 v8::Isolate::Scope isolate_scope(isolate);
287 v8::HandleScope handle_scope(isolate);
288 v8::Local<v8::Context> context = v8::Local<v8::Context>::New(isolate, v8 PersistentContext);
289 v8::Context::Scope context_scope(context);
290
291 CFX_PtrArray* pArray = (CFX_PtrArray*)isolate->GetData(0);
292 if(!pArray) return ;
293
294 for(int i=0; i<pArray->GetSize(); i++)
295 {
296 CJS_ObjDefintion* pObjDef = (CJS_ObjDefintion*)pArray->GetAt(i);
297 if(!pObjDef->m_StaticObj.IsEmpty())
298 {
299 v8::Local<v8::Object> pObj = v8::Local<v8::Object>::New( isolate, pObjDef->m_StaticObj);
300 if(pObjDef->m_pDestructor)
301 pObjDef->m_pDestructor(pObj);
302 JS_FreePrivate(pObj);
303 }
304 delete pObjDef;
305 }
306 delete pArray;
307 isolate->SetData(0,NULL);
308 }
309
310 void JS_Initial()
311 {
312 #ifndef FOXIT_CHROME_BUILD
313 v8::V8::InitializeICU();
314 #endif 874 #endif
315 } 875 }
316 void JS_Release() 876
317 { 877 double _toInteger(double n) {
318 878 return (n >= 0) ? FXSYS_floor(n) : -FXSYS_floor(-n);
319 } 879 }
320 int JS_Parse(IJS_Runtime* pJSRuntime, IFXJS_Context* pJSContext, const wchar_t* script, long length, FXJSErr* perror) 880
321 { 881 bool _isLeapYear(int year) {
322 v8::Isolate* isolate = (v8::Isolate*)pJSRuntime; 882 return (year % 4 == 0) && ((year % 100 != 0) || (year % 400 != 0));
323 v8::Isolate::Scope isolate_scope(isolate); 883 }
324 v8::TryCatch try_catch; 884
325 885 int _DayFromYear(int y) {
326 CFX_WideString wsScript(script); 886 return (int)(365 * (y - 1970.0) + FXSYS_floor((y - 1969.0) / 4) -
327 CFX_ByteString bsScript = wsScript.UTF8Encode(); 887 FXSYS_floor((y - 1901.0) / 100) +
328 888 FXSYS_floor((y - 1601.0) / 400));
329 889 }
330 v8::Handle<v8::Script> compiled_script = v8::Script::Compile(v8::String: :NewFromUtf8(isolate,(FX_LPCSTR)bsScript,v8::String::kNormalString, bsScript.Get Length())); 890
331 if (compiled_script.IsEmpty()) { 891 double _TimeFromYear(int y) {
332 v8::String::Utf8Value error(try_catch.Exception()); 892 return ((double)86400000) * _DayFromYear(y);
333 return -1; 893 }
334 } 894
335 return 0; 895 double _TimeFromYearMonth(int y, int m) {
336 } 896 static int daysMonth[12] = { 0, 31, 59, 90, 120, 151,
337 897 181, 212, 243, 273, 304, 334 };
338 int JS_Execute(IJS_Runtime* pJSRuntime, IFXJS_Context* pJSContext, const wchar_t * script, long length, FXJSErr* perror) 898 static int leapDaysMonth[12] = { 0, 31, 60, 91, 121, 152,
339 { 899 182, 213, 244, 274, 305, 335 };
340 v8::Isolate* isolate = (v8::Isolate*)pJSRuntime; 900 int* pMonth = daysMonth;
341 v8::Isolate::Scope isolate_scope(isolate); 901 if (_isLeapYear(y))
342 v8::TryCatch try_catch; 902 pMonth = leapDaysMonth;
343 903 return _TimeFromYear(y) + ((double)pMonth[m]) * 86400000;
344 CFX_WideString wsScript(script); 904 }
345 CFX_ByteString bsScript = wsScript.UTF8Encode(); 905
346 906 int _Day(double t) {
347 v8::Handle<v8::Script> compiled_script = v8::Script::Compile(v8::String: :NewFromUtf8(isolate,(FX_LPCSTR)bsScript,v8::String::kNormalString, bsScript.Get Length())); 907 return (int)FXSYS_floor(t / 86400000);
348 if (compiled_script.IsEmpty()) { 908 }
349 v8::String::Utf8Value error(try_catch.Exception()); 909
350 return -1; 910 int _YearFromTime(double t) {
351 } 911 // estimate the time.
352 912 int y = 1970 + (int)(t / (365.0 * 86400000));
353 v8::Handle<v8::Value> result = compiled_script->Run(); 913 if (_TimeFromYear(y) <= t) {
354 if (result.IsEmpty()) { 914 while (_TimeFromYear(y + 1) <= t)
355 v8::String::Utf8Value error(try_catch.Exception()); 915 y++;
356 return -1; 916 } else
357 } 917 while (_TimeFromYear(y - 1) > t)
358 return 0; 918 y--;
359 } 919 return y;
360 920 }
361 v8::Handle<v8::Object> JS_NewFxDynamicObj(IJS_Runtime* pJSRuntime, IFXJS_Context * pJSContext, int nObjDefnID) 921
362 { 922 int _DayWithinYear(double t) {
363 v8::Isolate* isolate = (v8::Isolate*)pJSRuntime; 923 int year = _YearFromTime(t);
364 v8::Isolate::Scope isolate_scope(isolate); 924 int day = _Day(t);
365 if(-1 == nObjDefnID) 925 return day - _DayFromYear(year);
366 { 926 }
367 v8::Local<v8::ObjectTemplate> objTempl = v8::ObjectTemplate::New (isolate); 927
368 return objTempl->NewInstance(); 928 int _MonthFromTime(double t) {
369 } 929 int day = _DayWithinYear(t);
370 930 int year = _YearFromTime(t);
371 CFX_PtrArray* pArray = (CFX_PtrArray*)isolate->GetData(0); 931 if (0 <= day && day < 31)
372 if(!pArray) return v8::Handle<v8::Object>(); 932 return 0;
373 933 if (31 <= day && day < 59 + _isLeapYear(year))
374 934 return 1;
375 if(nObjDefnID<0 || nObjDefnID>= pArray->GetSize()) return v8::Handle<v8: :Object>(); 935 if ((59 + _isLeapYear(year)) <= day && day < (90 + _isLeapYear(year)))
376 CJS_ObjDefintion* pObjDef = (CJS_ObjDefintion*)pArray->GetAt(nObjDefnID) ; 936 return 2;
377 937 if ((90 + _isLeapYear(year)) <= day && day < (120 + _isLeapYear(year)))
378 v8::Local<v8::Context> context = isolate->GetCurrentContext(); 938 return 3;
379 v8::Local<v8::ObjectTemplate> objTemp = v8::Local<v8::ObjectTemplate>::N ew(isolate, pObjDef->m_objTemplate); 939 if ((120 + _isLeapYear(year)) <= day && day < (151 + _isLeapYear(year)))
380 940 return 4;
381 v8::Local<v8::Object> obj = objTemp->NewInstance(); 941 if ((151 + _isLeapYear(year)) <= day && day < (181 + _isLeapYear(year)))
382 942 return 5;
383 CJS_PrivateData* pPrivateData = FX_NEW CJS_PrivateData; 943 if ((181 + _isLeapYear(year)) <= day && day < (212 + _isLeapYear(year)))
384 pPrivateData->ObjDefID = nObjDefnID; 944 return 6;
385 v8::Handle<v8::External> ptr = v8::External::New(isolate, pPrivateData); 945 if ((212 + _isLeapYear(year)) <= day && day < (243 + _isLeapYear(year)))
386 obj->SetInternalField(0, ptr); 946 return 7;
387 947 if ((243 + _isLeapYear(year)) <= day && day < (273 + _isLeapYear(year)))
388 if(pObjDef->m_pConstructor) 948 return 8;
389 pObjDef->m_pConstructor(pJSContext, obj, context->Global()->GetP rototype()->ToObject()); 949 if ((273 + _isLeapYear(year)) <= day && day < (304 + _isLeapYear(year)))
390 950 return 9;
391 return obj; 951 if ((304 + _isLeapYear(year)) <= day && day < (334 + _isLeapYear(year)))
392 } 952 return 10;
393 953 if ((334 + _isLeapYear(year)) <= day && day < (365 + _isLeapYear(year)))
394 v8::Handle<v8::Object> JS_GetStaticObj(IJS_Runtime* pJSRuntime, int nObjDefnID) 954 return 11;
395 { 955
396 v8::Isolate* isolate = (v8::Isolate*)pJSRuntime; 956 return -1;
397 v8::Isolate::Scope isolate_scope(isolate); 957 }
398 958
399 CFX_PtrArray* pArray = (CFX_PtrArray*)isolate->GetData(0); 959 int _DateFromTime(double t) {
400 if(!pArray) return v8::Handle<v8::Object>(); 960 int day = _DayWithinYear(t);
401 961 int year = _YearFromTime(t);
402 if(nObjDefnID<0 || nObjDefnID>= pArray->GetSize()) return v8::Handle<v8: :Object>(); 962 bool leap = _isLeapYear(year);
403 CJS_ObjDefintion* pObjDef = (CJS_ObjDefintion*)pArray->GetAt(nObjDefnID) ; 963 int month = _MonthFromTime(t);
404 v8::Local<v8::Object> obj = v8::Local<v8::Object>::New(isolate,pObjDef-> m_StaticObj); 964 switch (month) {
405 return obj; 965 case 0:
406 } 966 return day + 1;
407 967 case 1:
408 void JS_SetThisObj(IJS_Runtime* pJSRuntime, int nThisObjID) 968 return day - 30;
409 { 969 case 2:
410 //Do nothing. 970 return day - 58 - leap;
411 } 971 case 3:
412 v8::Handle<v8::Object> JS_GetThisObj(IJS_Runtime * pJSRuntime) 972 return day - 89 - leap;
413 { 973 case 4:
414 //Return the global object. 974 return day - 119 - leap;
415 v8::Isolate* isolate = (v8::Isolate*)pJSRuntime; 975 case 5:
416 v8::Isolate::Scope isolate_scope(isolate); 976 return day - 150 - leap;
417 977 case 6:
418 CFX_PtrArray* pArray = (CFX_PtrArray*)isolate->GetData(0); 978 return day - 180 - leap;
419 if(!pArray) return v8::Handle<v8::Object>(); 979 case 7:
420 980 return day - 211 - leap;
421 v8::Local<v8::Context> context = isolate->GetCurrentContext(); 981 case 8:
422 return context->Global()->GetPrototype()->ToObject(); 982 return day - 242 - leap;
423 } 983 case 9:
424 984 return day - 272 - leap;
425 int JS_GetObjDefnID(v8::Handle<v8::Object> pObj) 985 case 10:
426 { 986 return day - 303 - leap;
427 if(pObj.IsEmpty() || !pObj->InternalFieldCount()) return -1; 987 case 11:
428 v8::Handle<v8::External> field = v8::Handle<v8::External>::Cast(pObj->Ge tInternalField(0)); 988 return day - 333 - leap;
429 CJS_PrivateData* pPrivateData = (CJS_PrivateData*)field->Value(); 989 default:
430 if(pPrivateData) 990 return 0;
431 return pPrivateData->ObjDefID; 991 }
432 return -1; 992 }
433 } 993
434 994 double JS_GetDateTime() {
435 IJS_Runtime* JS_GetRuntime(v8::Handle<v8::Object> pObj) 995 if (!FSDK_IsSandBoxPolicyEnabled(FPDF_POLICY_MACHINETIME_ACCESS))
436 { 996 return 0;
437 if(pObj.IsEmpty()) return NULL; 997 time_t t = time(NULL);
438 v8::Local<v8::Context> context = pObj->CreationContext(); 998 struct tm* pTm = localtime(&t);
439 if(context.IsEmpty()) return NULL; 999
440 return context->GetIsolate(); 1000 int year = pTm->tm_year + 1900;
441 } 1001 double t1 = _TimeFromYear(year);
442 1002
443 int JS_GetObjDefnID(IJS_Runtime * pJSRuntime, const wchar_t* pObjName) 1003 return t1 + pTm->tm_yday * 86400000.0 + pTm->tm_hour * 3600000.0 +
444 { 1004 pTm->tm_min * 60000.0 + pTm->tm_sec * 1000.0;
445 v8::Isolate* isolate = (v8::Isolate*)pJSRuntime; 1005 }
446 v8::Isolate::Scope isolate_scope(isolate); 1006
447 1007 int JS_GetYearFromTime(double dt) {
448 CFX_PtrArray* pArray = (CFX_PtrArray*)isolate->GetData(0); 1008 return _YearFromTime(dt);
449 if(!pArray) return -1; 1009 }
450 1010
451 for(int i=0; i<pArray->GetSize(); i++) 1011 int JS_GetMonthFromTime(double dt) {
452 { 1012 return _MonthFromTime(dt);
453 CJS_ObjDefintion* pObjDef = (CJS_ObjDefintion*)pArray->GetAt(i); 1013 }
454 if(FXSYS_wcscmp(pObjDef->objName, pObjName) == 0) 1014
455 return i; 1015 int JS_GetDayFromTime(double dt) {
456 } 1016 return _DateFromTime(dt);
457 return -1; 1017 }
458 } 1018
459 1019 int JS_GetHourFromTime(double dt) {
460 void JS_Error(v8::Value * pError,const wchar_t * main,const wchar_t * sub) 1020 return (int)_Mod(FXSYS_floor((double)(dt / (60 * 60 * 1000))), 24);
461 { 1021 }
462 1022
463 } 1023 int JS_GetMinFromTime(double dt) {
464 1024 return (int)_Mod(FXSYS_floor((double)(dt / (60 * 1000))), 60);
465 unsigned JS_CalcHash(const wchar_t* main, unsigned nLen) 1025 }
466 { 1026
467 return (unsigned)FX_HashCode_String_GetW(main, nLen); 1027 int JS_GetSecFromTime(double dt) {
468 } 1028 return (int)_Mod(FXSYS_floor((double)(dt / 1000)), 60);
469 1029 }
470 unsigned JS_CalcHash(const wchar_t* main) 1030
471 { 1031 double JS_DateParse(const wchar_t* string) {
472 return (unsigned)FX_HashCode_String_GetW(main, FXSYS_wcslen(main)); 1032 v8::Isolate* pIsolate = v8::Isolate::GetCurrent();
473 } 1033 v8::Isolate::Scope isolate_scope(pIsolate);
474 const wchar_t* JS_GetTypeof(v8::Handle<v8::Value> pObj) 1034 v8::HandleScope scope(pIsolate);
475 { 1035
476 if(pObj.IsEmpty()) return NULL; 1036 v8::Local<v8::Context> context = pIsolate->GetCurrentContext();
477 if(pObj->IsString()) 1037
478 return VALUE_NAME_STRING; 1038 // Use the built-in object method.
479 if(pObj->IsNumber()) 1039 v8::Local<v8::Value> v =
480 return VALUE_NAME_NUMBER; 1040 context->Global()->Get(v8::String::NewFromUtf8(pIsolate, "Date"));
481 if(pObj->IsBoolean()) 1041 if (v->IsObject()) {
482 return VALUE_NAME_BOOLEAN; 1042 v8::Local<v8::Object> o = v->ToObject();
483 if(pObj->IsDate()) 1043 v = o->Get(v8::String::NewFromUtf8(pIsolate, "parse"));
484 return VALUE_NAME_DATE; 1044 if (v->IsFunction()) {
485 if(pObj->IsObject()) 1045 v8::Local<v8::Function> funC = v8::Handle<v8::Function>::Cast(v);
486 return VALUE_NAME_OBJECT; 1046
487 if(pObj->IsNull()) 1047 const int argc = 1;
488 return VALUE_NAME_NULL; 1048 v8::Local<v8::String> timeStr = WSToJSString(pIsolate, string);
489 if(pObj->IsUndefined()) 1049 v8::Handle<v8::Value> argv[argc] = { timeStr };
490 return VALUE_NAME_UNDEFINED; 1050 v = funC->Call(context->Global(), argc, argv);
491 return NULL; 1051 if (v->IsNumber()) {
492 1052 double date = v->ToNumber()->Value();
493 } 1053 if (!_isfinite(date))
494 const wchar_t* JS_GetClassname(v8::Handle<v8::Object> pObj) 1054 return date;
495 { 1055 return date + _getLocalTZA() + _getDaylightSavingTA(date);
496 return NULL; 1056 }
497 } 1057 }
498 1058 }
499 void JS_SetPrivate(v8::Handle<v8::Object> pObj, void* p) 1059 return 0;
500 { 1060 }
501 JS_SetPrivate(NULL, pObj, p); 1061
502 } 1062 double JS_MakeDay(int nYear, int nMonth, int nDate) {
503 1063 if (!_isfinite(nYear) || !_isfinite(nMonth) || !_isfinite(nDate))
504 void* JS_GetPrivate(v8::Handle<v8::Object> pObj) 1064 return g_NaN;
505 { 1065 double y = _toInteger(nYear);
506 return JS_GetPrivate(NULL,pObj); 1066 double m = _toInteger(nMonth);
507 } 1067 double dt = _toInteger(nDate);
508 1068 double ym = y + FXSYS_floor((double)m / 12);
509 void JS_SetPrivate(IJS_Runtime* pJSRuntime, v8::Handle<v8::Object> pObj, void* p ) 1069 double mn = _Mod(m, 12);
510 { 1070
511 if(pObj.IsEmpty() || !pObj->InternalFieldCount()) return; 1071 double t = _TimeFromYearMonth((int)ym, (int)mn);
512 v8::Handle<v8::External> ptr = v8::Handle<v8::External>::Cast(pObj->GetI nternalField(0)); 1072
513 CJS_PrivateData* pPrivateData = (CJS_PrivateData*)ptr->Value(); 1073 if (_YearFromTime(t) != ym || _MonthFromTime(t) != mn ||
514 if(!pPrivateData) return; 1074 _DateFromTime(t) != 1)
515 pPrivateData->pPrivate = p; 1075 return g_NaN;
516 } 1076 return _Day(t) + dt - 1;
517 1077 }
518 void* JS_GetPrivate(IJS_Runtime* pJSRuntime, v8::Handle<v8::Object> pObj) 1078
519 { 1079 double JS_MakeTime(int nHour, int nMin, int nSec, int nMs) {
520 if(pObj.IsEmpty()) return NULL; 1080 if (!_isfinite(nHour) || !_isfinite(nMin) || !_isfinite(nSec) ||
521 v8::Local<v8::Value> value; 1081 !_isfinite(nMs))
522 if(pObj->InternalFieldCount()) 1082 return g_NaN;
523 value = pObj->GetInternalField(0); 1083
524 else 1084 double h = _toInteger(nHour);
525 { 1085 double m = _toInteger(nMin);
526 //It could be a global proxy object. 1086 double s = _toInteger(nSec);
527 v8::Local<v8::Value> v = pObj->GetPrototype(); 1087 double milli = _toInteger(nMs);
528 if(v->IsObject()) 1088
529 value = v->ToObject()->GetInternalField(0); 1089 return h * 3600000 + m * 60000 + s * 1000 + milli;
530 } 1090 }
531 if(value.IsEmpty() || value->IsUndefined()) return NULL; 1091
532 v8::Handle<v8::External> ptr = v8::Handle<v8::External>::Cast(value); 1092 double JS_MakeDate(double day, double time) {
533 CJS_PrivateData* pPrivateData = (CJS_PrivateData*)ptr->Value(); 1093 if (!_isfinite(day) || !_isfinite(time))
534 if(!pPrivateData) return NULL; 1094 return g_NaN;
535 return pPrivateData->pPrivate; 1095
536 } 1096 return day * 86400000 + time;
537 1097 }
538 void JS_FreePrivate(v8::Handle<v8::Object> pObj) 1098
539 { 1099 bool JS_PortIsNan(double d) {
540 if(pObj.IsEmpty() || !pObj->InternalFieldCount()) return; 1100 return d != d;
541 v8::Handle<v8::External> ptr = v8::Handle<v8::External>::Cast(pObj->GetI nternalField(0)); 1101 }
542 delete (CJS_PrivateData*)ptr->Value(); 1102
543 v8::Local<v8::Context> context = pObj->CreationContext(); 1103 double JS_LocalTime(double d) {
544 1104 return JS_GetDateTime() + _getDaylightSavingTA(d);
545 pObj->SetInternalField(0, v8::External::New(context->GetIsolate(), NULL) ); 1105 }
546 } 1106
547 1107 // JavaScript time implement End.
548
549 v8::Handle<v8::Value> JS_GetObjectValue(v8::Handle<v8::Object> pObj)
550 {
551 return pObj;
552 }
553
554 v8::Handle<v8::String> WSToJSString(IJS_Runtime* pJSRuntime, const wchar_t* Prop ertyName, int Len = -1)
555 {
556 CFX_WideString ws = CFX_WideString(PropertyName,Len);
557 CFX_ByteString bs = ws.UTF8Encode();
558 if(!pJSRuntime) pJSRuntime = v8::Isolate::GetCurrent();
559 return v8::String::NewFromUtf8(pJSRuntime, (FX_LPCSTR)bs);
560 }
561
562 v8::Handle<v8::Value> JS_GetObjectElement(IJS_Runtime* pJSRuntime, v8::Handle<v8 ::Object> pObj,const wchar_t* PropertyName)
563 {
564 if(pObj.IsEmpty()) return v8::Handle<v8::Value>();
565 return pObj->Get(WSToJSString(pJSRuntime,PropertyName));
566 }
567
568 v8::Handle<v8::Array> JS_GetObjectElementNames(v8::Handle<v8::Object> pObj)
569 {
570 if(pObj.IsEmpty()) return v8::Handle<v8::Array>();
571 return pObj->GetPropertyNames();
572 }
573
574 void JS_PutObjectString(IJS_Runtime* pJSRuntime,v8::Handle<v8::Object> pObj, con st wchar_t* PropertyName, const wchar_t* sValue) //VT_string
575 {
576 if(pObj.IsEmpty()) return;
577 pObj->Set(WSToJSString(pJSRuntime, PropertyName), WSToJSString(pJSRuntim e, sValue));
578 }
579
580 void JS_PutObjectNumber(IJS_Runtime* pJSRuntime,v8::Handle<v8::Object> pObj, con st wchar_t* PropertyName, int nValue)
581 {
582 if(pObj.IsEmpty()) return;
583 pObj->Set(WSToJSString(pJSRuntime,PropertyName),v8::Int32::New(pJSRuntim e, nValue));
584 }
585
586 void JS_PutObjectNumber(IJS_Runtime* pJSRuntime,v8::Handle<v8::Object> pObj, con st wchar_t* PropertyName, float fValue)
587 {
588 if(pObj.IsEmpty()) return;
589 pObj->Set(WSToJSString(pJSRuntime,PropertyName),v8::Number::New(pJSRunti me, (double)fValue));
590 }
591
592 void JS_PutObjectNumber(IJS_Runtime* pJSRuntime,v8::Handle<v8::Object> pObj, con st wchar_t* PropertyName, double dValue)
593 {
594 if(pObj.IsEmpty()) return;
595 pObj->Set(WSToJSString(pJSRuntime,PropertyName),v8::Number::New(pJSRunti me, (double)dValue));
596 }
597
598 void JS_PutObjectBoolean(IJS_Runtime* pJSRuntime,v8::Handle<v8::Object> pObj, co nst wchar_t* PropertyName, bool bValue)
599 {
600 if(pObj.IsEmpty()) return;
601 pObj->Set(WSToJSString(pJSRuntime,PropertyName),v8::Boolean::New(pJSRunt ime, bValue));
602 }
603
604 void JS_PutObjectObject(IJS_Runtime* pJSRuntime,v8::Handle<v8::Object> pObj, con st wchar_t* PropertyName, v8::Handle<v8::Object> pPut)
605 {
606 if(pObj.IsEmpty()) return;
607 pObj->Set(WSToJSString(pJSRuntime,PropertyName),pPut);
608 }
609
610 void JS_PutObjectNull(IJS_Runtime* pJSRuntime,v8::Handle<v8::Object> pObj, const wchar_t* PropertyName)
611 {
612 if(pObj.IsEmpty()) return;
613 pObj->Set(WSToJSString(pJSRuntime,PropertyName),v8::Handle<v8::Object>() );
614 }
615
616 v8::Handle<v8::Array> JS_NewArray(IJS_Runtime* pJSRuntime)
617 {
618 return v8::Array::New(pJSRuntime);
619 }
620
621 unsigned JS_PutArrayElement(v8::Handle<v8::Array> pArray,unsigned index,v8::Hand le<v8::Value> pValue,FXJSVALUETYPE eType)
622 {
623 if(pArray.IsEmpty()) return 0;
624 pArray->Set(index, pValue);
625 return 1;
626 }
627
628 v8::Handle<v8::Value> JS_GetArrayElemnet(v8::Handle<v8::Array> pArray,unsigned i ndex)
629 {
630 if(pArray.IsEmpty()) return v8::Handle<v8::Value>();
631 return pArray->Get(index);
632 }
633
634 unsigned JS_GetArrayLength(v8::Handle<v8::Array> pArray)
635 {
636 if(pArray.IsEmpty()) return 0;
637 return pArray->Length();
638 }
639
640 v8::Handle<v8::Value> JS_NewNumber(IJS_Runtime* pJSRuntime,int number)
641 {
642 return v8::Int32::New(pJSRuntime, number);
643 }
644
645 v8::Handle<v8::Value> JS_NewNumber(IJS_Runtime* pJSRuntime,double number)
646 {
647 return v8::Number::New(pJSRuntime, number);
648 }
649
650 v8::Handle<v8::Value> JS_NewNumber(IJS_Runtime* pJSRuntime,float number)
651 {
652 return v8::Number::New(pJSRuntime, (float)number);
653 }
654
655 v8::Handle<v8::Value> JS_NewBoolean(IJS_Runtime* pJSRuntime,bool b)
656 {
657 return v8::Boolean::New(pJSRuntime, b);
658 }
659
660 v8::Handle<v8::Value> JS_NewObject(IJS_Runtime* pJSRuntime,v8::Handle<v8::Object > pObj)
661 {
662 if(pObj.IsEmpty()) return v8::Handle<v8::Value>();
663 return pObj->Clone();
664 }
665
666 v8::Handle<v8::Value> JS_NewObject2(IJS_Runtime* pJSRuntime,v8::Handle<v8::Array > pObj)
667 {
668 if(pObj.IsEmpty()) return v8::Handle<v8::Value>();
669 return pObj->Clone();
670 }
671
672
673 v8::Handle<v8::Value> JS_NewString(IJS_Runtime* pJSRuntime,const wchar_t* string )
674 {
675 return WSToJSString(pJSRuntime, string);
676 }
677
678 v8::Handle<v8::Value> JS_NewString(IJS_Runtime* pJSRuntime,const wchar_t* string , unsigned nLen)
679 {
680 return WSToJSString(pJSRuntime, string, nLen);
681 }
682
683 v8::Handle<v8::Value> JS_NewNull()
684 {
685 return v8::Handle<v8::Value>();
686 }
687
688 v8::Handle<v8::Value> JS_NewDate(IJS_Runtime* pJSRuntime,double d)
689 {
690 return v8::Date::New(pJSRuntime, d);
691 }
692
693 v8::Handle<v8::Value> JS_NewValue(IJS_Runtime* pJSRuntime)
694 {
695 return v8::Handle<v8::Value>();
696 }
697
698 v8::Handle<v8::Value> JS_GetListValue(v8::Handle<v8::Value> pList, int index)
699 {
700
701 if(!pList.IsEmpty() && pList->IsObject())
702 {
703 v8::Local<v8::Object> obj = pList->ToObject();
704 return obj->Get(index);
705 }
706 return v8::Handle<v8::Value>();
707 }
708
709 int JS_ToInt32(v8::Handle<v8::Value> pValue)
710 {
711 if(pValue.IsEmpty()) return 0;
712 return pValue->ToInt32()->Value();
713 }
714
715 bool JS_ToBoolean(v8::Handle<v8::Value> pValue)
716 {
717 if(pValue.IsEmpty()) return false;
718 return pValue->ToBoolean()->Value();
719 }
720
721 double JS_ToNumber(v8::Handle<v8::Value> pValue)
722 {
723 if(pValue.IsEmpty()) return 0.0;
724 return pValue->ToNumber()->Value();
725 }
726
727 v8::Handle<v8::Object> JS_ToObject(v8::Handle<v8::Value> pValue)
728 {
729 if(pValue.IsEmpty()) return v8::Handle<v8::Object>();
730 return pValue->ToObject();
731 }
732
733 CFX_WideString JS_ToString(v8::Handle<v8::Value> pValue)
734 {
735 if(pValue.IsEmpty()) return L"";
736 v8::String::Utf8Value s(pValue->ToString());
737 return CFX_WideString::FromUTF8(*s, s.length());
738 }
739
740 v8::Handle<v8::Array> JS_ToArray(v8::Handle<v8::Value> pValue)
741 {
742 if(pValue.IsEmpty()) return v8::Handle<v8::Array>();
743 return v8::Handle<v8::Array>::Cast(pValue->ToObject());
744 }
745
746 void JS_ValueCopy(v8::Handle<v8::Value>& pTo, v8::Handle<v8::Value> pFrom)
747 {
748 pTo = pFrom;
749 }
750
751
752 //JavaScript time implement begin.
753
754 double _getLocalTZA()
755 {
756 if(!FSDK_IsSandBoxPolicyEnabled(FPDF_POLICY_MACHINETIME_ACCESS))
757 return 0;
758 time_t t = 0;
759 time(&t);
760 localtime(&t);
761 return (double)(-(timezone * 1000));
762 }
763
764 int _getDaylightSavingTA(double d)
765 {
766 if(!FSDK_IsSandBoxPolicyEnabled(FPDF_POLICY_MACHINETIME_ACCESS))
767 return 0;
768 time_t t = (time_t)(d/1000);
769 struct tm * tmp = localtime(&t);
770 if (tmp == NULL)
771 return 0;
772 if (tmp->tm_isdst > 0)
773 //One hour.
774 return (int)60*60*1000;
775 return 0;
776 }
777
778 double _Mod(double x, double y)
779 {
780 double r = fmod(x, y);
781 if (r < 0) r += y;
782 return r;
783 }
784
785 int _isfinite(double v)
786 {
787 #if _MSC_VER
788 return ::_finite(v);
789 #else
790 return std::fabs(v) < std::numeric_limits<double>::max();
791 #endif
792 }
793
794 double _toInteger(double n)
795 {
796 return (n >= 0)? FXSYS_floor(n): -FXSYS_floor(-n);
797 }
798
799 bool _isLeapYear(int year)
800 {
801 return (year%4==0)&&((year%100!=0)||(year%400!=0));
802 }
803
804 int _DayFromYear(int y)
805 {
806 return (int)(365*(y - 1970.0) + FXSYS_floor((y - 1969.0)/4) - FXSYS_floo r((y - 1901.0)/100)+FXSYS_floor((y - 1601.0)/400));
807 }
808
809 double _TimeFromYear(int y)
810 {
811 return ((double)86400000) * _DayFromYear(y);
812 }
813
814 double _TimeFromYearMonth(int y, int m)
815 {
816 static int daysMonth[12] ={ 0,31,59,90,120,151,181,212,243,273,304,334};
817 static int leapDaysMonth[12] = { 0,31,60,91,121,152,182,213,244,274,305, 335};
818 int* pMonth = daysMonth;
819 if(_isLeapYear(y))
820 pMonth = leapDaysMonth;
821 return _TimeFromYear(y) + ((double)pMonth[m])*86400000;
822 }
823
824 int _Day(double t)
825 {
826 return (int)FXSYS_floor(t / 86400000);
827 }
828
829 int _YearFromTime(double t)
830 {
831 //estimate the time.
832 int y = 1970 +(int)(t/(365.0*86400000));
833 if (_TimeFromYear(y) <= t)
834 {
835 while(_TimeFromYear(y+1) <= t) y++;
836 }
837 else
838 while(_TimeFromYear(y-1) > t) y--;
839 return y;
840 }
841
842 int _DayWithinYear(double t)
843 {
844 int year = _YearFromTime(t);
845 int day = _Day(t);
846 return day-_DayFromYear(year);
847 }
848
849 int _MonthFromTime(double t)
850 {
851 int day = _DayWithinYear(t);
852 int year = _YearFromTime(t);
853 if(0<=day && day <31)
854 return 0;
855 if(31<=day && day< 59+_isLeapYear(year))
856 return 1;
857 if((59+_isLeapYear(year))<=day && day<(90+_isLeapYear(year)))
858 return 2;
859 if((90+_isLeapYear(year))<=day && day<(120+_isLeapYear(year)))
860 return 3;
861 if((120+_isLeapYear(year))<=day && day<(151+_isLeapYear(year)))
862 return 4;
863 if((151+_isLeapYear(year))<=day && day<(181+_isLeapYear(year)))
864 return 5;
865 if((181+_isLeapYear(year))<=day && day<(212+_isLeapYear(year)))
866 return 6;
867 if((212+_isLeapYear(year))<=day && day<(243+_isLeapYear(year)))
868 return 7;
869 if((243+_isLeapYear(year))<=day && day<(273+_isLeapYear(year)))
870 return 8;
871 if((273+_isLeapYear(year))<=day && day<(304+_isLeapYear(year)))
872 return 9;
873 if((304+_isLeapYear(year))<=day && day<(334+_isLeapYear(year)))
874 return 10;
875 if((334+_isLeapYear(year))<=day && day<(365+_isLeapYear(year)))
876 return 11;
877
878 return -1;
879 }
880
881 int _DateFromTime(double t)
882 {
883 int day = _DayWithinYear(t);
884 int year = _YearFromTime(t);
885 bool leap = _isLeapYear(year);
886 int month = _MonthFromTime(t);
887 switch (month)
888 {
889 case 0:
890 return day+1;
891 case 1:
892 return day-30;
893 case 2:
894 return day-58-leap;
895 case 3:
896 return day-89-leap;
897 case 4:
898 return day-119-leap;
899 case 5:
900 return day-150-leap;
901 case 6:
902 return day-180-leap;
903 case 7:
904 return day-211-leap;
905 case 8:
906 return day-242-leap;
907 case 9:
908 return day-272-leap;
909 case 10:
910 return day-303-leap;
911 case 11:
912 return day-333-leap;
913 default:
914 return 0;
915 }
916 }
917
918 double JS_GetDateTime()
919 {
920 if(!FSDK_IsSandBoxPolicyEnabled(FPDF_POLICY_MACHINETIME_ACCESS))
921 return 0;
922 time_t t = time(NULL);
923 struct tm* pTm = localtime(&t);
924
925 int year = pTm->tm_year+1900;
926 double t1 = _TimeFromYear(year);
927
928 return t1 + pTm->tm_yday*86400000.0 + pTm->tm_hour*3600000.0+pTm->tm_min *60000.0+pTm->tm_sec*1000.0;
929 }
930
931 int JS_GetYearFromTime(double dt)
932 {
933 return _YearFromTime(dt);
934 }
935
936 int JS_GetMonthFromTime(double dt)
937 {
938 return _MonthFromTime(dt);
939 }
940
941 int JS_GetDayFromTime(double dt)
942 {
943 return _DateFromTime(dt);
944 }
945
946 int JS_GetHourFromTime(double dt)
947 {
948 return (int)_Mod(FXSYS_floor((double)(dt/(60*60*1000))), 24);
949 }
950
951 int JS_GetMinFromTime(double dt)
952 {
953 return (int)_Mod(FXSYS_floor((double)(dt/(60*1000))), 60);
954 }
955
956 int JS_GetSecFromTime(double dt)
957 {
958 return (int)_Mod(FXSYS_floor((double)(dt/1000)), 60);
959 }
960
961 double JS_DateParse(const wchar_t* string)
962 {
963 v8::Isolate* pIsolate = v8::Isolate::GetCurrent();
964 v8::Isolate::Scope isolate_scope(pIsolate);
965 v8::HandleScope scope(pIsolate);
966
967 v8::Local<v8::Context> context = pIsolate->GetCurrentContext();
968
969 //Use the built-in object method.
970 v8::Local<v8::Value> v = context->Global()->Get(v8::String::NewFromUtf8( pIsolate, "Date"));
971 if(v->IsObject())
972 {
973 v8::Local<v8::Object> o = v->ToObject();
974 v = o->Get(v8::String::NewFromUtf8(pIsolate, "parse"));
975 if(v->IsFunction())
976 {
977 v8::Local<v8::Function> funC = v8::Handle<v8::Function>: :Cast(v);
978
979 const int argc = 1;
980 v8::Local<v8::String> timeStr = WSToJSString(pIsolate, s tring);
981 v8::Handle<v8::Value> argv[argc] = {timeStr};
982 v = funC->Call(context->Global(), argc, argv);
983 if(v->IsNumber())
984 {
985 double date = v->ToNumber()->Value();
986 if(!_isfinite(date)) return date;
987 return date + _getLocalTZA() + _getDaylightSavin gTA(date);
988 }
989
990 }
991 }
992 return 0;
993 }
994
995 double JS_MakeDay(int nYear, int nMonth, int nDate)
996 {
997 if (!_isfinite(nYear) || !_isfinite(nMonth) ||!_isfinite(nDate))
998 return g_NaN;
999 double y = _toInteger(nYear);
1000 double m = _toInteger(nMonth);
1001 double dt = _toInteger(nDate);
1002 double ym = y + FXSYS_floor((double)m/12);
1003 double mn = _Mod(m ,12);
1004
1005 double t = _TimeFromYearMonth((int)ym,(int)mn);
1006
1007 if (_YearFromTime(t) != ym || _MonthFromTime(t) != mn ||_DateFromTime(t) != 1)
1008 return g_NaN;
1009 return _Day(t)+dt-1;
1010 }
1011
1012 double JS_MakeTime(int nHour, int nMin, int nSec, int nMs)
1013 {
1014 if (!_isfinite(nHour) ||!_isfinite(nMin) ||!_isfinite(nSec) ||!_isfinite (nMs))
1015 return g_NaN;
1016
1017 double h = _toInteger(nHour);
1018 double m = _toInteger(nMin);
1019 double s = _toInteger(nSec);
1020 double milli = _toInteger(nMs);
1021
1022 return h * 3600000 + m * 60000 + s * 1000 + milli;
1023 }
1024
1025 double JS_MakeDate(double day, double time)
1026 {
1027 if (!_isfinite(day) ||!_isfinite(time))
1028 return g_NaN;
1029
1030 return day * 86400000 + time;
1031 }
1032
1033 bool JS_PortIsNan(double d)
1034 {
1035 return d != d;
1036 }
1037
1038 double JS_LocalTime(double d)
1039 {
1040 return JS_GetDateTime() + _getDaylightSavingTA(d);
1041 }
1042
1043 //JavaScript time implement End.
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698