Use smart pointers for class owned pointers under xfa/fde

Use smart pointer to replace raw pointer type for class
owned member variables so that memory management will
be easier.

BUG=pdfium:518

Review-Url: https://codereview.chromium.org/2208423002
diff --git a/xfa/fde/cfde_txtedtbuf.cpp b/xfa/fde/cfde_txtedtbuf.cpp
index 7af5a18..58f1822 100644
--- a/xfa/fde/cfde_txtedtbuf.cpp
+++ b/xfa/fde/cfde_txtedtbuf.cpp
@@ -16,17 +16,12 @@
 }  // namespace
 
 CFDE_TxtEdtBuf::CFDE_TxtEdtBuf()
-    : m_nChunkSize(kDefaultChunkSize),
-      m_nTotal(0),
-      m_bChanged(FALSE),
-      m_pAllocator(nullptr) {
-  ASSERT(m_nChunkSize);
+    : m_nChunkSize(kDefaultChunkSize), m_nTotal(0), m_bChanged(FALSE) {
   ResetChunkBuffer(kDefaultChunkCount, m_nChunkSize);
 }
 
 CFDE_TxtEdtBuf::~CFDE_TxtEdtBuf() {
   Clear(TRUE);
-  delete m_pAllocator;
   m_Chunks.RemoveAll();
 }
 
@@ -271,8 +266,6 @@
                                       int32_t nChunkSize) {
   ASSERT(nChunkSize);
   ASSERT(nDefChunkCount);
-  delete m_pAllocator;
-  m_pAllocator = nullptr;
   m_Chunks.RemoveAll();
   m_nChunkSize = nChunkSize;
   int32_t nChunkLength =
diff --git a/xfa/fde/cfde_txtedtbuf.h b/xfa/fde/cfde_txtedtbuf.h
index e871ed9..baf67ce 100644
--- a/xfa/fde/cfde_txtedtbuf.h
+++ b/xfa/fde/cfde_txtedtbuf.h
@@ -7,6 +7,8 @@
 #ifndef XFA_FDE_CFDE_TXTEDTBUF_H_
 #define XFA_FDE_CFDE_TXTEDTBUF_H_
 
+#include <memory>
+
 #include "core/fxcrt/include/fx_basic.h"
 #include "core/fxcrt/include/fx_system.h"
 
@@ -55,7 +57,7 @@
   int32_t m_nTotal;
   FX_BOOL m_bChanged;
   CFX_ArrayTemplate<FDE_CHUNKHEADER*> m_Chunks;
-  IFX_MemoryAllocator* m_pAllocator;
+  std::unique_ptr<IFX_MemoryAllocator> m_pAllocator;
 };
 
 #endif  // XFA_FDE_CFDE_TXTEDTBUF_H_
diff --git a/xfa/fde/cfde_txtedtengine.cpp b/xfa/fde/cfde_txtedtengine.cpp
index 8c950f5..e7da157 100644
--- a/xfa/fde/cfde_txtedtengine.cpp
+++ b/xfa/fde/cfde_txtedtengine.cpp
@@ -50,7 +50,7 @@
 FDE_TXTEDT_TEXTCHANGE_INFO::~FDE_TXTEDT_TEXTCHANGE_INFO() {}
 
 CFDE_TxtEdtEngine::CFDE_TxtEdtEngine()
-    : m_pTextBreak(nullptr),
+    : m_pTxtBuf(new CFDE_TxtEdtBuf()),
       m_nPageLineCount(20),
       m_nLineCount(0),
       m_nAnchorPos(-1),
@@ -67,13 +67,10 @@
       m_bAutoLineEnd(TRUE),
       m_wLineEnd(kUnicodeParagraphSeparator) {
   FXSYS_memset(&m_rtCaret, 0, sizeof(CFX_RectF));
-  m_pTxtBuf = new CFDE_TxtEdtBuf();
   m_bAutoLineEnd = (m_Param.nLineEnd == FDE_TXTEDIT_LINEEND_Auto);
 }
 
 CFDE_TxtEdtEngine::~CFDE_TxtEdtEngine() {
-  delete m_pTxtBuf;
-  delete m_pTextBreak;
   RemoveAllParags();
   RemoveAllPages();
   m_Param.pEventSink = nullptr;
@@ -82,7 +79,7 @@
 
 void CFDE_TxtEdtEngine::SetEditParams(const FDE_TXTEDTPARAMS& params) {
   if (!m_pTextBreak)
-    m_pTextBreak = new CFX_TxtBreak(FX_TXTBREAKPOLICY_None);
+    m_pTextBreak.reset(new CFX_TxtBreak(FX_TXTBREAKPOLICY_None));
 
   FXSYS_memcpy(&m_Param, &params, sizeof(FDE_TXTEDTPARAMS));
   m_wLineEnd = params.wLineBreakChar;
@@ -727,7 +724,7 @@
 }
 
 CFDE_TxtEdtBuf* CFDE_TxtEdtEngine::GetTextBuf() const {
-  return m_pTxtBuf;
+  return m_pTxtBuf.get();
 }
 
 int32_t CFDE_TxtEdtEngine::GetTextBufLength() const {
@@ -735,7 +732,7 @@
 }
 
 CFX_TxtBreak* CFDE_TxtEdtEngine::GetTextBreak() const {
-  return m_pTextBreak;
+  return m_pTextBreak.get();
 }
 
 int32_t CFDE_TxtEdtEngine::GetLineCount() const {
@@ -755,10 +752,9 @@
 }
 
 IFX_CharIter* CFDE_TxtEdtEngine::CreateCharIter() {
-  if (!m_pTxtBuf) {
+  if (!m_pTxtBuf)
     return nullptr;
-  }
-  return new CFDE_TxtEdtBufIter(static_cast<CFDE_TxtEdtBuf*>(m_pTxtBuf));
+  return new CFDE_TxtEdtBufIter(m_pTxtBuf.get());
 }
 
 int32_t CFDE_TxtEdtEngine::Line2Parag(int32_t nStartParag,
@@ -986,8 +982,7 @@
   FX_WCHAR wChar = L' ';
   int32_t nParagStart = 0;
   int32_t nIndex = 0;
-  std::unique_ptr<IFX_CharIter> pIter(
-      new CFDE_TxtEdtBufIter(static_cast<CFDE_TxtEdtBuf*>(m_pTxtBuf)));
+  std::unique_ptr<IFX_CharIter> pIter(new CFDE_TxtEdtBufIter(m_pTxtBuf.get()));
   pIter->SetAt(0);
   do {
     wChar = pIter->GetChar();
diff --git a/xfa/fde/cfde_txtedtengine.h b/xfa/fde/cfde_txtedtengine.h
index 4bafce6..9749139 100644
--- a/xfa/fde/cfde_txtedtengine.h
+++ b/xfa/fde/cfde_txtedtengine.h
@@ -7,6 +7,8 @@
 #ifndef XFA_FDE_CFDE_TXTEDTENGINE_H_
 #define XFA_FDE_CFDE_TXTEDTENGINE_H_
 
+#include <memory>
+
 #include "xfa/fde/ifde_txtedtengine.h"
 
 class CFDE_TxtEdtBuf;
@@ -150,8 +152,8 @@
   FX_BOOL IsSelect();
   void DeleteSelect();
 
-  CFDE_TxtEdtBuf* m_pTxtBuf;
-  CFX_TxtBreak* m_pTextBreak;
+  std::unique_ptr<CFDE_TxtEdtBuf> m_pTxtBuf;
+  std::unique_ptr<CFX_TxtBreak> m_pTextBreak;
   FDE_TXTEDTPARAMS m_Param;
   CFX_ArrayTemplate<IFDE_TxtEdtPage*> m_PagePtrArray;
   CFX_ArrayTemplate<CFDE_TxtEdtParag*> m_ParagPtrArray;
diff --git a/xfa/fde/cfde_txtedtpage.cpp b/xfa/fde/cfde_txtedtpage.cpp
index a31997f..2142099 100644
--- a/xfa/fde/cfde_txtedtpage.cpp
+++ b/xfa/fde/cfde_txtedtpage.cpp
@@ -29,7 +29,7 @@
 }
 
 CFDE_TxtEdtPage::CFDE_TxtEdtPage(CFDE_TxtEdtEngine* pEngine, int32_t nPageIndex)
-    : m_pTextSet(nullptr),
+    : m_pEditEngine(pEngine),
       m_PieceMassArr(100),
       m_pBgnParag(nullptr),
       m_pEndParag(nullptr),
@@ -37,19 +37,15 @@
       m_nPageStart(-1),
       m_nCharCount(0),
       m_nPageIndex(nPageIndex),
-      m_bLoaded(FALSE),
-      m_pCharWidth(nullptr) {
+      m_bLoaded(FALSE) {
   FXSYS_memset(&m_rtPage, 0, sizeof(CFX_RectF));
   FXSYS_memset(&m_rtPageMargin, 0, sizeof(CFX_RectF));
   FXSYS_memset(&m_rtPageContents, 0, sizeof(CFX_RectF));
   FXSYS_memset(&m_rtPageCanvas, 0, sizeof(CFX_RectF));
-  m_pEditEngine = static_cast<CFDE_TxtEdtEngine*>(pEngine);
 }
 
 CFDE_TxtEdtPage::~CFDE_TxtEdtPage() {
   m_PieceMassArr.RemoveAll(TRUE);
-  delete m_pTextSet;
-  delete[] m_pCharWidth;
 }
 
 CFDE_TxtEdtEngine* CFDE_TxtEdtPage::GetEngine() const {
@@ -308,14 +304,13 @@
       (bVertial && bLineReserve) ? (-pParams->fLineSpace) : pParams->fLineSpace;
   FX_FLOAT fLinePos = fLineStart;
   if (!m_pTextSet)
-    m_pTextSet = new CFDE_TxtEdtTextSet(this);
+    m_pTextSet.reset(new CFDE_TxtEdtTextSet(this));
 
   m_PieceMassArr.RemoveAll(TRUE);
   uint32_t dwBreakStatus = FX_TXTBREAK_None;
   int32_t nPieceStart = 0;
-  delete[] m_pCharWidth;
 
-  m_pCharWidth = new int32_t[nPageEnd - nPageStart + 1];
+  m_CharWidths.resize(nPageEnd - nPageStart + 1, 0);
   pBreak->EndBreak(FX_TXTBREAK_ParagraphBreak);
   pBreak->ClearBreakPieces();
   m_nPageStart = nPageStart;
@@ -394,7 +389,7 @@
         m_PieceMassArr.Add(TxtEdtPiece);
         for (int32_t k = 0; k < TxtEdtPiece.nCount; k++) {
           CFX_Char* ptc = pPiece->GetCharPtr(k);
-          m_pCharWidth[TxtEdtPiece.nStart + k] = ptc->m_iCharWidth;
+          m_CharWidths[TxtEdtPiece.nStart + k] = ptc->m_iCharWidth;
         }
       }
       fLinePos += fLineStep;
@@ -448,10 +443,8 @@
     return;
 
   m_PieceMassArr.RemoveAll(FALSE);
-  delete m_pTextSet;
-  m_pTextSet = nullptr;
-  delete[] m_pCharWidth;
-  m_pCharWidth = nullptr;
+  m_pTextSet.reset();
+  m_CharWidths.clear();
   if (m_pBgnParag) {
     m_pBgnParag->UnloadParag();
     m_pBgnParag = nullptr;
@@ -480,7 +473,7 @@
     return nullptr;
   }
   int32_t nPos = (int32_t)(uintptr_t)pos;
-  pVisualSet = m_pTextSet;
+  pVisualSet = m_pTextSet.get();
   if (nPos + 1 > m_PieceMassArr.GetSize()) {
     pos = nullptr;
   } else {
@@ -502,7 +495,7 @@
 
 int32_t CFDE_TxtEdtPage::GetWidth(const FDE_TEXTEDITPIECE* pIdentity,
                                   int32_t index) const {
-  int32_t nWidth = m_pCharWidth[pIdentity->nStart + index];
+  int32_t nWidth = m_CharWidths[pIdentity->nStart + index];
   return nWidth;
 }
 
diff --git a/xfa/fde/cfde_txtedtpage.h b/xfa/fde/cfde_txtedtpage.h
index 9adaee1..777f829 100644
--- a/xfa/fde/cfde_txtedtpage.h
+++ b/xfa/fde/cfde_txtedtpage.h
@@ -7,6 +7,9 @@
 #ifndef XFA_FDE_CFDE_TXTEDTPAGE_H_
 #define XFA_FDE_CFDE_TXTEDTPAGE_H_
 
+#include <memory>
+#include <vector>
+
 #include "xfa/fde/ifde_txtedtpage.h"
 #include "xfa/fde/ifx_chariter.h"
 
@@ -60,8 +63,8 @@
                         FX_FLOAT fTolerance) const;
 
   std::unique_ptr<IFX_CharIter> m_pIter;
-  CFDE_TxtEdtTextSet* m_pTextSet;
-  CFDE_TxtEdtEngine* m_pEditEngine;
+  std::unique_ptr<CFDE_TxtEdtTextSet> m_pTextSet;
+  CFDE_TxtEdtEngine* const m_pEditEngine;
   CFX_MassArrayTemplate<FDE_TEXTEDITPIECE> m_PieceMassArr;
   CFDE_TxtEdtParag* m_pBgnParag;
   CFDE_TxtEdtParag* m_pEndParag;
@@ -74,7 +77,7 @@
   CFX_RectF m_rtPageMargin;
   CFX_RectF m_rtPageContents;
   CFX_RectF m_rtPageCanvas;
-  int32_t* m_pCharWidth;
+  std::vector<int32_t> m_CharWidths;
 };
 
 #endif  // XFA_FDE_CFDE_TXTEDTPAGE_H_
diff --git a/xfa/fde/css/fde_cssstyleselector.cpp b/xfa/fde/css/fde_cssstyleselector.cpp
index 6a1a0b0..b68ace8 100644
--- a/xfa/fde/css/fde_cssstyleselector.cpp
+++ b/xfa/fde/css/fde_cssstyleselector.cpp
@@ -27,6 +27,7 @@
   }
   return -1;
 }
