Home | History | Annotate | Download | only in xfa
      1 // Copyright 2017 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/xfa/cjx_form.h"
      8 
      9 #include <vector>
     10 
     11 #include "fxjs/cfxjse_engine.h"
     12 #include "fxjs/cfxjse_value.h"
     13 #include "fxjs/js_resources.h"
     14 #include "xfa/fxfa/cxfa_eventparam.h"
     15 #include "xfa/fxfa/cxfa_ffnotify.h"
     16 #include "xfa/fxfa/parser/cxfa_arraynodelist.h"
     17 #include "xfa/fxfa/parser/cxfa_document.h"
     18 #include "xfa/fxfa/parser/cxfa_form.h"
     19 
     20 const CJX_MethodSpec CJX_Form::MethodSpecs[] = {
     21     {"execCalculate", execCalculate_static},
     22     {"execInitialize", execInitialize_static},
     23     {"execValidate", execValidate_static},
     24     {"formNodes", formNodes_static},
     25     {"recalculate", recalculate_static},
     26     {"remerge", remerge_static}};
     27 
     28 CJX_Form::CJX_Form(CXFA_Form* form) : CJX_Model(form) {
     29   DefineMethods(MethodSpecs, FX_ArraySize(MethodSpecs));
     30 }
     31 
     32 CJX_Form::~CJX_Form() {}
     33 
     34 CJS_Return CJX_Form::formNodes(
     35     CJS_V8* runtime,
     36     const std::vector<v8::Local<v8::Value>>& params) {
     37   if (params.size() != 1)
     38     return CJS_Return(JSGetStringFromID(JSMessage::kParamError));
     39 
     40   CXFA_Node* pDataNode = ToNode(runtime->ToXFAObject(params[0]));
     41   if (!pDataNode)
     42     return CJS_Return(JSGetStringFromID(JSMessage::kValueError));
     43 
     44   std::vector<CXFA_Node*> formItems;
     45   CXFA_ArrayNodeList* pFormNodes = new CXFA_ArrayNodeList(GetDocument());
     46   pFormNodes->SetArrayNodeList(formItems);
     47 
     48   CFXJSE_Value* value =
     49       GetDocument()->GetScriptContext()->GetJSValueFromMap(pFormNodes);
     50   if (!value)
     51     return CJS_Return(runtime->NewNull());
     52   return CJS_Return(value->DirectGetValue().Get(runtime->GetIsolate()));
     53 }
     54 
     55 CJS_Return CJX_Form::remerge(CJS_V8* runtime,
     56                              const std::vector<v8::Local<v8::Value>>& params) {
     57   if (!params.empty())
     58     return CJS_Return(JSGetStringFromID(JSMessage::kParamError));
     59 
     60   GetDocument()->DoDataRemerge(true);
     61   return CJS_Return(true);
     62 }
     63 
     64 CJS_Return CJX_Form::execInitialize(
     65     CJS_V8* runtime,
     66     const std::vector<v8::Local<v8::Value>>& params) {
     67   if (!params.empty())
     68     return CJS_Return(JSGetStringFromID(JSMessage::kParamError));
     69 
     70   CXFA_FFNotify* pNotify = GetDocument()->GetNotify();
     71   if (pNotify)
     72     pNotify->ExecEventByDeepFirst(GetXFANode(), XFA_EVENT_Initialize);
     73   return CJS_Return(true);
     74 }
     75 
     76 CJS_Return CJX_Form::recalculate(
     77     CJS_V8* runtime,
     78     const std::vector<v8::Local<v8::Value>>& params) {
     79   CXFA_EventParam* pEventParam =
     80       GetDocument()->GetScriptContext()->GetEventParam();
     81   if (pEventParam->m_eType == XFA_EVENT_Calculate ||
     82       pEventParam->m_eType == XFA_EVENT_InitCalculate) {
     83     return CJS_Return(true);
     84   }
     85   if (params.size() != 1)
     86     return CJS_Return(JSGetStringFromID(JSMessage::kParamError));
     87 
     88   CXFA_FFNotify* pNotify = GetDocument()->GetNotify();
     89   if (!pNotify || runtime->ToInt32(params[0]) != 0)
     90     return CJS_Return(true);
     91 
     92   pNotify->ExecEventByDeepFirst(GetXFANode(), XFA_EVENT_Calculate);
     93   pNotify->ExecEventByDeepFirst(GetXFANode(), XFA_EVENT_Validate);
     94   pNotify->ExecEventByDeepFirst(GetXFANode(), XFA_EVENT_Ready, true);
     95   return CJS_Return(true);
     96 }
     97 
     98 CJS_Return CJX_Form::execCalculate(
     99     CJS_V8* runtime,
    100     const std::vector<v8::Local<v8::Value>>& params) {
    101   if (!params.empty())
    102     return CJS_Return(JSGetStringFromID(JSMessage::kParamError));
    103 
    104   CXFA_FFNotify* pNotify = GetDocument()->GetNotify();
    105   if (pNotify)
    106     pNotify->ExecEventByDeepFirst(GetXFANode(), XFA_EVENT_Calculate);
    107   return CJS_Return(true);
    108 }
    109 
    110 CJS_Return CJX_Form::execValidate(
    111     CJS_V8* runtime,
    112     const std::vector<v8::Local<v8::Value>>& params) {
    113   if (params.size() != 0)
    114     return CJS_Return(JSGetStringFromID(JSMessage::kParamError));
    115 
    116   CXFA_FFNotify* pNotify = GetDocument()->GetNotify();
    117   if (!pNotify)
    118     return CJS_Return(runtime->NewBoolean(false));
    119 
    120   int32_t iRet =
    121       pNotify->ExecEventByDeepFirst(GetXFANode(), XFA_EVENT_Validate);
    122   return CJS_Return(runtime->NewBoolean(iRet != XFA_EVENTERROR_Error));
    123 }
    124