Home | History | Annotate | Download | only in javascript
      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 "JS_Context.h"
      8 
      9 #include "JS_EventHandler.h"
     10 #include "JS_Runtime.h"
     11 #include "fpdfsdk/include/javascript/IJavaScript.h"
     12 #include "resource.h"
     13 
     14 /* -------------------------- CJS_Context -------------------------- */
     15 
     16 CJS_Context::CJS_Context(CJS_Runtime* pRuntime)
     17     : m_pRuntime(pRuntime), m_bBusy(FALSE), m_bMsgBoxEnable(TRUE) {
     18   m_pEventHandler = new CJS_EventHandler(this);
     19 }
     20 
     21 CJS_Context::~CJS_Context() {
     22   delete m_pEventHandler;
     23 }
     24 
     25 CPDFSDK_Document* CJS_Context::GetReaderDocument() {
     26   return m_pRuntime->GetReaderDocument();
     27 }
     28 
     29 CPDFDoc_Environment* CJS_Context::GetReaderApp() {
     30   return m_pRuntime->GetReaderApp();
     31 }
     32 
     33 FX_BOOL CJS_Context::RunScript(const CFX_WideString& script,
     34                                CFX_WideString* info) {
     35   v8::Isolate::Scope isolate_scope(m_pRuntime->GetIsolate());
     36 #ifdef PDF_ENABLE_XFA
     37   v8::Locker locker(m_pRuntime->GetIsolate());
     38 #endif  // PDF_ENABLE_XFA
     39   v8::HandleScope handle_scope(m_pRuntime->GetIsolate());
     40   v8::Local<v8::Context> context = m_pRuntime->NewJSContext();
     41   v8::Context::Scope context_scope(context);
     42 
     43   if (m_bBusy) {
     44     *info = JSGetStringFromID(this, IDS_STRING_JSBUSY);
     45     return FALSE;
     46   }
     47   m_bBusy = TRUE;
     48 
     49   ASSERT(m_pEventHandler->IsValid());
     50   CJS_Runtime::FieldEvent event(m_pEventHandler->TargetName(),
     51                                 m_pEventHandler->EventType());
     52   if (!m_pRuntime->AddEventToSet(event)) {
     53     *info = JSGetStringFromID(this, IDS_STRING_JSEVENT);
     54     return FALSE;
     55   }
     56 
     57   CFX_WideString sErrorMessage;
     58   int nRet = 0;
     59   if (script.GetLength() > 0) {
     60     nRet = m_pRuntime->Execute(this, script.c_str(), &sErrorMessage);
     61   }
     62 
     63   if (nRet < 0) {
     64     *info += sErrorMessage;
     65   } else {
     66     *info = JSGetStringFromID(this, IDS_STRING_RUN);
     67   }
     68 
     69   m_pRuntime->RemoveEventFromSet(event);
     70   m_pEventHandler->Destroy();
     71   m_bBusy = FALSE;
     72 
     73   return nRet >= 0;
     74 }
     75 
     76 void CJS_Context::OnApp_Init() {
     77   m_pEventHandler->OnApp_Init();
     78 }
     79 
     80 void CJS_Context::OnDoc_Open(CPDFSDK_Document* pDoc,
     81                              const CFX_WideString& strTargetName) {
     82   m_pEventHandler->OnDoc_Open(pDoc, strTargetName);
     83 }
     84 
     85 void CJS_Context::OnDoc_WillPrint(CPDFSDK_Document* pDoc) {
     86   m_pEventHandler->OnDoc_WillPrint(pDoc);
     87 }
     88 
     89 void CJS_Context::OnDoc_DidPrint(CPDFSDK_Document* pDoc) {
     90   m_pEventHandler->OnDoc_DidPrint(pDoc);
     91 }
     92 
     93 void CJS_Context::OnDoc_WillSave(CPDFSDK_Document* pDoc) {
     94   m_pEventHandler->OnDoc_WillSave(pDoc);
     95 }
     96 
     97 void CJS_Context::OnDoc_DidSave(CPDFSDK_Document* pDoc) {
     98   m_pEventHandler->OnDoc_DidSave(pDoc);
     99 }
    100 
    101 void CJS_Context::OnDoc_WillClose(CPDFSDK_Document* pDoc) {
    102   m_pEventHandler->OnDoc_WillClose(pDoc);
    103 }
    104 
    105 void CJS_Context::OnPage_Open(CPDFSDK_Document* pTarget) {
    106   m_pEventHandler->OnPage_Open(pTarget);
    107 }
    108 
    109 void CJS_Context::OnPage_Close(CPDFSDK_Document* pTarget) {
    110   m_pEventHandler->OnPage_Close(pTarget);
    111 }
    112 
    113 void CJS_Context::OnPage_InView(CPDFSDK_Document* pTarget) {
    114   m_pEventHandler->OnPage_InView(pTarget);
    115 }
    116 
    117 void CJS_Context::OnPage_OutView(CPDFSDK_Document* pTarget) {
    118   m_pEventHandler->OnPage_OutView(pTarget);
    119 }
    120 
    121 void CJS_Context::OnField_MouseDown(FX_BOOL bModifier,
    122                                     FX_BOOL bShift,
    123                                     CPDF_FormField* pTarget) {
    124   m_pEventHandler->OnField_MouseDown(bModifier, bShift, pTarget);
    125 }
    126 
    127 void CJS_Context::OnField_MouseEnter(FX_BOOL bModifier,
    128                                      FX_BOOL bShift,
    129                                      CPDF_FormField* pTarget) {
    130   m_pEventHandler->OnField_MouseEnter(bModifier, bShift, pTarget);
    131 }
    132 
    133 void CJS_Context::OnField_MouseExit(FX_BOOL bModifier,
    134                                     FX_BOOL bShift,
    135                                     CPDF_FormField* pTarget) {
    136   m_pEventHandler->OnField_MouseExit(bModifier, bShift, pTarget);
    137 }
    138 
    139 void CJS_Context::OnField_MouseUp(FX_BOOL bModifier,
    140                                   FX_BOOL bShift,
    141                                   CPDF_FormField* pTarget) {
    142   m_pEventHandler->OnField_MouseUp(bModifier, bShift, pTarget);
    143 }
    144 
    145 void CJS_Context::OnField_Focus(FX_BOOL bModifier,
    146                                 FX_BOOL bShift,
    147                                 CPDF_FormField* pTarget,
    148                                 const CFX_WideString& Value) {
    149   m_pEventHandler->OnField_Focus(bModifier, bShift, pTarget, Value);
    150 }
    151 
    152 void CJS_Context::OnField_Blur(FX_BOOL bModifier,
    153                                FX_BOOL bShift,
    154                                CPDF_FormField* pTarget,
    155                                const CFX_WideString& Value) {
    156   m_pEventHandler->OnField_Blur(bModifier, bShift, pTarget, Value);
    157 }
    158 
    159 void CJS_Context::OnField_Calculate(CPDF_FormField* pSource,
    160                                     CPDF_FormField* pTarget,
    161                                     CFX_WideString& Value,
    162                                     FX_BOOL& bRc) {
    163   m_pEventHandler->OnField_Calculate(pSource, pTarget, Value, bRc);
    164 }
    165 
    166 void CJS_Context::OnField_Format(CPDF_FormField* pTarget,
    167                                  CFX_WideString& Value,
    168                                  FX_BOOL bWillCommit) {
    169   m_pEventHandler->OnField_Format(pTarget, Value, bWillCommit);
    170 }
    171 
    172 void CJS_Context::OnField_Keystroke(CFX_WideString& strChange,
    173                                     const CFX_WideString& strChangeEx,
    174                                     FX_BOOL bKeyDown,
    175                                     FX_BOOL bModifier,
    176                                     int& nSelEnd,
    177                                     int& nSelStart,
    178                                     FX_BOOL bShift,
    179                                     CPDF_FormField* pTarget,
    180                                     CFX_WideString& Value,
    181                                     FX_BOOL bWillCommit,
    182                                     FX_BOOL bFieldFull,
    183                                     FX_BOOL& bRc) {
    184   m_pEventHandler->OnField_Keystroke(
    185       strChange, strChangeEx, bKeyDown, bModifier, nSelEnd, nSelStart, bShift,
    186       pTarget, Value, bWillCommit, bFieldFull, bRc);
    187 }
    188 
    189 void CJS_Context::OnField_Validate(CFX_WideString& strChange,
    190                                    const CFX_WideString& strChangeEx,
    191                                    FX_BOOL bKeyDown,
    192                                    FX_BOOL bModifier,
    193                                    FX_BOOL bShift,
    194                                    CPDF_FormField* pTarget,
    195                                    CFX_WideString& Value,
    196                                    FX_BOOL& bRc) {
    197   m_pEventHandler->OnField_Validate(strChange, strChangeEx, bKeyDown, bModifier,
    198                                     bShift, pTarget, Value, bRc);
    199 }
    200 
    201 void CJS_Context::OnScreen_Focus(FX_BOOL bModifier,
    202                                  FX_BOOL bShift,
    203                                  CPDFSDK_Annot* pScreen) {
    204   m_pEventHandler->OnScreen_Focus(bModifier, bShift, pScreen);
    205 }
    206 
    207 void CJS_Context::OnScreen_Blur(FX_BOOL bModifier,
    208                                 FX_BOOL bShift,
    209                                 CPDFSDK_Annot* pScreen) {
    210   m_pEventHandler->OnScreen_Blur(bModifier, bShift, pScreen);
    211 }
    212 
    213 void CJS_Context::OnScreen_Open(FX_BOOL bModifier,
    214                                 FX_BOOL bShift,
    215                                 CPDFSDK_Annot* pScreen) {
    216   m_pEventHandler->OnScreen_Open(bModifier, bShift, pScreen);
    217 }
    218 
    219 void CJS_Context::OnScreen_Close(FX_BOOL bModifier,
    220                                  FX_BOOL bShift,
    221                                  CPDFSDK_Annot* pScreen) {
    222   m_pEventHandler->OnScreen_Close(bModifier, bShift, pScreen);
    223 }
    224 
    225 void CJS_Context::OnScreen_MouseDown(FX_BOOL bModifier,
    226                                      FX_BOOL bShift,
    227                                      CPDFSDK_Annot* pScreen) {
    228   m_pEventHandler->OnScreen_MouseDown(bModifier, bShift, pScreen);
    229 }
    230 
    231 void CJS_Context::OnScreen_MouseUp(FX_BOOL bModifier,
    232                                    FX_BOOL bShift,
    233                                    CPDFSDK_Annot* pScreen) {
    234   m_pEventHandler->OnScreen_MouseUp(bModifier, bShift, pScreen);
    235 }
    236 
    237 void CJS_Context::OnScreen_MouseEnter(FX_BOOL bModifier,
    238                                       FX_BOOL bShift,
    239                                       CPDFSDK_Annot* pScreen) {
    240   m_pEventHandler->OnScreen_MouseEnter(bModifier, bShift, pScreen);
    241 }
    242 
    243 void CJS_Context::OnScreen_MouseExit(FX_BOOL bModifier,
    244                                      FX_BOOL bShift,
    245                                      CPDFSDK_Annot* pScreen) {
    246   m_pEventHandler->OnScreen_MouseExit(bModifier, bShift, pScreen);
    247 }
    248 
    249 void CJS_Context::OnScreen_InView(FX_BOOL bModifier,
    250                                   FX_BOOL bShift,
    251                                   CPDFSDK_Annot* pScreen) {
    252   m_pEventHandler->OnScreen_InView(bModifier, bShift, pScreen);
    253 }
    254 
    255 void CJS_Context::OnScreen_OutView(FX_BOOL bModifier,
    256                                    FX_BOOL bShift,
    257                                    CPDFSDK_Annot* pScreen) {
    258   m_pEventHandler->OnScreen_OutView(bModifier, bShift, pScreen);
    259 }
    260 
    261 void CJS_Context::OnBookmark_MouseUp(CPDF_Bookmark* pBookMark) {
    262   m_pEventHandler->OnBookmark_MouseUp(pBookMark);
    263 }
    264 
    265 void CJS_Context::OnLink_MouseUp(CPDFSDK_Document* pTarget) {
    266   m_pEventHandler->OnLink_MouseUp(pTarget);
    267 }
    268 
    269 void CJS_Context::OnConsole_Exec() {
    270   m_pEventHandler->OnConsole_Exec();
    271 }
    272 
    273 void CJS_Context::OnExternal_Exec() {
    274   m_pEventHandler->OnExternal_Exec();
    275 }
    276 
    277 void CJS_Context::OnBatchExec(CPDFSDK_Document* pTarget) {
    278   m_pEventHandler->OnBatchExec(pTarget);
    279 }
    280 
    281 void CJS_Context::OnMenu_Exec(CPDFSDK_Document* pTarget,
    282                               const CFX_WideString& strTargetName) {
    283   m_pEventHandler->OnMenu_Exec(pTarget, strTargetName);
    284 }
    285