Use std::map, std::unique_ptr in fwl_widgetmgrimp.h

Review-Url: https://codereview.chromium.org/1998303002
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 {