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;
