Use smart pointers for class owned pointers

For classes under xfa/fgas, xfa/fwl/basewidget, and xfa/fwl/core,
use smart pointers instead of raw pointer to make memory management
easier.

BUG=pdfium:518

Review-Url: https://codereview.chromium.org/2207093005
diff --git a/xfa/fgas/font/fgas_gefont.cpp b/xfa/fgas/font/fgas_gefont.cpp
index 48635ca..7492de2 100644
--- a/xfa/fgas/font/fgas_gefont.cpp
+++ b/xfa/fgas/font/fgas_gefont.cpp
@@ -77,12 +77,6 @@
       m_pFontMgr(pFontMgr),
       m_iRefCount(1),
       m_bExtFont(FALSE),
-      m_pStream(nullptr),
-      m_pFileRead(nullptr),
-      m_pFontEncoding(nullptr),
-      m_pCharWidthMap(nullptr),
-      m_pRectArray(nullptr),
-      m_pBBoxMap(nullptr),
       m_pProvider(nullptr) {
 }
 
@@ -96,12 +90,6 @@
       m_pFontMgr(src.m_pFontMgr),
       m_iRefCount(1),
       m_bExtFont(FALSE),
-      m_pStream(nullptr),
-      m_pFileRead(nullptr),
-      m_pFontEncoding(nullptr),
-      m_pCharWidthMap(nullptr),
-      m_pRectArray(nullptr),
-      m_pBBoxMap(nullptr),
       m_pProvider(nullptr) {
   ASSERT(src.m_pFont);
   m_pFont = new CFX_Font;
@@ -125,16 +113,7 @@
 
   m_SubstFonts.RemoveAll();
   m_FontMapper.clear();
-  if (m_pFileRead)
-    m_pFileRead->Release();
 
-  if (m_pStream)
-    m_pStream->Release();
-
-  delete m_pFontEncoding;
-  delete m_pCharWidthMap;
-  delete m_pRectArray;
-  delete m_pBBoxMap;
   if (!m_bExtFont)
     delete m_pFont;
 }
@@ -213,22 +192,17 @@
 
 FX_BOOL CFGAS_GEFont::LoadFontInternal(IFX_Stream* pFontStream,
                                        FX_BOOL bSaveStream) {
-  if (m_pFont || m_pFileRead || !pFontStream || pFontStream->GetLength() < 1) {
+  if (m_pFont || m_pFileRead || !pFontStream || pFontStream->GetLength() < 1)
     return FALSE;
-  }
-  if (bSaveStream) {
-    m_pStream = pFontStream;
-  }
-  m_pFileRead = FX_CreateFileRead(pFontStream, FALSE);
+  if (bSaveStream)
+    m_pStream.reset(pFontStream);
+
+  m_pFileRead.reset(FX_CreateFileRead(pFontStream, FALSE));
   m_pFont = new CFX_Font;
-  FX_BOOL bRet = m_pFont->LoadFile(m_pFileRead);
-  if (bRet) {
-    bRet = InitFont();
-  } else {
-    m_pFileRead->Release();
-    m_pFileRead = nullptr;
-  }
-  return bRet;
+  if (m_pFont->LoadFile(m_pFileRead.get()))
+    return InitFont();
+  m_pFileRead.reset();
+  return FALSE;
 }
 #endif  // _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
 
@@ -245,16 +219,16 @@
   if (!m_pFont)
     return FALSE;
   if (!m_pFontEncoding) {
-    m_pFontEncoding = FX_CreateFontEncodingEx(m_pFont);
+    m_pFontEncoding.reset(FX_CreateFontEncodingEx(m_pFont));
     if (!m_pFontEncoding)
       return FALSE;
   }
   if (!m_pCharWidthMap)
-    m_pCharWidthMap = new CFX_DiscreteArrayTemplate<uint16_t>(1024);
+    m_pCharWidthMap.reset(new CFX_DiscreteArrayTemplate<uint16_t>(1024));
   if (!m_pRectArray)
-    m_pRectArray = new CFX_MassArrayTemplate<CFX_Rect>(16);
+    m_pRectArray.reset(new CFX_MassArrayTemplate<CFX_Rect>(16));
   if (!m_pBBoxMap)
-    m_pBBoxMap = new CFX_MapPtrToPtr(16);
+    m_pBBoxMap.reset(new CFX_MapPtrToPtr(16));
 
   return TRUE;
 }
diff --git a/xfa/fgas/font/fgas_gefont.h b/xfa/fgas/font/fgas_gefont.h
index a94583f..37aa03e 100644
--- a/xfa/fgas/font/fgas_gefont.h
+++ b/xfa/fgas/font/fgas_gefont.h
@@ -9,6 +9,7 @@
 
 #include <map>
 
+#include "core/fxcrt/include/fx_memory.h"
 #include "xfa/fgas/crt/fgas_utils.h"
 #include "xfa/fgas/font/fgas_font.h"
 
@@ -92,16 +93,16 @@
   uint32_t m_dwLogFontStyle;
 #endif
   CFX_Font* m_pFont;
-  IFGAS_FontMgr* m_pFontMgr;
+  IFGAS_FontMgr* const m_pFontMgr;
   int32_t m_iRefCount;
   FX_BOOL m_bExtFont;
-  IFX_Stream* m_pStream;
-  IFX_FileRead* m_pFileRead;
-  CFX_UnicodeEncoding* m_pFontEncoding;
-  CFX_DiscreteArrayTemplate<uint16_t>* m_pCharWidthMap;
-  CFX_MassArrayTemplate<CFX_Rect>* m_pRectArray;
-  CFX_MapPtrToPtr* m_pBBoxMap;
-  CXFA_PDFFontMgr* m_pProvider;
+  std::unique_ptr<IFX_Stream, ReleaseDeleter<IFX_Stream>> m_pStream;
+  std::unique_ptr<IFX_FileRead, ReleaseDeleter<IFX_FileRead>> m_pFileRead;
+  std::unique_ptr<CFX_UnicodeEncoding> m_pFontEncoding;
+  std::unique_ptr<CFX_DiscreteArrayTemplate<uint16_t>> m_pCharWidthMap;
+  std::unique_ptr<CFX_MassArrayTemplate<CFX_Rect>> m_pRectArray;
+  std::unique_ptr<CFX_MapPtrToPtr> m_pBBoxMap;
+  CXFA_PDFFontMgr* m_pProvider;  // not owned.
   CFX_ArrayTemplate<CFGAS_GEFont*> m_SubstFonts;
   std::map<FX_WCHAR, CFGAS_GEFont*> m_FontMapper;
 };
diff --git a/xfa/fgas/layout/fgas_textbreak.cpp b/xfa/fgas/layout/fgas_textbreak.cpp
index 89b17cc..5ee399f 100644
--- a/xfa/fgas/layout/fgas_textbreak.cpp
+++ b/xfa/fgas/layout/fgas_textbreak.cpp
@@ -69,25 +69,22 @@
       m_iVerScale(100),
       m_iCharSpace(0) {
   m_bPagination = (m_dwPolicies & FX_TXTBREAKPOLICY_Pagination) != 0;
-  if (m_bPagination) {
-    m_pTxtLine1 = new CFX_TxtLine(sizeof(CFX_Char));
-    m_pTxtLine2 = new CFX_TxtLine(sizeof(CFX_Char));
-  } else {
-    m_pTxtLine1 = new CFX_TxtLine(sizeof(CFX_TxtChar));
-    m_pTxtLine2 = new CFX_TxtLine(sizeof(CFX_TxtChar));
-  }
-  m_pCurLine = m_pTxtLine1;
+  int32_t iSize = m_bPagination ? sizeof(CFX_Char) : sizeof(CFX_TxtChar);
+  m_pTxtLine1.reset(new CFX_TxtLine(iSize));
+  m_pTxtLine2.reset(new CFX_TxtLine(iSize));
+  m_pCurLine = m_pTxtLine1.get();
   ResetArabicContext();
 }
