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 "fxjs/cjs_eventhandler.h" 8 9 #include "core/fpdfdoc/cpdf_formfield.h" 10 #include "fxjs/JS_Define.h" 11 #include "fxjs/cjs_document.h" 12 #include "fxjs/cjs_event_context.h" 13 #include "fxjs/cjs_field.h" 14 #include "fxjs/cjs_object.h" 15 #include "fxjs/cjs_runtime.h" 16 17 CJS_EventHandler::CJS_EventHandler(CJS_EventContext* pContext) 18 : m_pJSEventContext(pContext), 19 m_eEventType(JET_UNKNOWN), 20 m_bValid(false), 21 m_pWideStrChange(nullptr), 22 m_nCommitKey(-1), 23 m_bKeyDown(false), 24 m_bModifier(false), 25 m_bShift(false), 26 m_pISelEnd(nullptr), 27 m_nSelEndDu(0), 28 m_pISelStart(nullptr), 29 m_nSelStartDu(0), 30 m_bWillCommit(false), 31 m_pValue(nullptr), 32 m_bFieldFull(false), 33 m_pbRc(nullptr), 34 m_bRcDu(false), 35 m_pTargetBookMark(nullptr), 36 m_pTargetFormFillEnv(nullptr), 37 m_pTargetAnnot(nullptr) {} 38 39 CJS_EventHandler::~CJS_EventHandler() {} 40 41 void CJS_EventHandler::OnApp_Init() { 42 Initial(JET_APP_INIT); 43 } 44 45 void CJS_EventHandler::OnDoc_Open(CPDFSDK_FormFillEnvironment* pFormFillEnv, 46 const WideString& strTargetName) { 47 Initial(JET_DOC_OPEN); 48 m_pTargetFormFillEnv.Reset(pFormFillEnv); 49 m_strTargetName = strTargetName; 50 } 51 52 void CJS_EventHandler::OnDoc_WillPrint( 53 CPDFSDK_FormFillEnvironment* pFormFillEnv) { 54 Initial(JET_DOC_WILLPRINT); 55 m_pTargetFormFillEnv.Reset(pFormFillEnv); 56 } 57 58 void CJS_EventHandler::OnDoc_DidPrint( 59 CPDFSDK_FormFillEnvironment* pFormFillEnv) { 60 Initial(JET_DOC_DIDPRINT); 61 m_pTargetFormFillEnv.Reset(pFormFillEnv); 62 } 63 64 void CJS_EventHandler::OnDoc_WillSave( 65 CPDFSDK_FormFillEnvironment* pFormFillEnv) { 66 Initial(JET_DOC_WILLSAVE); 67 m_pTargetFormFillEnv.Reset(pFormFillEnv); 68 } 69 70 void CJS_EventHandler::OnDoc_DidSave( 71 CPDFSDK_FormFillEnvironment* pFormFillEnv) { 72 Initial(JET_DOC_DIDSAVE); 73 m_pTargetFormFillEnv.Reset(pFormFillEnv); 74 } 75 76 void CJS_EventHandler::OnDoc_WillClose( 77 CPDFSDK_FormFillEnvironment* pFormFillEnv) { 78 Initial(JET_DOC_WILLCLOSE); 79 m_pTargetFormFillEnv.Reset(pFormFillEnv); 80 } 81 82 void CJS_EventHandler::OnPage_Open(CPDFSDK_FormFillEnvironment* pFormFillEnv) { 83 Initial(JET_PAGE_OPEN); 84 m_pTargetFormFillEnv.Reset(pFormFillEnv); 85 } 86 87 void CJS_EventHandler::OnPage_Close(CPDFSDK_FormFillEnvironment* pFormFillEnv) { 88 Initial(JET_PAGE_CLOSE); 89 m_pTargetFormFillEnv.Reset(pFormFillEnv); 90 } 91 92 void CJS_EventHandler::OnPage_InView( 93 CPDFSDK_FormFillEnvironment* pFormFillEnv) { 94 Initial(JET_PAGE_INVIEW); 95 m_pTargetFormFillEnv.Reset(pFormFillEnv); 96 } 97 98 void CJS_EventHandler::OnPage_OutView( 99 CPDFSDK_FormFillEnvironment* pFormFillEnv) { 100 Initial(JET_PAGE_OUTVIEW); 101 m_pTargetFormFillEnv.Reset(pFormFillEnv); 102 } 103 104 void CJS_EventHandler::OnField_MouseEnter(bool bModifier, 105 bool bShift, 106 CPDF_FormField* pTarget) { 107 Initial(JET_FIELD_MOUSEENTER); 108 109 m_bModifier = bModifier; 110 m_bShift = bShift; 111 112 m_strTargetName = pTarget->GetFullName(); 113 } 114 115 void CJS_EventHandler::OnField_MouseExit(bool bModifier, 116 bool bShift, 117 CPDF_FormField* pTarget) { 118 Initial(JET_FIELD_MOUSEEXIT); 119 120 m_bModifier = bModifier; 121 m_bShift = bShift; 122 m_strTargetName = pTarget->GetFullName(); 123 } 124 125 void CJS_EventHandler::OnField_MouseDown(bool bModifier, 126 bool bShift, 127 CPDF_FormField* pTarget) { 128 Initial(JET_FIELD_MOUSEDOWN); 129 m_eEventType = JET_FIELD_MOUSEDOWN; 130 131 m_bModifier = bModifier; 132 m_bShift = bShift; 133 m_strTargetName = pTarget->GetFullName(); 134 } 135 136 void CJS_EventHandler::OnField_MouseUp(bool bModifier, 137 bool bShift, 138 CPDF_FormField* pTarget) { 139 Initial(JET_FIELD_MOUSEUP); 140 141 m_bModifier = bModifier; 142 m_bShift = bShift; 143 m_strTargetName = pTarget->GetFullName(); 144 } 145 146 void CJS_EventHandler::OnField_Focus(bool bModifier, 147 bool bShift, 148 CPDF_FormField* pTarget, 149 const WideString& Value) { 150 Initial(JET_FIELD_FOCUS); 151 152 m_bModifier = bModifier; 153 m_bShift = bShift; 154 m_strTargetName = pTarget->GetFullName(); 155 m_pValue = (WideString*)&Value; 156 } 157 158 void CJS_EventHandler::OnField_Blur(bool bModifier, 159 bool bShift, 160 CPDF_FormField* pTarget, 161 const WideString& Value) { 162 Initial(JET_FIELD_BLUR); 163 164 m_bModifier = bModifier; 165 m_bShift = bShift; 166 m_strTargetName = pTarget->GetFullName(); 167 m_pValue = (WideString*)&Value; 168 } 169 170 void CJS_EventHandler::OnField_Keystroke(WideString& strChange, 171 const WideString& strChangeEx, 172 bool KeyDown, 173 bool bModifier, 174 int& nSelEnd, 175 int& nSelStart, 176 bool bShift, 177 CPDF_FormField* pTarget, 178 WideString& Value, 179 bool bWillCommit, 180 bool bFieldFull, 181 bool& bRc) { 182 Initial(JET_FIELD_KEYSTROKE); 183 184 m_nCommitKey = 0; 185 m_pWideStrChange = &strChange; 186 m_WideStrChangeEx = strChangeEx; 187 m_bKeyDown = KeyDown; 188 m_bModifier = bModifier; 189 m_pISelEnd = &nSelEnd; 190 m_pISelStart = &nSelStart; 191 m_bShift = bShift; 192 m_strTargetName = pTarget->GetFullName(); 193 m_pValue = &Value; 194 m_bWillCommit = bWillCommit; 195 m_pbRc = &bRc; 196 m_bFieldFull = bFieldFull; 197 } 198 199 void CJS_EventHandler::OnField_Validate(WideString& strChange, 200 const WideString& strChangeEx, 201 bool bKeyDown, 202 bool bModifier, 203 bool bShift, 204 CPDF_FormField* pTarget, 205 WideString& Value, 206 bool& bRc) { 207 Initial(JET_FIELD_VALIDATE); 208 209 m_pWideStrChange = &strChange; 210 m_WideStrChangeEx = strChangeEx; 211 m_bKeyDown = bKeyDown; 212 m_bModifier = bModifier; 213 m_bShift = bShift; 214 m_strTargetName = pTarget->GetFullName(); 215 m_pValue = &Value; 216 m_pbRc = &bRc; 217 } 218 219 void CJS_EventHandler::OnField_Calculate(CPDF_FormField* pSource, 220 CPDF_FormField* pTarget, 221 WideString& Value, 222 bool& bRc) { 223 Initial(JET_FIELD_CALCULATE); 224 225 if (pSource) 226 m_strSourceName = pSource->GetFullName(); 227 m_strTargetName = pTarget->GetFullName(); 228 m_pValue = &Value; 229 m_pbRc = &bRc; 230 } 231 232 void CJS_EventHandler::OnField_Format(CPDF_FormField* pTarget, 233 WideString& Value, 234 bool bWillCommit) { 235 Initial(JET_FIELD_FORMAT); 236 237 m_nCommitKey = 0; 238 m_strTargetName = pTarget->GetFullName(); 239 m_pValue = &Value; 240 m_bWillCommit = bWillCommit; 241 } 242 243 void CJS_EventHandler::OnScreen_Focus(bool bModifier, 244 bool bShift, 245 CPDFSDK_Annot* pScreen) { 246 Initial(JET_SCREEN_FOCUS); 247 248 m_bModifier = bModifier; 249 m_bShift = bShift; 250 m_pTargetAnnot.Reset(pScreen); 251 } 252 253 void CJS_EventHandler::OnScreen_Blur(bool bModifier, 254 bool bShift, 255 CPDFSDK_Annot* pScreen) { 256 Initial(JET_SCREEN_BLUR); 257 258 m_bModifier = bModifier; 259 m_bShift = bShift; 260 m_pTargetAnnot.Reset(pScreen); 261 } 262 263 void CJS_EventHandler::OnScreen_Open(bool bModifier, 264 bool bShift, 265 CPDFSDK_Annot* pScreen) { 266 Initial(JET_SCREEN_OPEN); 267 268 m_bModifier = bModifier; 269 m_bShift = bShift; 270 m_pTargetAnnot.Reset(pScreen); 271 } 272 273 void CJS_EventHandler::OnScreen_Close(bool bModifier, 274 bool bShift, 275 CPDFSDK_Annot* pScreen) { 276 Initial(JET_SCREEN_CLOSE); 277 278 m_bModifier = bModifier; 279 m_bShift = bShift; 280 m_pTargetAnnot.Reset(pScreen); 281 } 282 283 void CJS_EventHandler::OnScreen_MouseDown(bool bModifier, 284 bool bShift, 285 CPDFSDK_Annot* pScreen) { 286 Initial(JET_SCREEN_MOUSEDOWN); 287 288 m_bModifier = bModifier; 289 m_bShift = bShift; 290 m_pTargetAnnot.Reset(pScreen); 291 } 292 293 void CJS_EventHandler::OnScreen_MouseUp(bool bModifier, 294 bool bShift, 295 CPDFSDK_Annot* pScreen) { 296 Initial(JET_SCREEN_MOUSEUP); 297 298 m_bModifier = bModifier; 299 m_bShift = bShift; 300 m_pTargetAnnot.Reset(pScreen); 301 } 302 303 void CJS_EventHandler::OnScreen_MouseEnter(bool bModifier, 304 bool bShift, 305 CPDFSDK_Annot* pScreen) { 306 Initial(JET_SCREEN_MOUSEENTER); 307 308 m_bModifier = bModifier; 309 m_bShift = bShift; 310 m_pTargetAnnot.Reset(pScreen); 311 } 312 313 void CJS_EventHandler::OnScreen_MouseExit(bool bModifier, 314 bool bShift, 315 CPDFSDK_Annot* pScreen) { 316 Initial(JET_SCREEN_MOUSEEXIT); 317 318 m_bModifier = bModifier; 319 m_bShift = bShift; 320 m_pTargetAnnot.Reset(pScreen); 321 } 322 323 void CJS_EventHandler::OnScreen_InView(bool bModifier, 324 bool bShift, 325 CPDFSDK_Annot* pScreen) { 326 Initial(JET_SCREEN_INVIEW); 327 m_bModifier = bModifier; 328 m_bShift = bShift; 329 m_pTargetAnnot.Reset(pScreen); 330 } 331 332 void CJS_EventHandler::OnScreen_OutView(bool bModifier, 333 bool bShift, 334 CPDFSDK_Annot* pScreen) { 335 Initial(JET_SCREEN_OUTVIEW); 336 m_bModifier = bModifier; 337 m_bShift = bShift; 338 m_pTargetAnnot.Reset(pScreen); 339 } 340 341 void CJS_EventHandler::OnLink_MouseUp( 342 CPDFSDK_FormFillEnvironment* pTargetFormFillEnv) { 343 Initial(JET_LINK_MOUSEUP); 344 m_pTargetFormFillEnv.Reset(pTargetFormFillEnv); 345 } 346 347 void CJS_EventHandler::OnBookmark_MouseUp(CPDF_Bookmark* pBookMark) { 348 Initial(JET_BOOKMARK_MOUSEUP); 349 m_pTargetBookMark = pBookMark; 350 } 351 352 void CJS_EventHandler::OnMenu_Exec( 353 CPDFSDK_FormFillEnvironment* pTargetFormFillEnv, 354 const WideString& strTargetName) { 355 Initial(JET_MENU_EXEC); 356 m_pTargetFormFillEnv.Reset(pTargetFormFillEnv); 357 m_strTargetName = strTargetName; 358 } 359 360 void CJS_EventHandler::OnExternal_Exec() { 361 Initial(JET_EXTERNAL_EXEC); 362 } 363 364 void CJS_EventHandler::OnBatchExec( 365 CPDFSDK_FormFillEnvironment* pTargetFormFillEnv) { 366 Initial(JET_BATCH_EXEC); 367 m_pTargetFormFillEnv.Reset(pTargetFormFillEnv); 368 } 369 370 void CJS_EventHandler::OnConsole_Exec() { 371 Initial(JET_CONSOLE_EXEC); 372 } 373 374 void CJS_EventHandler::Initial(JS_EVENT_T type) { 375 m_eEventType = type; 376 377 m_strTargetName = L""; 378 m_strSourceName = L""; 379 m_pWideStrChange = nullptr; 380 m_WideStrChangeDu = L""; 381 m_WideStrChangeEx = L""; 382 m_nCommitKey = -1; 383 m_bKeyDown = false; 384 m_bModifier = false; 385 m_bShift = false; 386 m_pISelEnd = nullptr; 387 m_nSelEndDu = 0; 388 m_pISelStart = nullptr; 389 m_nSelStartDu = 0; 390 m_bWillCommit = false; 391 m_pValue = nullptr; 392 m_bFieldFull = false; 393 m_pbRc = nullptr; 394 m_bRcDu = false; 395 396 m_pTargetBookMark = nullptr; 397 m_pTargetFormFillEnv.Reset(); 398 m_pTargetAnnot.Reset(); 399 400 m_bValid = true; 401 } 402 403 void CJS_EventHandler::Destroy() { 404 m_bValid = false; 405 } 406 407 bool CJS_EventHandler::IsValid() const { 408 return m_bValid; 409 } 410 411 WideString& CJS_EventHandler::Change() { 412 if (m_pWideStrChange) { 413 return *m_pWideStrChange; 414 } 415 return m_WideStrChangeDu; 416 } 417 418 const WideString& CJS_EventHandler::ChangeEx() { 419 return m_WideStrChangeEx; 420 } 421 422 int CJS_EventHandler::CommitKey() const { 423 return m_nCommitKey; 424 } 425 426 bool CJS_EventHandler::FieldFull() const { 427 return m_bFieldFull; 428 } 429 430 bool CJS_EventHandler::KeyDown() const { 431 return m_bKeyDown; 432 } 433 434 bool CJS_EventHandler::Modifier() const { 435 return m_bModifier; 436 } 437 438 const wchar_t* CJS_EventHandler::Name() const { 439 switch (m_eEventType) { 440 case JET_APP_INIT: 441 return L"Init"; 442 case JET_BATCH_EXEC: 443 return L"Exec"; 444 case JET_BOOKMARK_MOUSEUP: 445 return L"Mouse Up"; 446 case JET_CONSOLE_EXEC: 447 return L"Exec"; 448 case JET_DOC_DIDPRINT: 449 return L"DidPrint"; 450 case JET_DOC_DIDSAVE: 451 return L"DidSave"; 452 case JET_DOC_OPEN: 453 return L"Open"; 454 case JET_DOC_WILLCLOSE: 455 return L"WillClose"; 456 case JET_DOC_WILLPRINT: 457 return L"WillPrint"; 458 case JET_DOC_WILLSAVE: 459 return L"WillSave"; 460 case JET_EXTERNAL_EXEC: 461 return L"Exec"; 462 case JET_FIELD_FOCUS: 463 case JET_SCREEN_FOCUS: 464 return L"Focus"; 465 case JET_FIELD_BLUR: 466 case JET_SCREEN_BLUR: 467 return L"Blur"; 468 case JET_FIELD_MOUSEDOWN: 469 case JET_SCREEN_MOUSEDOWN: 470 return L"Mouse Down"; 471 case JET_FIELD_MOUSEUP: 472 case JET_SCREEN_MOUSEUP: 473 return L"Mouse Up"; 474 case JET_FIELD_MOUSEENTER: 475 case JET_SCREEN_MOUSEENTER: 476 return L"Mouse Enter"; 477 case JET_FIELD_MOUSEEXIT: 478 case JET_SCREEN_MOUSEEXIT: 479 return L"Mouse Exit"; 480 case JET_FIELD_CALCULATE: 481 return L"Calculate"; 482 case JET_FIELD_FORMAT: 483 return L"Format"; 484 case JET_FIELD_KEYSTROKE: 485 return L"Keystroke"; 486 case JET_FIELD_VALIDATE: 487 return L"Validate"; 488 case JET_LINK_MOUSEUP: 489 return L"Mouse Up"; 490 case JET_MENU_EXEC: 491 return L"Exec"; 492 case JET_PAGE_OPEN: 493 case JET_SCREEN_OPEN: 494 return L"Open"; 495 case JET_PAGE_CLOSE: 496 case JET_SCREEN_CLOSE: 497 return L"Close"; 498 case JET_SCREEN_INVIEW: 499 case JET_PAGE_INVIEW: 500 return L"InView"; 501 case JET_PAGE_OUTVIEW: 502 case JET_SCREEN_OUTVIEW: 503 return L"OutView"; 504 default: 505 return L""; 506 } 507 } 508 509 const wchar_t* CJS_EventHandler::Type() const { 510 switch (m_eEventType) { 511 case JET_APP_INIT: 512 return L"App"; 513 case JET_BATCH_EXEC: 514 return L"Batch"; 515 case JET_BOOKMARK_MOUSEUP: 516 return L"BookMark"; 517 case JET_CONSOLE_EXEC: 518 return L"Console"; 519 case JET_DOC_DIDPRINT: 520 case JET_DOC_DIDSAVE: 521 case JET_DOC_OPEN: 522 case JET_DOC_WILLCLOSE: 523 case JET_DOC_WILLPRINT: 524 case JET_DOC_WILLSAVE: 525 return L"Doc"; 526 case JET_EXTERNAL_EXEC: 527 return L"External"; 528 case JET_FIELD_BLUR: 529 case JET_FIELD_FOCUS: 530 case JET_FIELD_MOUSEDOWN: 531 case JET_FIELD_MOUSEENTER: 532 case JET_FIELD_MOUSEEXIT: 533 case JET_FIELD_MOUSEUP: 534 case JET_FIELD_CALCULATE: 535 case JET_FIELD_FORMAT: 536 case JET_FIELD_KEYSTROKE: 537 case JET_FIELD_VALIDATE: 538 return L"Field"; 539 case JET_SCREEN_FOCUS: 540 case JET_SCREEN_BLUR: 541 case JET_SCREEN_OPEN: 542 case JET_SCREEN_CLOSE: 543 case JET_SCREEN_MOUSEDOWN: 544 case JET_SCREEN_MOUSEUP: 545 case JET_SCREEN_MOUSEENTER: 546 case JET_SCREEN_MOUSEEXIT: 547 case JET_SCREEN_INVIEW: 548 case JET_SCREEN_OUTVIEW: 549 return L"Screen"; 550 case JET_LINK_MOUSEUP: 551 return L"Link"; 552 case JET_MENU_EXEC: 553 return L"Menu"; 554 case JET_PAGE_OPEN: 555 case JET_PAGE_CLOSE: 556 case JET_PAGE_INVIEW: 557 case JET_PAGE_OUTVIEW: 558 return L"Page"; 559 default: 560 return L""; 561 } 562 } 563 564 bool& CJS_EventHandler::Rc() { 565 return m_pbRc ? *m_pbRc : m_bRcDu; 566 } 567 568 int CJS_EventHandler::SelEnd() const { 569 return m_pISelEnd ? *m_pISelEnd : m_nSelEndDu; 570 } 571 572 int CJS_EventHandler::SelStart() const { 573 return m_pISelStart ? *m_pISelStart : m_nSelStartDu; 574 } 575 576 void CJS_EventHandler::SetSelEnd(int value) { 577 int& target = m_pISelEnd ? *m_pISelEnd : m_nSelEndDu; 578 target = value; 579 } 580 581 void CJS_EventHandler::SetSelStart(int value) { 582 int& target = m_pISelStart ? *m_pISelStart : m_nSelStartDu; 583 target = value; 584 } 585 586 bool CJS_EventHandler::Shift() const { 587 return m_bShift; 588 } 589 590 Field* CJS_EventHandler::Source() { 591 CJS_Runtime* pRuntime = m_pJSEventContext->GetJSRuntime(); 592 v8::Local<v8::Object> pDocObj = 593 pRuntime->NewFxDynamicObj(CJS_Document::GetObjDefnID()); 594 if (pDocObj.IsEmpty()) 595 return nullptr; 596 597 v8::Local<v8::Object> pFieldObj = 598 pRuntime->NewFxDynamicObj(CJS_Field::GetObjDefnID()); 599 if (pFieldObj.IsEmpty()) 600 return nullptr; 601 602 CJS_Document* pJSDocument = 603 static_cast<CJS_Document*>(pRuntime->GetObjectPrivate(pDocObj)); 604 CJS_Field* pJSField = 605 static_cast<CJS_Field*>(pRuntime->GetObjectPrivate(pFieldObj)); 606 607 Document* pDocument = static_cast<Document*>(pJSDocument->GetEmbedObject()); 608 pDocument->SetFormFillEnv(m_pTargetFormFillEnv 609 ? m_pTargetFormFillEnv.Get() 610 : m_pJSEventContext->GetFormFillEnv()); 611 612 Field* pField = static_cast<Field*>(pJSField->GetEmbedObject()); 613 pField->AttachField(pDocument, m_strSourceName); 614 return pField; 615 } 616 617 Field* CJS_EventHandler::Target_Field() { 618 CJS_Runtime* pRuntime = m_pJSEventContext->GetJSRuntime(); 619 v8::Local<v8::Object> pDocObj = 620 pRuntime->NewFxDynamicObj(CJS_Document::GetObjDefnID()); 621 if (pDocObj.IsEmpty()) 622 return nullptr; 623 624 v8::Local<v8::Object> pFieldObj = 625 pRuntime->NewFxDynamicObj(CJS_Field::GetObjDefnID()); 626 if (pFieldObj.IsEmpty()) 627 return nullptr; 628 629 CJS_Document* pJSDocument = 630 static_cast<CJS_Document*>(pRuntime->GetObjectPrivate(pDocObj)); 631 CJS_Field* pJSField = 632 static_cast<CJS_Field*>(pRuntime->GetObjectPrivate(pFieldObj)); 633 634 Document* pDocument = static_cast<Document*>(pJSDocument->GetEmbedObject()); 635 pDocument->SetFormFillEnv(m_pTargetFormFillEnv 636 ? m_pTargetFormFillEnv.Get() 637 : m_pJSEventContext->GetFormFillEnv()); 638 639 Field* pField = static_cast<Field*>(pJSField->GetEmbedObject()); 640 pField->AttachField(pDocument, m_strTargetName); 641 return pField; 642 } 643 644 WideString& CJS_EventHandler::Value() { 645 return *m_pValue; 646 } 647 648 bool CJS_EventHandler::WillCommit() const { 649 return m_bWillCommit; 650 } 651 652 const WideString& CJS_EventHandler::TargetName() const { 653 return m_strTargetName; 654 } 655