Remove CFX_PrivateData from CPDF_Page

CFX_PrivateData served two purposes here:

The first was to hold an opaque pointer to the corresponding
page structure in the next higher layer, of which it knows
no details.  Introduce an empty CPDF_Page::View class to
represent this higher class, so as to get type safety while
preserving layering.

The second was to hold an opaque render context, which it
also happened to own.  Make this a CFX_Deletable to help
with management.

Also remove an unused inheritance from CFX_PrivateData
in CPDF_Annot.

Review-Url: https://codereview.chromium.org/2008553008
diff --git a/core/fpdfapi/fpdf_page/cpdf_page.cpp b/core/fpdfapi/fpdf_page/cpdf_page.cpp
index 6b0609f..441bbfe 100644
--- a/core/fpdfapi/fpdf_page/cpdf_page.cpp
+++ b/core/fpdfapi/fpdf_page/cpdf_page.cpp
@@ -21,6 +21,7 @@
                      bool bPageCache)
     : m_PageWidth(100),
       m_PageHeight(100),
+      m_pView(nullptr),
       m_pPageRender(bPageCache ? new CPDF_PageRenderCache(this) : nullptr) {
   m_pFormDict = pPageDict;
   m_pDocument = pDocument;
diff --git a/core/fpdfapi/fpdf_page/include/cpdf_page.h b/core/fpdfapi/fpdf_page/include/cpdf_page.h
index 7f44301..9973488 100644
--- a/core/fpdfapi/fpdf_page/include/cpdf_page.h
+++ b/core/fpdfapi/fpdf_page/include/cpdf_page.h
@@ -19,8 +19,10 @@
 class CPDF_Object;
 class CPDF_PageRenderCache;
 
-class CPDF_Page : public CPDF_PageObjectHolder, public CFX_PrivateData {
+class CPDF_Page : public CPDF_PageObjectHolder {
  public:
+  class View {};  // Caller implements as desired, empty here due to layering.
+
   CPDF_Page(CPDF_Document* pDocument,
             CPDF_Dictionary* pPageDict,
             bool bPageCache);
@@ -42,6 +44,14 @@
   CPDF_Object* GetPageAttr(const CFX_ByteString& name) const;
   CPDF_PageRenderCache* GetRenderCache() const { return m_pPageRender.get(); }
 
+  CFX_Deletable* GetRenderContext() const { return m_pRenderContext.get(); }
+  void SetRenderContext(std::unique_ptr<CFX_Deletable> pContext) {
+    m_pRenderContext = std::move(pContext);
+  }
+
+  View* GetView() const { return m_pView; }
+  void SetView(View* pView) { m_pView = pView; }
+
  protected:
   friend class CPDF_ContentParser;
 
@@ -50,7 +60,9 @@
   FX_FLOAT m_PageWidth;
   FX_FLOAT m_PageHeight;
   CFX_Matrix m_PageMatrix;
+  View* m_pView;
   std::unique_ptr<CPDF_PageRenderCache> m_pPageRender;
+  std::unique_ptr<CFX_Deletable> m_pRenderContext;
 };
 
 #endif  // CORE_FPDFAPI_FPDF_PAGE_INCLUDE_CPDF_PAGE_H_
diff --git a/core/fpdfdoc/include/fpdf_doc.h b/core/fpdfdoc/include/fpdf_doc.h
index 3ee583d..8c7ce4e 100644
--- a/core/fpdfdoc/include/fpdf_doc.h
+++ b/core/fpdfdoc/include/fpdf_doc.h
@@ -317,7 +317,7 @@
 #define ANNOTFLAG_LOCKED 0x0080
 #define ANNOTFLAG_TOGGLENOVIEW 0x0100
 
-class CPDF_Annot : public CFX_PrivateData {
+class CPDF_Annot {
  public:
   enum AppearanceMode { Normal, Rollover, Down };
 
diff --git a/fpdfsdk/fpdf_progressive.cpp b/fpdfsdk/fpdf_progressive.cpp
index d42d954..90e8402 100644
--- a/fpdfsdk/fpdf_progressive.cpp
+++ b/fpdfsdk/fpdf_progressive.cpp
@@ -40,15 +40,16 @@
     return FPDF_RENDER_FAILED;
 
   CRenderContext* pContext = new CRenderContext;
-  pPage->SetPrivateData((void*)1, pContext, DropContext);
+  pPage->SetRenderContext(std::unique_ptr<CFX_Deletable>(pContext));
   pContext->m_pDevice = new CFX_FxgeDevice;
-  if (flags & FPDF_REVERSE_BYTE_ORDER)
+  if (flags & FPDF_REVERSE_BYTE_ORDER) {
     ((CFX_FxgeDevice*)pContext->m_pDevice)
         ->Attach((CFX_DIBitmap*)bitmap, 0, TRUE);
-  else
+  } else {
     ((CFX_FxgeDevice*)pContext->m_pDevice)->Attach((CFX_DIBitmap*)bitmap);
-  IFSDK_PAUSE_Adapter IPauseAdapter(pause);
+  }
 
+  IFSDK_PAUSE_Adapter IPauseAdapter(pause);
   FPDF_RenderPage_Retail(pContext, page, start_x, start_y, size_x, size_y,
                          rotate, flags, FALSE, &IPauseAdapter);
 
@@ -68,7 +69,8 @@
   if (!pPage)
     return FPDF_RENDER_FAILED;
 
-  CRenderContext* pContext = (CRenderContext*)pPage->GetPrivateData((void*)1);
+  CRenderContext* pContext =
+      static_cast<CRenderContext*>(pPage->GetRenderContext());
   if (pContext && pContext->m_pRenderer) {
     IFSDK_PAUSE_Adapter IPauseAdapter(pause);
     pContext->m_pRenderer->Continue(&IPauseAdapter);
@@ -83,11 +85,11 @@
   if (!pPage)
     return;
 
-  CRenderContext* pContext = (CRenderContext*)pPage->GetPrivateData((void*)1);
+  CRenderContext* pContext =
+      static_cast<CRenderContext*>(pPage->GetRenderContext());
   if (!pContext)
     return;
 
   pContext->m_pDevice->RestoreState();
-  delete pContext;
-  pPage->RemovePrivateData((void*)1);
+  pPage->SetRenderContext(std::unique_ptr<CFX_Deletable>());
 }
diff --git a/fpdfsdk/fpdfview.cpp b/fpdfsdk/fpdfview.cpp
index cdcaba4..bf7ae0f 100644
--- a/fpdfsdk/fpdfview.cpp
+++ b/fpdfsdk/fpdfview.cpp
@@ -517,10 +517,6 @@
   return pPage ? pPage->GetPageHeight() : 0.0;
 }
 
-void DropContext(void* data) {
-  delete (CRenderContext*)data;
-}
-
 #if defined(_WIN32)
 DLLEXPORT void STDCALL FPDF_RenderPage(HDC dc,
                                        FPDF_PAGE page,
@@ -535,7 +531,7 @@
     return;
 
   CRenderContext* pContext = new CRenderContext;
-  pPage->SetPrivateData((void*)1, pContext, DropContext);
+  pPage->SetRenderContext(std::unique_ptr<CFX_Deletable>(pContext));
 
 #if !defined(_WIN32_WCE)
   CFX_DIBitmap* pBitmap = nullptr;
@@ -619,8 +615,7 @@
   if (bBackgroundAlphaNeeded || bHasImageMask)
     delete pBitmap;
 
-  delete pContext;
-  pPage->RemovePrivateData((void*)1);
+  pPage->SetRenderContext(std::unique_ptr<CFX_Deletable>());
 }
 #endif  // defined(_WIN32)
 
@@ -634,24 +629,25 @@
                                              int flags) {
   if (!bitmap)
     return;
+
   CPDF_Page* pPage = CPDFPageFromFPDFPage(page);
   if (!pPage)
     return;
-  CRenderContext* pContext = new CRenderContext;
-  pPage->SetPrivateData((void*)1, pContext, DropContext);
-  pContext->m_pDevice = new CFX_FxgeDevice;
 
-  if (flags & FPDF_REVERSE_BYTE_ORDER)
+  CRenderContext* pContext = new CRenderContext;
+  pPage->SetRenderContext(std::unique_ptr<CFX_Deletable>(pContext));
+  pContext->m_pDevice = new CFX_FxgeDevice;
+  if (flags & FPDF_REVERSE_BYTE_ORDER) {
     ((CFX_FxgeDevice*)pContext->m_pDevice)
         ->Attach((CFX_DIBitmap*)bitmap, 0, TRUE);
-  else
+  } else {
     ((CFX_FxgeDevice*)pContext->m_pDevice)->Attach((CFX_DIBitmap*)bitmap);
+  }
 
   FPDF_RenderPage_Retail(pContext, page, start_x, start_y, size_x, size_y,
-                         rotate, flags, TRUE, NULL);
+                         rotate, flags, TRUE, nullptr);
 
-  delete pContext;
-  pPage->RemovePrivateData((void*)1);
+  pPage->SetRenderContext(std::unique_ptr<CFX_Deletable>());
 }
 
 #ifdef _SKIA_SUPPORT_
@@ -661,33 +657,33 @@
   CPDF_Page* pPage = CPDFPageFromFPDFPage(page);
   if (!pPage)
     return nullptr;
-  std::unique_ptr<CRenderContext> pContext(new CRenderContext);
-  pPage->SetPrivateData((void*)1, pContext.get(), DropContext);
+
+  CRenderContext* pContext = new CRenderContext;
+  pPage->SetRenderContext(std::unique_ptr<CFX_Deletable>(pContext));
   CFX_FxgeDevice* skDevice = new CFX_FxgeDevice;
   FPDF_RECORDER recorder = skDevice->CreateRecorder(size_x, size_y);
   pContext->m_pDevice = skDevice;
-
   FPDF_RenderPage_Retail(pContext.get(), page, 0, 0, size_x, size_y, 0, 0, TRUE,
-                         NULL);
-  pPage->RemovePrivateData((void*)1);
+                         nullptr);
+  pPage->SetRenderContext(std::unique_ptr<CFX_Deletable>());
   return recorder;
 }
 #endif
 
 DLLEXPORT void STDCALL FPDF_ClosePage(FPDF_PAGE page) {
+  UnderlyingPageType* pPage = UnderlyingFromFPDFPage(page);
   if (!page)
     return;
 #ifdef PDF_ENABLE_XFA
-  CPDFXFA_Page* pPage = (CPDFXFA_Page*)page;
   pPage->Release();
 #else   // PDF_ENABLE_XFA
   CPDFSDK_PageView* pPageView =
-      (CPDFSDK_PageView*)(((CPDF_Page*)page))->GetPrivateData((void*)page);
+      static_cast<CPDFSDK_PageView*>(pPage->GetView());
   if (pPageView && pPageView->IsLocked()) {
     pPageView->TakeOverPage();
     return;
   }
-  delete (CPDF_Page*)page;
+  delete pPage;
 #endif  // PDF_ENABLE_XFA
 }
 
