diff --git a/fxjs/xfa/cfxjse_engine.cpp b/fxjs/xfa/cfxjse_engine.cpp
index 1569514..d2c3421 100644
--- a/fxjs/xfa/cfxjse_engine.cpp
+++ b/fxjs/xfa/cfxjse_engine.cpp
@@ -634,7 +634,7 @@
       }
       break;
     }
-    std::vector<CXFA_Object*> retObjects;
+    std::vector<UnownedPtr<CXFA_Object>> retObjects;
     while (i < nNodes) {
       bool bDataBind = false;
       if (((dwStyles & XFA_RESOLVENODE_Bind) ||
@@ -676,7 +676,7 @@
       if (dwStyles & XFA_RESOLVENODE_CreateNode) {
         bNextCreate = true;
         if (!pNodeHelper->m_pCreateParent) {
-          pNodeHelper->m_pCreateParent = ToNode(rndFind.m_CurObject);
+          pNodeHelper->m_pCreateParent = ToNode(rndFind.m_CurObject.Get());
           pNodeHelper->m_iCreateCount = 1;
         }
         int32_t checked_length =
@@ -689,8 +689,7 @@
       break;
     }
 
-    findObjects = std::vector<UnownedPtr<CXFA_Object>>(retObjects.begin(),
-                                                       retObjects.end());
+    findObjects = std::move(retObjects);
     rndFind.m_Objects.clear();
     if (nLevel == 0)
       dwStyles &= ~(XFA_RESOLVENODE_Parent | XFA_RESOLVENODE_Siblings);
diff --git a/fxjs/xfa/cfxjse_resolveprocessor.cpp b/fxjs/xfa/cfxjse_resolveprocessor.cpp
index c2a21a6..64a3fbd 100644
--- a/fxjs/xfa/cfxjse_resolveprocessor.cpp
+++ b/fxjs/xfa/cfxjse_resolveprocessor.cpp
@@ -36,7 +36,7 @@
 
   if (!rnd.m_CurObject->IsNode()) {
     if (rnd.m_dwStyles & XFA_RESOLVENODE_Attributes) {
-      return ResolveForAttributeRs(rnd.m_CurObject, rnd,
+      return ResolveForAttributeRs(rnd.m_CurObject.Get(), rnd,
                                    rnd.m_wsName.AsStringView());
     }
     return false;
@@ -63,18 +63,18 @@
     }
   }
   if (rnd.m_uHashName == XFA_HASHCODE_This && rnd.m_nLevel == 0) {
-    rnd.m_Objects.push_back(rnd.m_pSC->GetThisObject());
+    rnd.m_Objects.emplace_back(rnd.m_pSC->GetThisObject());
     return true;
   }
   if (rnd.m_CurObject->GetElementType() == XFA_Element::Xfa) {
     CXFA_Object* pObjNode =
         rnd.m_pSC->GetDocument()->GetXFAObject(rnd.m_uHashName);
     if (pObjNode) {
-      rnd.m_Objects.push_back(pObjNode);
+      rnd.m_Objects.emplace_back(pObjNode);
     } else if (rnd.m_uHashName == XFA_HASHCODE_Xfa) {
       rnd.m_Objects.push_back(rnd.m_CurObject);
     } else if ((rnd.m_dwStyles & XFA_RESOLVENODE_Attributes) &&
-               ResolveForAttributeRs(rnd.m_CurObject, rnd,
+               ResolveForAttributeRs(rnd.m_CurObject.Get(), rnd,
                                      rnd.m_wsName.AsStringView())) {
       return true;
     }
@@ -84,7 +84,7 @@
     return !rnd.m_Objects.empty();
   }
   if (!ResolveNormal(rnd) && rnd.m_uHashName == XFA_HASHCODE_Xfa)
-    rnd.m_Objects.push_back(rnd.m_pSC->GetDocument()->GetRoot());
+    rnd.m_Objects.emplace_back(rnd.m_pSC->GetDocument()->GetRoot());
 
   return !rnd.m_Objects.empty();
 }
@@ -97,24 +97,26 @@
   if (wsName.GetLength() && wsName[0] == '#') {
     bClassName = true;
     findNode = m_pNodeHelper->GetOneChildOfClass(
-        ToNode(rnd.m_CurObject), wsName.Right(wsName.GetLength() - 1));
+        ToNode(rnd.m_CurObject.Get()), wsName.Right(wsName.GetLength() - 1));
   } else {
-    findNode = m_pNodeHelper->GetOneChildNamed(ToNode(rnd.m_CurObject), wsName);
+    findNode =
+        m_pNodeHelper->GetOneChildNamed(ToNode(rnd.m_CurObject.Get()), wsName);
   }
   if (!findNode)
     return false;
 
   if (wsCondition.IsEmpty()) {
-    rnd.m_Objects.push_back(findNode);
+    rnd.m_Objects.emplace_back(findNode);
     return true;
   }
 
   std::vector<CXFA_Node*> tempNodes;
-  for (auto* pObject : rnd.m_Objects)
+  for (const auto& pObject : rnd.m_Objects)
     tempNodes.push_back(pObject->AsNode());
   m_pNodeHelper->CountSiblings(findNode, XFA_LOGIC_Transparent, &tempNodes,
                                bClassName);
-  rnd.m_Objects = std::vector<CXFA_Object*>(tempNodes.begin(), tempNodes.end());
+  rnd.m_Objects =
+      std::vector<UnownedPtr<CXFA_Object>>(tempNodes.begin(), tempNodes.end());
   FilterCondition(rnd, wsCondition);
   return !rnd.m_Objects.empty();
 }
@@ -133,11 +135,11 @@
   XFA_HashCode dwNameHash = static_cast<XFA_HashCode>(FX_HashCode_GetW(
       WideStringView(wsName.c_str() + 1, iNameLen - 1), false));
   if (dwNameHash == XFA_HASHCODE_Xfa) {
-    rnd.m_Objects.push_back(rnd.m_pSC->GetDocument()->GetRoot());
+    rnd.m_Objects.emplace_back(rnd.m_pSC->GetDocument()->GetRoot());
   } else {
     CXFA_Object* pObjNode = rnd.m_pSC->GetDocument()->GetXFAObject(dwNameHash);
     if (pObjNode)
-      rnd.m_Objects.push_back(pObjNode);
+      rnd.m_Objects.emplace_back(pObjNode);
   }
   if (!rnd.m_Objects.empty())
     FilterCondition(rnd, wsCondition);
@@ -154,7 +156,7 @@
   if (!datasets)
     return false;
 
-  CFXJSE_ResolveNodeData rndFind(rnd.m_pSC);
+  CFXJSE_ResolveNodeData rndFind(rnd.m_pSC.Get());
   rndFind.m_CurObject = datasets;
   rndFind.m_wsName = rnd.m_wsName.Right(rnd.m_wsName.GetLength() - 1);
   rndFind.m_uHashName = static_cast<XFA_HashCode>(
@@ -172,11 +174,11 @@
 bool CFXJSE_ResolveProcessor::ResolveNumberSign(CFXJSE_ResolveNodeData& rnd) {
   WideString wsName = rnd.m_wsName.Right(rnd.m_wsName.GetLength() - 1);
   WideString wsCondition = rnd.m_wsCondition;
-  CXFA_Node* curNode = ToNode(rnd.m_CurObject);
+  CXFA_Node* curNode = ToNode(rnd.m_CurObject.Get());
   if (ResolveForAttributeRs(curNode, rnd, wsName.AsStringView()))
     return true;
 
-  CFXJSE_ResolveNodeData rndFind(rnd.m_pSC);
+  CFXJSE_ResolveNodeData rndFind(rnd.m_pSC.Get());
   rndFind.m_nLevel = rnd.m_nLevel + 1;
   rndFind.m_dwStyles = rnd.m_dwStyles;
   rndFind.m_dwStyles |= XFA_RESOLVENODE_TagName;
@@ -192,7 +194,7 @@
 
   if (wsCondition.GetLength() == 0 &&
       pdfium::ContainsValue(rndFind.m_Objects, curNode)) {
-    rnd.m_Objects.push_back(curNode);
+    rnd.m_Objects.emplace_back(curNode);
   } else {
     rnd.m_Objects.insert(rnd.m_Objects.end(), rndFind.m_Objects.begin(),
                          rndFind.m_Objects.end());
@@ -209,7 +211,7 @@
     return false;
 
   rnd.m_ScriptAttribute = info.value();
-  rnd.m_Objects.push_back(curNode);
+  rnd.m_Objects.emplace_back(curNode);
   rnd.m_dwFlag = XFA_ResolveNode_RSType_Attribute;
   return true;
 }
@@ -225,7 +227,7 @@
   XFA_HashCode uNameHash = rnd.m_uHashName;
   WideString& wsCondition = rnd.m_wsCondition;
 
-  CFXJSE_ResolveNodeData rndFind(rnd.m_pSC);
+  CFXJSE_ResolveNodeData rndFind(rnd.m_pSC.Get());
   rndFind.m_wsName = rnd.m_wsName;
   rndFind.m_wsCondition = rnd.m_wsCondition;
   rndFind.m_nLevel = rnd.m_nLevel + 1;
@@ -252,7 +254,7 @@
   }
   if ((dwStyles & XFA_RESOLVENODE_Properties) && pVariablesNode) {
     if (pVariablesNode->GetClassHashCode() == uNameHash) {
-      rnd.m_Objects.push_back(pVariablesNode);
+      rnd.m_Objects.emplace_back(pVariablesNode);
     } else {
       rndFind.m_CurObject = pVariablesNode;
       SetStylesForChild(dwStyles, rndFind);
@@ -277,9 +279,9 @@
     for (CXFA_Node* child : children) {
       if (dwStyles & XFA_RESOLVENODE_TagName) {
         if (child->GetClassHashCode() == uNameHash)
-          rnd.m_Objects.push_back(child);
+          rnd.m_Objects.emplace_back(child);
       } else if (child->GetNameHash() == uNameHash) {
-        rnd.m_Objects.push_back(child);
+        rnd.m_Objects.emplace_back(child);
       }
 
       if (m_pNodeHelper->NodeIsTransparent(child) &&
@@ -302,14 +304,14 @@
       if (!(dwStyles & XFA_RESOLVENODE_ALL)) {
         std::vector<CXFA_Node*> upArrayNodes;
         if (m_pNodeHelper->NodeIsTransparent(ToNode(curNode))) {
-          m_pNodeHelper->CountSiblings(ToNode(rnd.m_Objects[0]),
+          m_pNodeHelper->CountSiblings(ToNode(rnd.m_Objects.front().Get()),
                                        XFA_LOGIC_Transparent, &upArrayNodes,
                                        !!(dwStyles & XFA_RESOLVENODE_TagName));
         }
         if (upArrayNodes.size() > rnd.m_Objects.size()) {
-          CXFA_Object* pSaveObject = rnd.m_Objects.front();
-          rnd.m_Objects = std::vector<CXFA_Object*>(upArrayNodes.begin(),
-                                                    upArrayNodes.end());
+          CXFA_Object* pSaveObject = rnd.m_Objects.front().Get();
+          rnd.m_Objects = std::vector<UnownedPtr<CXFA_Object>>(
+              upArrayNodes.begin(), upArrayNodes.end());
           rnd.m_Objects.front() = pSaveObject;
         }
       }
@@ -325,13 +327,13 @@
     for (CXFA_Node* pChildProperty : properties) {
       if (pChildProperty->IsUnnamed()) {
         if (pChildProperty->GetClassHashCode() == uNameHash)
-          rnd.m_Objects.push_back(pChildProperty);
+          rnd.m_Objects.emplace_back(pChildProperty);
         continue;
       }
       if (pChildProperty->GetNameHash() == uNameHash &&
           pChildProperty->GetElementType() != XFA_Element::Extras &&
           pChildProperty->GetElementType() != XFA_Element::Items) {
-        rnd.m_Objects.push_back(pChildProperty);
+        rnd.m_Objects.emplace_back(pChildProperty);
       }
     }
     if (rnd.m_Objects.size() > nNum) {
@@ -358,7 +360,7 @@
       }
     }
     if (pProp) {
-      rnd.m_Objects.push_back(pProp);
+      rnd.m_Objects.emplace_back(pProp);
       return !rnd.m_Objects.empty();
     }
   }
@@ -368,7 +370,7 @@
   uint32_t uCurClassHash = curNode->GetClassHashCode();
   if (!parentNode) {
     if (uCurClassHash == uNameHash) {
-      rnd.m_Objects.push_back(curNode->AsNode());
+      rnd.m_Objects.emplace_back(curNode->AsNode());
       FilterCondition(rnd, wsCondition);
       if (!rnd.m_Objects.empty())
         return true;
@@ -390,13 +392,13 @@
       if (child == curNode) {
         if (dwStyles & XFA_RESOLVENODE_TagName) {
           if (uCurClassHash == uNameHash)
-            rnd.m_Objects.push_back(curNode);
+            rnd.m_Objects.emplace_back(curNode);
         } else {
           if (child->GetNameHash() == uNameHash) {
-            rnd.m_Objects.push_back(curNode);
+            rnd.m_Objects.emplace_back(curNode);
             if (rnd.m_nLevel == 0 && wsCondition.GetLength() == 0) {
               rnd.m_Objects.clear();
-              rnd.m_Objects.push_back(curNode);
+              rnd.m_Objects.emplace_back(curNode);
               return true;
             }
           }
@@ -407,9 +409,9 @@
 
       if (dwStyles & XFA_RESOLVENODE_TagName) {
         if (child->GetClassHashCode() == uNameHash)
-          rnd.m_Objects.push_back(child);
+          rnd.m_Objects.emplace_back(child);
       } else if (child->GetNameHash() == uNameHash) {
-        rnd.m_Objects.push_back(child);
+        rnd.m_Objects.emplace_back(child);
       }
 
       bool bInnerSearch = false;
@@ -438,13 +440,13 @@
     if (rnd.m_Objects.size() > nNum) {
       if (m_pNodeHelper->NodeIsTransparent(parentNode)) {
         std::vector<CXFA_Node*> upArrayNodes;
-        m_pNodeHelper->CountSiblings(ToNode(rnd.m_Objects.front()),
+        m_pNodeHelper->CountSiblings(ToNode(rnd.m_Objects.front().Get()),
                                      XFA_LOGIC_Transparent, &upArrayNodes,
                                      !!(dwStyles & XFA_RESOLVENODE_TagName));
         if (upArrayNodes.size() > rnd.m_Objects.size()) {
-          CXFA_Object* pSaveObject = rnd.m_Objects.front();
-          rnd.m_Objects = std::vector<CXFA_Object*>(upArrayNodes.begin(),
-                                                    upArrayNodes.end());
+          CXFA_Object* pSaveObject = rnd.m_Objects.front().Get();
+          rnd.m_Objects = std::vector<UnownedPtr<CXFA_Object>>(
+              upArrayNodes.begin(), upArrayNodes.end());
           rnd.m_Objects.front() = pSaveObject;
         }
       }
@@ -475,7 +477,7 @@
 }
 
 bool CFXJSE_ResolveProcessor::ResolveAsterisk(CFXJSE_ResolveNodeData& rnd) {
-  CXFA_Node* curNode = ToNode(rnd.m_CurObject);
+  CXFA_Node* curNode = ToNode(rnd.m_CurObject.Get());
   std::vector<CXFA_Node*> array =
       curNode->GetNodeList(XFA_NODEFILTER_Children | XFA_NODEFILTER_Properties,
                            XFA_Element::Unknown);
@@ -585,14 +587,14 @@
   if (bAll) {
     if (rnd.m_dwStyles & XFA_RESOLVENODE_CreateNode) {
       if (rnd.m_dwStyles & XFA_RESOLVENODE_Bind) {
-        m_pNodeHelper->m_pCreateParent = ToNode(rnd.m_CurObject);
+        m_pNodeHelper->m_pCreateParent = ToNode(rnd.m_CurObject.Get());
         m_pNodeHelper->m_iCreateCount = 1;
         rnd.m_Objects.clear();
         m_pNodeHelper->m_iCurAllStart = -1;
         m_pNodeHelper->m_pAllStartParent = nullptr;
       } else if (m_pNodeHelper->m_iCurAllStart == -1) {
         m_pNodeHelper->m_iCurAllStart = m_iCurStart;
-        m_pNodeHelper->m_pAllStartParent = ToNode(rnd.m_CurObject);
+        m_pNodeHelper->m_pAllStartParent = ToNode(rnd.m_CurObject.Get());
       }
     } else if (rnd.m_dwStyles & XFA_RESOLVENODE_BindNew) {
       if (m_pNodeHelper->m_iCurAllStart == -1)
@@ -609,14 +611,13 @@
 
   if (iFoundCount <= iIndex || iIndex < 0) {
     if (rnd.m_dwStyles & XFA_RESOLVENODE_CreateNode) {
-      m_pNodeHelper->m_pCreateParent = ToNode(rnd.m_CurObject);
+      m_pNodeHelper->m_pCreateParent = ToNode(rnd.m_CurObject.Get());
       m_pNodeHelper->m_iCreateCount = iIndex - iFoundCount + 1;
     }
     rnd.m_Objects.clear();
   } else {
-    CXFA_Object* ret = rnd.m_Objects[iIndex];
-    rnd.m_Objects.clear();
-    rnd.m_Objects.push_back(ret);
+    rnd.m_Objects =
+        std::vector<UnownedPtr<CXFA_Object>>(1, rnd.m_Objects[iIndex]);
   }
 }
 
@@ -634,12 +635,11 @@
   else
     return;
 
-  CFXJSE_Engine* pContext = rnd.m_pSC;
   wsExpression = wsCondition.Mid(2, wsCondition.GetLength() - 3);
   for (int32_t i = iFoundCount - 1; i >= 0; i--) {
     auto pRetValue = pdfium::MakeUnique<CFXJSE_Value>(rnd.m_pSC->GetIsolate());
-    bool bRet = pContext->RunScript(eLangType, wsExpression.AsStringView(),
-                                    pRetValue.get(), rnd.m_Objects[i]);
+    bool bRet = rnd.m_pSC->RunScript(eLangType, wsExpression.AsStringView(),
+                                     pRetValue.get(), rnd.m_Objects[i].Get());
     if (!bRet || !pRetValue->ToBoolean())
       rnd.m_Objects.erase(rnd.m_Objects.begin() + i);
   }
@@ -674,16 +674,15 @@
 
     if (iFoundCount <= iCurrIndex) {
       if (rnd.m_dwStyles & XFA_RESOLVENODE_CreateNode) {
-        m_pNodeHelper->m_pCreateParent = ToNode(rnd.m_CurObject);
+        m_pNodeHelper->m_pCreateParent = ToNode(rnd.m_CurObject.Get());
         m_pNodeHelper->m_iCreateCount = iCurrIndex - iFoundCount + 1;
       }
       rnd.m_Objects.clear();
       return;
     }
 
-    CXFA_Object* ret = rnd.m_Objects[iCurrIndex];
-    rnd.m_Objects.clear();
-    rnd.m_Objects.push_back(ret);
+    rnd.m_Objects =
+        std::vector<UnownedPtr<CXFA_Object>>(1, rnd.m_Objects[iCurrIndex]);
     return;
   }
 
@@ -730,14 +729,6 @@
 }
 
 CFXJSE_ResolveNodeData::CFXJSE_ResolveNodeData(CFXJSE_Engine* pSC)
-    : m_pSC(pSC),
-      m_CurObject(nullptr),
-      m_wsName(),
-      m_uHashName(XFA_HASHCODE_None),
-      m_wsCondition(),
-      m_nLevel(0),
-      m_Objects(),
-      m_dwStyles(XFA_RESOLVENODE_Children),
-      m_dwFlag(XFA_ResolveNode_RSType_Nodes) {}
+    : m_pSC(pSC) {}
 
 CFXJSE_ResolveNodeData::~CFXJSE_ResolveNodeData() {}
diff --git a/fxjs/xfa/cfxjse_resolveprocessor.h b/fxjs/xfa/cfxjse_resolveprocessor.h
index e3c4ee0..3f2a07c 100644
--- a/fxjs/xfa/cfxjse_resolveprocessor.h
+++ b/fxjs/xfa/cfxjse_resolveprocessor.h
@@ -11,28 +11,28 @@
 #include <vector>
 
 #include "core/fxcrt/fx_string.h"
+#include "fxjs/xfa/cfxjse_engine.h"
 #include "xfa/fxfa/fxfa_basic.h"
 #include "xfa/fxfa/parser/xfa_basic_data.h"
 #include "xfa/fxfa/parser/xfa_resolvenode_rs.h"
 
 class CXFA_NodeHelper;
-class CFXJSE_Engine;
 
 class CFXJSE_ResolveNodeData {
  public:
   explicit CFXJSE_ResolveNodeData(CFXJSE_Engine* pSC);
   ~CFXJSE_ResolveNodeData();
 
-  CFXJSE_Engine* m_pSC;
-  CXFA_Object* m_CurObject;
+  UnownedPtr<CFXJSE_Engine> const m_pSC;
+  UnownedPtr<CXFA_Object> m_CurObject;
   WideString m_wsName;
-  XFA_HashCode m_uHashName;
   WideString m_wsCondition;
-  int32_t m_nLevel;
-  std::vector<CXFA_Object*> m_Objects;  // Not owned.
-  uint32_t m_dwStyles;
+  XFA_HashCode m_uHashName = XFA_HASHCODE_None;
+  int32_t m_nLevel = 0;
+  uint32_t m_dwStyles = XFA_RESOLVENODE_Children;
+  XFA_ResolveNode_RSType m_dwFlag = XFA_ResolveNode_RSType_Nodes;
+  std::vector<UnownedPtr<CXFA_Object>> m_Objects;
   XFA_SCRIPTATTRIBUTEINFO m_ScriptAttribute;
-  XFA_ResolveNode_RSType m_dwFlag;
 };
 
 class CFXJSE_ResolveProcessor {
