Return retained references from CPDF_PageObjectHolder methods.

Propagate these into a few called methods.

-- fix some local names while at it.

Change-Id: Ib03a04672baf7a63cfdc8b33370c16f8a5cc7200
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/99010
Commit-Queue: Tom Sepez <tsepez@chromium.org>
Reviewed-by: Lei Zhang <thestig@chromium.org>
diff --git a/core/fpdfapi/edit/cpdf_pagecontentgenerator_unittest.cpp b/core/fpdfapi/edit/cpdf_pagecontentgenerator_unittest.cpp
index 934ade1..eacad41 100644
--- a/core/fpdfapi/edit/cpdf_pagecontentgenerator_unittest.cpp
+++ b/core/fpdfapi/edit/cpdf_pagecontentgenerator_unittest.cpp
@@ -39,7 +39,8 @@
   const CPDF_Dictionary* TestGetResource(CPDF_PageContentGenerator* pGen,
                                          const ByteString& type,
                                          const ByteString& name) {
-    const CPDF_Dictionary* pResources = pGen->m_pObjHolder->GetResources();
+    RetainPtr<const CPDF_Dictionary> pResources =
+        pGen->m_pObjHolder->GetResources();
     return pResources->GetDictFor(type)->GetDictFor(name).Get();
   }
 
diff --git a/core/fpdfapi/page/cpdf_page.cpp b/core/fpdfapi/page/cpdf_page.cpp
index 6edf44c..053413b 100644
--- a/core/fpdfapi/page/cpdf_page.cpp
+++ b/core/fpdfapi/page/cpdf_page.cpp
@@ -80,8 +80,8 @@
 
 RetainPtr<const CPDF_Object> CPDF_Page::GetPageAttr(
     const ByteString& name) const {
-  std::set<const CPDF_Dictionary*> visited;
-  const CPDF_Dictionary* pPageDict = GetDict();
+  std::set<RetainPtr<const CPDF_Dictionary>> visited;
+  RetainPtr<const CPDF_Dictionary> pPageDict = GetDict();
   while (pPageDict && !pdfium::Contains(visited, pPageDict)) {
     RetainPtr<const CPDF_Object> pObj = pPageDict->GetDirectObjectFor(name);
     if (pObj)
diff --git a/core/fpdfapi/page/cpdf_pageobjectholder.h b/core/fpdfapi/page/cpdf_pageobjectholder.h
index 231e150..6334f33 100644
--- a/core/fpdfapi/page/cpdf_pageobjectholder.h
+++ b/core/fpdfapi/page/cpdf_pageobjectholder.h
@@ -69,15 +69,15 @@
   ParseState GetParseState() const { return m_ParseState; }
 
   CPDF_Document* GetDocument() const { return m_pDocument.Get(); }
-  const CPDF_Dictionary* GetDict() const { return m_pDict.Get(); }
+  RetainPtr<const CPDF_Dictionary> GetDict() const { return m_pDict; }
   RetainPtr<CPDF_Dictionary> GetMutableDict() { return m_pDict; }
-  const CPDF_Dictionary* GetResources() const { return m_pResources.Get(); }
+  RetainPtr<const CPDF_Dictionary> GetResources() const { return m_pResources; }
   RetainPtr<CPDF_Dictionary> GetMutableResources() { return m_pResources; }
   void SetResources(RetainPtr<CPDF_Dictionary> pDict) {
     m_pResources = std::move(pDict);
   }
-  const CPDF_Dictionary* GetPageResources() const {
-    return m_pPageResources.Get();
+  RetainPtr<const CPDF_Dictionary> GetPageResources() const {
+    return m_pPageResources;
   }
   RetainPtr<CPDF_Dictionary> GetMutablePageResources() {
     return m_pPageResources;
diff --git a/core/fpdfapi/render/cpdf_imagerenderer.cpp b/core/fpdfapi/render/cpdf_imagerenderer.cpp
index 26c2d6a..c5fda1b 100644
--- a/core/fpdfapi/render/cpdf_imagerenderer.cpp
+++ b/core/fpdfapi/render/cpdf_imagerenderer.cpp
@@ -168,7 +168,7 @@
   } else {
     pDocument = m_pImageObject->GetImage()->GetDocument();
   }
-  const CPDF_Dictionary* pPageResources =
+  RetainPtr<const CPDF_Dictionary> pPageResources =
       pPage ? pPage->GetPageResources() : nullptr;
   RetainPtr<const CPDF_Dictionary> pStreamDict =
       m_pImageObject->GetImage()->GetStream()->GetDict();
diff --git a/core/fpdfapi/render/cpdf_pagerendercache.cpp b/core/fpdfapi/render/cpdf_pagerendercache.cpp
index 687f51a..f6b9a57 100644
--- a/core/fpdfapi/render/cpdf_pagerendercache.cpp
+++ b/core/fpdfapi/render/cpdf_pagerendercache.cpp
@@ -92,7 +92,7 @@
         m_pPage->GetDocument(), std::move(pImage));
   }
   CPDF_DIB::LoadState ret = m_pCurImageCacheEntry->StartGetCachedBitmap(
-      m_pPage->GetPageResources(), pRenderStatus, bStdCS);
+      m_pPage->GetPageResources().Get(), pRenderStatus, bStdCS);
   if (ret == CPDF_DIB::LoadState::kContinue)
     return true;
 
