Pass cppgc::Heap into xfa layout layer.

Preparation for making layout items be allocated from said heap.

Change-Id: If9b672e0fbd2998e190dc635184d7fae7df2a436
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/71013
Commit-Queue: Tom Sepez <tsepez@chromium.org>
Reviewed-by: Lei Zhang <thestig@chromium.org>
diff --git a/fpdfsdk/fpdfxfa/cpdfxfa_context.cpp b/fpdfsdk/fpdfxfa/cpdfxfa_context.cpp
index 620016e..1bf7be0 100644
--- a/fpdfsdk/fpdfxfa/cpdfxfa_context.cpp
+++ b/fpdfsdk/fpdfxfa/cpdfxfa_context.cpp
@@ -141,8 +141,9 @@
     return false;
   }
 
-  m_pXFADoc = CXFA_FFDoc::CreateAndOpen(m_pXFAApp.get(), &m_DocEnv,
-                                        m_pPDFDoc.Get(), stream);
+  m_pXFADoc = CXFA_FFDoc::CreateAndOpen(
+      m_pXFAApp.get(), &m_DocEnv, m_pPDFDoc.Get(), m_pGCHeap.get(), stream);
+
   if (!m_pXFADoc) {
     FXSYS_SetLastError(FPDF_ERR_XFALOAD);
     return false;
diff --git a/xfa/fxfa/BUILD.gn b/xfa/fxfa/BUILD.gn
index 8490abe..66bce13 100644
--- a/xfa/fxfa/BUILD.gn
+++ b/xfa/fxfa/BUILD.gn
@@ -110,6 +110,7 @@
     "../fxgraphics",
     "layout",
     "parser",
+    "//v8:cppgc",
   ]
   allow_circular_includes_from = [
     "../../fxjs",
diff --git a/xfa/fxfa/DEPS b/xfa/fxfa/DEPS
index cd0aa8d..2efe354 100644
--- a/xfa/fxfa/DEPS
+++ b/xfa/fxfa/DEPS
@@ -1,5 +1,6 @@
 include_rules = [
   '+fxjs',
+  '+v8/include/cppgc',
 
   # xfa/fwl should be standalone. https://crbug.com/pdfium/507
   '+xfa/fwl',
diff --git a/xfa/fxfa/cxfa_ffdoc.cpp b/xfa/fxfa/cxfa_ffdoc.cpp
index 78c6d20..f45e09e 100644
--- a/xfa/fxfa/cxfa_ffdoc.cpp
+++ b/xfa/fxfa/cxfa_ffdoc.cpp
@@ -22,6 +22,7 @@
 #include "core/fxge/dib/cfx_dibitmap.h"
 #include "fxjs/xfa/cjx_object.h"
 #include "third_party/base/ptr_util.h"
+#include "v8/include/cppgc/heap.h"
 #include "xfa/fgas/font/cfgas_pdffontmgr.h"
 #include "xfa/fwl/cfwl_notedriver.h"
 #include "xfa/fxfa/cxfa_ffapp.h"
@@ -54,14 +55,15 @@
     CXFA_FFApp* pApp,
     IXFA_DocEnvironment* pDocEnvironment,
     CPDF_Document* pPDFDoc,
+    cppgc::Heap* pGCHeap,
     const RetainPtr<IFX_SeekableStream>& stream) {
   ASSERT(pApp);
   ASSERT(pDocEnvironment);
   ASSERT(pPDFDoc);
 
   // Use WrapUnique() to keep constructor private.
-  auto result =
-      pdfium::WrapUnique(new CXFA_FFDoc(pApp, pDocEnvironment, pPDFDoc));
+  auto result = pdfium::WrapUnique(
+      new CXFA_FFDoc(pApp, pDocEnvironment, pPDFDoc, pGCHeap));
   if (!result->OpenDoc(stream))
     return nullptr;
 
@@ -70,14 +72,16 @@
 
 CXFA_FFDoc::CXFA_FFDoc(CXFA_FFApp* pApp,
                        IXFA_DocEnvironment* pDocEnvironment,
-                       CPDF_Document* pPDFDoc)
+                       CPDF_Document* pPDFDoc,
+                       cppgc::Heap* pHeap)
     : m_pDocEnvironment(pDocEnvironment),
       m_pApp(pApp),
       m_pPDFDoc(pPDFDoc),
+      m_pHeap(pHeap),
       m_pNotify(std::make_unique<CXFA_FFNotify>(this)),
       m_pDocument(std::make_unique<CXFA_Document>(
           m_pNotify.get(),
-          std::make_unique<CXFA_LayoutProcessor>())) {}
+          std::make_unique<CXFA_LayoutProcessor>(pHeap))) {}
 
 CXFA_FFDoc::~CXFA_FFDoc() {
   if (m_DocView) {
diff --git a/xfa/fxfa/cxfa_ffdoc.h b/xfa/fxfa/cxfa_ffdoc.h
index 04d98bc..67852e4 100644
--- a/xfa/fxfa/cxfa_ffdoc.h
+++ b/xfa/fxfa/cxfa_ffdoc.h
@@ -26,6 +26,10 @@
 class CXFA_FFDocView;
 class CXFA_LayoutProcessor;
 
+namespace cppgc {
+class Heap;
+}  // namespace cppgc
+
 struct FX_IMAGEDIB_AND_DPI {
   FX_IMAGEDIB_AND_DPI();
   FX_IMAGEDIB_AND_DPI(const FX_IMAGEDIB_AND_DPI& that);
@@ -45,6 +49,7 @@
       CXFA_FFApp* pApp,
       IXFA_DocEnvironment* pDocEnvironment,
       CPDF_Document* pPDFDoc,
+      cppgc::Heap* pGCHeap,
       const RetainPtr<IFX_SeekableStream>& stream);
 
   ~CXFA_FFDoc();
@@ -73,13 +78,15 @@
  private:
   CXFA_FFDoc(CXFA_FFApp* pApp,
              IXFA_DocEnvironment* pDocEnvironment,
-             CPDF_Document* pPDFDoc);
+             CPDF_Document* pPDFDoc,
+             cppgc::Heap* pHeap);
   bool OpenDoc(const RetainPtr<IFX_SeekableStream>& stream);
   bool ParseDoc(const RetainPtr<IFX_SeekableStream>& stream);
 
   UnownedPtr<IXFA_DocEnvironment> const m_pDocEnvironment;
   UnownedPtr<CXFA_FFApp> const m_pApp;
   UnownedPtr<CPDF_Document> const m_pPDFDoc;
+  UnownedPtr<cppgc::Heap> const m_pHeap;
   std::unique_ptr<CFX_XMLDocument> m_pXMLDoc;
   std::unique_ptr<CXFA_FFNotify> m_pNotify;
   std::unique_ptr<CXFA_Document> m_pDocument;
diff --git a/xfa/fxfa/layout/BUILD.gn b/xfa/fxfa/layout/BUILD.gn
index 6c9295f..9770f3f 100644
--- a/xfa/fxfa/layout/BUILD.gn
+++ b/xfa/fxfa/layout/BUILD.gn
@@ -27,6 +27,7 @@
     "../../../core/fxcrt",
     "../../../fxjs",
     "../parser",
+    "//v8:cppgc",
   ]
   allow_circular_includes_from = [ "../../../fxjs" ]
   configs += [
diff --git a/xfa/fxfa/layout/cxfa_layoutprocessor.cpp b/xfa/fxfa/layout/cxfa_layoutprocessor.cpp
index dca3cb1..c9ea12c 100644
--- a/xfa/fxfa/layout/cxfa_layoutprocessor.cpp
+++ b/xfa/fxfa/layout/cxfa_layoutprocessor.cpp
@@ -8,6 +8,7 @@
 
 #include "fxjs/xfa/cjx_object.h"
 #include "third_party/base/stl_util.h"
+#include "v8/include/cppgc/heap.h"
 #include "xfa/fxfa/layout/cxfa_contentlayoutitem.h"
 #include "xfa/fxfa/layout/cxfa_contentlayoutprocessor.h"
 #include "xfa/fxfa/layout/cxfa_viewlayoutprocessor.h"
@@ -25,7 +26,8 @@
   return static_cast<CXFA_LayoutProcessor*>(pXFADoc->GetLayoutProcessor());
 }
 