diff --git a/fpdfsdk/fsdk_mgr.cpp b/fpdfsdk/fsdk_mgr.cpp
index fac98d8..83fee90 100644
--- a/fpdfsdk/fsdk_mgr.cpp
+++ b/fpdfsdk/fsdk_mgr.cpp
@@ -480,7 +480,7 @@
 #endif  // PDF_ENABLE_XFA
   }
 #ifndef PDF_ENABLE_XFA
-  m_page->SetPrivateData((void*)m_page, (void*)this, nullptr);
+  m_page->SetView(this);
 #endif  // PDF_ENABLE_XFA
 }
 
@@ -493,7 +493,7 @@
   m_fxAnnotArray.clear();
   m_pAnnotList.reset();
 #ifndef PDF_ENABLE_XFA
-  m_page->RemovePrivateData((void*)m_page);
+  m_page->SetView(nullptr);
   if (m_bTakeOverPage) {
     delete m_page;
   }
diff --git a/fpdfsdk/include/fsdk_define.h b/fpdfsdk/include/fsdk_define.h
index f3ed2da..536e358 100644
--- a/fpdfsdk/include/fsdk_define.h
+++ b/fpdfsdk/include/fsdk_define.h
@@ -109,7 +109,6 @@
 
 CPDF_Page* CPDFPageFromFPDFPage(FPDF_PAGE page);
 
