blob: 45e2bd0a905ca0107da3e8d00c3c84373f7df7fa [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
Dan Sinclairf766ad22016-03-14 13:51:24 -04007#include "fpdfsdk/javascript/global.h"
Tom Sepez37458412015-10-06 11:33:46 -07008
Dan Sinclair3ebd1212016-03-09 09:59:23 -05009#include <vector>
10
Dan Sinclaira8a28e02016-03-23 15:41:39 -040011#include "core/fxcrt/include/fx_ext.h"
Dan Sinclairf766ad22016-03-14 13:51:24 -040012#include "fpdfsdk/javascript/JS_Define.h"
13#include "fpdfsdk/javascript/JS_EventHandler.h"
14#include "fpdfsdk/javascript/JS_GlobalData.h"
15#include "fpdfsdk/javascript/JS_Object.h"
16#include "fpdfsdk/javascript/JS_Value.h"
dsinclair64376be2016-03-31 20:03:24 -070017#include "fpdfsdk/javascript/cjs_context.h"
Dan Sinclairf766ad22016-03-14 13:51:24 -040018#include "fpdfsdk/javascript/resource.h"
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070019
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070020BEGIN_JS_STATIC_CONST(CJS_Global)
21END_JS_STATIC_CONST()
22
23BEGIN_JS_STATIC_PROP(CJS_Global)
24END_JS_STATIC_PROP()
25
26BEGIN_JS_STATIC_METHOD(CJS_Global)
Nico Weber9d8ec5a2015-08-04 13:00:21 -070027JS_STATIC_METHOD_ENTRY(setPersistent)
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070028END_JS_STATIC_METHOD()
29
Tom Sepez7dc5cc12015-08-17 12:15:26 -070030IMPLEMENT_SPECIAL_JS_CLASS(CJS_Global, JSGlobalAlternate, global);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070031
Tom Sepez33420902015-10-13 15:00:10 -070032void CJS_Global::InitInstance(IJS_Runtime* pIRuntime) {
33 CJS_Runtime* pRuntime = static_cast<CJS_Runtime*>(pIRuntime);
34 JSGlobalAlternate* pGlobal =
35 static_cast<JSGlobalAlternate*>(GetEmbedObject());
36 pGlobal->Initial(pRuntime->GetReaderApp());
37}
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070038
weili625ad662016-06-15 11:21:33 -070039JSGlobalData::JSGlobalData()
40 : nType(0),
41 dData(0),
42 bData(FALSE),
43 sData(""),
44 bPersistent(FALSE),
45 bDeleted(FALSE) {}
46
47JSGlobalData::~JSGlobalData() {
48 pData.Reset();
49}
50
Tom Sepez7dc5cc12015-08-17 12:15:26 -070051JSGlobalAlternate::JSGlobalAlternate(CJS_Object* pJSObject)
thestig1cd352e2016-06-07 17:53:06 -070052 : CJS_EmbedObj(pJSObject), m_pApp(nullptr) {}
Nico Weber9d8ec5a2015-08-04 13:00:21 -070053
Tom Sepez7dc5cc12015-08-17 12:15:26 -070054JSGlobalAlternate::~JSGlobalAlternate() {
Nico Weber9d8ec5a2015-08-04 13:00:21 -070055 DestroyGlobalPersisitentVariables();
Tom Sepezf4583622015-09-14 15:06:53 -070056 m_pGlobalData->Release();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070057}
58
Tom Sepez7dc5cc12015-08-17 12:15:26 -070059void JSGlobalAlternate::Initial(CPDFDoc_Environment* pApp) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -070060 m_pApp = pApp;
Tom Sepezf4583622015-09-14 15:06:53 -070061 m_pGlobalData = CJS_GlobalData::GetRetainedInstance(pApp);
Nico Weber9d8ec5a2015-08-04 13:00:21 -070062 UpdateGlobalPersistentVariables();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070063}
Tom Sepezbdeeb8a2015-05-27 12:25:00 -070064
Tom Sepez7dc5cc12015-08-17 12:15:26 -070065FX_BOOL JSGlobalAlternate::QueryProperty(const FX_WCHAR* propname) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -070066 return CFX_WideString(propname) != L"setPersistent";
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070067}
68
Tom Sepezba038bc2015-10-08 12:03:00 -070069FX_BOOL JSGlobalAlternate::DelProperty(IJS_Context* cc,
Tom Sepez7dc5cc12015-08-17 12:15:26 -070070 const FX_WCHAR* propname,
71 CFX_WideString& sError) {
Tom Sepez09d33bc2015-08-19 09:49:24 -070072 auto it = m_mapGlobal.find(CFX_ByteString::FromUnicode(propname));
73 if (it == m_mapGlobal.end())
74 return FALSE;
Nico Weber9d8ec5a2015-08-04 13:00:21 -070075
Tom Sepez09d33bc2015-08-19 09:49:24 -070076 it->second->bDeleted = TRUE;
77 return TRUE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070078}
79
Tom Sepezba038bc2015-10-08 12:03:00 -070080FX_BOOL JSGlobalAlternate::DoProperty(IJS_Context* cc,
Tom Sepez7dc5cc12015-08-17 12:15:26 -070081 const FX_WCHAR* propname,
82 CJS_PropValue& vp,
83 CFX_WideString& sError) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -070084 if (vp.IsSetting()) {
Tom Sepez2f2ffec2015-07-23 14:42:09 -070085 CFX_ByteString sPropName = CFX_ByteString::FromUnicode(propname);
Nico Weber9d8ec5a2015-08-04 13:00:21 -070086 switch (vp.GetType()) {
Tom Sepez39bfe122015-09-17 15:25:23 -070087 case CJS_Value::VT_number: {
Nico Weber9d8ec5a2015-08-04 13:00:21 -070088 double dData;
89 vp >> dData;
90 return SetGlobalVariables(sPropName, JS_GLOBALDATA_TYPE_NUMBER, dData,
91 false, "", v8::Local<v8::Object>(), FALSE);
92 }
Tom Sepez39bfe122015-09-17 15:25:23 -070093 case CJS_Value::VT_boolean: {
Nico Weber9d8ec5a2015-08-04 13:00:21 -070094 bool bData;
95 vp >> bData;
96 return SetGlobalVariables(sPropName, JS_GLOBALDATA_TYPE_BOOLEAN, 0,
97 bData, "", v8::Local<v8::Object>(), FALSE);
98 }
Tom Sepez39bfe122015-09-17 15:25:23 -070099 case CJS_Value::VT_string: {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700100 CFX_ByteString sData;
101 vp >> sData;
102 return SetGlobalVariables(sPropName, JS_GLOBALDATA_TYPE_STRING, 0,
103 false, sData, v8::Local<v8::Object>(), FALSE);
104 }
Tom Sepez39bfe122015-09-17 15:25:23 -0700105 case CJS_Value::VT_object: {
Tom Sepez808a99e2015-09-10 12:28:37 -0700106 v8::Local<v8::Object> pData;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700107 vp >> pData;
108 return SetGlobalVariables(sPropName, JS_GLOBALDATA_TYPE_OBJECT, 0,
109 false, "", pData, FALSE);
110 }
Tom Sepez39bfe122015-09-17 15:25:23 -0700111 case CJS_Value::VT_null: {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700112 return SetGlobalVariables(sPropName, JS_GLOBALDATA_TYPE_NULL, 0, false,
113 "", v8::Local<v8::Object>(), FALSE);
114 }
Tom Sepez39bfe122015-09-17 15:25:23 -0700115 case CJS_Value::VT_undefined: {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700116 DelProperty(cc, propname, sError);
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700117 return TRUE;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700118 }
119 default:
120 break;
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700121 }
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700122 } else {
Tom Sepez09d33bc2015-08-19 09:49:24 -0700123 auto it = m_mapGlobal.find(CFX_ByteString::FromUnicode(propname));
124 if (it == m_mapGlobal.end()) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700125 vp.SetNull();
126 return TRUE;
127 }
Tom Sepez09d33bc2015-08-19 09:49:24 -0700128 JSGlobalData* pData = it->second;
129 if (pData->bDeleted) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700130 vp.SetNull();
131 return TRUE;
132 }
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700133 switch (pData->nType) {
134 case JS_GLOBALDATA_TYPE_NUMBER:
135 vp << pData->dData;
136 return TRUE;
137 case JS_GLOBALDATA_TYPE_BOOLEAN:
138 vp << pData->bData;
139 return TRUE;
140 case JS_GLOBALDATA_TYPE_STRING:
141 vp << pData->sData;
142 return TRUE;
143 case JS_GLOBALDATA_TYPE_OBJECT: {
Tom Sepez67fd5df2015-10-08 12:24:19 -0700144 v8::Local<v8::Object> obj = v8::Local<v8::Object>::New(
145 vp.GetJSRuntime()->GetIsolate(), pData->pData);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700146 vp << obj;
147 return TRUE;
148 }
149 case JS_GLOBALDATA_TYPE_NULL:
150 vp.SetNull();
151 return TRUE;
152 default:
153 break;
154 }
155 }
156 return FALSE;
157}
158
Tom Sepezba038bc2015-10-08 12:03:00 -0700159FX_BOOL JSGlobalAlternate::setPersistent(IJS_Context* cc,
Lei Zhang945fdb72015-11-11 10:18:16 -0800160 const std::vector<CJS_Value>& params,
Tom Sepez7dc5cc12015-08-17 12:15:26 -0700161 CJS_Value& vRet,
162 CFX_WideString& sError) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700163 CJS_Context* pContext = static_cast<CJS_Context*>(cc);
164 if (params.size() != 2) {
165 sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700166 return FALSE;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700167 }
168
Tom Sepez09d33bc2015-08-19 09:49:24 -0700169 auto it = m_mapGlobal.find(params[0].ToCFXByteString());
170 if (it != m_mapGlobal.end()) {
171 JSGlobalData* pData = it->second;
172 if (!pData->bDeleted) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700173 pData->bPersistent = params[1].ToBool();
174 return TRUE;
175 }
176 }
177
178 sError = JSGetStringFromID(pContext, IDS_STRING_JSNOGLOBAL);
179 return FALSE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700180}
181
Tom Sepez7dc5cc12015-08-17 12:15:26 -0700182void JSGlobalAlternate::UpdateGlobalPersistentVariables() {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700183 for (int i = 0, sz = m_pGlobalData->GetSize(); i < sz; i++) {
184 CJS_GlobalData_Element* pData = m_pGlobalData->GetAt(i);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700185 switch (pData->data.nType) {
186 case JS_GLOBALDATA_TYPE_NUMBER:
187 SetGlobalVariables(pData->data.sKey, JS_GLOBALDATA_TYPE_NUMBER,
188 pData->data.dData, false, "",
189 v8::Local<v8::Object>(), pData->bPersistent == 1);
thestig1cd352e2016-06-07 17:53:06 -0700190 FXJS_PutObjectNumber(nullptr, m_pJSObject->ToV8Object(),
tsepez018935c2016-04-15 13:15:12 -0700191 pData->data.sKey.UTF8Decode(), pData->data.dData);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700192 break;
193 case JS_GLOBALDATA_TYPE_BOOLEAN:
194 SetGlobalVariables(pData->data.sKey, JS_GLOBALDATA_TYPE_BOOLEAN, 0,
195 (bool)(pData->data.bData == 1), "",
196 v8::Local<v8::Object>(), pData->bPersistent == 1);
thestig1cd352e2016-06-07 17:53:06 -0700197 FXJS_PutObjectBoolean(nullptr, m_pJSObject->ToV8Object(),
tsepez018935c2016-04-15 13:15:12 -0700198 pData->data.sKey.UTF8Decode(),
Tom Sepez39bfe122015-09-17 15:25:23 -0700199 (bool)(pData->data.bData == 1));
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700200 break;
201 case JS_GLOBALDATA_TYPE_STRING:
202 SetGlobalVariables(pData->data.sKey, JS_GLOBALDATA_TYPE_STRING, 0,
203 false, pData->data.sData, v8::Local<v8::Object>(),
204 pData->bPersistent == 1);
thestig1cd352e2016-06-07 17:53:06 -0700205 FXJS_PutObjectString(nullptr, m_pJSObject->ToV8Object(),
tsepez018935c2016-04-15 13:15:12 -0700206 pData->data.sKey.UTF8Decode(),
207 pData->data.sData.UTF8Decode());
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700208 break;
209 case JS_GLOBALDATA_TYPE_OBJECT: {
Tom Sepez371379d2015-11-06 08:29:39 -0800210 v8::Isolate* pRuntime = m_pJSObject->ToV8Object()->GetIsolate();
thestig1cd352e2016-06-07 17:53:06 -0700211 v8::Local<v8::Object> pObj =
212 FXJS_NewFxDynamicObj(pRuntime, nullptr, -1);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700213
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700214 PutObjectProperty(pObj, &pData->data);
215
216 SetGlobalVariables(pData->data.sKey, JS_GLOBALDATA_TYPE_OBJECT, 0,
Tom Sepez116e4ad2015-09-21 09:22:05 -0700217 false, "", pObj, pData->bPersistent == 1);
thestig1cd352e2016-06-07 17:53:06 -0700218 FXJS_PutObjectObject(nullptr, m_pJSObject->ToV8Object(),
tsepez018935c2016-04-15 13:15:12 -0700219 pData->data.sKey.UTF8Decode(), pObj);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700220 } break;
221 case JS_GLOBALDATA_TYPE_NULL:
222 SetGlobalVariables(pData->data.sKey, JS_GLOBALDATA_TYPE_NULL, 0, false,
223 "", v8::Local<v8::Object>(),
224 pData->bPersistent == 1);
thestig1cd352e2016-06-07 17:53:06 -0700225 FXJS_PutObjectNull(nullptr, m_pJSObject->ToV8Object(),
tsepez018935c2016-04-15 13:15:12 -0700226 pData->data.sKey.UTF8Decode());
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700227 break;
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700228 }
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700229 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700230}
231
Tom Sepez67fd5df2015-10-08 12:24:19 -0700232void JSGlobalAlternate::CommitGlobalPersisitentVariables(IJS_Context* cc) {
Tom Sepez09d33bc2015-08-19 09:49:24 -0700233 for (auto it = m_mapGlobal.begin(); it != m_mapGlobal.end(); ++it) {
234 CFX_ByteString name = it->first;
235 JSGlobalData* pData = it->second;
236 if (pData->bDeleted) {
237 m_pGlobalData->DeleteGlobalVariable(name);
238 } else {
239 switch (pData->nType) {
240 case JS_GLOBALDATA_TYPE_NUMBER:
241 m_pGlobalData->SetGlobalVariableNumber(name, pData->dData);
242 m_pGlobalData->SetGlobalVariablePersistent(name, pData->bPersistent);
243 break;
244 case JS_GLOBALDATA_TYPE_BOOLEAN:
245 m_pGlobalData->SetGlobalVariableBoolean(name, pData->bData);
246 m_pGlobalData->SetGlobalVariablePersistent(name, pData->bPersistent);
247 break;
248 case JS_GLOBALDATA_TYPE_STRING:
249 m_pGlobalData->SetGlobalVariableString(name, pData->sData);
250 m_pGlobalData->SetGlobalVariablePersistent(name, pData->bPersistent);
251 break;
Dan Sinclairf766ad22016-03-14 13:51:24 -0400252 case JS_GLOBALDATA_TYPE_OBJECT: {
253 CJS_GlobalVariableArray array;
254 v8::Local<v8::Object> obj = v8::Local<v8::Object>::New(
255 GetJSObject()->GetIsolate(), pData->pData);
256 ObjectToArray(cc, obj, array);
257 m_pGlobalData->SetGlobalVariableObject(name, array);
258 m_pGlobalData->SetGlobalVariablePersistent(name, pData->bPersistent);
259 } break;
Tom Sepez09d33bc2015-08-19 09:49:24 -0700260 case JS_GLOBALDATA_TYPE_NULL:
261 m_pGlobalData->SetGlobalVariableNull(name);
262 m_pGlobalData->SetGlobalVariablePersistent(name, pData->bPersistent);
263 break;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700264 }
265 }
266 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700267}
268
Tom Sepez67fd5df2015-10-08 12:24:19 -0700269void JSGlobalAlternate::ObjectToArray(IJS_Context* cc,
270 v8::Local<v8::Object> pObj,
Tom Sepez7dc5cc12015-08-17 12:15:26 -0700271 CJS_GlobalVariableArray& array) {
Tom Sepez371379d2015-11-06 08:29:39 -0800272 v8::Isolate* isolate = pObj->GetIsolate();
Tom Sepez67fd5df2015-10-08 12:24:19 -0700273 CJS_Runtime* pRuntime = CJS_Runtime::FromContext(cc);
274
Tom Sepez39bfe122015-09-17 15:25:23 -0700275 v8::Local<v8::Array> pKeyList = FXJS_GetObjectElementNames(isolate, pObj);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700276 int nObjElements = pKeyList->Length();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700277 for (int i = 0; i < nObjElements; i++) {
278 CFX_WideString ws =
Tom Sepez39bfe122015-09-17 15:25:23 -0700279 FXJS_ToString(isolate, FXJS_GetArrayElement(isolate, pKeyList, i));
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700280 CFX_ByteString sKey = ws.UTF8Encode();
tsepez018935c2016-04-15 13:15:12 -0700281 v8::Local<v8::Value> v = FXJS_GetObjectElement(isolate, pObj, ws);
tsepez40faa792016-07-15 17:58:02 -0700282 switch (CJS_Value::GetValueType(v)) {
Tom Sepez39bfe122015-09-17 15:25:23 -0700283 case CJS_Value::VT_number: {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700284 CJS_KeyValue* pObjElement = new CJS_KeyValue;
285 pObjElement->nType = JS_GLOBALDATA_TYPE_NUMBER;
286 pObjElement->sKey = sKey;
Tom Sepez39bfe122015-09-17 15:25:23 -0700287 pObjElement->dData = FXJS_ToNumber(isolate, v);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700288 array.Add(pObjElement);
289 } break;
Tom Sepez39bfe122015-09-17 15:25:23 -0700290 case CJS_Value::VT_boolean: {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700291 CJS_KeyValue* pObjElement = new CJS_KeyValue;
292 pObjElement->nType = JS_GLOBALDATA_TYPE_BOOLEAN;
293 pObjElement->sKey = sKey;
Tom Sepez39bfe122015-09-17 15:25:23 -0700294 pObjElement->dData = FXJS_ToBoolean(isolate, v);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700295 array.Add(pObjElement);
296 } break;
Tom Sepez39bfe122015-09-17 15:25:23 -0700297 case CJS_Value::VT_string: {
tsepez40faa792016-07-15 17:58:02 -0700298 CFX_ByteString sValue = CJS_Value(pRuntime, v).ToCFXByteString();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700299 CJS_KeyValue* pObjElement = new CJS_KeyValue;
300 pObjElement->nType = JS_GLOBALDATA_TYPE_STRING;
301 pObjElement->sKey = sKey;
302 pObjElement->sData = sValue;
303 array.Add(pObjElement);
304 } break;
Tom Sepez39bfe122015-09-17 15:25:23 -0700305 case CJS_Value::VT_object: {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700306 CJS_KeyValue* pObjElement = new CJS_KeyValue;
307 pObjElement->nType = JS_GLOBALDATA_TYPE_OBJECT;
308 pObjElement->sKey = sKey;
Tom Sepez67fd5df2015-10-08 12:24:19 -0700309 ObjectToArray(cc, FXJS_ToObject(isolate, v), pObjElement->objData);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700310 array.Add(pObjElement);
311 } break;
Tom Sepez39bfe122015-09-17 15:25:23 -0700312 case CJS_Value::VT_null: {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700313 CJS_KeyValue* pObjElement = new CJS_KeyValue;
314 pObjElement->nType = JS_GLOBALDATA_TYPE_NULL;
315 pObjElement->sKey = sKey;
316 array.Add(pObjElement);
317 } break;
318 default:
319 break;
320 }
321 }
322}
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700323
Tom Sepez7dc5cc12015-08-17 12:15:26 -0700324void JSGlobalAlternate::PutObjectProperty(v8::Local<v8::Object> pObj,
325 CJS_KeyValue* pData) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700326 for (int i = 0, sz = pData->objData.Count(); i < sz; i++) {
327 CJS_KeyValue* pObjData = pData->objData.GetAt(i);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700328 switch (pObjData->nType) {
329 case JS_GLOBALDATA_TYPE_NUMBER:
thestig1cd352e2016-06-07 17:53:06 -0700330 FXJS_PutObjectNumber(nullptr, pObj, pObjData->sKey.UTF8Decode(),
Tom Sepez39bfe122015-09-17 15:25:23 -0700331 pObjData->dData);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700332 break;
333 case JS_GLOBALDATA_TYPE_BOOLEAN:
thestig1cd352e2016-06-07 17:53:06 -0700334 FXJS_PutObjectBoolean(nullptr, pObj, pObjData->sKey.UTF8Decode(),
Tom Sepez116e4ad2015-09-21 09:22:05 -0700335 pObjData->bData == 1);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700336 break;
337 case JS_GLOBALDATA_TYPE_STRING:
thestig1cd352e2016-06-07 17:53:06 -0700338 FXJS_PutObjectString(nullptr, pObj, pObjData->sKey.UTF8Decode(),
tsepez018935c2016-04-15 13:15:12 -0700339 pObjData->sData.UTF8Decode());
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700340 break;
341 case JS_GLOBALDATA_TYPE_OBJECT: {
Tom Sepez371379d2015-11-06 08:29:39 -0800342 v8::Isolate* pRuntime = m_pJSObject->ToV8Object()->GetIsolate();
Tom Sepez39bfe122015-09-17 15:25:23 -0700343 v8::Local<v8::Object> pNewObj =
thestig1cd352e2016-06-07 17:53:06 -0700344 FXJS_NewFxDynamicObj(pRuntime, nullptr, -1);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700345 PutObjectProperty(pNewObj, pObjData);
thestig1cd352e2016-06-07 17:53:06 -0700346 FXJS_PutObjectObject(nullptr, pObj, pObjData->sKey.UTF8Decode(),
347 pNewObj);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700348 } break;
349 case JS_GLOBALDATA_TYPE_NULL:
thestig1cd352e2016-06-07 17:53:06 -0700350 FXJS_PutObjectNull(nullptr, pObj, pObjData->sKey.UTF8Decode());
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700351 break;
352 }
353 }
354}
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700355
Tom Sepez7dc5cc12015-08-17 12:15:26 -0700356void JSGlobalAlternate::DestroyGlobalPersisitentVariables() {
Tom Sepez09d33bc2015-08-19 09:49:24 -0700357 for (const auto& pair : m_mapGlobal) {
358 delete pair.second;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700359 }
Tom Sepez09d33bc2015-08-19 09:49:24 -0700360 m_mapGlobal.clear();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700361}
362
tsepez24a48882016-04-11 15:18:40 -0700363FX_BOOL JSGlobalAlternate::SetGlobalVariables(const CFX_ByteString& propname,
Tom Sepez7dc5cc12015-08-17 12:15:26 -0700364 int nType,
365 double dData,
366 bool bData,
367 const CFX_ByteString& sData,
Tom Sepez808a99e2015-09-10 12:28:37 -0700368 v8::Local<v8::Object> pData,
Tom Sepez7dc5cc12015-08-17 12:15:26 -0700369 bool bDefaultPersistent) {
tsepezb4c9f3f2016-04-13 15:41:21 -0700370 if (propname.IsEmpty())
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700371 return FALSE;
372
Tom Sepez09d33bc2015-08-19 09:49:24 -0700373 auto it = m_mapGlobal.find(propname);
374 if (it != m_mapGlobal.end()) {
375 JSGlobalData* pTemp = it->second;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700376 if (pTemp->bDeleted || pTemp->nType != nType) {
377 pTemp->dData = 0;
378 pTemp->bData = 0;
379 pTemp->sData = "";
380 pTemp->nType = nType;
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700381 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700382
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700383 pTemp->bDeleted = FALSE;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700384 switch (nType) {
385 case JS_GLOBALDATA_TYPE_NUMBER: {
386 pTemp->dData = dData;
387 } break;
388 case JS_GLOBALDATA_TYPE_BOOLEAN: {
389 pTemp->bData = bData;
390 } break;
391 case JS_GLOBALDATA_TYPE_STRING: {
392 pTemp->sData = sData;
393 } break;
394 case JS_GLOBALDATA_TYPE_OBJECT: {
Tom Sepez371379d2015-11-06 08:29:39 -0800395 pTemp->pData.Reset(pData->GetIsolate(), pData);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700396 } break;
397 case JS_GLOBALDATA_TYPE_NULL:
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700398 break;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700399 default:
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700400 return FALSE;
401 }
Tom Sepez2f2ffec2015-07-23 14:42:09 -0700402 return TRUE;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700403 }
404
thestig1cd352e2016-06-07 17:53:06 -0700405 JSGlobalData* pNewData = nullptr;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700406
407 switch (nType) {
408 case JS_GLOBALDATA_TYPE_NUMBER: {
Tom Sepez7dc5cc12015-08-17 12:15:26 -0700409 pNewData = new JSGlobalData;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700410 pNewData->nType = JS_GLOBALDATA_TYPE_NUMBER;
411 pNewData->dData = dData;
412 pNewData->bPersistent = bDefaultPersistent;
413 } break;
414 case JS_GLOBALDATA_TYPE_BOOLEAN: {
Tom Sepez7dc5cc12015-08-17 12:15:26 -0700415 pNewData = new JSGlobalData;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700416 pNewData->nType = JS_GLOBALDATA_TYPE_BOOLEAN;
417 pNewData->bData = bData;
418 pNewData->bPersistent = bDefaultPersistent;
419 } break;
420 case JS_GLOBALDATA_TYPE_STRING: {
Tom Sepez7dc5cc12015-08-17 12:15:26 -0700421 pNewData = new JSGlobalData;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700422 pNewData->nType = JS_GLOBALDATA_TYPE_STRING;
423 pNewData->sData = sData;
424 pNewData->bPersistent = bDefaultPersistent;
425 } break;
426 case JS_GLOBALDATA_TYPE_OBJECT: {
Tom Sepez7dc5cc12015-08-17 12:15:26 -0700427 pNewData = new JSGlobalData;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700428 pNewData->nType = JS_GLOBALDATA_TYPE_OBJECT;
Tom Sepez371379d2015-11-06 08:29:39 -0800429 pNewData->pData.Reset(pData->GetIsolate(), pData);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700430 pNewData->bPersistent = bDefaultPersistent;
431 } break;
432 case JS_GLOBALDATA_TYPE_NULL: {
Tom Sepez7dc5cc12015-08-17 12:15:26 -0700433 pNewData = new JSGlobalData;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700434 pNewData->nType = JS_GLOBALDATA_TYPE_NULL;
435 pNewData->bPersistent = bDefaultPersistent;
436 } break;
437 default:
438 return FALSE;
439 }
440
Tom Sepez09d33bc2015-08-19 09:49:24 -0700441 m_mapGlobal[propname] = pNewData;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700442 return TRUE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700443}