+
 CFX_TxtBreak::~CFX_TxtBreak() {
   Reset();
-  delete m_pTxtLine1;
-  delete m_pTxtLine2;
 }
+
 void CFX_TxtBreak::SetLineWidth(FX_FLOAT fLineWidth) {
   m_iLineWidth = FXSYS_round(fLineWidth * 20000.0f);
   ASSERT(m_iLineWidth >= 20000);
 }
+
 void CFX_TxtBreak::SetLinePos(FX_FLOAT fLinePos) {
   int32_t iLinePos = FXSYS_round(fLinePos * 20000.0f);
   if (iLinePos < 0) {
@@ -99,6 +96,7 @@
   m_pCurLine->m_iStart = iLinePos;
   m_pCurLine->m_iWidth += iLinePos;
 }
+
 void CFX_TxtBreak::SetLayoutStyles(uint32_t dwLayoutStyles) {
   m_dwLayoutStyles = dwLayoutStyles;
   m_bVertical = (m_dwLayoutStyles & FX_TXTLAYOUTSTYLE_VerticalChars) != 0;
@@ -112,6 +110,7 @@
   m_iRotation = m_iLineRotation + m_iCharRotation;
   m_iRotation %= 4;
 }
+
 void CFX_TxtBreak::SetFont(CFGAS_GEFont* pFont) {
   if (!pFont) {
     return;
@@ -127,6 +126,7 @@
     m_iDefChar *= m_iFontSize;
   }
 }
+
 void CFX_TxtBreak::SetFontSize(FX_FLOAT fFontSize) {
   int32_t iFontSize = FXSYS_round(fFontSize * 20.0f);
   if (m_iFontSize == iFontSize) {
@@ -140,6 +140,7 @@
     m_iDefChar *= m_iFontSize;
   }
 }
+
 void CFX_TxtBreak::SetTabWidth(FX_FLOAT fTabWidth, FX_BOOL bEquidistant) {
   m_iTabWidth = FXSYS_round(fTabWidth * 20000.0f);
   if (m_iTabWidth < FX_TXTBREAK_MinimumTabWidth) {
@@ -147,6 +148,7 @@
   }
   m_bEquidistant = bEquidistant;
 }
+
 void CFX_TxtBreak::SetDefaultChar(FX_WCHAR wch) {
   m_wDefChar = wch;
   m_iDefChar = 0;
@@ -159,15 +161,18 @@
     }
   }
 }
+
 void CFX_TxtBreak::SetParagraphBreakChar(FX_WCHAR wch) {
   if (wch != L'\r' && wch != L'\n') {
     return;
   }
   m_wParagBreakChar = wch;
 }
+
 void CFX_TxtBreak::SetLineBreakTolerance(FX_FLOAT fTolerance) {
   m_iTolerance = FXSYS_round(fTolerance * 20000.0f);
 }
+
 void CFX_TxtBreak::SetCharRotation(int32_t iCharRotation) {
   if (iCharRotation < 0) {
     iCharRotation += (-iCharRotation / 4 + 1) * 4;
@@ -182,12 +187,14 @@
   m_iRotation = m_iLineRotation + m_iCharRotation;
   m_iRotation %= 4;
 }
+
 void CFX_TxtBreak::SetAlignment(int32_t iAlignment) {
   ASSERT(iAlignment >= FX_TXTLINEALIGNMENT_Left &&
          iAlignment <= FX_TXTLINEALIGNMENT_Distributed);
   m_iAlignment = iAlignment;
   ResetArabicContext();
 }
+
 void CFX_TxtBreak::ResetContextCharStyles() {
   m_dwContextCharStyles = m_bArabicContext ? m_iCurAlignment : m_iAlignment;
   if (m_bArabicNumber) {
@@ -201,9 +208,11 @@
   }
   m_dwContextCharStyles |= (m_iArabicContext << 8);
 }
+
 uint32_t CFX_TxtBreak::GetContextCharStyles() const {
   return m_dwContextCharStyles;
 }
+
 void CFX_TxtBreak::SetContextCharStyles(uint32_t dwCharStyles) {
   m_iCurAlignment = dwCharStyles & 0x0F;
   m_bArabicNumber = (dwCharStyles & FX_TXTCHARSTYLE_ArabicNumber) != 0;
@@ -212,9 +221,11 @@
   m_iCurArabicContext = m_iArabicContext = ((dwCharStyles & 0x0300) >> 8);
   ResetContextCharStyles();
 }
+
 void CFX_TxtBreak::SetCombWidth(FX_FLOAT fCombWidth) {
   m_iCombWidth = FXSYS_round(fCombWidth * 20000.0f);
 }
+
 void CFX_TxtBreak::SetUserData(void* pUserData) {
   if (m_pUserData == pUserData) {
     return;
@@ -222,6 +233,7 @@
   SetBreakStatus();
   m_pUserData = pUserData;
 }
+
 void CFX_TxtBreak::SetBreakStatus() {
   if (m_bPagination) {
     return;
@@ -235,6 +247,7 @@
     pTC->m_dwStatus = FX_TXTBREAK_PieceBreak;
   }
 }
+
 void CFX_TxtBreak::SetHorizontalScale(int32_t iScale) {
   if (iScale < 0) {
     iScale = 0;
@@ -245,6 +258,7 @@
   SetBreakStatus();
   m_iHorScale = iScale;
 }
+
 void CFX_TxtBreak::SetVerticalScale(int32_t iScale) {
   if (iScale < 0) {
     iScale = 0;
@@ -255,15 +269,18 @@
   SetBreakStatus();
   m_iVerScale = iScale;
 }
+
 void CFX_TxtBreak::SetCharSpace(FX_FLOAT fCharSpace) {
   m_iCharSpace = FXSYS_round(fCharSpace * 20000.0f);
 }
+
 static const int32_t gs_FX_TxtLineRotations[8] = {0, 3, 1, 0, 2, 1, 3, 2};
 int32_t CFX_TxtBreak::GetLineRotation(uint32_t dwStyles) const {
   return gs_FX_TxtLineRotations[(dwStyles & 0x0E) >> 1];
 }
+
 CFX_TxtChar* CFX_TxtBreak::GetLastChar(int32_t index, FX_BOOL bOmitChar) const {
-  CFX_TxtCharArray& ca = *m_pCurLine->m_pLineChars;
+  CFX_TxtCharArray& ca = *m_pCurLine->m_pLineChars.get();
   int32_t iCount = ca.GetSize();
   if (index < 0 || index >= iCount) {
     return nullptr;
@@ -281,26 +298,30 @@
   }
   return nullptr;
 }
+
 CFX_TxtLine* CFX_TxtBreak::GetTxtLine(FX_BOOL bReady) const {
   if (!bReady)
     return m_pCurLine;
   if (m_iReady == 1)
-    return m_pTxtLine1;
+    return m_pTxtLine1.get();
   if (m_iReady == 2)
-    return m_pTxtLine2;
+    return m_pTxtLine2.get();
   return nullptr;
 }
+
 CFX_TxtPieceArray* CFX_TxtBreak::GetTxtPieces(FX_BOOL bReady) const {
   CFX_TxtLine* pTxtLine = GetTxtLine(bReady);
   if (!pTxtLine) {
     return nullptr;
   }
-  return pTxtLine->m_pLinePieces;
+  return pTxtLine->m_pLinePieces.get();
 }
+
 inline FX_CHARTYPE CFX_TxtBreak::GetUnifiedCharType(
     FX_CHARTYPE chartype) const {
   return chartype >= FX_CHARTYPE_ArabicAlef ? FX_CHARTYPE_Arabic : chartype;
 }
+
 void CFX_TxtBreak::ResetArabicContext() {
   if (m_bArabicContext) {
     m_bCurRTL = m_iCurArabicContext > 1;
@@ -326,6 +347,7 @@
   m_bArabicComma = m_bArabicNumber;
   ResetContextCharStyles();
 }
+
 void CFX_TxtBreak::AppendChar_PageLoad(CFX_TxtChar* pCurChar,
                                        uint32_t dwProps) {
   if (!m_bPagination) {
@@ -355,6 +377,7 @@
   }
   pCurChar->m_dwCharStyles = m_dwContextCharStyles;
 }
+
 uint32_t CFX_TxtBreak::AppendChar_Combination(CFX_TxtChar* pCurChar,
                                               int32_t iRotation) {
   FX_WCHAR wch = pCurChar->m_wCharCode;
@@ -402,6 +425,7 @@
   pCurChar->m_iCharWidth = -iCharWidth;
   return FX_TXTBREAK_None;
 }
+
 uint32_t CFX_TxtBreak::AppendChar_Tab(CFX_TxtChar* pCurChar,
                                       int32_t iRotation) {
   m_eCharType = FX_CHARTYPE_Tab;
@@ -430,6 +454,7 @@
   }
   return FX_TXTBREAK_None;
 }
+
 uint32_t CFX_TxtBreak::AppendChar_Control(CFX_TxtChar* pCurChar,
                                           int32_t iRotation) {
   m_eCharType = FX_CHARTYPE_Control;
@@ -459,6 +484,7 @@
   }
   return dwRet;
 }
+
 uint32_t CFX_TxtBreak::AppendChar_Arabic(CFX_TxtChar* pCurChar,
                                          int32_t iRotation) {
   FX_CHARTYPE chartype = pCurChar->GetCharType();
@@ -523,6 +549,7 @@
   }
   return FX_TXTBREAK_None;
 }
+
 uint32_t CFX_TxtBreak::AppendChar_Others(CFX_TxtChar* pCurChar,
                                          int32_t iRotation) {
   uint32_t dwProps = pCurChar->m_dwCharProps;
@@ -608,6 +635,7 @@
           pCurChar, iRotation);
   return std::max(dwRet1, dwRet2);
 }
+
 void CFX_TxtBreak::EndBreak_UpdateArabicShapes() {
   ASSERT(m_bArabicShapes);
   int32_t iCount = m_pCurLine->CountChars();
@@ -659,6 +687,7 @@
     pCur = pNext;
   } while (i < iCount);
 }
