1 // Copyright 2014 PDFium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com 6 7 #include "../../include/javascript/JavaScript.h" 8 #include "../../include/javascript/IJavaScript.h" 9 #include "../../include/javascript/JS_Define.h" 10 #include "../../include/javascript/JS_Object.h" 11 #include "../../include/javascript/JS_Value.h" 12 #include "../../include/javascript/app.h" 13 #include "../../include/javascript/JS_EventHandler.h" 14 #include "../../include/javascript/resource.h" 15 #include "../../include/javascript/JS_Context.h" 16 #include "../../include/javascript/JS_Runtime.h" 17 #include "../../include/javascript/Document.h" 18 19 20 static v8::Isolate* GetIsolate(IFXJS_Context* cc) 21 { 22 CJS_Context* pContext = (CJS_Context *)cc; 23 ASSERT(pContext != NULL); 24 25 CJS_Runtime* pRuntime = pContext->GetJSRuntime(); 26 ASSERT(pRuntime != NULL); 27 28 return pRuntime->GetIsolate(); 29 } 30 31 /* ---------------------------- TimerObj ---------------------------- */ 32 33 BEGIN_JS_STATIC_CONST(CJS_TimerObj) 34 END_JS_STATIC_CONST() 35 36 BEGIN_JS_STATIC_PROP(CJS_TimerObj) 37 END_JS_STATIC_PROP() 38 39 BEGIN_JS_STATIC_METHOD(CJS_TimerObj) 40 END_JS_STATIC_METHOD() 41 42 IMPLEMENT_JS_CLASS(CJS_TimerObj, TimerObj) 43 44 TimerObj::TimerObj(CJS_Object* pJSObject) 45 : CJS_EmbedObj(pJSObject), 46 m_pTimer(NULL) 47 { 48 49 } 50 51 TimerObj::~TimerObj() 52 { 53 } 54 55 void TimerObj::SetTimer(CJS_Timer* pTimer) 56 { 57 m_pTimer = pTimer; 58 } 59 60 CJS_Timer* TimerObj::GetTimer() const 61 { 62 return m_pTimer; 63 } 64 65 #define JS_STR_VIEWERTYPE_READER L"Reader" 66 #define JS_STR_VIEWERTYPE_STANDARD L"Exchange" 67 #define JS_STR_VIEWERVARIATION L"Full" 68 #define JS_STR_PLATFORM L"WIN" 69 #define JS_STR_LANGUANGE L"ENU" 70 #define JS_STR_VIEWERVERSION 8 71 #define JS_NUM_FORMSVERSION 7 72 73 #define JS_FILEPATH_MAXLEN 2000 74 75 /* ---------------------------- app ---------------------------- */ 76 77 BEGIN_JS_STATIC_CONST(CJS_App) 78 END_JS_STATIC_CONST() 79 80 BEGIN_JS_STATIC_PROP(CJS_App) 81 JS_STATIC_PROP_ENTRY(activeDocs) 82 JS_STATIC_PROP_ENTRY(calculate) 83 JS_STATIC_PROP_ENTRY(formsVersion) 84 JS_STATIC_PROP_ENTRY(fs) 85 JS_STATIC_PROP_ENTRY(fullscreen) 86 JS_STATIC_PROP_ENTRY(language) 87 JS_STATIC_PROP_ENTRY(media) 88 JS_STATIC_PROP_ENTRY(platform) 89 JS_STATIC_PROP_ENTRY(runtimeHighlight) 90 JS_STATIC_PROP_ENTRY(viewerType) 91 JS_STATIC_PROP_ENTRY(viewerVariation) 92 JS_STATIC_PROP_ENTRY(viewerVersion) 93 END_JS_STATIC_PROP() 94 95 BEGIN_JS_STATIC_METHOD(CJS_App) 96 JS_STATIC_METHOD_ENTRY(alert, 6) 97 JS_STATIC_METHOD_ENTRY(beep, 1) 98 JS_STATIC_METHOD_ENTRY(browseForDoc, 0) 99 JS_STATIC_METHOD_ENTRY(clearInterval, 1) 100 JS_STATIC_METHOD_ENTRY(clearTimeOut, 1) 101 JS_STATIC_METHOD_ENTRY(execDialog, 3) 102 JS_STATIC_METHOD_ENTRY(execMenuItem, 1) 103 JS_STATIC_METHOD_ENTRY(findComponent, 1) 104 JS_STATIC_METHOD_ENTRY(goBack, 0) 105 JS_STATIC_METHOD_ENTRY(goForward, 0) 106 JS_STATIC_METHOD_ENTRY(launchURL, 0) 107 JS_STATIC_METHOD_ENTRY(mailMsg, 0) 108 JS_STATIC_METHOD_ENTRY(newFDF, 0) 109 JS_STATIC_METHOD_ENTRY(newDoc, 0) 110 JS_STATIC_METHOD_ENTRY(openDoc, 0) 111 JS_STATIC_METHOD_ENTRY(openFDF, 5) 112 JS_STATIC_METHOD_ENTRY(popUpMenuEx, 0) 113 JS_STATIC_METHOD_ENTRY(popUpMenu, 0) 114 JS_STATIC_METHOD_ENTRY(response, 0) 115 JS_STATIC_METHOD_ENTRY(setInterval, 2) 116 JS_STATIC_METHOD_ENTRY(setTimeOut, 2) 117 END_JS_STATIC_METHOD() 118 119 IMPLEMENT_JS_CLASS(CJS_App,app) 120 121 app::app(CJS_Object * pJSObject) : CJS_EmbedObj(pJSObject) , 122 m_bCalculate(true), 123 m_pRuntime(NULL), 124 m_bRuntimeHighLight(false) 125 // m_pMenuHead(NULL) 126 { 127 } 128 129 app::~app(void) 130 { 131 for (int i=0,sz=m_aTimer.GetSize(); i<sz; i++) 132 delete m_aTimer[i]; 133 134 m_aTimer.RemoveAll(); 135 } 136 137 FX_BOOL app::activeDocs(OBJ_PROP_PARAMS) 138 { 139 if (vp.IsGetting()) 140 { 141 142 CJS_Context* pContext = (CJS_Context *)cc; 143 ASSERT(pContext != NULL); 144 145 CPDFDoc_Environment* pApp = pContext->GetReaderApp(); 146 ASSERT(pApp != NULL); 147 148 CJS_Runtime* pRuntime = pContext->GetJSRuntime(); 149 ASSERT(pRuntime != NULL); 150 151 CPDFSDK_Document* pCurDoc = pContext->GetReaderDocument(); 152 153 CJS_Array aDocs(pRuntime->GetIsolate()); 154 // int iNumDocs = pApp->CountDocuments(); 155 156 // for(int iIndex = 0; iIndex<iNumDocs; iIndex++) 157 // { 158 CPDFSDK_Document* pDoc = pApp->GetCurrentDoc(); 159 if (pDoc) 160 { 161 CJS_Document * pJSDocument = NULL; 162 163 if (pDoc == pCurDoc) 164 { 165 JSFXObject pObj = JS_GetThisObj(*pRuntime); 166 167 if (JS_GetObjDefnID(pObj) == JS_GetObjDefnID(*pRuntime, L"Document")) 168 { 169 pJSDocument = (CJS_Document*)JS_GetPrivate(pRuntime->GetIsolate(),pObj); 170 } 171 } 172 else 173 { 174 JSFXObject pObj = JS_NewFxDynamicObj(*pRuntime, pContext, JS_GetObjDefnID(*pRuntime,L"Document")); 175 pJSDocument = (CJS_Document*)JS_GetPrivate(pRuntime->GetIsolate(),pObj); 176 ASSERT(pJSDocument != NULL); 177 178 179 // pDocument->AttachDoc(pDoc); 180 } 181 182 aDocs.SetElement(0,CJS_Value(pRuntime->GetIsolate(),pJSDocument)); 183 } 184 // } 185 186 if (aDocs.GetLength() > 0) 187 vp << aDocs; 188 else 189 vp.SetNull(); 190 return TRUE; 191 } 192 return FALSE; 193 } 194 195 FX_BOOL app::calculate(OBJ_PROP_PARAMS) 196 { 197 if (vp.IsSetting()) 198 { 199 bool bVP; 200 vp >> bVP; 201 m_bCalculate = (FX_BOOL)bVP; 202 203 CJS_Context* pContext = (CJS_Context*)cc; 204 ASSERT(pContext != NULL); 205 206 CPDFDoc_Environment* pApp = pContext->GetReaderApp(); 207 ASSERT(pApp != NULL); 208 209 CJS_Runtime* pRuntime = pContext->GetJSRuntime(); 210 ASSERT(pRuntime != NULL); 211 212 CJS_Array aDocs(pRuntime->GetIsolate()); 213 // int iNumDocs = pApp->CountDocuments(); 214 // 215 // for (int iIndex = 0;iIndex < iNumDocs; iIndex++) 216 // { 217 if (CPDFSDK_Document* pDoc = pApp->GetCurrentDoc()) 218 { 219 CPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)pDoc->GetInterForm(); 220 ASSERT(pInterForm != NULL); 221 pInterForm->EnableCalculate((FX_BOOL)m_bCalculate); 222 } 223 // } 224 } 225 else 226 { 227 vp << (bool)m_bCalculate; 228 } 229 230 return TRUE; 231 } 232 233 FX_BOOL app::formsVersion(OBJ_PROP_PARAMS) 234 { 235 if (vp.IsGetting()) 236 { 237 vp << JS_NUM_FORMSVERSION; 238 return TRUE; 239 } 240 241 return FALSE; 242 } 243 244 FX_BOOL app::viewerType(OBJ_PROP_PARAMS) 245 { 246 247 248 249 250 251 252 if (vp.IsGetting()) 253 { 254 // if (pApp->GetAppName() == PHANTOM) 255 // vp << JS_STR_VIEWERTYPE_STANDARD; 256 // else 257 // vp << JS_STR_VIEWERTYPE_READER; 258 vp << L"unknown"; 259 260 //vp << pApp->GetAppTitle(); 261 return TRUE; 262 } 263 264 return FALSE; 265 } 266 267 FX_BOOL app::viewerVariation(OBJ_PROP_PARAMS) 268 { 269 if (vp.IsGetting()) 270 { 271 vp << JS_STR_VIEWERVARIATION; 272 return TRUE; 273 } 274 275 return FALSE; 276 } 277 278 FX_BOOL app::viewerVersion(OBJ_PROP_PARAMS) 279 { 280 if (vp.IsGetting()) 281 { 282 vp << JS_STR_VIEWERVERSION; 283 return TRUE; 284 } 285 286 return FALSE; 287 } 288 289 FX_BOOL app::platform(OBJ_PROP_PARAMS) 290 { 291 if (vp.IsGetting()) 292 { 293 vp << JS_STR_PLATFORM; 294 return TRUE; 295 } 296 297 return FALSE; 298 } 299 300 FX_BOOL app::language(OBJ_PROP_PARAMS) 301 { 302 if (vp.IsGetting()) 303 { 304 vp << JS_STR_LANGUANGE; 305 return TRUE; 306 } 307 308 return FALSE; 309 } 310 311 //creates a new fdf object that contains no data 312 //comment: need reader support 313 //note: 314 //CFDF_Document * CPDFDoc_Environment::NewFDF(); 315 FX_BOOL app::newFDF(OBJ_METHOD_PARAMS) 316 { 317 return TRUE; 318 } 319 //opens a specified pdf document and returns its document object 320 //comment:need reader support 321 //note: as defined in js reference, the proto of this function's fourth parmeters, how old an fdf document while do not show it. 322 //CFDF_Document * CPDFDoc_Environment::OpenFDF(string strPath,bool bUserConv); 323 324 FX_BOOL app::openFDF(OBJ_METHOD_PARAMS) 325 { 326 return TRUE; 327 } 328 329 FX_BOOL app::alert(OBJ_METHOD_PARAMS) 330 { 331 int iSize = params.size(); 332 if (iSize < 1) 333 return FALSE; 334 335 CFX_WideString swMsg = L""; 336 CFX_WideString swTitle = L""; 337 int iIcon = 0; 338 int iType = 0; 339 340 v8::Isolate* isolate = GetIsolate(cc); 341 342 if (iSize == 1) 343 { 344 if (params[0].GetType() == VT_object) 345 { 346 JSObject pObj = params[0]; 347 { 348 v8::Handle<v8::Value> pValue = JS_GetObjectElement(isolate, pObj, L"cMsg"); 349 swMsg = CJS_Value(isolate,pValue,VT_unknown).operator CFX_WideString(); 350 351 pValue = JS_GetObjectElement(isolate,pObj,L"cTitle"); 352 swTitle = CJS_Value(isolate, pValue,VT_unknown).operator CFX_WideString(); 353 354 pValue = JS_GetObjectElement(isolate,pObj,L"nIcon"); 355 iIcon = (int)CJS_Value(isolate,pValue,VT_unknown); 356 357 pValue = JS_GetObjectElement(isolate,pObj,L"nType"); 358 iType = (int)CJS_Value(isolate,pValue,VT_unknown); 359 } 360 361 if (swMsg == L"") 362 { 363 CJS_Array carray(isolate); 364 if (params[0].ConvertToArray(carray)) 365 { 366 int iLenth = carray.GetLength(); 367 CJS_Value* pValue = new CJS_Value(isolate); 368 // if (iLenth == 1) 369 // pValue = new CJS_Value(isolate); 370 // else if (iLenth > 1) 371 // pValue = new CJS_Value[iLenth]; 372 373 for(int i = 0; i < iLenth; i++) 374 { 375 carray.GetElement(i, *pValue); 376 swMsg += (*pValue).operator CFX_WideString(); 377 if (i < iLenth - 1) 378 swMsg += L", "; 379 } 380 381 if(pValue) delete pValue; 382 // if ((iLenth > 1) && pValue) 383 // { 384 // delete[]pValue; 385 // pValue = NULL; 386 // } 387 // else if ((iLenth == 1) && pValue) 388 // { 389 // delete pValue; 390 // pValue = NULL; 391 // } 392 } 393 } 394 395 if (swTitle == L"") 396 swTitle = JSGetStringFromID((CJS_Context*)cc, IDS_STRING_JSALERT); 397 } 398 else if (params[0].GetType() == VT_boolean) 399 { 400 FX_BOOL bGet = (FX_BOOL)params[0]; 401 if (bGet) 402 swMsg = L"true"; 403 else 404 swMsg = L"false"; 405 406 swTitle = JSGetStringFromID((CJS_Context*)cc, IDS_STRING_JSALERT); 407 } 408 else 409 { 410 swMsg = params[0]; 411 swTitle = JSGetStringFromID((CJS_Context*)cc, IDS_STRING_JSALERT); 412 } 413 } 414 else 415 { 416 if (params[0].GetType() == VT_boolean) 417 { 418 FX_BOOL bGet = (FX_BOOL)params[0]; 419 if (bGet) 420 swMsg = L"true"; 421 else 422 swMsg = L"false"; 423 } 424 else 425 { 426 swMsg = params[0]; 427 } 428 swTitle = JSGetStringFromID((CJS_Context*)cc, IDS_STRING_JSALERT); 429 430 for(int i = 1;i<iSize;i++) 431 { 432 if (i == 1) 433 iIcon = int(params[i]); 434 if (i == 2) 435 iType = int(params[i]); 436 if (i == 3) 437 swTitle = params[i]; 438 } 439 } 440 441 442 CJS_Context* pContext = (CJS_Context*)cc; 443 ASSERT(pContext != NULL); 444 CJS_Runtime* pRuntime = pContext->GetJSRuntime(); 445 ASSERT(pRuntime != NULL); 446 pRuntime->BeginBlock(); 447 vRet = MsgBox(pRuntime->GetReaderApp(), JSGetPageView(cc),swMsg,swTitle,iType,iIcon); 448 pRuntime->EndBlock(); 449 450 return TRUE; 451 } 452 453 454 FX_BOOL app::beep(OBJ_METHOD_PARAMS) 455 { 456 if (params.size() == 1) 457 { 458 CJS_Context* pContext = (CJS_Context*)cc; 459 CJS_Runtime* pRuntime = pContext->GetJSRuntime(); 460 CPDFDoc_Environment * pEnv = pRuntime->GetReaderApp(); 461 pEnv->JS_appBeep((int)params[0]); 462 463 return TRUE; 464 } 465 else 466 { 467 sError = JSGetStringFromID((CJS_Context*)cc, IDS_STRING_JSPARAMERROR); 468 return FALSE; 469 } 470 } 471 472 FX_BOOL app::findComponent(OBJ_METHOD_PARAMS) 473 { 474 return TRUE; 475 } 476 477 FX_BOOL app::popUpMenuEx(OBJ_METHOD_PARAMS) 478 { 479 return FALSE; 480 } 481 482 FX_BOOL app::fs(OBJ_PROP_PARAMS) 483 { 484 #ifdef FOXIT_CHROME_BUILD 485 return FALSE; 486 #else 487 CJS_Context* pContext = (CJS_Context*)cc; 488 ASSERT(pContext != NULL); 489 CJS_Runtime* pRuntime = pContext->GetJSRuntime(); 490 ASSERT(pRuntime != NULL); 491 492 if (vp.IsGetting()) 493 { 494 return TRUE; 495 } 496 else 497 { 498 return TRUE; 499 } 500 #endif 501 } 502 503 FX_BOOL app::setInterval(OBJ_METHOD_PARAMS) 504 { 505 if (params.size() > 2 || params.size() == 0) 506 { 507 sError = JSGetStringFromID((CJS_Context*)cc, IDS_STRING_JSPARAMERROR); 508 return FALSE; 509 } 510 511 CJS_Context* pContext = (CJS_Context*)cc; 512 ASSERT(pContext != NULL); 513 CJS_Runtime* pRuntime = pContext->GetJSRuntime(); 514 ASSERT(pRuntime != NULL); 515 516 CFX_WideString script = params.size() > 0 ? (FX_LPCWSTR)(params[0].operator CFX_WideString()) : (FX_LPCWSTR)L""; 517 if (script.IsEmpty()) 518 { 519 sError = JSGetStringFromID((CJS_Context*)cc, IDS_STRING_JSAFNUMBER_KEYSTROKE); 520 return TRUE; 521 } 522 523 FX_DWORD dwInterval = params.size() > 1 ? (int)params[1] : 1000; 524 525 CPDFDoc_Environment* pApp = pRuntime->GetReaderApp(); 526 ASSERT(pApp); 527 CJS_Timer* pTimer = new CJS_Timer(this, pApp); 528 m_aTimer.Add(pTimer); 529 530 pTimer->SetType(0); 531 pTimer->SetRuntime(pRuntime); 532 pTimer->SetJScript(script); 533 pTimer->SetTimeOut(0); 534 // pTimer->SetStartTime(GetTickCount()); 535 pTimer->SetJSTimer(dwInterval); 536 537 JSFXObject pRetObj = JS_NewFxDynamicObj(*pRuntime, pContext, JS_GetObjDefnID(*pRuntime, L"TimerObj")); 538 539 CJS_TimerObj* pJS_TimerObj = (CJS_TimerObj*)JS_GetPrivate(pRuntime->GetIsolate(),pRetObj); 540 ASSERT(pJS_TimerObj != NULL); 541 542 TimerObj* pTimerObj = (TimerObj*)pJS_TimerObj->GetEmbedObject(); 543 ASSERT(pTimerObj != NULL); 544 545 pTimerObj->SetTimer(pTimer); 546 547 vRet = pRetObj; 548 549 return TRUE; 550 } 551 552 FX_BOOL app::setTimeOut(OBJ_METHOD_PARAMS) 553 { 554 if (params.size() > 2 || params.size() == 0) 555 { 556 sError = JSGetStringFromID((CJS_Context*)cc, IDS_STRING_JSPARAMERROR); 557 return FALSE; 558 } 559 560 CJS_Context* pContext = (CJS_Context*)cc; 561 ASSERT(pContext != NULL); 562 CJS_Runtime* pRuntime = pContext->GetJSRuntime(); 563 ASSERT(pRuntime != NULL); 564 565 CFX_WideString script = params.size() > 0 ? (FX_LPCWSTR)(params[0].operator CFX_WideString()) : (FX_LPCWSTR)L""; 566 if (script.IsEmpty()) 567 { 568 sError = JSGetStringFromID((CJS_Context*)cc, IDS_STRING_JSAFNUMBER_KEYSTROKE); 569 return TRUE; 570 } 571 572 FX_DWORD dwTimeOut = params.size() > 1 ? (int)params[1] : 1000; 573 574 CPDFDoc_Environment* pApp = pRuntime->GetReaderApp(); 575 ASSERT(pApp); 576 CJS_Timer* pTimer = new CJS_Timer(this, pApp); 577 m_aTimer.Add(pTimer); 578 579 pTimer->SetType(1); 580 pTimer->SetRuntime(pRuntime); 581 pTimer->SetJScript(script); 582 pTimer->SetTimeOut(dwTimeOut); 583 // pTimer->SetStartTime(GetTickCount()); 584 // pTimer->SetJSTimer(1000); 585 pTimer->SetJSTimer(dwTimeOut); 586 587 JSFXObject pRetObj = JS_NewFxDynamicObj(*pRuntime, pContext, JS_GetObjDefnID(*pRuntime, L"TimerObj")); 588 // ASSERT(pRetObj != NULL); 589 590 CJS_TimerObj* pJS_TimerObj = (CJS_TimerObj*)JS_GetPrivate(pRuntime->GetIsolate(),pRetObj); 591 ASSERT(pJS_TimerObj != NULL); 592 593 TimerObj* pTimerObj = (TimerObj*)pJS_TimerObj->GetEmbedObject(); 594 ASSERT(pTimerObj != NULL); 595 596 pTimerObj->SetTimer(pTimer); 597 598 vRet = pRetObj; 599 600 return TRUE; 601 } 602 603 FX_BOOL app::clearTimeOut(OBJ_METHOD_PARAMS) 604 { 605 CJS_Context* pContext = (CJS_Context*)cc; 606 ASSERT(pContext != NULL); 607 CJS_Runtime* pRuntime = pContext->GetJSRuntime(); 608 ASSERT(pRuntime != NULL); 609 610 if (params.size() != 1) 611 { 612 sError = JSGetStringFromID((CJS_Context*)cc, IDS_STRING_JSPARAMERROR); 613 return FALSE; 614 } 615 616 if (params[0].GetType() == VT_fxobject) 617 { 618 JSFXObject pObj = (JSFXObject)params[0]; 619 { 620 if (JS_GetObjDefnID(pObj) == JS_GetObjDefnID(*pRuntime, L"TimerObj")) 621 { 622 if (CJS_Object* pJSObj = (CJS_Object*)params[0]) 623 { 624 if (TimerObj* pTimerObj = (TimerObj*)pJSObj->GetEmbedObject()) 625 { 626 if (CJS_Timer* pTimer = pTimerObj->GetTimer()) 627 { 628 pTimer->KillJSTimer(); 629 630 for (int i=0,sz=m_aTimer.GetSize(); i<sz; i++) 631 { 632 if (m_aTimer[i] == pTimer) 633 { 634 m_aTimer.RemoveAt(i); 635 break; 636 } 637 } 638 639 delete pTimer; 640 pTimerObj->SetTimer(NULL); 641 } 642 } 643 } 644 } 645 } 646 } 647 648 return TRUE; 649 } 650 651 FX_BOOL app::clearInterval(OBJ_METHOD_PARAMS) 652 { 653 CJS_Context* pContext = (CJS_Context*)cc; 654 ASSERT(pContext != NULL); 655 CJS_Runtime* pRuntime = pContext->GetJSRuntime(); 656 ASSERT(pRuntime != NULL); 657 658 if (params.size() != 1) 659 { 660 sError = JSGetStringFromID((CJS_Context*)cc, IDS_STRING_JSPARAMERROR); 661 return FALSE; 662 } 663 664 if (params[0].GetType() == VT_fxobject) 665 { 666 JSFXObject pObj = (JSFXObject)params[0]; 667 { 668 if (JS_GetObjDefnID(pObj) == JS_GetObjDefnID(*pRuntime, L"TimerObj")) 669 { 670 if (CJS_Object* pJSObj = (CJS_Object*)params[0]) 671 { 672 if (TimerObj* pTimerObj = (TimerObj*)pJSObj->GetEmbedObject()) 673 { 674 if (CJS_Timer* pTimer = pTimerObj->GetTimer()) 675 { 676 pTimer->KillJSTimer(); 677 678 for (int i=0,sz=m_aTimer.GetSize(); i<sz; i++) 679 { 680 if (m_aTimer[i] == pTimer) 681 { 682 m_aTimer.RemoveAt(i); 683 break; 684 } 685 } 686 687 delete pTimer; 688 pTimerObj->SetTimer(NULL); 689 } 690 } 691 } 692 } 693 } 694 } 695 696 return TRUE; 697 } 698 699 FX_BOOL app::execMenuItem(OBJ_METHOD_PARAMS) 700 { 701 return FALSE; 702 } 703 704 void app::TimerProc(CJS_Timer* pTimer) 705 { 706 ASSERT(pTimer != NULL); 707 708 switch (pTimer->GetType()) 709 { 710 case 0: //interval 711 RunJsScript(pTimer->GetRuntime(), pTimer->GetJScript()); 712 break; 713 case 1: 714 if (pTimer->GetTimeOut() > 0) 715 { 716 RunJsScript(pTimer->GetRuntime(), pTimer->GetJScript()); 717 pTimer->KillJSTimer(); 718 } 719 break; 720 } 721 722 } 723 724 void app::RunJsScript(CJS_Runtime* pRuntime,const CFX_WideString& wsScript) 725 { 726 ASSERT(pRuntime != NULL); 727 728 if (!pRuntime->IsBlocking()) 729 { 730 IFXJS_Context* pContext = pRuntime->NewContext(); 731 ASSERT(pContext != NULL); 732 pContext->OnExternal_Exec(); 733 CFX_WideString wtInfo; 734 pContext->RunScript(wsScript,wtInfo); 735 pRuntime->ReleaseContext(pContext); 736 } 737 } 738 739 FX_BOOL app::goBack(OBJ_METHOD_PARAMS) 740 { 741 742 743 744 745 746 747 return TRUE; 748 } 749 750 FX_BOOL app::goForward(OBJ_METHOD_PARAMS) 751 { 752 753 754 755 756 757 758 return TRUE; 759 } 760 761 FX_BOOL app::mailMsg(OBJ_METHOD_PARAMS) 762 { 763 CJS_Context* pContext = (CJS_Context*)cc; 764 ASSERT(pContext != NULL); 765 766 v8::Isolate* isolate = GetIsolate(cc); 767 768 FX_BOOL bUI = TRUE; 769 CFX_WideString cTo = L""; 770 CFX_WideString cCc = L""; 771 CFX_WideString cBcc = L""; 772 CFX_WideString cSubject = L""; 773 CFX_WideString cMsg = L""; 774 if(params.size() < 2) 775 return FALSE; 776 777 bUI = params.size()>=1?(int)params[0]:TRUE; 778 cTo = params.size()>=2?(const wchar_t*)(FX_LPCWSTR)params[1].operator CFX_WideString():L""; 779 cCc = params.size()>=3?(const wchar_t*)(FX_LPCWSTR)params[2].operator CFX_WideString():L""; 780 cBcc = params.size()>=4?(const wchar_t*)(FX_LPCWSTR)params[3].operator CFX_WideString():L""; 781 cSubject = params.size()>=5?(const wchar_t*)(FX_LPCWSTR)params[4].operator CFX_WideString():L""; 782 cMsg = params.size()>=6?(const wchar_t*)(FX_LPCWSTR)params[5].operator CFX_WideString():L""; 783 784 785 if (params[0].GetType() == VT_object) 786 { 787 JSObject pObj = (JSObject)params[0]; 788 789 v8::Handle<v8::Value> pValue = JS_GetObjectElement(isolate,pObj, L"bUI"); 790 bUI = (int)CJS_Value(isolate,pValue,GET_VALUE_TYPE(pValue)); 791 792 pValue = JS_GetObjectElement(isolate, pObj, L"cTo"); 793 cTo = CJS_Value(isolate,pValue,GET_VALUE_TYPE(pValue)).operator CFX_WideString(); 794 795 pValue = JS_GetObjectElement(isolate,pObj, L"cCc"); 796 cCc = CJS_Value(isolate,pValue,GET_VALUE_TYPE(pValue)).operator CFX_WideString(); 797 798 pValue = JS_GetObjectElement(isolate,pObj, L"cBcc"); 799 cBcc = CJS_Value(isolate,pValue,GET_VALUE_TYPE(pValue)).operator CFX_WideString(); 800 801 pValue = JS_GetObjectElement(isolate,pObj, L"cSubject"); 802 cSubject = CJS_Value(isolate,pValue,GET_VALUE_TYPE(pValue)).operator CFX_WideString(); 803 804 pValue = JS_GetObjectElement(isolate,pObj, L"cMsg"); 805 cMsg = CJS_Value(isolate,pValue,GET_VALUE_TYPE(pValue)).operator CFX_WideString(); 806 } 807 808 809 810 CJS_Runtime* pRuntime = pContext->GetJSRuntime(); 811 ASSERT(pRuntime != NULL); 812 813 CPDFDoc_Environment* pApp = pContext->GetReaderApp(); 814 ASSERT(pApp != NULL); 815 816 pRuntime->BeginBlock(); 817 pApp->JS_docmailForm(NULL, 0, bUI, (FX_LPCWSTR)cTo, (FX_LPCWSTR)cSubject, (FX_LPCWSTR)cCc, (FX_LPCWSTR)cBcc, (FX_LPCWSTR)cMsg); 818 /////////////////////////////////////////////////////////////////////////////////////////////// 819 pRuntime->EndBlock(); 820 821 //return bRet; 822 return FALSE; 823 } 824 825 FX_BOOL app::launchURL(OBJ_METHOD_PARAMS) 826 { 827 if (IsSafeMode(cc)) return TRUE; 828 829 CJS_Context* pContext = (CJS_Context*)cc; 830 ASSERT(pContext != NULL); 831 832 833 834 835 CFX_WideString swURL = params[0].operator CFX_WideString(); 836 837 CJS_Runtime* pRuntime = pContext->GetJSRuntime(); 838 ASSERT(pRuntime != NULL); 839 840 pRuntime->BeginBlock(); 841 // FX_BOOL bRet = pApp->OpenURL(swURL); 842 pRuntime->EndBlock(); 843 844 // return bRet; 845 return FALSE; 846 } 847 848 FX_BOOL app::runtimeHighlight(OBJ_PROP_PARAMS) 849 { 850 if (vp.IsSetting()) 851 { 852 vp>>m_bRuntimeHighLight; 853 } 854 else 855 { 856 vp<<m_bRuntimeHighLight; 857 } 858 859 return TRUE; 860 } 861 862 FX_BOOL app::fullscreen(OBJ_PROP_PARAMS) 863 { 864 return FALSE; 865 } 866 867 FX_BOOL app::popUpMenu(OBJ_METHOD_PARAMS) 868 { 869 return FALSE; 870 } 871 872 873 FX_BOOL app::browseForDoc(OBJ_METHOD_PARAMS) 874 { 875 //This method may trigger a "file save" dialog,while enable user to save contents of the document. 876 //Such action is considered to be unsafe. 877 if (IsSafeMode(cc)) return TRUE; 878 879 v8::Isolate* isolate = GetIsolate(cc); 880 881 bool bSave = false; 882 CFX_ByteString cFilenameInit = CFX_ByteString(); 883 CFX_ByteString cFSInit = CFX_ByteString(); 884 885 if(params.size()>0 && (params[0].GetType() == VT_object)) 886 { 887 JSObject pObj = (JSObject )params[0]; 888 889 v8::Handle<v8::Value> pValue = JS_GetObjectElement(isolate,pObj,L"bSave"); 890 bSave = (bool)CJS_Value(isolate,pValue,GET_VALUE_TYPE(pValue)); 891 892 pValue = JS_GetObjectElement(isolate, pObj,L"cFilenameInit"); 893 { 894 CJS_Value t = CJS_Value(isolate, pValue, GET_VALUE_TYPE(pValue)); 895 cFilenameInit = t.operator CFX_ByteString(); 896 } 897 898 pValue = JS_GetObjectElement(isolate,pObj,L"cFSInit"); 899 { 900 CJS_Value t = CJS_Value(isolate, pValue, GET_VALUE_TYPE(pValue)); 901 cFSInit = t.operator CFX_ByteString(); 902 } 903 } 904 else 905 { 906 if(params.size() >= 1) 907 { 908 bSave = (bool)params[0]; 909 } 910 if(params.size() >= 2) 911 { 912 CJS_Value t = params[1]; 913 cFilenameInit = t.operator CFX_ByteString(); 914 } 915 if(params.size() >= 3) 916 { 917 CJS_Value t = params[2]; 918 cFSInit = t.operator CFX_ByteString(); 919 } 920 } 921 CJS_Context* pContext = (CJS_Context *)cc; 922 ASSERT(pContext != NULL); 923 924 CPDFDoc_Environment* pApp = pContext->GetReaderApp(); 925 ASSERT(pApp != NULL); 926 927 CJS_Runtime* pRuntime = pContext->GetJSRuntime(); 928 ASSERT(pRuntime != NULL); 929 930 CFX_WideString wsFileNameInit = CFX_WideString::FromLocal(cFilenameInit); 931 CFX_WideString wsFSInit = CFX_WideString::FromLocal(cFSInit); 932 CFX_WideString wsFilePath = pApp->JS_appbrowseForDoc(bSave, wsFileNameInit); 933 if(wsFilePath.IsEmpty()) 934 return FALSE; 935 936 JSFXObject pRetObj = JS_NewFxDynamicObj(*pRuntime, pContext, -1); 937 938 JS_PutObjectString(isolate,pRetObj, L"cPath", SysPathToPDFPath(wsFilePath)); 939 JS_PutObjectString(isolate,pRetObj, L"cURL", SysPathToPDFPath(wsFilePath)); 940 941 if (!cFSInit.IsEmpty()) 942 { 943 JS_PutObjectString(isolate,pRetObj, L"cFS", CFX_WideString::FromLocal(cFSInit.GetBuffer(cFSInit.GetLength()))); 944 } 945 else 946 { 947 JS_PutObjectString(isolate,pRetObj, L"cFS", CFX_WideString::FromLocal("DOS")); 948 } 949 950 vRet = pRetObj; 951 952 return TRUE; 953 } 954 955 CFX_WideString app::SysPathToPDFPath(const CFX_WideString& sOldPath) 956 { 957 CFX_WideString sRet = L"/"; 958 959 for (int i=0,sz=sOldPath.GetLength(); i<sz; i++) 960 { 961 wchar_t c = sOldPath.GetAt(i); 962 if (c == L':') 963 { 964 } 965 else 966 { 967 if (c == L'\\') 968 { 969 sRet += L"/"; 970 } 971 else 972 { 973 sRet += c; 974 } 975 } 976 } 977 978 return sRet; 979 } 980 981 CFX_WideString app::PDFPathToSysPath(const CFX_WideString& sOldPath) 982 { 983 //strLPath = "D:\temporay.fdf"; 984 CFX_WideString strOPath = sOldPath; 985 strOPath.TrimLeft(); 986 strOPath.TrimRight(); 987 988 if (strOPath.GetAt(0) == L'/' && strOPath.GetAt(2) == L'/') 989 { 990 wchar_t c_Drive = strOPath.GetAt(1); 991 if ((c_Drive >= L'a' && c_Drive <= L'z' )||( c_Drive >= L'A' && c_Drive <= L'Z')) 992 { 993 strOPath.Replace((FX_LPCWSTR)L"/",(FX_LPCWSTR)L"\\"); 994 //strOPath.SetAt(0,''); 995 strOPath.Insert(2,':'); 996 strOPath.Delete(0); 997 } 998 } 999 1000 return strOPath; 1001 } 1002 1003 CFX_WideString app::RelativePathToSysPath(const CFX_WideString& sOldPath, const CFX_WideString& sFilePath) 1004 { 1005 // if (!PathIsRelative(sOldPath)) return sOldPath; 1006 1007 int nSplit = 0; 1008 for (int i=sFilePath.GetLength()-1; i>=0; i--) 1009 { 1010 if (sFilePath[i] == '\\' || sFilePath[i] == '/') 1011 { 1012 nSplit = i; 1013 break; 1014 } 1015 } 1016 1017 return sFilePath.Left(nSplit+1) + sOldPath; 1018 } 1019 1020 FX_BOOL app::newDoc(OBJ_METHOD_PARAMS) 1021 { 1022 return FALSE; 1023 } 1024 1025 FX_BOOL app::openDoc(OBJ_METHOD_PARAMS) 1026 { 1027 return FALSE; 1028 } 1029 1030 FX_BOOL app::response(OBJ_METHOD_PARAMS) 1031 { 1032 CFX_WideString swQuestion = L""; 1033 CFX_WideString swLabel = L""; 1034 #ifndef FOXIT_CHROME_BUILD 1035 CFX_WideString swTitle = L"Foxit"; 1036 #else 1037 CFX_WideString swTitle = L"PDF"; 1038 #endif 1039 CFX_WideString swDefault = L""; 1040 CFX_WideString swResponse = L""; 1041 bool bPassWord = false; 1042 1043 v8::Isolate* isolate = GetIsolate(cc); 1044 1045 int iLength = params.size(); 1046 if (iLength > 0 && params[0].GetType() == VT_object) 1047 { 1048 1049 JSObject pObj = (JSObject )params[0]; 1050 v8::Handle<v8::Value> pValue = JS_GetObjectElement(isolate,pObj,L"cQuestion"); 1051 swQuestion = CJS_Value(isolate,pValue,GET_VALUE_TYPE(pValue)).operator CFX_WideString(); 1052 1053 pValue = JS_GetObjectElement(isolate,pObj,L"cTitle"); 1054 swTitle = CJS_Value(isolate,pValue,GET_VALUE_TYPE(pValue)).operator CFX_WideString(); 1055 1056 pValue = JS_GetObjectElement(isolate,pObj,L"cDefault"); 1057 swDefault = CJS_Value(isolate,pValue,GET_VALUE_TYPE(pValue)).operator CFX_WideString(); 1058 1059 pValue = JS_GetObjectElement(isolate,pObj,L"cLabel"); 1060 swLabel = CJS_Value(isolate,pValue,GET_VALUE_TYPE(pValue)).operator CFX_WideString(); 1061 1062 pValue = JS_GetObjectElement(isolate,pObj,L"bPassword"); 1063 bPassWord = (bool)CJS_Value(isolate,pValue,GET_VALUE_TYPE(pValue)); 1064 } 1065 else 1066 { 1067 switch(iLength) 1068 { 1069 case 1: 1070 swQuestion = params[0]; 1071 break; 1072 case 2: 1073 swQuestion = params[0]; 1074 swTitle = params[1]; 1075 break; 1076 case 3: 1077 swQuestion = params[0]; 1078 swTitle = params[1]; 1079 swDefault = params[2]; 1080 break; 1081 case 4: 1082 swQuestion = params[0]; 1083 swTitle = params[1]; 1084 swDefault = params[2]; 1085 bPassWord = params[3]; 1086 break; 1087 case 5: 1088 swQuestion = params[0]; 1089 swTitle = params[1]; 1090 swDefault = params[2]; 1091 bPassWord = params[3]; 1092 swLabel = params[4]; 1093 break; 1094 default: 1095 break; 1096 } 1097 } 1098 1099 CJS_Context* pContext = (CJS_Context *)cc; 1100 ASSERT(pContext != NULL); 1101 1102 CPDFDoc_Environment* pApp = pContext->GetReaderApp(); 1103 ASSERT(pApp != NULL); 1104 int nLength = 2048; 1105 char* pBuff = new char[nLength]; 1106 nLength = pApp->JS_appResponse(swQuestion, swTitle, swDefault, swLabel, bPassWord, pBuff, nLength); 1107 if(nLength<=0) 1108 { 1109 vRet.SetNull(); 1110 return FALSE; 1111 } 1112 else 1113 { 1114 nLength = nLength>2046?2046:nLength; 1115 pBuff[nLength] = 0; 1116 pBuff[nLength+1] = 0; 1117 swResponse = CFX_WideString::FromUTF16LE((unsigned short*)pBuff, nLength); 1118 vRet = swResponse; 1119 } 1120 delete[] pBuff; 1121 1122 return TRUE; 1123 } 1124 1125 FX_BOOL app::media(OBJ_PROP_PARAMS) 1126 { 1127 return FALSE; 1128 } 1129 1130 FX_BOOL app::execDialog(OBJ_METHOD_PARAMS) 1131 { 1132 return TRUE; 1133 } 1134 1135