blob: 52b79d391017cf62427cb70ed69f806f71f130a4 [file] [log] [blame]
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001// Copyright 2014 PDFium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
Lei Zhanga6d9f0e2015-06-13 00:48:38 -07004
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07005// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07007#include "../../include/javascript/IJavaScript.h"
Tom Sepez3a832662015-03-02 12:59:05 -08008#include "../../include/javascript/JS_Context.h"
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07009#include "../../include/javascript/JS_Define.h"
Tom Sepez3a832662015-03-02 12:59:05 -080010#include "../../include/javascript/JS_EventHandler.h"
11#include "../../include/javascript/JS_GlobalData.h"
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070012#include "../../include/javascript/JS_Object.h"
13#include "../../include/javascript/JS_Value.h"
Tom Sepez3a832662015-03-02 12:59:05 -080014#include "../../include/javascript/JavaScript.h"
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070015#include "../../include/javascript/global.h"
Bo Xufdc00a72014-10-28 23:03:33 -070016#include "../../include/fpdfxfa/fpdfxfa_app.h"
Tom Sepez3a832662015-03-02 12:59:05 -080017#include "../../include/javascript/resource.h"
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070018
19/* ---------------------------- global ---------------------------- */
20
Bruce Dawsone68d6242015-01-05 15:18:21 -080021// Helper class for compile-time calculation of hash values in order to
22// avoid having global object initializers.
Lei Zhang659b8d32015-02-27 19:49:57 -080023template <unsigned ACC, wchar_t... Ns>
24struct CHash;
25
26// Only needed to hash single-character strings.
27template <wchar_t N>
28struct CHash<N> {
29 static const unsigned value = N;
30};
31
32template <unsigned ACC, wchar_t N>
33struct CHash<ACC, N> {
34 static const unsigned value = (ACC * 1313LLU + N) & 0xFFFFFFFF;
35};
36
37template <unsigned ACC, wchar_t N, wchar_t... Ns>
38struct CHash<ACC, N, Ns...> {
39 static const unsigned value = CHash<CHash<ACC, N>::value, Ns...>::value;
40};
Bruce Dawsone68d6242015-01-05 15:18:21 -080041
42extern const unsigned int JSCONST_nStringHash =
43 CHash<'s','t','r','i','n','g'>::value;
44extern const unsigned int JSCONST_nNumberHash =
45 CHash<'n','u','m','b','e','r'>::value;
46extern const unsigned int JSCONST_nBoolHash =
47 CHash<'b','o','o','l','e','a','n'>::value;
48extern const unsigned int JSCONST_nDateHash =
49 CHash<'d','a','t','e'>::value;
50extern const unsigned int JSCONST_nObjectHash =
51 CHash<'o','b','j','e','c','t'>::value;
52extern const unsigned int JSCONST_nFXobjHash =
53 CHash<'f','x','o','b','j'>::value;
54extern const unsigned int JSCONST_nNullHash =
55 CHash<'n','u','l','l'>::value;
56extern const unsigned int JSCONST_nUndefHash =
57 CHash<'u','n','d','e','f','i','n','e','d'>::value;
58
59#ifdef _DEBUG
60class HashVerify
61{
62public:
63 HashVerify();
64} g_hashVerify;
65
66HashVerify::HashVerify()
67{
68 ASSERT(JSCONST_nStringHash ==
69 JS_CalcHash(VALUE_NAME_STRING,wcslen(VALUE_NAME_STRING)));
70 ASSERT(JSCONST_nNumberHash ==
71 JS_CalcHash(VALUE_NAME_NUMBER,wcslen(VALUE_NAME_NUMBER)));
72 ASSERT(JSCONST_nBoolHash ==
73 JS_CalcHash(VALUE_NAME_BOOLEAN,wcslen(VALUE_NAME_BOOLEAN)));
74 ASSERT(JSCONST_nDateHash ==
75 JS_CalcHash(VALUE_NAME_DATE,wcslen(VALUE_NAME_DATE)));
76 ASSERT(JSCONST_nObjectHash ==
77 JS_CalcHash(VALUE_NAME_OBJECT,wcslen(VALUE_NAME_OBJECT)));
78 ASSERT(JSCONST_nFXobjHash ==
79 JS_CalcHash(VALUE_NAME_FXOBJ,wcslen(VALUE_NAME_FXOBJ)));
80 ASSERT(JSCONST_nNullHash ==
81 JS_CalcHash(VALUE_NAME_NULL,wcslen(VALUE_NAME_NULL)));
82 ASSERT(JSCONST_nUndefHash ==
83 JS_CalcHash(VALUE_NAME_UNDEFINED,wcslen(VALUE_NAME_UNDEFINED)));
84}
85#endif
86
Bruce Dawsonc674af42014-12-12 21:30:37 -080087
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070088BEGIN_JS_STATIC_CONST(CJS_Global)
89END_JS_STATIC_CONST()
90
91BEGIN_JS_STATIC_PROP(CJS_Global)
92END_JS_STATIC_PROP()
93
94BEGIN_JS_STATIC_METHOD(CJS_Global)
Tom Sepeze5350ef2015-04-23 18:14:26 -070095 JS_STATIC_METHOD_ENTRY(setPersistent)
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070096END_JS_STATIC_METHOD()
97
98IMPLEMENT_SPECIAL_JS_CLASS(CJS_Global, global_alternate, global);
99
100FX_BOOL CJS_Global::InitInstance(IFXJS_Context* cc)
101{
102 CJS_Context* pContext = (CJS_Context*)cc;
103 ASSERT(pContext != NULL);
104
105 global_alternate* pGlobal = (global_alternate*)GetEmbedObject();
106 ASSERT(pGlobal != NULL);
Lei Zhanga6d9f0e2015-06-13 00:48:38 -0700107
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700108 pGlobal->Initial(pContext->GetReaderApp());
Lei Zhanga6d9f0e2015-06-13 00:48:38 -0700109
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700110 return TRUE;
111};
112
113global_alternate::global_alternate(CJS_Object* pJSObject)
114 : CJS_EmbedObj(pJSObject),
115 m_pApp(NULL)
116{
117}
118
119global_alternate::~global_alternate(void)
120{
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700121 DestroyGlobalPersisitentVariables();
Tom Sepezdcbc02f2015-07-17 09:16:17 -0700122 CPDFXFA_App::GetInstance()->GetRuntimeFactory()->ReleaseGlobalData();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700123}
Tom Sepezbdeeb8a2015-05-27 12:25:00 -0700124
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700125void global_alternate::Initial(CPDFDoc_Environment* pApp)
126{
127 m_pApp = pApp;
Tom Sepezdcbc02f2015-07-17 09:16:17 -0700128 m_pGlobalData = CPDFXFA_App::GetInstance()->GetRuntimeFactory()->NewGlobalData(pApp);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700129 UpdateGlobalPersistentVariables();
130}
131
Tom Sepezd7e5cc72015-06-10 14:33:37 -0700132FX_BOOL global_alternate::QueryProperty(const FX_WCHAR* propname)
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700133{
134 return CFX_WideString(propname) != L"setPersistent";
135}
136
Tom Sepezd7e5cc72015-06-10 14:33:37 -0700137FX_BOOL global_alternate::DelProperty(IFXJS_Context* cc, const FX_WCHAR* propname, CFX_WideString& sError)
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700138{
139 js_global_data* pData = NULL;
140 CFX_ByteString sPropName = CFX_ByteString::FromUnicode(propname);
141
Tom Sepezd7e5cc72015-06-10 14:33:37 -0700142 if (m_mapGlobal.Lookup(sPropName, (void*&)pData))
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700143 {
144 pData->bDeleted = TRUE;
145 return TRUE;
146 }
147
148 return FALSE;
149}
150
Tom Sepezd7e5cc72015-06-10 14:33:37 -0700151FX_BOOL global_alternate::DoProperty(IFXJS_Context* cc, const FX_WCHAR* propname, CJS_PropValue& vp, CFX_WideString& sError)
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700152{
153 if (vp.IsSetting())
154 {
155 CFX_ByteString sPropName = CFX_ByteString::FromUnicode(propname);
156 switch (vp.GetType())
157 {
158 case VT_number:
159 {
160 double dData;
161 vp >> dData;
Jochen Eisingerdfa2c992015-05-19 00:38:00 +0200162 return SetGlobalVariables(sPropName, JS_GLOBALDATA_TYPE_NUMBER, dData, false, "", v8::Local<v8::Object>(), FALSE);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700163 }
164 case VT_boolean:
165 {
166 bool bData;
167 vp >> bData;
Jochen Eisingerdfa2c992015-05-19 00:38:00 +0200168 return SetGlobalVariables(sPropName, JS_GLOBALDATA_TYPE_BOOLEAN, 0, bData, "", v8::Local<v8::Object>(), FALSE);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700169 }
170 case VT_string:
171 {
172 CFX_ByteString sData;
173 vp >> sData;
Jochen Eisingerdfa2c992015-05-19 00:38:00 +0200174 return SetGlobalVariables(sPropName, JS_GLOBALDATA_TYPE_STRING, 0, false, sData, v8::Local<v8::Object>(), FALSE);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700175 }
176 case VT_object:
177 {
Tom Sepezf4ef3f92015-04-23 11:31:31 -0700178 JSObject pData;
179 vp >> pData;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700180 return SetGlobalVariables(sPropName, JS_GLOBALDATA_TYPE_OBJECT, 0, false, "", pData, FALSE);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700181 }
182 case VT_null:
183 {
Jochen Eisingerdfa2c992015-05-19 00:38:00 +0200184 return SetGlobalVariables(sPropName, JS_GLOBALDATA_TYPE_NULL, 0, false, "", v8::Local<v8::Object>(), FALSE);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700185 }
186 case VT_undefined:
187 {
188 DelProperty(cc, propname, sError);
189 return TRUE;
190 }
191 default:
192 return FALSE;
193 }
194 }
195 else
196 {
197 js_global_data* pData = NULL;
198 CFX_ByteString sPropName = CFX_ByteString::FromUnicode(propname);
199
Tom Sepezd7e5cc72015-06-10 14:33:37 -0700200 if (m_mapGlobal.Lookup(sPropName, (void*&)pData))
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700201 {
202 if (pData)
203 {
204 if (!pData->bDeleted)
205 {
206 switch (pData->nType)
207 {
208 case JS_GLOBALDATA_TYPE_NUMBER:
209 vp << pData->dData;
210 break;
211 case JS_GLOBALDATA_TYPE_BOOLEAN:
212 vp << pData->bData;
213 break;
214 case JS_GLOBALDATA_TYPE_STRING:
215 vp << pData->sData;
216 break;
217 case JS_GLOBALDATA_TYPE_OBJECT:
218 {
Jochen Eisingerdfa2c992015-05-19 00:38:00 +0200219 v8::Local<v8::Object> obj = v8::Local<v8::Object>::New(vp.GetIsolate(),pData->pData);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700220 vp << obj;
221 break;
222 }
223 case JS_GLOBALDATA_TYPE_NULL:
224 vp.SetNull();
225 break;
226 default:
227 return FALSE;
228 }
229 return TRUE;
230 }
231 else
232 {
233 return TRUE;
234 }
235 }
236 else
237 {
238 vp.SetNull();
239 return TRUE;
240 }
241 }
242 else
243 {
244 vp.SetNull();
245 return TRUE;
246 }
247 }
248
249 return FALSE;
250}
251
Tom Sepez2f3dfef2015-03-02 15:35:26 -0800252FX_BOOL global_alternate::setPersistent(IFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, CFX_WideString& sError)
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700253{
Tom Sepez3a832662015-03-02 12:59:05 -0800254 CJS_Context* pContext = static_cast<CJS_Context*>(cc);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700255 if (params.size() != 2)
256 {
Tom Sepez3a832662015-03-02 12:59:05 -0800257 sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700258 return FALSE;
259 }
260
Tom Sepezf4ef3f92015-04-23 11:31:31 -0700261 CFX_ByteString sName = params[0].ToCFXByteString();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700262
263 js_global_data* pData = NULL;
Tom Sepezd7e5cc72015-06-10 14:33:37 -0700264 if (m_mapGlobal.Lookup(sName, (void*&)pData))
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700265 {
266 if (pData && !pData->bDeleted)
267 {
Tom Sepezf4ef3f92015-04-23 11:31:31 -0700268 pData->bPersistent = params[1].ToBool();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700269 return TRUE;
270 }
271 }
272
Tom Sepez3a832662015-03-02 12:59:05 -0800273 sError = JSGetStringFromID(pContext, IDS_STRING_JSNOGLOBAL);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700274 return FALSE;
275}
276
277void global_alternate::UpdateGlobalPersistentVariables()
278{
279 ASSERT(m_pGlobalData != NULL);
280
281 for (int i=0,sz=m_pGlobalData->GetSize(); i<sz; i++)
282 {
283 CJS_GlobalData_Element* pData = m_pGlobalData->GetAt(i);
284 ASSERT(pData != NULL);
285
286 switch (pData->data.nType)
287 {
288 case JS_GLOBALDATA_TYPE_NUMBER:
Lei Zhang60f507b2015-06-13 00:41:00 -0700289 SetGlobalVariables(pData->data.sKey, JS_GLOBALDATA_TYPE_NUMBER, pData->data.dData, false, "", v8::Local<v8::Object>(), pData->bPersistent == 1);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700290 JS_PutObjectNumber(NULL,(JSFXObject)(*m_pJSObject),
Tom Sepez4f7bc042015-04-27 12:06:58 -0700291 pData->data.sKey.UTF8Decode().c_str(), pData->data.dData);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700292 break;
293 case JS_GLOBALDATA_TYPE_BOOLEAN:
Lei Zhang60f507b2015-06-13 00:41:00 -0700294 SetGlobalVariables(pData->data.sKey, JS_GLOBALDATA_TYPE_BOOLEAN, 0, (bool)(pData->data.bData == 1), "", v8::Local<v8::Object>(), pData->bPersistent == 1);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700295 JS_PutObjectBoolean(NULL,(JSFXObject)(*m_pJSObject),
Tom Sepez4f7bc042015-04-27 12:06:58 -0700296 pData->data.sKey.UTF8Decode().c_str(), (bool)(pData->data.bData == 1));
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700297 break;
298 case JS_GLOBALDATA_TYPE_STRING:
Lei Zhang60f507b2015-06-13 00:41:00 -0700299 SetGlobalVariables(pData->data.sKey, JS_GLOBALDATA_TYPE_STRING, 0, false, pData->data.sData, v8::Local<v8::Object>(), pData->bPersistent == 1);
Tom Sepez4f7bc042015-04-27 12:06:58 -0700300 JS_PutObjectString(NULL, (JSFXObject)(*m_pJSObject),
301 pData->data.sKey.UTF8Decode().c_str(),
302 pData->data.sData.UTF8Decode().c_str());
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700303 break;
304 case JS_GLOBALDATA_TYPE_OBJECT:
305 {
306 IJS_Runtime* pRuntime = JS_GetRuntime((JSFXObject)(*m_pJSObject));
Jochen Eisingerdfa2c992015-05-19 00:38:00 +0200307 v8::Local<v8::Object> pObj = JS_NewFxDynamicObj(pRuntime, NULL, -1);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700308
309 PutObjectProperty(pObj, &pData->data);
310
Lei Zhang60f507b2015-06-13 00:41:00 -0700311 SetGlobalVariables(pData->data.sKey, JS_GLOBALDATA_TYPE_OBJECT, 0, false, "",
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700312 (JSObject)pObj, pData->bPersistent == 1);
313 JS_PutObjectObject(NULL,(JSFXObject)(*m_pJSObject),
Tom Sepez4f7bc042015-04-27 12:06:58 -0700314 pData->data.sKey.UTF8Decode().c_str(), (JSObject)pObj);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700315 }
316 break;
317 case JS_GLOBALDATA_TYPE_NULL:
Lei Zhang60f507b2015-06-13 00:41:00 -0700318 SetGlobalVariables(pData->data.sKey, JS_GLOBALDATA_TYPE_NULL, 0, false, "", v8::Local<v8::Object>(), pData->bPersistent == 1);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700319 JS_PutObjectNull(NULL,(JSFXObject)(*m_pJSObject),
Tom Sepez4f7bc042015-04-27 12:06:58 -0700320 pData->data.sKey.UTF8Decode().c_str());
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700321 break;
322 }
323 }
324}
325
326void global_alternate::CommitGlobalPersisitentVariables()
327{
328 ASSERT(m_pGlobalData != NULL);
329
330 FX_POSITION pos = m_mapGlobal.GetStartPosition();
331 while (pos)
332 {
Lei Zhanga6d9f0e2015-06-13 00:48:38 -0700333 CFX_ByteString name;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700334 js_global_data* pData = NULL;
Tom Sepezd7e5cc72015-06-10 14:33:37 -0700335 m_mapGlobal.GetNextAssoc(pos, name, (void*&)pData);
Lei Zhanga6d9f0e2015-06-13 00:48:38 -0700336
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700337 if (pData)
338 {
339 if (pData->bDeleted)
340 {
341 m_pGlobalData->DeleteGlobalVariable(name);
342 }
343 else
344 {
345 switch (pData->nType)
346 {
347 case JS_GLOBALDATA_TYPE_NUMBER:
348 m_pGlobalData->SetGlobalVariableNumber(name, pData->dData);
349 m_pGlobalData->SetGlobalVariablePersistent(name, pData->bPersistent);
350 break;
351 case JS_GLOBALDATA_TYPE_BOOLEAN:
352 m_pGlobalData->SetGlobalVariableBoolean(name, pData->bData);
353 m_pGlobalData->SetGlobalVariablePersistent(name, pData->bPersistent);
354 break;
355 case JS_GLOBALDATA_TYPE_STRING:
356 m_pGlobalData->SetGlobalVariableString(name, pData->sData);
357 m_pGlobalData->SetGlobalVariablePersistent(name, pData->bPersistent);
358 break;
359 case JS_GLOBALDATA_TYPE_OBJECT:
360 //if (pData->pData)
361 {
362 CJS_GlobalVariableArray array;
Jochen Eisingerdfa2c992015-05-19 00:38:00 +0200363 v8::Local<v8::Object> obj = v8::Local<v8::Object>::New(GetJSObject()->GetIsolate(),pData->pData);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700364 ObjectToArray(obj, array);
365 m_pGlobalData->SetGlobalVariableObject(name, array);
366 m_pGlobalData->SetGlobalVariablePersistent(name, pData->bPersistent);
367 }
368 break;
369 case JS_GLOBALDATA_TYPE_NULL:
370 m_pGlobalData->SetGlobalVariableNull(name);
371 m_pGlobalData->SetGlobalVariablePersistent(name, pData->bPersistent);
372 break;
373 }
374 }
375 }
376 }
377}
378
Jochen Eisingerdfa2c992015-05-19 00:38:00 +0200379void global_alternate::ObjectToArray(v8::Local<v8::Object> pObj, CJS_GlobalVariableArray& array)
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700380{
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700381 v8::Local<v8::Context> context = pObj->CreationContext();
382 v8::Isolate* isolate = context->GetIsolate();
Jochen Eisingerdfa2c992015-05-19 00:38:00 +0200383 v8::Local<v8::Array> pKeyList = JS_GetObjectElementNames(isolate, pObj);
384 int nObjElements = pKeyList->Length();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700385
386 for (int i=0; i<nObjElements; i++)
387 {
Lei Zhanga6d9f0e2015-06-13 00:48:38 -0700388
Jochen Eisingerdfa2c992015-05-19 00:38:00 +0200389 CFX_WideString ws = JS_ToString(isolate, JS_GetArrayElement(isolate, pKeyList, i));
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700390 CFX_ByteString sKey = ws.UTF8Encode();
391
Jochen Eisingerdfa2c992015-05-19 00:38:00 +0200392 v8::Local<v8::Value> v = JS_GetObjectElement(isolate, pObj, ws.c_str());
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700393 FXJSVALUETYPE vt = GET_VALUE_TYPE(v);
394 switch (vt)
395 {
396 case VT_number:
397 {
398 CJS_KeyValue* pObjElement = new CJS_KeyValue;
399 pObjElement->nType = JS_GLOBALDATA_TYPE_NUMBER;
400 pObjElement->sKey = sKey;
Jochen Eisingerdfa2c992015-05-19 00:38:00 +0200401 pObjElement->dData = JS_ToNumber(isolate, v);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700402 array.Add(pObjElement);
403 }
404 break;
405 case VT_boolean:
406 {
407 CJS_KeyValue* pObjElement = new CJS_KeyValue;
408 pObjElement->nType = JS_GLOBALDATA_TYPE_BOOLEAN;
409 pObjElement->sKey = sKey;
Jochen Eisingerdfa2c992015-05-19 00:38:00 +0200410 pObjElement->dData = JS_ToBoolean(isolate, v);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700411 array.Add(pObjElement);
412 }
413 break;
414 case VT_string:
415 {
Tom Sepezf4ef3f92015-04-23 11:31:31 -0700416 CFX_ByteString sValue = CJS_Value(isolate, v, VT_string).ToCFXByteString();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700417 CJS_KeyValue* pObjElement = new CJS_KeyValue;
418 pObjElement->nType = JS_GLOBALDATA_TYPE_STRING;
419 pObjElement->sKey = sKey;
420 pObjElement->sData = sValue;
421 array.Add(pObjElement);
422 }
423 break;
424 case VT_object:
425 {
426 CJS_KeyValue* pObjElement = new CJS_KeyValue;
427 pObjElement->nType = JS_GLOBALDATA_TYPE_OBJECT;
428 pObjElement->sKey = sKey;
Jochen Eisingerdfa2c992015-05-19 00:38:00 +0200429 ObjectToArray(JS_ToObject(isolate, v), pObjElement->objData);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700430 array.Add(pObjElement);
431 }
432 break;
433 case VT_null:
434 {
435 CJS_KeyValue* pObjElement = new CJS_KeyValue;
436 pObjElement->nType = JS_GLOBALDATA_TYPE_NULL;
437 pObjElement->sKey = sKey;
438 array.Add(pObjElement);
439 }
440 break;
441 default:
442 break;
443 }
444 }
445}
446
Jochen Eisingerdfa2c992015-05-19 00:38:00 +0200447void global_alternate::PutObjectProperty(v8::Local<v8::Object> pObj, CJS_KeyValue* pData)
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700448{
449 ASSERT(pData != NULL);
450
451 for (int i=0,sz=pData->objData.Count(); i<sz; i++)
452 {
453 CJS_KeyValue* pObjData = pData->objData.GetAt(i);
454 ASSERT(pObjData != NULL);
455
456 switch (pObjData->nType)
457 {
458 case JS_GLOBALDATA_TYPE_NUMBER:
Tom Sepez4f7bc042015-04-27 12:06:58 -0700459 JS_PutObjectNumber(NULL,(JSObject)pObj, pObjData->sKey.UTF8Decode().c_str(), pObjData->dData);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700460 break;
461 case JS_GLOBALDATA_TYPE_BOOLEAN:
Tom Sepez4f7bc042015-04-27 12:06:58 -0700462 JS_PutObjectBoolean(NULL,(JSObject)pObj, pObjData->sKey.UTF8Decode().c_str(), (bool)(pObjData->bData == 1));
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700463 break;
464 case JS_GLOBALDATA_TYPE_STRING:
Tom Sepez4f7bc042015-04-27 12:06:58 -0700465 JS_PutObjectString(NULL,(JSObject)pObj, pObjData->sKey.UTF8Decode().c_str(), pObjData->sData.UTF8Decode().c_str());
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700466 break;
467 case JS_GLOBALDATA_TYPE_OBJECT:
468 {
469 IJS_Runtime* pRuntime = JS_GetRuntime((JSFXObject)(*m_pJSObject));
Jochen Eisingerdfa2c992015-05-19 00:38:00 +0200470 v8::Local<v8::Object> pNewObj = JS_NewFxDynamicObj(pRuntime, NULL, -1);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700471 PutObjectProperty(pNewObj, pObjData);
Tom Sepez4f7bc042015-04-27 12:06:58 -0700472 JS_PutObjectObject(NULL, (JSObject)pObj, pObjData->sKey.UTF8Decode().c_str(), (JSObject)pNewObj);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700473 }
474 break;
475 case JS_GLOBALDATA_TYPE_NULL:
Tom Sepez4f7bc042015-04-27 12:06:58 -0700476 JS_PutObjectNull(NULL,(JSObject)pObj, pObjData->sKey.UTF8Decode().c_str());
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700477 break;
478 }
479 }
480}
481
482void global_alternate::DestroyGlobalPersisitentVariables()
483{
484 FX_POSITION pos = m_mapGlobal.GetStartPosition();
485 while (pos)
486 {
Lei Zhanga6d9f0e2015-06-13 00:48:38 -0700487 CFX_ByteString name;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700488 js_global_data* pData = NULL;
Tom Sepezd7e5cc72015-06-10 14:33:37 -0700489 m_mapGlobal.GetNextAssoc(pos, name, (void*&)pData);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700490 delete pData;
491 }
492
493 m_mapGlobal.RemoveAll();
494}
495
496
Lei Zhanga6d9f0e2015-06-13 00:48:38 -0700497FX_BOOL global_alternate::SetGlobalVariables(const FX_CHAR* propname, int nType,
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700498 double dData, bool bData, const CFX_ByteString& sData, JSObject pData, bool bDefaultPersistent)
499{
500 if (propname == NULL) return FALSE;
501
502 js_global_data* pTemp = NULL;
Tom Sepezd7e5cc72015-06-10 14:33:37 -0700503 m_mapGlobal.Lookup(propname, (void*&)pTemp);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700504
505 if (pTemp)
506 {
507 if (pTemp->bDeleted || pTemp->nType != nType)
508 {
509 pTemp->dData = 0;
510 pTemp->bData = 0;
511 pTemp->sData = "";
512 pTemp->nType = nType;
513 }
514
515 pTemp->bDeleted = FALSE;
516
517 switch (nType)
518 {
519 case JS_GLOBALDATA_TYPE_NUMBER:
520 {
521 pTemp->dData = dData;
522 }
523 break;
524 case JS_GLOBALDATA_TYPE_BOOLEAN:
525 {
526 pTemp->bData = bData;
527 }
528 break;
529 case JS_GLOBALDATA_TYPE_STRING:
530 {
531 pTemp->sData = sData;
532 }
533 break;
534 case JS_GLOBALDATA_TYPE_OBJECT:
535 {
536 pTemp->pData.Reset(JS_GetRuntime(pData), pData);
537 }
538 break;
539 case JS_GLOBALDATA_TYPE_NULL:
540 break;
541 default:
542 return FALSE;
Lei Zhanga6d9f0e2015-06-13 00:48:38 -0700543 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700544
545 return TRUE;
546 }
547
548 js_global_data* pNewData = NULL;
549
550 switch (nType)
551 {
552 case JS_GLOBALDATA_TYPE_NUMBER:
553 {
554 pNewData = new js_global_data;
555 pNewData->nType = JS_GLOBALDATA_TYPE_NUMBER;
556 pNewData->dData = dData;
557 pNewData->bPersistent = bDefaultPersistent;
558 }
559 break;
560 case JS_GLOBALDATA_TYPE_BOOLEAN:
561 {
562 pNewData = new js_global_data;
563 pNewData->nType = JS_GLOBALDATA_TYPE_BOOLEAN;
564 pNewData->bData = bData;
565 pNewData->bPersistent = bDefaultPersistent;
566 }
567 break;
568 case JS_GLOBALDATA_TYPE_STRING:
569 {
570 pNewData = new js_global_data;
571 pNewData->nType = JS_GLOBALDATA_TYPE_STRING;
572 pNewData->sData = sData;
573 pNewData->bPersistent = bDefaultPersistent;
574 }
575 break;
576 case JS_GLOBALDATA_TYPE_OBJECT:
577 {
578 pNewData = new js_global_data;
579 pNewData->nType = JS_GLOBALDATA_TYPE_OBJECT;
580 pNewData->pData.Reset(JS_GetRuntime(pData), pData);
581 pNewData->bPersistent = bDefaultPersistent;
582 }
583 break;
584 case JS_GLOBALDATA_TYPE_NULL:
585 {
586 pNewData = new js_global_data;
587 pNewData->nType = JS_GLOBALDATA_TYPE_NULL;
588 pNewData->bPersistent = bDefaultPersistent;
589 }
590 break;
591 default:
592 return FALSE;
Lei Zhanga6d9f0e2015-06-13 00:48:38 -0700593 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700594
Tom Sepezd7e5cc72015-06-10 14:33:37 -0700595 m_mapGlobal.SetAt(propname, (void*)pNewData);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700596
597 return TRUE;
598}
Tom Sepezccc94832015-02-17 13:30:23 -0800599
Jochen Eisingerdfa2c992015-05-19 00:38:00 +0200600FXJSVALUETYPE GET_VALUE_TYPE(v8::Local<v8::Value> p)
Tom Sepezccc94832015-02-17 13:30:23 -0800601{
602 const unsigned int nHash = JS_CalcHash(JS_GetTypeof(p));
603
604 if (nHash == JSCONST_nUndefHash)
605 return VT_undefined;
606 if (nHash == JSCONST_nNullHash)
607 return VT_null;
608 if (nHash == JSCONST_nStringHash)
609 return VT_string;
610 if (nHash == JSCONST_nNumberHash)
611 return VT_number;
612 if (nHash == JSCONST_nBoolHash)
613 return VT_boolean;
614 if (nHash == JSCONST_nDateHash)
615 return VT_date;
616 if (nHash == JSCONST_nObjectHash)
617 return VT_object;
618 if (nHash == JSCONST_nFXobjHash)
619 return VT_fxobject;
620
621 return VT_unknown;
622}
623