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