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;