diff --git a/fpdfsdk/fxedit/fxet_list.cpp b/fpdfsdk/fxedit/fxet_list.cpp
index d795035..b10bb62 100644
--- a/fpdfsdk/fxedit/fxet_list.cpp
+++ b/fpdfsdk/fxedit/fxet_list.cpp
@@ -6,9 +6,12 @@
 
 #include "fpdfsdk/fxedit/fxet_list.h"
 
+#include <utility>
+
 #include "core/fpdfdoc/cpvt_word.h"
 #include "fpdfsdk/fxedit/fxet_edit.h"
 #include "fpdfsdk/pdfwindow/PWL_ListBox.h"
+#include "third_party/base/stl_util.h"
 
 CFX_ListItem::CFX_ListItem()
     : m_pEdit(new CFX_Edit),
@@ -373,14 +376,13 @@
 }
 
 CFX_FloatRect CFX_ListCtrl::GetItemRectInternal(int32_t nIndex) const {
-  if (CFX_ListItem* pListItem = m_aListItems.GetAt(nIndex)) {
-    CFX_FloatRect rcItem = pListItem->GetRect();
-    rcItem.left = 0.0f;
-    rcItem.right = GetPlateRect().Width();
-    return InnerToOuter(CLST_Rect(rcItem));
-  }
+  if (!pdfium::IndexInBounds(m_ListItems, nIndex) || !m_ListItems[nIndex])
+    return CFX_FloatRect();
 
-  return CFX_FloatRect();
+  CFX_FloatRect rcItem = m_ListItems[nIndex]->GetRect();
+  rcItem.left = 0.0f;
+  rcItem.right = GetPlateRect().Width();
+  return InnerToOuter(CLST_Rect(rcItem));
 }
 
 int32_t CFX_ListCtrl::GetCaret() const {
@@ -580,18 +582,17 @@
 
 void CFX_ListCtrl::ReArrange(int32_t nItemIndex) {
   float fPosY = 0.0f;
-
-  if (CFX_ListItem* pPrevItem = m_aListItems.GetAt(nItemIndex - 1))
-    fPosY = pPrevItem->GetRect().bottom;
-
-  for (int32_t i = nItemIndex, sz = m_aListItems.GetSize(); i < sz; i++) {
-    if (CFX_ListItem* pListItem = m_aListItems.GetAt(i)) {
+  if (pdfium::IndexInBounds(m_ListItems, nItemIndex - 1) &&
+      m_ListItems[nItemIndex - 1]) {
+    fPosY = m_ListItems[nItemIndex - 1]->GetRect().bottom;
+  }
+  for (const auto& pListItem : m_ListItems) {
+    if (pListItem) {
       float fListItemHeight = pListItem->GetItemHeight();
       pListItem->SetRect(CLST_Rect(0.0f, fPosY, 0.0f, fPosY + fListItemHeight));
       fPosY += fListItemHeight;
     }
   }
-
   SetContentRect(CLST_Rect(0.0f, 0.0f, 0.0f, fPosY));
   SetScrollInfo();
 }
@@ -606,7 +607,6 @@
 
 int32_t CFX_ListCtrl::GetTopItem() const {
   int32_t nItemIndex = GetItemIndex(GetBTPoint());
-
   if (!IsItemVisible(nItemIndex) && IsItemVisible(nItemIndex + 1))
     nItemIndex += 1;
 
@@ -614,11 +614,7 @@
 }
 
 void CFX_ListCtrl::Empty() {
-  for (int32_t i = 0, sz = m_aListItems.GetSize(); i < sz; i++)
-    delete m_aListItems.GetAt(i);
-
-  m_aListItems.RemoveAll();
-
+  m_ListItems.clear();
   InvalidateItem(-1);
 }
 
@@ -628,33 +624,23 @@
 
 int32_t CFX_ListCtrl::GetItemIndex(const CFX_PointF& point) const {
   CFX_PointF pt = OuterToInner(OutToIn(point));
-
   bool bFirst = true;
   bool bLast = true;
-
-  for (int32_t i = 0, sz = m_aListItems.GetSize(); i < sz; i++) {
-    if (CFX_ListItem* pListItem = m_aListItems.GetAt(i)) {
-      CLST_Rect rcListItem = pListItem->GetRect();
-
-      if (IsFloatBigger(pt.y, rcListItem.top)) {
-        bFirst = false;
-      }
-
-      if (IsFloatSmaller(pt.y, rcListItem.bottom)) {
-        bLast = false;
-      }
-
-      if (pt.y >= rcListItem.top && pt.y < rcListItem.bottom) {
-        return i;
-      }
-    }
+  for (const auto& pListItem : m_ListItems) {
+    if (!pListItem)
+      continue;
+    CLST_Rect rcListItem = pListItem->GetRect();
+    if (IsFloatBigger(pt.y, rcListItem.top))
+      bFirst = false;
+    if (IsFloatSmaller(pt.y, rcListItem.bottom))
+      bLast = false;
+    if (pt.y >= rcListItem.top && pt.y < rcListItem.bottom)
+      return &pListItem - &m_ListItems.front();
   }
-
   if (bFirst)
     return 0;
   if (bLast)
-    return m_aListItems.GetSize() - 1;
-
+    return pdfium::CollectionSize<int32_t>(m_ListItems) - 1;
   return -1;
 }
 
@@ -673,23 +659,21 @@
 }
 
 void CFX_ListCtrl::AddItem(const CFX_WideString& str) {
-  CFX_ListItem* pListItem = new CFX_ListItem();
+  auto pListItem = pdfium::MakeUnique<CFX_ListItem>();
   pListItem->SetFontMap(m_pFontMap);
   pListItem->SetFontSize(m_fFontSize);
   pListItem->SetText(str);
-  m_aListItems.Add(pListItem);
+  m_ListItems.push_back(std::move(pListItem));
 }
 
 CFX_Edit* CFX_ListCtrl::GetItemEdit(int32_t nIndex) const {
-  if (CFX_ListItem* pListItem = m_aListItems.GetAt(nIndex)) {
-    return pListItem->GetEdit();
-  }
-
-  return nullptr;
+  if (!pdfium::IndexInBounds(m_ListItems, nIndex) || !m_ListItems[nIndex])
+    return nullptr;
+  return m_ListItems[nIndex]->GetEdit();
 }
 
 int32_t CFX_ListCtrl::GetCount() const {
-  return m_aListItems.GetSize();
+  return pdfium::CollectionSize<int32_t>(m_ListItems);
 }
 
 CFX_FloatRect CFX_ListCtrl::GetPlateRect() const {
@@ -701,29 +685,26 @@
 }
 
 float CFX_ListCtrl::GetFirstHeight() const {
-  if (CFX_ListItem* pListItem = m_aListItems.GetAt(0)) {
-    return pListItem->GetItemHeight();
-  }
+  if (m_ListItems.empty() || !m_ListItems.front())
+    return 1.0f;
 
-  return 1.0f;
+  return m_ListItems.front()->GetItemHeight();
 }
 
 int32_t CFX_ListCtrl::GetFirstSelected() const {
-  for (int32_t i = 0, sz = m_aListItems.GetSize(); i < sz; i++) {
-    if (CFX_ListItem* pListItem = m_aListItems.GetAt(i)) {
-      if (pListItem->IsSelected())
-        return i;
-    }
+  int32_t i = 0;
+  for (const auto& pListItem : m_ListItems) {
+    if (pListItem && pListItem->IsSelected())
+      return i;
+    ++i;
   }
   return -1;
 }
 
 int32_t CFX_ListCtrl::GetLastSelected() const {
-  for (int32_t i = m_aListItems.GetSize() - 1; i >= 0; i--) {
-    if (CFX_ListItem* pListItem = m_aListItems.GetAt(i)) {
-      if (pListItem->IsSelected())
-        return i;
-    }
+  for (auto iter = m_ListItems.rbegin(); iter != m_ListItems.rend(); ++iter) {
+    if (*iter && (*iter)->IsSelected())
+      return &*iter - &m_ListItems.front();
   }
   return -1;
 }
@@ -736,13 +717,13 @@
 
 int32_t CFX_ListCtrl::FindNext(int32_t nIndex, wchar_t nChar) const {
   int32_t nCircleIndex = nIndex;
-
-  for (int32_t i = 0, sz = m_aListItems.GetSize(); i < sz; i++) {
+  int32_t sz = pdfium::CollectionSize<int32_t>(m_ListItems);
+  for (int32_t i = 0; i < sz; i++) {
     nCircleIndex++;
     if (nCircleIndex >= sz)
       nCircleIndex = 0;
 
-    if (CFX_ListItem* pListItem = m_aListItems.GetAt(nCircleIndex)) {
+    if (CFX_ListItem* pListItem = m_ListItems[nCircleIndex].get()) {
       if (Toupper(pListItem->GetFirstChar()) == Toupper(nChar))
         return nCircleIndex;
     }
@@ -752,15 +733,13 @@
 }
 
 bool CFX_ListCtrl::IsItemSelected(int32_t nIndex) const {
-  if (CFX_ListItem* pListItem = m_aListItems.GetAt(nIndex))
-    return pListItem->IsSelected();
-  return false;
+  return pdfium::IndexInBounds(m_ListItems, nIndex) && m_ListItems[nIndex] &&
+         m_ListItems[nIndex]->IsSelected();
 }
 
-void CFX_ListCtrl::SetItemSelect(int32_t nItemIndex, bool bSelected) {
-  if (CFX_ListItem* pListItem = m_aListItems.GetAt(nItemIndex)) {
-    pListItem->SetSelect(bSelected);
-  }
+void CFX_ListCtrl::SetItemSelect(int32_t nIndex, bool bSelected) {
+  if (pdfium::IndexInBounds(m_ListItems, nIndex) && m_ListItems[nIndex])
+    m_ListItems[nIndex]->SetSelect(bSelected);
 }
 
 void CFX_ListCtrl::SetMultipleSel(bool bMultiple) {
@@ -772,13 +751,12 @@
 }
 
 bool CFX_ListCtrl::IsValid(int32_t nItemIndex) const {
-  return nItemIndex >= 0 && nItemIndex < m_aListItems.GetSize();
+  return pdfium::IndexInBounds(m_ListItems, nItemIndex);
 }
 
 CFX_WideString CFX_ListCtrl::GetItemText(int32_t nIndex) const {
-  if (CFX_ListItem* pListItem = m_aListItems.GetAt(nIndex)) {
-    return pListItem->GetText();
-  }
+  if (pdfium::IndexInBounds(m_ListItems, nIndex) && m_ListItems[nIndex])
+    return m_ListItems[nIndex]->GetText();
 
   return L"";
 }
diff --git a/fpdfsdk/fxedit/fxet_list.h b/fpdfsdk/fxedit/fxet_list.h
index 00e03d8..65426e0 100644
--- a/fpdfsdk/fxedit/fxet_list.h
+++ b/fpdfsdk/fxedit/fxet_list.h
@@ -8,6 +8,7 @@
 #define FPDFSDK_FXEDIT_FXET_LIST_H_
 
 #include <memory>
+#include <vector>
 
 #include "core/fxcrt/fx_coordinates.h"
 #include "fpdfsdk/fxedit/fx_edit.h"
@@ -168,21 +169,6 @@
   CLST_Rect m_rcContent;  // positive forever!
 };
 
-template <class TYPE>
-class CLST_ArrayTemplate : public CFX_ArrayTemplate<TYPE> {
- public:
-  bool IsEmpty() { return CFX_ArrayTemplate<TYPE>::GetSize() <= 0; }
-  TYPE GetAt(int32_t nIndex) const {
-    if (nIndex >= 0 && nIndex < CFX_ArrayTemplate<TYPE>::GetSize())
-      return CFX_ArrayTemplate<TYPE>::GetAt(nIndex);
-    return nullptr;
-  }
-  void RemoveAt(int32_t nIndex) {
-    if (nIndex >= 0 && nIndex < CFX_ArrayTemplate<TYPE>::GetSize())
-      CFX_ArrayTemplate<TYPE>::RemoveAt(nIndex);
-  }
-};
-
 struct CPLST_Select_Item {
   CPLST_Select_Item(int32_t other_nItemIndex, int32_t other_nState) {
     nItemIndex = other_nItemIndex;
@@ -295,7 +281,7 @@
   int32_t m_nFootIndex;      // for multiple
   bool m_bCtrlSel;           // for multiple
   int32_t m_nCaretIndex;     // for multiple
-  CLST_ArrayTemplate<CFX_ListItem*> m_aListItems;
+  std::vector<std::unique_ptr<CFX_ListItem>> m_ListItems;
   float m_fFontSize;
   IPVT_FontMap* m_pFontMap;
   bool m_bMultiple;