+
 void CFDE_CSSCounterStyle::DoUpdateIndex(IFDE_CSSValueList* pList) {
   if (!pList)
     return;
@@ -105,13 +106,8 @@
   }
 }
 
-CFDE_CSSStyleSelector::CFDE_CSSStyleSelector()
-    : m_pFontMgr(nullptr),
-      m_fDefFontSize(12.0f),
-      m_pRuleDataStore(nullptr),
-      m_pInlineStyleStore(nullptr),
-      m_pFixedStyleStore(nullptr),
-      m_pAccelerator(nullptr) {
+CFDE_CSSStyleSelector::CFDE_CSSStyleSelector(IFGAS_FontMgr* pFontMgr)
+    : m_pFontMgr(pFontMgr), m_fDefFontSize(12.0f) {
   m_ePriorities[FDE_CSSSTYLESHEETPRIORITY_High] = FDE_CSSSTYLESHEETGROUP_Author;
   m_ePriorities[FDE_CSSSTYLESHEETPRIORITY_Mid] = FDE_CSSSTYLESHEETGROUP_User;
   m_ePriorities[FDE_CSSSTYLESHEETPRIORITY_Low] =
@@ -120,14 +116,8 @@
 
 CFDE_CSSStyleSelector::~CFDE_CSSStyleSelector() {
   Reset();
-  delete m_pInlineStyleStore;
-  delete m_pFixedStyleStore;
-  delete m_pAccelerator;
 }
 
-void CFDE_CSSStyleSelector::SetFontMgr(IFGAS_FontMgr* pFontMgr) {
-  m_pFontMgr = pFontMgr;
-}
 void CFDE_CSSStyleSelector::SetDefFontSize(FX_FLOAT fFontSize) {
   ASSERT(fFontSize > 0);
   m_fDefFontSize = fFontSize;
@@ -135,9 +125,9 @@
 
 CFDE_CSSAccelerator* CFDE_CSSStyleSelector::InitAccelerator() {
   if (!m_pAccelerator)
-    m_pAccelerator = new CFDE_CSSAccelerator;
+    m_pAccelerator.reset(new CFDE_CSSAccelerator);
   m_pAccelerator->Clear();
-  return m_pAccelerator;
+  return m_pAccelerator.get();
 }
 
 IFDE_CSSComputedStyle* CFDE_CSSStyleSelector::CreateComputedStyle(
@@ -146,8 +136,8 @@
     m_pFixedStyleStore = IFX_MemoryAllocator::Create(
         FX_ALLOCTYPE_Fixed, 16, sizeof(CFDE_CSSComputedStyle));
   }
-  CFDE_CSSComputedStyle* pStyle = FXTARGET_NewWith(m_pFixedStyleStore)
-      CFDE_CSSComputedStyle(m_pFixedStyleStore);
+  CFDE_CSSComputedStyle* pStyle = FXTARGET_NewWith(m_pFixedStyleStore.get())
+      CFDE_CSSComputedStyle(m_pFixedStyleStore.get());
   if (pParentStyle) {
     pStyle->m_InheritedData =
         static_cast<CFDE_CSSComputedStyle*>(pParentStyle)->m_InheritedData;
@@ -157,6 +147,7 @@
   pStyle->m_NonInheritedData.Reset();
   return pStyle;
 }
+
 FX_BOOL CFDE_CSSStyleSelector::SetStyleSheet(FDE_CSSSTYLESHEETGROUP eType,
                                              IFDE_CSSStyleSheet* pSheet) {
   ASSERT(eType < FDE_CSSSTYLESHEETGROUP_MAX);
@@ -166,6 +157,7 @@
     dest.Add(pSheet);
   return TRUE;
 }
+
 FX_BOOL CFDE_CSSStyleSelector::SetStyleSheets(
     FDE_CSSSTYLESHEETGROUP eType,
     const CFDE_CSSStyleSheetArray* pArray) {
@@ -177,27 +169,30 @@
     dest.RemoveAt(0, dest.GetSize());
   return TRUE;
 }
+
 void CFDE_CSSStyleSelector::SetStylePriority(
     FDE_CSSSTYLESHEETGROUP eType,
     FDE_CSSSTYLESHEETPRIORITY ePriority) {
   m_ePriorities[ePriority] = eType;
 }
+
 void CFDE_CSSStyleSelector::UpdateStyleIndex(uint32_t dwMediaList) {
   Reset();
   m_pRuleDataStore = IFX_MemoryAllocator::Create(FX_ALLOCTYPE_Static, 1024, 0);
   for (int32_t iGroup = 0; iGroup < FDE_CSSSTYLESHEETGROUP_MAX; ++iGroup) {
     CFDE_CSSRuleCollection& rules = m_RuleCollection[iGroup];
-    rules.m_pStaticStore = m_pRuleDataStore;
+    rules.m_pStaticStore = m_pRuleDataStore.get();
     rules.AddRulesFrom(m_SheetGroups[iGroup], dwMediaList, m_pFontMgr);
   }
 }
+
 void CFDE_CSSStyleSelector::Reset() {
   for (int32_t iGroup = 0; iGroup < FDE_CSSSTYLESHEETGROUP_MAX; ++iGroup) {
     m_RuleCollection[iGroup].Clear();
   }
-  delete m_pRuleDataStore;
-  m_pRuleDataStore = nullptr;
+  m_pRuleDataStore.reset();
 }
+
 int32_t CFDE_CSSStyleSelector::MatchDeclarations(
     CXFA_CSSTagProvider* pTag,
     CFDE_CSSDeclarationArray& matchedDecls,
@@ -325,16 +320,18 @@
       uint32_t dwAttriHash = FX_HashCode_GetW(wsAttri.AsStringC(), true);
       if (dwAttriHash == s_dwStyleHash) {
         if (!pDecl)
-          pDecl = FXTARGET_NewWith(m_pInlineStyleStore) CFDE_CSSDeclaration;
+          pDecl =
+              FXTARGET_NewWith(m_pInlineStyleStore.get()) CFDE_CSSDeclaration;
 
         AppendInlineStyle(pDecl, wsValue.c_str(), wsValue.GetLength());
       } else if (dwAttriHash == s_dwAlignHash) {
         if (!pDecl)
-          pDecl = FXTARGET_NewWith(m_pInlineStyleStore) CFDE_CSSDeclaration;
+          pDecl =
+              FXTARGET_NewWith(m_pInlineStyleStore.get()) CFDE_CSSDeclaration;
 
         FDE_CSSPROPERTYARGS args;
         args.pStringCache = nullptr;
-        args.pStaticStore = m_pInlineStyleStore;
+        args.pStaticStore = m_pInlineStyleStore.get();
         args.pProperty = FDE_GetCSSPropertyByEnum(FDE_CSSPROPERTY_TextAlign);
         pDecl->AddProperty(&args, wsValue.c_str(), wsValue.GetLength());
       }
@@ -431,6 +428,7 @@
     }
   }
 }
+
 void CFDE_CSSStyleSelector::AppendInlineStyle(CFDE_CSSDeclaration* pDecl,
                                               const FX_WCHAR* psz,
                                               int32_t iLen) {
@@ -443,7 +441,7 @@
   const FX_WCHAR* psz2;
   FDE_CSSPROPERTYARGS args;
   args.pStringCache = nullptr;
-  args.pStaticStore = m_pInlineStyleStore;
+  args.pStaticStore = m_pInlineStyleStore.get();
   args.pProperty = nullptr;
   CFX_WideString wsName;
   while (1) {
@@ -1016,6 +1014,7 @@
     ASSERT(FALSE);
   }
 }
+
 FX_FLOAT CFDE_CSSStyleSelector::ApplyNumber(FDE_CSSPRIMITIVETYPE eUnit,
                                             FX_FLOAT fValue,
                                             FX_FLOAT fPercentBase) {
@@ -1042,6 +1041,7 @@
       return fValue;
   }
 }
