diff --git a/fxjs/xfa/cfxjse_engine.cpp b/fxjs/xfa/cfxjse_engine.cpp
index b5c7a78..8c20211 100644
--- a/fxjs/xfa/cfxjse_engine.cpp
+++ b/fxjs/xfa/cfxjse_engine.cpp
@@ -757,18 +757,6 @@
   return pValue;
 }
 
-size_t CFXJSE_Engine::GetIndexByName(CXFA_Node* refNode) {
-  if (!refNode)
-    return 0;
-  return CXFA_NodeHelper::GetIndex(refNode, refNode->IsProperty(), false);
-}
-
-size_t CFXJSE_Engine::GetIndexByClassName(CXFA_Node* refNode) {
-  if (!refNode)
-    return 0;
-  return CXFA_NodeHelper::GetIndex(refNode, refNode->IsProperty(), true);
-}
-
 void CFXJSE_Engine::SetNodesOfRunScript(std::vector<CXFA_Node*>* pArray) {
   m_pScriptNodeArray = pArray;
 }
diff --git a/fxjs/xfa/cfxjse_engine.h b/fxjs/xfa/cfxjse_engine.h
index cacf09f..d96eaee 100644
--- a/fxjs/xfa/cfxjse_engine.h
+++ b/fxjs/xfa/cfxjse_engine.h
@@ -84,9 +84,6 @@
   void AddToCacheList(std::unique_ptr<CXFA_List> pList);
   CXFA_Object* GetThisObject() const { return m_pThisObject.Get(); }
 
-  size_t GetIndexByName(CXFA_Node* refNode);
-  size_t GetIndexByClassName(CXFA_Node* refNode);
-
   void SetNodesOfRunScript(std::vector<CXFA_Node*>* pArray);
   void AddNodesOfRunScript(CXFA_Node* pNode);
   CFXJSE_Class* GetJseNormalClass() const { return m_pJsClass.Get(); }
diff --git a/fxjs/xfa/cfxjse_resolveprocessor.cpp b/fxjs/xfa/cfxjse_resolveprocessor.cpp
index 9829a2b..a9b9634 100644
--- a/fxjs/xfa/cfxjse_resolveprocessor.cpp
+++ b/fxjs/xfa/cfxjse_resolveprocessor.cpp
@@ -126,7 +126,7 @@
   WideStringView wsName = rnd.m_wsName.AsStringView();
   WideString wsCondition = rnd.m_wsCondition;
   const bool bClassName = !wsName.IsEmpty() && wsName[0] == '#';
-  CXFA_Node* pChild =
+  CXFA_Node* const pChild =
       bClassName
           ? pParent->GetOneChildOfClass(wsName.Right(wsName.GetLength() - 1))
           : pParent->GetOneChildNamed(wsName);
@@ -142,8 +142,7 @@
   for (const auto& pObject : rnd.m_Objects)
     nodes.push_back(pObject->AsNode());
 
-  std::vector<CXFA_Node*> siblings =
-      CXFA_NodeHelper::GetSiblings(pChild, bClassName);
+  std::vector<CXFA_Node*> siblings = pChild->GetSiblings(bClassName);
   nodes.insert(nodes.end(), siblings.begin(), siblings.end());
   rnd.m_Objects =
       std::vector<UnownedPtr<CXFA_Object>>(nodes.begin(), nodes.end());