+
 FX_BOOL CFX_TxtBreak::EndBreak_SplitLine(CFX_TxtLine* pNextLine,
                                          FX_BOOL bAllChars,
                                          uint32_t dwStatus) {
@@ -684,7 +713,7 @@
     }
   }
   iCount = m_pCurLine->CountChars();
-  CFX_TxtPieceArray* pCurPieces = m_pCurLine->m_pLinePieces;
+  CFX_TxtPieceArray* pCurPieces = m_pCurLine->m_pLinePieces.get();
   CFX_TxtPiece tp;
   if (m_bPagination) {
     tp.m_dwStatus = dwStatus;
@@ -692,7 +721,7 @@
     tp.m_iWidth = m_pCurLine->m_iWidth;
     tp.m_iStartChar = 0;
     tp.m_iChars = iCount;
-    tp.m_pChars = m_pCurLine->m_pLineChars;
+    tp.m_pChars = m_pCurLine->m_pLineChars.get();
     tp.m_pUserData = m_pUserData;
     pTC = m_pCurLine->GetCharPtr(0);
     tp.m_dwCharStyles = pTC->m_dwCharStyles;
@@ -705,16 +734,17 @@
   }
   if (bAllChars && !bDone) {
     int32_t iEndPos = m_pCurLine->m_iWidth;
-    GetBreakPos(*m_pCurLine->m_pLineChars, iEndPos, bAllChars, TRUE);
+    GetBreakPos(*m_pCurLine->m_pLineChars.get(), iEndPos, bAllChars, TRUE);
   }
   return FALSE;
 }
+
 void CFX_TxtBreak::EndBreak_BidiLine(CFX_TPOArray& tpos, uint32_t dwStatus) {
   CFX_TxtPiece tp;
   FX_TPO tpo;
   CFX_TxtChar* pTC;
   int32_t i, j;
-  CFX_TxtCharArray& chars = *m_pCurLine->m_pLineChars;
+  CFX_TxtCharArray& chars = *m_pCurLine->m_pLineChars.get();
   int32_t iCount = m_pCurLine->CountChars();
   FX_BOOL bDone = (m_pCurLine->m_iArabicChars > 0 || m_bCurRTL);
   if (!m_bPagination && bDone) {
@@ -731,12 +761,12 @@
     }
     FX_BidiLine(chars, iBidiNum + 1, m_bCurRTL ? 1 : 0);
   }
-  CFX_TxtPieceArray* pCurPieces = m_pCurLine->m_pLinePieces;
+  CFX_TxtPieceArray* pCurPieces = m_pCurLine->m_pLinePieces.get();
   if (!m_bPagination &&
       (bDone || (m_dwLayoutStyles & FX_TXTLAYOUTSTYLE_MutipleFormat) != 0)) {
     tp.m_dwStatus = FX_TXTBREAK_PieceBreak;
     tp.m_iStartPos = m_pCurLine->m_iStart;
-    tp.m_pChars = m_pCurLine->m_pLineChars;
+    tp.m_pChars = m_pCurLine->m_pLineChars.get();
     int32_t iBidiLevel = -1, iCharWidth;
     i = 0, j = -1;
     while (i < iCount) {
@@ -805,7 +835,7 @@
     tp.m_iWidth = m_pCurLine->m_iWidth;
     tp.m_iStartChar = 0;
     tp.m_iChars = iCount;
-    tp.m_pChars = m_pCurLine->m_pLineChars;
+    tp.m_pChars = m_pCurLine->m_pLineChars.get();
     tp.m_pUserData = m_pUserData;
     pTC = chars.GetDataPtr(0);
     tp.m_dwCharStyles = pTC->m_dwCharStyles;
@@ -817,11 +847,12 @@
     tpos.Add(tpo);
   }
 }
+
 void CFX_TxtBreak::EndBreak_Alignment(CFX_TPOArray& tpos,
                                       FX_BOOL bAllChars,
                                       uint32_t dwStatus) {
   int32_t iNetWidth = m_pCurLine->m_iWidth, iGapChars = 0, iCharWidth;
-  CFX_TxtPieceArray* pCurPieces = m_pCurLine->m_pLinePieces;
+  CFX_TxtPieceArray* pCurPieces = m_pCurLine->m_pLinePieces.get();
   int32_t i, j, iCount = pCurPieces->GetSize();
   FX_BOOL bFind = FALSE;
   FX_TPO tpo;
@@ -906,10 +937,11 @@
     }
   }
 }
