1e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov// Copyright 2014 PDFium Authors. All rights reserved. 2e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov// Use of this source code is governed by a BSD-style license that can be 3e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov// found in the LICENSE file. 4e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 5e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com 6e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 7e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#include "../../include/javascript/IJavaScript.h" 8e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#include "../../include/javascript/JS_Context.h" 9e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#include "../../include/javascript/JS_Define.h" 10e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#include "../../include/javascript/JS_EventHandler.h" 11e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#include "../../include/javascript/JS_GlobalData.h" 12e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#include "../../include/javascript/JS_Object.h" 13e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#include "../../include/javascript/JS_Value.h" 14e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#include "../../include/javascript/JavaScript.h" 15e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#include "../../include/javascript/global.h" 16e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#include "../../include/javascript/resource.h" 17e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 18e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov/* ---------------------------- global ---------------------------- */ 19e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 20e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov// Helper class for compile-time calculation of hash values in order to 21e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov// avoid having global object initializers. 22e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovtemplate <unsigned ACC, wchar_t... Ns> 23e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovstruct CHash; 24e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 25e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov// Only needed to hash single-character strings. 26e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovtemplate <wchar_t N> 27e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovstruct CHash<N> { 28e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov static const unsigned value = N; 29e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}; 30e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 31e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovtemplate <unsigned ACC, wchar_t N> 32e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovstruct CHash<ACC, N> { 33e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov static const unsigned value = (ACC * 1313LLU + N) & 0xFFFFFFFF; 34e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}; 35e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 36e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovtemplate <unsigned ACC, wchar_t N, wchar_t... Ns> 37e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovstruct CHash<ACC, N, Ns...> { 38e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov static const unsigned value = CHash<CHash<ACC, N>::value, Ns...>::value; 39e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}; 40e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 41e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovextern const unsigned int JSCONST_nStringHash = 42e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov CHash<'s','t','r','i','n','g'>::value; 43e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovextern const unsigned int JSCONST_nNumberHash = 44e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov CHash<'n','u','m','b','e','r'>::value; 45e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovextern const unsigned int JSCONST_nBoolHash = 46e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov CHash<'b','o','o','l','e','a','n'>::value; 47e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovextern const unsigned int JSCONST_nDateHash = 48e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov CHash<'d','a','t','e'>::value; 49e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovextern const unsigned int JSCONST_nObjectHash = 50e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov CHash<'o','b','j','e','c','t'>::value; 51e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovextern const unsigned int JSCONST_nFXobjHash = 52e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov CHash<'f','x','o','b','j'>::value; 53e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovextern const unsigned int JSCONST_nNullHash = 54e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov CHash<'n','u','l','l'>::value; 55e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovextern const unsigned int JSCONST_nUndefHash = 56e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov CHash<'u','n','d','e','f','i','n','e','d'>::value; 57e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 58e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#ifdef _DEBUG 59e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovclass HashVerify 60e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 61e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovpublic: 62e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov HashVerify(); 63e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} g_hashVerify; 64e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 65e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovHashVerify::HashVerify() 66e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 67e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov ASSERT(JSCONST_nStringHash == 68e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov JS_CalcHash(VALUE_NAME_STRING,wcslen(VALUE_NAME_STRING))); 69e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov ASSERT(JSCONST_nNumberHash == 70e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov JS_CalcHash(VALUE_NAME_NUMBER,wcslen(VALUE_NAME_NUMBER))); 71e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov ASSERT(JSCONST_nBoolHash == 72e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov JS_CalcHash(VALUE_NAME_BOOLEAN,wcslen(VALUE_NAME_BOOLEAN))); 73e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov ASSERT(JSCONST_nDateHash == 74e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov JS_CalcHash(VALUE_NAME_DATE,wcslen(VALUE_NAME_DATE))); 75e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov ASSERT(JSCONST_nObjectHash == 76e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov JS_CalcHash(VALUE_NAME_OBJECT,wcslen(VALUE_NAME_OBJECT))); 77e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov ASSERT(JSCONST_nFXobjHash == 78e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov JS_CalcHash(VALUE_NAME_FXOBJ,wcslen(VALUE_NAME_FXOBJ))); 79e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov ASSERT(JSCONST_nNullHash == 80e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov JS_CalcHash(VALUE_NAME_NULL,wcslen(VALUE_NAME_NULL))); 81e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov ASSERT(JSCONST_nUndefHash == 82e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov JS_CalcHash(VALUE_NAME_UNDEFINED,wcslen(VALUE_NAME_UNDEFINED))); 83e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 84e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#endif 85e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 86e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 87e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovBEGIN_JS_STATIC_CONST(CJS_Global) 88e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovEND_JS_STATIC_CONST() 89e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 90e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovBEGIN_JS_STATIC_PROP(CJS_Global) 91e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovEND_JS_STATIC_PROP() 92e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 93e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovBEGIN_JS_STATIC_METHOD(CJS_Global) 94e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov JS_STATIC_METHOD_ENTRY(setPersistent) 95e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovEND_JS_STATIC_METHOD() 96e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 97e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovIMPLEMENT_SPECIAL_JS_CLASS(CJS_Global, global_alternate, global); 98e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 99e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovFX_BOOL CJS_Global::InitInstance(IFXJS_Context* cc) 100e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 101e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov CJS_Context* pContext = (CJS_Context*)cc; 102e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov ASSERT(pContext != NULL); 103e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 104e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov global_alternate* pGlobal = (global_alternate*)GetEmbedObject(); 105e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov ASSERT(pGlobal != NULL); 106e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 107e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov pGlobal->Initial(pContext->GetReaderApp()); 108e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 109e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return TRUE; 110e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov}; 111e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 112e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovglobal_alternate::global_alternate(CJS_Object* pJSObject) 113e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov : CJS_EmbedObj(pJSObject), 114e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov m_pApp(NULL) 115e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 116e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 117e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 118e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovglobal_alternate::~global_alternate(void) 119e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 120e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov ASSERT(m_pApp != NULL); 121e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 122e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov// CommitGlobalPersisitentVariables(); 123e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov DestroyGlobalPersisitentVariables(); 124e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 125e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov CJS_RuntimeFactory* pFactory = m_pApp->m_pJSRuntimeFactory; 126e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov ASSERT(pFactory); 127e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 128e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov pFactory->ReleaseGlobalData(); 129e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 130e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 131e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovvoid global_alternate::Initial(CPDFDoc_Environment* pApp) 132e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 133e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov m_pApp = pApp; 134e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 135e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov CJS_RuntimeFactory* pFactory = pApp->m_pJSRuntimeFactory; 136e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov ASSERT(pFactory); 137e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov m_pGlobalData = pFactory->NewGlobalData(pApp); 138e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov UpdateGlobalPersistentVariables(); 139e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 140e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 141e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovFX_BOOL global_alternate::QueryProperty(FX_LPCWSTR propname) 142e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 143e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return CFX_WideString(propname) != L"setPersistent"; 144e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 145e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 146e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovFX_BOOL global_alternate::DelProperty(IFXJS_Context* cc, FX_LPCWSTR propname, CFX_WideString& sError) 147e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 148e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov js_global_data* pData = NULL; 149e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov CFX_ByteString sPropName = CFX_ByteString::FromUnicode(propname); 150e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 151e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (m_mapGlobal.Lookup(sPropName, (FX_LPVOID&)pData)) 152e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov { 153e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov pData->bDeleted = TRUE; 154e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return TRUE; 155e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 156e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 157e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return FALSE; 158e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 159e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 160e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovFX_BOOL global_alternate::DoProperty(IFXJS_Context* cc, FX_LPCWSTR propname, CJS_PropValue& vp, CFX_WideString& sError) 161e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 162e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (vp.IsSetting()) 163e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov { 164e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov CFX_ByteString sPropName = CFX_ByteString::FromUnicode(propname); 165e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov switch (vp.GetType()) 166e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov { 167e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov case VT_number: 168e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov { 169e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov double dData; 170e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov vp >> dData; 171e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return SetGlobalVariables(sPropName, JS_GLOBALDATA_TYPE_NUMBER, dData, false, "", v8::Local<v8::Object>(), FALSE); 172e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 173e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov case VT_boolean: 174e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov { 175e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov bool bData; 176e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov vp >> bData; 177e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return SetGlobalVariables(sPropName, JS_GLOBALDATA_TYPE_BOOLEAN, 0, bData, "", v8::Local<v8::Object>(), FALSE); 178e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 179e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov case VT_string: 180e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov { 181e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov CFX_ByteString sData; 182e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov vp >> sData; 183e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return SetGlobalVariables(sPropName, JS_GLOBALDATA_TYPE_STRING, 0, false, sData, v8::Local<v8::Object>(), FALSE); 184e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 185e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov case VT_object: 186e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov { 187e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov JSObject pData; 188e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov vp >> pData; 189e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return SetGlobalVariables(sPropName, JS_GLOBALDATA_TYPE_OBJECT, 0, false, "", pData, FALSE); 190e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 191e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov case VT_null: 192e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov { 193e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return SetGlobalVariables(sPropName, JS_GLOBALDATA_TYPE_NULL, 0, false, "", v8::Local<v8::Object>(), FALSE); 194e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 195e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov case VT_undefined: 196e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov { 197e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov DelProperty(cc, propname, sError); 198e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return TRUE; 199e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 200e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov default: 201e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return FALSE; 202e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 203e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 204e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov else 205e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov { 206e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov js_global_data* pData = NULL; 207e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov CFX_ByteString sPropName = CFX_ByteString::FromUnicode(propname); 208e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 209e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (m_mapGlobal.Lookup(sPropName, (FX_LPVOID&)pData)) 210e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov { 211e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (pData) 212e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov { 213e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (!pData->bDeleted) 214e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov { 215e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov switch (pData->nType) 216e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov { 217e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov case JS_GLOBALDATA_TYPE_NUMBER: 218e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov vp << pData->dData; 219e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov break; 220e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov case JS_GLOBALDATA_TYPE_BOOLEAN: 221e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov vp << pData->bData; 222e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov break; 223e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov case JS_GLOBALDATA_TYPE_STRING: 224e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov vp << pData->sData; 225e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov break; 226e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov case JS_GLOBALDATA_TYPE_OBJECT: 227e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov { 228e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov v8::Local<v8::Object> obj = v8::Local<v8::Object>::New(vp.GetIsolate(),pData->pData); 229e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov vp << obj; 230e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov break; 231e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 232e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov case JS_GLOBALDATA_TYPE_NULL: 233e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov vp.SetNull(); 234e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov break; 235e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov default: 236e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return FALSE; 237e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 238e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return TRUE; 239e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 240e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov else 241e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov { 242e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return TRUE; 243e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 244e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 245e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov else 246e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov { 247e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov vp.SetNull(); 248e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return TRUE; 249e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 250e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 251e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov else 252e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov { 253e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov vp.SetNull(); 254e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return TRUE; 255e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 256e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 257e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 258e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return FALSE; 259e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 260e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 261e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovFX_BOOL global_alternate::setPersistent(IFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, CFX_WideString& sError) 262e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 263e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov CJS_Context* pContext = static_cast<CJS_Context*>(cc); 264e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (params.size() != 2) 265e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov { 266e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR); 267e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return FALSE; 268e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 269e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 270e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov CFX_ByteString sName = params[0].ToCFXByteString(); 271e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 272e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov js_global_data* pData = NULL; 273e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (m_mapGlobal.Lookup(sName, (FX_LPVOID&)pData)) 274e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov { 275e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (pData && !pData->bDeleted) 276e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov { 277e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov pData->bPersistent = params[1].ToBool(); 278e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return TRUE; 279e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 280e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 281e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 282e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov sError = JSGetStringFromID(pContext, IDS_STRING_JSNOGLOBAL); 283e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return FALSE; 284e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 285e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 286e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovvoid global_alternate::UpdateGlobalPersistentVariables() 287e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 288e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov ASSERT(m_pGlobalData != NULL); 289e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 290e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov for (int i=0,sz=m_pGlobalData->GetSize(); i<sz; i++) 291e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov { 292e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov CJS_GlobalData_Element* pData = m_pGlobalData->GetAt(i); 293e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov ASSERT(pData != NULL); 294e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 295e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov switch (pData->data.nType) 296e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov { 297e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov case JS_GLOBALDATA_TYPE_NUMBER: 298e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov this->SetGlobalVariables(pData->data.sKey, JS_GLOBALDATA_TYPE_NUMBER, pData->data.dData, false, "", v8::Local<v8::Object>(), pData->bPersistent == 1); 299e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov JS_PutObjectNumber(NULL,(JSFXObject)(*m_pJSObject), 300e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov pData->data.sKey.UTF8Decode().c_str(), pData->data.dData); 301e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov break; 302e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov case JS_GLOBALDATA_TYPE_BOOLEAN: 303e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov this->SetGlobalVariables(pData->data.sKey, JS_GLOBALDATA_TYPE_BOOLEAN, 0, (bool)(pData->data.bData == 1), "", v8::Local<v8::Object>(), pData->bPersistent == 1); 304e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov JS_PutObjectBoolean(NULL,(JSFXObject)(*m_pJSObject), 305e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov pData->data.sKey.UTF8Decode().c_str(), (bool)(pData->data.bData == 1)); 306e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov break; 307e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov case JS_GLOBALDATA_TYPE_STRING: 308e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov this->SetGlobalVariables(pData->data.sKey, JS_GLOBALDATA_TYPE_STRING, 0, false, pData->data.sData, v8::Local<v8::Object>(), pData->bPersistent == 1); 309e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov JS_PutObjectString(NULL, (JSFXObject)(*m_pJSObject), 310e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov pData->data.sKey.UTF8Decode().c_str(), 311e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov pData->data.sData.UTF8Decode().c_str()); 312e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov break; 313e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov case JS_GLOBALDATA_TYPE_OBJECT: 314e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov { 315e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov IJS_Runtime* pRuntime = JS_GetRuntime((JSFXObject)(*m_pJSObject)); 316e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov v8::Local<v8::Object> pObj = JS_NewFxDynamicObj(pRuntime, NULL, -1); 317e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 318e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov PutObjectProperty(pObj, &pData->data); 319e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 320e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov this->SetGlobalVariables(pData->data.sKey, JS_GLOBALDATA_TYPE_OBJECT, 0, false, "", 321e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov (JSObject)pObj, pData->bPersistent == 1); 322e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov JS_PutObjectObject(NULL,(JSFXObject)(*m_pJSObject), 323e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov pData->data.sKey.UTF8Decode().c_str(), (JSObject)pObj); 324e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 325e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov break; 326e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov case JS_GLOBALDATA_TYPE_NULL: 327e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov this->SetGlobalVariables(pData->data.sKey, JS_GLOBALDATA_TYPE_NULL, 0, false, "", v8::Local<v8::Object>(), pData->bPersistent == 1); 328e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov JS_PutObjectNull(NULL,(JSFXObject)(*m_pJSObject), 329e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov pData->data.sKey.UTF8Decode().c_str()); 330e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov break; 331e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 332e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 333e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 334e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 335e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovvoid global_alternate::CommitGlobalPersisitentVariables() 336e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 337e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov ASSERT(m_pGlobalData != NULL); 338e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 339e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FX_POSITION pos = m_mapGlobal.GetStartPosition(); 340e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov while (pos) 341e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov { 342e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov CFX_ByteString name; 343e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov js_global_data* pData = NULL; 344e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov m_mapGlobal.GetNextAssoc(pos, name, (FX_LPVOID&)pData); 345e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 346e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (pData) 347e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov { 348e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (pData->bDeleted) 349e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov { 350e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov m_pGlobalData->DeleteGlobalVariable(name); 351e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 352e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov else 353e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov { 354e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov switch (pData->nType) 355e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov { 356e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov case JS_GLOBALDATA_TYPE_NUMBER: 357e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov m_pGlobalData->SetGlobalVariableNumber(name, pData->dData); 358e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov m_pGlobalData->SetGlobalVariablePersistent(name, pData->bPersistent); 359e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov break; 360e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov case JS_GLOBALDATA_TYPE_BOOLEAN: 361e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov m_pGlobalData->SetGlobalVariableBoolean(name, pData->bData); 362e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov m_pGlobalData->SetGlobalVariablePersistent(name, pData->bPersistent); 363e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov break; 364e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov case JS_GLOBALDATA_TYPE_STRING: 365e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov m_pGlobalData->SetGlobalVariableString(name, pData->sData); 366e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov m_pGlobalData->SetGlobalVariablePersistent(name, pData->bPersistent); 367e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov break; 368e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov case JS_GLOBALDATA_TYPE_OBJECT: 369e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov //if (pData->pData) 370e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov { 371e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov CJS_GlobalVariableArray array; 372e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov v8::Local<v8::Object> obj = v8::Local<v8::Object>::New(GetJSObject()->GetIsolate(),pData->pData); 373e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov ObjectToArray(obj, array); 374e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov m_pGlobalData->SetGlobalVariableObject(name, array); 375e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov m_pGlobalData->SetGlobalVariablePersistent(name, pData->bPersistent); 376e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 377e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov break; 378e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov case JS_GLOBALDATA_TYPE_NULL: 379e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov m_pGlobalData->SetGlobalVariableNull(name); 380e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov m_pGlobalData->SetGlobalVariablePersistent(name, pData->bPersistent); 381e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov break; 382e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 383e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 384e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 385e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 386e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 387e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 388e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovvoid global_alternate::ObjectToArray(v8::Local<v8::Object> pObj, CJS_GlobalVariableArray& array) 389e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 390e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov v8::Local<v8::Context> context = pObj->CreationContext(); 391e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov v8::Isolate* isolate = context->GetIsolate(); 392e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov v8::Local<v8::Array> pKeyList = JS_GetObjectElementNames(isolate, pObj); 393e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov int nObjElements = pKeyList->Length(); 394e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 395e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov for (int i=0; i<nObjElements; i++) 396e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov { 397e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 398e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov CFX_WideString ws = JS_ToString(isolate, JS_GetArrayElement(isolate, pKeyList, i)); 399e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov CFX_ByteString sKey = ws.UTF8Encode(); 400e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 401e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov v8::Local<v8::Value> v = JS_GetObjectElement(isolate, pObj, ws.c_str()); 402e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FXJSVALUETYPE vt = GET_VALUE_TYPE(v); 403e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov switch (vt) 404e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov { 405e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov case VT_number: 406e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov { 407e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov CJS_KeyValue* pObjElement = new CJS_KeyValue; 408e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov pObjElement->nType = JS_GLOBALDATA_TYPE_NUMBER; 409e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov pObjElement->sKey = sKey; 410e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov pObjElement->dData = JS_ToNumber(isolate, v); 411e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov array.Add(pObjElement); 412e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 413e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov break; 414e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov case VT_boolean: 415e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov { 416e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov CJS_KeyValue* pObjElement = new CJS_KeyValue; 417e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov pObjElement->nType = JS_GLOBALDATA_TYPE_BOOLEAN; 418e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov pObjElement->sKey = sKey; 419e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov pObjElement->dData = JS_ToBoolean(isolate, v); 420e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov array.Add(pObjElement); 421e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 422e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov break; 423e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov case VT_string: 424e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov { 425e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov CFX_ByteString sValue = CJS_Value(isolate, v, VT_string).ToCFXByteString(); 426e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov CJS_KeyValue* pObjElement = new CJS_KeyValue; 427e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov pObjElement->nType = JS_GLOBALDATA_TYPE_STRING; 428e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov pObjElement->sKey = sKey; 429e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov pObjElement->sData = sValue; 430e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov array.Add(pObjElement); 431e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 432e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov break; 433e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov case VT_object: 434e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov { 435e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov CJS_KeyValue* pObjElement = new CJS_KeyValue; 436e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov pObjElement->nType = JS_GLOBALDATA_TYPE_OBJECT; 437e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov pObjElement->sKey = sKey; 438e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov ObjectToArray(JS_ToObject(isolate, v), pObjElement->objData); 439e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov array.Add(pObjElement); 440e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 441e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov break; 442e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov case VT_null: 443e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov { 444e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov CJS_KeyValue* pObjElement = new CJS_KeyValue; 445e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov pObjElement->nType = JS_GLOBALDATA_TYPE_NULL; 446e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov pObjElement->sKey = sKey; 447e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov array.Add(pObjElement); 448e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 449e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov break; 450e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov default: 451e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov break; 452e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 453e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 454e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 455e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 456e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovvoid global_alternate::PutObjectProperty(v8::Local<v8::Object> pObj, CJS_KeyValue* pData) 457e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 458e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov ASSERT(pData != NULL); 459e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 460e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov for (int i=0,sz=pData->objData.Count(); i<sz; i++) 461e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov { 462e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov CJS_KeyValue* pObjData = pData->objData.GetAt(i); 463e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov ASSERT(pObjData != NULL); 464e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 465e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov switch (pObjData->nType) 466e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov { 467e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov case JS_GLOBALDATA_TYPE_NUMBER: 468e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov JS_PutObjectNumber(NULL,(JSObject)pObj, pObjData->sKey.UTF8Decode().c_str(), pObjData->dData); 469e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov break; 470e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov case JS_GLOBALDATA_TYPE_BOOLEAN: 471e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov JS_PutObjectBoolean(NULL,(JSObject)pObj, pObjData->sKey.UTF8Decode().c_str(), (bool)(pObjData->bData == 1)); 472e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov break; 473e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov case JS_GLOBALDATA_TYPE_STRING: 474e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov JS_PutObjectString(NULL,(JSObject)pObj, pObjData->sKey.UTF8Decode().c_str(), pObjData->sData.UTF8Decode().c_str()); 475e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov break; 476e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov case JS_GLOBALDATA_TYPE_OBJECT: 477e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov { 478e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov IJS_Runtime* pRuntime = JS_GetRuntime((JSFXObject)(*m_pJSObject)); 479e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov v8::Local<v8::Object> pNewObj = JS_NewFxDynamicObj(pRuntime, NULL, -1); 480e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov PutObjectProperty(pNewObj, pObjData); 481e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov JS_PutObjectObject(NULL, (JSObject)pObj, pObjData->sKey.UTF8Decode().c_str(), (JSObject)pNewObj); 482e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 483e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov break; 484e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov case JS_GLOBALDATA_TYPE_NULL: 485e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov JS_PutObjectNull(NULL,(JSObject)pObj, pObjData->sKey.UTF8Decode().c_str()); 486e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov break; 487e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 488e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 489e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 490e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 491e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganovvoid global_alternate::DestroyGlobalPersisitentVariables() 492e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 493e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov FX_POSITION pos = m_mapGlobal.GetStartPosition(); 494e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov while (pos) 495e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov { 496e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov CFX_ByteString name; 497e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov js_global_data* pData = NULL; 498e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov m_mapGlobal.GetNextAssoc(pos, name, (FX_LPVOID&)pData); 499e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov delete pData; 500e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 501e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 502e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov m_mapGlobal.RemoveAll(); 503e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 504e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 505e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 506e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovFX_BOOL global_alternate::SetGlobalVariables(FX_LPCSTR propname, int nType, 507e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov double dData, bool bData, const CFX_ByteString& sData, JSObject pData, bool bDefaultPersistent) 508e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 509e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (propname == NULL) return FALSE; 510e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 511e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov js_global_data* pTemp = NULL; 512e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov m_mapGlobal.Lookup(propname, (FX_LPVOID&)pTemp); 513e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 514e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (pTemp) 515e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov { 516e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (pTemp->bDeleted || pTemp->nType != nType) 517e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov { 518e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov pTemp->dData = 0; 519e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov pTemp->bData = 0; 520e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov pTemp->sData = ""; 521e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov pTemp->nType = nType; 522e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 523e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 524e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov pTemp->bDeleted = FALSE; 525e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 526e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov switch (nType) 527e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov { 528e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov case JS_GLOBALDATA_TYPE_NUMBER: 529e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov { 530e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov pTemp->dData = dData; 531e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 532e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov break; 533e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov case JS_GLOBALDATA_TYPE_BOOLEAN: 534e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov { 535e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov pTemp->bData = bData; 536e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 537e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov break; 538e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov case JS_GLOBALDATA_TYPE_STRING: 539e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov { 540e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov pTemp->sData = sData; 541e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 542e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov break; 543e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov case JS_GLOBALDATA_TYPE_OBJECT: 544e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov { 545e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov pTemp->pData.Reset(JS_GetRuntime(pData), pData); 546e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 547e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov break; 548e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov case JS_GLOBALDATA_TYPE_NULL: 549e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov break; 550e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov default: 551e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return FALSE; 552e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 553e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 554e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return TRUE; 555e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 556e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 557e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov js_global_data* pNewData = NULL; 558e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 559e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov switch (nType) 560e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov { 561e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov case JS_GLOBALDATA_TYPE_NUMBER: 562e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov { 563e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov pNewData = new js_global_data; 564e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov pNewData->nType = JS_GLOBALDATA_TYPE_NUMBER; 565e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov pNewData->dData = dData; 566e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov pNewData->bPersistent = bDefaultPersistent; 567e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 568e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov break; 569e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov case JS_GLOBALDATA_TYPE_BOOLEAN: 570e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov { 571e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov pNewData = new js_global_data; 572e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov pNewData->nType = JS_GLOBALDATA_TYPE_BOOLEAN; 573e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov pNewData->bData = bData; 574e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov pNewData->bPersistent = bDefaultPersistent; 575e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 576e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov break; 577e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov case JS_GLOBALDATA_TYPE_STRING: 578e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov { 579e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov pNewData = new js_global_data; 580e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov pNewData->nType = JS_GLOBALDATA_TYPE_STRING; 581e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov pNewData->sData = sData; 582e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov pNewData->bPersistent = bDefaultPersistent; 583e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 584e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov break; 585e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov case JS_GLOBALDATA_TYPE_OBJECT: 586e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov { 587e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov pNewData = new js_global_data; 588e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov pNewData->nType = JS_GLOBALDATA_TYPE_OBJECT; 589e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov pNewData->pData.Reset(JS_GetRuntime(pData), pData); 590e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov pNewData->bPersistent = bDefaultPersistent; 591e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 592e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov break; 593e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov case JS_GLOBALDATA_TYPE_NULL: 594e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov { 595e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov pNewData = new js_global_data; 596e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov pNewData->nType = JS_GLOBALDATA_TYPE_NULL; 597e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov pNewData->bPersistent = bDefaultPersistent; 598e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 599e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov break; 600e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov default: 601e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return FALSE; 602e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov } 603e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 604e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov m_mapGlobal.SetAt(propname, (FX_LPVOID)pNewData); 605e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 606e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return TRUE; 607e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 608e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 609e6986e1e8d4a57987f47c215490cb080a65ee29aSvet GanovFXJSVALUETYPE GET_VALUE_TYPE(v8::Local<v8::Value> p) 610e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov{ 611e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov const unsigned int nHash = JS_CalcHash(JS_GetTypeof(p)); 612e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 613e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (nHash == JSCONST_nUndefHash) 614e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return VT_undefined; 615e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (nHash == JSCONST_nNullHash) 616e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return VT_null; 617e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (nHash == JSCONST_nStringHash) 618e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return VT_string; 619e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (nHash == JSCONST_nNumberHash) 620e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return VT_number; 621e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (nHash == JSCONST_nBoolHash) 622e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return VT_boolean; 623e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (nHash == JSCONST_nDateHash) 624e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return VT_date; 625e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (nHash == JSCONST_nObjectHash) 626e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return VT_object; 627e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if (nHash == JSCONST_nFXobjHash) 628e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return VT_fxobject; 629e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 630e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return VT_unknown; 631e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov} 632e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 633