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