diff --git a/fxjs/xfa/cfxjse_engine.cpp b/fxjs/xfa/cfxjse_engine.cpp
index 49ad92d..c7e2645 100644
--- a/fxjs/xfa/cfxjse_engine.cpp
+++ b/fxjs/xfa/cfxjse_engine.cpp
@@ -758,15 +758,17 @@
 }
 
 size_t CFXJSE_Engine::GetIndexByName(CXFA_Node* refNode) {
+  if (!refNode)
+    return 0;
   return CXFA_NodeHelper::GetIndex(refNode, XFA_LOGIC_Transparent,
-                                   CXFA_NodeHelper::NodeIsProperty(refNode),
-                                   false);
+                                   refNode->IsProperty(), false);
 }
 
 size_t CFXJSE_Engine::GetIndexByClassName(CXFA_Node* refNode) {
+  if (!refNode)
+    return 0;
   return CXFA_NodeHelper::GetIndex(refNode, XFA_LOGIC_Transparent,
-                                   CXFA_NodeHelper::NodeIsProperty(refNode),
-                                   true);
+                                   refNode->IsProperty(), true);
 }
 
 WideString CFXJSE_Engine::GetSomExpression(CXFA_Node* refNode) {
diff --git a/fxjs/xfa/cfxjse_resolveprocessor.cpp b/fxjs/xfa/cfxjse_resolveprocessor.cpp
index 0426d5a..1331d85 100644
--- a/fxjs/xfa/cfxjse_resolveprocessor.cpp
+++ b/fxjs/xfa/cfxjse_resolveprocessor.cpp
@@ -313,8 +313,8 @@
         rnd.m_Objects.emplace_back(child);
       }
 
