Chromium Code Reviews| 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 |