+
 FDE_CSSRUBYSPAN CFDE_CSSStyleSelector::ToRubySpan(FDE_CSSPROPERTYVALUE eValue) {
   switch (eValue) {
     case FDE_CSSPROPERTYVALUE_None:
@@ -1049,6 +1049,7 @@
       return FDE_CSSRUBYSPAN_None;
   }
 }
+
 FDE_CSSRUBYPOSITION CFDE_CSSStyleSelector::ToRubyPosition(
     FDE_CSSPROPERTYVALUE eValue) {
   switch (eValue) {
@@ -1064,6 +1065,7 @@
       return FDE_CSSRUBYPOSITION_Before;
   }
 }
+
 FDE_CSSRUBYOVERHANG CFDE_CSSStyleSelector::ToRubyOverhang(
     FDE_CSSPROPERTYVALUE eValue) {
   switch (eValue) {
@@ -1078,6 +1080,7 @@
       return FDE_CSSRUBYOVERHANG_None;
   }
 }
+
 FDE_CSSRUBYALIGN CFDE_CSSStyleSelector::ToRubyAlign(
     FDE_CSSPROPERTYVALUE eValue) {
   switch (eValue) {
@@ -1103,6 +1106,7 @@
       return FDE_CSSRUBYALIGN_Auto;
   }
 }
+
 FX_BOOL CFDE_CSSStyleSelector::ToTextEmphasisMark(
     FDE_CSSPROPERTYVALUE eValue,
     FDE_CSSTEXTEMPHASISMARK& eMark) {
@@ -1129,6 +1133,7 @@
       return FALSE;
   }
 }
+
 FX_BOOL CFDE_CSSStyleSelector::ToTextEmphasisFill(
     FDE_CSSPROPERTYVALUE eValue,
     FDE_CSSTEXTEMPHASISFILL& eFill) {
@@ -1143,6 +1148,7 @@
       return FALSE;
   }
 }
+
 FDE_CSSBKGATTACHMENT CFDE_CSSStyleSelector::ToBKGAttachment(
     FDE_CSSPROPERTYVALUE eValue) {
   switch (eValue) {
@@ -1154,6 +1160,7 @@
       return FDE_CSSBKGATTACHMENT_Fixed;
   }
 }
+
 FDE_CSSCAPTIONSIDE CFDE_CSSStyleSelector::ToCaptionSide(
     FDE_CSSPROPERTYVALUE eValue) {
   switch (eValue) {
@@ -1173,6 +1180,7 @@
       return FDE_CSSCAPTIONSIDE_Top;
   }
 }
+
 FDE_CSSPOSITION CFDE_CSSStyleSelector::ToPosition(FDE_CSSPROPERTYVALUE eValue) {
   switch (eValue) {
     case FDE_CSSPROPERTYVALUE_Static:
@@ -1187,6 +1195,7 @@
       return FDE_CSSPOSITION_Static;
   }
 }
+
 FDE_CSSCURSOR CFDE_CSSStyleSelector::ToCursor(FDE_CSSPROPERTYVALUE eValue) {
   switch (eValue) {
     case FDE_CSSPROPERTYVALUE_Auto:
@@ -1215,6 +1224,7 @@
       return FDE_CSSCURSOR_Auto;
   }
 }
+
 FDE_CSSBKGREPEAT CFDE_CSSStyleSelector::ToBKGRepeat(
     FDE_CSSPROPERTYVALUE eValue) {
   switch (eValue) {
@@ -1230,6 +1240,7 @@
       return FDE_CSSBKGREPEAT_Repeat;
   }
 }
+
 FDE_CSSTEXTCOMBINE CFDE_CSSStyleSelector::ToTextCombine(
     FDE_CSSPROPERTYVALUE eValue) {
   switch (eValue) {
@@ -1240,6 +1251,7 @@
       return FDE_CSSTEXTCOMBINE_None;
   }
 }
+
 FDE_CSSLINEBREAK CFDE_CSSStyleSelector::ToLineBreak(
     FDE_CSSPROPERTYVALUE eValue) {
   switch (eValue) {
@@ -1255,6 +1267,7 @@
       return FDE_CSSLINEBREAK_Auto;
   }
 }
+
 FDE_CSSOVERFLOW CFDE_CSSStyleSelector::ToOverflow(FDE_CSSPROPERTYVALUE eValue) {
   switch (eValue) {
     case FDE_CSSPROPERTYVALUE_Visible:
@@ -1273,6 +1286,7 @@
       return FDE_CSSOVERFLOW_Visible;
   }
 }
+
 FDE_CSSWRITINGMODE CFDE_CSSStyleSelector::ToWritingMode(
     FDE_CSSPROPERTYVALUE eValue) {
   switch (eValue) {
@@ -1286,6 +1300,7 @@
       return FDE_CSSWRITINGMODE_HorizontalTb;
   }
 }
+
 FDE_CSSWORDBREAK CFDE_CSSStyleSelector::ToWordBreak(
     FDE_CSSPROPERTYVALUE eValue) {
   switch (eValue) {
@@ -1301,6 +1316,7 @@
       return FDE_CSSWORDBREAK_Normal;
   }
 }
+
 FDE_CSSFLOAT CFDE_CSSStyleSelector::ToFloat(FDE_CSSPROPERTYVALUE eValue) {
   switch (eValue) {
     case FDE_CSSPROPERTYVALUE_Left:
@@ -1313,6 +1329,7 @@
       return FDE_CSSFLOAT_None;
   }
 }
+
 FDE_CSSCLEAR CFDE_CSSStyleSelector::ToClear(FDE_CSSPROPERTYVALUE eValue) {
   switch (eValue) {
     case FDE_CSSPROPERTYVALUE_None:
@@ -1327,6 +1344,7 @@
       return FDE_CSSCLEAR_None;
   }
 }
