Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(85)

Side by Side Diff: fpdfsdk/src/javascript/global.cpp

Issue 1265503005: clang-format all pdfium code. (Closed) Base URL: https://pdfium.googlesource.com/pdfium.git@master
Patch Set: sigh Created 5 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698