Make fpdfdoc layer live above all of fpdfapi.

To do this, we need but one tiny virtual API - with just the ability
to delete a class. Then cpdf_pagerendercontext.{cpp,h} can sink down
to the fpdfapi/page module with the other page related code, and
fpdfapi can lose its fpdfdoc dependence entirely.

In turn, we can remove one circular include now that
cpdf_pagerendercontext.h has moved down a directory.

Change-Id: Ifff7555fa6c15f2bc0c74836f0d9cc45825c3089
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/55430
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 50409a5..3f947dd 100644
--- a/core/fpdfapi/BUILD.gn
+++ b/core/fpdfapi/BUILD.gn
@@ -9,12 +9,9 @@
   sources = [
     "cpdf_modulemgr.cpp",
     "cpdf_modulemgr.h",
-    "cpdf_pagerendercontext.cpp",
-    "cpdf_pagerendercontext.h",
   ]
   configs += [ "../../:pdfium_core_config" ]
   deps = [
-    "../fpdfdoc",
     "../fxcodec",
     "../fxcrt",
     "../fxge",
@@ -25,6 +22,5 @@
     "parser",
     "render",
   ]
-  allow_circular_includes_from = [ "page" ]
   visibility = [ "../../*" ]
 }
diff --git a/core/fpdfapi/page/BUILD.gn b/core/fpdfapi/page/BUILD.gn
index 4fdc543..5478f83 100644
--- a/core/fpdfapi/page/BUILD.gn
+++ b/core/fpdfapi/page/BUILD.gn
@@ -57,6 +57,8 @@
     "cpdf_pageobject.h",
     "cpdf_pageobjectholder.cpp",
     "cpdf_pageobjectholder.h",
+    "cpdf_pagerendercontext.cpp",
+    "cpdf_pagerendercontext.h",
     "cpdf_path.cpp",
     "cpdf_path.h",
     "cpdf_pathobject.cpp",
diff --git a/core/fpdfapi/page/cpdf_page.cpp b/core/fpdfapi/page/cpdf_page.cpp
index 8d25410..d3adfec 100644
--- a/core/fpdfapi/page/cpdf_page.cpp
+++ b/core/fpdfapi/page/cpdf_page.cpp
@@ -10,9 +10,9 @@
 #include <utility>
 
 #include "constants/page_object.h"
-#include "core/fpdfapi/cpdf_pagerendercontext.h"
 #include "core/fpdfapi/page/cpdf_contentparser.h"
 #include "core/fpdfapi/page/cpdf_pageobject.h"
+#include "core/fpdfapi/page/cpdf_pagerendercontext.h"
 #include "core/fpdfapi/parser/cpdf_array.h"
 #include "core/fpdfapi/parser/cpdf_dictionary.h"
 #include "core/fpdfapi/parser/cpdf_object.h"
diff --git a/core/fpdfapi/cpdf_pagerendercontext.cpp b/core/fpdfapi/page/cpdf_pagerendercontext.cpp
similarity index 86%
rename from core/fpdfapi/cpdf_pagerendercontext.cpp
rename to core/fpdfapi/page/cpdf_pagerendercontext.cpp
index 77d0ea5..a3f75b1 100644
--- a/core/fpdfapi/cpdf_pagerendercontext.cpp
+++ b/core/fpdfapi/page/cpdf_pagerendercontext.cpp
@@ -4,13 +4,12 @@
 
 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
 
-#include "core/fpdfapi/cpdf_pagerendercontext.h"
+#include "core/fpdfapi/page/cpdf_pagerendercontext.h"
 
 #include "core/fpdfapi/render/cpdf_occontext.h"
 #include "core/fpdfapi/render/cpdf_progressiverenderer.h"
 #include "core/fpdfapi/render/cpdf_rendercontext.h"
 #include "core/fpdfapi/render/cpdf_renderoptions.h"
-#include "core/fpdfdoc/cpdf_annotlist.h"
 #include "core/fxge/cfx_renderdevice.h"
 
 CPDF_PageRenderContext::CPDF_PageRenderContext() {}
diff --git a/core/fpdfapi/cpdf_pagerendercontext.h b/core/fpdfapi/page/cpdf_pagerendercontext.h
similarity index 70%
rename from core/fpdfapi/cpdf_pagerendercontext.h
rename to core/fpdfapi/page/cpdf_pagerendercontext.h
index 5cbcdb7..f9c89a2 100644
--- a/core/fpdfapi/cpdf_pagerendercontext.h
+++ b/core/fpdfapi/page/cpdf_pagerendercontext.h
@@ -4,13 +4,12 @@
 
 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
 
-#ifndef CORE_FPDFAPI_CPDF_PAGERENDERCONTEXT_H_
-#define CORE_FPDFAPI_CPDF_PAGERENDERCONTEXT_H_
+#ifndef CORE_FPDFAPI_PAGE_CPDF_PAGERENDERCONTEXT_H_
+#define CORE_FPDFAPI_PAGE_CPDF_PAGERENDERCONTEXT_H_
 
 #include <memory>
 
 class CFX_RenderDevice;