+
 FDE_CSSPAGEBREAK CFDE_CSSStyleSelector::ToPageBreak(
     FDE_CSSPROPERTYVALUE eValue) {
   switch (eValue) {
@@ -1344,6 +1362,7 @@
       return FDE_CSSPAGEBREAK_Auto;
   }
 }
+
 FDE_CSSDISPLAY CFDE_CSSStyleSelector::ToDisplay(FDE_CSSPROPERTYVALUE eValue) {
   switch (eValue) {
     case FDE_CSSPROPERTYVALUE_Inline:
@@ -1392,6 +1411,7 @@
       return FDE_CSSDISPLAY_Inline;
   }
 }
+
 FDE_CSSTEXTALIGN CFDE_CSSStyleSelector::ToTextAlign(
     FDE_CSSPROPERTYVALUE eValue) {
   switch (eValue) {
@@ -1407,6 +1427,7 @@
       return FDE_CSSTEXTALIGN_Left;
   }
 }
+
 uint16_t CFDE_CSSStyleSelector::ToFontWeight(FDE_CSSPROPERTYVALUE eValue) {
   switch (eValue) {
     case FDE_CSSPROPERTYVALUE_Normal:
@@ -1421,6 +1442,7 @@
       return 400;
   }
 }
+
 FDE_CSSFONTSTYLE CFDE_CSSStyleSelector::ToFontStyle(
     FDE_CSSPROPERTYVALUE eValue) {
   switch (eValue) {
@@ -1431,6 +1453,7 @@
       return FDE_CSSFONTSTYLE_Normal;
   }
 }
+
 FDE_CSSBORDERSTYLE CFDE_CSSStyleSelector::ToBorderStyle(
     FDE_CSSPROPERTYVALUE eValue) {
   switch (eValue) {
@@ -1458,6 +1481,7 @@
       return FDE_CSSBORDERSTYLE_None;
   }
 }
+
 FX_BOOL CFDE_CSSStyleSelector::SetLengthWithPercent(
     FDE_CSSLENGTH& width,
     FDE_CSSPRIMITIVETYPE eType,
@@ -1494,6 +1518,7 @@
   }
   return FALSE;
 }
+
 FX_FLOAT CFDE_CSSStyleSelector::ToFontSize(FDE_CSSPROPERTYVALUE eValue,
                                            FX_FLOAT fCurFontSize) {
   switch (eValue) {
@@ -1519,6 +1544,7 @@
       return fCurFontSize;
   }
 }
+
 FDE_CSSVERTICALALIGN CFDE_CSSStyleSelector::ToVerticalAlign(
     FDE_CSSPROPERTYVALUE eValue) {
   switch (eValue) {
@@ -1542,6 +1568,7 @@
       return FDE_CSSVERTICALALIGN_Baseline;
   }
 }
+
 FDE_CSSLISTSTYLETYPE CFDE_CSSStyleSelector::ToListStyleType(
     FDE_CSSPROPERTYVALUE eValue) {
   switch (eValue) {
@@ -1591,12 +1618,14 @@
       return FDE_CSSLISTSTYLETYPE_Disc;
   }
 }
+
 FDE_CSSLISTSTYLEPOSITION CFDE_CSSStyleSelector::ToListStylePosition(
     FDE_CSSPROPERTYVALUE eValue) {
   return eValue == FDE_CSSPROPERTYVALUE_Inside
              ? FDE_CSSLISTSTYLEPOSITION_Inside
              : FDE_CSSLISTSTYLEPOSITION_Outside;
 }
+
 FDE_CSSVISIBILITY CFDE_CSSStyleSelector::ToVisibility(
     FDE_CSSPROPERTYVALUE eValue) {
   switch (eValue) {
@@ -1610,6 +1639,7 @@
       return FDE_CSSVISIBILITY_Visible;
   }
 }
+
 FDE_CSSWHITESPACE CFDE_CSSStyleSelector::ToWhiteSpace(
     FDE_CSSPROPERTYVALUE eValue) {
   switch (eValue) {
@@ -1627,6 +1657,7 @@
       return FDE_CSSWHITESPACE_Normal;
   }
 }
+
 uint32_t CFDE_CSSStyleSelector::ToTextDecoration(IFDE_CSSValueList* pValue) {
   uint32_t dwDecoration = 0;
   for (int32_t i = pValue->CountValues() - 1; i >= 0; --i) {
@@ -1656,6 +1687,7 @@
   }
   return dwDecoration;
 }
+
 FDE_CSSTEXTTRANSFORM CFDE_CSSStyleSelector::ToTextTransform(
     FDE_CSSPROPERTYVALUE eValue) {
   switch (eValue) {
@@ -1671,6 +1703,7 @@
       return FDE_CSSTEXTTRANSFORM_None;
   }
 }
+
 FDE_CSSFONTVARIANT CFDE_CSSStyleSelector::ToFontVariant(
     FDE_CSSPROPERTYVALUE eValue) {
   return eValue == FDE_CSSPROPERTYVALUE_SmallCaps ? FDE_CSSFONTVARIANT_SmallCaps
diff --git a/xfa/fde/css/fde_cssstyleselector.h b/xfa/fde/css/fde_cssstyleselector.h
index 042e989..469712f 100644
--- a/xfa/fde/css/fde_cssstyleselector.h
+++ b/xfa/fde/css/fde_cssstyleselector.h
@@ -7,6 +7,7 @@
 #ifndef XFA_FDE_CSS_FDE_CSSSTYLESELECTOR_H_
 #define XFA_FDE_CSS_FDE_CSSSTYLESELECTOR_H_
 
+#include <memory>
 #include <vector>
 
 #include "core/fxcrt/include/fx_ext.h"
@@ -26,8 +27,8 @@
                   CFDE_CSSDeclaration* pDecl,
                   uint32_t dwPos);
 
-  CFDE_CSSSelector* pSelector;
-  CFDE_CSSDeclaration* pDeclaration;
+  CFDE_CSSSelector* const pSelector;
+  CFDE_CSSDeclaration* const pDeclaration;
   uint32_t dwPriority;
   FDE_CSSRuleData* pNext;
 };
@@ -88,10 +89,9 @@
 
 class CFDE_CSSStyleSelector : public CFX_Target {
  public:
-  CFDE_CSSStyleSelector();
+  explicit CFDE_CSSStyleSelector(IFGAS_FontMgr* pFontMgr);
   ~CFDE_CSSStyleSelector() override;
 
-  void SetFontMgr(IFGAS_FontMgr* pFontMgr);
   void SetDefFontSize(FX_FLOAT fFontSize);
 
   FX_BOOL SetStyleSheet(FDE_CSSSTYLESHEETGROUP eType,
@@ -174,15 +174,15 @@
   FDE_CSSRUBYPOSITION ToRubyPosition(FDE_CSSPROPERTYVALUE eValue);
   FDE_CSSRUBYSPAN ToRubySpan(FDE_CSSPROPERTYVALUE eValue);
 
-  IFGAS_FontMgr* m_pFontMgr;
+  IFGAS_FontMgr* const m_pFontMgr;
   FX_FLOAT m_fDefFontSize;
-  IFX_MemoryAllocator* m_pRuleDataStore;
+  std::unique_ptr<IFX_MemoryAllocator> m_pRuleDataStore;
   CFDE_CSSStyleSheetArray m_SheetGroups[FDE_CSSSTYLESHEETGROUP_MAX];
   CFDE_CSSRuleCollection m_RuleCollection[FDE_CSSSTYLESHEETGROUP_MAX];
   FDE_CSSSTYLESHEETGROUP m_ePriorities[FDE_CSSSTYLESHEETPRIORITY_MAX];
-  IFX_MemoryAllocator* m_pInlineStyleStore;
-  IFX_MemoryAllocator* m_pFixedStyleStore;
-  CFDE_CSSAccelerator* m_pAccelerator;
+  std::unique_ptr<IFX_MemoryAllocator> m_pInlineStyleStore;
+  std::unique_ptr<IFX_MemoryAllocator> m_pFixedStyleStore;
+  std::unique_ptr<CFDE_CSSAccelerator> m_pAccelerator;
   std::vector<FDE_CSSRuleData*> m_MatchedRules;
 };
 
@@ -413,7 +413,7 @@
                       const CFX_WideString& wsValue);
 
   uint32_t m_dwRefCount;
-  IFX_MemoryAllocator* m_pAllocator;
+  IFX_MemoryAllocator* const m_pAllocator;
   CFDE_CSSInheritedData m_InheritedData;
   CFDE_CSSNonInheritedData m_NonInheritedData;
   CFX_WideStringArray m_CustomProperties;
diff --git a/xfa/fde/css/fde_cssstylesheet.cpp b/xfa/fde/css/fde_cssstylesheet.cpp
index 99beab8..bc94cc2 100644
--- a/xfa/fde/css/fde_cssstylesheet.cpp
+++ b/xfa/fde/css/fde_cssstylesheet.cpp
@@ -78,7 +78,6 @@
     : m_wCodePage(FX_CODEPAGE_UTF8),
       m_wRefCount(1),
       m_dwMediaList(dwMediaList),
-      m_pAllocator(nullptr),
       m_RuleArray(100) {
   ASSERT(m_dwMediaList > 0);
 }
@@ -108,8 +107,7 @@
   m_RuleArray.RemoveAll(FALSE);
   m_Selectors.RemoveAll();
   m_StringCache.clear();
