Get rid of CFX_ArrayTemplate<CPDF_Object*>

They won't work with std::unique_ptr down the road, so replace
with std::vector.

Review-Url: https://codereview.chromium.org/2411703003
diff --git a/core/fpdfapi/edit/cpdf_pagecontentgenerator.cpp b/core/fpdfapi/edit/cpdf_pagecontentgenerator.cpp
index 66a4740..ad1ffaf 100644
--- a/core/fpdfapi/edit/cpdf_pagecontentgenerator.cpp
+++ b/core/fpdfapi/edit/cpdf_pagecontentgenerator.cpp
@@ -34,21 +34,19 @@
 
 CPDF_PageContentGenerator::~CPDF_PageContentGenerator() {}
 
-FX_BOOL CPDF_PageContentGenerator::InsertPageObject(
-    CPDF_PageObject* pPageObject) {
-  return pPageObject && m_pageObjects.Add(pPageObject);
+void CPDF_PageContentGenerator::InsertPageObject(CPDF_PageObject* pPageObject) {
+  if (pPageObject)
+    m_pageObjects.push_back(pPageObject);
 }
 
 void CPDF_PageContentGenerator::GenerateContent() {
   CFX_ByteTextBuf buf;
-  CPDF_Dictionary* pPageDict = m_pPage->m_pFormDict;
-  for (int i = 0; i < m_pageObjects.GetSize(); ++i) {
-    CPDF_PageObject* pPageObj = m_pageObjects[i];
-    if (!pPageObj || !pPageObj->IsImage()) {
-      continue;
-    }
-    ProcessImage(buf, pPageObj->AsImage());
+  for (CPDF_PageObject* pPageObj : m_pageObjects) {
+    CPDF_ImageObject* pImageObject = pPageObj->AsImage();
+    if (pImageObject)
+      ProcessImage(buf, pImageObject);
   }
+  CPDF_Dictionary* pPageDict = m_pPage->m_pFormDict;
   CPDF_Object* pContent =
       pPageDict ? pPageDict->GetDirectObjectFor("Contents") : nullptr;
   if (pContent)
diff --git a/core/fpdfapi/edit/cpdf_pagecontentgenerator.h b/core/fpdfapi/edit/cpdf_pagecontentgenerator.h
index 1470ca8..ce605f0 100644
--- a/core/fpdfapi/edit/cpdf_pagecontentgenerator.h
+++ b/core/fpdfapi/edit/cpdf_pagecontentgenerator.h
@@ -7,6 +7,8 @@
 #ifndef CORE_FPDFAPI_EDIT_CPDF_PAGECONTENTGENERATOR_H_
 #define CORE_FPDFAPI_EDIT_CPDF_PAGECONTENTGENERATOR_H_
 
+#include <vector>
+
 #include "core/fpdfapi/parser/cpdf_document.h"
 #include "core/fxcrt/fx_basic.h"
 #include "core/fxcrt/fx_coordinates.h"
@@ -22,7 +24,7 @@
   explicit CPDF_PageContentGenerator(CPDF_Page* pPage);
   ~CPDF_PageContentGenerator();
 
-  FX_BOOL InsertPageObject(CPDF_PageObject* pPageObject);
+  void InsertPageObject(CPDF_PageObject* pPageObject);
   void GenerateContent();
   void TransformContent(CFX_Matrix& matrix);
 
@@ -37,7 +39,7 @@
 
   CPDF_Page* m_pPage;
   CPDF_Document* m_pDocument;
-  CFX_ArrayTemplate<CPDF_PageObject*> m_pageObjects;
+  std::vector<CPDF_PageObject*> m_pageObjects;
 };
 
 #endif  // CORE_FPDFAPI_EDIT_CPDF_PAGECONTENTGENERATOR_H_
diff --git a/core/fpdfapi/parser/cpdf_data_avail.cpp b/core/fpdfapi/parser/cpdf_data_avail.cpp
index da7f694..e23aa8e 100644
--- a/core/fpdfapi/parser/cpdf_data_avail.cpp
+++ b/core/fpdfapi/parser/cpdf_data_avail.cpp
@@ -80,6 +80,7 @@
   m_bLinearedDataOK = FALSE;
   m_bSupportHintTable = bSupportHintTable;
 }
+
 CPDF_DataAvail::~CPDF_DataAvail() {
   m_pHintTables.reset();
   if (m_pLinearized)
@@ -91,9 +92,8 @@
   if (m_pTrailer)
     m_pTrailer->Release();
 
-  int iSize = m_arrayAcroforms.GetSize();
-  for (int i = 0; i < iSize; ++i)
-    m_arrayAcroforms.GetAt(i)->Release();
+  for (CPDF_Object* pObject : m_arrayAcroforms)
+    pObject->Release();
 }
 
 void CPDF_DataAvail::SetDocument(CPDF_Document* pDoc) {
@@ -125,18 +125,17 @@
   return *it - offset;
 }
 
-FX_BOOL CPDF_DataAvail::IsObjectsAvail(
-    CFX_ArrayTemplate<CPDF_Object*>& obj_array,
+FX_BOOL CPDF_DataAvail::AreObjectsAvailable(
+    std::vector<CPDF_Object*>& obj_array,
     FX_BOOL bParsePage,
     DownloadHints* pHints,
-    CFX_ArrayTemplate<CPDF_Object*>& ret_array) {
-  if (!obj_array.GetSize())
+    std::vector<CPDF_Object*>& ret_array) {
+  if (obj_array.empty())
     return TRUE;
 
   uint32_t count = 0;
-  CFX_ArrayTemplate<CPDF_Object*> new_obj_array;
-  for (int i = 0; i < obj_array.GetSize(); i++) {
-    CPDF_Object* pObj = obj_array[i];
+  std::vector<CPDF_Object*> new_obj_array;
+  for (CPDF_Object* pObj : obj_array) {
     if (!pObj)
       continue;
 
@@ -145,7 +144,7 @@
       case CPDF_Object::ARRAY: {
         CPDF_Array* pArray = pObj->AsArray();
         for (size_t k = 0; k < pArray->GetCount(); ++k)
-          new_obj_array.Add(pArray->GetObjectAt(k));
+          new_obj_array.push_back(pArray->GetObjectAt(k));
       } break;
       case CPDF_Object::STREAM:
         pObj = pObj->GetDict();
@@ -158,7 +157,7 @@
           const CFX_ByteString& key = it.first;
           CPDF_Object* value = it.second;
           if (key != "Parent")
-            new_obj_array.Add(value);
+            new_obj_array.push_back(value);
         }
       } break;
       case CPDF_Object::REFERENCE: {
@@ -171,36 +170,31 @@
           break;
 
         if (!IsDataAvail(offset, size, pHints)) {
-          ret_array.Add(pObj);
+          ret_array.push_back(pObj);
           count++;
         } else if (!pdfium::ContainsKey(m_ObjectSet, dwNum)) {
           m_ObjectSet.insert(dwNum);
           CPDF_Object* pReferred =
               m_pDocument->GetOrParseIndirectObject(pRef->GetRefObjNum());
           if (pReferred)
-            new_obj_array.Add(pReferred);
+            new_obj_array.push_back(pReferred);
         }
       } break;
     }
   }
 
   if (count > 0) {
-    for (int i = 0; i < new_obj_array.GetSize(); ++i) {
-      CPDF_Object* pObj = new_obj_array[i];
-      if (CPDF_Reference* pRef = pObj->AsReference()) {
-        uint32_t dwNum = pRef->GetRefObjNum();
-        if (!pdfium::ContainsKey(m_ObjectSet, dwNum))
-          ret_array.Add(pObj);
-      } else {
-        ret_array.Add(pObj);
-      }
+    for (CPDF_Object* pObj : new_obj_array) {
+      CPDF_Reference* pRef = pObj->AsReference();
+      if (pRef && pdfium::ContainsKey(m_ObjectSet, pRef->GetRefObjNum()))
+        continue;
+      ret_array.push_back(pObj);
     }
     return FALSE;
   }
 
-  obj_array.RemoveAll();
-  obj_array.Append(new_obj_array);
-  return IsObjectsAvail(obj_array, FALSE, pHints, ret_array);
+  obj_array = new_obj_array;
+  return AreObjectsAvailable(obj_array, FALSE, pHints, ret_array);
 }
 
 CPDF_DataAvail::DocAvailStatus CPDF_DataAvail::IsDocAvail(
@@ -220,30 +214,27 @@
 }
 
 FX_BOOL CPDF_DataAvail::CheckAcroFormSubObject(DownloadHints* pHints) {
-  if (!m_objs_array.GetSize()) {
-    m_objs_array.RemoveAll();
+  if (m_objs_array.empty()) {
     m_ObjectSet.clear();
-    CFX_ArrayTemplate<CPDF_Object*> obj_array;
-    obj_array.Append(m_arrayAcroforms);
-    FX_BOOL bRet = IsObjectsAvail(obj_array, FALSE, pHints, m_objs_array);
-    if (bRet)
-      m_objs_array.RemoveAll();
-    return bRet;
+    std::vector<CPDF_Object*> obj_array = m_arrayAcroforms;
+    if (!AreObjectsAvailable(obj_array, FALSE, pHints, m_objs_array))
+      return FALSE;
+
+    m_objs_array.clear();
+    return TRUE;
   }
 
-  CFX_ArrayTemplate<CPDF_Object*> new_objs_array;
-  FX_BOOL bRet = IsObjectsAvail(m_objs_array, FALSE, pHints, new_objs_array);
-  if (bRet) {
-    int32_t iSize = m_arrayAcroforms.GetSize();
-    for (int32_t i = 0; i < iSize; ++i) {
-      m_arrayAcroforms.GetAt(i)->Release();
-    }
-    m_arrayAcroforms.RemoveAll();
-  } else {
-    m_objs_array.RemoveAll();
-    m_objs_array.Append(new_objs_array);
+  std::vector<CPDF_Object*> new_objs_array;
+  if (!AreObjectsAvailable(m_objs_array, FALSE, pHints, new_objs_array)) {
+    m_objs_array = new_objs_array;
+    return FALSE;
   }
-  return bRet;
+
+  for (CPDF_Object* pObject : m_arrayAcroforms)
+    pObject->Release();
+
+  m_arrayAcroforms.clear();
+  return TRUE;
 }
 
 FX_BOOL CPDF_DataAvail::CheckAcroForm(DownloadHints* pHints) {
@@ -262,7 +253,7 @@
     return FALSE;
   }
 
-  m_arrayAcroforms.Add(m_pAcroForm);
+  m_arrayAcroforms.push_back(m_pAcroForm);
   m_docStatus = PDF_DATAAVAIL_PAGETREE;
   return TRUE;
 }
@@ -515,7 +506,7 @@
 
     CFX_ByteString type = pObj->GetDict()->GetStringFor("Type");
     if (type == "Pages") {
-      m_PagesArray.Add(pObj);
+      m_PagesArray.push_back(pObj);
       continue;
     }
     pObj->Release();
@@ -527,27 +518,25 @@
     return FALSE;
   }
 
-  uint32_t iPages = m_PagesArray.GetSize();
+  uint32_t iPages = m_PagesArray.size();
   for (uint32_t i = 0; i < iPages; i++) {
-    CPDF_Object* pPages = m_PagesArray.GetAt(i);
+    CPDF_Object* pPages = m_PagesArray[i];
     if (!pPages)
       continue;
 
     if (!GetPageKids(m_pCurrentParser, pPages)) {
       pPages->Release();
-      while (++i < iPages) {
-        pPages = m_PagesArray.GetAt(i);
-        pPages->Release();
-      }
-      m_PagesArray.RemoveAll();
+      while (++i < iPages)
+        m_PagesArray[i]->Release();
 
+      m_PagesArray.clear();
       m_docStatus = PDF_DATAAVAIL_ERROR;
       return FALSE;
     }
     pPages->Release();
   }
 
-  m_PagesArray.RemoveAll();
+  m_PagesArray.clear();
   if (!m_PageObjList.GetSize())
     m_docStatus = PDF_DATAAVAIL_DONE;
   return TRUE;
@@ -1535,8 +1524,7 @@
 
 FX_BOOL CPDF_DataAvail::CheckPageAnnots(uint32_t dwPage,
                                         DownloadHints* pHints) {
-  if (!m_objs_array.GetSize()) {
-    m_objs_array.RemoveAll();
+  if (m_objs_array.empty()) {
     m_ObjectSet.clear();
 
     FX_SAFE_INT32 safePage = pdfium::base::checked_cast<int32_t>(dwPage);
@@ -1548,23 +1536,22 @@
     if (!pAnnots)
       return TRUE;
 
-    CFX_ArrayTemplate<CPDF_Object*> obj_array;
-    obj_array.Add(pAnnots);
+    std::vector<CPDF_Object*> obj_array;
+    obj_array.push_back(pAnnots);
+    if (!AreObjectsAvailable(obj_array, FALSE, pHints, m_objs_array))
+      return FALSE;
 
-    FX_BOOL bRet = IsObjectsAvail(obj_array, FALSE, pHints, m_objs_array);
-    if (bRet)
-      m_objs_array.RemoveAll();
-
-    return bRet;
+    m_objs_array.clear();
+    return TRUE;
   }
 
-  CFX_ArrayTemplate<CPDF_Object*> new_objs_array;
-  FX_BOOL bRet = IsObjectsAvail(m_objs_array, FALSE, pHints, new_objs_array);
-  m_objs_array.RemoveAll();
-  if (!bRet)
-    m_objs_array.Append(new_objs_array);
-
-  return bRet;
+  std::vector<CPDF_Object*> new_objs_array;
+  if (!AreObjectsAvailable(m_objs_array, FALSE, pHints, new_objs_array)) {
+    m_objs_array = new_objs_array;
+    return FALSE;
+  }
+  m_objs_array.clear();
+  return TRUE;
 }
 
 CPDF_DataAvail::DocAvailStatus CPDF_DataAvail::CheckLinearizedFirstPage(
@@ -1615,7 +1602,7 @@
     m_bPageLoadedOK = FALSE;
     m_bAnnotsLoad = FALSE;
     m_bNeedDownLoadResource = FALSE;
-    m_objs_array.RemoveAll();
+    m_objs_array.clear();
     m_ObjectSet.clear();
   }
 
@@ -1671,8 +1658,7 @@
   }
 
   if (!m_bPageLoadedOK) {
-    if (!m_objs_array.GetSize()) {
-      m_objs_array.RemoveAll();
+    if (m_objs_array.empty()) {
       m_ObjectSet.clear();
 
       FX_SAFE_INT32 safePage = pdfium::base::checked_cast<int32_t>(dwPage);
@@ -1682,24 +1668,20 @@
         return DataAvailable;
       }
 
-      CFX_ArrayTemplate<CPDF_Object*> obj_array;
-      obj_array.Add(m_pPageDict);
-      FX_BOOL bRet = IsObjectsAvail(obj_array, TRUE, pHints, m_objs_array);
-      if (!bRet)
+      std::vector<CPDF_Object*> obj_array;
+      obj_array.push_back(m_pPageDict);
+      if (!AreObjectsAvailable(obj_array, TRUE, pHints, m_objs_array))
         return DataNotAvailable;
 
-      m_objs_array.RemoveAll();
+      m_objs_array.clear();
     } else {
-      CFX_ArrayTemplate<CPDF_Object*> new_objs_array;
-      FX_BOOL bRet =
-          IsObjectsAvail(m_objs_array, FALSE, pHints, new_objs_array);
-
-      m_objs_array.RemoveAll();
-      if (!bRet) {
-        m_objs_array.Append(new_objs_array);
+      std::vector<CPDF_Object*> new_objs_array;
+      if (!AreObjectsAvailable(m_objs_array, FALSE, pHints, new_objs_array)) {
+        m_objs_array = new_objs_array;
         return DataNotAvailable;
       }
     }
+    m_objs_array.clear();
     m_bPageLoadedOK = TRUE;
   }
 
@@ -1731,23 +1713,22 @@
 }
 
 FX_BOOL CPDF_DataAvail::CheckResources(DownloadHints* pHints) {
-  if (!m_objs_array.GetSize()) {
-    m_objs_array.RemoveAll();
-    CFX_ArrayTemplate<CPDF_Object*> obj_array;
-    obj_array.Add(m_pPageResource);
+  if (m_objs_array.empty()) {
+    std::vector<CPDF_Object*> obj_array;
+    obj_array.push_back(m_pPageResource);
+    if (!AreObjectsAvailable(obj_array, TRUE, pHints, m_objs_array))
+      return FALSE;
 
-    FX_BOOL bRet = IsObjectsAvail(obj_array, TRUE, pHints, m_objs_array);
-    if (bRet)
-      m_objs_array.RemoveAll();
-    return bRet;
+    m_objs_array.clear();
+    return TRUE;
   }
-
-  CFX_ArrayTemplate<CPDF_Object*> new_objs_array;
-  FX_BOOL bRet = IsObjectsAvail(m_objs_array, FALSE, pHints, new_objs_array);
-  m_objs_array.RemoveAll();
-  if (!bRet)
-    m_objs_array.Append(new_objs_array);
-  return bRet;
+  std::vector<CPDF_Object*> new_objs_array;
+  if (!AreObjectsAvailable(m_objs_array, FALSE, pHints, new_objs_array)) {
+    m_objs_array = new_objs_array;
+    return FALSE;
+  }
+  m_objs_array.clear();
+  return TRUE;
 }
 
 void CPDF_DataAvail::GetLinearizedMainXRefInfo(FX_FILESIZE* pPos,
@@ -1820,18 +1801,18 @@
     if (nDocStatus == DataNotAvailable)
       return FormNotAvailable;
 
-    if (!m_objs_array.GetSize())
-      m_objs_array.Add(pAcroForm->GetDict());
+    if (m_objs_array.empty())
+      m_objs_array.push_back(pAcroForm->GetDict());
     m_bLinearizedFormParamLoad = TRUE;
   }
 
-  CFX_ArrayTemplate<CPDF_Object*> new_objs_array;
-  FX_BOOL bRet = IsObjectsAvail(m_objs_array, FALSE, pHints, new_objs_array);
-  m_objs_array.RemoveAll();
-  if (!bRet) {
-    m_objs_array.Append(new_objs_array);
+  std::vector<CPDF_Object*> new_objs_array;
+  if (!AreObjectsAvailable(m_objs_array, FALSE, pHints, new_objs_array)) {
+    m_objs_array = new_objs_array;
     return FormNotAvailable;
   }
+
+  m_objs_array.clear();
   return FormAvailable;
 }
 
diff --git a/core/fpdfapi/parser/cpdf_data_avail.h b/core/fpdfapi/parser/cpdf_data_avail.h
index f4fb753..fe5c481 100644
--- a/core/fpdfapi/parser/cpdf_data_avail.h
+++ b/core/fpdfapi/parser/cpdf_data_avail.h
@@ -7,6 +7,8 @@
 #ifndef CORE_FPDFAPI_PARSER_CPDF_DATA_AVAIL_H_
 #define CORE_FPDFAPI_PARSER_CPDF_DATA_AVAIL_H_
 
+#include <vector>
+
 #include "core/fpdfapi/parser/cpdf_parser.h"
 #include "core/fpdfapi/parser/cpdf_syntax_parser.h"
 #include "core/fxcrt/fx_basic.h"
@@ -124,10 +126,10 @@
   static const int kMaxPageRecursionDepth = 1024;
 
   uint32_t GetObjectSize(uint32_t objnum, FX_FILESIZE& offset);
-  FX_BOOL IsObjectsAvail(CFX_ArrayTemplate<CPDF_Object*>& obj_array,
-                         FX_BOOL bParsePage,
-                         DownloadHints* pHints,
-                         CFX_ArrayTemplate<CPDF_Object*>& ret_array);
+  FX_BOOL AreObjectsAvailable(std::vector<CPDF_Object*>& obj_array,
+                              FX_BOOL bParsePage,
+                              DownloadHints* pHints,
+                              std::vector<CPDF_Object*>& ret_array);
   FX_BOOL CheckDocStatus(DownloadHints* pHints);
   FX_BOOL CheckHeader(DownloadHints* pHints);
   FX_BOOL CheckFirstPage(DownloadHints* pHints);
@@ -209,7 +211,7 @@
   FX_FILESIZE m_dwFileLen;
   CPDF_Document* m_pDocument;
   std::set<uint32_t> m_ObjectSet;
-  CFX_ArrayTemplate<CPDF_Object*> m_objs_array;
+  std::vector<CPDF_Object*> m_objs_array;
   FX_FILESIZE m_Pos;
   FX_FILESIZE m_bufferOffset;
   uint32_t m_bufferSize;
@@ -232,13 +234,13 @@
   uint32_t m_dwAcroFormObjNum;
   FX_BOOL m_bAcroFormLoad;
   CPDF_Object* m_pAcroForm;
-  CFX_ArrayTemplate<CPDF_Object*> m_arrayAcroforms;
+  std::vector<CPDF_Object*> m_arrayAcroforms;
   CPDF_Dictionary* m_pPageDict;
   CPDF_Object* m_pPageResource;
   FX_BOOL m_bNeedDownLoadResource;
   FX_BOOL m_bPageLoadedOK;
   FX_BOOL m_bLinearizedFormParamLoad;
-  CFX_ArrayTemplate<CPDF_Object*> m_PagesArray;
+  std::vector<CPDF_Object*> m_PagesArray;
   uint32_t m_dwEncryptObjNum;
   FX_FILESIZE m_dwPrevXRefOffset;
   FX_BOOL m_bTotalLoadPageTree;
diff --git a/core/fpdfapi/parser/cpdf_parser.cpp b/core/fpdfapi/parser/cpdf_parser.cpp
index f4cde0c..c29ae18 100644
--- a/core/fpdfapi/parser/cpdf_parser.cpp
+++ b/core/fpdfapi/parser/cpdf_parser.cpp
@@ -72,9 +72,8 @@
     m_pSyntax->m_pFileAccess = nullptr;
   }
 
-  int32_t iLen = m_Trailers.GetSize();
-  for (int32_t i = 0; i < iLen; ++i) {
-    if (CPDF_Dictionary* trailer = m_Trailers.GetAt(i))
+  for (CPDF_Dictionary* trailer : m_Trailers) {
+    if (trailer)
       trailer->Release();
   }
 
@@ -368,7 +367,7 @@
     // SLOW ...
     XRefStreamList.insert(XRefStreamList.begin(),
                           pDict->GetIntegerFor("XRefStm"));
-    m_Trailers.Add(pDict.release());
+    m_Trailers.push_back(pDict.release());
   }
 
   for (size_t i = 0; i < CrossRefList.size(); ++i) {
@@ -423,7 +422,7 @@
     // SLOW ...
     XRefStreamList.insert(XRefStreamList.begin(),
                           pDict->GetIntegerFor("XRefStm"));
-    m_Trailers.Add(pDict.release());
+    m_Trailers.push_back(pDict.release());
   }
 
   for (size_t i = 1; i < CrossRefList.size(); ++i) {
@@ -992,7 +991,7 @@
     for (auto& it : m_ObjectInfo)
       it.second.type = 0;
   } else {
-    m_Trailers.Add(pNewTrailer);
+    m_Trailers.push_back(pNewTrailer);
   }
 
   std::vector<std::pair<int32_t, int32_t>> arrIndex;
diff --git a/core/fpdfapi/parser/cpdf_parser.h b/core/fpdfapi/parser/cpdf_parser.h
index 876ea6c..83b591f 100644
--- a/core/fpdfapi/parser/cpdf_parser.h
+++ b/core/fpdfapi/parser/cpdf_parser.h
@@ -10,6 +10,7 @@
 #include <map>
 #include <memory>
 #include <set>
+#include <vector>
 
 #include "core/fxcrt/fx_basic.h"
 
@@ -153,7 +154,7 @@
   std::unique_ptr<CPDF_SecurityHandler> m_pSecurityHandler;
   CFX_ByteString m_Password;
   std::set<FX_FILESIZE> m_SortedOffset;
-  CFX_ArrayTemplate<CPDF_Dictionary*> m_Trailers;
+  std::vector<CPDF_Dictionary*> m_Trailers;
   bool m_bVersionUpdated;
   CPDF_Object* m_pLinearized;
   uint32_t m_dwFirstPageNo;
diff --git a/fpdfsdk/fpdf_flatten.cpp b/fpdfsdk/fpdf_flatten.cpp
index 251da34..4be0135 100644
--- a/fpdfsdk/fpdf_flatten.cpp
+++ b/fpdfsdk/fpdf_flatten.cpp
@@ -17,8 +17,8 @@
 #include "core/fpdfapi/parser/cpdf_stream_acc.h"
 #include "core/fpdfdoc/cpdf_annot.h"
 #include "fpdfsdk/fsdk_define.h"
+#include "third_party/base/stl_util.h"
 
-typedef CFX_ArrayTemplate<CPDF_Dictionary*> CPDF_ObjectArray;
 typedef CFX_ArrayTemplate<CFX_FloatRect> CPDF_RectArray;
 
 enum FPDF_TYPE { MAX, MIN };
@@ -65,7 +65,7 @@
 void ParserStream(CPDF_Dictionary* pPageDic,
                   CPDF_Dictionary* pStream,
                   CPDF_RectArray* pRectArray,
-                  CPDF_ObjectArray* pObjectArray) {
+                  std::vector<CPDF_Dictionary*>* pObjectArray) {
   if (!pStream)
     return;
   CFX_FloatRect rect;
@@ -77,13 +77,13 @@
   if (IsValiableRect(rect, pPageDic->GetRectFor("MediaBox")))
     pRectArray->Add(rect);
 
-  pObjectArray->Add(pStream);
+  pObjectArray->push_back(pStream);
 }
 
 int ParserAnnots(CPDF_Document* pSourceDoc,
                  CPDF_Dictionary* pPageDic,
                  CPDF_RectArray* pRectArray,
-                 CPDF_ObjectArray* pObjectArray,
+                 std::vector<CPDF_Dictionary*>* pObjectArray,
                  int nUsage) {
   if (!pSourceDoc || !pPageDic)
     return FLATTEN_FAIL;
@@ -261,7 +261,7 @@
     return FLATTEN_FAIL;
   }
 
-  CPDF_ObjectArray ObjectArray;
+  std::vector<CPDF_Dictionary*> ObjectArray;
   CPDF_RectArray RectArray;
 
   int iRet = FLATTEN_FAIL;
@@ -329,7 +329,7 @@
   }
 
   CFX_ByteString key = "";
