Change |CXFA_LayoutPageMgr::m_ProposedViewRecords| to use unique_ptrs.

Change-Id: I9ab7e528c3d51d7482aad9c42cb775d0580b1281
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/53056
Commit-Queue: Lei Zhang <thestig@chromium.org>
Reviewed-by: Tom Sepez <tsepez@chromium.org>
diff --git a/xfa/fxfa/layout/cxfa_layoutpagemgr.cpp b/xfa/fxfa/layout/cxfa_layoutpagemgr.cpp
index e953840..81f9db0 100644
--- a/xfa/fxfa/layout/cxfa_layoutpagemgr.cpp
+++ b/xfa/fxfa/layout/cxfa_layoutpagemgr.cpp
@@ -10,6 +10,7 @@
 
 #include "fxjs/xfa/cfxjse_engine.h"
 #include "fxjs/xfa/cjx_object.h"
+#include "third_party/base/ptr_util.h"
 #include "third_party/base/stl_util.h"
 #include "xfa/fxfa/cxfa_ffnotify.h"
 #include "xfa/fxfa/layout/cxfa_contentlayoutitem.h"
@@ -587,10 +588,16 @@
   return FLT_MAX;
 }
 
+CXFA_ViewRecord* CXFA_LayoutPageMgr::AppendNewRecord(
+    std::unique_ptr<CXFA_ViewRecord> pNewRecord) {
+  m_ProposedViewRecords.push_back(std::move(pNewRecord));
+  return m_ProposedViewRecords.back().get();
+}
+
 CXFA_ViewRecord* CXFA_LayoutPageMgr::CreateViewRecord(CXFA_Node* pPageNode,
                                                       bool bCreateNew) {
   ASSERT(pPageNode);
-  CXFA_ViewRecord* pNewRecord = new CXFA_ViewRecord();
+  auto pNewRecord = pdfium::MakeUnique<CXFA_ViewRecord>();
   if (!HasCurrentViewRecord()) {
     CXFA_Node* pPageSet = pPageNode->GetParent();
     if (pPageSet == m_pTemplatePageSetRoot) {
@@ -602,12 +609,12 @@
       m_pPageSetLayoutItemRoot->AddChild(pPageSetLayoutItem);
       pNewRecord->pCurPageSet = pPageSetLayoutItem;
     }
-    return AppendNewRecord(pNewRecord);
+    return AppendNewRecord(std::move(pNewRecord));
   }
 
   if (!IsPageSetRootOrderedOccurrence()) {
     *pNewRecord = *GetCurrentViewRecord();
-    return AppendNewRecord(pNewRecord);
+    return AppendNewRecord(std::move(pNewRecord));
   }
 
   CXFA_Node* pPageSet = pPageNode->GetParent();
@@ -622,7 +629,7 @@
 
       pNewRecord->pCurPageSet = pParentLayoutItem;
     }
-    return AppendNewRecord(pNewRecord);
+    return AppendNewRecord(std::move(pNewRecord));
   }
 
   CXFA_ViewLayoutItem* pParentPageSetLayout = nullptr;
@@ -646,16 +653,16 @@
     pParentPageSetLayout->AddChild(pPageSetLayoutItem);
   }
   pNewRecord->pCurPageSet = pPageSetLayoutItem;
