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;
 };