-  int nStreams = ObjectArray.GetSize();
+  int nStreams = pdfium::CollectionSize<int>(ObjectArray);
 
   if (nStreams > 0) {
     for (int iKey = 0; /*iKey < 100*/; iKey++) {
@@ -359,7 +359,7 @@
   }
 
   for (int i = 0; i < nStreams; i++) {
-    CPDF_Dictionary* pAnnotDic = ObjectArray.GetAt(i);
+    CPDF_Dictionary* pAnnotDic = ObjectArray[i];
     if (!pAnnotDic)
       continue;
 
@@ -453,8 +453,6 @@
   }
   pPageDict->RemoveFor("Annots");
 
-  ObjectArray.RemoveAll();
   RectArray.RemoveAll();
-
   return FLATTEN_SUCCESS;
 }
diff --git a/xfa/fxfa/app/xfa_ffapp.cpp b/xfa/fxfa/app/xfa_ffapp.cpp
index bc16ddf..6bedcd4 100644
--- a/xfa/fxfa/app/xfa_ffapp.cpp
+++ b/xfa/fxfa/app/xfa_ffapp.cpp
@@ -18,11 +18,10 @@
 #include "xfa/fxfa/xfa_ffwidgethandler.h"
 #include "xfa/fxfa/xfa_fontmgr.h"
 
