Make CPDF_PageModule a per-process singleton.

Allow removal of another circular include. Also remove some
stray includes in the process.

Change-Id: If725776b2ef790b8b4b97d3b2041fd82cfb061c9
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/55394
Reviewed-by: Lei Zhang <thestig@chromium.org>
Commit-Queue: Tom Sepez <tsepez@chromium.org>
diff --git a/core/fpdfapi/BUILD.gn b/core/fpdfapi/BUILD.gn
index f4ea940..9ebdab7 100644
--- a/core/fpdfapi/BUILD.gn
+++ b/core/fpdfapi/BUILD.gn
@@ -28,7 +28,6 @@
   allow_circular_includes_from = [
     "page",
     "parser",
-    "render",
   ]
   visibility = [ "../../*" ]
 }
diff --git a/core/fpdfapi/cpdf_modulemgr.cpp b/core/fpdfapi/cpdf_modulemgr.cpp
index 7b9f8f6..ebe7758 100644
--- a/core/fpdfapi/cpdf_modulemgr.cpp
+++ b/core/fpdfapi/cpdf_modulemgr.cpp
@@ -26,13 +26,14 @@
   ASSERT(!g_pDefaultMgr);
   g_pDefaultMgr = new CPDF_ModuleMgr;
   CCodec_ModuleMgr::Create();