+
 uint32_t CFX_TxtBreak::EndBreak(uint32_t dwStatus) {
   ASSERT(dwStatus >= FX_TXTBREAK_PieceBreak &&
          dwStatus <= FX_TXTBREAK_PageBreak);
-  CFX_TxtPieceArray* pCurPieces = m_pCurLine->m_pLinePieces;
+  CFX_TxtPieceArray* pCurPieces = m_pCurLine->m_pLinePieces.get();
   int32_t iCount = pCurPieces->GetSize();
   if (iCount > 0) {
     CFX_TxtPiece* pLastPiece = pCurPieces->GetPtrAt(--iCount);
@@ -922,7 +954,7 @@
   } else {
     CFX_TxtLine* pLastLine = GetTxtLine(TRUE);
     if (pLastLine) {
-      pCurPieces = pLastLine->m_pLinePieces;
+      pCurPieces = pLastLine->m_pLinePieces.get();
       iCount = pCurPieces->GetSize();
       if (iCount-- > 0) {
         CFX_TxtPiece* pLastPiece = pCurPieces->GetPtrAt(iCount);
@@ -947,9 +979,9 @@
       return dwStatus;
     }
   }
-  m_iReady = (m_pCurLine == m_pTxtLine1) ? 1 : 2;
+  m_iReady = (m_pCurLine == m_pTxtLine1.get()) ? 1 : 2;
   CFX_TxtLine* pNextLine =
-      (m_pCurLine == m_pTxtLine1) ? m_pTxtLine2 : m_pTxtLine1;
+      (m_pCurLine == m_pTxtLine1.get()) ? m_pTxtLine2.get() : m_pTxtLine1.get();
   FX_BOOL bAllChars = (m_iCurAlignment > FX_TXTLINEALIGNMENT_Right);
   CFX_TPOArray tpos(100);
   CFX_Char* pTC;
@@ -973,6 +1005,7 @@
   }
   return dwStatus;
 }
+
 int32_t CFX_TxtBreak::GetBreakPos(CFX_TxtCharArray& ca,
                                   int32_t& iEndPos,
                                   FX_BOOL bAllChars,
@@ -1069,6 +1102,7 @@
   }
   return 0;
 }
+
 void CFX_TxtBreak::SplitTextLine(CFX_TxtLine* pCurLine,
                                  CFX_TxtLine* pNextLine,
                                  FX_BOOL bAllChars) {
@@ -1078,7 +1112,7 @@
     return;
   }
   int32_t iEndPos = pCurLine->m_iWidth;
-  CFX_TxtCharArray& curChars = *pCurLine->m_pLineChars;
+  CFX_TxtCharArray& curChars = *pCurLine->m_pLineChars.get();
   int32_t iCharPos = GetBreakPos(curChars, iEndPos, bAllChars, FALSE);
   if (iCharPos < 0) {
     iCharPos = 0;
@@ -1090,7 +1124,7 @@
     pTC->m_nBreakType = FX_LBT_UNKNOWN;
     return;
   }
-  CFX_TxtCharArray& nextChars = *pNextLine->m_pLineChars;
+  CFX_TxtCharArray& nextChars = *pNextLine->m_pLineChars.get();
   int cur_size = curChars.GetSize();
   nextChars.SetSize(cur_size - iCharPos);
   FXSYS_memcpy(nextChars.GetData(), curChars.GetDataPtr(iCharPos),
@@ -1120,14 +1154,17 @@
   }
   pNextLine->m_iWidth = iWidth;
 }
+
 int32_t CFX_TxtBreak::CountBreakChars() const {
   CFX_TxtLine* pTxtLine = GetTxtLine(TRUE);
   return pTxtLine ? pTxtLine->CountChars() : 0;
 }
+
 int32_t CFX_TxtBreak::CountBreakPieces() const {
   CFX_TxtPieceArray* pTxtPieces = GetTxtPieces(TRUE);
   return pTxtPieces ? pTxtPieces->GetSize() : 0;
 }
+
 const CFX_TxtPiece* CFX_TxtBreak::GetBreakPiece(int32_t index) const {
   CFX_TxtPieceArray* pTxtPieces = GetTxtPieces(TRUE);
   if (!pTxtPieces) {
@@ -1138,6 +1175,7 @@
   }
   return pTxtPieces->GetPtrAt(index);
 }
+
 void CFX_TxtBreak::ClearBreakPieces() {
   CFX_TxtLine* pTxtLine = GetTxtLine(TRUE);
   if (pTxtLine) {
@@ -1145,6 +1183,7 @@
   }
   m_iReady = 0;
 }
+
 void CFX_TxtBreak::Reset() {
   m_eCharType = FX_CHARTYPE_Unknown;
   m_iArabicContext = m_iCurArabicContext = 1;
@@ -1548,6 +1587,7 @@
   }
   return iCount;
 }
+
 int32_t CFX_TxtBreak::GetCharRects(const FX_TXTRUN* pTxtRun,
                                    CFX_RectFArray& rtArray,
                                    FX_BOOL bCharBBox) const {
@@ -1695,13 +1735,12 @@
       m_pUserData(nullptr) {}
 
 CFX_TxtLine::CFX_TxtLine(int32_t iBlockSize)
-    : m_iStart(0), m_iWidth(0), m_iArabicChars(0) {
-  m_pLineChars = new CFX_TxtCharArray;
-  m_pLinePieces = new CFX_TxtPieceArray(16);
-}
+    : m_pLineChars(new CFX_TxtCharArray),
+      m_pLinePieces(new CFX_TxtPieceArray(16)),
+      m_iStart(0),
+      m_iWidth(0),
+      m_iArabicChars(0) {}
 
 CFX_TxtLine::~CFX_TxtLine() {
   RemoveAll();
-  delete m_pLineChars;
-  delete m_pLinePieces;
 }
diff --git a/xfa/fgas/layout/fgas_textbreak.h b/xfa/fgas/layout/fgas_textbreak.h
index 3d8e3bd..366ba80 100644
--- a/xfa/fgas/layout/fgas_textbreak.h
+++ b/xfa/fgas/layout/fgas_textbreak.h
@@ -7,6 +7,8 @@
 #ifndef XFA_FGAS_LAYOUT_FGAS_TEXTBREAK_H_
 #define XFA_FGAS_LAYOUT_FGAS_TEXTBREAK_H_
 
+#include <memory>
+
 #include "core/fxcrt/include/fx_ucd.h"
 #include "core/fxge/include/fx_ge.h"
 #include "xfa/fgas/crt/fgas_utils.h"
@@ -188,8 +190,8 @@
     m_iArabicChars = 0;
   }
 
-  CFX_TxtCharArray* m_pLineChars;
-  CFX_TxtPieceArray* m_pLinePieces;
+  std::unique_ptr<CFX_TxtCharArray> m_pLineChars;
+  std::unique_ptr<CFX_TxtPieceArray> m_pLinePieces;
   int32_t m_iStart;
   int32_t m_iWidth;
   int32_t m_iArabicChars;
@@ -297,8 +299,8 @@
   int32_t m_iCurAlignment;
   FX_BOOL m_bArabicNumber;
   FX_BOOL m_bArabicComma;
-  CFX_TxtLine* m_pTxtLine1;
-  CFX_TxtLine* m_pTxtLine2;
+  std::unique_ptr<CFX_TxtLine> m_pTxtLine1;
+  std::unique_ptr<CFX_TxtLine> m_pTxtLine2;
   CFX_TxtLine* m_pCurLine;
   int32_t m_iReady;
   int32_t m_iTolerance;
diff --git a/xfa/fwl/basewidget/cfx_barcode.cpp b/xfa/fwl/basewidget/cfx_barcode.cpp
index 723619f..cb554f5 100644
--- a/xfa/fwl/basewidget/cfx_barcode.cpp
+++ b/xfa/fwl/basewidget/cfx_barcode.cpp
@@ -54,12 +54,10 @@
 
 CFX_Barcode::CFX_Barcode() {}
 