-  return AppendNewRecord(pNewRecord);
+  return AppendNewRecord(std::move(pNewRecord));
 }
 
 CXFA_ViewRecord* CXFA_LayoutPageMgr::CreateViewRecordSimple() {
-  CXFA_ViewRecord* pNewRecord = new CXFA_ViewRecord();
+  auto pNewRecord = pdfium::MakeUnique<CXFA_ViewRecord>();
   if (HasCurrentViewRecord())
     *pNewRecord = *GetCurrentViewRecord();
   else
     pNewRecord->pCurPageSet = m_pPageSetLayoutItemRoot;
-  return AppendNewRecord(pNewRecord);
+  return AppendNewRecord(std::move(pNewRecord));
 }
 
 void CXFA_LayoutPageMgr::AddPageAreaLayoutItem(CXFA_ViewRecord* pNewRecord,
@@ -1554,12 +1561,11 @@
           GetNextAvailPageArea(nullptr, nullptr, false, true);
       m_pCurPageArea = pSrcPage;
       m_nCurPageCount = nSrcPageCount;
-      CXFA_ViewRecord* pPrevRecord = *psSrcIter++;
+      CXFA_ViewRecord* pPrevRecord = psSrcIter->get();
+      ++psSrcIter;
       while (psSrcIter != m_ProposedViewRecords.end()) {
-        auto psSaveIter = psSrcIter;
-        CXFA_ViewRecord* pInsertRecord = *psSrcIter++;
-        RemoveLayoutRecord(pInsertRecord, pPrevRecord);
-        delete pInsertRecord;
+        auto psSaveIter = psSrcIter++;
+        RemoveLayoutRecord(psSaveIter->get(), pPrevRecord);
         m_ProposedViewRecords.erase(psSaveIter);
       }
       if (pNextPage) {
@@ -1592,11 +1598,6 @@
   if (!m_pTemplatePageSetRoot)
     return;
 
-  auto sPos = m_ProposedViewRecords.begin();
-  while (sPos != m_ProposedViewRecords.end()) {
-    CXFA_ViewRecord* pRecord = *sPos++;
-    delete pRecord;
-  }
   m_ProposedViewRecords.clear();
   m_CurrentViewRecordIter = m_ProposedViewRecords.end();
   m_pCurPageArea = nullptr;
diff --git a/xfa/fxfa/layout/cxfa_layoutpagemgr.h b/xfa/fxfa/layout/cxfa_layoutpagemgr.h
index d91816a..2ebcaf9 100644
--- a/xfa/fxfa/layout/cxfa_layoutpagemgr.h
+++ b/xfa/fxfa/layout/cxfa_layoutpagemgr.h
@@ -10,6 +10,7 @@
 #include <iterator>
 #include <list>
 #include <map>
+#include <memory>
 #include <vector>
 
 #include "third_party/base/optional.h"
@@ -58,6 +59,8 @@
   CXFA_Node* ProcessBookendTrailer(const CXFA_Node* pBookendNode);
 
  private:
+  using RecordList = std::list<std::unique_ptr<CXFA_ViewRecord>>;
+
   bool AppendNewPage(bool bFirstTemPage);
   void ReorderPendingLayoutRecordToTail(CXFA_ViewRecord* pNewRecord,
                                         CXFA_ViewRecord* pPrevRecord);
@@ -66,21 +69,20 @@
   bool HasCurrentViewRecord() const {
     return m_CurrentViewRecordIter != m_ProposedViewRecords.end();
   }
-  CXFA_ViewRecord* GetCurrentViewRecord() { return *m_CurrentViewRecordIter; }
+  CXFA_ViewRecord* GetCurrentViewRecord() {
+    return m_CurrentViewRecordIter->get();
+  }
   const CXFA_ViewRecord* GetCurrentViewRecord() const {
-    return *m_CurrentViewRecordIter;
+    return m_CurrentViewRecordIter->get();
   }
   void ResetToFirstViewRecord() {
     m_CurrentViewRecordIter = m_ProposedViewRecords.begin();
   }
-  std::list<CXFA_ViewRecord*>::iterator GetTailPosition() {
+  RecordList::iterator GetTailPosition() {
     auto iter = m_ProposedViewRecords.end();
     return !m_ProposedViewRecords.empty() ? std::prev(iter) : iter;
   }
-  CXFA_ViewRecord* AppendNewRecord(CXFA_ViewRecord* pNewRecord) {
-    m_ProposedViewRecords.push_back(pNewRecord);
-    return pNewRecord;
-  }
+  CXFA_ViewRecord* AppendNewRecord(std::unique_ptr<CXFA_ViewRecord> pNewRecord);
   CXFA_ViewRecord* CreateViewRecord(CXFA_Node* pPageNode, bool bCreateNew);
   CXFA_ViewRecord* CreateViewRecordSimple();
   void AddPageAreaLayoutItem(CXFA_ViewRecord* pNewRecord,
@@ -152,8 +154,8 @@
   CXFA_Node* m_pTemplatePageSetRoot;
   CXFA_ViewLayoutItem* m_pPageSetLayoutItemRoot;
   CXFA_ViewLayoutItem* m_pPageSetCurRoot;
-  std::list<CXFA_ViewRecord*> m_ProposedViewRecords;
-  std::list<CXFA_ViewRecord*>::iterator m_CurrentViewRecordIter;
+  RecordList m_ProposedViewRecords;
+  RecordList::iterator m_CurrentViewRecordIter;
   CXFA_Node* m_pCurPageArea;
   int32_t m_nAvailPages;
   int32_t m_nCurPageCount;