-      if (CXFA_NodeHelper::NodeIsTransparent(child) &&
-          child->GetElementType() != XFA_Element::PageSet) {
+      if (child->GetElementType() != XFA_Element::PageSet &&
+          child->IsTransparent()) {
         if (!bSetFlag) {
           SetStylesForChild(dwStyles, rndFind);
           bSetFlag = true;
@@ -332,7 +332,7 @@
     if (rnd.m_Objects.size() > nNum) {
       if (!(dwStyles & XFA_RESOLVENODE_ALL)) {
         std::vector<CXFA_Node*> upArrayNodes;
-        if (CXFA_NodeHelper::NodeIsTransparent(ToNode(curNode))) {
+        if (curNode->IsTransparent()) {
           upArrayNodes = CXFA_NodeHelper::GetSiblings(
               ToNode(rnd.m_Objects.front().Get()), XFA_LOGIC_Transparent,
               !!(dwStyles & XFA_RESOLVENODE_TagName));
@@ -392,7 +392,7 @@
     }
   }
 
-  CXFA_Node* parentNode = curNode->GetParent();
+  CXFA_Node* const parentNode = curNode->GetParent();
   uint32_t uCurClassHash = curNode->GetClassHashCode();
   if (!parentNode) {
     if (uCurClassHash == uNameHash) {
@@ -446,7 +446,7 @@
              child->GetElementType() == XFA_Element::PageSet)) {
           bInnerSearch = true;
         }
-      } else if (CXFA_NodeHelper::NodeIsTransparent(child)) {
+      } else if (child->IsTransparent()) {
         bInnerSearch = true;
       }
       if (bInnerSearch) {
@@ -464,7 +464,7 @@
       child = child->GetNextSibling();
     }
     if (rnd.m_Objects.size() > nNum) {
-      if (CXFA_NodeHelper::NodeIsTransparent(parentNode)) {
+      if (parentNode->IsTransparent()) {
         std::vector<CXFA_Node*> upArrayNodes = CXFA_NodeHelper::GetSiblings(
             ToNode(rnd.m_Objects.front().Get()), XFA_LOGIC_Transparent,
             !!(dwStyles & XFA_RESOLVENODE_TagName));
@@ -652,7 +652,7 @@
   const std::vector<CXFA_Node*>* pArray = pRnd->m_pSC->GetUpObjectArray();
   if (!pArray->empty()) {
     CXFA_Node* curNode = pArray->back();
-    bool bIsProperty = CXFA_NodeHelper::NodeIsProperty(curNode);
+    bool bIsProperty = curNode->IsProperty();
     bool bIsClassIndex =
         curNode->IsUnnamed() ||
         (bIsProperty && curNode->GetElementType() != XFA_Element::PageSet);
diff --git a/xfa/fxfa/parser/cxfa_node.cpp b/xfa/fxfa/parser/cxfa_node.cpp
index 851532a..8d5f313 100644
--- a/xfa/fxfa/parser/cxfa_node.cpp
+++ b/xfa/fxfa/parser/cxfa_node.cpp
@@ -4974,6 +4974,17 @@
   return wsRet;
 }
 
+bool CXFA_Node::IsTransparent() const {
+  XFA_Element type = GetElementType();
+  return type == XFA_Element::SubformSet || type == XFA_Element::Area ||
+         type == XFA_Element::Proto || (IsUnnamed() && IsContainerNode());
+}
+
+bool CXFA_Node::IsProperty() const {
+  CXFA_Node* parent = GetParent();
+  return parent && parent->HasProperty(GetElementType());
+}
+
 bool CXFA_Node::PresenceRequiresSpace() const {
   auto value = JSObject()->TryEnum(XFA_Attribute::Presence, true);
   XFA_AttributeValue ePresence = value.value_or(XFA_AttributeValue::Visible);
diff --git a/xfa/fxfa/parser/cxfa_node.h b/xfa/fxfa/parser/cxfa_node.h
index e7767af..f8e60fa 100644
--- a/xfa/fxfa/parser/cxfa_node.h
+++ b/xfa/fxfa/parser/cxfa_node.h
@@ -376,6 +376,9 @@
 
   WideString NumericLimit(const WideString& wsValue);
 
+  bool IsTransparent() const;
+  bool IsProperty() const;
+
  protected:
   CXFA_Node(CXFA_Document* pDoc,
             XFA_PacketType ePacket,
diff --git a/xfa/fxfa/parser/cxfa_nodehelper.cpp b/xfa/fxfa/parser/cxfa_nodehelper.cpp
index b99e3f6..9d0305c 100644
--- a/xfa/fxfa/parser/cxfa_nodehelper.cpp
+++ b/xfa/fxfa/parser/cxfa_nodehelper.cpp
@@ -68,7 +68,7 @@
     if (eLogicType == XFA_LOGIC_NoTransparent)
       continue;
 
-    if (CXFA_NodeHelper::NodeIsTransparent(child) &&
+    if (child->IsTransparent() &&
         child->GetElementType() != XFA_Element::PageSet) {
       TraverseSiblings(child, dwNameHash, pSiblings, eLogicType, bIsClassName,
                        false);
@@ -79,7 +79,7 @@
 
 WideString GetNameExpressionSinglePath(CXFA_Node* refNode) {
   WideString ws;
-  bool bIsProperty = CXFA_NodeHelper::NodeIsProperty(refNode);
+  bool bIsProperty = refNode->IsProperty();
   if (refNode->IsUnnamed() ||
       (bIsProperty && refNode->GetElementType() != XFA_Element::PageSet)) {
     ws = WideString::FromASCII(refNode->GetClassName());
@@ -177,17 +177,6 @@
   return wsName;
 }
 
-// static
-bool CXFA_NodeHelper::NodeIsTransparent(CXFA_Node* refNode) {
-  if (!refNode)
-    return false;
-
-  XFA_Element refNodeType = refNode->GetElementType();
-  return (refNode->IsUnnamed() && refNode->IsContainerNode()) ||
-         refNodeType == XFA_Element::SubformSet ||
-         refNodeType == XFA_Element::Area || refNodeType == XFA_Element::Proto;
-}
-
 bool CXFA_NodeHelper::CreateNodeForCondition(const WideString& wsCondition) {
   size_t szLen = wsCondition.GetLength();
   WideString wsIndex(L"0");
@@ -303,9 +292,3 @@
     m_eLastCreateType = XFA_Element::DataValue;
   }
 }
-
-// static
-bool CXFA_NodeHelper::NodeIsProperty(CXFA_Node* refNode) {
-  CXFA_Node* parent = refNode ? refNode->GetParent() : nullptr;
-  return parent && parent->HasProperty(refNode->GetElementType());
-}
diff --git a/xfa/fxfa/parser/cxfa_nodehelper.h b/xfa/fxfa/parser/cxfa_nodehelper.h
index d4f973e..90b9c72 100644
--- a/xfa/fxfa/parser/cxfa_nodehelper.h
+++ b/xfa/fxfa/parser/cxfa_nodehelper.h
@@ -34,8 +34,6 @@
                          bool bIsProperty,
                          bool bIsClassIndex);
   static WideString GetNameExpression(CXFA_Node* refNode);
-  static bool NodeIsTransparent(CXFA_Node* refNode);
-  static bool NodeIsProperty(CXFA_Node* refNode);
 
   bool CreateNode(const WideString& wsName,
                   const WideString& wsCondition,
