| 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 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 (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 Loading... |
| 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 } |
| OLD | NEW |