-CFX_Barcode::~CFX_Barcode() {
-  delete m_pBCEngine;
-}
+CFX_Barcode::~CFX_Barcode() {}
 
 FX_BOOL CFX_Barcode::Create(BC_TYPE type) {
-  m_pBCEngine = CreateBarCodeEngineObject(type);
+  m_pBCEngine.reset(CreateBarCodeEngineObject(type));
   return !!m_pBCEngine;
 }
 BC_TYPE CFX_Barcode::GetType() {
@@ -91,7 +89,7 @@
     case BC_EAN13:
     case BC_UPCA:
       return m_pBCEngine
-                 ? static_cast<CBC_OneCode*>(m_pBCEngine)
+                 ? static_cast<CBC_OneCode*>(m_pBCEngine.get())
                        ->CheckContentValidity(contents)
                  : TRUE;
     default:
@@ -108,7 +106,7 @@
     case BC_EAN8:
     case BC_EAN13:
     case BC_UPCA:
-      return m_pBCEngine ? (static_cast<CBC_OneCode*>(m_pBCEngine)
+      return m_pBCEngine ? (static_cast<CBC_OneCode*>(m_pBCEngine.get())
                                 ->SetPrintChecksum(checksum),
                             TRUE)
                          : FALSE;
@@ -126,7 +124,7 @@
     case BC_EAN8:
     case BC_EAN13:
     case BC_UPCA:
-      return m_pBCEngine ? (static_cast<CBC_OneCode*>(m_pBCEngine)
+      return m_pBCEngine ? (static_cast<CBC_OneCode*>(m_pBCEngine.get())
                                 ->SetDataLength(length),
                             TRUE)
                          : FALSE;
@@ -144,7 +142,7 @@
     case BC_EAN8:
     case BC_EAN13:
     case BC_UPCA:
-      return m_pBCEngine ? (static_cast<CBC_OneCode*>(m_pBCEngine)
+      return m_pBCEngine ? (static_cast<CBC_OneCode*>(m_pBCEngine.get())
                                 ->SetCalChecksum(state),
                             TRUE)
                          : FALSE;
@@ -163,7 +161,7 @@
     case BC_EAN13:
     case BC_UPCA:
       return m_pBCEngine
-                 ? static_cast<CBC_OneCode*>(m_pBCEngine)->SetFont(pFont)
+                 ? static_cast<CBC_OneCode*>(m_pBCEngine.get())->SetFont(pFont)
                  : FALSE;
     default:
       return FALSE;
@@ -179,10 +177,10 @@
     case BC_EAN8:
     case BC_EAN13:
     case BC_UPCA:
-      return m_pBCEngine
-                 ? (static_cast<CBC_OneCode*>(m_pBCEngine)->SetFontSize(size),
-                    TRUE)
-                 : FALSE;
+      return m_pBCEngine ? (static_cast<CBC_OneCode*>(m_pBCEngine.get())
+                                ->SetFontSize(size),
+                            TRUE)
+                         : FALSE;
     default:
       return FALSE;
   }
@@ -197,10 +195,10 @@
     case BC_EAN8:
     case BC_EAN13:
     case BC_UPCA:
-      return m_pBCEngine
-                 ? (static_cast<CBC_OneCode*>(m_pBCEngine)->SetFontStyle(style),
-                    TRUE)
-                 : FALSE;
+      return m_pBCEngine ? (static_cast<CBC_OneCode*>(m_pBCEngine.get())
+                                ->SetFontStyle(style),
+                            TRUE)
+                         : FALSE;
     default:
       return FALSE;
   }
@@ -215,10 +213,10 @@
     case BC_EAN8:
     case BC_EAN13:
     case BC_UPCA:
-      return m_pBCEngine
-                 ? (static_cast<CBC_OneCode*>(m_pBCEngine)->SetFontColor(color),
-                    TRUE)
-                 : FALSE;
+      return m_pBCEngine ? (static_cast<CBC_OneCode*>(m_pBCEngine.get())
+                                ->SetFontColor(color),
+                            TRUE)
+                         : FALSE;
     default:
       return FALSE;
   }
@@ -241,7 +239,7 @@
     default:
       break;
   }
-  return m_pBCEngine && memptr ? (m_pBCEngine->*memptr)(location) : FALSE;
+  return m_pBCEngine && memptr ? (m_pBCEngine.get()->*memptr)(location) : FALSE;
 }
 FX_BOOL CFX_Barcode::SetWideNarrowRatio(int32_t ratio) {
   typedef FX_BOOL (CBC_CodeBase::*memptrtype)(int32_t);
@@ -256,7 +254,7 @@
     default:
       break;
   }
-  return m_pBCEngine && memptr ? (m_pBCEngine->*memptr)(ratio) : FALSE;
+  return m_pBCEngine && memptr ? (m_pBCEngine.get()->*memptr)(ratio) : FALSE;
 }
 FX_BOOL CFX_Barcode::SetStartChar(FX_CHAR start) {
   typedef FX_BOOL (CBC_CodeBase::*memptrtype)(FX_CHAR);
@@ -268,7 +266,7 @@
     default:
       break;
   }
-  return m_pBCEngine && memptr ? (m_pBCEngine->*memptr)(start) : FALSE;
+  return m_pBCEngine && memptr ? (m_pBCEngine.get()->*memptr)(start) : FALSE;
 }
 FX_BOOL CFX_Barcode::SetEndChar(FX_CHAR end) {
   typedef FX_BOOL (CBC_CodeBase::*memptrtype)(FX_CHAR);
@@ -280,7 +278,7 @@
     default:
       break;
   }
-  return m_pBCEngine && memptr ? (m_pBCEngine->*memptr)(end) : FALSE;
+  return m_pBCEngine && memptr ? (m_pBCEngine.get()->*memptr)(end) : FALSE;
 }
 FX_BOOL CFX_Barcode::SetVersion(int32_t version) {
   typedef FX_BOOL (CBC_CodeBase::*memptrtype)(int32_t);
@@ -292,7 +290,7 @@
     default:
       break;
   }
-  return m_pBCEngine && memptr ? (m_pBCEngine->*memptr)(version) : FALSE;
+  return m_pBCEngine && memptr ? (m_pBCEngine.get()->*memptr)(version) : FALSE;
 }
 FX_BOOL CFX_Barcode::SetErrorCorrectionLevel(int32_t level) {
   typedef FX_BOOL (CBC_CodeBase::*memptrtype)(int32_t);
@@ -307,7 +305,7 @@
     default:
       return FALSE;
   }
-  return m_pBCEngine && memptr ? (m_pBCEngine->*memptr)(level) : FALSE;
+  return m_pBCEngine && memptr ? (m_pBCEngine.get()->*memptr)(level) : FALSE;
 }
 FX_BOOL CFX_Barcode::SetTruncated(FX_BOOL truncated) {
   typedef void (CBC_CodeBase::*memptrtype)(FX_BOOL);
@@ -319,29 +317,22 @@
     default:
       break;
   }
-  return m_pBCEngine && memptr ? ((m_pBCEngine->*memptr)(truncated), TRUE)
+  return m_pBCEngine && memptr ? ((m_pBCEngine.get()->*memptr)(truncated), TRUE)
                                : FALSE;
 }
 
 FX_BOOL CFX_Barcode::Encode(const CFX_WideStringC& contents,
                             FX_BOOL isDevice,
                             int32_t& e) {
-  if (!m_pBCEngine) {
-    return FALSE;
-  }
-  return m_pBCEngine->Encode(contents, isDevice, e);
+  return m_pBCEngine && m_pBCEngine->Encode(contents, isDevice, e);
 }
+
 FX_BOOL CFX_Barcode::RenderDevice(CFX_RenderDevice* device,
                                   const CFX_Matrix* matrix,
                                   int32_t& e) {
-  if (!m_pBCEngine) {
-    return FALSE;
-  }
-  return m_pBCEngine->RenderDevice(device, matrix, e);
+  return m_pBCEngine && m_pBCEngine->RenderDevice(device, matrix, e);
 }
+
 FX_BOOL CFX_Barcode::RenderBitmap(CFX_DIBitmap*& pOutBitmap, int32_t& e) {
-  if (!m_pBCEngine) {
-    return FALSE;
-  }
-  return m_pBCEngine->RenderBitmap(pOutBitmap, e);
+  return m_pBCEngine && m_pBCEngine->RenderBitmap(pOutBitmap, e);
 }