-CXFA_FileRead::CXFA_FileRead(const CFX_ArrayTemplate<CPDF_Stream*>& streams) {
-  int32_t iCount = streams.GetSize();
-  for (int32_t i = 0; i < iCount; i++) {
+CXFA_FileRead::CXFA_FileRead(const std::vector<CPDF_Stream*>& streams) {
+  for (CPDF_Stream* pStream : streams) {
     CPDF_StreamAcc& acc = m_Data.Add();
-    acc.LoadAllData(streams[i]);
+    acc.LoadAllData(pStream);
   }
 }
 
diff --git a/xfa/fxfa/app/xfa_ffdoc.cpp b/xfa/fxfa/app/xfa_ffdoc.cpp
index 5e39adc..25c78bd 100644
--- a/xfa/fxfa/app/xfa_ffdoc.cpp
+++ b/xfa/fxfa/app/xfa_ffdoc.cpp
@@ -311,19 +311,19 @@
   if (!pElementXFA)
     return FALSE;
 
-  CFX_ArrayTemplate<CPDF_Stream*> xfaStreams;
+  std::vector<CPDF_Stream*> xfaStreams;
   if (pElementXFA->IsArray()) {
     CPDF_Array* pXFAArray = (CPDF_Array*)pElementXFA;
     for (size_t i = 0; i < pXFAArray->GetCount() / 2; i++) {
       if (CPDF_Stream* pStream = pXFAArray->GetStreamAt(i * 2 + 1))
-        xfaStreams.Add(pStream);
+        xfaStreams.push_back(pStream);
     }
   } else if (pElementXFA->IsStream()) {
-    xfaStreams.Add((CPDF_Stream*)pElementXFA);
+    xfaStreams.push_back((CPDF_Stream*)pElementXFA);
   }
-  if (xfaStreams.GetSize() < 1) {
+  if (xfaStreams.empty())
     return FALSE;
-  }
+
   IFX_FileRead* pFileRead = new CXFA_FileRead(xfaStreams);
   m_pPDFDoc = pPDFDoc;
   if (m_pStream) {
diff --git a/xfa/fxfa/xfa_ffapp.h b/xfa/fxfa/xfa_ffapp.h
index b335361..dd670b8 100644
--- a/xfa/fxfa/xfa_ffapp.h
+++ b/xfa/fxfa/xfa_ffapp.h
@@ -8,6 +8,7 @@
 #define XFA_FXFA_XFA_FFAPP_H_
 
 #include <memory>
+#include <vector>
 
 #include "core/fpdfapi/parser/cpdf_stream.h"
 #include "core/fpdfapi/parser/cpdf_stream_acc.h"
@@ -25,7 +26,7 @@
 
 class CXFA_FileRead : public IFX_FileRead {
  public:
-  explicit CXFA_FileRead(const CFX_ArrayTemplate<CPDF_Stream*>& streams);
+  explicit CXFA_FileRead(const std::vector<CPDF_Stream*>& streams);
   ~CXFA_FileRead() override;
 
   // IFX_FileRead