Home | History | Annotate | Download | only in parser
      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 "xfa/fxfa/parser/cxfa_validate.h"
      8 
      9 #include "fxjs/xfa/cjx_object.h"
     10 #include "fxjs/xfa/cjx_validate.h"
     11 #include "third_party/base/ptr_util.h"
     12 #include "xfa/fxfa/parser/cxfa_message.h"
     13 #include "xfa/fxfa/parser/cxfa_picture.h"
     14 #include "xfa/fxfa/parser/cxfa_script.h"
     15 
     16 namespace {
     17 
     18 const CXFA_Node::PropertyData kPropertyData[] = {{XFA_Element::Message, 1, 0},
     19                                                  {XFA_Element::Picture, 1, 0},
     20                                                  {XFA_Element::Script, 1, 0},
     21                                                  {XFA_Element::Extras, 1, 0},
     22                                                  {XFA_Element::Unknown, 0, 0}};
     23 const CXFA_Node::AttributeData kAttributeData[] = {
     24     {XFA_Attribute::Id, XFA_AttributeType::CData, nullptr},
     25     {XFA_Attribute::Use, XFA_AttributeType::CData, nullptr},
     26     {XFA_Attribute::ScriptTest, XFA_AttributeType::Enum,
     27      (void*)XFA_AttributeEnum::Error},
     28     {XFA_Attribute::NullTest, XFA_AttributeType::Enum,
     29      (void*)XFA_AttributeEnum::Disabled},
     30     {XFA_Attribute::Usehref, XFA_AttributeType::CData, nullptr},
     31     {XFA_Attribute::Desc, XFA_AttributeType::CData, nullptr},
     32     {XFA_Attribute::FormatTest, XFA_AttributeType::Enum,
     33      (void*)XFA_AttributeEnum::Warning},
     34     {XFA_Attribute::Lock, XFA_AttributeType::Integer, (void*)0},
     35     {XFA_Attribute::Unknown, XFA_AttributeType::Integer, nullptr}};
     36 
     37 constexpr wchar_t kName[] = L"validate";
     38 constexpr wchar_t kFormatTest[] = L"formatTest";
     39 constexpr wchar_t kNullTest[] = L"nullTest";
     40 constexpr wchar_t kScriptTest[] = L"scriptTest";
     41 
     42 }  // namespace
     43 
     44 CXFA_Validate::CXFA_Validate(CXFA_Document* doc, XFA_PacketType packet)
     45     : CXFA_Node(
     46           doc,
     47           packet,
     48           (XFA_XDPPACKET_Config | XFA_XDPPACKET_Template | XFA_XDPPACKET_Form),
     49           XFA_ObjectType::ContentNode,
     50           XFA_Element::Validate,
     51           kPropertyData,
     52           kAttributeData,
     53           kName,
     54           pdfium::MakeUnique<CJX_Validate>(this)) {}
     55 
     56 CXFA_Validate::~CXFA_Validate() {}
     57 
     58 XFA_AttributeEnum CXFA_Validate::GetFormatTest() {
     59   return JSObject()->GetEnum(XFA_Attribute::FormatTest);
     60 }
     61 
     62 void CXFA_Validate::SetNullTest(const WideString& wsValue) {
     63   Optional<XFA_AttributeEnum> item =
     64       CXFA_Node::NameToAttributeEnum(wsValue.AsStringView());
     65   JSObject()->SetEnum(XFA_Attribute::NullTest,
     66                       item ? *item : XFA_AttributeEnum::Disabled, false);
     67 }
     68 
     69 XFA_AttributeEnum CXFA_Validate::GetNullTest() {
     70   return JSObject()->GetEnum(XFA_Attribute::NullTest);
     71 }
     72 
     73 XFA_AttributeEnum CXFA_Validate::GetScriptTest() {
     74   return JSObject()->GetEnum(XFA_Attribute::ScriptTest);
     75 }
     76 
     77 WideString CXFA_Validate::GetMessageText(const WideString& wsMessageType) {
     78   CXFA_Message* pNode =
     79       JSObject()->GetProperty<CXFA_Message>(0, XFA_Element::Message);
     80   if (!pNode)
     81     return L"";
     82 
     83   for (CXFA_Node* pItemNode = pNode->GetFirstChild(); pItemNode;
     84        pItemNode = pItemNode->GetNextSibling()) {
     85     if (pItemNode->GetElementType() != XFA_Element::Text)
     86       continue;
     87 
     88     WideString wsName = pItemNode->JSObject()->GetCData(XFA_Attribute::Name);
     89     if (wsName.IsEmpty() || wsName == wsMessageType)
     90       return pItemNode->JSObject()->GetContent(false);
     91   }
     92   return L"";
     93 }
     94 
     95 void CXFA_Validate::SetFormatMessageText(const WideString& wsMessage) {
     96   SetMessageText(kFormatTest, wsMessage);
     97 }
     98 
     99 WideString CXFA_Validate::GetFormatMessageText() {
    100   return GetMessageText(kFormatTest);
    101 }
    102 
    103 void CXFA_Validate::SetNullMessageText(const WideString& wsMessage) {
    104   SetMessageText(kNullTest, wsMessage);
    105 }
    106 
    107 WideString CXFA_Validate::GetNullMessageText() {
    108   return GetMessageText(kNullTest);
    109 }
    110 
    111 WideString CXFA_Validate::GetScriptMessageText() {
    112   return GetMessageText(kScriptTest);
    113 }
    114 
    115 void CXFA_Validate::SetScriptMessageText(const WideString& wsMessage) {
    116   SetMessageText(kScriptTest, wsMessage);
    117 }
    118 
    119 void CXFA_Validate::SetMessageText(const WideString& wsMessageType,
    120                                    const WideString& wsMessage) {
    121   CXFA_Message* pNode =
    122       JSObject()->GetOrCreateProperty<CXFA_Message>(0, XFA_Element::Message);
    123   if (!pNode)
    124     return;
    125 
    126   for (CXFA_Node* pItemNode = pNode->GetFirstChild(); pItemNode;
    127        pItemNode = pItemNode->GetNextSibling()) {
    128     if (pItemNode->GetElementType() != XFA_Element::Text)
    129       continue;
    130 
    131     WideString wsName = pItemNode->JSObject()->GetCData(XFA_Attribute::Name);
    132     if (wsName.IsEmpty() || wsName == wsMessageType) {
    133       pItemNode->JSObject()->SetContent(wsMessage, wsMessage, false, false,
    134                                         true);
    135       return;
    136     }
    137   }
    138 
    139   CXFA_Node* pTextNode = pNode->CreateSamePacketNode(XFA_Element::Text);
    140   pNode->InsertChild(pTextNode, nullptr);
    141   pTextNode->JSObject()->SetCData(XFA_Attribute::Name, wsMessageType, false,
    142                                   false);
    143   pTextNode->JSObject()->SetContent(wsMessage, wsMessage, false, false, true);
    144 }
    145 
    146 WideString CXFA_Validate::GetPicture() {
    147   CXFA_Picture* pNode = GetChild<CXFA_Picture>(0, XFA_Element::Picture, false);
    148   return pNode ? pNode->JSObject()->GetContent(false) : L"";
    149 }
    150 
    151 CXFA_Script* CXFA_Validate::GetScriptIfExists() {
    152   return GetChild<CXFA_Script>(0, XFA_Element::Script, false);
    153 }
    154