Home | History | Annotate | Download | only in fxjs
      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