diff --git a/xfa/fwl/core/fwl_widgetmgrimp.cpp b/xfa/fwl/core/fwl_widgetmgrimp.cpp
index f4ceb78..ff37972 100644
--- a/xfa/fwl/core/fwl_widgetmgrimp.cpp
+++ b/xfa/fwl/core/fwl_widgetmgrimp.cpp
@@ -43,29 +43,18 @@
   return pApp->GetWidgetMgr();
 }
 
-CFWL_WidgetMgr::CFWL_WidgetMgr(CXFA_FFApp* pAdapterNative) : m_dwCapability(0) {
-  m_pDelegate = new CFWL_WidgetMgrDelegate(this);
-  m_pAdapter = pAdapterNative->GetWidgetMgr(m_pDelegate);
+CFWL_WidgetMgr::CFWL_WidgetMgr(CXFA_FFApp* pAdapterNative)
+    : m_dwCapability(0),
+      m_pDelegate(new CFWL_WidgetMgrDelegate(this)),
+      m_pAdapter(pAdapterNative->GetWidgetMgr(m_pDelegate.get())) {
   ASSERT(m_pAdapter);
-  CFWL_WidgetMgrItem* pRoot = new CFWL_WidgetMgrItem;
-  m_mapWidgetItem.SetAt(NULL, pRoot);
-
+  m_mapWidgetItem[nullptr].reset(new CFWL_WidgetMgrItem);
 #if (_FX_OS_ == _FX_WIN32_DESKTOP_) || (_FX_OS_ == _FX_WIN64_)
   m_rtScreen.Reset();
 #endif
 }
 
-CFWL_WidgetMgr::~CFWL_WidgetMgr() {
-  FX_POSITION ps = m_mapWidgetItem.GetStartPosition();
-  while (ps) {
-    void* pWidget;
-    CFWL_WidgetMgrItem* pItem;
-    m_mapWidgetItem.GetNextAssoc(ps, pWidget, (void*&)pItem);
-    delete pItem;
-  }
-  m_mapWidgetItem.RemoveAll();
-  delete m_pDelegate;
-}
+CFWL_WidgetMgr::~CFWL_WidgetMgr() {}
 
 int32_t CFWL_WidgetMgr::CountWidgets(IFWL_Widget* pParent) {
   CFWL_WidgetMgrItem* pParentItem = GetWidgetMgrItem(pParent);
@@ -248,9 +237,8 @@
   CFWL_WidgetMgrItem* pParentItem = GetWidgetMgrItem(NULL);
   CFWL_WidgetMgrItem* pItem = GetWidgetMgrItem(pWidget);
   if (!pItem) {
-    pItem = new CFWL_WidgetMgrItem;
-    pItem->pWidget = pWidget;
-    m_mapWidgetItem.SetAt(pWidget, pItem);
+    pItem = new CFWL_WidgetMgrItem(pWidget);
+    m_mapWidgetItem[pWidget].reset(pItem);
   }
   if (pItem->pParent && pItem->pParent != pParentItem) {
     if (pItem->pPrevious) {
@@ -271,18 +259,15 @@
                                   int32_t nIndex) {
   CFWL_WidgetMgrItem* pParentItem = GetWidgetMgrItem(pParent);
   if (!pParentItem) {
-    pParentItem = new CFWL_WidgetMgrItem;
-    pParentItem->pWidget = pParent;
-    m_mapWidgetItem.SetAt(pParent, pParentItem);
-    CFWL_WidgetMgrItem* pRoot = GetWidgetMgrItem(NULL);
-    pParentItem->pParent = pRoot;
+    pParentItem = new CFWL_WidgetMgrItem(pParent);
+    m_mapWidgetItem[pParent].reset(pParentItem);
+    pParentItem->pParent = GetWidgetMgrItem(nullptr);
     SetWidgetIndex(pParent, -1);
   }
   CFWL_WidgetMgrItem* pItem = GetWidgetMgrItem(pChild);
   if (!pItem) {
-    pItem = new CFWL_WidgetMgrItem;
-    pItem->pWidget = pChild;
-    m_mapWidgetItem.SetAt(pChild, pItem);
+    pItem = new CFWL_WidgetMgrItem(pChild);
+    m_mapWidgetItem[pChild].reset(pItem);
   }
   if (pItem->pParent && pItem->pParent != pParentItem) {
     if (pItem->pPrevious) {
@@ -318,24 +303,20 @@
     RemoveWidget(pChild->pWidget);
     pChild = pNext;
   }
-  m_mapWidgetItem.RemoveKey(pWidget);
-  delete pItem;
+  m_mapWidgetItem.erase(pWidget);
 }
 void CFWL_WidgetMgr::SetOwner(IFWL_Widget* pOwner, IFWL_Widget* pOwned) {
   CFWL_WidgetMgrItem* pParentItem = GetWidgetMgrItem(pOwner);
   if (!pParentItem) {
-    pParentItem = new CFWL_WidgetMgrItem;
-    pParentItem->pWidget = pOwner;
-    m_mapWidgetItem.SetAt(pOwner, pParentItem);
-    CFWL_WidgetMgrItem* pRoot = GetWidgetMgrItem(NULL);
-    pParentItem->pParent = pRoot;
+    pParentItem = new CFWL_WidgetMgrItem(pOwner);
+    m_mapWidgetItem[pOwner].reset(pParentItem);
+    pParentItem->pParent = GetWidgetMgrItem(nullptr);
     SetWidgetIndex(pOwner, -1);
   }
   CFWL_WidgetMgrItem* pItem = GetWidgetMgrItem(pOwned);
   if (!pItem) {
-    pItem = new CFWL_WidgetMgrItem;
-    pItem->pWidget = pOwned;
-    m_mapWidgetItem.SetAt(pOwned, pItem);
+    pItem = new CFWL_WidgetMgrItem(pOwned);
+    m_mapWidgetItem[pOwned].reset(pItem);
   }
   pItem->pOwner = pParentItem;
 }
@@ -383,8 +364,7 @@
         CFX_DIBitmap* pBitmap = pDevice->GetBitmap();
         if (pBitmap->GetWidth() - rect.width > 1 ||
             pBitmap->GetHeight() - rect.height > 1) {
-          delete pItem->pOffscreen;
-          pItem->pOffscreen = NULL;
+          pItem->pOffscreen.reset();
         }
       }
     }
@@ -429,12 +409,8 @@
 void CFWL_WidgetMgr::NotifySizeChanged(IFWL_Widget* pForm,
                                        FX_FLOAT fx,
                                        FX_FLOAT fy) {
-  if (!FWL_UseOffscreen(pForm))
-    return;
-
-  CFWL_WidgetMgrItem* pItem = GetWidgetMgrItem(pForm);
-  delete pItem->pOffscreen;
-  pItem->pOffscreen = nullptr;
+  if (FWL_UseOffscreen(pForm))
+    GetWidgetMgrItem(pForm)->pOffscreen.reset();
 }
 
 IFWL_Widget* CFWL_WidgetMgr::nextTab(IFWL_Widget* parent,
@@ -541,8 +517,12 @@
   CFWL_WidgetMgrItem* pItem = GetWidgetMgrItem(pWidget);
   pItem->iRedrawCounter = 0;
 }
-CFWL_WidgetMgrItem* CFWL_WidgetMgr::GetWidgetMgrItem(IFWL_Widget* pWidget) {
-  return static_cast<CFWL_WidgetMgrItem*>(m_mapWidgetItem.GetValueAt(pWidget));
+CFWL_WidgetMgrItem* CFWL_WidgetMgr::GetWidgetMgrItem(
+    IFWL_Widget* pWidget) const {
+  auto it = m_mapWidgetItem.find(pWidget);
+  return it != m_mapWidgetItem.end()
+             ? static_cast<CFWL_WidgetMgrItem*>(it->second.get())
+             : nullptr;
 }
 int32_t CFWL_WidgetMgr::TravelWidgetMgr(CFWL_WidgetMgrItem* pParent,
                                         int32_t* pIndex,
@@ -756,7 +736,7 @@
 
   CFWL_WidgetMgrItem* pItem = m_pWidgetMgr->GetWidgetMgrItem(pWidget);
   if (!pItem->pOffscreen) {
-    pItem->pOffscreen = new CFX_Graphics;
+    pItem->pOffscreen.reset(new CFX_Graphics);
     CFX_RectF rect;
     pWidget->GetWidgetRect(rect);
     pItem->pOffscreen->Create((int32_t)rect.width, (int32_t)rect.height,
@@ -765,7 +745,7 @@
   CFX_RectF rect;
   pGraphics->GetClipRect(rect);
   pItem->pOffscreen->SetClipRect(rect);
-  return pItem->pOffscreen;
+  return pItem->pOffscreen.get();
 }
 
 void CFWL_WidgetMgrDelegate::DrawWidgetAfter(IFWL_Widget* pWidget,
@@ -774,8 +754,8 @@
                                              const CFX_Matrix* pMatrix) {
   if (FWL_UseOffscreen(pWidget)) {
     CFWL_WidgetMgrItem* pItem = m_pWidgetMgr->GetWidgetMgrItem(pWidget);
-    pGraphics->Transfer(pItem->pOffscreen, rtClip.left, rtClip.top, rtClip,
-                        pMatrix);
+    pGraphics->Transfer(pItem->pOffscreen.get(), rtClip.left, rtClip.top,
+                        rtClip, pMatrix);
 #ifdef _WIN32
     pItem->pOffscreen->ClearClip();
 #endif
diff --git a/xfa/fwl/core/fwl_widgetmgrimp.h b/xfa/fwl/core/fwl_widgetmgrimp.h
index fe17613..6e4fffe 100644
--- a/xfa/fwl/core/fwl_widgetmgrimp.h
+++ b/xfa/fwl/core/fwl_widgetmgrimp.h
@@ -7,6 +7,9 @@
 #ifndef XFA_FWL_CORE_FWL_WIDGETMGRIMP_H_
 #define XFA_FWL_CORE_FWL_WIDGETMGRIMP_H_
 
+#include <map>
+#include <memory>
+
 #include "core/fxcrt/include/fx_system.h"
 #include "xfa/fwl/core/fwl_error.h"
 #include "xfa/fwl/core/ifwl_widgetmgr.h"
@@ -25,14 +28,14 @@
 
 class CFWL_WidgetMgrItem {
  public:
-  CFWL_WidgetMgrItem()
-      : pParent(NULL),
-        pOwner(NULL),
-        pChild(NULL),
-        pPrevious(NULL),
-        pNext(NULL),
-        pWidget(NULL),
-        pOffscreen(NULL),
+  CFWL_WidgetMgrItem() : CFWL_WidgetMgrItem(nullptr) {}
+  explicit CFWL_WidgetMgrItem(IFWL_Widget* widget)
+      : pParent(nullptr),
+        pOwner(nullptr),
+        pChild(nullptr),
+        pPrevious(nullptr),
+        pNext(nullptr),
+        pWidget(widget),
         iRedrawCounter(0)
 #if (_FX_OS_ == _FX_WIN32_DESKTOP_) || (_FX_OS_ == _FX_WIN64_)
         ,
@@ -40,19 +43,15 @@
 #endif
   {
   }
-  ~CFWL_WidgetMgrItem() {
-    if (pOffscreen) {
-      delete pOffscreen;
-      pOffscreen = NULL;
-    }
-  }
+  ~CFWL_WidgetMgrItem() {}
+
   CFWL_WidgetMgrItem* pParent;
   CFWL_WidgetMgrItem* pOwner;
   CFWL_WidgetMgrItem* pChild;
   CFWL_WidgetMgrItem* pPrevious;
   CFWL_WidgetMgrItem* pNext;
-  IFWL_Widget* pWidget;
-  CFX_Graphics* pOffscreen;
+  IFWL_Widget* const pWidget;
+  std::unique_ptr<CFX_Graphics> pOffscreen;
   int32_t iRedrawCounter;
 #if (_FX_OS_ == _FX_WIN32_DESKTOP_) || (_FX_OS_ == _FX_WIN64_)
   FX_BOOL bOutsideChanged;
@@ -96,8 +95,8 @@
   void AddRedrawCounts(IFWL_Widget* pWidget);
   void ResetRedrawCounts(IFWL_Widget* pWidget);
   CXFA_FWLAdapterWidgetMgr* GetAdapterWidgetMgr() const { return m_pAdapter; }
-  CFWL_WidgetMgrDelegate* GetDelegate() const { return m_pDelegate; }
-  CFWL_WidgetMgrItem* GetWidgetMgrItem(IFWL_Widget* pWidget);
+  CFWL_WidgetMgrDelegate* GetDelegate() const { return m_pDelegate.get(); }
+  CFWL_WidgetMgrItem* GetWidgetMgrItem(IFWL_Widget* pWidget) const;
   bool IsThreadEnabled();
   bool IsFormDisabled();
   FX_BOOL GetAdapterPopupPos(IFWL_Widget* pWidget,
@@ -112,14 +111,15 @@
                           CFWL_WidgetMgrItem* pItem,
                           IFWL_Widget** pWidget = NULL);
   FX_BOOL IsAbleNative(IFWL_Widget* pWidget);
-  CFX_MapPtrToPtr m_mapWidgetItem;
-  CXFA_FWLAdapterWidgetMgr* m_pAdapter;
-  CFWL_WidgetMgrDelegate* m_pDelegate;
-  friend class CFWL_WidgetMgrDelegate;
+
   uint32_t m_dwCapability;
+  std::unique_ptr<CFWL_WidgetMgrDelegate> m_pDelegate;
+  std::map<IFWL_Widget*, std::unique_ptr<CFWL_WidgetMgrItem>> m_mapWidgetItem;
+  CXFA_FWLAdapterWidgetMgr* const m_pAdapter;
 #if (_FX_OS_ == _FX_WIN32_DESKTOP_) || (_FX_OS_ == _FX_WIN64_)
   CFX_RectF m_rtScreen;
 #endif
+  friend class CFWL_WidgetMgrDelegate;
 };
 
 class CFWL_WidgetMgrDelegate {
