14d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann// Copyright 2014 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
74d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "xfa/fxfa/parser/cxfa_nodehelper.h"
84d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
9d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "core/fxcrt/fx_extension.h"
10d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "fxjs/cfxjse_engine.h"
11d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "fxjs/xfa/cjx_object.h"
124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "xfa/fxfa/parser/cxfa_document.h"
13d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "xfa/fxfa/parser/cxfa_localemgr.h"
14d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "xfa/fxfa/parser/cxfa_node.h"
154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "xfa/fxfa/parser/xfa_resolvenode_rs.h"
164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann#include "xfa/fxfa/parser/xfa_utils.h"
174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCXFA_NodeHelper::CXFA_NodeHelper()
194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    : m_eLastCreateType(XFA_Element::DataValue),
204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      m_pCreateParent(nullptr),
214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      m_iCreateCount(0),
22d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      m_iCreateFlag(XFA_ResolveNode_RSType_CreateNodeOne),
234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      m_iCurAllStart(-1),
244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      m_pAllStartParent(nullptr) {}
254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCXFA_NodeHelper::~CXFA_NodeHelper() {}
274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCXFA_Node* CXFA_NodeHelper::ResolveNodes_GetOneChild(CXFA_Node* parent,
29d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                                     const wchar_t* pwsName,
304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                                     bool bIsClassName) {
31d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (!parent)
324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return nullptr;
33d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
34d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  std::vector<CXFA_Node*> siblings;
35d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  uint32_t uNameHash = FX_HashCode_GetW(WideStringView(pwsName), false);
364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  NodeAcc_TraverseAnySiblings(parent, uNameHash, &siblings, bIsClassName);
37d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return !siblings.empty() ? siblings[0] : nullptr;
384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannint32_t CXFA_NodeHelper::CountSiblings(CXFA_Node* pNode,
414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                       XFA_LOGIC_TYPE eLogicType,
42d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                       std::vector<CXFA_Node*>* pSiblings,
434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                       bool bIsClassName) {
444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (!pNode)
454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return 0;
464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CXFA_Node* parent = ResolveNodes_GetParent(pNode, XFA_LOGIC_NoTransparent);
474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (!parent)
484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return 0;
49d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (!parent->HasProperty(pNode->GetElementType()) &&
50d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      eLogicType == XFA_LOGIC_Transparent) {
514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    parent = ResolveNodes_GetParent(pNode, XFA_LOGIC_Transparent);
52d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (!parent)
534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      return 0;
544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (bIsClassName) {
564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return NodeAcc_TraverseSiblings(parent, pNode->GetClassHashCode(),
574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                    pSiblings, eLogicType, bIsClassName);
584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
59d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return NodeAcc_TraverseSiblings(parent, pNode->GetNameHash(), pSiblings,
60d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                  eLogicType, bIsClassName);
614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
63d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannint32_t CXFA_NodeHelper::NodeAcc_TraverseAnySiblings(
64d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    CXFA_Node* parent,
65d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    uint32_t dNameHash,
66d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    std::vector<CXFA_Node*>* pSiblings,
67d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    bool bIsClassName) {
68d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (!parent || !pSiblings)
694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return 0;
70d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  int32_t nCount = 0;
72d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  for (CXFA_Node* child :
73d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann       parent->GetNodeList(XFA_NODEFILTER_Properties, XFA_Element::Unknown)) {
744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (bIsClassName) {
754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      if (child->GetClassHashCode() == dNameHash) {
76d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        pSiblings->push_back(child);
774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        nCount++;
784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    } else {
804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      if (child->GetNameHash() == dNameHash) {
81d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        pSiblings->push_back(child);
824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        nCount++;
834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
85d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (nCount > 0)
864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      return nCount;
87d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    nCount +=
894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        NodeAcc_TraverseAnySiblings(child, dNameHash, pSiblings, bIsClassName);
904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
91d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  for (CXFA_Node* child :
92d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann       parent->GetNodeList(XFA_NODEFILTER_Children, XFA_Element::Unknown)) {
934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (bIsClassName) {
944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      if (child->GetClassHashCode() == dNameHash) {
95d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        pSiblings->push_back(child);
964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        nCount++;
974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    } else {
994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      if (child->GetNameHash() == dNameHash) {
100d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        pSiblings->push_back(child);
1014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        nCount++;
1024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
1034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
104d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (nCount > 0)
1054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      return nCount;
106d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
1074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    nCount +=
1084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        NodeAcc_TraverseAnySiblings(child, dNameHash, pSiblings, bIsClassName);
1094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
1104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return nCount;
1114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
1124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
113d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannint32_t CXFA_NodeHelper::NodeAcc_TraverseSiblings(
114d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    CXFA_Node* parent,
115d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    uint32_t dNameHash,
116d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    std::vector<CXFA_Node*>* pSiblings,
117d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    XFA_LOGIC_TYPE eLogicType,
118d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    bool bIsClassName,
119d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    bool bIsFindProperty) {
120d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (!parent || !pSiblings)
1214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return 0;
122d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
1234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  int32_t nCount = 0;
1244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (bIsFindProperty) {
125d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    for (CXFA_Node* child :
126d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann         parent->GetNodeList(XFA_NODEFILTER_Properties, XFA_Element::Unknown)) {
1274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      if (bIsClassName) {
1284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        if (child->GetClassHashCode() == dNameHash) {
129d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann          pSiblings->push_back(child);
1304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          nCount++;
1314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        }
1324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      } else {
1334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        if (child->GetNameHash() == dNameHash) {
1344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          if (child->GetElementType() != XFA_Element::PageSet &&
1354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann              child->GetElementType() != XFA_Element::Extras &&
1364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann              child->GetElementType() != XFA_Element::Items) {
137d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann            pSiblings->push_back(child);
1384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann            nCount++;
1394d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          }
1404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        }
1414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
1424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      if (child->IsUnnamed() &&
1434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          child->GetElementType() == XFA_Element::PageSet) {
1444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        nCount += NodeAcc_TraverseSiblings(child, dNameHash, pSiblings,
1454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                           eLogicType, bIsClassName, false);
1464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
1474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
148d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (nCount > 0)
1494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      return nCount;
1504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
151d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  for (CXFA_Node* child :
152d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann       parent->GetNodeList(XFA_NODEFILTER_Children, XFA_Element::Unknown)) {
153d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (child->GetElementType() == XFA_Element::Variables)
1544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      continue;
155d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
1564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (bIsClassName) {
1574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      if (child->GetClassHashCode() == dNameHash) {
158d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        pSiblings->push_back(child);
1594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        nCount++;
1604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
1614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    } else {
1624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      if (child->GetNameHash() == dNameHash) {
163d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        pSiblings->push_back(child);
1644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        nCount++;
1654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
1664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
167d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (eLogicType == XFA_LOGIC_NoTransparent)
1684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      continue;
169d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
1704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (NodeIsTransparent(child) &&
1714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        child->GetElementType() != XFA_Element::PageSet) {
1724d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      nCount += NodeAcc_TraverseSiblings(child, dNameHash, pSiblings,
1734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                         eLogicType, bIsClassName, false);
1744d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
1754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
1764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return nCount;
1774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
1784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
1794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. MoltmannCXFA_Node* CXFA_NodeHelper::ResolveNodes_GetParent(CXFA_Node* pNode,
1804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                                   XFA_LOGIC_TYPE eLogicType) {
1814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (!pNode) {
1824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return nullptr;
1834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
1844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (eLogicType == XFA_LOGIC_NoTransparent) {
185d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return pNode->GetParent();
1864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
1874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CXFA_Node* parent;
1884d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CXFA_Node* node = pNode;
1894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  while (true) {
1904d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    parent = ResolveNodes_GetParent(node);
1914d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (!parent) {
1924d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      break;
1934d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
1944d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    XFA_Element parentType = parent->GetElementType();
1954d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if ((!parent->IsUnnamed() && parentType != XFA_Element::SubformSet) ||
1964d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        parentType == XFA_Element::Variables) {
1974d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      break;
1984d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
1994d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    node = parent;
2004d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
2014d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return parent;
2024d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
2034d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
2044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannint32_t CXFA_NodeHelper::GetIndex(CXFA_Node* pNode,
2054d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                  XFA_LOGIC_TYPE eLogicType,
2064d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                  bool bIsProperty,
2074d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                  bool bIsClassIndex) {
2084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CXFA_Node* parent = ResolveNodes_GetParent(pNode, XFA_LOGIC_NoTransparent);
2094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (!parent) {
2104d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return 0;
2114d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
2124d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (!bIsProperty && eLogicType == XFA_LOGIC_Transparent) {
2134d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    parent = ResolveNodes_GetParent(pNode, XFA_LOGIC_Transparent);
2144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (!parent) {
2154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      return 0;
2164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
2174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
2184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  uint32_t dwHashName = pNode->GetNameHash();
2194d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (bIsClassIndex) {
2204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    dwHashName = pNode->GetClassHashCode();
2214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
222d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  std::vector<CXFA_Node*> siblings;
2234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  int32_t iSize = NodeAcc_TraverseSiblings(parent, dwHashName, &siblings,
2244d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                                           eLogicType, bIsClassIndex);
2254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  for (int32_t i = 0; i < iSize; ++i) {
2264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    CXFA_Node* child = siblings[i];
2274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (child == pNode) {
2284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      return i;
2294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
2304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
2314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return 0;
2324d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
2334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
234d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. MoltmannWideString CXFA_NodeHelper::GetNameExpression(CXFA_Node* refNode,
235d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                              bool bIsAllPath,
236d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                              XFA_LOGIC_TYPE eLogicType) {
237d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  WideString wsName;
2384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (bIsAllPath) {
239d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    wsName = GetNameExpression(refNode, false, eLogicType);
240d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    WideString wsParent;
2414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    CXFA_Node* parent =
2424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        ResolveNodes_GetParent(refNode, XFA_LOGIC_NoTransparent);
2434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    while (parent) {
244d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      wsParent = GetNameExpression(parent, false, eLogicType);
2454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      wsParent += L".";
2464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      wsParent += wsName;
2474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      wsName = wsParent;
2484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      parent = ResolveNodes_GetParent(parent, XFA_LOGIC_NoTransparent);
2494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
250d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return wsName;
2514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
2524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
253d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  WideString ws;
2544d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  bool bIsProperty = NodeIsProperty(refNode);
2554d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (refNode->IsUnnamed() ||
2564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      (bIsProperty && refNode->GetElementType() != XFA_Element::PageSet)) {
2574d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    ws = refNode->GetClassName();
258d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return WideString::Format(L"#%ls[%d]", ws.c_str(),
259d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                              GetIndex(refNode, eLogicType, bIsProperty, true));
2604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
261d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  ws = refNode->JSObject()->GetCData(XFA_Attribute::Name);
2624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  ws.Replace(L".", L"\\.");
263d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return WideString::Format(L"%ls[%d]", ws.c_str(),
264d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                            GetIndex(refNode, eLogicType, bIsProperty, false));
2654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
2664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
2674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannbool CXFA_NodeHelper::NodeIsTransparent(CXFA_Node* refNode) {
268d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (!refNode)
2694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return false;
270d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
2714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  XFA_Element refNodeType = refNode->GetElementType();
272d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return (refNode->IsUnnamed() && refNode->IsContainerNode()) ||
273d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann         refNodeType == XFA_Element::SubformSet ||
274d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann         refNodeType == XFA_Element::Area || refNodeType == XFA_Element::Proto;
2754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
2764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
277d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannbool CXFA_NodeHelper::CreateNode_ForCondition(WideString& wsCondition) {
2784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  int32_t iLen = wsCondition.GetLength();
279d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  WideString wsIndex(L"0");
2804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  bool bAll = false;
2814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (iLen == 0) {
282d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    m_iCreateFlag = XFA_ResolveNode_RSType_CreateNodeOne;
2834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return false;
2844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
285d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (wsCondition[0] != '[')
286d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    return false;
287d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
288d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  int32_t i = 1;
289d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  for (; i < iLen; ++i) {
290d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    wchar_t ch = wsCondition[i];
291d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (ch == ' ')
292d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      continue;
293d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
294d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    if (ch == '*')
295d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann      bAll = true;
296d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    break;
297d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  }
298d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (bAll) {
299d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    wsIndex = L"1";
300d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    m_iCreateFlag = XFA_ResolveNode_RSType_CreateNodeAll;
301d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  } else {
302d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    m_iCreateFlag = XFA_ResolveNode_RSType_CreateNodeOne;
303d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    wsIndex = wsCondition.Mid(i, iLen - 1 - i);
3044d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
305d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  int32_t iIndex = wsIndex.GetInteger();
306d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  m_iCreateCount = iIndex;
307d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return true;
3084d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
3094d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
310d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannbool CXFA_NodeHelper::ResolveNodes_CreateNode(WideString wsName,
311d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                              WideString wsCondition,
312d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                              bool bLastNode,
313d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                              CFXJSE_Engine* pScriptContext) {
3144d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (!m_pCreateParent) {
3154d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return false;
3164d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
3174d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  bool bIsClassName = false;
3184d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  bool bResult = false;
319d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (wsName[0] == '!') {
3204d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    wsName = wsName.Right(wsName.GetLength() - 1);
3214d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_pCreateParent = ToNode(
3224d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        pScriptContext->GetDocument()->GetXFAObject(XFA_HASHCODE_Datasets));
3234d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
324d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (wsName[0] == '#') {
3254d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    bIsClassName = true;
3264d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    wsName = wsName.Right(wsName.GetLength() - 1);
3274d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
3284d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (m_iCreateCount == 0) {
3294d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    CreateNode_ForCondition(wsCondition);
3304d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
3314d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (bIsClassName) {
332d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann    XFA_Element eType = CXFA_Node::NameToElement(wsName);
3334d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (eType == XFA_Element::Unknown)
3344d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      return false;
3354d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
3364d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    for (int32_t iIndex = 0; iIndex < m_iCreateCount; iIndex++) {
3374d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      CXFA_Node* pNewNode = m_pCreateParent->CreateSamePacketNode(eType);
3384d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      if (pNewNode) {
339d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        m_pCreateParent->InsertChild(pNewNode, nullptr);
3404d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        if (iIndex == m_iCreateCount - 1) {
3414d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          m_pCreateParent = pNewNode;
3424d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        }
3434d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        bResult = true;
3444d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
3454d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
3464d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  } else {
3474d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    XFA_Element eClassType = XFA_Element::DataGroup;
3484d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    if (bLastNode) {
3494d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      eClassType = m_eLastCreateType;
3504d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
3514d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    for (int32_t iIndex = 0; iIndex < m_iCreateCount; iIndex++) {
3524d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      CXFA_Node* pNewNode = m_pCreateParent->CreateSamePacketNode(eClassType);
3534d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      if (pNewNode) {
354d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        pNewNode->JSObject()->SetAttribute(XFA_Attribute::Name,
355d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann                                           wsName.AsStringView(), false);
3564d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        pNewNode->CreateXMLMappingNode();
357d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann        m_pCreateParent->InsertChild(pNewNode, nullptr);
3584d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        if (iIndex == m_iCreateCount - 1) {
3594d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann          m_pCreateParent = pNewNode;
3604d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        }
3614d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann        bResult = true;
3624d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann      }
3634d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    }
3644d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
3654d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (!bResult) {
3664d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_pCreateParent = nullptr;
3674d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
3684d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  return bResult;
3694d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
3704d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
3714d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannvoid CXFA_NodeHelper::SetCreateNodeType(CXFA_Node* refNode) {
372d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  if (!refNode)
3734d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    return;
374d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann
3754d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  if (refNode->GetElementType() == XFA_Element::Subform) {
3764d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_eLastCreateType = XFA_Element::DataGroup;
3774d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  } else if (refNode->GetElementType() == XFA_Element::Field) {
3784d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_eLastCreateType = XFA_FieldIsMultiListBox(refNode)
3794d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                            ? XFA_Element::DataGroup
3804d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann                            : XFA_Element::DataValue;
3814d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  } else if (refNode->GetElementType() == XFA_Element::ExclGroup) {
3824d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann    m_eLastCreateType = XFA_Element::DataValue;
3834d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  }
3844d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
3854d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann
3864d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmannbool CXFA_NodeHelper::NodeIsProperty(CXFA_Node* refNode) {
3874d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann  CXFA_Node* parent = ResolveNodes_GetParent(refNode, XFA_LOGIC_NoTransparent);
388d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann  return parent && refNode && parent->HasProperty(refNode->GetElementType());
3894d3acf4ec42bf6e838f9060103aff98fbf170794Philip P. Moltmann}
390