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