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