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_list.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 "third_party/base/numerics/safe_conversions.h"
     15 #include "xfa/fxfa/parser/cxfa_document.h"
     16 #include "xfa/fxfa/parser/cxfa_list.h"
     17 #include "xfa/fxfa/parser/cxfa_node.h"
     18 
     19 const CJX_MethodSpec CJX_List::MethodSpecs[] = {{"append", append_static},
     20                                                 {"insert", insert_static},
     21                                                 {"item", item_static},
     22                                                 {"remove", remove_static}};
     23 
     24 CJX_List::CJX_List(CXFA_List* list) : CJX_Object(list) {
     25   DefineMethods(MethodSpecs, FX_ArraySize(MethodSpecs));
     26 }
     27 
     28 CJX_List::~CJX_List() {}
     29 
     30 CXFA_List* CJX_List::GetXFAList() {
     31   return static_cast<CXFA_List*>(GetXFAObject());
     32 }
     33 
     34 CJS_Return CJX_List::append(CJS_V8* runtime,
     35                             const std::vector<v8::Local<v8::Value>>& params) {
     36   if (params.size() != 1)
     37     return CJS_Return(JSGetStringFromID(JSMessage::kParamError));
     38 
     39   auto* pNode = ToNode(runtime->ToXFAObject(params[0]));
     40   if (!pNode)
     41     return CJS_Return(JSGetStringFromID(JSMessage::kValueError));
     42 
     43   GetXFAList()->Append(pNode);
     44   return CJS_Return(true);
     45 }
     46 
     47 CJS_Return CJX_List::insert(CJS_V8* runtime,
     48                             const std::vector<v8::Local<v8::Value>>& params) {
     49   if (params.size() != 2)
     50     return CJS_Return(JSGetStringFromID(JSMessage::kParamError));
     51 
     52   auto* pNewNode = ToNode(runtime->ToXFAObject(params[0]));
     53   if (!pNewNode)
     54     return CJS_Return(JSGetStringFromID(JSMessage::kValueError));
     55 
     56   auto* pBeforeNode = ToNode(runtime->ToXFAObject(params[1]));
     57   GetXFAList()->Insert(pNewNode, pBeforeNode);
     58   return CJS_Return(true);
     59 }
     60 
     61 CJS_Return CJX_List::remove(CJS_V8* runtime,
     62                             const std::vector<v8::Local<v8::Value>>& params) {
     63   if (params.size() != 1)
     64     return CJS_Return(JSGetStringFromID(JSMessage::kParamError));
     65 
     66   auto* pNode = ToNode(runtime->ToXFAObject(params[0]));
     67   if (!pNode)
     68     return CJS_Return(JSGetStringFromID(JSMessage::kValueError));
     69 
     70   GetXFAList()->Remove(pNode);
     71   return CJS_Return(true);
     72 }
     73 
     74 CJS_Return CJX_List::item(CJS_V8* runtime,
     75                           const std::vector<v8::Local<v8::Value>>& params) {
     76   if (params.size() != 1)
     77     return CJS_Return(JSGetStringFromID(JSMessage::kParamError));
     78 
     79   int32_t index = runtime->ToInt32(params[0]);
     80   size_t cast_index = static_cast<size_t>(index);
     81   if (index < 0 || cast_index >= GetXFAList()->GetLength())
     82     return CJS_Return(JSGetStringFromID(JSMessage::kInvalidInputError));
     83 
     84   return CJS_Return(runtime->NewXFAObject(
     85       GetXFAList()->Item(cast_index),
     86       GetDocument()->GetScriptContext()->GetJseNormalClass()->GetTemplate()));
     87 }
     88 
     89 void CJX_List::length(CFXJSE_Value* pValue,
     90                       bool bSetting,
     91                       XFA_Attribute eAttribute) {
     92   if (bSetting) {
     93     ThrowInvalidPropertyException();
     94     return;
     95   }
     96   pValue->SetInteger(
     97       pdfium::base::checked_cast<int32_t>(GetXFAList()->GetLength()));
     98 }
     99