-  delete m_pAllocator;
-  m_pAllocator = nullptr;
+  m_pAllocator.reset();
 }
 
 uint32_t CFDE_CSSStyleSheet::Retain() {
@@ -228,8 +226,8 @@
         break;
       case FDE_CSSSYNTAXSTATUS_DeclOpen:
         if ((dwMediaList & m_dwMediaList) > 0 && !pMediaRule) {
-          pMediaRule =
-              FXTARGET_NewWith(m_pAllocator) CFDE_CSSMediaRule(dwMediaList);
+          pMediaRule = FXTARGET_NewWith(m_pAllocator.get())
+              CFDE_CSSMediaRule(dwMediaList);
           m_RuleArray.Add(pMediaRule);
         }
         break;
@@ -248,7 +246,7 @@
   const FX_WCHAR* pszValue = nullptr;
   int32_t iValueLen = 0;
   FDE_CSSPROPERTYARGS propertyArgs;
-  propertyArgs.pStaticStore = m_pAllocator;
+  propertyArgs.pStaticStore = m_pAllocator.get();
   propertyArgs.pStringCache = &m_StringCache;
   propertyArgs.pProperty = nullptr;
   CFX_WideString wsName;
@@ -256,8 +254,8 @@
     switch (pSyntax->DoSyntaxParse()) {
       case FDE_CSSSYNTAXSTATUS_Selector: {
         pszValue = pSyntax->GetCurrentString(iValueLen);
-        CFDE_CSSSelector* pSelector =
-            CFDE_CSSSelector::FromString(m_pAllocator, pszValue, iValueLen);
+        CFDE_CSSSelector* pSelector = CFDE_CSSSelector::FromString(
+            m_pAllocator.get(), pszValue, iValueLen);
         if (pSelector)
           m_Selectors.Add(pSelector);
       } break;
@@ -286,8 +284,8 @@
         break;
       case FDE_CSSSYNTAXSTATUS_DeclOpen:
         if (!pStyleRule && m_Selectors.GetSize() > 0) {
-          pStyleRule = FXTARGET_NewWith(m_pAllocator) CFDE_CSSStyleRule;
-          pStyleRule->SetSelector(m_pAllocator, m_Selectors);
+          pStyleRule = FXTARGET_NewWith(m_pAllocator.get()) CFDE_CSSStyleRule;
+          pStyleRule->SetSelector(m_pAllocator.get(), m_Selectors);
           ruleArray.Add(pStyleRule);
         } else {
           SkipRuleSet(pSyntax);
@@ -312,7 +310,7 @@
   const FX_WCHAR* pszValue = nullptr;
   int32_t iValueLen = 0;
   FDE_CSSPROPERTYARGS propertyArgs;
-  propertyArgs.pStaticStore = m_pAllocator;
+  propertyArgs.pStaticStore = m_pAllocator.get();
   propertyArgs.pStringCache = &m_StringCache;
   propertyArgs.pProperty = nullptr;
   for (;;) {
@@ -333,7 +331,8 @@
         break;
       case FDE_CSSSYNTAXSTATUS_DeclOpen:
         if (!pFontFaceRule) {
-          pFontFaceRule = FXTARGET_NewWith(m_pAllocator) CFDE_CSSFontFaceRule;
+          pFontFaceRule =
+              FXTARGET_NewWith(m_pAllocator.get()) CFDE_CSSFontFaceRule;
           ruleArray.Add(pFontFaceRule);
         }
         break;
diff --git a/xfa/fde/css/fde_cssstylesheet.h b/xfa/fde/css/fde_cssstylesheet.h
index d4781f8..b013e2d 100644
--- a/xfa/fde/css/fde_cssstylesheet.h
+++ b/xfa/fde/css/fde_cssstylesheet.h
@@ -7,6 +7,7 @@
 #ifndef XFA_FDE_CSS_FDE_CSSSTYLESHEET_H_
 #define XFA_FDE_CSS_FDE_CSSSTYLESHEET_H_
 
+#include <memory>
 #include <unordered_map>
 
 #include "core/fxcrt/include/fx_ext.h"
@@ -133,7 +134,7 @@
   uint16_t m_wCodePage;
   uint16_t m_wRefCount;
   uint32_t m_dwMediaList;
-  IFX_MemoryAllocator* m_pAllocator;
+  std::unique_ptr<IFX_MemoryAllocator> m_pAllocator;
   CFX_MassArrayTemplate<IFDE_CSSRule*> m_RuleArray;
   CFX_WideString m_szUrl;
   CFX_ArrayTemplate<CFDE_CSSSelector*> m_Selectors;
diff --git a/xfa/fde/fde_gedevice.cpp b/xfa/fde/fde_gedevice.cpp
index 56f845c..3612966 100644
--- a/xfa/fde/fde_gedevice.cpp
+++ b/xfa/fde/fde_gedevice.cpp
@@ -17,7 +17,6 @@
                                      FX_BOOL bOwnerDevice)
     : m_pDevice(pDevice),
       m_bOwnerDevice(bOwnerDevice),
-      m_pCharPos(nullptr),
       m_iCharCount(0) {
   ASSERT(pDevice);
 
@@ -27,7 +26,6 @@
 }
 
 CFDE_RenderDevice::~CFDE_RenderDevice() {
-  FX_Free(m_pCharPos);
   if (m_bOwnerDevice)
     delete m_pDevice;
 }
diff --git a/xfa/fde/fde_gedevice.h b/xfa/fde/fde_gedevice.h
index 2d2a901..bb06cf6 100644
--- a/xfa/fde/fde_gedevice.h
+++ b/xfa/fde/fde_gedevice.h
@@ -116,10 +116,9 @@
                     FX_FLOAT fPenWidth,
                     CFX_GraphStateData& graphState);
 
-  CFX_RenderDevice* m_pDevice;
+  CFX_RenderDevice* const m_pDevice;
   CFX_RectF m_rtClip;
   FX_BOOL m_bOwnerDevice;
-  FXTEXT_CHARPOS* m_pCharPos;
   int32_t m_iCharCount;
 };
 
diff --git a/xfa/fde/fde_render.cpp b/xfa/fde/fde_render.cpp
index e2c395e..f3189b0 100644
--- a/xfa/fde/fde_render.cpp
+++ b/xfa/fde/fde_render.cpp
@@ -16,9 +16,7 @@
 CFDE_RenderContext::CFDE_RenderContext()
     : m_eStatus(FDE_RENDERSTATUS_Reset),
       m_pRenderDevice(nullptr),
-      m_Transform(),
-      m_pCharPos(nullptr),
-      m_iCharPosCount(0) {
+      m_Transform() {
   m_Transform.SetIdentity();
 }
 
@@ -101,9 +99,7 @@
   m_Transform.SetIdentity();
   m_pIterator.reset();
   m_pBrush.reset();
-  FX_Free(m_pCharPos);
-  m_pCharPos = nullptr;
-  m_iCharPosCount = 0;
+  m_CharPos.clear();
 }
 
 void CFDE_RenderContext::RenderText(IFDE_TextSet* pTextSet,
@@ -122,19 +118,14 @@
   if (!m_pBrush)
     m_pBrush.reset(new CFDE_Brush);
 
-  if (!m_pCharPos)
-    m_pCharPos = FX_Alloc(FXTEXT_CHARPOS, iCount);
-  else if (m_iCharPosCount < iCount)
-    m_pCharPos = FX_Realloc(FXTEXT_CHARPOS, m_pCharPos, iCount);
+  if (m_CharPos.size() < static_cast<size_t>(iCount))
+    m_CharPos.resize(iCount, FXTEXT_CHARPOS());
 
-  if (m_iCharPosCount < iCount)
-    m_iCharPosCount = iCount;
-
-  iCount = pTextSet->GetDisplayPos(pText, m_pCharPos, FALSE);
+  iCount = pTextSet->GetDisplayPos(pText, m_CharPos.data(), FALSE);
   FX_FLOAT fFontSize = pTextSet->GetFontSize();
   FX_ARGB dwColor = pTextSet->GetFontColor();
   m_pBrush->SetColor(dwColor);
-  m_pRenderDevice->DrawString(m_pBrush.get(), pFont, m_pCharPos, iCount,
+  m_pRenderDevice->DrawString(m_pBrush.get(), pFont, m_CharPos.data(), iCount,
                               fFontSize, &m_Transform);
 }
 
diff --git a/xfa/fde/fde_render.h b/xfa/fde/fde_render.h
index 523aaee..b91bbfe 100644
--- a/xfa/fde/fde_render.h
+++ b/xfa/fde/fde_render.h
@@ -8,6 +8,7 @@
 #define XFA_FDE_FDE_RENDER_H_
 
 #include <memory>
+#include <vector>
 
 #include "core/fxcrt/include/fx_coordinates.h"
 #include "xfa/fde/fde_gedevice.h"
@@ -40,8 +41,7 @@
   FDE_RENDERSTATUS m_eStatus;
   CFDE_RenderDevice* m_pRenderDevice;
   CFX_Matrix m_Transform;
-  FXTEXT_CHARPOS* m_pCharPos;
-  int32_t m_iCharPosCount;
+  std::vector<FXTEXT_CHARPOS> m_CharPos;
   std::unique_ptr<CFDE_Brush> m_pBrush;
   std::unique_ptr<CFDE_VisualSetIterator> m_pIterator;
 };
diff --git a/xfa/fde/tto/fde_textout.cpp b/xfa/fde/tto/fde_textout.cpp
index a29a420..c83afc1 100644
--- a/xfa/fde/tto/fde_textout.cpp
+++ b/xfa/fde/tto/fde_textout.cpp
@@ -18,17 +18,14 @@
 #include "xfa/fgas/layout/fgas_textbreak.h"
 
 CFDE_TextOut::CFDE_TextOut()
-    : m_pFont(nullptr),
+    : m_pTxtBreak(new CFX_TxtBreak(FX_TXTBREAKPOLICY_None)),
+      m_pFont(nullptr),
       m_fFontSize(12.0f),
       m_fLineSpace(m_fFontSize),
       m_fLinePos(0.0f),
       m_fTolerance(0.0f),
       m_iAlignment(0),
       m_iTxtBkAlignment(0),
-      m_pCharWidths(nullptr),
-      m_iChars(0),
-      m_pEllCharWidths(nullptr),
-      m_iEllChars(0),
       m_wParagraphBkChar(L'\n'),
       m_TxtColor(0xFF000000),
       m_dwStyles(0),
@@ -38,34 +35,32 @@
       m_ttoLines(5),
       m_iCurLine(0),
       m_iCurPiece(0),
-      m_iTotalLines(0),
-      m_pCharPos(nullptr),
-      m_iCharPosSize(0) {
-  m_pTxtBreak = new CFX_TxtBreak(FX_TXTBREAKPOLICY_None);
+      m_iTotalLines(0) {
   m_Matrix.SetIdentity();
   m_rtClip.Reset();
   m_rtLogicClip.Reset();
 }
+
 CFDE_TextOut::~CFDE_TextOut() {
-  delete m_pTxtBreak;
-  FX_Free(m_pCharWidths);
-  FX_Free(m_pEllCharWidths);
-  FX_Free(m_pCharPos);
   m_ttoLines.RemoveAll(FALSE);
 }
+
 void CFDE_TextOut::SetFont(CFGAS_GEFont* pFont) {
   ASSERT(pFont);
   m_pFont = pFont;
   m_pTxtBreak->SetFont(pFont);
 }
+
 void CFDE_TextOut::SetFontSize(FX_FLOAT fFontSize) {
   ASSERT(fFontSize > 0);
   m_fFontSize = fFontSize;
   m_pTxtBreak->SetFontSize(fFontSize);
 }
+
 void CFDE_TextOut::SetTextColor(FX_ARGB color) {
   m_TxtColor = color;
 }
+
 void CFDE_TextOut::SetStyles(uint32_t dwStyles) {
   m_dwStyles = dwStyles;
   m_dwTxtBkStyles = 0;
@@ -90,18 +85,22 @@
   }
   m_pTxtBreak->SetLayoutStyles(m_dwTxtBkStyles);
 }
+
 void CFDE_TextOut::SetTabWidth(FX_FLOAT fTabWidth) {
   ASSERT(fTabWidth > 1.0f);
   m_pTxtBreak->SetTabWidth(fTabWidth, FALSE);
 }
+
 void CFDE_TextOut::SetEllipsisString(const CFX_WideString& wsEllipsis) {
   m_bElliChanged = TRUE;
   m_wsEllipsis = wsEllipsis;
 }
+
 void CFDE_TextOut::SetParagraphBreakChar(FX_WCHAR wch) {
   m_wParagraphBkChar = wch;
   m_pTxtBreak->SetParagraphBreakChar(wch);
 }
+
 void CFDE_TextOut::SetAlignment(int32_t iAlignment) {
   m_iAlignment = iAlignment;
   switch (m_iAlignment) {
@@ -121,6 +120,7 @@
   }
   m_pTxtBreak->SetAlignment(m_iTxtBkAlignment);
 }
+
 void CFDE_TextOut::SetLineSpace(FX_FLOAT fLineSpace) {
   ASSERT(fLineSpace > 1.0f);
   m_fLineSpace = fLineSpace;
@@ -144,22 +144,28 @@
   m_rtClip.Set((FX_FLOAT)rtClip.left, (FX_FLOAT)rtClip.top,
                (FX_FLOAT)rtClip.Width(), (FX_FLOAT)rtClip.Height());
 }
+
 void CFDE_TextOut::SetClipRect(const CFX_RectF& rtClip) {
   m_rtClip = rtClip;
 }
+
 void CFDE_TextOut::SetLogicClipRect(const CFX_RectF& rtClip) {
   m_rtLogicClip = rtClip;
 }
+
 void CFDE_TextOut::SetMatrix(const CFX_Matrix& matrix) {
   m_Matrix = matrix;
 }
+
 void CFDE_TextOut::SetLineBreakTolerance(FX_FLOAT fTolerance) {
   m_fTolerance = fTolerance;
   m_pTxtBreak->SetLineBreakTolerance(m_fTolerance);
 }
+
 int32_t CFDE_TextOut::GetTotalLines() {
   return m_iTotalLines;
 }
+
 void CFDE_TextOut::CalcSize(const FX_WCHAR* pwsStr,
                             int32_t iLength,
                             CFX_Size& size) {
@@ -169,6 +175,7 @@
   size.x = (int32_t)rtText.Width();
   size.y = (int32_t)rtText.Height();
 }
+
 void CFDE_TextOut::CalcSize(const FX_WCHAR* pwsStr,
                             int32_t iLength,
                             CFX_SizeF& size) {
@@ -178,6 +185,7 @@
   size.x = rtText.Width();
   size.y = rtText.Height();
 }
+
 void CFDE_TextOut::CalcSize(const FX_WCHAR* pwsStr,
                             int32_t iLength,
                             CFX_Rect& rect) {
@@ -188,6 +196,7 @@
   rect.Set((int32_t)rtText.left, (int32_t)rtText.top, (int32_t)rtText.Width(),
            (int32_t)rtText.Height());
 }
+
 void CFDE_TextOut::CalcSize(const FX_WCHAR* pwsStr,
                             int32_t iLength,
                             CFX_RectF& rect) {
@@ -202,6 +211,7 @@
     m_Matrix.TransformRect(rect);
   }
 }
