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;