-  g_pDefaultMgr->InitPageModule();
+  CPDF_PageModule::Create();
   g_pDefaultMgr->LoadEmbeddedMaps();
 }
 
 // static
 void CPDF_ModuleMgr::Destroy() {
   ASSERT(g_pDefaultMgr);
+  CPDF_PageModule::Destroy();
   CCodec_ModuleMgr::Destroy();
   delete g_pDefaultMgr;
   g_pDefaultMgr = nullptr;
@@ -48,10 +49,6 @@
 
 CPDF_ModuleMgr::~CPDF_ModuleMgr() = default;
 
-void CPDF_ModuleMgr::InitPageModule() {
-  m_pPageModule = pdfium::MakeUnique<CPDF_PageModule>();
-}
-
 void CPDF_ModuleMgr::LoadEmbeddedMaps() {
   LoadEmbeddedGB1CMaps();
   LoadEmbeddedCNS1CMaps();
diff --git a/core/fpdfapi/cpdf_modulemgr.h b/core/fpdfapi/cpdf_modulemgr.h
index f768d19..70eb6f0 100644
--- a/core/fpdfapi/cpdf_modulemgr.h
+++ b/core/fpdfapi/cpdf_modulemgr.h
@@ -10,8 +10,6 @@
 #include <memory>
 #include <utility>
 
-class CPDF_PageModule;
-
 namespace fpdfapi {
 
 class UnsupportedInfoAdapter {
@@ -41,8 +39,6 @@
     return m_pUnsupportInfoAdapter.get();
   }
 
-  CPDF_PageModule* GetPageModule() const { return m_pPageModule.get(); }
-
  private:
   CPDF_ModuleMgr();
   ~CPDF_ModuleMgr();
@@ -54,7 +50,6 @@
   void LoadEmbeddedJapan1CMaps();
   void LoadEmbeddedKorea1CMaps();
 
-  std::unique_ptr<CPDF_PageModule> m_pPageModule;
   std::unique_ptr<fpdfapi::UnsupportedInfoAdapter> m_pUnsupportInfoAdapter;
 };
 
diff --git a/core/fpdfapi/page/cpdf_colorspace.cpp b/core/fpdfapi/page/cpdf_colorspace.cpp
index a52a0a8..70bef78 100644
--- a/core/fpdfapi/page/cpdf_colorspace.cpp
+++ b/core/fpdfapi/page/cpdf_colorspace.cpp
@@ -12,7 +12,6 @@
 #include <utility>
 #include <vector>
 
-#include "core/fpdfapi/cpdf_modulemgr.h"
 #include "core/fpdfapi/page/cpdf_devicecs.h"
 #include "core/fpdfapi/page/cpdf_docpagedata.h"
 #include "core/fpdfapi/page/cpdf_function.h"
@@ -432,7 +431,7 @@
 
 // static
 RetainPtr<CPDF_ColorSpace> CPDF_ColorSpace::GetStockCS(int family) {
-  return CPDF_ModuleMgr::Get()->GetPageModule()->GetStockCS(family);
+  return CPDF_PageModule::GetInstance()->GetStockCS(family);
 }
 
 // static
diff --git a/core/fpdfapi/page/cpdf_pagemodule.cpp b/core/fpdfapi/page/cpdf_pagemodule.cpp
index 95d23baf..65aba70 100644
--- a/core/fpdfapi/page/cpdf_pagemodule.cpp
+++ b/core/fpdfapi/page/cpdf_pagemodule.cpp
@@ -11,6 +11,31 @@
 #include "core/fpdfapi/page/cpdf_devicecs.h"
 #include "core/fpdfapi/page/cpdf_patterncs.h"
 
+namespace {
+
+CPDF_PageModule* g_PageModule = nullptr;
+
+}  // namespace
+
+// static
+void CPDF_PageModule::Create() {
+  ASSERT(!g_PageModule);
+  g_PageModule = new CPDF_PageModule();
+}
+
+// static
+void CPDF_PageModule::Destroy() {
+  ASSERT(g_PageModule);
+  delete g_PageModule;
+  g_PageModule = nullptr;
+}
+
+// static
+CPDF_PageModule* CPDF_PageModule::GetInstance() {
+  ASSERT(g_PageModule);
+  return g_PageModule;
+}
+
 CPDF_PageModule::CPDF_PageModule()
     : m_StockGrayCS(pdfium::MakeRetain<CPDF_DeviceCS>(PDFCS_DEVICEGRAY)),
       m_StockRGBCS(pdfium::MakeRetain<CPDF_DeviceCS>(PDFCS_DEVICERGB)),
diff --git a/core/fpdfapi/page/cpdf_pagemodule.h b/core/fpdfapi/page/cpdf_pagemodule.h
index cd078ea..e7234b9 100644
--- a/core/fpdfapi/page/cpdf_pagemodule.h
+++ b/core/fpdfapi/page/cpdf_pagemodule.h
@@ -16,13 +16,18 @@
 
 class CPDF_PageModule {
  public:
-  CPDF_PageModule();
-  ~CPDF_PageModule();
+  // Per-process singleton managed by callers.
+  static void Create();
+  static void Destroy();
+  static CPDF_PageModule* GetInstance();
 
   RetainPtr<CPDF_ColorSpace> GetStockCS(int family);
   void ClearStockFont(CPDF_Document* pDoc);
 
  private:
+  CPDF_PageModule();
+  ~CPDF_PageModule();
+
   RetainPtr<CPDF_DeviceCS> m_StockGrayCS;
   RetainPtr<CPDF_DeviceCS> m_StockRGBCS;
   RetainPtr<CPDF_DeviceCS> m_StockCMYKCS;
diff --git a/core/fpdfapi/parser/cpdf_data_avail.cpp b/core/fpdfapi/parser/cpdf_data_avail.cpp
index 3ead07e..0ddaefe 100644
--- a/core/fpdfapi/parser/cpdf_data_avail.cpp
+++ b/core/fpdfapi/parser/cpdf_data_avail.cpp
@@ -10,7 +10,6 @@
 #include <memory>
 #include <utility>
 
-#include "core/fpdfapi/cpdf_modulemgr.h"
 #include "core/fpdfapi/parser/cpdf_array.h"
 #include "core/fpdfapi/parser/cpdf_cross_ref_avail.h"
 #include "core/fpdfapi/parser/cpdf_dictionary.h"
diff --git a/core/fpdfapi/parser/cpdf_document.cpp b/core/fpdfapi/parser/cpdf_document.cpp
index 12149d0..9b8cc0b 100644
--- a/core/fpdfapi/parser/cpdf_document.cpp
+++ b/core/fpdfapi/parser/cpdf_document.cpp
@@ -12,7 +12,6 @@
 #include <vector>
 
 #include "build/build_config.h"
-#include "core/fpdfapi/cpdf_modulemgr.h"
 #include "core/fpdfapi/page/cpdf_docpagedata.h"
 #include "core/fpdfapi/page/cpdf_iccprofile.h"
 #include "core/fpdfapi/page/cpdf_pagemodule.h"
@@ -895,5 +894,5 @@
     : m_pDoc(pDoc) {}
 
 CPDF_Document::StockFontClearer::~StockFontClearer() {
-  CPDF_ModuleMgr::Get()->GetPageModule()->ClearStockFont(m_pDoc.Get());
+  CPDF_PageModule::GetInstance()->ClearStockFont(m_pDoc.Get());
 }
diff --git a/core/fpdfapi/parser/fpdf_parser_decode.cpp b/core/fpdfapi/parser/fpdf_parser_decode.cpp
index 034f65d..9cf68d5 100644
--- a/core/fpdfapi/parser/fpdf_parser_decode.cpp
+++ b/core/fpdfapi/parser/fpdf_parser_decode.cpp
@@ -14,7 +14,6 @@
 #include <vector>
 
 #include "constants/stream_dict_common.h"
-#include "core/fpdfapi/cpdf_modulemgr.h"
 #include "core/fpdfapi/parser/cpdf_array.h"
 #include "core/fpdfapi/parser/cpdf_dictionary.h"
 #include "core/fpdfapi/parser/fpdf_parser_utility.h"
diff --git a/core/fpdfapi/render/cpdf_dibbase.cpp b/core/fpdfapi/render/cpdf_dibbase.cpp
index 4a39067..72d7ad9 100644
--- a/core/fpdfapi/render/cpdf_dibbase.cpp
+++ b/core/fpdfapi/render/cpdf_dibbase.cpp
@@ -11,7 +11,6 @@
 #include <utility>
 #include <vector>
 
-#include "core/fpdfapi/cpdf_modulemgr.h"
 #include "core/fpdfapi/page/cpdf_docpagedata.h"
 #include "core/fpdfapi/page/cpdf_image.h"
 #include "core/fpdfapi/page/cpdf_imageobject.h"