Remove some CFX_ArrayTemplate in fpdfapi and fpdfdoc

Also use unique_ptr in one spot while we're at it.

Review-Url: https://codereview.chromium.org/2625483002
diff --git a/core/fpdfapi/parser/cpdf_parser.cpp b/core/fpdfapi/parser/cpdf_parser.cpp
index 62364c0..f9d9eb3 100644
--- a/core/fpdfapi/parser/cpdf_parser.cpp
+++ b/core/fpdfapi/parser/cpdf_parser.cpp
@@ -986,14 +986,14 @@
   if (!pArray)
     return false;
 
-  CFX_ArrayTemplate<uint32_t> WidthArray;
+  std::vector<uint32_t> WidthArray;
   FX_SAFE_UINT32 dwAccWidth = 0;
   for (size_t i = 0; i < pArray->GetCount(); ++i) {
-    WidthArray.Add(pArray->GetIntegerAt(i));
+    WidthArray.push_back(pArray->GetIntegerAt(i));
     dwAccWidth += WidthArray[i];
   }
 
-  if (!dwAccWidth.IsValid() || WidthArray.GetSize() < 3)
+  if (!dwAccWidth.IsValid() || WidthArray.size() < 3)
     return false;
 
   uint32_t totalWidth = dwAccWidth.ValueOrDie();
diff --git a/core/fpdfdoc/cpdf_formcontrol.h b/core/fpdfdoc/cpdf_formcontrol.h
index d24dd04..c0dad39 100644
--- a/core/fpdfdoc/cpdf_formcontrol.h
+++ b/core/fpdfdoc/cpdf_formcontrol.h
@@ -46,6 +46,8 @@
  public:
   enum HighlightingMode { None = 0, Invert, Outline, Push, Toggle };
 
+  CPDF_FormControl(CPDF_FormField* pField, CPDF_Dictionary* pWidgetDict);
+
   CPDF_FormField::Type GetType() const { return m_pField->GetType(); }
   CPDF_InterForm* GetInterForm() const { return m_pForm; }
   CPDF_FormField* GetField() const { return m_pField; }
@@ -111,8 +113,6 @@
   friend class CPDF_InterForm;
   friend class CPDF_FormField;
 
-  CPDF_FormControl(CPDF_FormField* pField, CPDF_Dictionary* pWidgetDict);
-
   CFX_ByteString GetOnStateName() const;
   void SetOnStateName(const CFX_ByteString& csOn);
   void CheckControl(bool bChecked);
diff --git a/core/fpdfdoc/cpdf_formfield.cpp b/core/fpdfdoc/cpdf_formfield.cpp
index cc7054d..b344327 100644
--- a/core/fpdfdoc/cpdf_formfield.cpp
+++ b/core/fpdfdoc/cpdf_formfield.cpp
@@ -245,11 +245,8 @@
   if (!pControl)
     return -1;
 