-void DropContext(void* data);
 void FSDK_SetSandBoxPolicy(FPDF_DWORD policy, FPDF_BOOL enable);
 FPDF_BOOL FSDK_IsSandBoxPolicyEnabled(FPDF_DWORD policy);
 void FPDF_RenderPage_Retail(CRenderContext* pContext,
diff --git a/fpdfsdk/include/fsdk_mgr.h b/fpdfsdk/include/fsdk_mgr.h
index ca46a06..a47f230 100644
--- a/fpdfsdk/include/fsdk_mgr.h
+++ b/fpdfsdk/include/fsdk_mgr.h
@@ -11,6 +11,7 @@
 #include <memory>
 #include <vector>
 
+#include "core/fpdfapi/fpdf_page/include/cpdf_page.h"
 #include "core/fpdfapi/fpdf_parser/include/cpdf_document.h"
 #include "fpdfsdk/cfx_systemhandler.h"
 #include "fpdfsdk/include/fsdk_actionhandler.h"
@@ -530,7 +531,7 @@
   FX_BOOL m_bBeingDestroyed;
 };
 
-class CPDFSDK_PageView final {
+class CPDFSDK_PageView final : public CPDF_Page::View {
  public:
   CPDFSDK_PageView(CPDFSDK_Document* pSDKDoc, UnderlyingPageType* page);
   ~CPDFSDK_PageView();
diff --git a/fpdfsdk/include/fsdk_rendercontext.h b/fpdfsdk/include/fsdk_rendercontext.h
index f984a64..1bcd076 100644
--- a/fpdfsdk/include/fsdk_rendercontext.h
+++ b/fpdfsdk/include/fsdk_rendercontext.h
@@ -8,14 +8,15 @@
 #define FPDFSDK_INCLUDE_FSDK_RENDERCONTEXT_H_
 
 #include "core/fpdfapi/fpdf_render/include/cpdf_progressiverenderer.h"
+#include "core/fxcrt/include/fx_basic.h"
 #include "fpdfsdk/include/fsdk_define.h"
 #include "public/fpdf_progressive.h"
 
 // Everything about rendering is put here: for OOM recovery
-class CRenderContext {
+class CRenderContext : public CFX_Deletable {
  public:
   CRenderContext() { Clear(); }
-  ~CRenderContext();
+  ~CRenderContext() override;
 
   void Clear();