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