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 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
117 UpdateGlobalPersistentVariables(); | 117 UpdateGlobalPersistentVariables(); |
118 } | 118 } |
119 | 119 |
120 FX_BOOL global_alternate::QueryProperty(const FX_WCHAR* propname) { | 120 FX_BOOL global_alternate::QueryProperty(const FX_WCHAR* propname) { |
121 return CFX_WideString(propname) != L"setPersistent"; | 121 return CFX_WideString(propname) != L"setPersistent"; |
122 } | 122 } |
123 | 123 |
124 FX_BOOL global_alternate::DelProperty(IFXJS_Context* cc, | 124 FX_BOOL global_alternate::DelProperty(IFXJS_Context* cc, |
125 const FX_WCHAR* propname, | 125 const FX_WCHAR* propname, |
126 CFX_WideString& sError) { | 126 CFX_WideString& sError) { |
127 js_global_data* pData = NULL; | 127 auto it = m_mapGlobal.find(CFX_ByteString::FromUnicode(propname)); |
128 CFX_ByteString sPropName = CFX_ByteString::FromUnicode(propname); | 128 if (it == m_mapGlobal.end()) |
129 return FALSE; | |
129 | 130 |
130 if (m_mapGlobal.Lookup(sPropName, (void*&)pData)) { | 131 it->second->bDeleted = TRUE; |
131 pData->bDeleted = TRUE; | 132 return TRUE; |
132 return TRUE; | |
133 } | |
134 | |
135 return FALSE; | |
136 } | 133 } |
137 | 134 |
138 FX_BOOL global_alternate::DoProperty(IFXJS_Context* cc, | 135 FX_BOOL global_alternate::DoProperty(IFXJS_Context* cc, |
139 const FX_WCHAR* propname, | 136 const FX_WCHAR* propname, |
140 CJS_PropValue& vp, | 137 CJS_PropValue& vp, |
141 CFX_WideString& sError) { | 138 CFX_WideString& sError) { |
142 if (vp.IsSetting()) { | 139 if (vp.IsSetting()) { |
143 CFX_ByteString sPropName = CFX_ByteString::FromUnicode(propname); | 140 CFX_ByteString sPropName = CFX_ByteString::FromUnicode(propname); |
144 switch (vp.GetType()) { | 141 switch (vp.GetType()) { |
145 case VT_number: { | 142 case VT_number: { |
(...skipping 25 matching lines...) Expand all Loading... | |
171 "", v8::Local<v8::Object>(), FALSE); | 168 "", v8::Local<v8::Object>(), FALSE); |
172 } | 169 } |
173 case VT_undefined: { | 170 case VT_undefined: { |
174 DelProperty(cc, propname, sError); | 171 DelProperty(cc, propname, sError); |
175 return TRUE; | 172 return TRUE; |
176 } | 173 } |
177 default: | 174 default: |
178 break; | 175 break; |
179 } | 176 } |
180 } else { | 177 } else { |
181 void* pVoid = nullptr; | 178 auto it = m_mapGlobal.find(CFX_ByteString::FromUnicode(propname)); |
182 if (!m_mapGlobal.Lookup(CFX_ByteString::FromUnicode(propname), pVoid)) { | 179 if (it == m_mapGlobal.end()) { |
183 vp.SetNull(); | 180 vp.SetNull(); |
184 return TRUE; | 181 return TRUE; |
185 } | 182 } |
186 if (!pVoid) { | 183 js_global_data* pData = it->second; |
184 if (!pData || pData->bDeleted) { | |
Lei Zhang
2015/08/14 23:59:35
This is intentially calling vp.SetNull() for the b
Lei Zhang
2015/08/14 23:59:35
|pData| is never NULL.
Tom Sepez
2015/08/17 20:15:26
Yes, seems like a bug to return with this unset.
Tom Sepez
2015/08/17 20:15:26
Done.
| |
187 vp.SetNull(); | 185 vp.SetNull(); |
188 return TRUE; | 186 return TRUE; |
189 } | 187 } |
190 js_global_data* pData = (js_global_data*)pVoid; | |
191 if (pData->bDeleted) | |
192 return TRUE; | |
193 | |
194 switch (pData->nType) { | 188 switch (pData->nType) { |
195 case JS_GLOBALDATA_TYPE_NUMBER: | 189 case JS_GLOBALDATA_TYPE_NUMBER: |
196 vp << pData->dData; | 190 vp << pData->dData; |
197 return TRUE; | 191 return TRUE; |
198 case JS_GLOBALDATA_TYPE_BOOLEAN: | 192 case JS_GLOBALDATA_TYPE_BOOLEAN: |
199 vp << pData->bData; | 193 vp << pData->bData; |
200 return TRUE; | 194 return TRUE; |
201 case JS_GLOBALDATA_TYPE_STRING: | 195 case JS_GLOBALDATA_TYPE_STRING: |
202 vp << pData->sData; | 196 vp << pData->sData; |
203 return TRUE; | 197 return TRUE; |
(...skipping 16 matching lines...) Expand all Loading... | |
220 FX_BOOL global_alternate::setPersistent(IFXJS_Context* cc, | 214 FX_BOOL global_alternate::setPersistent(IFXJS_Context* cc, |
221 const CJS_Parameters& params, | 215 const CJS_Parameters& params, |
222 CJS_Value& vRet, | 216 CJS_Value& vRet, |
223 CFX_WideString& sError) { | 217 CFX_WideString& sError) { |
224 CJS_Context* pContext = static_cast<CJS_Context*>(cc); | 218 CJS_Context* pContext = static_cast<CJS_Context*>(cc); |
225 if (params.size() != 2) { | 219 if (params.size() != 2) { |
226 sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR); | 220 sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR); |
227 return FALSE; | 221 return FALSE; |
228 } | 222 } |
229 | 223 |
230 CFX_ByteString sName = params[0].ToCFXByteString(); | 224 auto it = m_mapGlobal.find(params[0].ToCFXByteString()); |
231 | 225 if (it != m_mapGlobal.end()) { |
232 js_global_data* pData = NULL; | 226 js_global_data* pData = it->second; |
233 if (m_mapGlobal.Lookup(sName, (void*&)pData)) { | |
234 if (pData && !pData->bDeleted) { | 227 if (pData && !pData->bDeleted) { |
Lei Zhang
2015/08/14 23:59:35
|pData| is never NULL.
Tom Sepez
2015/08/17 20:15:26
Done.
| |
235 pData->bPersistent = params[1].ToBool(); | 228 pData->bPersistent = params[1].ToBool(); |
236 return TRUE; | 229 return TRUE; |
237 } | 230 } |
238 } | 231 } |
239 | 232 |
240 sError = JSGetStringFromID(pContext, IDS_STRING_JSNOGLOBAL); | 233 sError = JSGetStringFromID(pContext, IDS_STRING_JSNOGLOBAL); |
241 return FALSE; | 234 return FALSE; |
242 } | 235 } |
243 | 236 |
244 void global_alternate::UpdateGlobalPersistentVariables() { | 237 void global_alternate::UpdateGlobalPersistentVariables() { |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
290 "", v8::Local<v8::Object>(), | 283 "", v8::Local<v8::Object>(), |
291 pData->bPersistent == 1); | 284 pData->bPersistent == 1); |
292 JS_PutObjectNull(NULL, (JSFXObject)(*m_pJSObject), | 285 JS_PutObjectNull(NULL, (JSFXObject)(*m_pJSObject), |
293 pData->data.sKey.UTF8Decode().c_str()); | 286 pData->data.sKey.UTF8Decode().c_str()); |
294 break; | 287 break; |
295 } | 288 } |
296 } | 289 } |
297 } | 290 } |
298 | 291 |
299 void global_alternate::CommitGlobalPersisitentVariables() { | 292 void global_alternate::CommitGlobalPersisitentVariables() { |
300 ASSERT(m_pGlobalData != NULL); | 293 ASSERT(m_pGlobalData); |
301 | 294 |
302 FX_POSITION pos = m_mapGlobal.GetStartPosition(); | 295 for (auto it = m_mapGlobal.begin(); it != m_mapGlobal.end(); ++it) { |
303 while (pos) { | 296 CFX_ByteString name = it->first; |
304 CFX_ByteString name; | 297 js_global_data* pData = it->second; |
305 js_global_data* pData = NULL; | |
306 m_mapGlobal.GetNextAssoc(pos, name, (void*&)pData); | |
307 | |
308 if (pData) { | 298 if (pData) { |
Lei Zhang
2015/08/14 23:59:35
|pData| is never NULL.
Tom Sepez
2015/08/17 20:15:26
Done.
| |
309 if (pData->bDeleted) { | 299 if (pData->bDeleted) { |
310 m_pGlobalData->DeleteGlobalVariable(name); | 300 m_pGlobalData->DeleteGlobalVariable(name); |
311 } else { | 301 } else { |
312 switch (pData->nType) { | 302 switch (pData->nType) { |
313 case JS_GLOBALDATA_TYPE_NUMBER: | 303 case JS_GLOBALDATA_TYPE_NUMBER: |
314 m_pGlobalData->SetGlobalVariableNumber(name, pData->dData); | 304 m_pGlobalData->SetGlobalVariableNumber(name, pData->dData); |
315 m_pGlobalData->SetGlobalVariablePersistent(name, | 305 m_pGlobalData->SetGlobalVariablePersistent(name, |
316 pData->bPersistent); | 306 pData->bPersistent); |
317 break; | 307 break; |
318 case JS_GLOBALDATA_TYPE_BOOLEAN: | 308 case JS_GLOBALDATA_TYPE_BOOLEAN: |
(...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
439 } break; | 429 } break; |
440 case JS_GLOBALDATA_TYPE_NULL: | 430 case JS_GLOBALDATA_TYPE_NULL: |
441 JS_PutObjectNull(NULL, (JSObject)pObj, | 431 JS_PutObjectNull(NULL, (JSObject)pObj, |
442 pObjData->sKey.UTF8Decode().c_str()); | 432 pObjData->sKey.UTF8Decode().c_str()); |
443 break; | 433 break; |
444 } | 434 } |
445 } | 435 } |
446 } | 436 } |
447 | 437 |
448 void global_alternate::DestroyGlobalPersisitentVariables() { | 438 void global_alternate::DestroyGlobalPersisitentVariables() { |
449 FX_POSITION pos = m_mapGlobal.GetStartPosition(); | 439 auto it = m_mapGlobal.begin(); |
Lei Zhang
2015/08/14 23:59:35
Can't this be written as follows?
for (auto it :
Tom Sepez
2015/08/17 20:15:26
Done.
| |
450 while (pos) { | 440 while (it != m_mapGlobal.end()) { |
451 CFX_ByteString name; | 441 auto temp = it++; |
452 js_global_data* pData = NULL; | 442 delete temp->second; |
453 m_mapGlobal.GetNextAssoc(pos, name, (void*&)pData); | 443 m_mapGlobal.erase(temp); |
454 delete pData; | |
455 } | 444 } |
456 | |
457 m_mapGlobal.RemoveAll(); | |
458 } | 445 } |
459 | 446 |
460 FX_BOOL global_alternate::SetGlobalVariables(const FX_CHAR* propname, | 447 FX_BOOL global_alternate::SetGlobalVariables(const FX_CHAR* propname, |
461 int nType, | 448 int nType, |
462 double dData, | 449 double dData, |
463 bool bData, | 450 bool bData, |
464 const CFX_ByteString& sData, | 451 const CFX_ByteString& sData, |
465 JSObject pData, | 452 JSObject pData, |
466 bool bDefaultPersistent) { | 453 bool bDefaultPersistent) { |
467 if (propname == NULL) | 454 if (!propname) |
468 return FALSE; | 455 return FALSE; |
469 | 456 |
470 js_global_data* pTemp = NULL; | 457 auto it = m_mapGlobal.find(propname); |
471 m_mapGlobal.Lookup(propname, (void*&)pTemp); | 458 if (it != m_mapGlobal.end() && it->second) { |
Lei Zhang
2015/08/14 23:59:35
|it->second| is never NULL.
Tom Sepez
2015/08/17 20:15:26
Done.
| |
472 | 459 js_global_data* pTemp = it->second; |
473 if (pTemp) { | |
474 if (pTemp->bDeleted || pTemp->nType != nType) { | 460 if (pTemp->bDeleted || pTemp->nType != nType) { |
475 pTemp->dData = 0; | 461 pTemp->dData = 0; |
476 pTemp->bData = 0; | 462 pTemp->bData = 0; |
477 pTemp->sData = ""; | 463 pTemp->sData = ""; |
478 pTemp->nType = nType; | 464 pTemp->nType = nType; |
479 } | 465 } |
480 | 466 |
481 pTemp->bDeleted = FALSE; | 467 pTemp->bDeleted = FALSE; |
482 | |
483 switch (nType) { | 468 switch (nType) { |
484 case JS_GLOBALDATA_TYPE_NUMBER: { | 469 case JS_GLOBALDATA_TYPE_NUMBER: { |
485 pTemp->dData = dData; | 470 pTemp->dData = dData; |
486 } break; | 471 } break; |
487 case JS_GLOBALDATA_TYPE_BOOLEAN: { | 472 case JS_GLOBALDATA_TYPE_BOOLEAN: { |
488 pTemp->bData = bData; | 473 pTemp->bData = bData; |
489 } break; | 474 } break; |
490 case JS_GLOBALDATA_TYPE_STRING: { | 475 case JS_GLOBALDATA_TYPE_STRING: { |
491 pTemp->sData = sData; | 476 pTemp->sData = sData; |
492 } break; | 477 } break; |
493 case JS_GLOBALDATA_TYPE_OBJECT: { | 478 case JS_GLOBALDATA_TYPE_OBJECT: { |
494 pTemp->pData.Reset(JS_GetRuntime(pData), pData); | 479 pTemp->pData.Reset(JS_GetRuntime(pData), pData); |
495 } break; | 480 } break; |
496 case JS_GLOBALDATA_TYPE_NULL: | 481 case JS_GLOBALDATA_TYPE_NULL: |
497 break; | 482 break; |
498 default: | 483 default: |
499 return FALSE; | 484 return FALSE; |
500 } | 485 } |
501 | |
502 return TRUE; | 486 return TRUE; |
503 } | 487 } |
504 | 488 |
505 js_global_data* pNewData = NULL; | 489 js_global_data* pNewData = NULL; |
506 | 490 |
507 switch (nType) { | 491 switch (nType) { |
508 case JS_GLOBALDATA_TYPE_NUMBER: { | 492 case JS_GLOBALDATA_TYPE_NUMBER: { |
509 pNewData = new js_global_data; | 493 pNewData = new js_global_data; |
510 pNewData->nType = JS_GLOBALDATA_TYPE_NUMBER; | 494 pNewData->nType = JS_GLOBALDATA_TYPE_NUMBER; |
511 pNewData->dData = dData; | 495 pNewData->dData = dData; |
(...skipping 19 matching lines...) Expand all Loading... | |
531 } break; | 515 } break; |
532 case JS_GLOBALDATA_TYPE_NULL: { | 516 case JS_GLOBALDATA_TYPE_NULL: { |
533 pNewData = new js_global_data; | 517 pNewData = new js_global_data; |
534 pNewData->nType = JS_GLOBALDATA_TYPE_NULL; | 518 pNewData->nType = JS_GLOBALDATA_TYPE_NULL; |
535 pNewData->bPersistent = bDefaultPersistent; | 519 pNewData->bPersistent = bDefaultPersistent; |
536 } break; | 520 } break; |
537 default: | 521 default: |
538 return FALSE; | 522 return FALSE; |
539 } | 523 } |
540 | 524 |
541 m_mapGlobal.SetAt(propname, (void*)pNewData); | 525 m_mapGlobal[propname] = pNewData; |
Lei Zhang
2015/08/14 23:59:35
Since this is the only setter, and |pNewData| cann
Tom Sepez
2015/08/17 20:15:26
Presume covered by the |pdata| can't be null comme
| |
542 | |
543 return TRUE; | 526 return TRUE; |
544 } | 527 } |
545 | 528 |
546 FXJSVALUETYPE GET_VALUE_TYPE(v8::Local<v8::Value> p) { | 529 FXJSVALUETYPE GET_VALUE_TYPE(v8::Local<v8::Value> p) { |
547 const unsigned int nHash = JS_CalcHash(JS_GetTypeof(p)); | 530 const unsigned int nHash = JS_CalcHash(JS_GetTypeof(p)); |
548 | 531 |
549 if (nHash == JSCONST_nUndefHash) | 532 if (nHash == JSCONST_nUndefHash) |
550 return VT_undefined; | 533 return VT_undefined; |
551 if (nHash == JSCONST_nNullHash) | 534 if (nHash == JSCONST_nNullHash) |
552 return VT_null; | 535 return VT_null; |
553 if (nHash == JSCONST_nStringHash) | 536 if (nHash == JSCONST_nStringHash) |
554 return VT_string; | 537 return VT_string; |
555 if (nHash == JSCONST_nNumberHash) | 538 if (nHash == JSCONST_nNumberHash) |
556 return VT_number; | 539 return VT_number; |
557 if (nHash == JSCONST_nBoolHash) | 540 if (nHash == JSCONST_nBoolHash) |
558 return VT_boolean; | 541 return VT_boolean; |
559 if (nHash == JSCONST_nDateHash) | 542 if (nHash == JSCONST_nDateHash) |
560 return VT_date; | 543 return VT_date; |
561 if (nHash == JSCONST_nObjectHash) | 544 if (nHash == JSCONST_nObjectHash) |
562 return VT_object; | 545 return VT_object; |
563 if (nHash == JSCONST_nFXobjHash) | 546 if (nHash == JSCONST_nFXobjHash) |
564 return VT_fxobject; | 547 return VT_fxobject; |
565 | 548 |
566 return VT_unknown; | 549 return VT_unknown; |
567 } | 550 } |
OLD | NEW |