+
 void CFDE_TextOut::CalcLogicSize(const FX_WCHAR* pwsStr,
                                  int32_t iLength,
                                  CFX_SizeF& size) {
@@ -211,6 +221,7 @@
   size.x = rtText.Width();
   size.y = rtText.Height();
 }
+
 void CFDE_TextOut::CalcLogicSize(const FX_WCHAR* pwsStr,
                                  int32_t iLength,
                                  CFX_RectF& rect) {
@@ -221,6 +232,7 @@
     CalcTextSize(pwsStr, iLength, rect);
   }
 }
+
 void CFDE_TextOut::CalcTextSize(const FX_WCHAR* pwsStr,
                                 int32_t iLength,
                                 CFX_RectF& rect) {
@@ -283,6 +295,7 @@
     }
   }
 }
+
 void CFDE_TextOut::SetLineWidth(CFX_RectF& rect) {
   if ((m_dwStyles & FDE_TTOSTYLE_SingleLine) == 0) {
     FX_FLOAT fLineWidth = 0.0f;
@@ -300,6 +313,7 @@
     m_pTxtBreak->SetLineWidth(fLineWidth);
   }
 }
+
 FX_BOOL CFDE_TextOut::RetrieveLineWidth(uint32_t dwBreakStatus,
                                         FX_FLOAT& fStartPos,
                                         FX_FLOAT& fWidth,
@@ -330,6 +344,7 @@
   m_iTotalLines++;
   return TRUE;
 }
+
 void CFDE_TextOut::DrawText(const FX_WCHAR* pwsStr,
                             int32_t iLength,
                             int32_t x,
@@ -339,6 +354,7 @@
              m_fFontSize * 1000.0f);
   DrawText(pwsStr, iLength, rtText);
 }
+
 void CFDE_TextOut::DrawText(const FX_WCHAR* pwsStr,
                             int32_t iLength,
                             FX_FLOAT x,
@@ -347,6 +363,7 @@
   rtText.Set(x, y, m_fFontSize * 1000.0f, m_fFontSize * 1000.0f);
   DrawText(pwsStr, iLength, rtText);
 }
+
 void CFDE_TextOut::DrawText(const FX_WCHAR* pwsStr,
                             int32_t iLength,
                             const CFX_Rect& rect) {
@@ -355,6 +372,7 @@
              (FX_FLOAT)rect.height);
   DrawText(pwsStr, iLength, rtText);
 }
+
 void CFDE_TextOut::DrawText(const FX_WCHAR* pwsStr,
                             int32_t iLength,
                             const CFX_RectF& rect) {
@@ -365,6 +383,7 @@
   rm.TransformRect(rtText);
   DrawText(pwsStr, iLength, rtText, m_rtClip);
 }
+
 void CFDE_TextOut::DrawLogicText(const FX_WCHAR* pwsStr,
                                  int32_t iLength,
                                  FX_FLOAT x,
@@ -373,6 +392,7 @@
   rtText.Set(x, y, m_fFontSize * 1000.0f, m_fFontSize * 1000.0f);
   DrawLogicText(pwsStr, iLength, rtText);
 }
+
 void CFDE_TextOut::DrawLogicText(const FX_WCHAR* pwsStr,
                                  int32_t iLength,
                                  const CFX_RectF& rect) {
@@ -382,6 +402,7 @@
   m_Matrix.TransformRect(rtClip);
   DrawText(pwsStr, iLength, rect, rtClip);
 }
