| // Copyright 2017 PDFium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com |
| |
| #include "fxjs/xfa/cjx_model.h" |
| |
| #include "fxjs/cfxjse_arguments.h" |
| #include "fxjs/cfxjse_engine.h" |
| #include "fxjs/cfxjse_value.h" |
| #include "xfa/fxfa/parser/cxfa_delta.h" |
| #include "xfa/fxfa/parser/cxfa_document.h" |
| |
| const CJX_MethodSpec CJX_Model::MethodSpecs[] = { |
| {"clearErrorList", clearErrorList_static}, |
| {"createNode", createNode_static}, |
| {"isCompatibleNS", isCompatibleNS_static}, |
| {"", nullptr}}; |
| |
| CJX_Model::CJX_Model(CXFA_Node* node) : CJX_Node(node) { |
| DefineMethods(MethodSpecs); |
| } |
| |
| CJX_Model::~CJX_Model() {} |
| |
| void CJX_Model::clearErrorList(CFXJSE_Arguments* pArguments) {} |
| |
| void CJX_Model::createNode(CFXJSE_Arguments* pArguments) { |
| int32_t argc = pArguments->GetLength(); |
| if (argc <= 0 || argc >= 4) { |
| ThrowParamCountMismatchException(L"createNode"); |
| return; |
| } |
| |
| WideString strName; |
| WideString strNameSpace; |
| if (argc > 1) { |
| ByteString bsName = pArguments->GetUTF8String(1); |
| strName = WideString::FromUTF8(bsName.AsStringView()); |
| if (argc == 3) { |
| ByteString bsNameSpace = pArguments->GetUTF8String(2); |
| strNameSpace = WideString::FromUTF8(bsNameSpace.AsStringView()); |
| } |
| } |
| |
| ByteString bsTagName = pArguments->GetUTF8String(0); |
| WideString strTagName = WideString::FromUTF8(bsTagName.AsStringView()); |
| XFA_Element eType = CXFA_Node::NameToElement(strTagName); |
| CXFA_Node* pNewNode = GetXFANode()->CreateSamePacketNode(eType); |
| if (!pNewNode) { |
| pArguments->GetReturnValue()->SetNull(); |
| return; |
| } |
| |
| if (strName.IsEmpty()) { |
| pArguments->GetReturnValue()->Assign( |
| GetDocument()->GetScriptContext()->GetJSValueFromMap(pNewNode)); |
| return; |
| } |
| |
| if (!pNewNode->HasAttribute(XFA_Attribute::Name)) { |
| ThrowMissingPropertyException(strTagName, L"name"); |
| return; |
| } |
| |
| pNewNode->JSNode()->SetAttribute(XFA_Attribute::Name, strName.AsStringView(), |
| true); |
| if (pNewNode->GetPacketType() == XFA_PacketType::Datasets) |
| pNewNode->CreateXMLMappingNode(); |
| |
| pArguments->GetReturnValue()->Assign( |
| GetDocument()->GetScriptContext()->GetJSValueFromMap(pNewNode)); |
| } |
| |
| void CJX_Model::isCompatibleNS(CFXJSE_Arguments* pArguments) { |
| int32_t iLength = pArguments->GetLength(); |
| if (iLength < 1) { |
| ThrowParamCountMismatchException(L"isCompatibleNS"); |
| return; |
| } |
| |
| WideString wsNameSpace; |
| if (iLength >= 1) { |
| ByteString bsNameSpace = pArguments->GetUTF8String(0); |
| wsNameSpace = WideString::FromUTF8(bsNameSpace.AsStringView()); |
| } |
| |
| CFXJSE_Value* pValue = pArguments->GetReturnValue(); |
| if (!pValue) |
| return; |
| |
| pValue->SetBoolean(TryNamespace().value_or(WideString()) == wsNameSpace); |
| } |