-CXFA_LayoutProcessor::CXFA_LayoutProcessor() = default;
+CXFA_LayoutProcessor::CXFA_LayoutProcessor(cppgc::Heap* pHeap)
+    : m_pHeap(pHeap) {}
 
 CXFA_LayoutProcessor::~CXFA_LayoutProcessor() = default;
 
diff --git a/xfa/fxfa/layout/cxfa_layoutprocessor.h b/xfa/fxfa/layout/cxfa_layoutprocessor.h
index 18dc208..72c4b47 100644
--- a/xfa/fxfa/layout/cxfa_layoutprocessor.h
+++ b/xfa/fxfa/layout/cxfa_layoutprocessor.h
@@ -20,17 +20,22 @@
 class CXFA_ViewLayoutItem;
 class CXFA_ViewLayoutProcessor;
 
+namespace cppgc {
+class Heap;
+}  // namespace cppgc
+
 class CXFA_LayoutProcessor : public CXFA_Document::LayoutProcessorIface {
  public:
   static CXFA_LayoutProcessor* FromDocument(const CXFA_Document* pXFADoc);
 
-  CXFA_LayoutProcessor();
+  explicit CXFA_LayoutProcessor(cppgc::Heap* pHeap);
   ~CXFA_LayoutProcessor() override;
 
   // CXFA_Document::LayoutProcessorIface:
   void SetForceRelayout(bool bForceRestart) override;
   void AddChangedContainer(CXFA_Node* pContainer) override;
 
+  cppgc::Heap* GetHeap() { return m_pHeap.Get(); }
   int32_t StartLayout(bool bForceRestart);
   int32_t DoLayout();
   bool IncrementLayout();
@@ -47,6 +52,7 @@
  private:
   bool NeedLayout() const;
 
+  UnownedPtr<cppgc::Heap> const m_pHeap;
   std::unique_ptr<CXFA_ViewLayoutProcessor> m_pViewLayoutProcessor;
   std::unique_ptr<CXFA_ContentLayoutProcessor> m_pContentLayoutProcessor;
   std::vector<CXFA_Node*> m_rgChangedContainers;