+
 void CFDE_TextOut::DrawText(const FX_WCHAR* pwsStr,
                             int32_t iLength,
                             const CFX_RectF& rect,
@@ -408,39 +429,26 @@
   DoAlignment(rect);
   OnDraw(rtClip);
 }
+
 void CFDE_TextOut::ExpandBuffer(int32_t iSize, int32_t iType) {
+  ASSERT(iSize >= 0);
+  size_t size = iSize;
   switch (iType) {
     case 0:
-      if (!m_pCharWidths) {
-        m_pCharWidths = FX_Alloc(int32_t, iSize);
-        m_iChars = iSize;
-      } else if (m_iChars < iSize) {
-        m_pCharWidths = FX_Realloc(int32_t, m_pCharWidths, iSize);
-        m_iChars = iSize;
-      }
-      FXSYS_memset(m_pCharWidths, 0, iSize * sizeof(int32_t));
+      if (m_CharWidths.size() < size)
+        m_CharWidths.resize(size, 0);
       break;
     case 1:
-      if (!m_pEllCharWidths) {
-        m_pEllCharWidths = FX_Alloc(int32_t, iSize);
-        m_iEllChars = iSize;
-      } else if (m_iEllChars < iSize) {
-        m_pEllCharWidths = FX_Realloc(int32_t, m_pEllCharWidths, iSize);
-        m_iEllChars = iSize;
-      }
-      FXSYS_memset(m_pEllCharWidths, 0, iSize * sizeof(int32_t));
+      if (m_EllCharWidths.size() < size)
+        m_EllCharWidths.resize(size, 0);
       break;
     case 2:
-      if (!m_pCharPos) {
-        m_pCharPos = FX_Alloc(FXTEXT_CHARPOS, iSize);
-        m_iCharPosSize = iSize;
-      } else if (m_iCharPosSize < iSize) {
-        m_pCharPos = FX_Realloc(FXTEXT_CHARPOS, m_pCharPos, iSize);
-        m_iCharPosSize = iSize;
-      }
+      if (m_CharPos.size() < size)
+        m_CharPos.resize(size, FXTEXT_CHARPOS());
       break;
   }
 }
+
 void CFDE_TextOut::LoadEllipsis() {
   if (!m_bElliChanged) {
     return;
@@ -453,41 +461,36 @@
   }
   ExpandBuffer(iLength, 1);
   const FX_WCHAR* pStr = m_wsEllipsis.c_str();
-  int32_t* pCharWidths = m_pEllCharWidths;
   uint32_t dwBreakStatus;
   FX_WCHAR wch;
   while (iLength-- > 0) {
     wch = *pStr++;
     dwBreakStatus = m_pTxtBreak->AppendChar(wch);
-    if (dwBreakStatus > FX_TXTBREAK_PieceBreak) {
-      RetrieveEllPieces(pCharWidths);
-    }
+    if (dwBreakStatus > FX_TXTBREAK_PieceBreak)
+      RetrieveEllPieces(&m_EllCharWidths);
   }
   dwBreakStatus = m_pTxtBreak->EndBreak(FX_TXTBREAK_ParagraphBreak);
-  if (dwBreakStatus > FX_TXTBREAK_PieceBreak) {
-    RetrieveEllPieces(pCharWidths);
-  }
+  if (dwBreakStatus > FX_TXTBREAK_PieceBreak)
+    RetrieveEllPieces(&m_EllCharWidths);
   m_pTxtBreak->Reset();
 }
-void CFDE_TextOut::RetrieveEllPieces(int32_t*& pCharWidths) {
+
+void CFDE_TextOut::RetrieveEllPieces(std::vector<int32_t>* pCharWidths) {
   int32_t iCount = m_pTxtBreak->CountBreakPieces();
-  CFX_Char* pTC;
+  int32_t iCharIndex = 0;
   for (int32_t i = 0; i < iCount; i++) {
     const CFX_TxtPiece* pPiece = m_pTxtBreak->GetBreakPiece(i);
     int32_t iPieceChars = pPiece->GetLength();
     for (int32_t j = 0; j < iPieceChars; j++) {
-      pTC = pPiece->GetCharPtr(j);
-      if (pTC->m_iCharWidth <= 0) {
-        *pCharWidths = 0;
-      } else {
-        *pCharWidths = pTC->m_iCharWidth;
-      }
-      m_iEllipsisWidth += *pCharWidths;
-      pCharWidths++;
+      CFX_Char* pTC = pPiece->GetCharPtr(j);
+      (*pCharWidths)[iCharIndex] = std::max(pTC->m_iCharWidth, 0);
+      m_iEllipsisWidth += (*pCharWidths)[iCharIndex];
+      iCharIndex++;
     }
   }
   m_pTxtBreak->ClearBreakPieces();
 }
+
 void CFDE_TextOut::LoadText(const FX_WCHAR* pwsStr,
                             int32_t iLength,
                             const CFX_RectF& rect) {
@@ -551,6 +554,7 @@
   m_pTxtBreak->Reset();
   m_wsText.ReleaseBuffer(iLength);
 }
+
 FX_BOOL CFDE_TextOut::RetriecePieces(uint32_t dwBreakStatus,
                                      int32_t& iStartChar,
                                      int32_t& iPieceWidths,
@@ -585,7 +589,7 @@
         }
       }
       iWidth += iCurCharWidth;
-      m_pCharWidths[iChar++] = iCurCharWidth;
+      m_CharWidths[iChar++] = iCurCharWidth;
     }
     if (j == 0 && !bReload) {
       CFDE_TTOLine* pLine = m_ttoLines.GetPtrAt(m_iCurLine);
@@ -621,6 +625,7 @@
                  dwBreakStatus == FX_TXTBREAK_ParagraphBreak;
   return bRet;
 }
+
 void CFDE_TextOut::AppendPiece(const FDE_TTOPIECE& ttoPiece,
                                FX_BOOL bNeedReload,
                                FX_BOOL bEnd) {
@@ -644,6 +649,7 @@
     m_iCurPiece = 0;
   }
 }
+
 void CFDE_TextOut::ReplaceWidthEllipsis() {
   LoadEllipsis();
   int32_t iLength = m_wsEllipsis.GetLength();
@@ -670,14 +676,14 @@
           break;
         }
         int32_t index = pPiece->iStartChar + j;
-        iCharWidth += m_pCharWidths[index];
+        iCharWidth += m_CharWidths[index];
         iCharCount++;
         if (iCharCount <= iLength) {
           m_wsText.SetAt(index, m_wsEllipsis.GetAt(iEllipsisCharIndex));
-          m_pCharWidths[index] = m_pEllCharWidths[iEllipsisCharIndex];
+          m_CharWidths[index] = m_EllCharWidths[iEllipsisCharIndex];
         } else if (iCharWidth <= m_iEllipsisWidth) {
           m_wsText.SetAt(index, 0);
-          m_pCharWidths[index] = 0;
+          m_CharWidths[index] = 0;
         }
         iEllipsisCharIndex--;
       }
@@ -687,6 +693,7 @@
     }
   }
 }
+
 void CFDE_TextOut::Reload(const CFX_RectF& rect) {
   int32_t iCount = m_ttoLines.GetSize();
   for (int32_t i = 0; i < iCount; i++) {
@@ -699,6 +706,7 @@
     ReloadLinePiece(pLine, rect);
   }
 }
+
 void CFDE_TextOut::ReloadLinePiece(CFDE_TTOLine* pLine, const CFX_RectF& rect) {
   const FX_WCHAR* pwsStr = m_wsText.c_str();
   FX_BOOL bVertical = !!(m_dwStyles & FDE_TTOSTYLE_VerticalLayout);
@@ -730,6 +738,7 @@
   }
   m_pTxtBreak->Reset();
 }
+
 void CFDE_TextOut::DoAlignment(const CFX_RectF& rect) {
   FX_BOOL bVertical = !!(m_dwStyles & FDE_TTOSTYLE_VerticalLayout);
   FX_FLOAT fLineStopS = bVertical ? rect.right() : rect.bottom();
@@ -763,6 +772,7 @@
     }
   }
 }
