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

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

Issue 1301793002: Merge to XFA: CFX_MapByteStringToPtr considered harmful (combo patch). (Closed) Base URL: https://pdfium.googlesource.com/pdfium.git@xfa
Patch Set: 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') | xfa/src/fdp/src/css/fde_csscache.h » ('j') | 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 109 matching lines...) Expand 10 before | Expand all | Expand 10 after
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
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
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
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
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
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 }
OLDNEW
« no previous file with comments | « fpdfsdk/src/fsdk_annothandler.cpp ('k') | xfa/src/fdp/src/css/fde_csscache.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698