diff --git a/xfa/fwl/basewidget/cfx_barcode.h b/xfa/fwl/basewidget/cfx_barcode.h
index 2ba1f7f..758ba20 100644
--- a/xfa/fwl/basewidget/cfx_barcode.h
+++ b/xfa/fwl/basewidget/cfx_barcode.h
@@ -7,6 +7,8 @@
 #ifndef XFA_FWL_BASEWIDGET_CFX_BARCODE_H_
 #define XFA_FWL_BASEWIDGET_CFX_BARCODE_H_
 
+#include <memory>
+
 #include "core/fxcrt/include/fx_coordinates.h"
 #include "core/fxcrt/include/fx_string.h"
 #include "core/fxcrt/include/fx_system.h"
@@ -52,7 +54,7 @@
   FX_BOOL SetTruncated(FX_BOOL truncated);
 
  protected:
-  CBC_CodeBase* m_pBCEngine;
+  std::unique_ptr<CBC_CodeBase> m_pBCEngine;
 };
 
 #endif  // XFA_FWL_BASEWIDGET_CFX_BARCODE_H_
diff --git a/xfa/fwl/basewidget/fwl_caretimp.cpp b/xfa/fwl/basewidget/fwl_caretimp.cpp
index dbe8e50..cd51bd7 100644
--- a/xfa/fwl/basewidget/fwl_caretimp.cpp
+++ b/xfa/fwl/basewidget/fwl_caretimp.cpp
@@ -38,16 +38,14 @@
 CFWL_CaretImp::CFWL_CaretImp(const CFWL_WidgetImpProperties& properties,
                              IFWL_Widget* pOuter)
     : CFWL_WidgetImp(properties, pOuter),
+      m_pTimer(new CFWL_CaretTimer(this)),
       m_pTimerInfo(nullptr),
       m_dwElapse(400),
       m_bSetColor(FALSE) {
-  m_pTimer = new CFWL_CaretTimer(this);
   SetStates(FWL_STATE_CAT_HightLight);
 }
 
-CFWL_CaretImp::~CFWL_CaretImp() {
-  delete m_pTimer;
-}
+CFWL_CaretImp::~CFWL_CaretImp() {}
 
 FWL_Error CFWL_CaretImp::GetClassName(CFX_WideString& wsClass) const {
   wsClass = FWL_CLASS_Caret;
diff --git a/xfa/fwl/basewidget/fwl_caretimp.h b/xfa/fwl/basewidget/fwl_caretimp.h
index 4f16715..d8b621b 100644
--- a/xfa/fwl/basewidget/fwl_caretimp.h
+++ b/xfa/fwl/basewidget/fwl_caretimp.h
@@ -7,6 +7,8 @@
 #ifndef XFA_FWL_BASEWIDGET_FWL_CARETIMP_H_
 #define XFA_FWL_BASEWIDGET_FWL_CARETIMP_H_
 
+#include <memory>
+
 #include "xfa/fwl/core/fwl_widgetimp.h"
 #include "xfa/fwl/core/ifwl_timer.h"
 #include "xfa/fwl/core/ifwl_widget.h"
@@ -51,8 +53,8 @@
                    IFWL_ThemeProvider* pTheme,
                    const CFX_Matrix* pMatrix);
 
-  CFWL_CaretTimer* m_pTimer;
-  IFWL_TimerInfo* m_pTimerInfo;
+  std::unique_ptr<CFWL_CaretTimer> m_pTimer;
+  IFWL_TimerInfo* m_pTimerInfo;  // not owned.
   uint32_t m_dwElapse;
   CFX_Color m_crFill;
   FX_BOOL m_bSetColor;
diff --git a/xfa/fwl/basewidget/fwl_editimp.cpp b/xfa/fwl/basewidget/fwl_editimp.cpp
index ae0b7bc..104054f 100644
--- a/xfa/fwl/basewidget/fwl_editimp.cpp
+++ b/xfa/fwl/basewidget/fwl_editimp.cpp
@@ -203,7 +203,6 @@
       m_fVAlignOffset(0.0f),
       m_fScrollOffsetX(0.0f),
       m_fScrollOffsetY(0.0f),
-      m_pEdtEngine(nullptr),
       m_bLButtonDown(FALSE),
       m_nSelStart(0),
       m_nLimit(-1),
@@ -223,7 +222,6 @@
 }
 
 CFWL_EditImp::~CFWL_EditImp() {
-  delete m_pEdtEngine;
   ClearRecord();
 }
 
@@ -898,26 +896,27 @@
   LayoutScrollBar();
   Repaint(&rtTemp);
 }
+
 void CFWL_EditImp::On_SelChanged(CFDE_TxtEdtEngine* pEdit) {
   CFX_RectF rtTemp;
   GetClientRect(rtTemp);
   Repaint(&rtTemp);
 }
+
 FX_BOOL CFWL_EditImp::On_PageLoad(CFDE_TxtEdtEngine* pEdit,
                                   int32_t nPageIndex,
                                   int32_t nPurpose) {
-  CFDE_TxtEdtEngine* pEdtEngine = m_pEdtEngine;
-  IFDE_TxtEdtPage* pPage = pEdtEngine->GetPage(nPageIndex);
+  IFDE_TxtEdtPage* pPage = m_pEdtEngine->GetPage(nPageIndex);
   if (!pPage)
     return FALSE;
   pPage->LoadPage(nullptr, nullptr);
   return TRUE;
 }