diff --git a/core/fpdfapi/render/cpdf_rendertiling.cpp b/core/fpdfapi/render/cpdf_rendertiling.cpp
index 8d89d61..b864eca 100644
--- a/core/fpdfapi/render/cpdf_rendertiling.cpp
+++ b/core/fpdfapi/render/cpdf_rendertiling.cpp
@@ -123,9 +123,8 @@
     if (!pPattern->colored())
       pStates = CPDF_RenderStatus::CloneObjStates(pPageObj, bStroke);
 
-    const CPDF_Dictionary* pFormDict = pPatternForm->GetDict();
     RetainPtr<const CPDF_Dictionary> pFormResource =
-        pFormDict->GetDictFor("Resources");
+        pPatternForm->GetDict()->GetDictFor("Resources");
     for (int col = min_col; col <= max_col; col++) {
       for (int row = min_row; row <= max_row; row++) {
         CFX_PointF original = mtPattern2Device.Transform(
diff --git a/core/fpdfdoc/cpdf_structtree.cpp b/core/fpdfdoc/cpdf_structtree.cpp
index 10298f9..6d12327 100644
--- a/core/fpdfdoc/cpdf_structtree.cpp
+++ b/core/fpdfdoc/cpdf_structtree.cpp
@@ -30,12 +30,12 @@
 // static
 std::unique_ptr<CPDF_StructTree> CPDF_StructTree::LoadPage(
     const CPDF_Document* pDoc,
-    const CPDF_Dictionary* pPageDict) {
+    RetainPtr<const CPDF_Dictionary> pPageDict) {
   if (!IsTagged(pDoc))
     return nullptr;
 
   auto pTree = std::make_unique<CPDF_StructTree>(pDoc);
-  pTree->LoadPageTree(pPageDict);
+  pTree->LoadPageTree(std::move(pPageDict));
   return pTree;
 }
 
@@ -54,8 +54,8 @@
   return type;
 }
 
-void CPDF_StructTree::LoadPageTree(const CPDF_Dictionary* pPageDict) {
-  m_pPage.Reset(pPageDict);
+void CPDF_StructTree::LoadPageTree(RetainPtr<const CPDF_Dictionary> pPageDict) {
+  m_pPage = std::move(pPageDict);
   if (!m_pTreeRoot)
     return;
 
@@ -80,7 +80,7 @@
     return;
 
   CPDF_NumberTree parent_tree(std::move(pParentTree));
-  int parents_id = pPageDict->GetIntegerFor("StructParents", -1);
+  int parents_id = m_pPage->GetIntegerFor("StructParents", -1);
   if (parents_id < 0)
     return;
 
diff --git a/core/fpdfdoc/cpdf_structtree.h b/core/fpdfdoc/cpdf_structtree.h
index aebbc99..c15ea41 100644
--- a/core/fpdfdoc/cpdf_structtree.h
+++ b/core/fpdfdoc/cpdf_structtree.h
@@ -23,7 +23,7 @@
  public:
   static std::unique_ptr<CPDF_StructTree> LoadPage(
       const CPDF_Document* pDoc,
-      const CPDF_Dictionary* pPageDict);
+      RetainPtr<const CPDF_Dictionary> pPageDict);
 
   explicit CPDF_StructTree(const CPDF_Document* pDoc);
   ~CPDF_StructTree();
@@ -38,7 +38,7 @@
                                     RetainPtr<CPDF_StructElement>,
                                     std::less<>>;
 
-  void LoadPageTree(const CPDF_Dictionary* pPageDict);
+  void LoadPageTree(RetainPtr<const CPDF_Dictionary> pPageDict);
   RetainPtr<CPDF_StructElement> AddPageNode(
       RetainPtr<const CPDF_Dictionary> pDict,
       StructElementMap* map,
diff --git a/fpdfsdk/cpdfsdk_pageview.cpp b/fpdfsdk/cpdfsdk_pageview.cpp
index 79b2fe3..66ed4cf 100644
--- a/fpdfsdk/cpdfsdk_pageview.cpp
+++ b/fpdfsdk/cpdfsdk_pageview.cpp
@@ -609,7 +609,6 @@
 }
 
 int CPDFSDK_PageView::GetPageIndexForStaticPDF() const {
-  const CPDF_Dictionary* pDict = GetPDFPage()->GetDict();
   CPDF_Document* pDoc = m_pFormFillEnv->GetPDFDocument();
-  return pDoc->GetPageIndex(pDict->GetObjNum());
+  return pDoc->GetPageIndex(GetPDFPage()->GetDict()->GetObjNum());
 }
diff --git a/fpdfsdk/fpdf_doc.cpp b/fpdfsdk/fpdf_doc.cpp
index d5c4abf..c66da2b 100644
--- a/fpdfsdk/fpdf_doc.cpp
+++ b/fpdfsdk/fpdf_doc.cpp
@@ -445,9 +445,7 @@
   if (!pdf_page)
     return nullptr;
 
-  const CPDF_Dictionary* page_dict = pdf_page->GetDict();
-  CPDF_AAction aa(page_dict->GetDictFor(pdfium::form_fields::kAA));
-
+  CPDF_AAction aa(pdf_page->GetDict()->GetDictFor(pdfium::form_fields::kAA));
   CPDF_AAction::AActionType type;
   if (aa_type == FPDFPAGE_AACTION_OPEN)
     type = CPDF_AAction::kOpenPage;
diff --git a/fpdfsdk/fpdf_editimg.cpp b/fpdfsdk/fpdf_editimg.cpp
index bde58fc..e64651e 100644
--- a/fpdfsdk/fpdf_editimg.cpp
+++ b/fpdfsdk/fpdf_editimg.cpp
@@ -391,7 +391,7 @@
 
   RetainPtr<CPDF_DIB> pSource = pImg->CreateNewDIB();
   CPDF_DIB::LoadState ret = pSource->StartLoadDIBBase(
-      false, nullptr, pPage->GetPageResources(), false,
+      false, nullptr, pPage->GetPageResources().Get(), false,
       CPDF_ColorSpace::Family::kUnknown, false);
   if (ret == CPDF_DIB::LoadState::kFail)
     return true;
diff --git a/fpdfsdk/fpdf_editpage.cpp b/fpdfsdk/fpdf_editpage.cpp
index 2d6ff76..fbc059b 100644
--- a/fpdfsdk/fpdf_editpage.cpp
+++ b/fpdfsdk/fpdf_editpage.cpp
@@ -67,7 +67,7 @@
   if (!pPage)
     return false;
 
-  const CPDF_Dictionary* pFormDict = pPage->GetDict();
+  RetainPtr<const CPDF_Dictionary> pFormDict = pPage->GetDict();
   if (!pFormDict->KeyExist(pdfium::page_object::kType))
     return false;
 
diff --git a/fpdfsdk/fpdf_formfill.cpp b/fpdfsdk/fpdf_formfill.cpp
index 2694f75..78924cf 100644
--- a/fpdfsdk/fpdf_formfill.cpp
+++ b/fpdfsdk/fpdf_formfill.cpp
@@ -800,8 +800,7 @@
   if (!pFormFillEnv->GetPageView(pPage))
     return;
 
-  const CPDF_Dictionary* pPageDict = pPDFPage->GetDict();
-  CPDF_AAction aa(pPageDict->GetDictFor(pdfium::form_fields::kAA));
+  CPDF_AAction aa(pPDFPage->GetDict()->GetDictFor(pdfium::form_fields::kAA));
   CPDF_AAction::AActionType type = aaType == FPDFPAGE_AACTION_OPEN
                                        ? CPDF_AAction::kOpenPage
                                        : CPDF_AAction::kClosePage;
diff --git a/fpdfsdk/fpdf_ppo.cpp b/fpdfsdk/fpdf_ppo.cpp
index 670bc3a..a8df848 100644
--- a/fpdfsdk/fpdf_ppo.cpp
+++ b/fpdfsdk/fpdf_ppo.cpp
@@ -601,8 +601,7 @@
 
 RetainPtr<CPDF_Stream> CPDF_NPageToOneExporter::MakeXObjectFromPageRaw(
     RetainPtr<CPDF_Page> pSrcPage) {
-  // TODO(tsepez): return retained object from CPDF_Page::GetDict()'
-  RetainPtr<const CPDF_Dictionary> pSrcPageDict(pSrcPage->GetDict());
+  RetainPtr<const CPDF_Dictionary> pSrcPageDict = pSrcPage->GetDict();
   RetainPtr<const CPDF_Object> pSrcContentObj =
       pSrcPageDict->GetDirectObjectFor(pdfium::page_object::kContents);
 
diff --git a/fpdfsdk/fpdf_thumbnail.cpp b/fpdfsdk/fpdf_thumbnail.cpp
index 71c5c26..74c7831 100644
--- a/fpdfsdk/fpdf_thumbnail.cpp
+++ b/fpdfsdk/fpdf_thumbnail.cpp
@@ -18,11 +18,11 @@
 namespace {
 
 RetainPtr<const CPDF_Stream> CPDFStreamForThumbnailFromPage(FPDF_PAGE page) {
-  const CPDF_Page* p_page = CPDFPageFromFPDFPage(page);
-  if (!p_page)
+  const CPDF_Page* pdf_page = CPDFPageFromFPDFPage(page);
+  if (!pdf_page)
     return nullptr;
 
-  const CPDF_Dictionary* page_dict = p_page->GetDict();
+  RetainPtr<const CPDF_Dictionary> page_dict = pdf_page->GetDict();
   if (!page_dict->KeyExist("Type"))
     return nullptr;
 
@@ -62,18 +62,17 @@
   if (!thumb_stream)
     return nullptr;
 
-  const CPDF_Page* p_page = CPDFPageFromFPDFPage(page);
-
-  auto p_source = pdfium::MakeRetain<CPDF_DIB>(p_page->GetDocument(),
-                                               std::move(thumb_stream));
-  const CPDF_DIB::LoadState start_status = p_source->StartLoadDIBBase(
-      false, nullptr, p_page->GetPageResources(), false,
+  const CPDF_Page* pdf_page = CPDFPageFromFPDFPage(page);
+  auto dib_source = pdfium::MakeRetain<CPDF_DIB>(pdf_page->GetDocument(),
+                                                 std::move(thumb_stream));
+  const CPDF_DIB::LoadState start_status = dib_source->StartLoadDIBBase(
+      false, nullptr, pdf_page->GetPageResources().Get(), false,
       CPDF_ColorSpace::Family::kUnknown, false);
   if (start_status == CPDF_DIB::LoadState::kFail)
     return nullptr;
 
   auto thumb_bitmap = pdfium::MakeRetain<CFX_DIBitmap>();
-  if (!thumb_bitmap->Copy(p_source))
+  if (!thumb_bitmap->Copy(dib_source))
     return nullptr;
 
   return FPDFBitmapFromCFXDIBitmap(thumb_bitmap.Leak());