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 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
118 UpdateGlobalPersistentVariables(); | 118 UpdateGlobalPersistentVariables(); |
119 } | 119 } |
120 | 120 |
121 FX_BOOL JSGlobalAlternate::QueryProperty(const FX_WCHAR* propname) { | 121 FX_BOOL JSGlobalAlternate::QueryProperty(const FX_WCHAR* propname) { |
122 return CFX_WideString(propname) != L"setPersistent"; | 122 return CFX_WideString(propname) != L"setPersistent"; |
123 } | 123 } |
124 | 124 |
125 FX_BOOL JSGlobalAlternate::DelProperty(IFXJS_Context* cc, | 125 FX_BOOL JSGlobalAlternate::DelProperty(IFXJS_Context* cc, |
126 const FX_WCHAR* propname, | 126 const FX_WCHAR* propname, |
127 CFX_WideString& sError) { | 127 CFX_WideString& sError) { |
128 JSGlobalData* pData = NULL; | 128 auto it = m_mapGlobal.find(CFX_ByteString::FromUnicode(propname)); |
129 CFX_ByteString sPropName = CFX_ByteString::FromUnicode(propname); | 129 if (it == m_mapGlobal.end()) |
| 130 return FALSE; |
130 | 131 |
131 if (m_mapGlobal.Lookup(sPropName, (void*&)pData)) { | 132 it->second->bDeleted = TRUE; |
132 pData->bDeleted = TRUE; | 133 return TRUE; |
133 return TRUE; | |
134 } | |
135 | |
136 return FALSE; | |
137 } | 134 } |
138 | 135 |
139 FX_BOOL JSGlobalAlternate::DoProperty(IFXJS_Context* cc, | 136 FX_BOOL JSGlobalAlternate::DoProperty(IFXJS_Context* cc, |
140 const FX_WCHAR* propname, | 137 const FX_WCHAR* propname, |
141 CJS_PropValue& vp, | 138 CJS_PropValue& vp, |
142 CFX_WideString& sError) { | 139 CFX_WideString& sError) { |
143 if (vp.IsSetting()) { | 140 if (vp.IsSetting()) { |
144 CFX_ByteString sPropName = CFX_ByteString::FromUnicode(propname); | 141 CFX_ByteString sPropName = CFX_ByteString::FromUnicode(propname); |
145 switch (vp.GetType()) { | 142 switch (vp.GetType()) { |
146 case VT_number: { | 143 case VT_number: { |
(...skipping 25 matching lines...) Expand all Loading... |
172 "", v8::Local<v8::Object>(), FALSE); | 169 "", v8::Local<v8::Object>(), FALSE); |
173 } | 170 } |
174 case VT_undefined: { | 171 case VT_undefined: { |
175 DelProperty(cc, propname, sError); | 172 DelProperty(cc, propname, sError); |
176 return TRUE; | 173 return TRUE; |
177 } | 174 } |
178 default: | 175 default: |
179 break; | 176 break; |
180 } | 177 } |
181 } else { | 178 } else { |
182 void* pVoid = nullptr; | 179 auto it = m_mapGlobal.find(CFX_ByteString::FromUnicode(propname)); |
183 if (!m_mapGlobal.Lookup(CFX_ByteString::FromUnicode(propname), pVoid)) { | 180 if (it == m_mapGlobal.end()) { |
184 vp.SetNull(); | 181 vp.SetNull(); |
185 return TRUE; | 182 return TRUE; |
186 } | 183 } |
187 if (!pVoid) { | 184 JSGlobalData* pData = it->second; |
| 185 if (pData->bDeleted) { |
188 vp.SetNull(); | 186 vp.SetNull(); |
189 return TRUE; | 187 return TRUE; |
190 } | 188 } |
191 JSGlobalData* pData = (JSGlobalData*)pVoid; | |
192 if (pData->bDeleted) | |
193 return TRUE; | |
194 | |
195 switch (pData->nType) { | 189 switch (pData->nType) { |
196 case JS_GLOBALDATA_TYPE_NUMBER: | 190 case JS_GLOBALDATA_TYPE_NUMBER: |
197 vp << pData->dData; | 191 vp << pData->dData; |
198 return TRUE; | 192 return TRUE; |
199 case JS_GLOBALDATA_TYPE_BOOLEAN: | 193 case JS_GLOBALDATA_TYPE_BOOLEAN: |
200 vp << pData->bData; | 194 vp << pData->bData; |
201 return TRUE; | 195 return TRUE; |
202 case JS_GLOBALDATA_TYPE_STRING: | 196 case JS_GLOBALDATA_TYPE_STRING: |
203 vp << pData->sData; | 197 vp << pData->sData; |
204 return TRUE; | 198 return TRUE; |
(...skipping 16 matching lines...) Expand all Loading... |
221 FX_BOOL JSGlobalAlternate::setPersistent(IFXJS_Context* cc, | 215 FX_BOOL JSGlobalAlternate::setPersistent(IFXJS_Context* cc, |
222 const CJS_Parameters& params, | 216 const CJS_Parameters& params, |
223 CJS_Value& vRet, | 217 CJS_Value& vRet, |
224 CFX_WideString& sError) { | 218 CFX_WideString& sError) { |
225 CJS_Context* pContext = static_cast<CJS_Context*>(cc); | 219 CJS_Context* pContext = static_cast<CJS_Context*>(cc); |
226 if (params.size() != 2) { | 220 if (params.size() != 2) { |
227 sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR); | 221 sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR); |
228 return FALSE; | 222 return FALSE; |
229 } | 223 } |
230 | 224 |
231 CFX_ByteString sName = params[0].ToCFXByteString(); | 225 auto it = m_mapGlobal.find(params[0].ToCFXByteString()); |
232 | 226 if (it != m_mapGlobal.end()) { |
233 JSGlobalData* pData = NULL; | 227 JSGlobalData* pData = it->second; |
234 if (m_mapGlobal.Lookup(sName, (void*&)pData)) { | 228 if (!pData->bDeleted) { |
235 if (pData && !pData->bDeleted) { | |
236 pData->bPersistent = params[1].ToBool(); | 229 pData->bPersistent = params[1].ToBool(); |
237 return TRUE; | 230 return TRUE; |
238 } | 231 } |
239 } | 232 } |
240 | 233 |
241 sError = JSGetStringFromID(pContext, IDS_STRING_JSNOGLOBAL); | 234 sError = JSGetStringFromID(pContext, IDS_STRING_JSNOGLOBAL); |
242 return FALSE; | 235 return FALSE; |
243 } | 236 } |
244 | 237 |
245 void JSGlobalAlternate::UpdateGlobalPersistentVariables() { | 238 void JSGlobalAlternate::UpdateGlobalPersistentVariables() { |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
291 "", v8::Local<v8::Object>(), | 284 "", v8::Local<v8::Object>(), |
292 pData->bPersistent == 1); | 285 pData->bPersistent == 1); |
293 JS_PutObjectNull(NULL, (JSFXObject)(*m_pJSObject), | 286 JS_PutObjectNull(NULL, (JSFXObject)(*m_pJSObject), |
294 pData->data.sKey.UTF8Decode().c_str()); | 287 pData->data.sKey.UTF8Decode().c_str()); |
295 break; | 288 break; |
296 } | 289 } |
297 } | 290 } |
298 } | 291 } |
299 | 292 |
300 void JSGlobalAlternate::CommitGlobalPersisitentVariables() { | 293 void JSGlobalAlternate::CommitGlobalPersisitentVariables() { |
301 ASSERT(m_pGlobalData != NULL); | 294 ASSERT(m_pGlobalData); |
302 | 295 for (auto it = m_mapGlobal.begin(); it != m_mapGlobal.end(); ++it) { |
303 FX_POSITION pos = m_mapGlobal.GetStartPosition(); | 296 CFX_ByteString name = it->first; |
304 while (pos) { | 297 JSGlobalData* pData = it->second; |
305 CFX_ByteString name; | 298 if (pData->bDeleted) { |
306 JSGlobalData* pData = NULL; | 299 m_pGlobalData->DeleteGlobalVariable(name); |
307 m_mapGlobal.GetNextAssoc(pos, name, (void*&)pData); | 300 } else { |
308 | 301 switch (pData->nType) { |
309 if (pData) { | 302 case JS_GLOBALDATA_TYPE_NUMBER: |
310 if (pData->bDeleted) { | 303 m_pGlobalData->SetGlobalVariableNumber(name, pData->dData); |
311 m_pGlobalData->DeleteGlobalVariable(name); | 304 m_pGlobalData->SetGlobalVariablePersistent(name, pData->bPersistent); |
312 } else { | 305 break; |
313 switch (pData->nType) { | 306 case JS_GLOBALDATA_TYPE_BOOLEAN: |
314 case JS_GLOBALDATA_TYPE_NUMBER: | 307 m_pGlobalData->SetGlobalVariableBoolean(name, pData->bData); |
315 m_pGlobalData->SetGlobalVariableNumber(name, pData->dData); | 308 m_pGlobalData->SetGlobalVariablePersistent(name, pData->bPersistent); |
| 309 break; |
| 310 case JS_GLOBALDATA_TYPE_STRING: |
| 311 m_pGlobalData->SetGlobalVariableString(name, pData->sData); |
| 312 m_pGlobalData->SetGlobalVariablePersistent(name, pData->bPersistent); |
| 313 break; |
| 314 case JS_GLOBALDATA_TYPE_OBJECT: |
| 315 // if (pData->pData) |
| 316 { |
| 317 CJS_GlobalVariableArray array; |
| 318 v8::Local<v8::Object> obj = v8::Local<v8::Object>::New( |
| 319 GetJSObject()->GetIsolate(), pData->pData); |
| 320 ObjectToArray(obj, array); |
| 321 m_pGlobalData->SetGlobalVariableObject(name, array); |
316 m_pGlobalData->SetGlobalVariablePersistent(name, | 322 m_pGlobalData->SetGlobalVariablePersistent(name, |
317 pData->bPersistent); | 323 pData->bPersistent); |
318 break; | 324 } |
319 case JS_GLOBALDATA_TYPE_BOOLEAN: | 325 break; |
320 m_pGlobalData->SetGlobalVariableBoolean(name, pData->bData); | 326 case JS_GLOBALDATA_TYPE_NULL: |
321 m_pGlobalData->SetGlobalVariablePersistent(name, | 327 m_pGlobalData->SetGlobalVariableNull(name); |
322 pData->bPersistent); | 328 m_pGlobalData->SetGlobalVariablePersistent(name, pData->bPersistent); |
323 break; | 329 break; |
324 case JS_GLOBALDATA_TYPE_STRING: | |
325 m_pGlobalData->SetGlobalVariableString(name, pData->sData); | |
326 m_pGlobalData->SetGlobalVariablePersistent(name, | |
327 pData->bPersistent); | |
328 break; | |
329 case JS_GLOBALDATA_TYPE_OBJECT: | |
330 // if (pData->pData) | |
331 { | |
332 CJS_GlobalVariableArray array; | |
333 v8::Local<v8::Object> obj = v8::Local<v8::Object>::New( | |
334 GetJSObject()->GetIsolate(), pData->pData); | |
335 ObjectToArray(obj, array); | |
336 m_pGlobalData->SetGlobalVariableObject(name, array); | |
337 m_pGlobalData->SetGlobalVariablePersistent(name, | |
338 pData->bPersistent); | |
339 } | |
340 break; | |
341 case JS_GLOBALDATA_TYPE_NULL: | |
342 m_pGlobalData->SetGlobalVariableNull(name); | |
343 m_pGlobalData->SetGlobalVariablePersistent(name, | |
344 pData->bPersistent); | |
345 break; | |
346 } | |
347 } | 330 } |
348 } | 331 } |
349 } | 332 } |
350 } | 333 } |
351 | 334 |
352 void JSGlobalAlternate::ObjectToArray(v8::Local<v8::Object> pObj, | 335 void JSGlobalAlternate::ObjectToArray(v8::Local<v8::Object> pObj, |
353 CJS_GlobalVariableArray& array) { | 336 CJS_GlobalVariableArray& array) { |
354 v8::Local<v8::Context> context = pObj->CreationContext(); | 337 v8::Local<v8::Context> context = pObj->CreationContext(); |
355 v8::Isolate* isolate = context->GetIsolate(); | 338 v8::Isolate* isolate = context->GetIsolate(); |
356 v8::Local<v8::Array> pKeyList = JS_GetObjectElementNames(isolate, pObj); | 339 v8::Local<v8::Array> pKeyList = JS_GetObjectElementNames(isolate, pObj); |
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
440 } break; | 423 } break; |
441 case JS_GLOBALDATA_TYPE_NULL: | 424 case JS_GLOBALDATA_TYPE_NULL: |
442 JS_PutObjectNull(NULL, (JSObject)pObj, | 425 JS_PutObjectNull(NULL, (JSObject)pObj, |
443 pObjData->sKey.UTF8Decode().c_str()); | 426 pObjData->sKey.UTF8Decode().c_str()); |
444 break; | 427 break; |
445 } | 428 } |
446 } | 429 } |
447 } | 430 } |
448 | 431 |
449 void JSGlobalAlternate::DestroyGlobalPersisitentVariables() { | 432 void JSGlobalAlternate::DestroyGlobalPersisitentVariables() { |
450 FX_POSITION pos = m_mapGlobal.GetStartPosition(); | 433 for (const auto& pair : m_mapGlobal) { |
451 while (pos) { | 434 delete pair.second; |
452 CFX_ByteString name; | |
453 JSGlobalData* pData = NULL; | |
454 m_mapGlobal.GetNextAssoc(pos, name, (void*&)pData); | |
455 delete pData; | |
456 } | 435 } |
457 | 436 m_mapGlobal.clear(); |
458 m_mapGlobal.RemoveAll(); | |
459 } | 437 } |
460 | 438 |
461 FX_BOOL JSGlobalAlternate::SetGlobalVariables(const FX_CHAR* propname, | 439 FX_BOOL JSGlobalAlternate::SetGlobalVariables(const FX_CHAR* propname, |
462 int nType, | 440 int nType, |
463 double dData, | 441 double dData, |
464 bool bData, | 442 bool bData, |
465 const CFX_ByteString& sData, | 443 const CFX_ByteString& sData, |
466 JSObject pData, | 444 JSObject pData, |
467 bool bDefaultPersistent) { | 445 bool bDefaultPersistent) { |
468 if (propname == NULL) | 446 if (!propname) |
469 return FALSE; | 447 return FALSE; |
470 | 448 |
471 JSGlobalData* pTemp = NULL; | 449 auto it = m_mapGlobal.find(propname); |
472 m_mapGlobal.Lookup(propname, (void*&)pTemp); | 450 if (it != m_mapGlobal.end()) { |
473 | 451 JSGlobalData* pTemp = it->second; |
474 if (pTemp) { | |
475 if (pTemp->bDeleted || pTemp->nType != nType) { | 452 if (pTemp->bDeleted || pTemp->nType != nType) { |
476 pTemp->dData = 0; | 453 pTemp->dData = 0; |
477 pTemp->bData = 0; | 454 pTemp->bData = 0; |
478 pTemp->sData = ""; | 455 pTemp->sData = ""; |
479 pTemp->nType = nType; | 456 pTemp->nType = nType; |
480 } | 457 } |
481 | 458 |
482 pTemp->bDeleted = FALSE; | 459 pTemp->bDeleted = FALSE; |
483 | |
484 switch (nType) { | 460 switch (nType) { |
485 case JS_GLOBALDATA_TYPE_NUMBER: { | 461 case JS_GLOBALDATA_TYPE_NUMBER: { |
486 pTemp->dData = dData; | 462 pTemp->dData = dData; |
487 } break; | 463 } break; |
488 case JS_GLOBALDATA_TYPE_BOOLEAN: { | 464 case JS_GLOBALDATA_TYPE_BOOLEAN: { |
489 pTemp->bData = bData; | 465 pTemp->bData = bData; |
490 } break; | 466 } break; |
491 case JS_GLOBALDATA_TYPE_STRING: { | 467 case JS_GLOBALDATA_TYPE_STRING: { |
492 pTemp->sData = sData; | 468 pTemp->sData = sData; |
493 } break; | 469 } break; |
494 case JS_GLOBALDATA_TYPE_OBJECT: { | 470 case JS_GLOBALDATA_TYPE_OBJECT: { |
495 pTemp->pData.Reset(JS_GetRuntime(pData), pData); | 471 pTemp->pData.Reset(JS_GetRuntime(pData), pData); |
496 } break; | 472 } break; |
497 case JS_GLOBALDATA_TYPE_NULL: | 473 case JS_GLOBALDATA_TYPE_NULL: |
498 break; | 474 break; |
499 default: | 475 default: |
500 return FALSE; | 476 return FALSE; |
501 } | 477 } |
502 | |
503 return TRUE; | 478 return TRUE; |
504 } | 479 } |
505 | 480 |
506 JSGlobalData* pNewData = NULL; | 481 JSGlobalData* pNewData = NULL; |
507 | 482 |
508 switch (nType) { | 483 switch (nType) { |
509 case JS_GLOBALDATA_TYPE_NUMBER: { | 484 case JS_GLOBALDATA_TYPE_NUMBER: { |
510 pNewData = new JSGlobalData; | 485 pNewData = new JSGlobalData; |
511 pNewData->nType = JS_GLOBALDATA_TYPE_NUMBER; | 486 pNewData->nType = JS_GLOBALDATA_TYPE_NUMBER; |
512 pNewData->dData = dData; | 487 pNewData->dData = dData; |
(...skipping 19 matching lines...) Expand all Loading... |
532 } break; | 507 } break; |
533 case JS_GLOBALDATA_TYPE_NULL: { | 508 case JS_GLOBALDATA_TYPE_NULL: { |
534 pNewData = new JSGlobalData; | 509 pNewData = new JSGlobalData; |
535 pNewData->nType = JS_GLOBALDATA_TYPE_NULL; | 510 pNewData->nType = JS_GLOBALDATA_TYPE_NULL; |
536 pNewData->bPersistent = bDefaultPersistent; | 511 pNewData->bPersistent = bDefaultPersistent; |
537 } break; | 512 } break; |
538 default: | 513 default: |
539 return FALSE; | 514 return FALSE; |
540 } | 515 } |
541 | 516 |
542 m_mapGlobal.SetAt(propname, (void*)pNewData); | 517 m_mapGlobal[propname] = pNewData; |
543 | |
544 return TRUE; | 518 return TRUE; |
545 } | 519 } |
546 | 520 |
547 FXJSVALUETYPE GET_VALUE_TYPE(v8::Local<v8::Value> p) { | 521 FXJSVALUETYPE GET_VALUE_TYPE(v8::Local<v8::Value> p) { |
548 const unsigned int nHash = JS_CalcHash(JS_GetTypeof(p)); | 522 const unsigned int nHash = JS_CalcHash(JS_GetTypeof(p)); |
549 | 523 |
550 if (nHash == JSCONST_nUndefHash) | 524 if (nHash == JSCONST_nUndefHash) |
551 return VT_undefined; | 525 return VT_undefined; |
552 if (nHash == JSCONST_nNullHash) | 526 if (nHash == JSCONST_nNullHash) |
553 return VT_null; | 527 return VT_null; |
554 if (nHash == JSCONST_nStringHash) | 528 if (nHash == JSCONST_nStringHash) |
555 return VT_string; | 529 return VT_string; |
556 if (nHash == JSCONST_nNumberHash) | 530 if (nHash == JSCONST_nNumberHash) |
557 return VT_number; | 531 return VT_number; |
558 if (nHash == JSCONST_nBoolHash) | 532 if (nHash == JSCONST_nBoolHash) |
559 return VT_boolean; | 533 return VT_boolean; |
560 if (nHash == JSCONST_nDateHash) | 534 if (nHash == JSCONST_nDateHash) |
561 return VT_date; | 535 return VT_date; |
562 if (nHash == JSCONST_nObjectHash) | 536 if (nHash == JSCONST_nObjectHash) |
563 return VT_object; | 537 return VT_object; |
564 if (nHash == JSCONST_nFXobjHash) | 538 if (nHash == JSCONST_nFXobjHash) |
565 return VT_fxobject; | 539 return VT_fxobject; |
566 | 540 |
567 return VT_unknown; | 541 return VT_unknown; |
568 } | 542 } |
OLD | NEW |