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

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: Const auto& 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
« no previous file with comments | « fpdfsdk/src/fsdk_annothandler.cpp ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 107 matching lines...) Expand 10 before | Expand all | Expand 10 after
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
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
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
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
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
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 }
OLDNEW
« no previous file with comments | « fpdfsdk/src/fsdk_annothandler.cpp ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698