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

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

Issue 1297723002: CFX_MapByteStringToPtr considered harmful. (Closed) Base URL: https://pdfium.googlesource.com/pdfium.git@master
Patch Set: Separate reload & delete. 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 106 matching lines...) Expand 10 before | Expand all | Expand 10 after
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
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
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
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
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
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 }
OLDNEW
« fpdfsdk/include/fsdk_annothandler.h ('K') | « fpdfsdk/src/fsdk_annothandler.cpp ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698