Home | History | Annotate | Download | only in fpdfsdk
      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 "fpdfsdk/fsdk_actionhandler.h"
      8 
      9 #include <set>
     10 
     11 #include "core/fpdfapi/parser/cpdf_array.h"
     12 #include "core/fpdfdoc/cpdf_formfield.h"
     13 #include "core/fpdfdoc/cpdf_interform.h"
     14 #include "fpdfsdk/cpdfsdk_formfillenvironment.h"
     15 #include "fpdfsdk/cpdfsdk_interform.h"
     16 #include "fpdfsdk/fsdk_define.h"
     17 #include "fpdfsdk/javascript/ijs_event_context.h"
     18 #include "fpdfsdk/javascript/ijs_runtime.h"
     19 #include "third_party/base/stl_util.h"
     20 
     21 bool CPDFSDK_ActionHandler::DoAction_DocOpen(
     22     const CPDF_Action& action,
     23     CPDFSDK_FormFillEnvironment* pFormFillEnv) {
     24   std::set<CPDF_Dictionary*> visited;
     25   return ExecuteDocumentOpenAction(action, pFormFillEnv, &visited);
     26 }
     27 
     28 bool CPDFSDK_ActionHandler::DoAction_JavaScript(
     29     const CPDF_Action& JsAction,
     30     CFX_WideString csJSName,
     31     CPDFSDK_FormFillEnvironment* pFormFillEnv) {
     32   if (JsAction.GetType() == CPDF_Action::JavaScript) {
     33     CFX_WideString swJS = JsAction.GetJavaScript();
     34     if (!swJS.IsEmpty()) {
     35       RunDocumentOpenJavaScript(pFormFillEnv, csJSName, swJS);
     36       return true;
     37     }
     38   }
     39 
     40   return false;
     41 }
     42 
     43 bool CPDFSDK_ActionHandler::DoAction_FieldJavaScript(
     44     const CPDF_Action& JsAction,
     45     CPDF_AAction::AActionType type,
     46     CPDFSDK_FormFillEnvironment* pFormFillEnv,
     47     CPDF_FormField* pFormField,
     48     PDFSDK_FieldAction& data) {
     49   ASSERT(pFormFillEnv);
     50   if (pFormFillEnv->IsJSInitiated() &&
     51       JsAction.GetType() == CPDF_Action::JavaScript) {
     52     CFX_WideString swJS = JsAction.GetJavaScript();
     53     if (!swJS.IsEmpty()) {
     54       RunFieldJavaScript(pFormFillEnv, pFormField, type, data, swJS);
     55       return true;
     56     }
     57   }
     58   return false;
     59 }
     60 
     61 bool CPDFSDK_ActionHandler::DoAction_Page(
     62     const CPDF_Action& action,
     63     enum CPDF_AAction::AActionType eType,
     64     CPDFSDK_FormFillEnvironment* pFormFillEnv) {
     65   std::set<CPDF_Dictionary*> visited;
     66   return ExecuteDocumentPageAction(action, eType, pFormFillEnv, &visited);
     67 }
     68 
     69 bool CPDFSDK_ActionHandler::DoAction_Document(
     70     const CPDF_Action& action,
     71     enum CPDF_AAction::AActionType eType,
     72     CPDFSDK_FormFillEnvironment* pFormFillEnv) {
     73   std::set<CPDF_Dictionary*> visited;
     74   return ExecuteDocumentPageAction(action, eType, pFormFillEnv, &visited);
     75 }
     76 
     77 bool CPDFSDK_ActionHandler::DoAction_BookMark(
     78     CPDF_Bookmark* pBookMark,
     79     const CPDF_Action& action,
     80     CPDF_AAction::AActionType type,
     81     CPDFSDK_FormFillEnvironment* pFormFillEnv) {
     82   std::set<CPDF_Dictionary*> visited;
     83   return ExecuteBookMark(action, pFormFillEnv, pBookMark, &visited);
     84 }
     85 
     86 bool CPDFSDK_ActionHandler::DoAction_Screen(
     87     const CPDF_Action& action,
     88     CPDF_AAction::AActionType type,
     89     CPDFSDK_FormFillEnvironment* pFormFillEnv,
     90     CPDFSDK_Annot* pScreen) {
     91   std::set<CPDF_Dictionary*> visited;
     92   return ExecuteScreenAction(action, type, pFormFillEnv, pScreen, &visited);
     93 }
     94 
     95 bool CPDFSDK_ActionHandler::DoAction_Link(
     96     const CPDF_Action& action,
     97     CPDFSDK_FormFillEnvironment* pFormFillEnv) {
     98   std::set<CPDF_Dictionary*> visited;
     99   return ExecuteLinkAction(action, pFormFillEnv, &visited);
    100 }
    101 
    102 bool CPDFSDK_ActionHandler::DoAction_Field(
    103     const CPDF_Action& action,
    104     CPDF_AAction::AActionType type,
    105     CPDFSDK_FormFillEnvironment* pFormFillEnv,
    106     CPDF_FormField* pFormField,
    107     PDFSDK_FieldAction& data) {
    108   std::set<CPDF_Dictionary*> visited;
    109   return ExecuteFieldAction(action, type, pFormFillEnv, pFormField, data,
    110                             &visited);
    111 }
    112 
    113 bool CPDFSDK_ActionHandler::ExecuteDocumentOpenAction(
    114     const CPDF_Action& action,
    115     CPDFSDK_FormFillEnvironment* pFormFillEnv,
    116     std::set<CPDF_Dictionary*>* visited) {
    117   CPDF_Dictionary* pDict = action.GetDict();
    118   if (pdfium::ContainsKey(*visited, pDict))
    119     return false;
    120 
    121   visited->insert(pDict);
    122 
    123   ASSERT(pFormFillEnv);
    124   if (action.GetType() == CPDF_Action::JavaScript) {
    125     if (pFormFillEnv->IsJSInitiated()) {
    126       CFX_WideString swJS = action.GetJavaScript();
    127       if (!swJS.IsEmpty()) {
    128         RunDocumentOpenJavaScript(pFormFillEnv, L"", swJS);
    129       }
    130     }
    131   } else {
    132     DoAction_NoJs(action, pFormFillEnv);
    133   }
    134 
    135   for (int32_t i = 0, sz = action.GetSubActionsCount(); i < sz; i++) {
    136     CPDF_Action subaction = action.GetSubAction(i);
    137     if (!ExecuteDocumentOpenAction(subaction, pFormFillEnv, visited))
    138       return false;
    139   }
    140 
    141   return true;
    142 }
    143 
    144 bool CPDFSDK_ActionHandler::ExecuteLinkAction(
    145     const CPDF_Action& action,
    146     CPDFSDK_FormFillEnvironment* pFormFillEnv,
    147     std::set<CPDF_Dictionary*>* visited) {
    148   CPDF_Dictionary* pDict = action.GetDict();
    149   if (pdfium::ContainsKey(*visited, pDict))
    150     return false;
    151 
    152   visited->insert(pDict);
    153 
    154   ASSERT(pFormFillEnv);
    155   if (action.GetType() == CPDF_Action::JavaScript) {
    156     if (pFormFillEnv->IsJSInitiated()) {
    157       CFX_WideString swJS = action.GetJavaScript();
    158       if (!swJS.IsEmpty()) {
    159         IJS_Runtime* pRuntime = pFormFillEnv->GetJSRuntime();
    160         IJS_EventContext* pContext = pRuntime->NewEventContext();
    161         pContext->OnLink_MouseUp(pFormFillEnv);
    162 
    163         CFX_WideString csInfo;
    164         bool bRet = pContext->RunScript(swJS, &csInfo);
    165         pRuntime->ReleaseEventContext(pContext);
    166         if (!bRet) {
    167           // FIXME: return error.
    168         }
    169       }
    170     }
    171   } else {
    172     DoAction_NoJs(action, pFormFillEnv);
    173   }
    174 
    175   for (int32_t i = 0, sz = action.GetSubActionsCount(); i < sz; i++) {
    176     CPDF_Action subaction = action.GetSubAction(i);
    177     if (!ExecuteLinkAction(subaction, pFormFillEnv, visited))
    178       return false;
    179   }
    180 
    181   return true;
    182 }
    183 
    184 bool CPDFSDK_ActionHandler::ExecuteDocumentPageAction(
    185     const CPDF_Action& action,
    186     CPDF_AAction::AActionType type,
    187     CPDFSDK_FormFillEnvironment* pFormFillEnv,
    188     std::set<CPDF_Dictionary*>* visited) {
    189   CPDF_Dictionary* pDict = action.GetDict();
    190   if (pdfium::ContainsKey(*visited, pDict))
    191     return false;
    192 
    193   visited->insert(pDict);
    194 
    195   ASSERT(pFormFillEnv);
    196   if (action.GetType() == CPDF_Action::JavaScript) {
    197     if (pFormFillEnv->IsJSInitiated()) {
    198       CFX_WideString swJS = action.GetJavaScript();
    199       if (!swJS.IsEmpty()) {
    200         RunDocumentPageJavaScript(pFormFillEnv, type, swJS);
    201       }
    202     }
    203   } else {
    204     DoAction_NoJs(action, pFormFillEnv);
    205   }
    206 
    207   if (!IsValidDocView(pFormFillEnv))
    208     return false;
    209 
    210   for (int32_t i = 0, sz = action.GetSubActionsCount(); i < sz; i++) {
    211     CPDF_Action subaction = action.GetSubAction(i);
    212     if (!ExecuteDocumentPageAction(subaction, type, pFormFillEnv, visited))
    213       return false;
    214   }
    215 
    216   return true;
    217 }
    218 
    219 bool CPDFSDK_ActionHandler::IsValidField(
    220     CPDFSDK_FormFillEnvironment* pFormFillEnv,
    221     CPDF_Dictionary* pFieldDict) {
    222   ASSERT(pFieldDict);
    223 
    224   CPDFSDK_InterForm* pInterForm = pFormFillEnv->GetInterForm();
    225   CPDF_InterForm* pPDFInterForm = pInterForm->GetInterForm();
    226   return !!pPDFInterForm->GetFieldByDict(pFieldDict);
    227 }
    228 
    229 bool CPDFSDK_ActionHandler::ExecuteFieldAction(
    230     const CPDF_Action& action,
    231     CPDF_AAction::AActionType type,
    232     CPDFSDK_FormFillEnvironment* pFormFillEnv,
    233     CPDF_FormField* pFormField,
    234     PDFSDK_FieldAction& data,
    235     std::set<CPDF_Dictionary*>* visited) {
    236   CPDF_Dictionary* pDict = action.GetDict();
    237   if (pdfium::ContainsKey(*visited, pDict))
    238     return false;
    239 
    240   visited->insert(pDict);
    241 
    242   ASSERT(pFormFillEnv);
    243   if (action.GetType() == CPDF_Action::JavaScript) {
    244     if (pFormFillEnv->IsJSInitiated()) {
    245       CFX_WideString swJS = action.GetJavaScript();
    246       if (!swJS.IsEmpty()) {
    247         RunFieldJavaScript(pFormFillEnv, pFormField, type, data, swJS);
    248         if (!IsValidField(pFormFillEnv, pFormField->GetFieldDict()))
    249           return false;
    250       }
    251     }
    252   } else {
    253     DoAction_NoJs(action, pFormFillEnv);
    254   }
    255 
    256   for (int32_t i = 0, sz = action.GetSubActionsCount(); i < sz; i++) {
    257     CPDF_Action subaction = action.GetSubAction(i);
    258     if (!ExecuteFieldAction(subaction, type, pFormFillEnv, pFormField, data,
    259                             visited))
    260       return false;
    261   }
    262 
    263   return true;
    264 }
    265 
    266 bool CPDFSDK_ActionHandler::ExecuteScreenAction(
    267     const CPDF_Action& action,
    268     CPDF_AAction::AActionType type,
    269     CPDFSDK_FormFillEnvironment* pFormFillEnv,
    270     CPDFSDK_Annot* pScreen,
    271     std::set<CPDF_Dictionary*>* visited) {
    272   CPDF_Dictionary* pDict = action.GetDict();
    273   if (pdfium::ContainsKey(*visited, pDict))
    274     return false;
    275 
    276   visited->insert(pDict);
    277 
    278   ASSERT(pFormFillEnv);
    279   if (action.GetType() == CPDF_Action::JavaScript) {
    280     if (pFormFillEnv->IsJSInitiated()) {
    281       CFX_WideString swJS = action.GetJavaScript();
    282       if (!swJS.IsEmpty()) {
    283         IJS_Runtime* pRuntime = pFormFillEnv->GetJSRuntime();
    284         IJS_EventContext* pContext = pRuntime->NewEventContext();
    285         CFX_WideString csInfo;
    286         bool bRet = pContext->RunScript(swJS, &csInfo);
    287         pRuntime->ReleaseEventContext(pContext);
    288         if (!bRet) {
    289           // FIXME: return error.
    290         }
    291       }
    292     }
    293   } else {
    294     DoAction_NoJs(action, pFormFillEnv);
    295   }
    296 
    297   for (int32_t i = 0, sz = action.GetSubActionsCount(); i < sz; i++) {
    298     CPDF_Action subaction = action.GetSubAction(i);
    299     if (!ExecuteScreenAction(subaction, type, pFormFillEnv, pScreen, visited))
    300       return false;
    301   }
    302 
    303   return true;
    304 }
    305 
    306 bool CPDFSDK_ActionHandler::ExecuteBookMark(
    307     const CPDF_Action& action,
    308     CPDFSDK_FormFillEnvironment* pFormFillEnv,
    309     CPDF_Bookmark* pBookmark,
    310     std::set<CPDF_Dictionary*>* visited) {
    311   CPDF_Dictionary* pDict = action.GetDict();
    312   if (pdfium::ContainsKey(*visited, pDict))
    313     return false;
    314 
    315   visited->insert(pDict);
    316 
    317   ASSERT(pFormFillEnv);
    318   if (action.GetType() == CPDF_Action::JavaScript) {
    319     if (pFormFillEnv->IsJSInitiated()) {
    320       CFX_WideString swJS = action.GetJavaScript();
    321       if (!swJS.IsEmpty()) {
    322         IJS_Runtime* pRuntime = pFormFillEnv->GetJSRuntime();
    323         IJS_EventContext* pContext = pRuntime->NewEventContext();
    324         pContext->OnBookmark_MouseUp(pBookmark);
    325 
    326         CFX_WideString csInfo;
    327         bool bRet = pContext->RunScript(swJS, &csInfo);
    328         pRuntime->ReleaseEventContext(pContext);
    329         if (!bRet) {
    330           // FIXME: return error.
    331         }
    332       }
    333     }
    334   } else {
    335     DoAction_NoJs(action, pFormFillEnv);
    336   }
    337 
    338   for (int32_t i = 0, sz = action.GetSubActionsCount(); i < sz; i++) {
    339     CPDF_Action subaction = action.GetSubAction(i);
    340     if (!ExecuteBookMark(subaction, pFormFillEnv, pBookmark, visited))
    341       return false;
    342   }
    343 
    344   return true;
    345 }
    346 
    347 void CPDFSDK_ActionHandler::DoAction_NoJs(
    348     const CPDF_Action& action,
    349     CPDFSDK_FormFillEnvironment* pFormFillEnv) {
    350   ASSERT(pFormFillEnv);
    351 
    352   switch (action.GetType()) {
    353     case CPDF_Action::GoTo:
    354       DoAction_GoTo(pFormFillEnv, action);
    355       break;
    356     case CPDF_Action::GoToR:
    357       DoAction_GoToR(pFormFillEnv, action);
    358       break;
    359     case CPDF_Action::GoToE:
    360       break;
    361     case CPDF_Action::Launch:
    362       DoAction_Launch(pFormFillEnv, action);
    363       break;
    364     case CPDF_Action::Thread:
    365       break;
    366     case CPDF_Action::URI:
    367       DoAction_URI(pFormFillEnv, action);
    368       break;
    369     case CPDF_Action::Sound:
    370       break;
    371     case CPDF_Action::Movie:
    372       break;
    373     case CPDF_Action::Hide:
    374       DoAction_Hide(action, pFormFillEnv);
    375       break;
    376     case CPDF_Action::Named:
    377       DoAction_Named(pFormFillEnv, action);
    378       break;
    379     case CPDF_Action::SubmitForm:
    380       DoAction_SubmitForm(action, pFormFillEnv);
    381       break;
    382     case CPDF_Action::ResetForm:
    383       DoAction_ResetForm(action, pFormFillEnv);
    384       break;
    385     case CPDF_Action::ImportData:
    386       DoAction_ImportData(action, pFormFillEnv);
    387       break;
    388     case CPDF_Action::JavaScript:
    389       ASSERT(false);
    390       break;
    391     case CPDF_Action::SetOCGState:
    392       DoAction_SetOCGState(pFormFillEnv, action);
    393       break;
    394     case CPDF_Action::Rendition:
    395       break;
    396     case CPDF_Action::Trans:
    397       break;
    398     case CPDF_Action::GoTo3DView:
    399       break;
    400     default:
    401       break;
    402   }
    403 }
    404 
    405 bool CPDFSDK_ActionHandler::IsValidDocView(
    406     CPDFSDK_FormFillEnvironment* pFormFillEnv) {
    407   ASSERT(pFormFillEnv);
    408   return true;
    409 }
    410 
    411 void CPDFSDK_ActionHandler::DoAction_GoTo(
    412     CPDFSDK_FormFillEnvironment* pFormFillEnv,
    413     const CPDF_Action& action) {
    414   ASSERT(action.GetDict());
    415 
    416   CPDF_Document* pPDFDocument = pFormFillEnv->GetPDFDocument();
    417   ASSERT(pPDFDocument);
    418 
    419   CPDF_Dest MyDest = action.GetDest(pPDFDocument);
    420   int nPageIndex = MyDest.GetPageIndex(pPDFDocument);
    421   int nFitType = MyDest.GetZoomMode();
    422   const CPDF_Array* pMyArray = ToArray(MyDest.GetObject());
    423   float* pPosAry = nullptr;
    424   int sizeOfAry = 0;
    425   if (pMyArray) {
    426     pPosAry = new float[pMyArray->GetCount()];
    427     int j = 0;
    428     for (size_t i = 2; i < pMyArray->GetCount(); i++) {
    429       pPosAry[j++] = pMyArray->GetFloatAt(i);
    430     }
    431     sizeOfAry = j;
    432   }
    433 
    434   pFormFillEnv->DoGoToAction(nPageIndex, nFitType, pPosAry, sizeOfAry);
    435   delete[] pPosAry;
    436 }
    437 
    438 void CPDFSDK_ActionHandler::DoAction_GoToR(
    439     CPDFSDK_FormFillEnvironment* pFormFillEnv,
    440     const CPDF_Action& action) {}
    441 
    442 void CPDFSDK_ActionHandler::DoAction_Launch(
    443     CPDFSDK_FormFillEnvironment* pFormFillEnv,
    444     const CPDF_Action& action) {}
    445 
    446 void CPDFSDK_ActionHandler::DoAction_URI(
    447     CPDFSDK_FormFillEnvironment* pFormFillEnv,
    448     const CPDF_Action& action) {
    449   ASSERT(action.GetDict());
    450 
    451   CFX_ByteString sURI = action.GetURI(pFormFillEnv->GetPDFDocument());
    452   pFormFillEnv->DoURIAction(sURI.c_str());
    453 }
    454 
    455 void CPDFSDK_ActionHandler::DoAction_Named(
    456     CPDFSDK_FormFillEnvironment* pFormFillEnv,
    457     const CPDF_Action& action) {
    458   ASSERT(action.GetDict());
    459 
    460   CFX_ByteString csName = action.GetNamedAction();
    461   pFormFillEnv->ExecuteNamedAction(csName.c_str());
    462 }
    463 
    464 void CPDFSDK_ActionHandler::DoAction_SetOCGState(
    465     CPDFSDK_FormFillEnvironment* pFormFillEnv,
    466     const CPDF_Action& action) {}
    467 
    468 void CPDFSDK_ActionHandler::RunFieldJavaScript(
    469     CPDFSDK_FormFillEnvironment* pFormFillEnv,
    470     CPDF_FormField* pFormField,
    471     CPDF_AAction::AActionType type,
    472     PDFSDK_FieldAction& data,
    473     const CFX_WideString& script) {
    474   ASSERT(type != CPDF_AAction::Calculate);
    475   ASSERT(type != CPDF_AAction::Format);
    476 
    477   IJS_Runtime* pRuntime = pFormFillEnv->GetJSRuntime();
    478   IJS_EventContext* pContext = pRuntime->NewEventContext();
    479   switch (type) {
    480     case CPDF_AAction::CursorEnter:
    481       pContext->OnField_MouseEnter(data.bModifier, data.bShift, pFormField);
    482       break;
    483     case CPDF_AAction::CursorExit:
    484       pContext->OnField_MouseExit(data.bModifier, data.bShift, pFormField);
    485       break;
    486     case CPDF_AAction::ButtonDown:
    487       pContext->OnField_MouseDown(data.bModifier, data.bShift, pFormField);
    488       break;
    489     case CPDF_AAction::ButtonUp:
    490       pContext->OnField_MouseUp(data.bModifier, data.bShift, pFormField);
    491       break;
    492     case CPDF_AAction::GetFocus:
    493       pContext->OnField_Focus(data.bModifier, data.bShift, pFormField,
    494                               data.sValue);
    495       break;
    496     case CPDF_AAction::LoseFocus:
    497       pContext->OnField_Blur(data.bModifier, data.bShift, pFormField,
    498                              data.sValue);
    499       break;
    500     case CPDF_AAction::KeyStroke:
    501       pContext->OnField_Keystroke(data.sChange, data.sChangeEx, data.bKeyDown,
    502                                   data.bModifier, data.nSelEnd, data.nSelStart,
    503                                   data.bShift, pFormField, data.sValue,
    504                                   data.bWillCommit, data.bFieldFull, data.bRC);
    505       break;
    506     case CPDF_AAction::Validate:
    507       pContext->OnField_Validate(data.sChange, data.sChangeEx, data.bKeyDown,
    508                                  data.bModifier, data.bShift, pFormField,
    509                                  data.sValue, data.bRC);
    510       break;
    511     default:
    512       ASSERT(false);
    513       break;
    514   }
    515 
    516   CFX_WideString csInfo;
    517   bool bRet = pContext->RunScript(script, &csInfo);
    518   pRuntime->ReleaseEventContext(pContext);
    519   if (!bRet) {
    520     // FIXME: return error.
    521   }
    522 }
    523 
    524 void CPDFSDK_ActionHandler::RunDocumentOpenJavaScript(
    525     CPDFSDK_FormFillEnvironment* pFormFillEnv,
    526     const CFX_WideString& sScriptName,
    527     const CFX_WideString& script) {
    528   IJS_Runtime* pRuntime = pFormFillEnv->GetJSRuntime();
    529   IJS_EventContext* pContext = pRuntime->NewEventContext();
    530   pContext->OnDoc_Open(pFormFillEnv, sScriptName);
    531 
    532   CFX_WideString csInfo;
    533   bool bRet = pContext->RunScript(script, &csInfo);
    534   pRuntime->ReleaseEventContext(pContext);
    535   if (!bRet) {
    536     // FIXME: return error.
    537   }
    538 }
    539 
    540 void CPDFSDK_ActionHandler::RunDocumentPageJavaScript(
    541     CPDFSDK_FormFillEnvironment* pFormFillEnv,
    542     CPDF_AAction::AActionType type,
    543     const CFX_WideString& script) {
    544   IJS_Runtime* pRuntime = pFormFillEnv->GetJSRuntime();
    545   IJS_EventContext* pContext = pRuntime->NewEventContext();
    546   switch (type) {
    547     case CPDF_AAction::OpenPage:
    548       pContext->OnPage_Open(pFormFillEnv);
    549       break;
    550     case CPDF_AAction::ClosePage:
    551       pContext->OnPage_Close(pFormFillEnv);
    552       break;
    553     case CPDF_AAction::CloseDocument:
    554       pContext->OnDoc_WillClose(pFormFillEnv);
    555       break;
    556     case CPDF_AAction::SaveDocument:
    557       pContext->OnDoc_WillSave(pFormFillEnv);
    558       break;
    559     case CPDF_AAction::DocumentSaved:
    560       pContext->OnDoc_DidSave(pFormFillEnv);
    561       break;
    562     case CPDF_AAction::PrintDocument:
    563       pContext->OnDoc_WillPrint(pFormFillEnv);
    564       break;
    565     case CPDF_AAction::DocumentPrinted:
    566       pContext->OnDoc_DidPrint(pFormFillEnv);
    567       break;
    568     case CPDF_AAction::PageVisible:
    569       pContext->OnPage_InView(pFormFillEnv);
    570       break;
    571     case CPDF_AAction::PageInvisible:
    572       pContext->OnPage_OutView(pFormFillEnv);
    573       break;
    574     default:
    575       ASSERT(false);
    576       break;
    577   }
    578 
    579   CFX_WideString csInfo;
    580   bool bRet = pContext->RunScript(script, &csInfo);
    581   pRuntime->ReleaseEventContext(pContext);
    582   if (!bRet) {
    583     // FIXME: return error.
    584   }
    585 }
    586 
    587 bool CPDFSDK_ActionHandler::DoAction_Hide(
    588     const CPDF_Action& action,
    589     CPDFSDK_FormFillEnvironment* pFormFillEnv) {
    590   CPDFSDK_InterForm* pInterForm = pFormFillEnv->GetInterForm();
    591   if (pInterForm->DoAction_Hide(action)) {
    592     pFormFillEnv->SetChangeMark();
    593     return true;
    594   }
    595 
    596   return false;
    597 }
    598 
    599 bool CPDFSDK_ActionHandler::DoAction_SubmitForm(
    600     const CPDF_Action& action,
    601     CPDFSDK_FormFillEnvironment* pFormFillEnv) {
    602   CPDFSDK_InterForm* pInterForm = pFormFillEnv->GetInterForm();
    603   return pInterForm->DoAction_SubmitForm(action);
    604 }
    605 
    606 bool CPDFSDK_ActionHandler::DoAction_ResetForm(
    607     const CPDF_Action& action,
    608     CPDFSDK_FormFillEnvironment* pFormFillEnv) {
    609   CPDFSDK_InterForm* pInterForm = pFormFillEnv->GetInterForm();
    610   return pInterForm->DoAction_ResetForm(action);
    611 }
    612 
    613 bool CPDFSDK_ActionHandler::DoAction_ImportData(
    614     const CPDF_Action& action,
    615     CPDFSDK_FormFillEnvironment* pFormFillEnv) {
    616   CPDFSDK_InterForm* pInterForm = pFormFillEnv->GetInterForm();
    617   if (pInterForm->DoAction_ImportData(action)) {
    618     pFormFillEnv->SetChangeMark();
    619     return true;
    620   }
    621 
    622   return false;
    623 }
    624