Add CPDF_Document::StockFontClearer.
So CPDF_Document's dtor does not have to do any explicit cleanup.
Change-Id: Iaec7d18f67422914542fc1dc5f3b1b5a9cf5ffc5
Reviewed-on: https://pdfium-review.googlesource.com/42551
Commit-Queue: Lei Zhang <thestig@chromium.org>
Reviewed-by: Tom Sepez <tsepez@chromium.org>
diff --git a/core/fpdfapi/parser/cpdf_document.cpp b/core/fpdfapi/parser/cpdf_document.cpp
index 233b98e..c82112e 100644
--- a/core/fpdfapi/parser/cpdf_document.cpp
+++ b/core/fpdfapi/parser/cpdf_document.cpp
@@ -185,13 +185,10 @@
CPDF_Document::CPDF_Document()
: m_pDocPage(pdfium::MakeUnique<CPDF_DocPageData>(this)),
- m_pDocRender(pdfium::MakeUnique<CPDF_DocRenderData>(this)) {}
+ m_pDocRender(pdfium::MakeUnique<CPDF_DocRenderData>(this)),
+ m_StockFontClearer(this) {}
-CPDF_Document::~CPDF_Document() {
- // Destroy the extension before doing any non-extension teardown.
- m_pExtension.reset();
- CPDF_ModuleMgr::Get()->GetPageModule()->ClearStockFont(this);
-}
+CPDF_Document::~CPDF_Document() = default;
std::unique_ptr<CPDF_Object> CPDF_Document::ParseIndirectObject(
uint32_t objnum) {
@@ -883,3 +880,10 @@
return LoadFont(pBaseDict);
}
#endif // _FX_PLATFORM_ == _FX_PLATFORM_WINDOWS_
+
+CPDF_Document::StockFontClearer::StockFontClearer(CPDF_Document* pDoc)
+ : m_pDoc(pDoc) {}
+
+CPDF_Document::StockFontClearer::~StockFontClearer() {
+ CPDF_ModuleMgr::Get()->GetPageModule()->ClearStockFont(m_pDoc.Get());
+}
diff --git a/core/fpdfapi/parser/cpdf_document.h b/core/fpdfapi/parser/cpdf_document.h
index 09bfb21..be3f30c 100644
--- a/core/fpdfapi/parser/cpdf_document.h
+++ b/core/fpdfapi/parser/cpdf_document.h
@@ -125,6 +125,15 @@
#endif
protected:
+ class StockFontClearer {
+ public:
+ explicit StockFontClearer(CPDF_Document* pDoc);
+ ~StockFontClearer();
+
+ private:
+ UnownedPtr<CPDF_Document> const m_pDoc;
+ };
+
// Retrieve page count information by getting count value from the tree nodes
int RetrievePageCount();
// When this method is called, m_pTreeTraversal[level] exists.
@@ -171,6 +180,11 @@
std::unique_ptr<JBig2_DocumentContext> m_pCodecContext;
std::unique_ptr<CPDF_LinkList> m_pLinksContext;
std::vector<uint32_t> m_PageList; // Page number to page's dict objnum.
+
+ // Must be second to last.
+ StockFontClearer m_StockFontClearer;
+
+ // Must be last. Destroy the extension before any non-extension teardown.
std::unique_ptr<Extension> m_pExtension;
};