+
 void CFDE_TextOut::OnDraw(const CFX_RectF& rtClip) {
   if (!m_pRenderDevice)
     return;
@@ -788,7 +798,7 @@
 
       int32_t iCount = GetDisplayPos(pPiece);
       if (iCount > 0) {
-        m_pRenderDevice->DrawString(pBrush, m_pFont, m_pCharPos, iCount,
+        m_pRenderDevice->DrawString(pBrush, m_pFont, m_CharPos.data(), iCount,
                                     m_fFontSize, &m_Matrix);
       }
       DrawLine(pPiece, pPen);
@@ -802,7 +812,7 @@
 int32_t CFDE_TextOut::GetDisplayPos(FDE_TTOPIECE* pPiece) {
   FX_TXTRUN tr = ToTextRun(pPiece);
   ExpandBuffer(tr.iLength, 2);
-  return m_pTxtBreak->GetDisplayPos(&tr, m_pCharPos);
+  return m_pTxtBreak->GetDisplayPos(&tr, m_CharPos.data());
 }
 
 int32_t CFDE_TextOut::GetCharRects(const FDE_TTOPIECE* pPiece) {
@@ -814,7 +824,7 @@
 FX_TXTRUN CFDE_TextOut::ToTextRun(const FDE_TTOPIECE* pPiece) {
   FX_TXTRUN tr;
   tr.wsStr = m_wsText + pPiece->iStartChar;
-  tr.pWidths = m_pCharWidths + pPiece->iStartChar;
+  tr.pWidths = &m_CharWidths[pPiece->iStartChar];
   tr.iLength = pPiece->iChars;
   tr.pFont = m_pFont;
   tr.fFontSize = m_fFontSize;
@@ -922,18 +932,22 @@
   }
   return index;
 }
+
 int32_t CFDE_TTOLine::GetSize() const {
   return m_iPieceCount;
 }
+
 FDE_TTOPIECE* CFDE_TTOLine::GetPtrAt(int32_t index) {
   if (index >= m_iPieceCount) {
     return nullptr;
   }
   return m_pieces.GetPtrAt(index);
 }
+
 void CFDE_TTOLine::RemoveLast(int32_t iCount) {
   m_pieces.RemoveLast(iCount);
 }
+
 void CFDE_TTOLine::RemoveAll(FX_BOOL bLeaveMemory) {
   m_pieces.RemoveAll(bLeaveMemory);
 }
diff --git a/xfa/fde/tto/fde_textout.h b/xfa/fde/tto/fde_textout.h
index 14ca5e1..8d2c0fe 100644
--- a/xfa/fde/tto/fde_textout.h
+++ b/xfa/fde/tto/fde_textout.h
@@ -8,6 +8,7 @@
 #define XFA_FDE_TTO_FDE_TEXTOUT_H_
 
 #include <memory>
+#include <vector>
 
 #include "core/fxge/include/fx_dib.h"
 #include "core/fxge/include/fx_ge.h"
@@ -131,7 +132,7 @@
   void LoadText(const FX_WCHAR* pwsStr, int32_t iLength, const CFX_RectF& rect);
   void LoadEllipsis();
   void ExpandBuffer(int32_t iSize, int32_t iType);
-  void RetrieveEllPieces(int32_t*& pCharWidths);
+  void RetrieveEllPieces(std::vector<int32_t>* pCharWidths);
 
   void Reload(const CFX_RectF& rect);
   void ReloadLinePiece(CFDE_TTOLine* pLine, const CFX_RectF& rect);
@@ -152,18 +153,16 @@
   FX_TXTRUN ToTextRun(const FDE_TTOPIECE* pPiece);
   void DrawLine(const FDE_TTOPIECE* pPiece, CFDE_Pen*& pPen);
 
-  CFX_TxtBreak* m_pTxtBreak;
-  CFGAS_GEFont* m_pFont;
+  std::unique_ptr<CFX_TxtBreak> m_pTxtBreak;
+  CFGAS_GEFont* m_pFont;  // not owned.
   FX_FLOAT m_fFontSize;
   FX_FLOAT m_fLineSpace;
   FX_FLOAT m_fLinePos;
   FX_FLOAT m_fTolerance;
   int32_t m_iAlignment;
   int32_t m_iTxtBkAlignment;
-  int32_t* m_pCharWidths;
-  int32_t m_iChars;
-  int32_t* m_pEllCharWidths;
-  int32_t m_iEllChars;
+  std::vector<int32_t> m_CharWidths;
+  std::vector<int32_t> m_EllCharWidths;
   FX_WCHAR m_wParagraphBkChar;
   FX_ARGB m_TxtColor;
   uint32_t m_dwStyles;
@@ -179,8 +178,7 @@
   int32_t m_iCurLine;
   int32_t m_iCurPiece;
   int32_t m_iTotalLines;
-  FXTEXT_CHARPOS* m_pCharPos;
-  int32_t m_iCharPosSize;
+  std::vector<FXTEXT_CHARPOS> m_CharPos;
   std::unique_ptr<CFDE_RenderDevice> m_pRenderDevice;
   CFX_Int32Array m_hotKeys;
   CFX_RectFArray m_rectArray;
diff --git a/xfa/fgas/crt/fgas_memory.cpp b/xfa/fgas/crt/fgas_memory.cpp
index d218f42..e587f5a 100644
--- a/xfa/fgas/crt/fgas_memory.cpp
+++ b/xfa/fgas/crt/fgas_memory.cpp
@@ -27,10 +27,11 @@
 
 }  // namespace
 
-IFX_MemoryAllocator* IFX_MemoryAllocator::Create(FX_ALLOCTYPE eType,
-                                                 size_t chunkSize,
-                                                 size_t blockSize) {
-  return new CFX_DefStore();
+std::unique_ptr<IFX_MemoryAllocator> IFX_MemoryAllocator::Create(
+    FX_ALLOCTYPE eType,
+    size_t chunkSize,
+    size_t blockSize) {
+  return std::unique_ptr<IFX_MemoryAllocator>(new CFX_DefStore());
 }
 
 #else  // MEMORY_TOOL_REPLACES_ALLOCATOR
@@ -88,17 +89,19 @@
 
 #define FX_4BYTEALIGN(size) (((size) + 3) & ~3)
 
-IFX_MemoryAllocator* IFX_MemoryAllocator::Create(FX_ALLOCTYPE eType,
-                                                 size_t chunkSize,
-                                                 size_t blockSize) {
+std::unique_ptr<IFX_MemoryAllocator> IFX_MemoryAllocator::Create(
+    FX_ALLOCTYPE eType,
+    size_t chunkSize,
+    size_t blockSize) {
   switch (eType) {
     case FX_ALLOCTYPE_Static:
-      return new CFX_StaticStore(chunkSize);
+      return std::unique_ptr<IFX_MemoryAllocator>(
+          new CFX_StaticStore(chunkSize));
     case FX_ALLOCTYPE_Fixed:
-      return new CFX_FixedStore(blockSize, chunkSize);
+      return std::unique_ptr<IFX_MemoryAllocator>(new CFX_FixedStore(blockSize, chunkSize);
     default:
       ASSERT(0);
-      return nullptr;
+      return std::unique_ptr<IFX_MemoryAllocator>();
   }
 }
 
diff --git a/xfa/fgas/crt/fgas_memory.h b/xfa/fgas/crt/fgas_memory.h
index a83933c..1034c41 100644
--- a/xfa/fgas/crt/fgas_memory.h
+++ b/xfa/fgas/crt/fgas_memory.h
@@ -7,6 +7,8 @@
 #ifndef XFA_FGAS_CRT_FGAS_MEMORY_H_
 #define XFA_FGAS_CRT_FGAS_MEMORY_H_
 
+#include <memory>
+
 #include "core/fxcrt/include/fx_memory.h"
 #include "core/fxcrt/include/fx_system.h"
 
@@ -21,9 +23,9 @@
   virtual void* Alloc(size_t size) = 0;
   virtual void Free(void* pBlock) = 0;
 
-  static IFX_MemoryAllocator* Create(FX_ALLOCTYPE eType,
-                                     size_t chunkSize,
-                                     size_t blockSize);
+  static std::unique_ptr<IFX_MemoryAllocator> Create(FX_ALLOCTYPE eType,
+                                                     size_t chunkSize,
+                                                     size_t blockSize);
 };
 
 class CFX_Target {
diff --git a/xfa/fxfa/app/xfa_textlayout.cpp b/xfa/fxfa/app/xfa_textlayout.cpp
index 88645b7..6ac5c05 100644
--- a/xfa/fxfa/app/xfa_textlayout.cpp
+++ b/xfa/fxfa/app/xfa_textlayout.cpp
@@ -96,8 +96,7 @@
     CXFA_FFDoc* pDoc = pTextProvider->GetDocNode();
     IFGAS_FontMgr* pFontMgr = pDoc->GetApp()->GetFDEFontMgr();
     ASSERT(pFontMgr);
-    m_pSelector.reset(new CFDE_CSSStyleSelector);
-    m_pSelector->SetFontMgr(pFontMgr);
+    m_pSelector.reset(new CFDE_CSSStyleSelector(pFontMgr));
     FX_FLOAT fFontSize = 10;
     CXFA_Font font = pTextProvider->GetFontNode();
     if (font) {
@@ -252,8 +251,8 @@
   if (!pXMLContainer || !pTextProvider || m_pAllocator) {
     return;
   }
-  m_pAllocator.reset(IFX_MemoryAllocator::Create(FX_ALLOCTYPE_Fixed, 32,
-                                                 sizeof(CXFA_CSSTagProvider)));
+  m_pAllocator = IFX_MemoryAllocator::Create(FX_ALLOCTYPE_Fixed, 32,
+                                             sizeof(CXFA_CSSTagProvider));
   InitCSSData(pTextProvider);
   IFDE_CSSComputedStyle* pRootStyle = CreateRootStyle(pTextProvider);
   ParseRichText(pXMLContainer, pRootStyle);
@@ -1294,8 +1293,7 @@
                                 FX_FLOAT& fLinePos,
                                 FX_BOOL bSavePieces) {
   if (!m_pAllocator) {
-    m_pAllocator.reset(
-        IFX_MemoryAllocator::Create(FX_ALLOCTYPE_Static, 256, 0));
+    m_pAllocator = IFX_MemoryAllocator::Create(FX_ALLOCTYPE_Static, 256, 0);
   }
   GetTextDataNode();
   if (!m_pTextDataNode)