@@ -333,9 +332,11 @@
       if (!(dwStyles & XFA_RESOLVENODE_ALL)) {
         std::vector<CXFA_Node*> upArrayNodes;
         if (curNode->IsTransparent()) {
-          upArrayNodes = CXFA_NodeHelper::GetSiblings(
-              ToNode(rnd.m_Objects.front().Get()),
-              !!(dwStyles & XFA_RESOLVENODE_TagName));
+          CXFA_Node* pCurrent = ToNode(rnd.m_Objects.front().Get());
+          if (pCurrent) {
+            upArrayNodes =
+                pCurrent->GetSiblings(!!(dwStyles & XFA_RESOLVENODE_TagName));
+          }
         }
         if (upArrayNodes.size() > rnd.m_Objects.size()) {
           CXFA_Object* pSaveObject = rnd.m_Objects.front().Get();
@@ -465,9 +466,12 @@
     }
     if (rnd.m_Objects.size() > nNum) {
       if (parentNode->IsTransparent()) {
-        std::vector<CXFA_Node*> upArrayNodes = CXFA_NodeHelper::GetSiblings(
-            ToNode(rnd.m_Objects.front().Get()),
-            !!(dwStyles & XFA_RESOLVENODE_TagName));
+        std::vector<CXFA_Node*> upArrayNodes;
+        CXFA_Node* pCurrent = ToNode(rnd.m_Objects.front().Get());
+        if (pCurrent) {
+          upArrayNodes =
+              pCurrent->GetSiblings(!!(dwStyles & XFA_RESOLVENODE_TagName));
+        }
         if (upArrayNodes.size() > rnd.m_Objects.size()) {
           CXFA_Object* pSaveObject = rnd.m_Objects.front().Get();
           rnd.m_Objects = std::vector<UnownedPtr<CXFA_Object>>(
@@ -651,12 +655,12 @@
   size_t iCurIndex = 0;
   const std::vector<CXFA_Node*>* pArray = pRnd->m_pSC->GetUpObjectArray();
   if (!pArray->empty()) {
-    CXFA_Node* curNode = pArray->back();
-    bool bIsProperty = curNode->IsProperty();
+    CXFA_Node* pNode = pArray->back();
+    bool bIsProperty = pNode->IsProperty();
     bool bIsClassIndex =
-        curNode->IsUnnamed() ||
-        (bIsProperty && curNode->GetElementType() != XFA_Element::PageSet);
-    iCurIndex = CXFA_NodeHelper::GetIndex(curNode, bIsProperty, bIsClassIndex);
+        pNode->IsUnnamed() ||
+        (bIsProperty && pNode->GetElementType() != XFA_Element::PageSet);
+    iCurIndex = pNode->GetIndex(bIsProperty, bIsClassIndex);
   }
 
   size_t iFoundCount = pRnd->m_Objects.size();
diff --git a/fxjs/xfa/cjx_tree.cpp b/fxjs/xfa/cjx_tree.cpp
index 62ce3f4..c036ab9 100644
--- a/fxjs/xfa/cjx_tree.cpp
+++ b/fxjs/xfa/cjx_tree.cpp
@@ -167,9 +167,9 @@
     return;
   }
 
-  CFXJSE_Engine* pScriptContext = GetDocument()->GetScriptContext();
-  pValue->SetInteger(pdfium::base::checked_cast<int32_t>(
-      pScriptContext->GetIndexByName(ToNode(GetXFAObject()))));
+  CXFA_Node* pNode = ToNode(GetXFAObject());
+  size_t iIndex = pNode ? pNode->GetIndexByName() : 0;
+  pValue->SetInteger(pdfium::base::checked_cast<int32_t>(iIndex));
 }
 
 void CJX_Tree::classIndex(CFXJSE_Value* pValue,
@@ -180,9 +180,9 @@
     return;
   }
 
-  CFXJSE_Engine* pScriptContext = GetDocument()->GetScriptContext();
-  pValue->SetInteger(pdfium::base::checked_cast<int32_t>(
-      pScriptContext->GetIndexByClassName(ToNode(GetXFAObject()))));
+  CXFA_Node* pNode = ToNode(GetXFAObject());
+  size_t iIndex = pNode ? pNode->GetIndexByClassName() : 0;
+  pValue->SetInteger(pdfium::base::checked_cast<int32_t>(iIndex));
 }
 
 void CJX_Tree::somExpression(CFXJSE_Value* pValue,
diff --git a/xfa/fxfa/parser/cxfa_node.cpp b/xfa/fxfa/parser/cxfa_node.cpp
index 1e636bf..9f19a49 100644
--- a/xfa/fxfa/parser/cxfa_node.cpp
+++ b/xfa/fxfa/parser/cxfa_node.cpp
@@ -218,7 +218,6 @@
 #include "xfa/fxfa/parser/cxfa_msgid.h"
 #include "xfa/fxfa/parser/cxfa_nameattr.h"
 #include "xfa/fxfa/parser/cxfa_neverembed.h"
-#include "xfa/fxfa/parser/cxfa_nodehelper.h"
 #include "xfa/fxfa/parser/cxfa_nodeiteratortemplate.h"
 #include "xfa/fxfa/parser/cxfa_numberofcopies.h"
 #include "xfa/fxfa/parser/cxfa_numberpattern.h"
@@ -767,9 +766,59 @@
     ws.Replace(L".", L"\\.");
   }
 
-  return WideString::Format(
-      pszFormat, ws.c_str(),
-      CXFA_NodeHelper::GetIndex(pNode, bIsProperty, bIsClassIndex));
+  return WideString::Format(pszFormat, ws.c_str(),
+                            pNode->GetIndex(bIsProperty, bIsClassIndex));
+}
+
+void TraverseSiblings(CXFA_Node* parent,
+                      uint32_t dwNameHash,
+                      std::vector<CXFA_Node*>* pSiblings,
+                      bool bIsClassName,
+                      bool bIsFindProperty) {
+  ASSERT(parent);
+  ASSERT(pSiblings);
+
+  if (bIsFindProperty) {
+    for (CXFA_Node* child :
+         parent->GetNodeList(XFA_NODEFILTER_Properties, XFA_Element::Unknown)) {
+      if (bIsClassName) {
+        if (child->GetClassHashCode() == dwNameHash)
+          pSiblings->push_back(child);
+      } else {
+        if (child->GetNameHash() == dwNameHash) {
+          if (child->GetElementType() != XFA_Element::PageSet &&
+              child->GetElementType() != XFA_Element::Extras &&
+              child->GetElementType() != XFA_Element::Items) {
+            pSiblings->push_back(child);
+          }
+        }
+      }
+      if (child->IsUnnamed() &&
+          child->GetElementType() == XFA_Element::PageSet) {
+        TraverseSiblings(child, dwNameHash, pSiblings, bIsClassName, false);
+      }
+    }
+    if (!pSiblings->empty())
+      return;
+  }
+  for (CXFA_Node* child :
+       parent->GetNodeList(XFA_NODEFILTER_Children, XFA_Element::Unknown)) {
+    if (child->GetElementType() == XFA_Element::Variables)
+      continue;
+
+    if (bIsClassName) {
+      if (child->GetClassHashCode() == dwNameHash)
+        pSiblings->push_back(child);
+    } else {
+      if (child->GetNameHash() == dwNameHash)
+        pSiblings->push_back(child);
+    }
+
+    if (child->IsTransparent() &&
+        child->GetElementType() != XFA_Element::PageSet) {
+      TraverseSiblings(child, dwNameHash, pSiblings, bIsClassName, false);
+    }
+  }
 }
 
 }  // namespace
