14d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// Copyright 2016 PDFium Authors. All rights reserved.
24d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// Use of this source code is governed by a BSD-style license that can be
34d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// found in the LICENSE file.
44d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
54d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
64d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
7d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "xfa/fxfa/parser/cxfa_node.h"
84d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
94d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include <map>
104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include <memory>
11d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include <set>
124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include <utility>
134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include <vector>
144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
15d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "core/fxcrt/autorestorer.h"
16d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "core/fxcrt/cfx_decimal.h"
17d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "core/fxcrt/cfx_memorystream.h"
18d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "core/fxcrt/fx_codepage.h"
19d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "core/fxcrt/fx_extension.h"
20d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "core/fxcrt/xml/cfx_xmlelement.h"
21d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "core/fxcrt/xml/cfx_xmlnode.h"
22d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "core/fxcrt/xml/cfx_xmltext.h"
23d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "fxjs/cfxjse_engine.h"
244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "fxjs/cfxjse_value.h"
25d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "fxjs/xfa/cjx_node.h"
26d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "third_party/base/logging.h"
274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "third_party/base/ptr_util.h"
284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "third_party/base/stl_util.h"
294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "xfa/fxfa/cxfa_eventparam.h"
30d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "xfa/fxfa/cxfa_ffapp.h"
31d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "xfa/fxfa/cxfa_ffdocview.h"
32d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "xfa/fxfa/cxfa_ffnotify.h"
33d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "xfa/fxfa/cxfa_ffwidget.h"
34d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "xfa/fxfa/parser/cxfa_arraynodelist.h"
35d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "xfa/fxfa/parser/cxfa_attachnodelist.h"
36d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "xfa/fxfa/parser/cxfa_bind.h"
37d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "xfa/fxfa/parser/cxfa_border.h"
38d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "xfa/fxfa/parser/cxfa_calculate.h"
39d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "xfa/fxfa/parser/cxfa_caption.h"
404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "xfa/fxfa/parser/cxfa_document.h"
41d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "xfa/fxfa/parser/cxfa_event.h"
42d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "xfa/fxfa/parser/cxfa_font.h"
43d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "xfa/fxfa/parser/cxfa_keep.h"
444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "xfa/fxfa/parser/cxfa_layoutprocessor.h"
45d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "xfa/fxfa/parser/cxfa_localevalue.h"
46d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "xfa/fxfa/parser/cxfa_margin.h"
474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "xfa/fxfa/parser/cxfa_measurement.h"
48d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "xfa/fxfa/parser/cxfa_nodeiteratortemplate.h"
494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "xfa/fxfa/parser/cxfa_occur.h"
50d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "xfa/fxfa/parser/cxfa_para.h"
514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "xfa/fxfa/parser/cxfa_simple_parser.h"
52d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "xfa/fxfa/parser/cxfa_subform.h"
53d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "xfa/fxfa/parser/cxfa_traversestrategy_xfacontainernode.h"
54d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "xfa/fxfa/parser/cxfa_validate.h"
55d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "xfa/fxfa/parser/cxfa_value.h"
564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "xfa/fxfa/parser/xfa_basic_data.h"
57d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "xfa/fxfa/parser/xfa_utils.h"
584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannnamespace {
604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
61d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannconstexpr uint8_t kMaxExecuteRecursion = 2;
624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
63d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannstd::vector<CXFA_Node*> NodesSortedByDocumentIdx(
64d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    const std::set<CXFA_Node*>& rgNodeSet) {
65d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (rgNodeSet.empty())
66d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return std::vector<CXFA_Node*>();
674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
68d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  std::vector<CXFA_Node*> rgNodeArray;
69d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  CXFA_Node* pCommonParent = (*rgNodeSet.begin())->GetParent();
70d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  for (CXFA_Node* pNode = pCommonParent->GetFirstChild(); pNode;
71d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann       pNode = pNode->GetNextSibling()) {
72d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (pdfium::ContainsValue(rgNodeSet, pNode))
73d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      rgNodeArray.push_back(pNode);
744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
75d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return rgNodeArray;
764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
78d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannusing CXFA_NodeSetPair = std::pair<std::set<CXFA_Node*>, std::set<CXFA_Node*>>;
794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannusing CXFA_NodeSetPairMap =
804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    std::map<uint32_t, std::unique_ptr<CXFA_NodeSetPair>>;
814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannusing CXFA_NodeSetPairMapMap =
824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    std::map<CXFA_Node*, std::unique_ptr<CXFA_NodeSetPairMap>>;
834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCXFA_NodeSetPair* NodeSetPairForNode(CXFA_Node* pNode,
854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                     CXFA_NodeSetPairMapMap* pMap) {
86d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  CXFA_Node* pParentNode = pNode->GetParent();
874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  uint32_t dwNameHash = pNode->GetNameHash();
884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (!pParentNode || !dwNameHash)
894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return nullptr;
904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (!(*pMap)[pParentNode])
924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    (*pMap)[pParentNode] = pdfium::MakeUnique<CXFA_NodeSetPairMap>();
934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CXFA_NodeSetPairMap* pNodeSetPairMap = (*pMap)[pParentNode].get();
954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (!(*pNodeSetPairMap)[dwNameHash])
964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    (*pNodeSetPairMap)[dwNameHash] = pdfium::MakeUnique<CXFA_NodeSetPair>();
974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return (*pNodeSetPairMap)[dwNameHash].get();
994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
1004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
101d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid ReorderDataNodes(const std::set<CXFA_Node*>& sSet1,
102d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                      const std::set<CXFA_Node*>& sSet2,
1034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                      bool bInsertBefore) {
1044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CXFA_NodeSetPairMapMap rgMap;
1054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  for (CXFA_Node* pNode : sSet1) {
1064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    CXFA_NodeSetPair* pNodeSetPair = NodeSetPairForNode(pNode, &rgMap);
1074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (pNodeSetPair)
1084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      pNodeSetPair->first.insert(pNode);
1094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
1104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  for (CXFA_Node* pNode : sSet2) {
1114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    CXFA_NodeSetPair* pNodeSetPair = NodeSetPairForNode(pNode, &rgMap);
1124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (pNodeSetPair) {
1134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      if (pdfium::ContainsValue(pNodeSetPair->first, pNode))
1144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        pNodeSetPair->first.erase(pNode);
1154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      else
1164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        pNodeSetPair->second.insert(pNode);
1174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
1184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
1194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  for (const auto& iter1 : rgMap) {
1204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    CXFA_NodeSetPairMap* pNodeSetPairMap = iter1.second.get();
1214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (!pNodeSetPairMap)
1224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      continue;
1234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    for (const auto& iter2 : *pNodeSetPairMap) {
1254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      CXFA_NodeSetPair* pNodeSetPair = iter2.second.get();
1264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      if (!pNodeSetPair)
1274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        continue;
1284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      if (!pNodeSetPair->first.empty() && !pNodeSetPair->second.empty()) {
129d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        std::vector<CXFA_Node*> rgNodeArray1 =
130d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann            NodesSortedByDocumentIdx(pNodeSetPair->first);
131d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        std::vector<CXFA_Node*> rgNodeArray2 =
132d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann            NodesSortedByDocumentIdx(pNodeSetPair->second);
1334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        CXFA_Node* pParentNode = nullptr;
1344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        CXFA_Node* pBeforeNode = nullptr;
1354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        if (bInsertBefore) {
136d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann          pBeforeNode = rgNodeArray2.front();
137d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann          pParentNode = pBeforeNode->GetParent();
1384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        } else {
139d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann          CXFA_Node* pLastNode = rgNodeArray2.back();
140d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann          pParentNode = pLastNode->GetParent();
141d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann          pBeforeNode = pLastNode->GetNextSibling();
1424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        }
143d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        for (auto* pCurNode : rgNodeArray1) {
144d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann          pParentNode->RemoveChild(pCurNode, true);
1454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          pParentNode->InsertChild(pCurNode, pBeforeNode);
1464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        }
1474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
1484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
1494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    pNodeSetPairMap->clear();
1504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
1514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
1524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
153d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}  // namespace
1544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
155d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann// static
156d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannWideString CXFA_Node::AttributeEnumToName(XFA_AttributeEnum item) {
157d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return g_XFAEnumData[static_cast<int32_t>(item)].pName;
1584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
1594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
160d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann// static
161d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannOptional<XFA_AttributeEnum> CXFA_Node::NameToAttributeEnum(
162d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    const WideStringView& name) {
163d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (name.IsEmpty())
164d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return {};
1654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
166d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  auto* it = std::lower_bound(g_XFAEnumData, g_XFAEnumData + g_iXFAEnumCount,
167d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                              FX_HashCode_GetW(name, false),
168d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                              [](const XFA_AttributeEnumInfo& arg,
169d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                 uint32_t hash) { return arg.uHash < hash; });
170d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (it != g_XFAEnumData + g_iXFAEnumCount && name == it->pName)
171d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return {it->eName};
172d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return {};
1734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
1744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCXFA_Node::CXFA_Node(CXFA_Document* pDoc,
176d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                     XFA_PacketType ePacket,
177d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                     uint32_t validPackets,
1784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                     XFA_ObjectType oType,
1794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                     XFA_Element eType,
180d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                     const PropertyData* properties,
181d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                     const AttributeData* attributes,
182d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                     const WideStringView& elementName,
183d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                     std::unique_ptr<CJX_Object> js_node)
184d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    : CXFA_Object(pDoc, oType, eType, elementName, std::move(js_node)),
185d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      m_Properties(properties),
186d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      m_Attributes(attributes),
187d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      m_ValidPackets(validPackets),
1884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      m_pNext(nullptr),
1894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      m_pChild(nullptr),
1904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      m_pLastChild(nullptr),
1914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      m_pParent(nullptr),
1924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      m_pXMLNode(nullptr),
1934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      m_ePacket(ePacket),
1944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      m_uNodeFlags(XFA_NodeFlag_None),
1954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      m_dwNameHash(0),
196d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      m_pAuxNode(nullptr) {
1974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  ASSERT(m_pDocument);
1984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
1994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
200d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannCXFA_Node::CXFA_Node(CXFA_Document* pDoc,
201d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                     XFA_PacketType ePacket,
202d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                     uint32_t validPackets,
203d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                     XFA_ObjectType oType,
204d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                     XFA_Element eType,
205d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                     const PropertyData* properties,
206d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                     const AttributeData* attributes,
207d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                     const WideStringView& elementName)
208d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    : CXFA_Node(pDoc,
209d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                ePacket,
210d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                validPackets,
211d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                oType,
212d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                eType,
213d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                properties,
214d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                attributes,
215d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                elementName,
216d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                pdfium::MakeUnique<CJX_Node>(this)) {}
217d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
2184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCXFA_Node::~CXFA_Node() {
2194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  ASSERT(!m_pParent);
220d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
2214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CXFA_Node* pNode = m_pChild;
2224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  while (pNode) {
2234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    CXFA_Node* pNext = pNode->m_pNext;
2244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    pNode->m_pParent = nullptr;
2254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    delete pNode;
2264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    pNode = pNext;
2274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
2284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (m_pXMLNode && IsOwnXMLNode())
22933357cad1fd1321a2b38d2963e2585f27ce980a2Philip P. Moltmann    delete m_pXMLNode;
2304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
2314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
2324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCXFA_Node* CXFA_Node::Clone(bool bRecursive) {
2334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CXFA_Node* pClone = m_pDocument->CreateNode(m_ePacket, m_elementType);
2344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (!pClone)
2354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return nullptr;
2364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
237d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  JSObject()->MergeAllData(pClone);
2384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  pClone->UpdateNameHash();
2394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (IsNeedSavingXMLNode()) {
240d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    std::unique_ptr<CFX_XMLNode> pCloneXML;
2414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (IsAttributeInXML()) {
242d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      WideString wsName = JSObject()
243d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                              ->TryAttribute(XFA_Attribute::Name, false)
244d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                              .value_or(WideString());
245d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      auto pCloneXMLElement = pdfium::MakeUnique<CFX_XMLElement>(wsName);
246d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      WideString wsValue = JSObject()->GetCData(XFA_Attribute::Value);
247d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      if (!wsValue.IsEmpty())
248d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        pCloneXMLElement->SetTextData(WideString(wsValue));
249d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
250d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      pCloneXML.reset(pCloneXMLElement.release());
251d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      pClone->JSObject()->SetEnum(XFA_Attribute::Contains,
252d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                  XFA_AttributeEnum::Unknown, false);
2534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    } else {
254d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      pCloneXML = m_pXMLNode->Clone();
2554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
256d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    pClone->SetXMLMappingNode(pCloneXML.release());
2574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    pClone->SetFlag(XFA_NodeFlag_OwnXMLNode, false);
2584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
2594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (bRecursive) {
260d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    for (CXFA_Node* pChild = GetFirstChild(); pChild;
261d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann         pChild = pChild->GetNextSibling()) {
262d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      pClone->InsertChild(pChild->Clone(bRecursive), nullptr);
2634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
2644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
2654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  pClone->SetFlag(XFA_NodeFlag_Initialized, true);
266d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  pClone->SetBindingNode(nullptr);
2674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return pClone;
2684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
2694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
270d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannCXFA_Node* CXFA_Node::GetPrevSibling() const {
271d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (!m_pParent || m_pParent->m_pChild == this)
272d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return nullptr;
273d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
274d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  for (CXFA_Node* pNode = m_pParent->m_pChild; pNode; pNode = pNode->m_pNext) {
275d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (pNode->m_pNext == this)
276d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      return pNode;
2774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
2784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return nullptr;
2794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
2804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
281d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannCXFA_Node* CXFA_Node::GetNextContainerSibling() const {
282d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  CXFA_Node* pNode = m_pNext;
283d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  while (pNode && pNode->GetObjectType() != XFA_ObjectType::ContainerNode)
284d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    pNode = pNode->m_pNext;
285d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return pNode;
286d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
287d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
288d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannCXFA_Node* CXFA_Node::GetPrevContainerSibling() const {
289d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (!m_pParent || m_pParent->m_pChild == this)
290d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return nullptr;
291d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
292d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  CXFA_Node* container = nullptr;
293d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  for (CXFA_Node* pNode = m_pParent->m_pChild; pNode; pNode = pNode->m_pNext) {
294d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (pNode->GetObjectType() == XFA_ObjectType::ContainerNode)
295d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      container = pNode;
296d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (pNode->m_pNext == this)
297d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      return container;
298d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  }
299d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return nullptr;
300d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
301d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
302d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannCXFA_Node* CXFA_Node::GetFirstContainerChild() const {
303d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  CXFA_Node* pNode = m_pChild;
304d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  while (pNode && pNode->GetObjectType() != XFA_ObjectType::ContainerNode)
305d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    pNode = pNode->m_pNext;
306d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return pNode;
307d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
308d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
309d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannCXFA_Node* CXFA_Node::GetContainerParent() const {
310d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  CXFA_Node* pNode = m_pParent;
311d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  while (pNode && pNode->GetObjectType() != XFA_ObjectType::ContainerNode)
312d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    pNode = pNode->m_pParent;
313d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return pNode;
314d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
315d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
316d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannbool CXFA_Node::IsValidInPacket(XFA_PacketType packet) const {
317d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return !!(m_ValidPackets & (1 << static_cast<uint8_t>(packet)));
318d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
319d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
320d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannconst CXFA_Node::PropertyData* CXFA_Node::GetPropertyData(
321d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    XFA_Element property) const {
322d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (m_Properties == nullptr)
323d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return nullptr;
324d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
325d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  for (size_t i = 0;; ++i) {
326d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    const PropertyData* data = m_Properties + i;
327d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (data->property == XFA_Element::Unknown)
3284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      break;
329d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (data->property == property)
330d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      return data;
331d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  }
332d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return nullptr;
333d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
334d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
335d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannbool CXFA_Node::HasProperty(XFA_Element property) const {
336d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return !!GetPropertyData(property);
337d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
338d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
339d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannbool CXFA_Node::HasPropertyFlags(XFA_Element property, uint8_t flags) const {
340d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  const PropertyData* data = GetPropertyData(property);
341d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return data && !!(data->flags & flags);
342d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
343d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
344d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannuint8_t CXFA_Node::PropertyOccuranceCount(XFA_Element property) const {
345d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  const PropertyData* data = GetPropertyData(property);
346d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return data ? data->occurance_count : 0;
347d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
348d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
349d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannOptional<XFA_Element> CXFA_Node::GetFirstPropertyWithFlag(uint8_t flag) {
350d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (m_Properties == nullptr)
351d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return {};
352d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
353d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  for (size_t i = 0;; ++i) {
354d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    const PropertyData* data = m_Properties + i;
355d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (data->property == XFA_Element::Unknown)
3564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      break;
357d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (data->flags & flag)
358d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      return {data->property};
3594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
360d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return {};
3614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
3624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
363d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannconst CXFA_Node::AttributeData* CXFA_Node::GetAttributeData(
364d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    XFA_Attribute attr) const {
365d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (m_Attributes == nullptr)
366d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return nullptr;
367d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
368d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  for (size_t i = 0;; ++i) {
369d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    const AttributeData* cur_attr = &m_Attributes[i];
370d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (cur_attr->attribute == XFA_Attribute::Unknown)
371d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      break;
372d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (cur_attr->attribute == attr)
373d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      return cur_attr;
3744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
375d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return nullptr;
376d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
377d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
378d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannbool CXFA_Node::HasAttribute(XFA_Attribute attr) const {
379d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return !!GetAttributeData(attr);
380d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
381d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
382d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann// Note: This Method assumes that i is a valid index ....
383d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannXFA_Attribute CXFA_Node::GetAttribute(size_t i) const {
384d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (m_Attributes == nullptr)
385d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return XFA_Attribute::Unknown;
386d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return m_Attributes[i].attribute;
387d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
388d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
389d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannXFA_AttributeType CXFA_Node::GetAttributeType(XFA_Attribute type) const {
390d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  const AttributeData* data = GetAttributeData(type);
391d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return data ? data->type : XFA_AttributeType::CData;
392d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
393d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
394d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannstd::vector<CXFA_Node*> CXFA_Node::GetNodeList(uint32_t dwTypeFilter,
395d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                               XFA_Element eTypeFilter) {
3964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (eTypeFilter != XFA_Element::Unknown) {
397d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    std::vector<CXFA_Node*> nodes;
398d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    for (CXFA_Node* pChild = m_pChild; pChild; pChild = pChild->m_pNext) {
399d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      if (pChild->GetElementType() == eTypeFilter)
400d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        nodes.push_back(pChild);
401d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    }
402d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return nodes;
403d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  }
404d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
405d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (dwTypeFilter == (XFA_NODEFILTER_Children | XFA_NODEFILTER_Properties)) {
406d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    std::vector<CXFA_Node*> nodes;
407d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    for (CXFA_Node* pChild = m_pChild; pChild; pChild = pChild->m_pNext)
408d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      nodes.push_back(pChild);
409d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return nodes;
410d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  }
411d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
412d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (dwTypeFilter == 0)
413d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return std::vector<CXFA_Node*>();
414d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
415d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  bool bFilterChildren = !!(dwTypeFilter & XFA_NODEFILTER_Children);
416d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  bool bFilterProperties = !!(dwTypeFilter & XFA_NODEFILTER_Properties);
417d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  bool bFilterOneOfProperties = !!(dwTypeFilter & XFA_NODEFILTER_OneOfProperty);
418d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  std::vector<CXFA_Node*> nodes;
419d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  for (CXFA_Node* pChild = m_pChild; pChild; pChild = pChild->m_pNext) {
420d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (!HasProperty(pChild->GetElementType())) {
421d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      if (bFilterProperties) {
422d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        nodes.push_back(pChild);
423d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      } else if (bFilterOneOfProperties &&
424d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                 HasPropertyFlags(pChild->GetElementType(),
425d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                  XFA_PROPERTYFLAG_OneOf)) {
426d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        nodes.push_back(pChild);
427d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      } else if (bFilterChildren &&
428d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                 (pChild->GetElementType() == XFA_Element::Variables ||
429d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                  pChild->GetElementType() == XFA_Element::PageSet)) {
430d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        nodes.push_back(pChild);
431d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      }
432d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    } else if (bFilterChildren) {
433d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      nodes.push_back(pChild);
434d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    }
435d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  }
436d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
437d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (!bFilterOneOfProperties || !nodes.empty())
438d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return nodes;
439d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (m_Properties == nullptr)
440d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return nodes;
441d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
442d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  Optional<XFA_Element> property =
443d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      GetFirstPropertyWithFlag(XFA_PROPERTYFLAG_DefaultOneOf);
444d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (!property)
445d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return nodes;
446d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
447d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  CXFA_Node* pNewNode = m_pDocument->CreateNode(GetPacketType(), *property);
448d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (pNewNode) {
449d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    InsertChild(pNewNode, nullptr);
450d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    pNewNode->SetFlag(XFA_NodeFlag_Initialized, true);
451d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    nodes.push_back(pNewNode);
4524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
453d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return nodes;
4544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
4554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
456d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannCXFA_Node* CXFA_Node::CreateSamePacketNode(XFA_Element eType) {
4574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CXFA_Node* pNode = m_pDocument->CreateNode(m_ePacket, eType);
458d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  pNode->SetFlag(XFA_NodeFlag_Initialized, true);
4594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return pNode;
4604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
4614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
4624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCXFA_Node* CXFA_Node::CloneTemplateToForm(bool bRecursive) {
463d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  ASSERT(m_ePacket == XFA_PacketType::Template);
4644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CXFA_Node* pClone =
465d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      m_pDocument->CreateNode(XFA_PacketType::Form, m_elementType);
4664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (!pClone)
4674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return nullptr;
4684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
4694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  pClone->SetTemplateNode(this);
4704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  pClone->UpdateNameHash();
4714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  pClone->SetXMLMappingNode(GetXMLMappingNode());
4724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (bRecursive) {
473d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    for (CXFA_Node* pChild = GetFirstChild(); pChild;
474d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann         pChild = pChild->GetNextSibling()) {
475d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      pClone->InsertChild(pChild->CloneTemplateToForm(bRecursive), nullptr);
4764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
4774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
4784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  pClone->SetFlag(XFA_NodeFlag_Initialized, true);
4794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return pClone;
4804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
4814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
482d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannCXFA_Node* CXFA_Node::GetTemplateNodeIfExists() const {
4834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return m_pAuxNode;
4844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
4854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
4864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CXFA_Node::SetTemplateNode(CXFA_Node* pTemplateNode) {
4874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_pAuxNode = pTemplateNode;
4884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
4894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
4904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCXFA_Node* CXFA_Node::GetBindData() {
491d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  ASSERT(GetPacketType() == XFA_PacketType::Form);
492d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return GetBindingNode();
4934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
4944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
495d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannstd::vector<UnownedPtr<CXFA_Node>>* CXFA_Node::GetBindItems() {
496d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return GetBindingNodes();
4974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
4984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
4994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannint32_t CXFA_Node::AddBindItem(CXFA_Node* pFormNode) {
5004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  ASSERT(pFormNode);
501d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
5024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (BindsFormItems()) {
503d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    bool found = false;
504d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    for (auto& v : binding_nodes_) {
505d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      if (v.Get() == pFormNode) {
506d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        found = true;
507d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        break;
508d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      }
5094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
510d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (!found)
511d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      binding_nodes_.emplace_back(pFormNode);
512d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return pdfium::CollectionSize<int32_t>(binding_nodes_);
5134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
514d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
515d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  CXFA_Node* pOldFormItem = GetBindingNode();
5164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (!pOldFormItem) {
517d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    SetBindingNode(pFormNode);
5184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return 1;
5194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
520d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (pOldFormItem == pFormNode)
521d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return 1;
522d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
523d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  std::vector<UnownedPtr<CXFA_Node>> items;
524d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  items.emplace_back(pOldFormItem);
525d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  items.emplace_back(pFormNode);
526d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  SetBindingNodes(std::move(items));
527d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
5284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_uNodeFlags |= XFA_NodeFlag_BindFormItems;
5294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return 2;
5304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
5314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
5324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannint32_t CXFA_Node::RemoveBindItem(CXFA_Node* pFormNode) {
5334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (BindsFormItems()) {
534d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    auto it = std::find_if(binding_nodes_.begin(), binding_nodes_.end(),
535d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                           [&pFormNode](const UnownedPtr<CXFA_Node>& node) {
536d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                             return node.Get() == pFormNode;
537d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                           });
538d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (it != binding_nodes_.end())
539d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      binding_nodes_.erase(it);
540d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
541d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (binding_nodes_.size() == 1) {
542d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      m_uNodeFlags &= ~XFA_NodeFlag_BindFormItems;
543d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      return 1;
5444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
545d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return pdfium::CollectionSize<int32_t>(binding_nodes_);
5464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
5474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
548d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  CXFA_Node* pOldFormItem = GetBindingNode();
549d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (pOldFormItem != pFormNode)
550d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return pOldFormItem ? 1 : 0;
551d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
552d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  SetBindingNode(nullptr);
553d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return 0;
5544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
5554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
556d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannbool CXFA_Node::HasBindItem() {
557d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return GetPacketType() == XFA_PacketType::Datasets && GetBindingNode();
5584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
5594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
560d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannCXFA_WidgetAcc* CXFA_Node::GetContainerWidgetAcc() {
561d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (GetPacketType() != XFA_PacketType::Form)
5624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return nullptr;
5634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  XFA_Element eType = GetElementType();
5644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (eType == XFA_Element::ExclGroup)
5654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return nullptr;
566d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  CXFA_Node* pParentNode = GetParent();
5674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (pParentNode && pParentNode->GetElementType() == XFA_Element::ExclGroup)
5684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return nullptr;
5694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
5704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (eType == XFA_Element::Field) {
571d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    CXFA_WidgetAcc* pFieldWidgetAcc = GetWidgetAcc();
572d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (pFieldWidgetAcc && pFieldWidgetAcc->IsChoiceListMultiSelect())
5734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      return nullptr;
574d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
575d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    WideString wsPicture;
576d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (pFieldWidgetAcc) {
577d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      wsPicture = pFieldWidgetAcc->GetPictureContent(XFA_VALUEPICTURE_DataBind);
578d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    }
579d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (!wsPicture.IsEmpty())
580d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      return pFieldWidgetAcc;
581d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
582d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    CXFA_Node* pDataNode = GetBindData();
583d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (!pDataNode)
584d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      return nullptr;
585d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    pFieldWidgetAcc = nullptr;
586d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    for (const auto& pFormNode : *(pDataNode->GetBindItems())) {
587d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      if (!pFormNode || pFormNode->HasRemovedChildren())
588d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        continue;
589d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      pFieldWidgetAcc = pFormNode->GetWidgetAcc();
590d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      if (pFieldWidgetAcc) {
591d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        wsPicture =
592d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann            pFieldWidgetAcc->GetPictureContent(XFA_VALUEPICTURE_DataBind);
5934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
5944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      if (!wsPicture.IsEmpty())
595d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        break;
596d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      pFieldWidgetAcc = nullptr;
5974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
598d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return pFieldWidgetAcc;
5994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
600d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
601d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  CXFA_Node* pGrandNode = pParentNode ? pParentNode->GetParent() : nullptr;
6024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CXFA_Node* pValueNode =
6034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      (pParentNode && pParentNode->GetElementType() == XFA_Element::Value)
6044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          ? pParentNode
6054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          : nullptr;
6064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (!pValueNode) {
6074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    pValueNode =
6084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        (pGrandNode && pGrandNode->GetElementType() == XFA_Element::Value)
6094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann            ? pGrandNode
6104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann            : nullptr;
6114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
6124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CXFA_Node* pParentOfValueNode =
613d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      pValueNode ? pValueNode->GetParent() : nullptr;
614d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return pParentOfValueNode ? pParentOfValueNode->GetContainerWidgetAcc()
6154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                            : nullptr;
6164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
6174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
618d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannIFX_Locale* CXFA_Node::GetLocale() {
619d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  Optional<WideString> localeName = GetLocaleName();
620d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (!localeName)
621d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return nullptr;
622d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (localeName.value() == L"ambient")
623d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return GetDocument()->GetLocalMgr()->GetDefLocale();
624d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return GetDocument()->GetLocalMgr()->GetLocaleByName(localeName.value());
625d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
626d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
627d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannOptional<WideString> CXFA_Node::GetLocaleName() {
6284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CXFA_Node* pForm = GetDocument()->GetXFAObject(XFA_HASHCODE_Form)->AsNode();
629d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  CXFA_Subform* pTopSubform =
630d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      pForm->GetFirstChildByClass<CXFA_Subform>(XFA_Element::Subform);
6314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  ASSERT(pTopSubform);
632d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
6334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CXFA_Node* pLocaleNode = this;
6344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  do {
635d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    Optional<WideString> localeName =
636d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        pLocaleNode->JSObject()->TryCData(XFA_Attribute::Locale, false);
637d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (localeName)
638d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      return localeName;
639d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
640d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    pLocaleNode = pLocaleNode->GetParent();
641d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  } while (pLocaleNode && pLocaleNode != pTopSubform);
642d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
6434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CXFA_Node* pConfig = ToNode(GetDocument()->GetXFAObject(XFA_HASHCODE_Config));
644d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  Optional<WideString> localeName = {
645d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      WideString(GetDocument()->GetLocalMgr()->GetConfigLocaleName(pConfig))};
646d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (localeName && !localeName->IsEmpty())
647d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return localeName;
648d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
649d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (pTopSubform) {
650d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    localeName =
651d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        pTopSubform->JSObject()->TryCData(XFA_Attribute::Locale, false);
652d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (localeName)
653d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      return localeName;
6544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
655d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
6564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  IFX_Locale* pLocale = GetDocument()->GetLocalMgr()->GetDefLocale();
657d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (!pLocale)
658d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return {};
659d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
660d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return {pLocale->GetName()};
6614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
6624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
663d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannXFA_AttributeEnum CXFA_Node::GetIntact() {
664d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  CXFA_Keep* pKeep = GetFirstChildByClass<CXFA_Keep>(XFA_Element::Keep);
665d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  XFA_AttributeEnum eLayoutType = JSObject()
666d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                      ->TryEnum(XFA_Attribute::Layout, true)
667d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                      .value_or(XFA_AttributeEnum::Position);
6684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (pKeep) {
669d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    Optional<XFA_AttributeEnum> intact =
670d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        pKeep->JSObject()->TryEnum(XFA_Attribute::Intact, false);
671d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (intact) {
672d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      if (*intact == XFA_AttributeEnum::None &&
673d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann          eLayoutType == XFA_AttributeEnum::Row &&
6744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          m_pDocument->GetCurVersionMode() < XFA_VERSION_208) {
675d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        CXFA_Node* pPreviewRow = GetPrevContainerSibling();
6764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        if (pPreviewRow &&
677d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann            pPreviewRow->JSObject()->GetEnum(XFA_Attribute::Layout) ==
678d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                XFA_AttributeEnum::Row) {
679d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann          Optional<XFA_AttributeEnum> value =
680d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann              pKeep->JSObject()->TryEnum(XFA_Attribute::Previous, false);
681d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann          if (value && (*value == XFA_AttributeEnum::ContentArea ||
682d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                        *value == XFA_AttributeEnum::PageArea)) {
683d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann            return XFA_AttributeEnum::ContentArea;
6844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          }
685d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
686d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann          CXFA_Keep* pNode =
687d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann              pPreviewRow->GetFirstChildByClass<CXFA_Keep>(XFA_Element::Keep);
688d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann          Optional<XFA_AttributeEnum> ret;
689d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann          if (pNode)
690d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann            ret = pNode->JSObject()->TryEnum(XFA_Attribute::Next, false);
691d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann          if (ret && (*ret == XFA_AttributeEnum::ContentArea ||
692d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                      *ret == XFA_AttributeEnum::PageArea)) {
693d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann            return XFA_AttributeEnum::ContentArea;
6944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          }
6954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        }
6964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
697d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      return *intact;
6984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
6994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
700d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
7014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  switch (GetElementType()) {
7024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    case XFA_Element::Subform:
7034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      switch (eLayoutType) {
704d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        case XFA_AttributeEnum::Position:
705d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        case XFA_AttributeEnum::Row:
706d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann          return XFA_AttributeEnum::ContentArea;
7074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        default:
708d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann          return XFA_AttributeEnum::None;
7094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
7104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    case XFA_Element::Field: {
711d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      CXFA_Node* parent = GetParent();
712d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      if (!parent || parent->GetElementType() == XFA_Element::PageArea)
713d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        return XFA_AttributeEnum::ContentArea;
714d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      if (parent->GetIntact() != XFA_AttributeEnum::None)
715d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        return XFA_AttributeEnum::ContentArea;
716d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
717d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      XFA_AttributeEnum eParLayout = parent->JSObject()
718d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                         ->TryEnum(XFA_Attribute::Layout, true)
719d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                         .value_or(XFA_AttributeEnum::Position);
720d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      if (eParLayout == XFA_AttributeEnum::Position ||
721d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann          eParLayout == XFA_AttributeEnum::Row ||
722d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann          eParLayout == XFA_AttributeEnum::Table) {
723d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        return XFA_AttributeEnum::None;
724d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      }
725d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
726d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      XFA_VERSION version = m_pDocument->GetCurVersionMode();
727d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      if (eParLayout == XFA_AttributeEnum::Tb && version < XFA_VERSION_208) {
728d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        Optional<CXFA_Measurement> measureH =
729d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann            JSObject()->TryMeasure(XFA_Attribute::H, false);
730d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        if (measureH)
731d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann          return XFA_AttributeEnum::ContentArea;
732d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      }
733d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      return XFA_AttributeEnum::None;
7344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
7354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    case XFA_Element::Draw:
736d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      return XFA_AttributeEnum::ContentArea;
7374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    default:
738d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      return XFA_AttributeEnum::None;
7394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
7404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
7414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
7424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCXFA_Node* CXFA_Node::GetDataDescriptionNode() {
743d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (m_ePacket == XFA_PacketType::Datasets)
7444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return m_pAuxNode;
7454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return nullptr;
7464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
7474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
7484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CXFA_Node::SetDataDescriptionNode(CXFA_Node* pDataDescriptionNode) {
749d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  ASSERT(m_ePacket == XFA_PacketType::Datasets);
7504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  m_pAuxNode = pDataDescriptionNode;
7514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
7524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
753d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannCXFA_Node* CXFA_Node::GetModelNode() {
754d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  switch (GetPacketType()) {
755d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    case XFA_PacketType::Xdp:
756d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      return m_pDocument->GetRoot();
757d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    case XFA_PacketType::Config:
758d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      return ToNode(m_pDocument->GetXFAObject(XFA_HASHCODE_Config));
759d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    case XFA_PacketType::Template:
760d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      return ToNode(m_pDocument->GetXFAObject(XFA_HASHCODE_Template));
761d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    case XFA_PacketType::Form:
762d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      return ToNode(m_pDocument->GetXFAObject(XFA_HASHCODE_Form));
763d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    case XFA_PacketType::Datasets:
764d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      return ToNode(m_pDocument->GetXFAObject(XFA_HASHCODE_Datasets));
765d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    case XFA_PacketType::LocaleSet:
766d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      return ToNode(m_pDocument->GetXFAObject(XFA_HASHCODE_LocaleSet));
767d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    case XFA_PacketType::ConnectionSet:
768d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      return ToNode(m_pDocument->GetXFAObject(XFA_HASHCODE_ConnectionSet));
769d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    case XFA_PacketType::SourceSet:
770d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      return ToNode(m_pDocument->GetXFAObject(XFA_HASHCODE_SourceSet));
771d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    case XFA_PacketType::Xdc:
772d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      return ToNode(m_pDocument->GetXFAObject(XFA_HASHCODE_Xdc));
773d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    default:
774d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      return this;
7754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
7764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
7774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
778d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannsize_t CXFA_Node::CountChildren(XFA_Element eType, bool bOnlyChild) {
779d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  size_t count = 0;
780d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  for (CXFA_Node* pNode = m_pChild; pNode; pNode = pNode->GetNextSibling()) {
781d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (pNode->GetElementType() != eType && eType != XFA_Element::Unknown)
782d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      continue;
783d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (bOnlyChild && HasProperty(pNode->GetElementType()))
784d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      continue;
785d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    ++count;
7864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
787d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return count;
7884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
7894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
790d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannCXFA_Node* CXFA_Node::GetChildInternal(size_t index,
791d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                       XFA_Element eType,
792d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                       bool bOnlyChild) {
793d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  size_t count = 0;
794d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  for (CXFA_Node* pNode = m_pChild; pNode; pNode = pNode->GetNextSibling()) {
795d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (pNode->GetElementType() != eType && eType != XFA_Element::Unknown)
796d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      continue;
797d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (bOnlyChild && HasProperty(pNode->GetElementType()))
798d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      continue;
799d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (count == index)
800d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      return pNode;
8014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
802d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    ++count;
8034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
804d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return nullptr;
8054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
8064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
807d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannint32_t CXFA_Node::InsertChild(int32_t index, CXFA_Node* pNode) {
808d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  ASSERT(!pNode->m_pNext);
809d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  pNode->m_pParent = this;
810d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  bool ret = m_pDocument->RemovePurgeNode(pNode);
811d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  ASSERT(ret);
812d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  (void)ret;  // Avoid unused variable warning.
8134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
814d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (!m_pChild || index == 0) {
815d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (index > 0) {
816d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      return -1;
817d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    }
818d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    pNode->m_pNext = m_pChild;
819d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    m_pChild = pNode;
820d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    index = 0;
821d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  } else if (index < 0) {
822d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    m_pLastChild->m_pNext = pNode;
8234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  } else {
824d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    CXFA_Node* pPrev = m_pChild;
825d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    int32_t iCount = 0;
826d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    while (++iCount != index && pPrev->m_pNext) {
827d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      pPrev = pPrev->m_pNext;
828d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    }
829d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (index > 0 && index != iCount) {
830d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      return -1;
831d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    }
832d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    pNode->m_pNext = pPrev->m_pNext;
833d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    pPrev->m_pNext = pNode;
834d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    index = iCount;
8354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
836d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (!pNode->m_pNext) {
837d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    m_pLastChild = pNode;
8384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
839d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  ASSERT(m_pLastChild);
840d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  ASSERT(!m_pLastChild->m_pNext);
841d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  pNode->ClearFlag(XFA_NodeFlag_HasRemovedChildren);
842d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  CXFA_FFNotify* pNotify = m_pDocument->GetNotify();
843d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (pNotify)
844d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    pNotify->OnChildAdded(this);
8454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
846d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (IsNeedSavingXMLNode() && pNode->m_pXMLNode) {
847d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    ASSERT(!pNode->m_pXMLNode->GetNodeItem(CFX_XMLNode::Parent));
848d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    m_pXMLNode->InsertChildNode(pNode->m_pXMLNode, index);
849d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    pNode->ClearFlag(XFA_NodeFlag_OwnXMLNode);
8504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
851d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return index;
8524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
8534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
854d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannbool CXFA_Node::InsertChild(CXFA_Node* pNode, CXFA_Node* pBeforeNode) {
855d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (!pNode || pNode->m_pParent ||
856d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      (pBeforeNode && pBeforeNode->m_pParent != this)) {
857d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    NOTREACHED();
858d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return false;
8594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
860d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  bool ret = m_pDocument->RemovePurgeNode(pNode);
861d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  ASSERT(ret);
862d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  (void)ret;  // Avoid unused variable warning.
8634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
864d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  int32_t nIndex = -1;
865d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  pNode->m_pParent = this;
866d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (!m_pChild || pBeforeNode == m_pChild) {
867d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    pNode->m_pNext = m_pChild;
868d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    m_pChild = pNode;
869d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    nIndex = 0;
870d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  } else if (!pBeforeNode) {
871d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    pNode->m_pNext = m_pLastChild->m_pNext;
872d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    m_pLastChild->m_pNext = pNode;
873d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  } else {
874d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    nIndex = 1;
875d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    CXFA_Node* pPrev = m_pChild;
876d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    while (pPrev->m_pNext != pBeforeNode) {
877d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      pPrev = pPrev->m_pNext;
878d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      nIndex++;
879d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    }
880d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    pNode->m_pNext = pPrev->m_pNext;
881d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    pPrev->m_pNext = pNode;
8824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
883d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (!pNode->m_pNext) {
884d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    m_pLastChild = pNode;
8854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
886d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  ASSERT(m_pLastChild);
887d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  ASSERT(!m_pLastChild->m_pNext);
888d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  pNode->ClearFlag(XFA_NodeFlag_HasRemovedChildren);
889d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  CXFA_FFNotify* pNotify = m_pDocument->GetNotify();
890d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (pNotify)
891d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    pNotify->OnChildAdded(this);
892d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
893d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (IsNeedSavingXMLNode() && pNode->m_pXMLNode) {
894d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    ASSERT(!pNode->m_pXMLNode->GetNodeItem(CFX_XMLNode::Parent));
895d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    m_pXMLNode->InsertChildNode(pNode->m_pXMLNode, nIndex);
896d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    pNode->ClearFlag(XFA_NodeFlag_OwnXMLNode);
8974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
898d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return true;
8994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
9004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
901d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannCXFA_Node* CXFA_Node::Deprecated_GetPrevSibling() {
902d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (!m_pParent) {
903d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return nullptr;
9044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
905d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  for (CXFA_Node* pSibling = m_pParent->m_pChild; pSibling;
906d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann       pSibling = pSibling->m_pNext) {
907d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (pSibling->m_pNext == this) {
908d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      return pSibling;
9094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
9104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
911d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return nullptr;
9124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
9134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
914d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannbool CXFA_Node::RemoveChild(CXFA_Node* pNode, bool bNotify) {
915d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (!pNode || pNode->m_pParent != this) {
916d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    NOTREACHED();
917d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return false;
9184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
919d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (m_pChild == pNode) {
920d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    m_pChild = pNode->m_pNext;
921d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (m_pLastChild == pNode) {
922d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      m_pLastChild = pNode->m_pNext;
9234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
924d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    pNode->m_pNext = nullptr;
925d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    pNode->m_pParent = nullptr;
9264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  } else {
927d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    CXFA_Node* pPrev = pNode->Deprecated_GetPrevSibling();
928d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    pPrev->m_pNext = pNode->m_pNext;
929d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (m_pLastChild == pNode) {
930d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      m_pLastChild = pNode->m_pNext ? pNode->m_pNext : pPrev;
9314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
932d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    pNode->m_pNext = nullptr;
933d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    pNode->m_pParent = nullptr;
9344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
935d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  ASSERT(!m_pLastChild || !m_pLastChild->m_pNext);
936d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  OnRemoved(bNotify);
937d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  pNode->SetFlag(XFA_NodeFlag_HasRemovedChildren, true);
938d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  m_pDocument->AddPurgeNode(pNode);
939d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (IsNeedSavingXMLNode() && pNode->m_pXMLNode) {
940d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (pNode->IsAttributeInXML()) {
941d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      ASSERT(pNode->m_pXMLNode == m_pXMLNode &&
942d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann             m_pXMLNode->GetType() == FX_XMLNODE_Element);
943d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      if (pNode->m_pXMLNode->GetType() == FX_XMLNODE_Element) {
944d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        CFX_XMLElement* pXMLElement =
945d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann            static_cast<CFX_XMLElement*>(pNode->m_pXMLNode);
946d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        WideString wsAttributeName =
947d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann            pNode->JSObject()->GetCData(XFA_Attribute::QualifiedName);
948d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        pXMLElement->RemoveAttribute(wsAttributeName.c_str());
9494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
950d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
951d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      WideString wsName = pNode->JSObject()
952d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                              ->TryAttribute(XFA_Attribute::Name, false)
953d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                              .value_or(WideString());
954d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      CFX_XMLElement* pNewXMLElement = new CFX_XMLElement(wsName);
955d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      WideString wsValue = JSObject()->GetCData(XFA_Attribute::Value);
956d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      if (!wsValue.IsEmpty())
957d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        pNewXMLElement->SetTextData(WideString(wsValue));
958d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
959d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      pNode->m_pXMLNode = pNewXMLElement;
960d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      pNode->JSObject()->SetEnum(XFA_Attribute::Contains,
961d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                 XFA_AttributeEnum::Unknown, false);
9624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    } else {
963d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      m_pXMLNode->RemoveChildNode(pNode->m_pXMLNode);
9644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
965d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    pNode->SetFlag(XFA_NodeFlag_OwnXMLNode, false);
9664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
967d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return true;
9684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
9694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
970d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannCXFA_Node* CXFA_Node::GetFirstChildByName(const WideStringView& wsName) const {
971d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return GetFirstChildByName(FX_HashCode_GetW(wsName, false));
9724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
9734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
974d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannCXFA_Node* CXFA_Node::GetFirstChildByName(uint32_t dwNameHash) const {
975d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  for (CXFA_Node* pNode = GetFirstChild(); pNode;
976d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann       pNode = pNode->GetNextSibling()) {
977d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (pNode->GetNameHash() == dwNameHash) {
978d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      return pNode;
9794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
9804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
981d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return nullptr;
982d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
9834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
984d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannCXFA_Node* CXFA_Node::GetFirstChildByClassInternal(XFA_Element eType) const {
985d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  for (CXFA_Node* pNode = GetFirstChild(); pNode;
986d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann       pNode = pNode->GetNextSibling()) {
987d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (pNode->GetElementType() == eType) {
988d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      return pNode;
9894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
9904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
991d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return nullptr;
9924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
9934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
994d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannCXFA_Node* CXFA_Node::GetNextSameNameSibling(uint32_t dwNameHash) const {
995d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  for (CXFA_Node* pNode = GetNextSibling(); pNode;
996d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann       pNode = pNode->GetNextSibling()) {
997d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (pNode->GetNameHash() == dwNameHash) {
998d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      return pNode;
999d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    }
10004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
1001d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return nullptr;
10024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
10034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1004d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannCXFA_Node* CXFA_Node::GetNextSameNameSiblingInternal(
1005d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    const WideStringView& wsNodeName) const {
1006d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return GetNextSameNameSibling(FX_HashCode_GetW(wsNodeName, false));
10074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
10084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1009d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannCXFA_Node* CXFA_Node::GetNextSameClassSiblingInternal(XFA_Element eType) const {
1010d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  for (CXFA_Node* pNode = GetNextSibling(); pNode;
1011d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann       pNode = pNode->GetNextSibling()) {
1012d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (pNode->GetElementType() == eType) {
1013d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      return pNode;
1014d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    }
10154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
1016d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return nullptr;
10174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
10184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1019d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannint32_t CXFA_Node::GetNodeSameNameIndex() const {
1020d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  CFXJSE_Engine* pScriptContext = m_pDocument->GetScriptContext();
1021d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (!pScriptContext) {
1022d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return -1;
10234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
1024d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return pScriptContext->GetIndexByName(const_cast<CXFA_Node*>(this));
10254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
10264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1027d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannint32_t CXFA_Node::GetNodeSameClassIndex() const {
1028d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  CFXJSE_Engine* pScriptContext = m_pDocument->GetScriptContext();
1029d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (!pScriptContext) {
1030d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return -1;
10314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
1032d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return pScriptContext->GetIndexByClassName(const_cast<CXFA_Node*>(this));
10334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
10344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1035d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannCXFA_Node* CXFA_Node::GetInstanceMgrOfSubform() {
1036d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  CXFA_Node* pInstanceMgr = nullptr;
1037d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (m_ePacket == XFA_PacketType::Form) {
1038d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    CXFA_Node* pParentNode = GetParent();
1039d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (!pParentNode || pParentNode->GetElementType() == XFA_Element::Area) {
1040d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      return pInstanceMgr;
1041d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    }
1042d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    for (CXFA_Node* pNode = GetPrevSibling(); pNode;
1043d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann         pNode = pNode->GetPrevSibling()) {
1044d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      XFA_Element eType = pNode->GetElementType();
1045d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      if ((eType == XFA_Element::Subform || eType == XFA_Element::SubformSet) &&
1046d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann          pNode->m_dwNameHash != m_dwNameHash) {
1047d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        break;
1048d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      }
1049d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      if (eType == XFA_Element::InstanceManager) {
1050d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        WideString wsName = JSObject()->GetCData(XFA_Attribute::Name);
1051d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        WideString wsInstName =
1052d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann            pNode->JSObject()->GetCData(XFA_Attribute::Name);
1053d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        if (wsInstName.GetLength() > 0 && wsInstName[0] == '_' &&
1054d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann            wsInstName.Right(wsInstName.GetLength() - 1) == wsName) {
1055d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann          pInstanceMgr = pNode;
1056d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        }
1057d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        break;
1058d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      }
1059d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    }
10604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
1061d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return pInstanceMgr;
1062d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
10634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1064d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannCXFA_Occur* CXFA_Node::GetOccurIfExists() {
1065d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return GetFirstChildByClass<CXFA_Occur>(XFA_Element::Occur);
1066d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
1067d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
1068d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannbool CXFA_Node::HasFlag(XFA_NodeFlag dwFlag) const {
1069d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (m_uNodeFlags & dwFlag)
1070d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return true;
1071d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (dwFlag == XFA_NodeFlag_HasRemovedChildren)
1072d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return m_pParent && m_pParent->HasFlag(dwFlag);
1073d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return false;
10744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
10754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1076d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CXFA_Node::SetFlag(uint32_t dwFlag, bool bNotify) {
1077d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (dwFlag == XFA_NodeFlag_Initialized && bNotify && !IsInitialized()) {
1078d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    CXFA_FFNotify* pNotify = m_pDocument->GetNotify();
1079d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (pNotify) {
1080d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      pNotify->OnNodeReady(this);
1081d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    }
1082d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  }
1083d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  m_uNodeFlags |= dwFlag;
1084d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
10854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1086d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CXFA_Node::ClearFlag(uint32_t dwFlag) {
1087d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  m_uNodeFlags &= ~dwFlag;
10884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
1089d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
1090d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CXFA_Node::ReleaseBindingNodes() {
1091d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  // Clear any binding nodes as we don't necessarily destruct in an order that
1092d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  // makes sense.
1093d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  for (auto& node : binding_nodes_)
1094d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    node.Release();
1095d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
1096d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  for (CXFA_Node* pNode = m_pChild; pNode; pNode = pNode->m_pNext)
1097d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    pNode->ReleaseBindingNodes();
10984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
10994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1100d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannbool CXFA_Node::IsAttributeInXML() {
1101d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return JSObject()->GetEnum(XFA_Attribute::Contains) ==
1102d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann         XFA_AttributeEnum::MetaData;
11034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
11044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1105d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CXFA_Node::OnRemoved(bool bNotify) {
1106d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (!bNotify)
11074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return;
1108d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
1109d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  CXFA_FFNotify* pNotify = m_pDocument->GetNotify();
1110d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (pNotify)
1111d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    pNotify->OnChildRemoved();
1112d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
1113d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
1114d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CXFA_Node::UpdateNameHash() {
1115d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  WideString wsName = JSObject()->GetCData(XFA_Attribute::Name);
1116d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  m_dwNameHash = FX_HashCode_GetW(wsName.AsStringView(), false);
1117d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
1118d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
1119d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannCFX_XMLNode* CXFA_Node::CreateXMLMappingNode() {
1120d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (!m_pXMLNode) {
1121d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    WideString wsTag(JSObject()->GetCData(XFA_Attribute::Name));
1122d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    m_pXMLNode = new CFX_XMLElement(wsTag);
1123d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    SetFlag(XFA_NodeFlag_OwnXMLNode, false);
11244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
1125d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return m_pXMLNode;
1126d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
1127d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
1128d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannbool CXFA_Node::IsNeedSavingXMLNode() {
1129d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return m_pXMLNode && (GetPacketType() == XFA_PacketType::Datasets ||
1130d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                        GetElementType() == XFA_Element::Xfa);
1131d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
1132d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
1133d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannCXFA_Node* CXFA_Node::GetItemIfExists(int32_t iIndex) {
1134d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  int32_t iCount = 0;
1135d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  uint32_t dwNameHash = 0;
1136d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  for (CXFA_Node* pNode = GetNextSibling(); pNode;
1137d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann       pNode = pNode->GetNextSibling()) {
1138d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    XFA_Element eCurType = pNode->GetElementType();
1139d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (eCurType == XFA_Element::InstanceManager)
1140d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      break;
1141d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if ((eCurType != XFA_Element::Subform) &&
1142d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        (eCurType != XFA_Element::SubformSet)) {
1143d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      continue;
1144d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    }
1145d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (iCount == 0) {
1146d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      WideString wsName = pNode->JSObject()->GetCData(XFA_Attribute::Name);
1147d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      WideString wsInstName = JSObject()->GetCData(XFA_Attribute::Name);
1148d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      if (wsInstName.GetLength() < 1 || wsInstName[0] != '_' ||
1149d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann          wsInstName.Right(wsInstName.GetLength() - 1) != wsName) {
1150d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        return nullptr;
1151d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      }
1152d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      dwNameHash = pNode->GetNameHash();
1153d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    }
1154d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (dwNameHash != pNode->GetNameHash())
1155d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      break;
1156d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
1157d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    iCount++;
1158d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (iCount > iIndex)
1159d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      return pNode;
11604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
1161d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return nullptr;
11624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
11634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1164d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannint32_t CXFA_Node::GetCount() {
1165d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  int32_t iCount = 0;
1166d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  uint32_t dwNameHash = 0;
1167d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  for (CXFA_Node* pNode = GetNextSibling(); pNode;
1168d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann       pNode = pNode->GetNextSibling()) {
1169d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    XFA_Element eCurType = pNode->GetElementType();
1170d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (eCurType == XFA_Element::InstanceManager)
1171d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      break;
1172d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if ((eCurType != XFA_Element::Subform) &&
1173d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        (eCurType != XFA_Element::SubformSet)) {
1174d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      continue;
1175d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    }
1176d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (iCount == 0) {
1177d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      WideString wsName = pNode->JSObject()->GetCData(XFA_Attribute::Name);
1178d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      WideString wsInstName = JSObject()->GetCData(XFA_Attribute::Name);
1179d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      if (wsInstName.GetLength() < 1 || wsInstName[0] != '_' ||
1180d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann          wsInstName.Right(wsInstName.GetLength() - 1) != wsName) {
1181d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        return iCount;
1182d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      }
1183d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      dwNameHash = pNode->GetNameHash();
1184d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    }
1185d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (dwNameHash != pNode->GetNameHash())
1186d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      break;
1187d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
1188d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    iCount++;
11894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
1190d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return iCount;
11914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
11924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1193d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CXFA_Node::InsertItem(CXFA_Node* pNewInstance,
1194d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                           int32_t iPos,
1195d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                           int32_t iCount,
1196d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                           bool bMoveDataBindingNodes) {
1197d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (iCount < 0)
1198d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    iCount = GetCount();
1199d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (iPos < 0)
1200d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    iPos = iCount;
1201d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (iPos == iCount) {
1202d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    CXFA_Node* item = GetItemIfExists(iCount - 1);
1203d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (!item)
1204d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      return;
1205d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
1206d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    CXFA_Node* pNextSibling =
1207d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        iCount > 0 ? item->GetNextSibling() : GetNextSibling();
1208d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    GetParent()->InsertChild(pNewInstance, pNextSibling);
1209d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (bMoveDataBindingNodes) {
1210d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      std::set<CXFA_Node*> sNew;
1211d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      std::set<CXFA_Node*> sAfter;
1212d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      CXFA_NodeIteratorTemplate<CXFA_Node,
1213d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                CXFA_TraverseStrategy_XFAContainerNode>
1214d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann          sIteratorNew(pNewInstance);
1215d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      for (CXFA_Node* pNode = sIteratorNew.GetCurrent(); pNode;
1216d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann           pNode = sIteratorNew.MoveToNext()) {
1217d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        CXFA_Node* pDataNode = pNode->GetBindData();
1218d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        if (!pDataNode)
1219d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann          continue;
1220d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
1221d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        sNew.insert(pDataNode);
1222d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      }
1223d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      CXFA_NodeIteratorTemplate<CXFA_Node,
1224d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                CXFA_TraverseStrategy_XFAContainerNode>
1225d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann          sIteratorAfter(pNextSibling);
1226d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      for (CXFA_Node* pNode = sIteratorAfter.GetCurrent(); pNode;
1227d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann           pNode = sIteratorAfter.MoveToNext()) {
1228d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        CXFA_Node* pDataNode = pNode->GetBindData();
1229d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        if (!pDataNode)
1230d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann          continue;
1231d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
1232d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        sAfter.insert(pDataNode);
1233d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      }
1234d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      ReorderDataNodes(sNew, sAfter, false);
1235d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    }
12364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  } else {
1237d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    CXFA_Node* pBeforeInstance = GetItemIfExists(iPos);
1238d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (!pBeforeInstance) {
1239d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      // TODO(dsinclair): What should happen here?
1240d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      return;
1241d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    }
1242d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
1243d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    GetParent()->InsertChild(pNewInstance, pBeforeInstance);
1244d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (bMoveDataBindingNodes) {
1245d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      std::set<CXFA_Node*> sNew;
1246d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      std::set<CXFA_Node*> sBefore;
1247d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      CXFA_NodeIteratorTemplate<CXFA_Node,
1248d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                CXFA_TraverseStrategy_XFAContainerNode>
1249d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann          sIteratorNew(pNewInstance);
1250d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      for (CXFA_Node* pNode = sIteratorNew.GetCurrent(); pNode;
1251d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann           pNode = sIteratorNew.MoveToNext()) {
1252d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        CXFA_Node* pDataNode = pNode->GetBindData();
1253d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        if (!pDataNode)
1254d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann          continue;
1255d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
1256d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        sNew.insert(pDataNode);
1257d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      }
1258d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      CXFA_NodeIteratorTemplate<CXFA_Node,
1259d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                CXFA_TraverseStrategy_XFAContainerNode>
1260d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann          sIteratorBefore(pBeforeInstance);
1261d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      for (CXFA_Node* pNode = sIteratorBefore.GetCurrent(); pNode;
1262d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann           pNode = sIteratorBefore.MoveToNext()) {
1263d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        CXFA_Node* pDataNode = pNode->GetBindData();
1264d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        if (!pDataNode)
1265d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann          continue;
1266d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
1267d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        sBefore.insert(pDataNode);
1268d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      }
1269d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      ReorderDataNodes(sNew, sBefore, true);
1270d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    }
12714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
12724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
12734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1274d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CXFA_Node::RemoveItem(CXFA_Node* pRemoveInstance,
1275d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                           bool bRemoveDataBinding) {
1276d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  GetParent()->RemoveChild(pRemoveInstance, true);
1277d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (!bRemoveDataBinding)
12784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return;
1279d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
1280d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  CXFA_NodeIteratorTemplate<CXFA_Node, CXFA_TraverseStrategy_XFAContainerNode>
1281d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      sIterator(pRemoveInstance);
1282d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  for (CXFA_Node* pFormNode = sIterator.GetCurrent(); pFormNode;
1283d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann       pFormNode = sIterator.MoveToNext()) {
1284d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    CXFA_Node* pDataNode = pFormNode->GetBindData();
1285d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (!pDataNode)
1286d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      continue;
1287d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
1288d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (pDataNode->RemoveBindItem(pFormNode) == 0) {
1289d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      if (CXFA_Node* pDataParent = pDataNode->GetParent()) {
1290d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        pDataParent->RemoveChild(pDataNode, true);
1291d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      }
1292d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    }
1293d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    pFormNode->SetBindingNode(nullptr);
1294d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  }
1295d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
1296d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
1297d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannCXFA_Node* CXFA_Node::CreateInstanceIfPossible(bool bDataMerge) {
1298d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  CXFA_Document* pDocument = GetDocument();
1299d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  CXFA_Node* pTemplateNode = GetTemplateNodeIfExists();
1300d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (!pTemplateNode)
1301d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return nullptr;
1302d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
1303d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  CXFA_Node* pFormParent = GetParent();
1304d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  CXFA_Node* pDataScope = nullptr;
1305d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  for (CXFA_Node* pRootBoundNode = pFormParent;
1306d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann       pRootBoundNode && pRootBoundNode->IsContainerNode();
1307d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann       pRootBoundNode = pRootBoundNode->GetParent()) {
1308d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    pDataScope = pRootBoundNode->GetBindData();
1309d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (pDataScope)
1310d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      break;
13114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
1312d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (!pDataScope) {
1313d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    pDataScope = ToNode(pDocument->GetXFAObject(XFA_HASHCODE_Record));
1314d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    ASSERT(pDataScope);
1315d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  }
1316d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
1317d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  CXFA_Node* pInstance = pDocument->DataMerge_CopyContainer(
1318d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      pTemplateNode, pFormParent, pDataScope, true, bDataMerge, true);
1319d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (pInstance) {
1320d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    pDocument->DataMerge_UpdateBindingRelations(pInstance);
1321d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    pFormParent->RemoveChild(pInstance, true);
1322d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  }
1323d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return pInstance;
1324d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
1325d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
1326d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannOptional<bool> CXFA_Node::GetDefaultBoolean(XFA_Attribute attr) const {
1327d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  Optional<void*> value = GetDefaultValue(attr, XFA_AttributeType::Boolean);
1328d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (!value)
1329d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return {};
1330d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return {!!*value};
1331d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
1332d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
1333d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannOptional<int32_t> CXFA_Node::GetDefaultInteger(XFA_Attribute attr) const {
1334d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  Optional<void*> value = GetDefaultValue(attr, XFA_AttributeType::Integer);
1335d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (!value)
1336d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return {};
1337d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return {static_cast<int32_t>(reinterpret_cast<uintptr_t>(*value))};
1338d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
1339d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
1340d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannOptional<CXFA_Measurement> CXFA_Node::GetDefaultMeasurement(
1341d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    XFA_Attribute attr) const {
1342d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  Optional<void*> value = GetDefaultValue(attr, XFA_AttributeType::Measure);
1343d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (!value)
1344d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return {};
1345d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
1346d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  WideString str = WideString(static_cast<const wchar_t*>(*value));
1347d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return {CXFA_Measurement(str.AsStringView())};
1348d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
1349d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
1350d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannOptional<WideString> CXFA_Node::GetDefaultCData(XFA_Attribute attr) const {
1351d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  Optional<void*> value = GetDefaultValue(attr, XFA_AttributeType::CData);
1352d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (!value)
1353d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return {};
1354d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
1355d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return {WideString(static_cast<const wchar_t*>(*value))};
1356d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
1357d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
1358d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannOptional<XFA_AttributeEnum> CXFA_Node::GetDefaultEnum(
1359d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    XFA_Attribute attr) const {
1360d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  Optional<void*> value = GetDefaultValue(attr, XFA_AttributeType::Enum);
1361d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (!value)
1362d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return {};
1363d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return {static_cast<XFA_AttributeEnum>(reinterpret_cast<uintptr_t>(*value))};
1364d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
1365d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
1366d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannOptional<void*> CXFA_Node::GetDefaultValue(XFA_Attribute attr,
1367d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                           XFA_AttributeType eType) const {
1368d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  const AttributeData* data = GetAttributeData(attr);
1369d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (!data)
1370d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return {};
1371d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (data->type == eType)
1372d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return {data->default_value};
1373d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return {};
13744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
13754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1376d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CXFA_Node::SendAttributeChangeMessage(XFA_Attribute eAttribute,
1377d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                           bool bScriptModify) {
1378d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  CXFA_LayoutProcessor* pLayoutPro = GetDocument()->GetLayoutProcessor();
13794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (!pLayoutPro)
13804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return;
13814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1382d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  CXFA_FFNotify* pNotify = GetDocument()->GetNotify();
13834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (!pNotify)
13844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return;
13854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1386d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (GetPacketType() != XFA_PacketType::Form) {
13874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    pNotify->OnValueChanged(this, eAttribute, this, this);
13884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return;
13894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
13904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
13914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  bool bNeedFindContainer = false;
13924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  switch (GetElementType()) {
13934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    case XFA_Element::Caption:
13944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      bNeedFindContainer = true;
1395d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      pNotify->OnValueChanged(this, eAttribute, this, GetParent());
13964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      break;
13974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    case XFA_Element::Font:
13984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    case XFA_Element::Para: {
13994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      bNeedFindContainer = true;
1400d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      CXFA_Node* pParentNode = GetParent();
14014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      if (pParentNode->GetElementType() == XFA_Element::Caption) {
14024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        pNotify->OnValueChanged(this, eAttribute, pParentNode,
1403d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                pParentNode->GetParent());
14044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      } else {
14054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        pNotify->OnValueChanged(this, eAttribute, this, pParentNode);
14064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
1407d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      break;
1408d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    }
14094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    case XFA_Element::Margin: {
14104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      bNeedFindContainer = true;
1411d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      CXFA_Node* pParentNode = GetParent();
14124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      XFA_Element eParentType = pParentNode->GetElementType();
14134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      if (pParentNode->IsContainerNode()) {
14144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        pNotify->OnValueChanged(this, eAttribute, this, pParentNode);
14154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      } else if (eParentType == XFA_Element::Caption) {
14164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        pNotify->OnValueChanged(this, eAttribute, pParentNode,
1417d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                pParentNode->GetParent());
14184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      } else {
1419d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        CXFA_Node* pNode = pParentNode->GetParent();
14204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        if (pNode && pNode->GetElementType() == XFA_Element::Ui) {
1421d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann          pNotify->OnValueChanged(this, eAttribute, pNode, pNode->GetParent());
14224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        }
14234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
1424d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      break;
1425d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    }
14264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    case XFA_Element::Comb: {
1427d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      CXFA_Node* pEditNode = GetParent();
14284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      XFA_Element eUIType = pEditNode->GetElementType();
14294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      if (pEditNode && (eUIType == XFA_Element::DateTimeEdit ||
14304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                        eUIType == XFA_Element::NumericEdit ||
14314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                        eUIType == XFA_Element::TextEdit)) {
1432d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        CXFA_Node* pUINode = pEditNode->GetParent();
14334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        if (pUINode) {
14344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          pNotify->OnValueChanged(this, eAttribute, pUINode,
1435d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                  pUINode->GetParent());
14364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        }
14374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
1438d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      break;
1439d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    }
14404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    case XFA_Element::Button:
14414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    case XFA_Element::Barcode:
14424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    case XFA_Element::ChoiceList:
14434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    case XFA_Element::DateTimeEdit:
14444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    case XFA_Element::NumericEdit:
14454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    case XFA_Element::PasswordEdit:
14464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    case XFA_Element::TextEdit: {
1447d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      CXFA_Node* pUINode = GetParent();
14484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      if (pUINode) {
14494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        pNotify->OnValueChanged(this, eAttribute, pUINode,
1450d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                pUINode->GetParent());
14514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
1452d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      break;
1453d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    }
14544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    case XFA_Element::CheckButton: {
14554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      bNeedFindContainer = true;
1456d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      CXFA_Node* pUINode = GetParent();
14574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      if (pUINode) {
14584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        pNotify->OnValueChanged(this, eAttribute, pUINode,
1459d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                pUINode->GetParent());
14604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
1461d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      break;
1462d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    }
14634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    case XFA_Element::Keep:
14644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    case XFA_Element::Bookend:
14654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    case XFA_Element::Break:
14664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    case XFA_Element::BreakAfter:
14674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    case XFA_Element::BreakBefore:
14684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    case XFA_Element::Overflow:
14694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      bNeedFindContainer = true;
14704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      break;
14714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    case XFA_Element::Area:
14724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    case XFA_Element::Draw:
14734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    case XFA_Element::ExclGroup:
14744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    case XFA_Element::Field:
14754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    case XFA_Element::Subform:
14764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    case XFA_Element::SubformSet:
14774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      pLayoutPro->AddChangedContainer(this);
14784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      pNotify->OnValueChanged(this, eAttribute, this, this);
14794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      break;
14804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    case XFA_Element::Sharptext:
14814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    case XFA_Element::Sharpxml:
14824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    case XFA_Element::SharpxHTML: {
1483d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      CXFA_Node* pTextNode = GetParent();
1484d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      if (!pTextNode)
14854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        return;
1486d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
1487d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      CXFA_Node* pValueNode = pTextNode->GetParent();
1488d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      if (!pValueNode)
14894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        return;
1490d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
14914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      XFA_Element eType = pValueNode->GetElementType();
14924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      if (eType == XFA_Element::Value) {
14934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        bNeedFindContainer = true;
1494d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        CXFA_Node* pNode = pValueNode->GetParent();
14954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        if (pNode && pNode->IsContainerNode()) {
1496d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann          if (bScriptModify)
14974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann            pValueNode = pNode;
1498d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
14994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          pNotify->OnValueChanged(this, eAttribute, pValueNode, pNode);
15004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        } else {
1501d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann          pNotify->OnValueChanged(this, eAttribute, pNode, pNode->GetParent());
15024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        }
15034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      } else {
15044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        if (eType == XFA_Element::Items) {
1505d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann          CXFA_Node* pNode = pValueNode->GetParent();
15064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          if (pNode && pNode->IsContainerNode()) {
1507d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann            pNotify->OnValueChanged(this, eAttribute, pValueNode, pNode);
1508d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann          }
1509d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        }
15104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
1511d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      break;
15124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
1513d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    default:
1514d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      break;
15154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
1516d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
1517d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (!bNeedFindContainer)
1518d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return;
1519d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
1520d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  CXFA_Node* pParent = this;
1521d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  while (pParent && !pParent->IsContainerNode())
1522d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    pParent = pParent->GetParent();
1523d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
1524d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (pParent)
1525d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    pLayoutPro->AddChangedContainer(pParent);
15264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
15274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1528d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CXFA_Node::SyncValue(const WideString& wsValue, bool bNotify) {
1529d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  WideString wsFormatValue = wsValue;
1530d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  CXFA_WidgetAcc* pContainerWidgetAcc = GetContainerWidgetAcc();
1531d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (pContainerWidgetAcc)
1532d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    wsFormatValue = pContainerWidgetAcc->GetFormatDataValue(wsValue);
1533d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
1534d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  JSObject()->SetContent(wsValue, wsFormatValue, bNotify, false, true);
15354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
15364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1537d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannWideString CXFA_Node::GetRawValue() {
1538d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return JSObject()->GetContent(false);
15394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
15404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1541d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannint32_t CXFA_Node::GetRotate() {
1542d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  Optional<int32_t> degrees =
1543d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      JSObject()->TryInteger(XFA_Attribute::Rotate, false);
1544d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return degrees ? XFA_MapRotation(*degrees) / 90 * 90 : 0;
15454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
15464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1547d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannCXFA_Border* CXFA_Node::GetBorderIfExists() const {
1548d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return JSObject()->GetProperty<CXFA_Border>(0, XFA_Element::Border);
15494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
15504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1551d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannCXFA_Border* CXFA_Node::GetOrCreateBorderIfPossible() {
1552d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return JSObject()->GetOrCreateProperty<CXFA_Border>(0, XFA_Element::Border);
15534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
15544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1555d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannCXFA_Caption* CXFA_Node::GetCaptionIfExists() const {
1556d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return JSObject()->GetProperty<CXFA_Caption>(0, XFA_Element::Caption);
15574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
15584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1559d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannCXFA_Font* CXFA_Node::GetOrCreateFontIfPossible() {
1560d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return JSObject()->GetOrCreateProperty<CXFA_Font>(0, XFA_Element::Font);
15614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
15624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1563d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannCXFA_Font* CXFA_Node::GetFontIfExists() const {
1564d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return JSObject()->GetProperty<CXFA_Font>(0, XFA_Element::Font);
15654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
15664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1567d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannfloat CXFA_Node::GetFontSize() const {
1568d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  CXFA_Font* font = GetFontIfExists();
1569d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  float fFontSize = font ? font->GetFontSize() : 10.0f;
1570d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return fFontSize < 0.1f ? 10.0f : fFontSize;
15714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
15724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1573d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannfloat CXFA_Node::GetLineHeight() const {
1574d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  float fLineHeight = 0;
1575d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  CXFA_Para* para = GetParaIfExists();
1576d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (para)
1577d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    fLineHeight = para->GetLineHeight();
1578d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
1579d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (fLineHeight < 1)
1580d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    fLineHeight = GetFontSize() * 1.2f;
1581d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return fLineHeight;
15824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
15834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1584d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannFX_ARGB CXFA_Node::GetTextColor() const {
1585d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  CXFA_Font* font = GetFontIfExists();
1586d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return font ? font->GetColor() : 0xFF000000;
15874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
15884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1589d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannCXFA_Margin* CXFA_Node::GetMarginIfExists() const {
1590d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return JSObject()->GetProperty<CXFA_Margin>(0, XFA_Element::Margin);
15914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
15924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1593d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannCXFA_Para* CXFA_Node::GetParaIfExists() const {
1594d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return JSObject()->GetProperty<CXFA_Para>(0, XFA_Element::Para);
1595d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
1596d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
1597d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannbool CXFA_Node::IsOpenAccess() {
1598d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  for (auto* pNode = this; pNode; pNode = pNode->GetContainerParent()) {
1599d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    XFA_AttributeEnum iAcc = pNode->JSObject()->GetEnum(XFA_Attribute::Access);
1600d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (iAcc != XFA_AttributeEnum::Open)
1601d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      return false;
16024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
1603d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return true;
16044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
16054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1606d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannCXFA_Value* CXFA_Node::GetDefaultValueIfExists() {
1607d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  CXFA_Node* pTemNode = GetTemplateNodeIfExists();
1608d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return pTemNode ? pTemNode->JSObject()->GetProperty<CXFA_Value>(
1609d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                        0, XFA_Element::Value)
1610d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                  : nullptr;
16114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
16124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1613d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannCXFA_Value* CXFA_Node::GetFormValueIfExists() const {
1614d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return JSObject()->GetProperty<CXFA_Value>(0, XFA_Element::Value);
16154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
16164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1617d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannCXFA_Calculate* CXFA_Node::GetCalculateIfExists() const {
1618d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return JSObject()->GetProperty<CXFA_Calculate>(0, XFA_Element::Calculate);
1619d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
16204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1621d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannCXFA_Validate* CXFA_Node::GetValidateIfExists() const {
1622d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return JSObject()->GetProperty<CXFA_Validate>(0, XFA_Element::Validate);
16234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
16244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1625d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannCXFA_Validate* CXFA_Node::GetOrCreateValidateIfPossible() {
1626d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return JSObject()->GetOrCreateProperty<CXFA_Validate>(0,
1627d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                                        XFA_Element::Validate);
16284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
16294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1630d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannCXFA_Bind* CXFA_Node::GetBindIfExists() const {
1631d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return JSObject()->GetProperty<CXFA_Bind>(0, XFA_Element::Bind);
16324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
16334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1634d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannOptional<float> CXFA_Node::TryWidth() {
1635d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return JSObject()->TryMeasureAsFloat(XFA_Attribute::W);
16364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
16374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1638d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannOptional<float> CXFA_Node::TryHeight() {
1639d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return JSObject()->TryMeasureAsFloat(XFA_Attribute::H);
16404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
16414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1642d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannOptional<float> CXFA_Node::TryMinWidth() {
1643d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return JSObject()->TryMeasureAsFloat(XFA_Attribute::MinW);
16444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
16454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1646d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannOptional<float> CXFA_Node::TryMinHeight() {
1647d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return JSObject()->TryMeasureAsFloat(XFA_Attribute::MinH);
16484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
16494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1650d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannOptional<float> CXFA_Node::TryMaxWidth() {
1651d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return JSObject()->TryMeasureAsFloat(XFA_Attribute::MaxW);
16524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
16534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1654d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannOptional<float> CXFA_Node::TryMaxHeight() {
1655d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return JSObject()->TryMeasureAsFloat(XFA_Attribute::MaxH);
16564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
16574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1658d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannCXFA_Node* CXFA_Node::GetExclGroupIfExists() {
1659d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  CXFA_Node* pExcl = GetParent();
1660d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (!pExcl || pExcl->GetElementType() != XFA_Element::ExclGroup)
1661d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return nullptr;
1662d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return pExcl;
16634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
16644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1665d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannint32_t CXFA_Node::ProcessEvent(CXFA_FFDocView* docView,
1666d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                XFA_AttributeEnum iActivity,
1667d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                CXFA_EventParam* pEventParam) {
1668d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (GetElementType() == XFA_Element::Draw)
1669d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return XFA_EVENTERROR_NotExist;
1670d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
1671d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  std::vector<CXFA_Event*> eventArray = GetWidgetAcc()->GetEventByActivity(
1672d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      iActivity, pEventParam->m_bIsFormReady);
1673d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  bool first = true;
1674d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  int32_t iRet = XFA_EVENTERROR_NotExist;
1675d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  for (CXFA_Event* event : eventArray) {
1676d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    int32_t result = ProcessEvent(docView, event, pEventParam);
1677d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (first || result == XFA_EVENTERROR_Success)
1678d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      iRet = result;
1679d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    first = false;
1680d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  }
1681d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return iRet;
1682d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
1683d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
1684d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannint32_t CXFA_Node::ProcessEvent(CXFA_FFDocView* docView,
1685d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                CXFA_Event* event,
1686d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                CXFA_EventParam* pEventParam) {
1687d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (!event)
1688d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return XFA_EVENTERROR_NotExist;
1689d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
1690d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  switch (event->GetEventType()) {
1691d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    case XFA_Element::Execute:
1692d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      break;
1693d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    case XFA_Element::Script:
1694d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      return ExecuteScript(docView, event->GetScriptIfExists(), pEventParam);
1695d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    case XFA_Element::SignData:
1696d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      break;
1697d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    case XFA_Element::Submit: {
1698d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      CXFA_Submit* submit = event->GetSubmitIfExists();
1699d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      if (!submit)
1700d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        return XFA_EVENTERROR_NotExist;
1701d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      return docView->GetDoc()->GetDocEnvironment()->Submit(docView->GetDoc(),
1702d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                                            submit);
17034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
1704d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    default:
17054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      break;
17064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
1707d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return XFA_EVENTERROR_NotExist;
17084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
17094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1710d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannint32_t CXFA_Node::ProcessCalculate(CXFA_FFDocView* docView) {
1711d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (GetElementType() == XFA_Element::Draw)
1712d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return XFA_EVENTERROR_NotExist;
17134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1714d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  CXFA_Calculate* calc = GetCalculateIfExists();
1715d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (!calc)
1716d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return XFA_EVENTERROR_NotExist;
1717d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (IsUserInteractive())
1718d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return XFA_EVENTERROR_Disabled;
1719d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
1720d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  CXFA_EventParam EventParam;
1721d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  EventParam.m_eType = XFA_EVENT_Calculate;
1722d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  int32_t iRet = ExecuteScript(docView, calc->GetScriptIfExists(), &EventParam);
1723d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (iRet != XFA_EVENTERROR_Success)
1724d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return iRet;
1725d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
1726d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (GetRawValue() != EventParam.m_wsResult) {
1727d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    GetWidgetAcc()->SetValue(XFA_VALUEPICTURE_Raw, EventParam.m_wsResult);
1728d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    GetWidgetAcc()->UpdateUIDisplay(docView, nullptr);
17294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
1730d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return XFA_EVENTERROR_Success;
17314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
17324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1733d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannvoid CXFA_Node::ProcessScriptTestValidate(CXFA_FFDocView* docView,
1734d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                          CXFA_Validate* validate,
1735d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                          int32_t iRet,
1736d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                          bool bRetValue,
1737d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                          bool bVersionFlag) {
1738d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (iRet != XFA_EVENTERROR_Success)
1739d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return;
1740d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (bRetValue)
17414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return;
17424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1743d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  IXFA_AppProvider* pAppProvider =
1744d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      docView->GetDoc()->GetApp()->GetAppProvider();
1745d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (!pAppProvider)
1746d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return;
1747d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
1748d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  WideString wsTitle = pAppProvider->GetAppTitle();
1749d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  WideString wsScriptMsg = validate->GetScriptMessageText();
1750d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (validate->GetScriptTest() == XFA_AttributeEnum::Warning) {
1751d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (IsUserInteractive())
1752d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      return;
1753d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (wsScriptMsg.IsEmpty())
1754d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      wsScriptMsg = GetValidateMessage(false, bVersionFlag);
1755d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
1756d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (bVersionFlag) {
1757d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      pAppProvider->MsgBox(wsScriptMsg, wsTitle, XFA_MBICON_Warning, XFA_MB_OK);
1758d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      return;
17594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
1760d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (pAppProvider->MsgBox(wsScriptMsg, wsTitle, XFA_MBICON_Warning,
1761d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                             XFA_MB_YesNo) == XFA_IDYes) {
1762d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      SetFlag(XFA_NodeFlag_UserInteractive, false);
1763d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    }
1764d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return;
17654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
17664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1767d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (wsScriptMsg.IsEmpty())
1768d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    wsScriptMsg = GetValidateMessage(true, bVersionFlag);
1769d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  pAppProvider->MsgBox(wsScriptMsg, wsTitle, XFA_MBICON_Error, XFA_MB_OK);
17704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
17714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1772d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannint32_t CXFA_Node::ProcessFormatTestValidate(CXFA_FFDocView* docView,
1773d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                             CXFA_Validate* validate,
1774d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                             bool bVersionFlag) {
1775d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  WideString wsRawValue = GetRawValue();
1776d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (!wsRawValue.IsEmpty()) {
1777d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    WideString wsPicture = validate->GetPicture();
1778d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (wsPicture.IsEmpty())
1779d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      return XFA_EVENTERROR_NotExist;
17804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1781d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    IFX_Locale* pLocale = GetLocale();
1782d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (!pLocale)
1783d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      return XFA_EVENTERROR_NotExist;
1784d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
1785d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    CXFA_LocaleValue lcValue = XFA_GetLocaleValue(this);
1786d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (!lcValue.ValidateValue(lcValue.GetValue(), wsPicture, pLocale,
1787d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                               nullptr)) {
1788d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      IXFA_AppProvider* pAppProvider =
1789d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann          docView->GetDoc()->GetApp()->GetAppProvider();
1790d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      if (!pAppProvider)
1791d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        return XFA_EVENTERROR_NotExist;
1792d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
1793d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      WideString wsFormatMsg = validate->GetFormatMessageText();
1794d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      WideString wsTitle = pAppProvider->GetAppTitle();
1795d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      if (validate->GetFormatTest() == XFA_AttributeEnum::Error) {
1796d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        if (wsFormatMsg.IsEmpty())
1797d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann          wsFormatMsg = GetValidateMessage(true, bVersionFlag);
1798d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        pAppProvider->MsgBox(wsFormatMsg, wsTitle, XFA_MBICON_Error, XFA_MB_OK);
1799d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        return XFA_EVENTERROR_Success;
1800d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      }
1801d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      if (IsUserInteractive())
1802d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        return XFA_EVENTERROR_NotExist;
1803d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      if (wsFormatMsg.IsEmpty())
1804d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        wsFormatMsg = GetValidateMessage(false, bVersionFlag);
1805d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
1806d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      if (bVersionFlag) {
1807d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        pAppProvider->MsgBox(wsFormatMsg, wsTitle, XFA_MBICON_Warning,
1808d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                             XFA_MB_OK);
1809d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        return XFA_EVENTERROR_Success;
1810d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      }
1811d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      if (pAppProvider->MsgBox(wsFormatMsg, wsTitle, XFA_MBICON_Warning,
1812d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                               XFA_MB_YesNo) == XFA_IDYes) {
1813d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        SetFlag(XFA_NodeFlag_UserInteractive, false);
1814d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      }
1815d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      return XFA_EVENTERROR_Success;
18164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
18174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
1818d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return XFA_EVENTERROR_NotExist;
18194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
18204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1821d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannint32_t CXFA_Node::ProcessNullTestValidate(CXFA_FFDocView* docView,
1822d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                           CXFA_Validate* validate,
1823d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                           int32_t iFlags,
1824d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                           bool bVersionFlag) {
1825d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (!GetWidgetAcc()->GetValue(XFA_VALUEPICTURE_Raw).IsEmpty())
1826d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return XFA_EVENTERROR_Success;
1827d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (GetWidgetAcc()->IsNull() && GetWidgetAcc()->IsPreNull())
1828d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return XFA_EVENTERROR_Success;
1829d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
1830d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  XFA_AttributeEnum eNullTest = validate->GetNullTest();
1831d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  WideString wsNullMsg = validate->GetNullMessageText();
1832d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (iFlags & 0x01) {
1833d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    int32_t iRet = XFA_EVENTERROR_Success;
1834d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (eNullTest != XFA_AttributeEnum::Disabled)
1835d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      iRet = XFA_EVENTERROR_Error;
18364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1837d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (!wsNullMsg.IsEmpty()) {
1838d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      if (eNullTest != XFA_AttributeEnum::Disabled) {
1839d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        docView->m_arrNullTestMsg.push_back(wsNullMsg);
1840d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        return XFA_EVENTERROR_Error;
18414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
1842d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      return XFA_EVENTERROR_Success;
18434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
1844d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return iRet;
18454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
1846d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (wsNullMsg.IsEmpty() && bVersionFlag &&
1847d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      eNullTest != XFA_AttributeEnum::Disabled) {
1848d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return XFA_EVENTERROR_Error;
18494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
1850d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  IXFA_AppProvider* pAppProvider =
1851d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      docView->GetDoc()->GetApp()->GetAppProvider();
1852d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (!pAppProvider)
1853d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return XFA_EVENTERROR_NotExist;
18544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1855d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  WideString wsCaptionName;
1856d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  WideString wsTitle = pAppProvider->GetAppTitle();
1857d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  switch (eNullTest) {
1858d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    case XFA_AttributeEnum::Error: {
1859d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      if (wsNullMsg.IsEmpty()) {
1860d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        wsCaptionName = GetValidateCaptionName(bVersionFlag);
1861d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        wsNullMsg =
1862d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann            WideString::Format(L"%ls cannot be blank.", wsCaptionName.c_str());
1863d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      }
1864d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      pAppProvider->MsgBox(wsNullMsg, wsTitle, XFA_MBICON_Status, XFA_MB_OK);
1865d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      return XFA_EVENTERROR_Error;
1866d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    }
1867d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    case XFA_AttributeEnum::Warning: {
1868d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      if (IsUserInteractive())
1869d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        return true;
18704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1871d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      if (wsNullMsg.IsEmpty()) {
1872d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        wsCaptionName = GetValidateCaptionName(bVersionFlag);
1873d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        wsNullMsg = WideString::Format(
1874d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann            L"%ls cannot be blank. To ignore validations for %ls, click "
1875d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann            L"Ignore.",
1876d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann            wsCaptionName.c_str(), wsCaptionName.c_str());
18774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
1878d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      if (pAppProvider->MsgBox(wsNullMsg, wsTitle, XFA_MBICON_Warning,
1879d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                               XFA_MB_YesNo) == XFA_IDYes) {
1880d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        SetFlag(XFA_NodeFlag_UserInteractive, false);
18814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
1882d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      return XFA_EVENTERROR_Error;
18834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
1884d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    case XFA_AttributeEnum::Disabled:
1885d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    default:
1886d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      break;
18874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
1888d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return XFA_EVENTERROR_Success;
18894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
18904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1891d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannint32_t CXFA_Node::ProcessValidate(CXFA_FFDocView* docView, int32_t iFlags) {
1892d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (GetElementType() == XFA_Element::Draw)
1893d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return XFA_EVENTERROR_NotExist;
1894d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
1895d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  CXFA_Validate* validate = GetValidateIfExists();
1896d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (!validate)
1897d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return XFA_EVENTERROR_NotExist;
1898d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
1899d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  bool bInitDoc = validate->NeedsInitApp();
1900d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  bool bStatus = docView->GetLayoutStatus() < XFA_DOCVIEW_LAYOUTSTATUS_End;
1901d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  int32_t iFormat = 0;
1902d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  int32_t iRet = XFA_EVENTERROR_NotExist;
1903d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  CXFA_Script* script = validate->GetScriptIfExists();
1904d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  bool bRet = false;
1905d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  bool hasBoolResult = (bInitDoc || bStatus) && GetRawValue().IsEmpty();
1906d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (script) {
1907d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    CXFA_EventParam eParam;
1908d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    eParam.m_eType = XFA_EVENT_Validate;
1909d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    eParam.m_pTarget = GetWidgetAcc();
1910d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    std::tie(iRet, bRet) = ExecuteBoolScript(docView, script, &eParam);
1911d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  }
1912d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
1913d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  XFA_VERSION version = docView->GetDoc()->GetXFADoc()->GetCurVersionMode();
1914d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  bool bVersionFlag = false;
1915d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (version < XFA_VERSION_208)
1916d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    bVersionFlag = true;
1917d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
1918d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (bInitDoc) {
1919d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    validate->ClearFlag(XFA_NodeFlag_NeedsInitApp);
1920d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  } else {
1921d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    iFormat = ProcessFormatTestValidate(docView, validate, bVersionFlag);
1922d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (!bVersionFlag) {
1923d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      bVersionFlag =
1924d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann          docView->GetDoc()->GetXFADoc()->HasFlag(XFA_DOCFLAG_Scripting);
19254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
1926d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
1927d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    iRet |= ProcessNullTestValidate(docView, validate, iFlags, bVersionFlag);
19284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
1929d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
1930d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (iFormat != XFA_EVENTERROR_Success && hasBoolResult)
1931d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    ProcessScriptTestValidate(docView, validate, iRet, bRet, bVersionFlag);
1932d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
1933d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return iRet | iFormat;
1934d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
1935d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
1936d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannWideString CXFA_Node::GetValidateCaptionName(bool bVersionFlag) {
1937d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  WideString wsCaptionName;
1938d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
1939d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (!bVersionFlag) {
1940d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    CXFA_Caption* caption = GetCaptionIfExists();
1941d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (caption) {
1942d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      CXFA_Value* capValue = caption->GetValueIfExists();
1943d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      if (capValue) {
1944d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        CXFA_Text* captionText = capValue->GetTextIfExists();
1945d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        if (captionText)
1946d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann          wsCaptionName = captionText->GetContent();
19474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
19484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
19494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
1950d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (!wsCaptionName.IsEmpty())
1951d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return wsCaptionName;
1952d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return JSObject()->GetCData(XFA_Attribute::Name);
1953d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
1954d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
1955d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannWideString CXFA_Node::GetValidateMessage(bool bError, bool bVersionFlag) {
1956d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  WideString wsCaptionName = GetValidateCaptionName(bVersionFlag);
1957d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (bVersionFlag)
1958d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return WideString::Format(L"%ls validation failed", wsCaptionName.c_str());
1959d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (bError) {
1960d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return WideString::Format(L"The value you entered for %ls is invalid.",
1961d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                              wsCaptionName.c_str());
1962d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  }
1963d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return WideString::Format(
1964d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      L"The value you entered for %ls is invalid. To ignore "
1965d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      L"validations for %ls, click Ignore.",
1966d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      wsCaptionName.c_str(), wsCaptionName.c_str());
1967d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
1968d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
1969d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannint32_t CXFA_Node::ExecuteScript(CXFA_FFDocView* docView,
1970d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                 CXFA_Script* script,
1971d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                 CXFA_EventParam* pEventParam) {
1972d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  bool bRet;
1973d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  int32_t iRet;
1974d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  std::tie(iRet, bRet) = ExecuteBoolScript(docView, script, pEventParam);
1975d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return iRet;
1976d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
1977d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
1978d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannstd::pair<int32_t, bool> CXFA_Node::ExecuteBoolScript(
1979d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    CXFA_FFDocView* docView,
1980d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    CXFA_Script* script,
1981d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    CXFA_EventParam* pEventParam) {
1982d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (m_ExecuteRecursionDepth > kMaxExecuteRecursion)
1983d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return {XFA_EVENTERROR_Success, false};
1984d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
1985d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  ASSERT(pEventParam);
1986d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (!script)
1987d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return {XFA_EVENTERROR_NotExist, false};
1988d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (script->GetRunAt() == XFA_AttributeEnum::Server)
1989d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return {XFA_EVENTERROR_Disabled, false};
1990d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
1991d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  WideString wsExpression = script->GetExpression();
1992d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (wsExpression.IsEmpty())
1993d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return {XFA_EVENTERROR_NotExist, false};
1994d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
1995d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  CXFA_Script::Type eScriptType = script->GetContentType();
1996d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (eScriptType == CXFA_Script::Type::Unknown)
1997d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return {XFA_EVENTERROR_Success, false};
1998d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
1999d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  CXFA_FFDoc* pDoc = docView->GetDoc();
2000d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  CFXJSE_Engine* pContext = pDoc->GetXFADoc()->GetScriptContext();
2001d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  pContext->SetEventParam(*pEventParam);
2002d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  pContext->SetRunAtType(script->GetRunAt());
2003d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
2004d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  std::vector<CXFA_Node*> refNodes;
2005d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (pEventParam->m_eType == XFA_EVENT_InitCalculate ||
2006d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      pEventParam->m_eType == XFA_EVENT_Calculate) {
2007d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    pContext->SetNodesOfRunScript(&refNodes);
2008d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  }
2009d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
2010d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  auto pTmpRetValue = pdfium::MakeUnique<CFXJSE_Value>(pContext->GetIsolate());
2011d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  bool bRet = false;
2012d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  {
2013d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    AutoRestorer<uint8_t> restorer(&m_ExecuteRecursionDepth);
2014d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    ++m_ExecuteRecursionDepth;
2015d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    bRet = pContext->RunScript(eScriptType, wsExpression.AsStringView(),
2016d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                               pTmpRetValue.get(), this);
2017d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  }
2018d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
2019d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  int32_t iRet = XFA_EVENTERROR_Error;
2020d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (bRet) {
2021d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    iRet = XFA_EVENTERROR_Success;
2022d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (pEventParam->m_eType == XFA_EVENT_Calculate ||
2023d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        pEventParam->m_eType == XFA_EVENT_InitCalculate) {
2024d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      if (!pTmpRetValue->IsUndefined()) {
2025d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        if (!pTmpRetValue->IsNull())
2026d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann          pEventParam->m_wsResult = pTmpRetValue->ToWideString();
2027d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
2028d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        iRet = XFA_EVENTERROR_Success;
2029d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      } else {
2030d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        iRet = XFA_EVENTERROR_Error;
2031d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      }
2032d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      if (pEventParam->m_eType == XFA_EVENT_InitCalculate) {
2033d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        if ((iRet == XFA_EVENTERROR_Success) &&
2034d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann            (GetRawValue() != pEventParam->m_wsResult)) {
2035d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann          GetWidgetAcc()->SetValue(XFA_VALUEPICTURE_Raw,
2036d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                   pEventParam->m_wsResult);
2037d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann          docView->AddValidateWidget(GetWidgetAcc());
2038d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        }
2039d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      }
2040d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      for (CXFA_Node* pRefNode : refNodes) {
2041d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        if (pRefNode == this)
2042d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann          continue;
2043d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
2044d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        CXFA_CalcData* pGlobalData = pRefNode->JSObject()->GetCalcData();
2045d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        if (!pGlobalData) {
2046d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann          pRefNode->JSObject()->SetCalcData(
2047d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann              pdfium::MakeUnique<CXFA_CalcData>());
2048d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann          pGlobalData = pRefNode->JSObject()->GetCalcData();
2049d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        }
2050d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        if (!pdfium::ContainsValue(pGlobalData->m_Globals, this))
2051d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann          pGlobalData->m_Globals.push_back(this);
2052d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      }
20534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
20544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
2055d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  pContext->SetNodesOfRunScript(nullptr);
2056d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
2057d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return {iRet, pTmpRetValue->IsBoolean() ? pTmpRetValue->ToBoolean() : false};
20584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
20594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
2060d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannWideString CXFA_Node::GetBarcodeType() {
2061d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  CXFA_Node* pUIChild = GetWidgetAcc()->GetUIChild();
2062d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return pUIChild
2063d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann             ? WideString(pUIChild->JSObject()->GetCData(XFA_Attribute::Type))
2064d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann             : WideString();
2065d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
2066d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
2067d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannOptional<BC_CHAR_ENCODING> CXFA_Node::GetBarcodeAttribute_CharEncoding() {
2068d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  Optional<WideString> wsCharEncoding =
2069d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      GetWidgetAcc()->GetUIChild()->JSObject()->TryCData(
2070d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann          XFA_Attribute::CharEncoding, true);
2071d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (!wsCharEncoding)
2072d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return {};
2073d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (wsCharEncoding->CompareNoCase(L"UTF-16"))
2074d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return {CHAR_ENCODING_UNICODE};
2075d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (wsCharEncoding->CompareNoCase(L"UTF-8"))
2076d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return {CHAR_ENCODING_UTF8};
2077d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return {};
2078d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
2079d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
2080d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannOptional<bool> CXFA_Node::GetBarcodeAttribute_Checksum() {
2081d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  Optional<XFA_AttributeEnum> checksum =
2082d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      GetWidgetAcc()->GetUIChild()->JSObject()->TryEnum(XFA_Attribute::Checksum,
2083d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                                        true);
2084d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (!checksum)
2085d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return {};
2086d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
2087d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  switch (*checksum) {
2088d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    case XFA_AttributeEnum::None:
2089d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      return {false};
2090d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    case XFA_AttributeEnum::Auto:
2091d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      return {true};
2092d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    case XFA_AttributeEnum::Checksum_1mod10:
2093d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    case XFA_AttributeEnum::Checksum_1mod10_1mod11:
2094d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    case XFA_AttributeEnum::Checksum_2mod10:
2095d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    default:
2096d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      break;
20974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
2098d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return {};
2099d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
2100d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
2101d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannOptional<int32_t> CXFA_Node::GetBarcodeAttribute_DataLength() {
2102d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  Optional<WideString> wsDataLength =
2103d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      GetWidgetAcc()->GetUIChild()->JSObject()->TryCData(
2104d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann          XFA_Attribute::DataLength, true);
2105d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (!wsDataLength)
2106d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return {};
2107d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
2108d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return {FXSYS_wtoi(wsDataLength->c_str())};
2109d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
2110d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
2111d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannOptional<char> CXFA_Node::GetBarcodeAttribute_StartChar() {
2112d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  Optional<WideString> wsStartEndChar =
2113d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      GetWidgetAcc()->GetUIChild()->JSObject()->TryCData(
2114d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann          XFA_Attribute::StartChar, true);
2115d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (!wsStartEndChar || wsStartEndChar->IsEmpty())
2116d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return {};
2117d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
2118d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return {static_cast<char>((*wsStartEndChar)[0])};
2119d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
2120d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
2121d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannOptional<char> CXFA_Node::GetBarcodeAttribute_EndChar() {
2122d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  Optional<WideString> wsStartEndChar =
2123d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      GetWidgetAcc()->GetUIChild()->JSObject()->TryCData(XFA_Attribute::EndChar,
2124d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                                         true);
2125d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (!wsStartEndChar || wsStartEndChar->IsEmpty())
2126d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return {};
2127d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
2128d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return {static_cast<char>((*wsStartEndChar)[0])};
2129d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
2130d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
2131d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannOptional<int32_t> CXFA_Node::GetBarcodeAttribute_ECLevel() {
2132d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  Optional<WideString> wsECLevel =
2133d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      GetWidgetAcc()->GetUIChild()->JSObject()->TryCData(
2134d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann          XFA_Attribute::ErrorCorrectionLevel, true);
2135d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (!wsECLevel)
2136d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return {};
2137d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return {FXSYS_wtoi(wsECLevel->c_str())};
2138d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
2139d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
2140d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannOptional<int32_t> CXFA_Node::GetBarcodeAttribute_ModuleWidth() {
2141d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  Optional<CXFA_Measurement> moduleWidthHeight =
2142d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      GetWidgetAcc()->GetUIChild()->JSObject()->TryMeasure(
2143d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann          XFA_Attribute::ModuleWidth, true);
2144d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (!moduleWidthHeight)
2145d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return {};
2146d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
2147d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return {static_cast<int32_t>(moduleWidthHeight->ToUnit(XFA_Unit::Pt))};
2148d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
2149d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
2150d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannOptional<int32_t> CXFA_Node::GetBarcodeAttribute_ModuleHeight() {
2151d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  Optional<CXFA_Measurement> moduleWidthHeight =
2152d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      GetWidgetAcc()->GetUIChild()->JSObject()->TryMeasure(
2153d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann          XFA_Attribute::ModuleHeight, true);
2154d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (!moduleWidthHeight)
2155d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return {};
2156d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
2157d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return {static_cast<int32_t>(moduleWidthHeight->ToUnit(XFA_Unit::Pt))};
2158d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
2159d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
2160d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannOptional<bool> CXFA_Node::GetBarcodeAttribute_PrintChecksum() {
2161d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return GetWidgetAcc()->GetUIChild()->JSObject()->TryBoolean(
2162d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      XFA_Attribute::PrintCheckDigit, true);
2163d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}
2164d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
2165d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannOptional<BC_TEXT_LOC> CXFA_Node::GetBarcodeAttribute_TextLocation() {
2166d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  Optional<XFA_AttributeEnum> textLocation =
2167d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      GetWidgetAcc()->GetUIChild()->JSObject()->TryEnum(
2168d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann          XFA_Attribute::TextLocation, true);
2169d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (!textLocation)
2170d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return {};
2171d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
2172d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  switch (*textLocation) {
2173d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    case XFA_AttributeEnum::None:
2174d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      return {BC_TEXT_LOC_NONE};
2175d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    case XFA_AttributeEnum::Above:
2176d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      return {BC_TEXT_LOC_ABOVE};
2177d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    case XFA_AttributeEnum::Below:
2178d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      return {BC_TEXT_LOC_BELOW};
2179d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    case XFA_AttributeEnum::AboveEmbedded:
2180d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      return {BC_TEXT_LOC_ABOVEEMBED};
2181d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    case XFA_AttributeEnum::BelowEmbedded:
2182d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      return {BC_TEXT_LOC_BELOWEMBED};
2183d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    default:
2184d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      break;
21854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
2186d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return {};
21874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
21884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
2189d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannOptional<bool> CXFA_Node::GetBarcodeAttribute_Truncate() {
2190d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return GetWidgetAcc()->GetUIChild()->JSObject()->TryBoolean(
2191d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      XFA_Attribute::Truncate, true);
21924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
21934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
2194d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannOptional<int8_t> CXFA_Node::GetBarcodeAttribute_WideNarrowRatio() {
2195d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  Optional<WideString> wsWideNarrowRatio =
2196d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      GetWidgetAcc()->GetUIChild()->JSObject()->TryCData(
2197d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann          XFA_Attribute::WideNarrowRatio, true);
2198d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (!wsWideNarrowRatio)
2199d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return {};
2200d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
2201d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  Optional<size_t> ptPos = wsWideNarrowRatio->Find(':');
2202d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (!ptPos)
2203d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return {static_cast<int8_t>(FXSYS_wtoi(wsWideNarrowRatio->c_str()))};
2204d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
2205d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  int32_t fB = FXSYS_wtoi(
2206d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      wsWideNarrowRatio->Right(wsWideNarrowRatio->GetLength() - (*ptPos + 1))
2207d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann          .c_str());
2208d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (!fB)
2209d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return {0};
2210d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
2211d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  int32_t fA = FXSYS_wtoi(wsWideNarrowRatio->Left(*ptPos).c_str());
2212d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  float result = static_cast<float>(fA) / static_cast<float>(fB);
2213d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return {static_cast<int8_t>(result)};
22144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
2215