-  for (int i = 0; i < m_ControlList.GetSize(); i++) {
-    if (m_ControlList.GetAt(i) == pControl)
-      return i;
-  }
-  return -1;
+  auto it = std::find(m_ControlList.begin(), m_ControlList.end(), pControl);
+  return it != m_ControlList.end() ? it - m_ControlList.begin() : -1;
 }
 
 int CPDF_FormField::GetFieldType() const {
@@ -414,11 +411,9 @@
   if (CPDF_Object* pObj = FPDF_GetFieldAttr(m_pDict, "MaxLen"))
     return pObj->GetInteger();
 
-  for (int i = 0; i < m_ControlList.GetSize(); i++) {
-    CPDF_FormControl* pControl = m_ControlList.GetAt(i);
+  for (const auto& pControl : m_ControlList) {
     if (!pControl)
       continue;
-
     CPDF_Dictionary* pWidgetDict = pControl->m_pWidgetDict;
     if (pWidgetDict->KeyExist("MaxLen"))
       return pWidgetDict->GetIntegerFor("MaxLen");
diff --git a/core/fpdfdoc/cpdf_formfield.h b/core/fpdfdoc/cpdf_formfield.h
index 37f17c3..9a1ddc4 100644
--- a/core/fpdfdoc/cpdf_formfield.h
+++ b/core/fpdfdoc/cpdf_formfield.h
@@ -7,11 +7,14 @@
 #ifndef CORE_FPDFDOC_CPDF_FORMFIELD_H_
 #define CORE_FPDFDOC_CPDF_FORMFIELD_H_
 
+#include <vector>
+
 #include "core/fpdfdoc/cpdf_aaction.h"
 #include "core/fpdfdoc/cpdf_formfield.h"
 #include "core/fxcrt/fx_basic.h"
 #include "core/fxcrt/fx_string.h"
 #include "core/fxcrt/fx_system.h"
+#include "third_party/base/stl_util.h"
 
 #define FIELDTYPE_UNKNOWN 0
 #define FIELDTYPE_PUSHBUTTON 1
@@ -58,12 +61,12 @@
 
   bool ResetField(bool bNotify = false);
 
-  int CountControls() const { return m_ControlList.GetSize(); }
-
-  CPDF_FormControl* GetControl(int index) const {
-    return m_ControlList.GetAt(index);
+  int CountControls() const {
+    return pdfium::CollectionSize<int>(m_ControlList);
   }
 
+  CPDF_FormControl* GetControl(int index) const { return m_ControlList[index]; }
+
   int GetControlIndex(const CPDF_FormControl* pControl) const;
   int GetFieldType() const;
 
@@ -150,9 +153,9 @@
 
   CPDF_FormField::Type m_Type;
   uint32_t m_Flags;
-  CPDF_InterForm* m_pForm;
+  CPDF_InterForm* const m_pForm;
   CPDF_Dictionary* m_pDict;
-  CFX_ArrayTemplate<CPDF_FormControl*> m_ControlList;
+  std::vector<CPDF_FormControl*> m_ControlList;  // Owned by InterForm parent.
   FX_FLOAT m_FontSize;
   CPDF_Font* m_pFont;
 };
diff --git a/core/fpdfdoc/cpdf_interform.cpp b/core/fpdfdoc/cpdf_interform.cpp
index e574e28..6cffea6 100644
--- a/core/fpdfdoc/cpdf_interform.cpp
+++ b/core/fpdfdoc/cpdf_interform.cpp
@@ -669,9 +669,7 @@
 }
 
 CPDF_InterForm::~CPDF_InterForm() {
-  for (auto it : m_ControlMap)
-    delete it.second;
-
+  m_ControlMap.clear();
   size_t nCount = m_pFieldTree->m_Root.CountFields();
   for (size_t i = 0; i < nCount; ++i)
     delete m_pFieldTree->m_Root.GetFieldAtIndex(i);
@@ -919,7 +917,7 @@
     if (it == m_ControlMap.end())
       continue;
 
-    CPDF_FormControl* pControl = it->second;
+    CPDF_FormControl* pControl = it->second.get();
     CFX_FloatRect rect = pControl->GetRect();
     if (!rect.Contains(pdf_x, pdf_y))
       continue;
@@ -934,7 +932,7 @@
 CPDF_FormControl* CPDF_InterForm::GetControlByDict(
     const CPDF_Dictionary* pWidgetDict) const {
   const auto it = m_ControlMap.find(pWidgetDict);
-  return it != m_ControlMap.end() ? it->second : nullptr;
+  return it != m_ControlMap.end() ? it->second.get() : nullptr;
 }
 
 bool CPDF_InterForm::NeedConstructAP() const {
@@ -1150,11 +1148,12 @@
                                              CPDF_Dictionary* pWidgetDict) {
   const auto it = m_ControlMap.find(pWidgetDict);
   if (it != m_ControlMap.end())
-    return it->second;
+    return it->second.get();
 
-  CPDF_FormControl* pControl = new CPDF_FormControl(pField, pWidgetDict);
-  m_ControlMap[pWidgetDict] = pControl;
-  pField->m_ControlList.Add(pControl);
+  auto pNew = pdfium::MakeUnique<CPDF_FormControl>(pField, pWidgetDict);
+  CPDF_FormControl* pControl = pNew.get();
+  m_ControlMap[pWidgetDict] = std::move(pNew);
+  pField->m_ControlList.push_back(pControl);
   return pControl;
 }
 
diff --git a/core/fpdfdoc/cpdf_interform.h b/core/fpdfdoc/cpdf_interform.h
index f03ffb1..b846973 100644
--- a/core/fpdfdoc/cpdf_interform.h
+++ b/core/fpdfdoc/cpdf_interform.h
@@ -112,7 +112,8 @@
 
   CPDF_Document* const m_pDocument;
   CPDF_Dictionary* m_pFormDict;
-  std::map<const CPDF_Dictionary*, CPDF_FormControl*> m_ControlMap;
+  std::map<const CPDF_Dictionary*, std::unique_ptr<CPDF_FormControl>>
+      m_ControlMap;
   std::unique_ptr<CFieldTree> m_pFieldTree;
   CFX_ByteString m_bsEncoding;
   IPDF_FormNotify* m_pFormNotify;