-class CPDF_AnnotList;
 class CPDF_ProgressiveRenderer;
 class CPDF_RenderContext;
 class CPDF_RenderOptions;
@@ -18,15 +17,20 @@
 // Everything about rendering is put here: for OOM recovery
 class CPDF_PageRenderContext {
  public:
+  // Context merely manages the lifetime for callers.
+  class AnnotListIface {
+   public:
+    virtual ~AnnotListIface() {}
+  };
   CPDF_PageRenderContext();
   ~CPDF_PageRenderContext();
 
   // Specific destruction order required.
-  std::unique_ptr<CPDF_AnnotList> m_pAnnots;
+  std::unique_ptr<AnnotListIface> m_pAnnots;
   std::unique_ptr<CPDF_RenderOptions> m_pOptions;
   std::unique_ptr<CFX_RenderDevice> m_pDevice;
   std::unique_ptr<CPDF_RenderContext> m_pContext;
   std::unique_ptr<CPDF_ProgressiveRenderer> m_pRenderer;
 };
 
-#endif  // CORE_FPDFAPI_CPDF_PAGERENDERCONTEXT_H_
+#endif  // CORE_FPDFAPI_PAGE_CPDF_PAGERENDERCONTEXT_H_
diff --git a/core/fpdfdoc/cpdf_annotlist.h b/core/fpdfdoc/cpdf_annotlist.h
index 49a00e5..6de9952 100644
--- a/core/fpdfdoc/cpdf_annotlist.h
+++ b/core/fpdfdoc/cpdf_annotlist.h
@@ -10,6 +10,7 @@
 #include <memory>
 #include <vector>
 
+#include "core/fpdfapi/page/cpdf_pagerendercontext.h"
 #include "core/fxcrt/fx_coordinates.h"
 #include "core/fxcrt/fx_system.h"
 #include "core/fxcrt/unowned_ptr.h"
@@ -21,10 +22,10 @@
 class CPDF_RenderContext;
 class CPDF_RenderOptions;
 
-class CPDF_AnnotList {
+class CPDF_AnnotList : public CPDF_PageRenderContext::AnnotListIface {
  public:
   explicit CPDF_AnnotList(CPDF_Page* pPage);
-  ~CPDF_AnnotList();
+  ~CPDF_AnnotList() override;
 
   void DisplayAnnots(CPDF_Page* pPage,
                      CPDF_RenderContext* pContext,
diff --git a/fpdfsdk/fpdf_progressive.cpp b/fpdfsdk/fpdf_progressive.cpp
index 6c28b65..6bf9f37 100644
--- a/fpdfsdk/fpdf_progressive.cpp
+++ b/fpdfsdk/fpdf_progressive.cpp
@@ -8,8 +8,8 @@
 
 #include <utility>
 
-#include "core/fpdfapi/cpdf_pagerendercontext.h"
 #include "core/fpdfapi/page/cpdf_page.h"
+#include "core/fpdfapi/page/cpdf_pagerendercontext.h"
 #include "core/fpdfapi/render/cpdf_progressiverenderer.h"
 #include "core/fxge/cfx_defaultrenderdevice.h"
 #include "core/fxge/cfx_renderdevice.h"
diff --git a/fpdfsdk/fpdf_view.cpp b/fpdfsdk/fpdf_view.cpp
index ddbe833..4819fe0 100644
--- a/fpdfsdk/fpdf_view.cpp
+++ b/fpdfsdk/fpdf_view.cpp
@@ -12,8 +12,8 @@
 
 #include "build/build_config.h"
 #include "core/fpdfapi/cpdf_modulemgr.h"
-#include "core/fpdfapi/cpdf_pagerendercontext.h"
 #include "core/fpdfapi/page/cpdf_page.h"
+#include "core/fpdfapi/page/cpdf_pagerendercontext.h"
 #include "core/fpdfapi/parser/cpdf_array.h"
 #include "core/fpdfapi/parser/cpdf_dictionary.h"
 #include "core/fpdfapi/parser/cpdf_document.h"
@@ -121,10 +121,12 @@
   pContext->m_pContext->AppendLayer(pPage, &matrix);
 
   if (flags & FPDF_ANNOT) {
-    pContext->m_pAnnots = pdfium::MakeUnique<CPDF_AnnotList>(pPage);
+    auto pOwnedList = pdfium::MakeUnique<CPDF_AnnotList>(pPage);
+    CPDF_AnnotList* pList = pOwnedList.get();
+    pContext->m_pAnnots = std::move(pOwnedList);
     bool bPrinting = pContext->m_pDevice->GetDeviceClass() != FXDC_DISPLAY;
-    pContext->m_pAnnots->DisplayAnnots(pPage, pContext->m_pContext.get(),
-                                       bPrinting, &matrix, false, nullptr);
+    pList->DisplayAnnots(pPage, pContext->m_pContext.get(), bPrinting, &matrix,
+                         false, nullptr);
   }
 
   pContext->m_pRenderer = pdfium::MakeUnique<CPDF_ProgressiveRenderer>(