Make CFXA_DocumentBuilder a stack-only type.

Slowly working to elminiate make_unique<CXFA_*>.

Change-Id: I987d29a50141aafb3275cb223ba04e91421b3ae7
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/73292
Commit-Queue: Tom Sepez <tsepez@chromium.org>
Reviewed-by: Lei Zhang <thestig@chromium.org>
diff --git a/fxjs/xfa/cjx_node.cpp b/fxjs/xfa/cjx_node.cpp
index 642eda8..ba7145f 100644
--- a/fxjs/xfa/cjx_node.cpp
+++ b/fxjs/xfa/cjx_node.cpp
@@ -271,8 +271,8 @@
 
   CFX_XMLParser parser(stream);
   std::unique_ptr<CFX_XMLDocument> xml_doc = parser.Parse();
-  auto builder = std::make_unique<CXFA_DocumentBuilder>(GetDocument());
-  CFX_XMLNode* pXMLNode = builder->Build(xml_doc.get());
+  CXFA_DocumentBuilder builder(GetDocument());
+  CFX_XMLNode* pXMLNode = builder.Build(xml_doc.get());
   if (!pXMLNode)
     return CJS_Result::Success();
 
@@ -319,8 +319,8 @@
     pFakeXMLRoot->AppendLastChild(pXMLNode);
   }
 
-  builder->ConstructXFANode(pFakeRoot, pFakeXMLRoot);
-  pFakeRoot = builder->GetRootNode();
+  builder.ConstructXFANode(pFakeRoot, pFakeXMLRoot);
+  pFakeRoot = builder.GetRootNode();
   if (!pFakeRoot)
     return CJS_Result::Success();
 
diff --git a/xfa/fxfa/parser/cxfa_document_builder.h b/xfa/fxfa/parser/cxfa_document_builder.h
index 613aa92..a6ee86c 100644
--- a/xfa/fxfa/parser/cxfa_document_builder.h
+++ b/xfa/fxfa/parser/cxfa_document_builder.h
@@ -10,7 +10,8 @@
 #include <utility>
 
 #include "core/fxcrt/fx_string.h"
-#include "v8/include/cppgc/persistent.h"
+#include "core/fxcrt/unowned_ptr.h"
+#include "v8/include/cppgc/macros.h"
 #include "xfa/fxfa/fxfa_basic.h"
 
 class CFX_XMLDocument;
@@ -20,6 +21,8 @@
 class CFX_XMLInstruction;
 
 class CXFA_DocumentBuilder {
+  CPPGC_STACK_ALLOCATED();  // Allow Raw/Unowned pointers.
+
  public:
   explicit CXFA_DocumentBuilder(CXFA_Document* pNodeFactory);
   ~CXFA_DocumentBuilder();
@@ -63,8 +66,8 @@
                         CFX_XMLInstruction* pXMLInstruction,
                         XFA_PacketType ePacketID);
 
-  cppgc::Persistent<CXFA_Document> node_factory_;
-  cppgc::Persistent<CXFA_Node> root_node_;
+  UnownedPtr<CXFA_Document> node_factory_;
+  UnownedPtr<CXFA_Node> root_node_;
   UnownedPtr<CFX_XMLDocument> xml_doc_;
   size_t execute_recursion_depth_ = 0;
 };
diff --git a/xfa/fxfa/parser/cxfa_document_builder_unittest.cpp b/xfa/fxfa/parser/cxfa_document_builder_unittest.cpp
index 63283a1..12cdf9f 100644
--- a/xfa/fxfa/parser/cxfa_document_builder_unittest.cpp
+++ b/xfa/fxfa/parser/cxfa_document_builder_unittest.cpp
@@ -19,11 +19,9 @@
     FXGCUnitTest::SetUp();
     doc_ = cppgc::MakeGarbageCollected<CXFA_Document>(
         heap()->GetAllocationHandle(), nullptr, heap(), nullptr);
-    builder_ = std::make_unique<CXFA_DocumentBuilder>(doc_);
   }
 
   void TearDown() override {
-    builder_.reset();
     doc_ = nullptr;
     FXGCUnitTest::TearDown();
   }
@@ -34,14 +32,15 @@
     xml_ = CFX_XMLParser(stream).Parse();
     if (!xml_)
       return nullptr;
-    if (!builder_->BuildDocument(xml_.get(), XFA_PacketType::Config))
+
+    CXFA_DocumentBuilder builder(doc_);
+    if (!builder.BuildDocument(xml_.get(), XFA_PacketType::Config))
       return nullptr;
-    return builder_->GetRootNode();
+    return builder.GetRootNode();
   }
 
  private:
   std::unique_ptr<CFX_XMLDocument> xml_;
-  std::unique_ptr<CXFA_DocumentBuilder> builder_;
   cppgc::Persistent<CXFA_Document> doc_;
 };