@@ -1664,6 +1713,50 @@
   return FindFirstSiblingOfClass(this, element);
 }
 
+std::vector<CXFA_Node*> CXFA_Node::GetSiblings(bool bIsClassName) {
+  std::vector<CXFA_Node*> siblings;
+  CXFA_Node* parent = GetParent();
+  if (!parent)
+    return siblings;
+  if (!parent->HasProperty(GetElementType())) {
+    parent = GetTransparentParent();
+    if (!parent)
+      return siblings;
+  }
+
+  uint32_t dwNameHash = bIsClassName ? GetClassHashCode() : GetNameHash();
+  TraverseSiblings(parent, dwNameHash, &siblings, bIsClassName, true);
+  return siblings;
+}
+
+size_t CXFA_Node::GetIndex(bool bIsProperty, bool bIsClassIndex) {
+  CXFA_Node* parent = GetParent();
+  if (!parent)
+    return 0;
+
+  if (!bIsProperty) {
+    parent = GetTransparentParent();
+    if (!parent)
+      return 0;
+  }
+  uint32_t dwHashName = bIsClassIndex ? GetClassHashCode() : GetNameHash();
+  std::vector<CXFA_Node*> siblings;
+  TraverseSiblings(parent, dwHashName, &siblings, bIsClassIndex, true);
+  for (size_t i = 0; i < siblings.size(); ++i) {
+    if (siblings[i] == this)
+      return i;
+  }
+  return 0;
+}
+
+size_t CXFA_Node::GetIndexByName() {
+  return GetIndex(IsProperty(), /*bIsClassIndex=*/false);
+}
+
+size_t CXFA_Node::GetIndexByClassName() {
+  return GetIndex(IsProperty(), /*bIsClassIndex=*/true);
+}
+
 CXFA_Node* CXFA_Node::GetInstanceMgrOfSubform() {
   CXFA_Node* pInstanceMgr = nullptr;
   if (m_ePacket == XFA_PacketType::Form) {
@@ -5067,6 +5160,19 @@
   }
 }
 
