Use vector of cppgc::Member in XFA_ResolveNodeRS.

Make XFA_ResolveNodeRS a stack-only object, and consequently its
members (little m) will be stack-allocated. This includes a vector
of UnownedPtr to the GC'd CXFA_Object, which should be Member (big M)
for future correctness when cppgc-approved containers become available.

-- Pass span by value rather than vector by const-ref, assuming that
   future types will convert to span the same way as std::vector.

Bug: pdfium:1563
Change-Id: Ibcd5d158789999772a0023bc4884ca0be6a58850
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/74270
Commit-Queue: Tom Sepez <tsepez@chromium.org>
Reviewed-by: Lei Zhang <thestig@chromium.org>
diff --git a/fxjs/xfa/cfxjse_engine.cpp b/fxjs/xfa/cfxjse_engine.cpp
index 284b940..bd6f912 100644
--- a/fxjs/xfa/cfxjse_engine.cpp
+++ b/fxjs/xfa/cfxjse_engine.cpp
@@ -628,7 +628,7 @@
   int32_t nStart = 0;
   int32_t nLevel = 0;
 
-  std::vector<UnownedPtr<CXFA_Object>> findObjects;
+  std::vector<cppgc::Member<CXFA_Object>> findObjects;
   findObjects.emplace_back(refObject ? refObject : m_pDocument->GetRoot());
   int32_t nNodes = 0;
   while (true) {
@@ -670,7 +670,7 @@
       }
       break;
     }
-    std::vector<UnownedPtr<CXFA_Object>> retObjects;
+    std::vector<cppgc::Member<CXFA_Object>> retObjects;
     while (i < nNodes) {
       bool bDataBind = false;
       if (((dwStyles & XFA_RESOLVENODE_Bind) ||
diff --git a/xfa/fxfa/parser/cxfa_document.cpp b/xfa/fxfa/parser/cxfa_document.cpp
index 5bb1cf5..c41fc42 100644
--- a/xfa/fxfa/parser/cxfa_document.cpp
+++ b/xfa/fxfa/parser/cxfa_document.cpp
@@ -1628,7 +1628,7 @@
 }
 
 CXFA_Node* CXFA_Document::GetNotBindNode(
-    const std::vector<UnownedPtr<CXFA_Object>>& arrayObjects) const {
+    pdfium::span<cppgc::Member<CXFA_Object>> arrayObjects) const {
   for (auto& pObject : arrayObjects) {
     CXFA_Node* pNode = pObject->AsNode();
     if (pNode && !pNode->HasBindItem())
diff --git a/xfa/fxfa/parser/cxfa_document.h b/xfa/fxfa/parser/cxfa_document.h
index c6e6b2d..ca8d8fc 100644
--- a/xfa/fxfa/parser/cxfa_document.h
+++ b/xfa/fxfa/parser/cxfa_document.h
@@ -14,6 +14,7 @@
 #include "core/fxcrt/unowned_ptr.h"
 #include "fxjs/gc/heap.h"
 #include "third_party/base/optional.h"
+#include "third_party/base/span.h"
 #include "v8/include/cppgc/garbage-collected.h"
 #include "v8/include/cppgc/member.h"
 #include "v8/include/cppgc/persistent.h"
@@ -96,7 +97,7 @@
   CXFA_Object* GetXFAObject(XFA_HashCode wsNodeNameHash);
   CXFA_Node* GetNodeByID(CXFA_Node* pRoot, WideStringView wsID) const;
   CXFA_Node* GetNotBindNode(
-      const std::vector<UnownedPtr<CXFA_Object>>& arrayNodes) const;
+      pdfium::span<cppgc::Member<CXFA_Object>> arrayNodes) const;
 
   LayoutProcessorIface* GetLayoutProcessor() const {
     return m_pLayoutProcessor;
diff --git a/xfa/fxfa/parser/xfa_resolvenode_rs.h b/xfa/fxfa/parser/xfa_resolvenode_rs.h
index a7a3200..851c94b 100644
--- a/xfa/fxfa/parser/xfa_resolvenode_rs.h
+++ b/xfa/fxfa/parser/xfa_resolvenode_rs.h
@@ -9,12 +9,15 @@
 
 #include <vector>
 
-#include "core/fxcrt/unowned_ptr.h"
+#include "v8/include/cppgc/macros.h"
+#include "v8/include/cppgc/member.h"
 #include "xfa/fxfa/parser/xfa_basic_data.h"
 
 class CXFA_Object;
 
 class XFA_ResolveNodeRS {
+  CPPGC_STACK_ALLOCATED();  // Allow raw/unowned pointers.
+
  public:
   enum class Type {
     kNodes,
@@ -30,7 +33,10 @@
 
   Type dwFlags = Type::kNodes;
   XFA_SCRIPTATTRIBUTEINFO script_attribute;
-  std::vector<UnownedPtr<CXFA_Object>> objects;
+
+  // Vector of Member would be correct for stack-based vectors, if
+  // STL worked with cppgc.
+  std::vector<cppgc::Member<CXFA_Object>> objects;
 };
 
 #endif  // XFA_FXFA_PARSER_XFA_RESOLVENODE_RS_H_