+
 FX_BOOL CFWL_EditImp::On_PageUnload(CFDE_TxtEdtEngine* pEdit,
                                     int32_t nPageIndex,
                                     int32_t nPurpose) {
-  CFDE_TxtEdtEngine* pEdtEngine = m_pEdtEngine;
-  IFDE_TxtEdtPage* pPage = pEdtEngine->GetPage(nPageIndex);
+  IFDE_TxtEdtPage* pPage = m_pEdtEngine->GetPage(nPageIndex);
   if (!pPage)
     return FALSE;
   pPage->UnloadPage(nullptr);
@@ -1630,7 +1629,7 @@
 
 void CFWL_EditImp::InitEngine() {
   if (!m_pEdtEngine)
-    m_pEdtEngine = new CFDE_TxtEdtEngine;
+    m_pEdtEngine.reset(new CFDE_TxtEdtEngine);
 }
 
 FX_BOOL FWL_ShowCaret(IFWL_Widget* pWidget,
diff --git a/xfa/fwl/basewidget/fwl_editimp.h b/xfa/fwl/basewidget/fwl_editimp.h
index 3f7a386..e17a4cf 100644
--- a/xfa/fwl/basewidget/fwl_editimp.h
+++ b/xfa/fwl/basewidget/fwl_editimp.h
@@ -152,7 +152,7 @@
   FX_FLOAT m_fVAlignOffset;
   FX_FLOAT m_fScrollOffsetX;
   FX_FLOAT m_fScrollOffsetY;
-  CFDE_TxtEdtEngine* m_pEdtEngine;
+  std::unique_ptr<CFDE_TxtEdtEngine> m_pEdtEngine;
   FX_BOOL m_bLButtonDown;
   int32_t m_nSelStart;
   int32_t m_nLimit;
diff --git a/xfa/fwl/basewidget/fwl_monthcalendarimp.cpp b/xfa/fwl/basewidget/fwl_monthcalendarimp.cpp
index ca141a2..7477f04 100644
--- a/xfa/fwl/basewidget/fwl_monthcalendarimp.cpp
+++ b/xfa/fwl/basewidget/fwl_monthcalendarimp.cpp
@@ -151,6 +151,8 @@
     const CFWL_WidgetImpProperties& properties,
     IFWL_Widget* pOuter)
     : CFWL_WidgetImp(properties, pOuter),
+      m_bInit(FALSE),
+      m_pDateTime(new CFX_DateTime),
       m_iCurYear(2011),
       m_iCurMonth(1),
       m_iYear(2011),
@@ -158,7 +160,8 @@
       m_iDay(1),
       m_iHovered(-1),
       m_iLBtnPartStates(CFWL_PartState_Normal),
-      m_iRBtnPartStates(CFWL_PartState_Normal) {
+      m_iRBtnPartStates(CFWL_PartState_Normal),
+      m_iMaxSel(1) {
   m_rtHead.Reset();
   m_rtWeek.Reset();
   m_rtLBtn.Reset();
@@ -171,14 +174,10 @@
   m_rtClient.Reset();
   m_rtWeekNum.Reset();
   m_rtWeekNumSep.Reset();
-  m_pDateTime = new CFX_DateTime;
-  m_bInit = FALSE;
-  m_iMaxSel = 1;
 }
 
 CFWL_MonthCalendarImp::~CFWL_MonthCalendarImp() {
   ClearDateItem();
-  delete m_pDateTime;
   m_arrSelDays.RemoveAll();
 }
 
diff --git a/xfa/fwl/basewidget/fwl_monthcalendarimp.h b/xfa/fwl/basewidget/fwl_monthcalendarimp.h
index db6ce78..2716f59 100644
--- a/xfa/fwl/basewidget/fwl_monthcalendarimp.h
+++ b/xfa/fwl/basewidget/fwl_monthcalendarimp.h
@@ -7,6 +7,8 @@
 #ifndef XFA_FWL_BASEWIDGET_FWL_MONTHCALENDARIMP_H_
 #define XFA_FWL_BASEWIDGET_FWL_MONTHCALENDARIMP_H_
 
+#include <memory>
+
 #include "xfa/fgas/localization/fgas_datetime.h"
 #include "xfa/fwl/core/fwl_widgetimp.h"
 #include "xfa/fwl/core/ifwl_widget.h"
@@ -164,7 +166,7 @@
   CFX_RectF m_rtTemp;
   CFX_WideString m_wsHead;
   CFX_WideString m_wsToday;
-  CFX_DateTime* m_pDateTime;
+  std::unique_ptr<CFX_DateTime> m_pDateTime;
   CFX_ArrayTemplate<FWL_DATEINFO*> m_arrDates;
   int32_t m_iCurYear;
   int32_t m_iCurMonth;
diff --git a/xfa/fwl/basewidget/fwl_tooltipctrlimp.cpp b/xfa/fwl/basewidget/fwl_tooltipctrlimp.cpp
index 85af738..cf89483 100644
--- a/xfa/fwl/basewidget/fwl_tooltipctrlimp.cpp
+++ b/xfa/fwl/basewidget/fwl_tooltipctrlimp.cpp
@@ -48,8 +48,7 @@
       m_dwTTOStyles(FDE_TTOSTYLE_SingleLine),
       m_iTTOAlign(FDE_TTOALIGNMENT_Center),
       m_pTimerInfoShow(nullptr),
-      m_pTimerInfoHide(nullptr),
-      m_pTimer(nullptr) {
+      m_pTimerInfoHide(nullptr) {
   m_rtClient.Set(0, 0, 0, 0);
   m_rtCaption.Set(0, 0, 0, 0);
   m_rtAnchor.Set(0, 0, 0, 0);
@@ -57,10 +56,7 @@
   m_TimerHide.m_pToolTip = this;
 }
 
-CFWL_ToolTipImp::~CFWL_ToolTipImp() {
-  delete m_pTimer;
-  m_pTimer = nullptr;
-}
+CFWL_ToolTipImp::~CFWL_ToolTipImp() {}
 
 FWL_Error CFWL_ToolTipImp::GetClassName(CFX_WideString& wsClass) const {
   wsClass = FWL_CLASS_ToolTip;
diff --git a/xfa/fwl/basewidget/fwl_tooltipctrlimp.h b/xfa/fwl/basewidget/fwl_tooltipctrlimp.h
index 79e3f49..f814eea 100644
--- a/xfa/fwl/basewidget/fwl_tooltipctrlimp.h
+++ b/xfa/fwl/basewidget/fwl_tooltipctrlimp.h
@@ -69,7 +69,6 @@
   CFX_RectF m_rtAnchor;
   IFWL_TimerInfo* m_pTimerInfoShow;
   IFWL_TimerInfo* m_pTimerInfoHide;
-  CFWL_ToolTipTimer* m_pTimer;
   CFWL_ToolTipTimer m_TimerShow;
   CFWL_ToolTipTimer m_TimerHide;
 };
diff --git a/xfa/fwl/core/fwl_formimp.cpp b/xfa/fwl/core/fwl_formimp.cpp
index a3fc6be..1b82ff5 100644
--- a/xfa/fwl/core/fwl_formimp.cpp
+++ b/xfa/fwl/core/fwl_formimp.cpp
@@ -75,7 +75,6 @@
       m_pMinBox(nullptr),
       m_pMaxBox(nullptr),
       m_pCaptionBox(nullptr),
-      m_pNoteLoop(nullptr),
       m_pSubFocus(nullptr),
       m_fCXBorder(0),
       m_fCYBorder(0),
@@ -100,7 +99,6 @@
 
 CFWL_FormImp::~CFWL_FormImp() {
   RemoveSysButtons();
-  delete m_pNoteLoop;
 }
 
 FWL_Error CFWL_FormImp::GetClassName(CFX_WideString& wsClass) const {
@@ -371,13 +369,16 @@
 #endif
   return FWL_Error::Succeeded;
 }
+
 FWL_FORMSIZE CFWL_FormImp::GetFormSize() {
   return m_eFormSize;
 }
+
 FWL_Error CFWL_FormImp::SetFormSize(FWL_FORMSIZE eFormSize) {
   m_eFormSize = eFormSize;
   return FWL_Error::Succeeded;
 }
+
 IFWL_Widget* CFWL_FormImp::DoModal() {
   IFWL_App* pApp = GetOwnerApp();
   if (!pApp)
@@ -387,8 +388,8 @@
   if (!pDriver)
     return nullptr;
 
-  m_pNoteLoop = new CFWL_NoteLoop(this);
-  pDriver->PushNoteLoop(m_pNoteLoop);
+  m_pNoteLoop.reset(new CFWL_NoteLoop(this));
+  pDriver->PushNoteLoop(m_pNoteLoop.get());
   m_bDoModalFlag = TRUE;
   SetStates(FWL_WGTSTATE_Invisible, FALSE);
   pDriver->Run();
@@ -396,13 +397,14 @@
 #else
   pDriver->PopNoteLoop();
 #endif
-  delete m_pNoteLoop;
-  m_pNoteLoop = nullptr;
+  m_pNoteLoop.reset();
   return nullptr;
 }
+
 IFWL_Widget* CFWL_FormImp::DoModal(uint32_t& dwCommandID) {
   return DoModal();
 }
+
 FWL_Error CFWL_FormImp::EndDoModal() {
   if (!m_pNoteLoop)
     return FWL_Error::Indefinite;
@@ -426,6 +428,7 @@
   return m_pNoteLoop->EndModalLoop();
 #endif
 }
+
 FWL_Error CFWL_FormImp::SetBorderRegion(CFX_Path* pPath) {
   return FWL_Error::Succeeded;
 }
diff --git a/xfa/fwl/core/fwl_formimp.h b/xfa/fwl/core/fwl_formimp.h
index ee1507d..c88b5e6 100644
--- a/xfa/fwl/core/fwl_formimp.h
+++ b/xfa/fwl/core/fwl_formimp.h
@@ -7,6 +7,8 @@
 #ifndef XFA_FWL_CORE_FWL_FORMIMP_H_
 #define XFA_FWL_CORE_FWL_FORMIMP_H_
 
+#include <memory>
+
 #include "xfa/fwl/core/fwl_widgetimp.h"
 #include "xfa/fwl/core/ifwl_form.h"
 
@@ -134,7 +136,7 @@
   CFWL_SysBtn* m_pMinBox;
   CFWL_SysBtn* m_pMaxBox;
   CFWL_SysBtn* m_pCaptionBox;
-  CFWL_NoteLoop* m_pNoteLoop;
+  std::unique_ptr<CFWL_NoteLoop> m_pNoteLoop;
   CFWL_WidgetImp* m_pSubFocus;
   RestoreInfo m_InfoStart;
   FX_FLOAT m_fCXBorder;
diff --git a/xfa/fwl/core/fwl_noteimp.cpp b/xfa/fwl/core/fwl_noteimp.cpp
index f115e2f..8ecec2d 100644
--- a/xfa/fwl/core/fwl_noteimp.cpp
+++ b/xfa/fwl/core/fwl_noteimp.cpp
@@ -70,10 +70,9 @@
       m_pFocus(nullptr),
       m_pGrab(nullptr),
       m_pNoteLoop(new CFWL_NoteLoop) {
-  PushNoteLoop(m_pNoteLoop);
+  PushNoteLoop(m_pNoteLoop.get());
 }
 CFWL_NoteDriver::~CFWL_NoteDriver() {
-  delete m_pNoteLoop;
   ClearInvalidEventTargets(TRUE);
 }
 
@@ -655,6 +654,8 @@
 
 class CFWL_CoreToolTipDP : public IFWL_ToolTipDP {
  public:
+  CFWL_CoreToolTipDP(int32_t iInitDelayTime, int32_t iAutoDelayTime);
+
   // IFWL_ToolTipDP
   FWL_Error GetCaption(IFWL_Widget* pWidget,
                        CFX_WideString& wsCaption) override;
@@ -664,7 +665,6 @@
   CFX_SizeF GetToolTipIconSize(IFWL_Widget* pWidget) override;
 
   CFX_RectF GetAnchor();
-  CFWL_CoreToolTipDP();
 
   CFX_WideString m_wsCaption;
   int32_t m_nInitDelayTime;
@@ -672,9 +672,9 @@
   CFX_RectF m_fAnchor;
 };
 
-CFWL_CoreToolTipDP::CFWL_CoreToolTipDP() {
-  m_nInitDelayTime = 500;
-  m_nAutoPopDelayTime = 50000;
+CFWL_CoreToolTipDP::CFWL_CoreToolTipDP(int32_t iInitDelayTime,
+                                       int32_t iAutoDelayTime)
+    : m_nInitDelayTime(iInitDelayTime), m_nAutoPopDelayTime(iAutoDelayTime) {
   m_fAnchor.Set(0.0, 0.0, 0.0, 0.0);
 }
 
@@ -773,11 +773,9 @@
 
 CFWL_ToolTipContainer* CFWL_ToolTipContainer::s_pInstance = nullptr;
 
-CFWL_ToolTipContainer::CFWL_ToolTipContainer() : m_pToolTipImp(nullptr) {
-  m_ToolTipDp = new CFWL_CoreToolTipDP;
-  m_ToolTipDp->m_nInitDelayTime = 0;
-  m_ToolTipDp->m_nAutoPopDelayTime = 2000;
-}
+CFWL_ToolTipContainer::CFWL_ToolTipContainer()
+    : m_pToolTipImp(nullptr), m_pToolTipDp(new CFWL_CoreToolTipDP(0, 2000)) {}
+
 CFWL_ToolTipContainer::~CFWL_ToolTipContainer() {
   if (m_pToolTipImp) {
     IFWL_ToolTip* pToolTip =
@@ -785,7 +783,6 @@
     pToolTip->Finalize();
     delete pToolTip;
   }
-  delete m_ToolTipDp;
 }
 
 // static
diff --git a/xfa/fwl/core/fwl_noteimp.h b/xfa/fwl/core/fwl_noteimp.h
index c92395a..f923c39 100644
--- a/xfa/fwl/core/fwl_noteimp.h
+++ b/xfa/fwl/core/fwl_noteimp.h
@@ -7,6 +7,7 @@
 #ifndef XFA_FWL_CORE_FWL_NOTEIMP_H_
 #define XFA_FWL_CORE_FWL_NOTEIMP_H_
 
+#include <memory>
 #include <unordered_map>
 
 #include "xfa/fwl/core/cfwl_event.h"
@@ -115,7 +116,7 @@
   IFWL_Widget* m_pHover;
   IFWL_Widget* m_pFocus;
   IFWL_Widget* m_pGrab;
-  CFWL_NoteLoop* m_pNoteLoop;
+  std::unique_ptr<CFWL_NoteLoop> m_pNoteLoop;
 };
 
 class CFWL_EventTarget {
@@ -147,7 +148,7 @@
   ~CFWL_ToolTipContainer();
 
   CFWL_ToolTipImp* m_pToolTipImp;
-  CFWL_CoreToolTipDP* m_ToolTipDp;
+  std::unique_ptr<CFWL_CoreToolTipDP> m_pToolTipDp;
 
  private:
   static CFWL_ToolTipContainer* s_pInstance;
diff --git a/xfa/fwl/core/fwl_widgetimp.cpp b/xfa/fwl/core/fwl_widgetimp.cpp
index 52a2978..3aa6233 100644
--- a/xfa/fwl/core/fwl_widgetimp.cpp
+++ b/xfa/fwl/core/fwl_widgetimp.cpp
@@ -531,7 +531,8 @@
 
 CFWL_WidgetImp::CFWL_WidgetImp(const CFWL_WidgetImpProperties& properties,
                                IFWL_Widget* pOuter)
-    : m_pProperties(new CFWL_WidgetImpProperties),
+    : m_pWidgetMgr(CFWL_WidgetMgr::GetInstance()),
+      m_pProperties(new CFWL_WidgetImpProperties(properties)),
       m_pDelegate(nullptr),
       m_pCurDelegate(nullptr),
       m_pOuter(pOuter),
@@ -540,14 +541,10 @@
       m_pAssociate(nullptr),
       m_iLock(0),
       m_nEventKey(0) {
-  *m_pProperties = properties;
-  m_pWidgetMgr = CFWL_WidgetMgr::GetInstance();
   ASSERT(m_pWidgetMgr);
 }
 
-CFWL_WidgetImp::~CFWL_WidgetImp() {
-  delete m_pProperties;
-}
+CFWL_WidgetImp::~CFWL_WidgetImp() {}
 
 FX_BOOL CFWL_WidgetImp::IsEnabled() const {
   return (m_pProperties->m_dwStates & FWL_WGTSTATE_Disabled) == 0;
diff --git a/xfa/fwl/core/fwl_widgetimp.h b/xfa/fwl/core/fwl_widgetimp.h
index d8c4fe6..cbc89b9 100644
--- a/xfa/fwl/core/fwl_widgetimp.h
+++ b/xfa/fwl/core/fwl_widgetimp.h
@@ -7,6 +7,8 @@
 #ifndef XFA_FWL_CORE_FWL_WIDGETIMP_H_
 #define XFA_FWL_CORE_FWL_WIDGETIMP_H_
 
+#include <memory>
+
 #include "core/fxcrt/include/fx_coordinates.h"
 #include "core/fxcrt/include/fx_system.h"
 #include "xfa/fwl/core/cfwl_event.h"
@@ -154,9 +156,9 @@
 
   FX_BOOL IsParent(IFWL_Widget* pParent);
 
-  CFWL_WidgetMgr* m_pWidgetMgr;
+  CFWL_WidgetMgr* const m_pWidgetMgr;
   CFWL_AppImp* m_pOwnerApp;
-  CFWL_WidgetImpProperties* m_pProperties;
+  std::unique_ptr<CFWL_WidgetImpProperties> m_pProperties;
   IFWL_WidgetDelegate* m_pDelegate;
   IFWL_WidgetDelegate* m_pCurDelegate;
   IFWL_Widget* m_pOuter;