+CXFA_Node* CXFA_Node::GetTransparentParent() {
+  CXFA_Node* parent = GetParent();
+  while (parent) {
+    XFA_Element type = parent->GetElementType();
+    if (type == XFA_Element::Variables ||
+        (type != XFA_Element::SubformSet && !parent->IsUnnamed())) {
+      return parent;
+    }
+    parent = parent->GetParent();
+  }
+  return nullptr;
+}
+
 // static
 std::unique_ptr<CXFA_Node> CXFA_Node::Create(CXFA_Document* doc,
                                              XFA_Element element,
diff --git a/xfa/fxfa/parser/cxfa_node.h b/xfa/fxfa/parser/cxfa_node.h
index 106050f..e962fe9 100644
--- a/xfa/fxfa/parser/cxfa_node.h
+++ b/xfa/fxfa/parser/cxfa_node.h
@@ -218,6 +218,11 @@
   CXFA_Node* GetOneChildNamed(WideStringView wsName);
   CXFA_Node* GetOneChildOfClass(WideStringView wsClass);
 
+  std::vector<CXFA_Node*> GetSiblings(bool bIsClassName);
+  size_t GetIndex(bool bIsProperty, bool bIsClassIndex);
+  size_t GetIndexByName();
+  size_t GetIndexByClassName();
+
   CXFA_Node* GetInstanceMgrOfSubform();
 
   Optional<bool> GetDefaultBoolean(XFA_Attribute attr) const;
@@ -467,6 +472,7 @@
   Optional<XFA_AttributeValue> GetIntactFromKeep(
       const CXFA_Keep* pKeep,
       XFA_AttributeValue eLayoutType) const;
+  CXFA_Node* GetTransparentParent();
 
   Optional<float> TryHeight();
   Optional<float> TryMinWidth();
diff --git a/xfa/fxfa/parser/cxfa_nodehelper.cpp b/xfa/fxfa/parser/cxfa_nodehelper.cpp
index 9d76d54..7d65e0d 100644
--- a/xfa/fxfa/parser/cxfa_nodehelper.cpp
+++ b/xfa/fxfa/parser/cxfa_nodehelper.cpp
@@ -18,121 +18,10 @@
 #include "xfa/fxfa/parser/xfa_resolvenode_rs.h"
 #include "xfa/fxfa/parser/xfa_utils.h"
 
-namespace {
-
-void TraverseSiblings(CXFA_Node* parent,
-                      uint32_t dwNameHash,
-                      std::vector<CXFA_Node*>* pSiblings,
-                      bool bIsClassName,
-                      bool bIsFindProperty) {
-  ASSERT(parent);
-  ASSERT(pSiblings);
-
-  if (bIsFindProperty) {
-    for (CXFA_Node* child :
-         parent->GetNodeList(XFA_NODEFILTER_Properties, XFA_Element::Unknown)) {
-      if (bIsClassName) {
-        if (child->GetClassHashCode() == dwNameHash)
-          pSiblings->push_back(child);
-      } else {
-        if (child->GetNameHash() == dwNameHash) {
-          if (child->GetElementType() != XFA_Element::PageSet &&
-              child->GetElementType() != XFA_Element::Extras &&
-              child->GetElementType() != XFA_Element::Items) {
-            pSiblings->push_back(child);
-          }
-        }
-      }
-      if (child->IsUnnamed() &&
-          child->GetElementType() == XFA_Element::PageSet) {
-        TraverseSiblings(child, dwNameHash, pSiblings, bIsClassName, false);
-      }
-    }
-    if (!pSiblings->empty())
-      return;
-  }
-  for (CXFA_Node* child :
-       parent->GetNodeList(XFA_NODEFILTER_Children, XFA_Element::Unknown)) {
-    if (child->GetElementType() == XFA_Element::Variables)
-      continue;
-
-    if (bIsClassName) {
-      if (child->GetClassHashCode() == dwNameHash)
-        pSiblings->push_back(child);
-    } else {
-      if (child->GetNameHash() == dwNameHash)
-        pSiblings->push_back(child);
-    }
-
-    if (child->IsTransparent() &&
-        child->GetElementType() != XFA_Element::PageSet) {
-      TraverseSiblings(child, dwNameHash, pSiblings, bIsClassName, false);
-    }
-  }
-}
-
-CXFA_Node* GetTransparentParent(CXFA_Node* pNode) {
-  CXFA_Node* parent = pNode ? pNode->GetParent() : nullptr;
-  while (parent) {
-    XFA_Element type = parent->GetElementType();
-    if (type == XFA_Element::Variables ||
-        (type != XFA_Element::SubformSet && !parent->IsUnnamed())) {
-      return parent;
-    }
-    parent = parent->GetParent();
-  }
-  return nullptr;
-}
-
-}  // namespace
-
 CXFA_NodeHelper::CXFA_NodeHelper() = default;
 
 CXFA_NodeHelper::~CXFA_NodeHelper() = default;
 
-// static
-std::vector<CXFA_Node*> CXFA_NodeHelper::GetSiblings(CXFA_Node* pNode,
-                                                     bool bIsClassName) {
-  std::vector<CXFA_Node*> siblings;
-  CXFA_Node* parent = pNode ? pNode->GetParent() : nullptr;
-  if (!parent)
-    return siblings;
-  if (!parent->HasProperty(pNode->GetElementType())) {
-    parent = GetTransparentParent(pNode);
-    if (!parent)
-      return siblings;
-  }
-
-  uint32_t dwNameHash =
-      bIsClassName ? pNode->GetClassHashCode() : pNode->GetNameHash();
-  TraverseSiblings(parent, dwNameHash, &siblings, bIsClassName, true);
-  return siblings;
-}
-
-// static
-size_t CXFA_NodeHelper::GetIndex(CXFA_Node* pNode,
-                                 bool bIsProperty,
-                                 bool bIsClassIndex) {
-  CXFA_Node* parent = pNode ? pNode->GetParent() : nullptr;
-  if (!parent)
-    return 0;
-
-  if (!bIsProperty) {
-    parent = GetTransparentParent(pNode);
-    if (!parent)
-      return 0;
-  }
-  uint32_t dwHashName =
-      bIsClassIndex ? pNode->GetClassHashCode() : pNode->GetNameHash();
-  std::vector<CXFA_Node*> siblings;
-  TraverseSiblings(parent, dwHashName, &siblings, bIsClassIndex, true);
-  for (size_t i = 0; i < siblings.size(); ++i) {
-    if (siblings[i] == pNode)
-      return i;
-  }
-  return 0;
-}
-
 bool CXFA_NodeHelper::CreateNodeForCondition(const WideString& wsCondition) {
   size_t szLen = wsCondition.GetLength();
   WideString wsIndex(L"0");
diff --git a/xfa/fxfa/parser/cxfa_nodehelper.h b/xfa/fxfa/parser/cxfa_nodehelper.h
index fca64cf..66e7e66 100644
--- a/xfa/fxfa/parser/cxfa_nodehelper.h
+++ b/xfa/fxfa/parser/cxfa_nodehelper.h
@@ -21,12 +21,6 @@
   CXFA_NodeHelper();
   ~CXFA_NodeHelper();
 
-  static std::vector<CXFA_Node*> GetSiblings(CXFA_Node* pNode,
-                                             bool bIsClassName);
-  static size_t GetIndex(CXFA_Node* pNode,
-                         bool bIsProperty,
-                         bool bIsClassIndex);
-
   bool CreateNode(const WideString& wsName,
                   const WideString& wsCondition,
                   bool bLastNode,
