Remove class CPDF_PageObjectList.

It is a small wrapper around a std::deque<>. Make CPDF_PageObjectHolder
do all the work instead, since iterating across an object holder
seems like a reasonable thing to be able to do.

Change-Id: I9d1f0b01191f971b8b808957896d147f568558af
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/53950
Reviewed-by: Lei Zhang <thestig@chromium.org>
Commit-Queue: Tom Sepez <tsepez@chromium.org>
diff --git a/core/fpdfapi/edit/cpdf_pagecontentgenerator.cpp b/core/fpdfapi/edit/cpdf_pagecontentgenerator.cpp
index 11b24e6..7fb7dd3 100644
--- a/core/fpdfapi/edit/cpdf_pagecontentgenerator.cpp
+++ b/core/fpdfapi/edit/cpdf_pagecontentgenerator.cpp
@@ -73,7 +73,7 @@
 CPDF_PageContentGenerator::CPDF_PageContentGenerator(
     CPDF_PageObjectHolder* pObjHolder)
     : m_pObjHolder(pObjHolder), m_pDocument(pObjHolder->GetDocument()) {
-  for (const auto& pObj : *pObjHolder->GetPageObjectList()) {
+  for (const auto& pObj : *pObjHolder) {
     if (pObj)
       m_pageObjects.emplace_back(pObj.get());
   }
diff --git a/core/fpdfapi/edit/cpdf_pagecontentmanager.cpp b/core/fpdfapi/edit/cpdf_pagecontentmanager.cpp
index f4d51c6..7659413 100644
--- a/core/fpdfapi/edit/cpdf_pagecontentmanager.cpp
+++ b/core/fpdfapi/edit/cpdf_pagecontentmanager.cpp
@@ -136,7 +136,7 @@
       stream_index_mapping[streams_left[i]] = i;
 
     // Update the page objects' content stream indexes.
-    for (const auto& obj : *obj_holder_->GetPageObjectList()) {
+    for (const auto& obj : *obj_holder_) {
       int32_t old_stream_index = obj->GetContentStream();
       size_t new_stream_index = stream_index_mapping[old_stream_index];
       obj->SetContentStream(new_stream_index);
diff --git a/core/fpdfapi/font/cpdf_type3char.cpp b/core/fpdfapi/font/cpdf_type3char.cpp
index a04e83c..77e5bc6 100644
--- a/core/fpdfapi/font/cpdf_type3char.cpp
+++ b/core/fpdfapi/font/cpdf_type3char.cpp
@@ -40,10 +40,10 @@
   if (m_pBitmap || !m_pForm)
     return true;
 
-  if (m_pForm->GetPageObjectList()->size() != 1 || m_bColored)
+  if (m_pForm->GetPageObjectCount() != 1 || m_bColored)
     return false;
 
-  auto& pPageObj = m_pForm->GetPageObjectList()->front();
+  auto& pPageObj = *m_pForm->begin();
   if (!pPageObj->IsImage())
     return false;
 
diff --git a/core/fpdfapi/font/cpdf_type3font.cpp b/core/fpdfapi/font/cpdf_type3font.cpp
index a80048a..d7bd7d0 100644
--- a/core/fpdfapi/font/cpdf_type3font.cpp
+++ b/core/fpdfapi/font/cpdf_type3font.cpp
@@ -125,7 +125,7 @@
   pNewChar->Transform(m_FontMatrix);
   m_CacheMap[charcode] = std::move(pNewChar);
   CPDF_Type3Char* pCachedChar = m_CacheMap[charcode].get();
-  if (pCachedChar->form()->GetPageObjectList()->empty())
+  if (pCachedChar->form()->GetPageObjectCount() == 0)
     pCachedChar->ResetForm();
   return pCachedChar;
 }
diff --git a/core/fpdfapi/page/BUILD.gn b/core/fpdfapi/page/BUILD.gn
index ab91ced..9529dad 100644
--- a/core/fpdfapi/page/BUILD.gn
+++ b/core/fpdfapi/page/BUILD.gn
@@ -57,8 +57,6 @@
     "cpdf_pageobject.h",
     "cpdf_pageobjectholder.cpp",
     "cpdf_pageobjectholder.h",
-    "cpdf_pageobjectlist.cpp",
-    "cpdf_pageobjectlist.h",
     "cpdf_path.cpp",
     "cpdf_path.h",
     "cpdf_pathobject.cpp",
diff --git a/core/fpdfapi/page/cpdf_contentparser.cpp b/core/fpdfapi/page/cpdf_contentparser.cpp
index 8308d0b..efc82e0 100644
--- a/core/fpdfapi/page/cpdf_contentparser.cpp
+++ b/core/fpdfapi/page/cpdf_contentparser.cpp
@@ -209,7 +209,7 @@
                                            m_pParser->GetType3Data());
   }
 
-  for (auto& pObj : *m_pObjectHolder->GetPageObjectList()) {
+  for (auto& pObj : *m_pObjectHolder) {
     if (!pObj->m_ClipPath.HasRef())
       continue;
     if (pObj->m_ClipPath.GetPathCount() != 1)
diff --git a/core/fpdfapi/page/cpdf_pageobjectholder.cpp b/core/fpdfapi/page/cpdf_pageobjectholder.cpp
index 789e596..51499b0 100644
--- a/core/fpdfapi/page/cpdf_pageobjectholder.cpp
+++ b/core/fpdfapi/page/cpdf_pageobjectholder.cpp
@@ -123,7 +123,9 @@
 
 CPDF_PageObject* CPDF_PageObjectHolder::GetPageObjectByIndex(
     size_t index) const {
-  return m_PageObjectList.GetPageObjectByIndex(index);
+  return pdfium::IndexInBounds(m_PageObjectList, index)
+             ? m_PageObjectList[index].get()
+             : nullptr;
 }
 
 void CPDF_PageObjectHolder::AppendPageObject(
diff --git a/core/fpdfapi/page/cpdf_pageobjectholder.h b/core/fpdfapi/page/cpdf_pageobjectholder.h
index 524ab98..e75fd4e 100644
--- a/core/fpdfapi/page/cpdf_pageobjectholder.h
+++ b/core/fpdfapi/page/cpdf_pageobjectholder.h
@@ -7,12 +7,12 @@
 #ifndef CORE_FPDFAPI_PAGE_CPDF_PAGEOBJECTHOLDER_H_
 #define CORE_FPDFAPI_PAGE_CPDF_PAGEOBJECTHOLDER_H_
 
+#include <deque>
 #include <map>
 #include <memory>
 #include <set>
 #include <vector>
 
-#include "core/fpdfapi/page/cpdf_pageobjectlist.h"
 #include "core/fpdfapi/render/cpdf_transparency.h"
 #include "core/fxcrt/fx_coordinates.h"
 #include "core/fxcrt/fx_string.h"
@@ -23,6 +23,7 @@
 class CPDF_ContentParser;
 class CPDF_Dictionary;
 class CPDF_Document;
+class CPDF_PageObject;
 class CPDF_Stream;
 class PauseIndicatorIface;
 
@@ -47,6 +48,10 @@
  public:
   enum class ParseState : uint8_t { kNotParsed, kParsing, kParsed };
 
+  using iterator = std::deque<std::unique_ptr<CPDF_PageObject>>::iterator;
+  using const_iterator =
+      std::deque<std::unique_ptr<CPDF_PageObject>>::const_iterator;
+
   CPDF_PageObjectHolder(CPDF_Document* pDoc,
                         CPDF_Dictionary* pDict,
                         CPDF_Dictionary* pPageResources,
@@ -65,16 +70,18 @@
   // the ones that assume it can.
   CPDF_Dictionary* GetDict() const { return m_pDict.Get(); }
 
-  const CPDF_PageObjectList* GetPageObjectList() const {
-    return &m_PageObjectList;
-  }
-
   size_t GetPageObjectCount() const;
   CPDF_PageObject* GetPageObjectByIndex(size_t index) const;
   void AppendPageObject(std::unique_ptr<CPDF_PageObject> pPageObj);
   bool RemovePageObject(CPDF_PageObject* pPageObj);
   bool ErasePageObjectAtIndex(size_t index);
 
+  iterator begin() { return m_PageObjectList.begin(); }
+  const_iterator begin() const { return m_PageObjectList.begin(); }
+
+  iterator end() { return m_PageObjectList.end(); }
+  const_iterator end() const { return m_PageObjectList.end(); }
+
   const CFX_Matrix& GetLastCTM() const { return m_LastCTM; }
   const CFX_FloatRect& GetBBox() const { return m_BBox; }
 
@@ -112,7 +119,7 @@
   UnownedPtr<CPDF_Document> m_pDocument;
   std::vector<CFX_FloatRect> m_MaskBoundingBoxes;
   std::unique_ptr<CPDF_ContentParser> m_pParser;
-  CPDF_PageObjectList m_PageObjectList;
+  std::deque<std::unique_ptr<CPDF_PageObject>> m_PageObjectList;
   CFX_Matrix m_LastCTM;
 
   // The indexes of Content streams that are dirty and need to be regenerated.
diff --git a/core/fpdfapi/page/cpdf_pageobjectlist.cpp b/core/fpdfapi/page/cpdf_pageobjectlist.cpp
deleted file mode 100644
index 2c8e061..0000000
--- a/core/fpdfapi/page/cpdf_pageobjectlist.cpp
+++ /dev/null
@@ -1,13 +0,0 @@
-// Copyright 2016 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "core/fpdfapi/page/cpdf_pageobjectlist.h"
-
-#include "third_party/base/stl_util.h"
-
-CPDF_PageObject* CPDF_PageObjectList::GetPageObjectByIndex(int index) const {
-  return pdfium::IndexInBounds(*this, index) ? (*this)[index].get() : nullptr;
-}
diff --git a/core/fpdfapi/page/cpdf_pageobjectlist.h b/core/fpdfapi/page/cpdf_pageobjectlist.h
deleted file mode 100644
index 1b4bf8f..0000000
--- a/core/fpdfapi/page/cpdf_pageobjectlist.h
+++ /dev/null
@@ -1,21 +0,0 @@
-// Copyright 2016 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef CORE_FPDFAPI_PAGE_CPDF_PAGEOBJECTLIST_H_
-#define CORE_FPDFAPI_PAGE_CPDF_PAGEOBJECTLIST_H_
-
-#include <deque>
-#include <memory>
-
-class CPDF_PageObject;
-
-class CPDF_PageObjectList final
-    : public std::deque<std::unique_ptr<CPDF_PageObject>> {
- public:
-  CPDF_PageObject* GetPageObjectByIndex(int index) const;
-};
-
-#endif  // CORE_FPDFAPI_PAGE_CPDF_PAGEOBJECTLIST_H_
diff --git a/core/fpdfapi/page/cpdf_streamcontentparser.cpp b/core/fpdfapi/page/cpdf_streamcontentparser.cpp
index 9527ac3..2538984 100644
--- a/core/fpdfapi/page/cpdf_streamcontentparser.cpp
+++ b/core/fpdfapi/page/cpdf_streamcontentparser.cpp
@@ -1512,13 +1512,12 @@
   pdfium::ScopedSetInsertion<const uint8_t*> scopedInsert(m_ParsedSet.Get(),
                                                           pDataStart);
 
-  uint32_t init_obj_count = m_pObjectHolder->GetPageObjectList()->size();
+  uint32_t init_obj_count = m_pObjectHolder->GetPageObjectCount();
   CPDF_StreamParser syntax(pdfium::make_span(pDataStart, size_left),
                            m_pDocument->GetByteStringPool());
   CPDF_StreamParserAutoClearer auto_clearer(&m_pSyntax, &syntax);
   while (1) {
-    uint32_t cost =
-        m_pObjectHolder->GetPageObjectList()->size() - init_obj_count;
+    uint32_t cost = m_pObjectHolder->GetPageObjectCount() - init_obj_count;
     if (max_cost && cost >= max_cost) {
       break;
     }
diff --git a/core/fpdfapi/render/cpdf_progressiverenderer.cpp b/core/fpdfapi/render/cpdf_progressiverenderer.cpp
index 4d1fed7..2bbe9ef 100644
--- a/core/fpdfapi/render/cpdf_progressiverenderer.cpp
+++ b/core/fpdfapi/render/cpdf_progressiverenderer.cpp
@@ -52,8 +52,7 @@
         return;
       }
       m_pCurrentLayer = m_pContext->GetLayer(m_LayerIndex);
-      m_LastObjectRendered =
-          m_pCurrentLayer->m_pObjectHolder->GetPageObjectList()->end();
+      m_LastObjectRendered = m_pCurrentLayer->m_pObjectHolder->end();
       m_pRenderStatus = pdfium::MakeUnique<CPDF_RenderStatus>(m_pContext.Get(),
                                                               m_pDevice.Get());
       if (m_pOptions)
@@ -65,14 +64,14 @@
       m_ClipRect = m_pCurrentLayer->m_Matrix.GetInverse().TransformRect(
           CFX_FloatRect(m_pDevice->GetClipBox()));
     }
-    CPDF_PageObjectList::const_iterator iter;
-    CPDF_PageObjectList::const_iterator iterEnd =
-        m_pCurrentLayer->m_pObjectHolder->GetPageObjectList()->end();
+    CPDF_PageObjectHolder::const_iterator iter;
+    CPDF_PageObjectHolder::const_iterator iterEnd =
+        m_pCurrentLayer->m_pObjectHolder->end();
     if (m_LastObjectRendered != iterEnd) {
       iter = m_LastObjectRendered;
       ++iter;
     } else {
-      iter = m_pCurrentLayer->m_pObjectHolder->GetPageObjectList()->begin();
+      iter = m_pCurrentLayer->m_pObjectHolder->begin();
     }
     int nObjsToGo = kStepLimit;
     bool is_mask = false;
diff --git a/core/fpdfapi/render/cpdf_progressiverenderer.h b/core/fpdfapi/render/cpdf_progressiverenderer.h
index 400909b..d9d2e27 100644
--- a/core/fpdfapi/render/cpdf_progressiverenderer.h
+++ b/core/fpdfapi/render/cpdf_progressiverenderer.h
@@ -9,7 +9,7 @@
 
 #include <memory>
 
-#include "core/fpdfapi/page/cpdf_pageobjectlist.h"
+#include "core/fpdfapi/page/cpdf_pageobjectholder.h"
 #include "core/fpdfapi/render/cpdf_rendercontext.h"
 #include "core/fxcrt/fx_coordinates.h"
 #include "core/fxcrt/fx_system.h"
@@ -54,7 +54,7 @@
   CFX_FloatRect m_ClipRect;
   uint32_t m_LayerIndex;
   CPDF_RenderContext::Layer* m_pCurrentLayer;
-  CPDF_PageObjectList::const_iterator m_LastObjectRendered;
+  CPDF_PageObjectHolder::const_iterator m_LastObjectRendered;
 };
 
 #endif  // CORE_FPDFAPI_RENDER_CPDF_PROGRESSIVERENDERER_H_
diff --git a/core/fpdfapi/render/cpdf_renderstatus.cpp b/core/fpdfapi/render/cpdf_renderstatus.cpp
index 4ed7b35..092059b 100644
--- a/core/fpdfapi/render/cpdf_renderstatus.cpp
+++ b/core/fpdfapi/render/cpdf_renderstatus.cpp
@@ -1038,7 +1038,7 @@
 #endif
   CFX_FloatRect clip_rect = mtObj2Device.GetInverse().TransformRect(
       CFX_FloatRect(m_pDevice->GetClipBox()));
-  for (const auto& pCurObj : *pObjectHolder->GetPageObjectList()) {
+  for (const auto& pCurObj : *pObjectHolder) {
     if (pCurObj.get() == m_pStopObj) {
       m_bStopped = true;
       return;
diff --git a/core/fpdftext/cpdf_textpage.cpp b/core/fpdftext/cpdf_textpage.cpp
index 8ac04c9..1ba470f 100644
--- a/core/fpdftext/cpdf_textpage.cpp
+++ b/core/fpdftext/cpdf_textpage.cpp
@@ -535,7 +535,7 @@
 
 CPDF_TextPage::TextOrientation CPDF_TextPage::FindTextlineFlowOrientation()
     const {
-  if (m_pPage->GetPageObjectList()->empty())
+  if (m_pPage->GetPageObjectCount() == 0)
     return TextOrientation::Unknown;
 
   const int32_t nPageWidth = static_cast<int32_t>(m_pPage->GetPageWidth());
@@ -550,7 +550,7 @@
   int32_t nEndH = 0;
   int32_t nStartV = nPageHeight;
   int32_t nEndV = 0;
-  for (const auto& pPageObj : *m_pPage->GetPageObjectList()) {
+  for (const auto& pPageObj : *m_pPage) {
     if (!pPageObj->IsText())
       continue;
 
@@ -608,19 +608,18 @@
 }
 
 void CPDF_TextPage::ProcessObject() {
-  if (m_pPage->GetPageObjectList()->empty())
+  if (m_pPage->GetPageObjectCount() == 0)
     return;
 
   m_TextlineDir = FindTextlineFlowOrientation();
-  const CPDF_PageObjectList* pObjList = m_pPage->GetPageObjectList();
-  for (auto it = pObjList->begin(); it != pObjList->end(); ++it) {
+  for (auto it = m_pPage->begin(); it != m_pPage->end(); ++it) {
     CPDF_PageObject* pObj = it->get();
     if (!pObj)
       continue;
 
     CFX_Matrix matrix;
     if (pObj->IsText())
-      ProcessTextObject(pObj->AsText(), matrix, pObjList, it);
+      ProcessTextObject(pObj->AsText(), matrix, m_pPage.Get(), it);
     else if (pObj->IsForm())
       ProcessFormObject(pObj->AsForm(), matrix);
   }
@@ -633,20 +632,15 @@
 
 void CPDF_TextPage::ProcessFormObject(CPDF_FormObject* pFormObj,
                                       const CFX_Matrix& formMatrix) {
-  const CPDF_PageObjectList* pObjectList =
-      pFormObj->form()->GetPageObjectList();
-  if (pObjectList->empty())
-    return;
-
   CFX_Matrix curFormMatrix = pFormObj->form_matrix() * formMatrix;
-
-  for (auto it = pObjectList->begin(); it != pObjectList->end(); ++it) {
+  const CPDF_PageObjectHolder* pHolder = pFormObj->form();
+  for (auto it = pHolder->begin(); it != pHolder->end(); ++it) {
     CPDF_PageObject* pPageObj = it->get();
     if (!pPageObj)
       continue;
 
     if (pPageObj->IsText())
-      ProcessTextObject(pPageObj->AsText(), curFormMatrix, pObjectList, it);
+      ProcessTextObject(pPageObj->AsText(), curFormMatrix, pHolder, it);
     else if (pPageObj->IsForm())
       ProcessFormObject(pPageObj->AsForm(), curFormMatrix);
   }
@@ -753,8 +747,8 @@
 void CPDF_TextPage::ProcessTextObject(
     CPDF_TextObject* pTextObj,
     const CFX_Matrix& formMatrix,
-    const CPDF_PageObjectList* pObjList,
-    CPDF_PageObjectList::const_iterator ObjPos) {
+    const CPDF_PageObjectHolder* pObjList,
+    CPDF_PageObjectHolder::const_iterator ObjPos) {
   if (fabs(pTextObj->GetRect().Width()) < kSizeEpsilon)
     return;
 
@@ -1404,8 +1398,8 @@
 
 bool CPDF_TextPage::IsSameAsPreTextObject(
     CPDF_TextObject* pTextObj,
-    const CPDF_PageObjectList* pObjList,
-    CPDF_PageObjectList::const_iterator iter) {
+    const CPDF_PageObjectHolder* pObjList,
+    CPDF_PageObjectHolder::const_iterator iter) {
   int i = 0;
   while (i < 5 && iter != pObjList->begin()) {
     --iter;
diff --git a/core/fpdftext/cpdf_textpage.h b/core/fpdftext/cpdf_textpage.h
index 00f0426..4e92432 100644
--- a/core/fpdftext/cpdf_textpage.h
+++ b/core/fpdftext/cpdf_textpage.h
@@ -11,7 +11,7 @@
 #include <functional>
 #include <vector>
 
-#include "core/fpdfapi/page/cpdf_pageobjectlist.h"
+#include "core/fpdfapi/page/cpdf_pageobjectholder.h"
 #include "core/fxcrt/cfx_widetextbuf.h"
 #include "core/fxcrt/fx_coordinates.h"
 #include "core/fxcrt/fx_string.h"
@@ -128,15 +128,15 @@
   void ProcessTextObject(PDFTEXT_Obj pObj);
   void ProcessTextObject(CPDF_TextObject* pTextObj,
                          const CFX_Matrix& formMatrix,
-                         const CPDF_PageObjectList* pObjList,
-                         CPDF_PageObjectList::const_iterator ObjPos);
+                         const CPDF_PageObjectHolder* pObjList,
+                         CPDF_PageObjectHolder::const_iterator ObjPos);
   GenerateCharacter ProcessInsertObject(const CPDF_TextObject* pObj,
                                         const CFX_Matrix& formMatrix);
   const PAGECHAR_INFO* GetPrevCharInfo() const;
   Optional<PAGECHAR_INFO> GenerateCharInfo(wchar_t unicode);
   bool IsSameAsPreTextObject(CPDF_TextObject* pTextObj,
-                             const CPDF_PageObjectList* pObjList,
-                             CPDF_PageObjectList::const_iterator ObjPos);
+                             const CPDF_PageObjectHolder* pObjList,
+                             CPDF_PageObjectHolder::const_iterator ObjPos);
   bool IsSameTextObject(CPDF_TextObject* pTextObj1, CPDF_TextObject* pTextObj2);
   void CloseTempLine();
   FPDFText_MarkedContent PreMarkedContent(PDFTEXT_Obj pObj);
diff --git a/fpdfsdk/fpdf_annot.cpp b/fpdfsdk/fpdf_annot.cpp
index a7a7cd8..0ebd6fb 100644
--- a/fpdfsdk/fpdf_annot.cpp
+++ b/fpdfsdk/fpdf_annot.cpp
@@ -359,13 +359,12 @@
 
   // Check that the object is already in this annotation's object list.
   CPDF_Form* pForm = pAnnot->GetForm();
-  const CPDF_PageObjectList* pObjList = pForm->GetPageObjectList();
   auto it =
-      std::find_if(pObjList->begin(), pObjList->end(),
+      std::find_if(pForm->begin(), pForm->end(),
                    [pObj](const std::unique_ptr<CPDF_PageObject>& candidate) {
                      return candidate.get() == pObj;
                    });
-  if (it == pObjList->end())
+  if (it == pForm->end())
     return false;
 
   // Update the content stream data in the annotation's AP stream.
@@ -406,13 +405,12 @@
   // Note that an object that came from a different annotation must not be
   // passed here, since an object cannot belong to more than one annotation.
   CPDF_Form* pForm = pAnnot->GetForm();
-  const CPDF_PageObjectList* pObjList = pForm->GetPageObjectList();
   auto it =
-      std::find_if(pObjList->begin(), pObjList->end(),
+      std::find_if(pForm->begin(), pForm->end(),
                    [pObj](const std::unique_ptr<CPDF_PageObject>& candidate) {
                      return candidate.get() == pObj;
                    });
-  if (it != pObjList->end())
+  if (it != pForm->end())
     return false;
 
   // Append the object to the object list.
@@ -436,7 +434,7 @@
 
     pAnnot->SetForm(pStream);
   }
-  return pdfium::CollectionSize<int>(*pAnnot->GetForm()->GetPageObjectList());
+  return pAnnot->GetForm()->GetPageObjectCount();
 }
 
 FPDF_EXPORT FPDF_PAGEOBJECT FPDF_CALLCONV
diff --git a/fpdfsdk/fpdf_editpage.cpp b/fpdfsdk/fpdf_editpage.cpp
index d55a451..b0a9cfa 100644
--- a/fpdfsdk/fpdf_editpage.cpp
+++ b/fpdfsdk/fpdf_editpage.cpp
@@ -141,17 +141,10 @@
   return pPageObj ? pPageObj->AsForm() : nullptr;
 }
 
-const CPDF_PageObjectList* CPDFPageObjListFromFPDFFormObject(
+const CPDF_PageObjectHolder* CPDFPageObjHolderFromFPDFFormObject(
     FPDF_PAGEOBJECT page_object) {
   CPDF_FormObject* pFormObject = CPDFFormObjectFromFPDFPageObject(page_object);
-  if (!pFormObject)
-    return nullptr;
-
-  const CPDF_Form* pForm = pFormObject->form();
-  if (!pForm)
-    return nullptr;
-
-  return pForm->GetPageObjectList();
+  return pFormObject ? pFormObject->form() : nullptr;
 }
 
 }  // namespace
@@ -842,15 +835,13 @@
 
 FPDF_EXPORT int FPDF_CALLCONV
 FPDFFormObj_CountObjects(FPDF_PAGEOBJECT page_object) {
-  const CPDF_PageObjectList* pObjectList =
-      CPDFPageObjListFromFPDFFormObject(page_object);
-  return pObjectList ? pObjectList->size() : -1;
+  const auto* pObjectList = CPDFPageObjHolderFromFPDFFormObject(page_object);
+  return pObjectList ? pObjectList->GetPageObjectCount() : -1;
 }
 
 FPDF_EXPORT FPDF_PAGEOBJECT FPDF_CALLCONV
 FPDFFormObj_GetObject(FPDF_PAGEOBJECT form_object, unsigned long index) {
-  const CPDF_PageObjectList* pObjectList =
-      CPDFPageObjListFromFPDFFormObject(form_object);
+  const auto* pObjectList = CPDFPageObjHolderFromFPDFFormObject(form_object);
   if (!pObjectList)
     return nullptr;
 
diff --git a/fpdfsdk/fpdf_flatten.cpp b/fpdfsdk/fpdf_flatten.cpp
index d6dbe9a..01c9a82 100644
--- a/fpdfsdk/fpdf_flatten.cpp
+++ b/fpdfsdk/fpdf_flatten.cpp
@@ -53,7 +53,7 @@
   auto pPDFPage = pdfium::MakeRetain<CPDF_Page>(pDoc, pDict, false);
   pPDFPage->ParseContent();
 
-  for (const auto& pPageObject : *pPDFPage->GetPageObjectList()) {
+  for (const auto& pPageObject : *pPDFPage) {
     const CFX_FloatRect& rc = pPageObject->GetRect();
     if (IsValidRect(rc, pDict->GetRectFor(pdfium::page_object::kMediaBox)))
       pRectArray->push_back(rc);
diff --git a/fxjs/cjs_document.cpp b/fxjs/cjs_document.cpp
index c93ee78..423849f 100644
--- a/fxjs/cjs_document.cpp
+++ b/fxjs/cjs_document.cpp
@@ -1309,7 +1309,7 @@
 
   int nWords = 0;
   WideString swRet;
-  for (auto& pPageObj : *page->GetPageObjectList()) {
+  for (auto& pPageObj : *page) {
     if (pPageObj->IsText()) {
       CPDF_TextObject* pTextObj = pPageObj->AsText();
       int nObjWords = CountWords(pTextObj);
@@ -1357,7 +1357,7 @@
   page->ParseContent();
 
   int nWords = 0;
-  for (auto& pPageObj : *page->GetPageObjectList()) {
+  for (auto& pPageObj : *page) {
     if (pPageObj->IsText())
       nWords += CountWords(pPageObj->AsText());
   }