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());
   }
