Merge delegates into IFWL_* classes.

This Cl removes ownership of the delgates from IFWL_Widget and puts it in the
hand of the creating classes. In doing so, merge the delegates back into the
IFWL_* classes to simplify logic.

Review-Url: https://codereview.chromium.org/2467993003
diff --git a/BUILD.gn b/BUILD.gn
index f1e95c6..962e20c 100644
--- a/BUILD.gn
+++ b/BUILD.gn
@@ -1202,6 +1202,8 @@
       "xfa/fwl/core/ifwl_checkbox.h",
       "xfa/fwl/core/ifwl_combobox.cpp",
       "xfa/fwl/core/ifwl_combobox.h",
+      "xfa/fwl/core/ifwl_comboboxproxy.cpp",
+      "xfa/fwl/core/ifwl_comboboxproxy.h",
       "xfa/fwl/core/ifwl_comboedit.cpp",
       "xfa/fwl/core/ifwl_comboedit.h",
       "xfa/fwl/core/ifwl_combolist.cpp",
diff --git a/xfa/fwl/core/cfwl_widget.cpp b/xfa/fwl/core/cfwl_widget.cpp
index 999a5a8..db0d4eb 100644
--- a/xfa/fwl/core/cfwl_widget.cpp
+++ b/xfa/fwl/core/cfwl_widget.cpp
@@ -127,11 +127,11 @@
   return m_pIface->DrawWidget(pGraphics, pMatrix);
 }
 
-IFWL_WidgetDelegate* CFWL_Widget::GetCurrentDelegate() {
-  return m_pIface ? m_pIface->GetCurrentDelegate() : nullptr;
+IFWL_WidgetDelegate* CFWL_Widget::GetDelegate() const {
+  return m_pIface ? m_pIface->GetDelegate() : nullptr;
 }
 
-void CFWL_Widget::SetCurrentDelegate(IFWL_WidgetDelegate* pDelegate) {
+void CFWL_Widget::SetDelegate(IFWL_WidgetDelegate* pDelegate) {
   if (m_pIface)
-    m_pIface->SetCurrentDelegate(pDelegate);
+    m_pIface->SetDelegate(pDelegate);
 }
diff --git a/xfa/fwl/core/cfwl_widget.h b/xfa/fwl/core/cfwl_widget.h
index 28a7666..2921145 100644
--- a/xfa/fwl/core/cfwl_widget.h
+++ b/xfa/fwl/core/cfwl_widget.h
@@ -51,8 +51,8 @@
   FWL_Error DrawWidget(CFX_Graphics* pGraphics,
                        const CFX_Matrix* pMatrix = nullptr);
 
-  IFWL_WidgetDelegate* GetCurrentDelegate();
-  void SetCurrentDelegate(IFWL_WidgetDelegate*);
+  IFWL_WidgetDelegate* GetDelegate() const;
+  void SetDelegate(IFWL_WidgetDelegate*);
 
  protected:
   void Initialize();
diff --git a/xfa/fwl/core/cfwl_widgetmgr.cpp b/xfa/fwl/core/cfwl_widgetmgr.cpp
index 1008def..37e31dc 100644
--- a/xfa/fwl/core/cfwl_widgetmgr.cpp
+++ b/xfa/fwl/core/cfwl_widgetmgr.cpp
@@ -613,18 +613,18 @@
 
 #if _FX_OS_ == _FX_WIN32_DESKTOP_ || _FX_OS_ == _FX_WIN64_ || \
     _FX_OS_ == _FX_LINUX_DESKTOP_ || _FX_OS_ == _FX_ANDROID_
-  pWidget->GetCurrentDelegate()->OnDrawWidget(pTemp, pMatrix);
+  pWidget->GetDelegate()->OnDrawWidget(pTemp, pMatrix);
   pGraphics->GetClipRect(clipBounds);
   clipCopy = clipBounds;
 #elif _FX_OS_ == _FX_MACOSX_
   if (m_pWidgetMgr->IsFormDisabled()) {
-    pWidget->GetCurrentDelegate()->OnDrawWidget(pTemp, pMatrix);
+    pWidget->GetDelegate()->OnDrawWidget(pTemp, pMatrix);
     pGraphics->GetClipRect(clipBounds);
     clipCopy = clipBounds;
   } else {
     clipBounds.Set(pMatrix->a, pMatrix->b, pMatrix->c, pMatrix->d);
     const_cast<CFX_Matrix*>(pMatrix)->SetIdentity();  // FIXME: const cast.
-    pWidget->GetCurrentDelegate()->OnDrawWidget(pTemp, pMatrix);
+    pWidget->GetDelegate()->OnDrawWidget(pTemp, pMatrix);
   }
 #endif  // _FX_OS_ == _FX_MACOSX_
 
@@ -678,7 +678,7 @@
     }
     widgetMatrix.Translate(rtWidget.left, rtWidget.top, TRUE);
 
-    if (IFWL_WidgetDelegate* pDelegate = child->GetCurrentDelegate()) {
+    if (IFWL_WidgetDelegate* pDelegate = child->GetDelegate()) {
       if (m_pWidgetMgr->IsFormDisabled() ||
           IsNeedRepaint(child, &widgetMatrix, rtClip)) {
         pDelegate->OnDrawWidget(pGraphics, &widgetMatrix);
diff --git a/xfa/fwl/core/fwl_noteimp.cpp b/xfa/fwl/core/fwl_noteimp.cpp
index 2ca34f9..2c67f6e 100644
--- a/xfa/fwl/core/fwl_noteimp.cpp
+++ b/xfa/fwl/core/fwl_noteimp.cpp
@@ -144,7 +144,7 @@
     if (bNotify) {
       ms.m_dwExtend = 1;
     }
-    if (IFWL_WidgetDelegate* pDelegate = pPrev->GetCurrentDelegate())
+    if (IFWL_WidgetDelegate* pDelegate = pPrev->GetDelegate())
       pDelegate->OnProcessMessage(&ms);
   }
   if (pFocus) {
@@ -160,7 +160,7 @@
       ms.m_dwExtend = 1;
     }
 
-    if (IFWL_WidgetDelegate* pDelegate = pFocus->GetCurrentDelegate())
+    if (IFWL_WidgetDelegate* pDelegate = pFocus->GetDelegate())
       pDelegate->OnProcessMessage(&ms);
   }
   return TRUE;
@@ -361,7 +361,7 @@
   }
   if (bRet) {
     if (IFWL_WidgetDelegate* pDelegate =
-            pMessage->m_pDstTarget->GetCurrentDelegate()) {
+            pMessage->m_pDstTarget->GetDelegate()) {
       pDelegate->OnProcessMessage(pMessage);
     }
   }
@@ -707,7 +707,7 @@
 }
 
 FX_BOOL CFWL_EventTarget::ProcessEvent(CFWL_Event* pEvent) {
-  IFWL_WidgetDelegate* pDelegate = m_pListener->GetCurrentDelegate();
+  IFWL_WidgetDelegate* pDelegate = m_pListener->GetDelegate();
   if (!pDelegate)
     return FALSE;
   if (m_eventSources.GetCount() == 0) {
diff --git a/xfa/fwl/core/ifwl_barcode.cpp b/xfa/fwl/core/ifwl_barcode.cpp
index 9a2d91a..e708e7e 100644
--- a/xfa/fwl/core/ifwl_barcode.cpp
+++ b/xfa/fwl/core/ifwl_barcode.cpp
@@ -16,7 +16,6 @@
 IFWL_Barcode::IFWL_Barcode(const IFWL_App* app,
                            const CFWL_WidgetImpProperties& properties)
     : IFWL_Edit(app, properties, nullptr), m_dwStatus(0), m_type(BC_UNKNOWN) {
-  SetDelegate(pdfium::MakeUnique<CFWL_BarcodeImpDelegate>(this));
 }
 
 IFWL_Barcode::~IFWL_Barcode() {}
@@ -175,14 +174,10 @@
   return FALSE;
 }
 
-CFWL_BarcodeImpDelegate::CFWL_BarcodeImpDelegate(IFWL_Barcode* pOwner)
-    : CFWL_EditImpDelegate(pOwner) {}
-
-void CFWL_BarcodeImpDelegate::OnProcessEvent(CFWL_Event* pEvent) {
+void IFWL_Barcode::OnProcessEvent(CFWL_Event* pEvent) {
   if (pEvent->GetClassID() == CFWL_EventType::TextChanged) {
-    IFWL_Barcode* pOwner = static_cast<IFWL_Barcode*>(m_pOwner);
-    pOwner->m_pBarcodeEngine.reset();
-    pOwner->m_dwStatus = XFA_BCS_NeedUpdate;
+    m_pBarcodeEngine.reset();
+    m_dwStatus = XFA_BCS_NeedUpdate;
   }
-  CFWL_EditImpDelegate::OnProcessEvent(pEvent);
+  IFWL_Edit::OnProcessEvent(pEvent);
 }
diff --git a/xfa/fwl/core/ifwl_barcode.h b/xfa/fwl/core/ifwl_barcode.h
index f7f2842..33cb442 100644
--- a/xfa/fwl/core/ifwl_barcode.h
+++ b/xfa/fwl/core/ifwl_barcode.h
@@ -13,7 +13,6 @@
 #include "xfa/fwl/core/ifwl_scrollbar.h"
 #include "xfa/fxbarcode/BC_Library.h"
 
-class CFWL_BarcodeImpDelegate;
 class CFWL_WidgetImpProperties;
 class CFX_Barcode;
 class IFWL_Widget;
@@ -68,13 +67,12 @@
   FWL_Error DrawWidget(CFX_Graphics* pGraphics,
                        const CFX_Matrix* pMatrix = nullptr) override;
   FWL_Error SetText(const CFX_WideString& wsText) override;
+  void OnProcessEvent(CFWL_Event* pEvent) override;
 
   void SetType(BC_TYPE type);
   FX_BOOL IsProtectedType();
 
  protected:
-  friend class CFWL_BarcodeImpDelegate;
-
   void GenerateBarcodeImageCache();
   void CreateBarcodeEngine();
 
@@ -83,10 +81,4 @@
   BC_TYPE m_type;
 };
 
-class CFWL_BarcodeImpDelegate : public CFWL_EditImpDelegate {
- public:
-  explicit CFWL_BarcodeImpDelegate(IFWL_Barcode* pOwner);
-  void OnProcessEvent(CFWL_Event* pEvent) override;
-};
-
 #endif  // XFA_FWL_CORE_IFWL_BARCODE_H_
diff --git a/xfa/fwl/core/ifwl_caret.cpp b/xfa/fwl/core/ifwl_caret.cpp
index 2dd1866..94b56e8 100644
--- a/xfa/fwl/core/ifwl_caret.cpp
+++ b/xfa/fwl/core/ifwl_caret.cpp
@@ -22,7 +22,6 @@
       m_dwElapse(400),
       m_bSetColor(FALSE) {
   SetStates(FWL_STATE_CAT_HightLight);
-  SetDelegate(pdfium::MakeUnique<CFWL_CaretImpDelegate>(this));
 }
 
 IFWL_Caret::~IFWL_Caret() {
@@ -99,6 +98,13 @@
   pTheme->DrawBackground(&param);
 }
 
+void IFWL_Caret::OnProcessMessage(CFWL_Message* pMessage) {}
+
+void IFWL_Caret::OnDrawWidget(CFX_Graphics* pGraphics,
+                              const CFX_Matrix* pMatrix) {
+  DrawWidget(pGraphics, pMatrix);
+}
+
 IFWL_Caret::Timer::Timer(IFWL_Caret* pCaret) : IFWL_Timer(pCaret) {}
 
 void IFWL_Caret::Timer::Run(IFWL_TimerInfo* pTimerInfo) {
@@ -111,13 +117,3 @@
   rt.Set(0, 0, rt.width + 1, rt.height);
   pCaret->Repaint(&rt);
 }
-
-CFWL_CaretImpDelegate::CFWL_CaretImpDelegate(IFWL_Caret* pOwner)
-    : m_pOwner(pOwner) {}
-
-void CFWL_CaretImpDelegate::OnProcessMessage(CFWL_Message* pMessage) {}
-
-void CFWL_CaretImpDelegate::OnDrawWidget(CFX_Graphics* pGraphics,
-                                         const CFX_Matrix* pMatrix) {
-  m_pOwner->DrawWidget(pGraphics, pMatrix);
-}
diff --git a/xfa/fwl/core/ifwl_caret.h b/xfa/fwl/core/ifwl_caret.h
index 022cada..888e8ff 100644
--- a/xfa/fwl/core/ifwl_caret.h
+++ b/xfa/fwl/core/ifwl_caret.h
@@ -15,7 +15,6 @@
 
 class CFWL_WidgetImpProperties;
 class IFWL_Widget;
-class CFWL_CaretImpDelegate;
 
 #define FWL_STATE_CAT_HightLight 1
 
@@ -30,6 +29,9 @@
   FWL_Type GetClassID() const override;
   FWL_Error DrawWidget(CFX_Graphics* pGraphics,
                        const CFX_Matrix* pMatrix = nullptr) override;
+  void OnProcessMessage(CFWL_Message* pMessage) override;
+  void OnDrawWidget(CFX_Graphics* pGraphics,
+                    const CFX_Matrix* pMatrix) override;
 
   void ShowCaret(FX_BOOL bFlag = TRUE);
   FWL_Error GetFrequency(uint32_t& elapse);
@@ -37,8 +39,6 @@
   FWL_Error SetColor(CFX_Color crFill);
 
  protected:
-  friend class CFWL_CaretImpDelegate;
-
   class Timer : public IFWL_Timer {
    public:
     explicit Timer(IFWL_Caret* pCaret);
@@ -59,15 +59,4 @@
   FX_BOOL m_bSetColor;
 };
 
-class CFWL_CaretImpDelegate : public CFWL_WidgetImpDelegate {
- public:
-  CFWL_CaretImpDelegate(IFWL_Caret* pOwner);
-  void OnProcessMessage(CFWL_Message* pMessage) override;
-  void OnDrawWidget(CFX_Graphics* pGraphics,
-                    const CFX_Matrix* pMatrix = nullptr) override;
-
- protected:
-  IFWL_Caret* m_pOwner;
-};
-
 #endif  // XFA_FWL_CORE_IFWL_CARET_H_
diff --git a/xfa/fwl/core/ifwl_checkbox.cpp b/xfa/fwl/core/ifwl_checkbox.cpp
index 23edbd7..b4e6fd4 100644
--- a/xfa/fwl/core/ifwl_checkbox.cpp
+++ b/xfa/fwl/core/ifwl_checkbox.cpp
@@ -35,8 +35,6 @@
   m_rtBox.Reset();
   m_rtCaption.Reset();
   m_rtFocus.Reset();
-
-  SetDelegate(pdfium::MakeUnique<CFWL_CheckBoxImpDelegate>(this));
 }
 
 IFWL_CheckBox::~IFWL_CheckBox() {}
@@ -392,45 +390,35 @@
   }
 }
 
-CFWL_CheckBoxImpDelegate::CFWL_CheckBoxImpDelegate(IFWL_CheckBox* pOwner)
-    : m_pOwner(pOwner) {}
-
-void CFWL_CheckBoxImpDelegate::OnProcessMessage(CFWL_Message* pMessage) {
+void IFWL_CheckBox::OnProcessMessage(CFWL_Message* pMessage) {
   if (!pMessage)
     return;
 
   switch (pMessage->GetClassID()) {
-    case CFWL_MessageType::Activate: {
+    case CFWL_MessageType::Activate:
       OnActivate(pMessage);
       break;
-    }
-    case CFWL_MessageType::SetFocus: {
+    case CFWL_MessageType::SetFocus:
       OnFocusChanged(pMessage, TRUE);
       break;
-    }
-    case CFWL_MessageType::KillFocus: {
+    case CFWL_MessageType::KillFocus:
       OnFocusChanged(pMessage, FALSE);
       break;
-    }
     case CFWL_MessageType::Mouse: {
       CFWL_MsgMouse* pMsg = static_cast<CFWL_MsgMouse*>(pMessage);
       switch (pMsg->m_dwCmd) {
-        case FWL_MouseCommand::LeftButtonDown: {
+        case FWL_MouseCommand::LeftButtonDown:
           OnLButtonDown(pMsg);
           break;
-        }
-        case FWL_MouseCommand::LeftButtonUp: {
+        case FWL_MouseCommand::LeftButtonUp:
           OnLButtonUp(pMsg);
           break;
-        }
-        case FWL_MouseCommand::Move: {
+        case FWL_MouseCommand::Move:
           OnMouseMove(pMsg);
           break;
-        }
-        case FWL_MouseCommand::Leave: {
+        case FWL_MouseCommand::Leave:
           OnMouseLeave(pMsg);
           break;
-        }
         default:
           break;
       }
@@ -442,112 +430,111 @@
         OnKeyDown(pKey);
       break;
     }
-    default: { break; }
+    default:
+      break;
   }
 
-  CFWL_WidgetImpDelegate::OnProcessMessage(pMessage);
+  IFWL_Widget::OnProcessMessage(pMessage);
 }
 
-void CFWL_CheckBoxImpDelegate::OnDrawWidget(CFX_Graphics* pGraphics,
-                                            const CFX_Matrix* pMatrix) {
-  m_pOwner->DrawWidget(pGraphics, pMatrix);
+void IFWL_CheckBox::OnDrawWidget(CFX_Graphics* pGraphics,
+                                 const CFX_Matrix* pMatrix) {
+  DrawWidget(pGraphics, pMatrix);
 }
 
-void CFWL_CheckBoxImpDelegate::OnActivate(CFWL_Message* pMsg) {
-  m_pOwner->m_pProperties->m_dwStates &= ~FWL_WGTSTATE_Deactivated;
-  m_pOwner->Repaint(&(m_pOwner->m_rtClient));
+void IFWL_CheckBox::OnActivate(CFWL_Message* pMsg) {
+  m_pProperties->m_dwStates &= ~FWL_WGTSTATE_Deactivated;
+  Repaint(&(m_rtClient));
 }
 
-void CFWL_CheckBoxImpDelegate::OnFocusChanged(CFWL_Message* pMsg,
-                                              FX_BOOL bSet) {
-  if (bSet) {
-    m_pOwner->m_pProperties->m_dwStates |= FWL_WGTSTATE_Focused;
-  } else {
-    m_pOwner->m_pProperties->m_dwStates &= ~FWL_WGTSTATE_Focused;
-  }
-  m_pOwner->Repaint(&(m_pOwner->m_rtClient));
+void IFWL_CheckBox::OnFocusChanged(CFWL_Message* pMsg, FX_BOOL bSet) {
+  if (bSet)
+    m_pProperties->m_dwStates |= FWL_WGTSTATE_Focused;
+  else
+    m_pProperties->m_dwStates &= ~FWL_WGTSTATE_Focused;
+
+  Repaint(&(m_rtClient));
 }
 
-void CFWL_CheckBoxImpDelegate::OnLButtonDown(CFWL_MsgMouse* pMsg) {
-  if (m_pOwner->m_pProperties->m_dwStates & FWL_WGTSTATE_Disabled) {
+void IFWL_CheckBox::OnLButtonDown(CFWL_MsgMouse* pMsg) {
+  if (m_pProperties->m_dwStates & FWL_WGTSTATE_Disabled)
     return;
-  }
-  if ((m_pOwner->m_pProperties->m_dwStates & FWL_WGTSTATE_Focused) == 0) {
-    m_pOwner->SetFocus(TRUE);
-  }
-  m_pOwner->m_bBtnDown = TRUE;
-  m_pOwner->m_pProperties->m_dwStates &= ~FWL_STATE_CKB_Hovered;
-  m_pOwner->m_pProperties->m_dwStates |= FWL_STATE_CKB_Pressed;
-  m_pOwner->Repaint(&(m_pOwner->m_rtClient));
+  if ((m_pProperties->m_dwStates & FWL_WGTSTATE_Focused) == 0)
+    SetFocus(TRUE);
+
+  m_bBtnDown = TRUE;
+  m_pProperties->m_dwStates &= ~FWL_STATE_CKB_Hovered;
+  m_pProperties->m_dwStates |= FWL_STATE_CKB_Pressed;
+  Repaint(&(m_rtClient));
 }
 
-void CFWL_CheckBoxImpDelegate::OnLButtonUp(CFWL_MsgMouse* pMsg) {
-  if (!m_pOwner->m_bBtnDown) {
+void IFWL_CheckBox::OnLButtonUp(CFWL_MsgMouse* pMsg) {
+  if (!m_bBtnDown)
     return;
-  }
-  m_pOwner->m_bBtnDown = FALSE;
-  if (!m_pOwner->m_rtClient.Contains(pMsg->m_fx, pMsg->m_fy)) {
+
+  m_bBtnDown = FALSE;
+  if (!m_rtClient.Contains(pMsg->m_fx, pMsg->m_fy))
     return;
-  }
-  m_pOwner->m_pProperties->m_dwStates |= FWL_STATE_CKB_Hovered;
-  m_pOwner->m_pProperties->m_dwStates &= ~FWL_STATE_CKB_Pressed;
-  m_pOwner->NextStates();
+
+  m_pProperties->m_dwStates |= FWL_STATE_CKB_Hovered;
+  m_pProperties->m_dwStates &= ~FWL_STATE_CKB_Pressed;
+  NextStates();
 }
 
-void CFWL_CheckBoxImpDelegate::OnMouseMove(CFWL_MsgMouse* pMsg) {
-  if (m_pOwner->m_pProperties->m_dwStates & FWL_WGTSTATE_Disabled) {
+void IFWL_CheckBox::OnMouseMove(CFWL_MsgMouse* pMsg) {
+  if (m_pProperties->m_dwStates & FWL_WGTSTATE_Disabled)
     return;
-  }
+
   FX_BOOL bRepaint = FALSE;
-  if (m_pOwner->m_bBtnDown) {
-    if (m_pOwner->m_rtClient.Contains(pMsg->m_fx, pMsg->m_fy)) {
-      if ((m_pOwner->m_pProperties->m_dwStates & FWL_STATE_CKB_Pressed) == 0) {
+  if (m_bBtnDown) {
+    if (m_rtClient.Contains(pMsg->m_fx, pMsg->m_fy)) {
+      if ((m_pProperties->m_dwStates & FWL_STATE_CKB_Pressed) == 0) {
         bRepaint = TRUE;
-        m_pOwner->m_pProperties->m_dwStates |= FWL_STATE_CKB_Pressed;
+        m_pProperties->m_dwStates |= FWL_STATE_CKB_Pressed;
       }
-      if ((m_pOwner->m_pProperties->m_dwStates & FWL_STATE_CKB_Hovered)) {
+      if ((m_pProperties->m_dwStates & FWL_STATE_CKB_Hovered)) {
         bRepaint = TRUE;
-        m_pOwner->m_pProperties->m_dwStates &= ~FWL_STATE_CKB_Hovered;
+        m_pProperties->m_dwStates &= ~FWL_STATE_CKB_Hovered;
       }
     } else {
-      if (m_pOwner->m_pProperties->m_dwStates & FWL_STATE_CKB_Pressed) {
+      if (m_pProperties->m_dwStates & FWL_STATE_CKB_Pressed) {
         bRepaint = TRUE;
-        m_pOwner->m_pProperties->m_dwStates &= ~FWL_STATE_CKB_Pressed;
+        m_pProperties->m_dwStates &= ~FWL_STATE_CKB_Pressed;
       }
-      if ((m_pOwner->m_pProperties->m_dwStates & FWL_STATE_CKB_Hovered) == 0) {
+      if ((m_pProperties->m_dwStates & FWL_STATE_CKB_Hovered) == 0) {
         bRepaint = TRUE;
-        m_pOwner->m_pProperties->m_dwStates |= FWL_STATE_CKB_Hovered;
+        m_pProperties->m_dwStates |= FWL_STATE_CKB_Hovered;
       }
     }
   } else {
-    if (m_pOwner->m_rtClient.Contains(pMsg->m_fx, pMsg->m_fy)) {
-      if ((m_pOwner->m_pProperties->m_dwStates & FWL_STATE_CKB_Hovered) == 0) {
+    if (m_rtClient.Contains(pMsg->m_fx, pMsg->m_fy)) {
+      if ((m_pProperties->m_dwStates & FWL_STATE_CKB_Hovered) == 0) {
         bRepaint = TRUE;
-        m_pOwner->m_pProperties->m_dwStates |= FWL_STATE_CKB_Hovered;
+        m_pProperties->m_dwStates |= FWL_STATE_CKB_Hovered;
       }
     }
   }
   if (bRepaint) {
-    m_pOwner->Repaint(&(m_pOwner->m_rtBox));
+    Repaint(&(m_rtBox));
   }
 }
 
-void CFWL_CheckBoxImpDelegate::OnMouseLeave(CFWL_MsgMouse* pMsg) {
-  if (m_pOwner->m_bBtnDown) {
-    m_pOwner->m_pProperties->m_dwStates |= FWL_STATE_CKB_Hovered;
-  } else {
-    m_pOwner->m_pProperties->m_dwStates &= ~FWL_STATE_CKB_Hovered;
-  }
-  m_pOwner->Repaint(&(m_pOwner->m_rtBox));
+void IFWL_CheckBox::OnMouseLeave(CFWL_MsgMouse* pMsg) {
+  if (m_bBtnDown)
+    m_pProperties->m_dwStates |= FWL_STATE_CKB_Hovered;
+  else
+    m_pProperties->m_dwStates &= ~FWL_STATE_CKB_Hovered;
+
+  Repaint(&(m_rtBox));
 }
 
-void CFWL_CheckBoxImpDelegate::OnKeyDown(CFWL_MsgKey* pMsg) {
+void IFWL_CheckBox::OnKeyDown(CFWL_MsgKey* pMsg) {
   if (pMsg->m_dwKeyCode == FWL_VKEY_Tab) {
-    m_pOwner->DispatchKeyEvent(pMsg);
+    DispatchKeyEvent(pMsg);
     return;
   }
   if (pMsg->m_dwKeyCode == FWL_VKEY_Return ||
       pMsg->m_dwKeyCode == FWL_VKEY_Space) {
-    m_pOwner->NextStates();
+    NextStates();
   }
 }
diff --git a/xfa/fwl/core/ifwl_checkbox.h b/xfa/fwl/core/ifwl_checkbox.h
index 4d112c3..6222e4b 100644
--- a/xfa/fwl/core/ifwl_checkbox.h
+++ b/xfa/fwl/core/ifwl_checkbox.h
@@ -43,7 +43,6 @@
 #define FWL_STATE_CKB_Neutral (2 << (FWL_WGTSTATE_MAX + 2))
 #define FWL_STATE_CKB_CheckMask (3L << (FWL_WGTSTATE_MAX + 2))
 
-class CFWL_CheckBoxImpDelegate;
 class CFWL_MsgMouse;
 class CFWL_WidgetImpProperties;
 class IFWL_Widget;
@@ -67,12 +66,15 @@
   FWL_Error Update() override;
   FWL_Error DrawWidget(CFX_Graphics* pGraphics,
                        const CFX_Matrix* pMatrix = nullptr) override;
+
+  void OnProcessMessage(CFWL_Message* pMessage) override;
+  void OnDrawWidget(CFX_Graphics* pGraphics,
+                    const CFX_Matrix* pMatrix) override;
+
   int32_t GetCheckState();
   FWL_Error SetCheckState(int32_t iCheck);
 
  protected:
-  friend class CFWL_CheckBoxImpDelegate;
-
   void Layout();
   uint32_t GetPartStates();
   void UpdateTextOutStyles();
@@ -85,26 +87,15 @@
   uint32_t m_dwTTOStyles;
   int32_t m_iTTOAlign;
   FX_BOOL m_bBtnDown;
-};
 
-class CFWL_CheckBoxImpDelegate : public CFWL_WidgetImpDelegate {
- public:
-  CFWL_CheckBoxImpDelegate(IFWL_CheckBox* pOwner);
-
-  void OnProcessMessage(CFWL_Message* pMessage) override;
-  void OnDrawWidget(CFX_Graphics* pGraphics,
-                    const CFX_Matrix* pMatrix = nullptr) override;
-
- protected:
+ private:
   void OnActivate(CFWL_Message* pMsg);
-  void OnFocusChanged(CFWL_Message* pMsg, FX_BOOL bSet = TRUE);
+  void OnFocusChanged(CFWL_Message* pMsg, FX_BOOL bSet);
   void OnLButtonDown(CFWL_MsgMouse* pMsg);
   void OnLButtonUp(CFWL_MsgMouse* pMsg);
   void OnMouseMove(CFWL_MsgMouse* pMsg);
   void OnMouseLeave(CFWL_MsgMouse* pMsg);
   void OnKeyDown(CFWL_MsgKey* pMsg);
-
-  IFWL_CheckBox* m_pOwner;
 };
 
 #endif  // XFA_FWL_CORE_IFWL_CHECKBOX_H_
diff --git a/xfa/fwl/core/ifwl_combobox.cpp b/xfa/fwl/core/ifwl_combobox.cpp
index 28a5977..1721aee 100644
--- a/xfa/fwl/core/ifwl_combobox.cpp
+++ b/xfa/fwl/core/ifwl_combobox.cpp
@@ -16,6 +16,7 @@
 #include "xfa/fwl/core/cfwl_widgetmgr.h"
 #include "xfa/fwl/core/fwl_noteimp.h"
 #include "xfa/fwl/core/ifwl_app.h"
+#include "xfa/fwl/core/ifwl_comboboxproxy.h"
 #include "xfa/fwl/core/ifwl_comboedit.h"
 #include "xfa/fwl/core/ifwl_combolist.h"
 #include "xfa/fwl/core/ifwl_formproxy.h"
@@ -24,7 +25,7 @@
 IFWL_ComboBox::IFWL_ComboBox(const IFWL_App* app,
                              const CFWL_WidgetImpProperties& properties)
     : IFWL_Widget(app, properties, nullptr),
-      m_pForm(nullptr),
+      m_pComboBoxProxy(nullptr),
       m_bLButtonDown(FALSE),
       m_iCurSel(-1),
       m_iBtnState(CFWL_PartState_Normal),
@@ -34,8 +35,6 @@
   m_rtBtn.Reset();
   m_rtHandler.Reset();
 
-  SetDelegate(pdfium::MakeUnique<CFWL_ComboBoxImpDelegate>(this));
-
   if (m_pWidgetMgr->IsFormDisabled()) {
     DisForm_InitComboList();
     DisForm_InitComboEdit();
@@ -455,17 +454,16 @@
 }
 
 void IFWL_ComboBox::ShowDropList(FX_BOOL bActivate) {
-  if (m_pWidgetMgr->IsFormDisabled()) {
+  if (m_pWidgetMgr->IsFormDisabled())
     return DisForm_ShowDropList(bActivate);
-  }
+
   FX_BOOL bDropList = IsDropListShowed();
-  if (bDropList == bActivate) {
+  if (bDropList == bActivate)
     return;
-  }
-  if (!m_pForm) {
+  if (!m_pComboBoxProxy)
     InitProxyForm();
-  }
-  m_pListProxyDelegate->Reset();
+
+  m_pComboBoxProxy->Reset();
   if (bActivate) {
     m_pListBox->ChangeSelected(m_iCurSel);
     ReSetListItemAlignment();
@@ -505,8 +503,8 @@
                         m_fComboFormHandler);
       }
     }
-    m_pForm->SetWidgetRect(m_rtProxy);
-    m_pForm->Update();
+    m_pComboBoxProxy->SetWidgetRect(m_rtProxy);
+    m_pComboBoxProxy->Update();
     m_pListBox->SetWidgetRect(m_rtList);
     m_pListBox->Update();
     CFWL_EvtCmbPreDropDown ev;
@@ -514,10 +512,10 @@
     DispatchEvent(&ev);
     m_fItemHeight = m_pListBox->m_fItemHeight;
     m_pListBox->SetFocus(TRUE);
-    m_pForm->DoModal();
+    m_pComboBoxProxy->DoModal();
     m_pListBox->SetFocus(FALSE);
   } else {
-    m_pForm->EndDoModal();
+    m_pComboBoxProxy->EndDoModal();
     CFWL_EvtCmbCloseUp ev;
     ev.m_pSrcTarget = this;
     DispatchEvent(&ev);
@@ -528,7 +526,8 @@
 }
 
 FX_BOOL IFWL_ComboBox::IsDropListShowed() {
-  return m_pForm && !(m_pForm->GetStates() & FWL_WGTSTATE_Invisible);
+  return m_pComboBoxProxy &&
+         !(m_pComboBoxProxy->GetStates() & FWL_WGTSTATE_Invisible);
 }
 
 FX_BOOL IFWL_ComboBox::IsDropDownStyle() const {
@@ -689,7 +688,7 @@
 }
 
 void IFWL_ComboBox::InitProxyForm() {
-  if (m_pForm)
+  if (m_pComboBoxProxy)
     return;
   if (!m_pListBox)
     return;
@@ -699,10 +698,9 @@
   propForm.m_dwStyles = FWL_WGTSTYLE_Popup;
   propForm.m_dwStates = FWL_WGTSTATE_Invisible;
 
-  m_pForm = new IFWL_FormProxy(m_pOwnerApp, propForm, m_pListBox.get());
-  m_pListBox->SetParent(m_pForm);
-  m_pListProxyDelegate = new CFWL_ComboProxyImpDelegate(m_pForm, this);
-  m_pForm->SetCurrentDelegate(m_pListProxyDelegate);
+  m_pComboBoxProxy =
+      new IFWL_ComboBoxProxy(this, m_pOwnerApp, propForm, m_pListBox.get());
+  m_pListBox->SetParent(m_pComboBoxProxy);
 }
 
 void IFWL_ComboBox::DisForm_InitComboList() {
@@ -914,11 +912,8 @@
   }
 }
 
-CFWL_ComboBoxImpDelegate::CFWL_ComboBoxImpDelegate(IFWL_ComboBox* pOwner)
-    : m_pOwner(pOwner) {}
-
-void CFWL_ComboBoxImpDelegate::OnProcessMessage(CFWL_Message* pMessage) {
-  if (m_pOwner->m_pWidgetMgr->IsFormDisabled()) {
+void IFWL_ComboBox::OnProcessMessage(CFWL_Message* pMessage) {
+  if (m_pWidgetMgr->IsFormDisabled()) {
     DisForm_OnProcessMessage(pMessage);
     return;
   }
@@ -926,226 +921,217 @@
     return;
 
   switch (pMessage->GetClassID()) {
-    case CFWL_MessageType::SetFocus: {
+    case CFWL_MessageType::SetFocus:
       OnFocusChanged(pMessage, TRUE);
       break;
-    }
-    case CFWL_MessageType::KillFocus: {
+    case CFWL_MessageType::KillFocus:
       OnFocusChanged(pMessage, FALSE);
       break;
-    }
     case CFWL_MessageType::Mouse: {
       CFWL_MsgMouse* pMsg = static_cast<CFWL_MsgMouse*>(pMessage);
       switch (pMsg->m_dwCmd) {
-        case FWL_MouseCommand::LeftButtonDown: {
+        case FWL_MouseCommand::LeftButtonDown:
           OnLButtonDown(pMsg);
           break;
-        }
-        case FWL_MouseCommand::LeftButtonUp: {
+        case FWL_MouseCommand::LeftButtonUp:
           OnLButtonUp(pMsg);
           break;
-        }
-        case FWL_MouseCommand::Move: {
+        case FWL_MouseCommand::Move:
           OnMouseMove(pMsg);
           break;
-        }
-        case FWL_MouseCommand::Leave: {
+        case FWL_MouseCommand::Leave:
           OnMouseLeave(pMsg);
           break;
-        }
         default:
           break;
       }
       break;
     }
-    case CFWL_MessageType::Key: {
+    case CFWL_MessageType::Key:
       OnKey(static_cast<CFWL_MsgKey*>(pMessage));
       break;
-    }
-    default: { break; }
+    default:
+      break;
   }
 
-  CFWL_WidgetImpDelegate::OnProcessMessage(pMessage);
+  IFWL_Widget::OnProcessMessage(pMessage);
 }
 
-void CFWL_ComboBoxImpDelegate::OnProcessEvent(CFWL_Event* pEvent) {
+void IFWL_ComboBox::OnProcessEvent(CFWL_Event* pEvent) {
   CFWL_EventType dwFlag = pEvent->GetClassID();
   if (dwFlag == CFWL_EventType::DrawItem) {
     CFWL_EvtLtbDrawItem* pDrawItemEvent =
         static_cast<CFWL_EvtLtbDrawItem*>(pEvent);
     CFWL_EvtCmbDrawItem pTemp;
-    pTemp.m_pSrcTarget = m_pOwner;
+    pTemp.m_pSrcTarget = this;
     pTemp.m_pGraphics = pDrawItemEvent->m_pGraphics;
     pTemp.m_index = pDrawItemEvent->m_index;
     pTemp.m_rtItem = pDrawItemEvent->m_rect;
-    m_pOwner->DispatchEvent(&pTemp);
+    DispatchEvent(&pTemp);
   } else if (dwFlag == CFWL_EventType::Scroll) {
     CFWL_EvtScroll* pScrollEvent = static_cast<CFWL_EvtScroll*>(pEvent);
     CFWL_EvtScroll pScrollEv;
-    pScrollEv.m_pSrcTarget = m_pOwner;
+    pScrollEv.m_pSrcTarget = this;
     pScrollEv.m_iScrollCode = pScrollEvent->m_iScrollCode;
     pScrollEv.m_fPos = pScrollEvent->m_fPos;
-    m_pOwner->DispatchEvent(&pScrollEv);
+    DispatchEvent(&pScrollEv);
   } else if (dwFlag == CFWL_EventType::TextChanged) {
     CFWL_EvtEdtTextChanged* pTextChangedEvent =
         static_cast<CFWL_EvtEdtTextChanged*>(pEvent);
     CFWL_EvtCmbEditChanged pTemp;
-    pTemp.m_pSrcTarget = m_pOwner;
+    pTemp.m_pSrcTarget = this;
     pTemp.wsInsert = pTextChangedEvent->wsInsert;
     pTemp.wsDelete = pTextChangedEvent->wsDelete;
     pTemp.nChangeType = pTextChangedEvent->nChangeType;
-    m_pOwner->DispatchEvent(&pTemp);
+    DispatchEvent(&pTemp);
   }
 }
 
-void CFWL_ComboBoxImpDelegate::OnDrawWidget(CFX_Graphics* pGraphics,
-                                            const CFX_Matrix* pMatrix) {
-  m_pOwner->DrawWidget(pGraphics, pMatrix);
+void IFWL_ComboBox::OnDrawWidget(CFX_Graphics* pGraphics,
+                                 const CFX_Matrix* pMatrix) {
+  DrawWidget(pGraphics, pMatrix);
 }
 
-void CFWL_ComboBoxImpDelegate::OnFocusChanged(CFWL_Message* pMsg,
-                                              FX_BOOL bSet) {
+void IFWL_ComboBox::OnFocusChanged(CFWL_Message* pMsg, FX_BOOL bSet) {
   IFWL_Widget* pDstTarget = pMsg->m_pDstTarget;
   IFWL_Widget* pSrcTarget = pMsg->m_pSrcTarget;
-  FX_BOOL bDropDown = m_pOwner->IsDropDownStyle();
+  FX_BOOL bDropDown = IsDropDownStyle();
   if (bSet) {
-    m_pOwner->m_pProperties->m_dwStates |= FWL_WGTSTATE_Focused;
-    if (bDropDown && pSrcTarget != m_pOwner->m_pListBox.get()) {
-      if (!m_pOwner->m_pEdit)
+    m_pProperties->m_dwStates |= FWL_WGTSTATE_Focused;
+    if (bDropDown && pSrcTarget != m_pListBox.get()) {
+      if (!m_pEdit)
         return;
-      m_pOwner->m_pEdit->SetSelected();
+      m_pEdit->SetSelected();
     } else {
-      m_pOwner->Repaint(&m_pOwner->m_rtClient);
+      Repaint(&m_rtClient);
     }
   } else {
-    m_pOwner->m_pProperties->m_dwStates &= ~FWL_WGTSTATE_Focused;
-    if (bDropDown && pDstTarget != m_pOwner->m_pListBox.get()) {
-      if (!m_pOwner->m_pEdit)
+    m_pProperties->m_dwStates &= ~FWL_WGTSTATE_Focused;
+    if (bDropDown && pDstTarget != m_pListBox.get()) {
+      if (!m_pEdit)
         return;
-      m_pOwner->m_pEdit->FlagFocus(FALSE);
-      m_pOwner->m_pEdit->ClearSelected();
+      m_pEdit->FlagFocus(FALSE);
+      m_pEdit->ClearSelected();
     } else {
-      m_pOwner->Repaint(&m_pOwner->m_rtClient);
+      Repaint(&m_rtClient);
     }
   }
 }
 
-void CFWL_ComboBoxImpDelegate::OnLButtonDown(CFWL_MsgMouse* pMsg) {
-  if (m_pOwner->m_pProperties->m_dwStates & FWL_WGTSTATE_Disabled) {
+void IFWL_ComboBox::OnLButtonDown(CFWL_MsgMouse* pMsg) {
+  if (m_pProperties->m_dwStates & FWL_WGTSTATE_Disabled)
     return;
-  }
-  FX_BOOL bDropDown = m_pOwner->IsDropDownStyle();
-  CFX_RectF& rtBtn = bDropDown ? m_pOwner->m_rtBtn : m_pOwner->m_rtClient;
+
+  FX_BOOL bDropDown = IsDropDownStyle();
+  CFX_RectF& rtBtn = bDropDown ? m_rtBtn : m_rtClient;
   FX_BOOL bClickBtn = rtBtn.Contains(pMsg->m_fx, pMsg->m_fy);
-  if (bClickBtn) {
-    if (bDropDown && m_pOwner->m_pEdit) {
-      m_pOwner->MatchEditText();
-    }
-    m_pOwner->m_bLButtonDown = TRUE;
-    m_pOwner->m_iBtnState = CFWL_PartState_Pressed;
-    m_pOwner->Repaint(&m_pOwner->m_rtClient);
-    m_pOwner->ShowDropList(TRUE);
-    m_pOwner->m_iBtnState = CFWL_PartState_Normal;
-    m_pOwner->Repaint(&m_pOwner->m_rtClient);
-  }
+  if (!bClickBtn)
+    return;
+
+  if (bDropDown && m_pEdit)
+    MatchEditText();
+
+  m_bLButtonDown = TRUE;
+  m_iBtnState = CFWL_PartState_Pressed;
+  Repaint(&m_rtClient);
+  ShowDropList(TRUE);
+  m_iBtnState = CFWL_PartState_Normal;
+  Repaint(&m_rtClient);
 }
 
-void CFWL_ComboBoxImpDelegate::OnLButtonUp(CFWL_MsgMouse* pMsg) {
-  m_pOwner->m_bLButtonDown = FALSE;
-  if (m_pOwner->m_rtBtn.Contains(pMsg->m_fx, pMsg->m_fy)) {
-    m_pOwner->m_iBtnState = CFWL_PartState_Hovered;
+void IFWL_ComboBox::OnLButtonUp(CFWL_MsgMouse* pMsg) {
+  m_bLButtonDown = FALSE;
+  if (m_rtBtn.Contains(pMsg->m_fx, pMsg->m_fy))
+    m_iBtnState = CFWL_PartState_Hovered;
+  else
+    m_iBtnState = CFWL_PartState_Normal;
+
+  Repaint(&m_rtBtn);
+}
+
+void IFWL_ComboBox::OnMouseMove(CFWL_MsgMouse* pMsg) {
+  int32_t iOldState = m_iBtnState;
+  if (m_rtBtn.Contains(pMsg->m_fx, pMsg->m_fy)) {
+    m_iBtnState =
+        m_bLButtonDown ? CFWL_PartState_Pressed : CFWL_PartState_Hovered;
   } else {
-    m_pOwner->m_iBtnState = CFWL_PartState_Normal;
+    m_iBtnState = CFWL_PartState_Normal;
   }
-  m_pOwner->Repaint(&m_pOwner->m_rtBtn);
-}
-
-void CFWL_ComboBoxImpDelegate::OnMouseMove(CFWL_MsgMouse* pMsg) {
-  int32_t iOldState = m_pOwner->m_iBtnState;
-  if (m_pOwner->m_rtBtn.Contains(pMsg->m_fx, pMsg->m_fy)) {
-    m_pOwner->m_iBtnState = m_pOwner->m_bLButtonDown ? CFWL_PartState_Pressed
-                                                     : CFWL_PartState_Hovered;
-  } else {
-    m_pOwner->m_iBtnState = CFWL_PartState_Normal;
-  }
-  if ((iOldState != m_pOwner->m_iBtnState) &&
-      !((m_pOwner->m_pProperties->m_dwStates & FWL_WGTSTATE_Disabled) ==
+  if ((iOldState != m_iBtnState) &&
+      !((m_pProperties->m_dwStates & FWL_WGTSTATE_Disabled) ==
         FWL_WGTSTATE_Disabled)) {
-    m_pOwner->Repaint(&m_pOwner->m_rtBtn);
+    Repaint(&m_rtBtn);
   }
 }
 
-void CFWL_ComboBoxImpDelegate::OnMouseLeave(CFWL_MsgMouse* pMsg) {
-  if (!m_pOwner->IsDropListShowed() &&
-      !((m_pOwner->m_pProperties->m_dwStates & FWL_WGTSTATE_Disabled) ==
+void IFWL_ComboBox::OnMouseLeave(CFWL_MsgMouse* pMsg) {
+  if (!IsDropListShowed() &&
+      !((m_pProperties->m_dwStates & FWL_WGTSTATE_Disabled) ==
         FWL_WGTSTATE_Disabled)) {
-    m_pOwner->m_iBtnState = CFWL_PartState_Normal;
-    m_pOwner->Repaint(&m_pOwner->m_rtBtn);
+    m_iBtnState = CFWL_PartState_Normal;
+    Repaint(&m_rtBtn);
   }
 }
 
-void CFWL_ComboBoxImpDelegate::OnKey(CFWL_MsgKey* pMsg) {
+void IFWL_ComboBox::OnKey(CFWL_MsgKey* pMsg) {
   uint32_t dwKeyCode = pMsg->m_dwKeyCode;
   if (dwKeyCode == FWL_VKEY_Tab) {
-    m_pOwner->DispatchKeyEvent(pMsg);
+    DispatchKeyEvent(pMsg);
     return;
   }
-  if (pMsg->m_pDstTarget == m_pOwner)
+  if (pMsg->m_pDstTarget == this)
     DoSubCtrlKey(pMsg);
 }
 
-void CFWL_ComboBoxImpDelegate::DoSubCtrlKey(CFWL_MsgKey* pMsg) {
+void IFWL_ComboBox::DoSubCtrlKey(CFWL_MsgKey* pMsg) {
   uint32_t dwKeyCode = pMsg->m_dwKeyCode;
   const bool bUp = dwKeyCode == FWL_VKEY_Up;
   const bool bDown = dwKeyCode == FWL_VKEY_Down;
   if (bUp || bDown) {
-    int32_t iCount = m_pOwner->m_pListBox->CountItems();
-    if (iCount < 1) {
+    int32_t iCount = m_pListBox->CountItems();
+    if (iCount < 1)
       return;
-    }
+
     FX_BOOL bMatchEqual = FALSE;
-    int32_t iCurSel = m_pOwner->m_iCurSel;
-    FX_BOOL bDropDown = m_pOwner->IsDropDownStyle();
-    if (bDropDown && m_pOwner->m_pEdit) {
+    int32_t iCurSel = m_iCurSel;
+    FX_BOOL bDropDown = IsDropDownStyle();
+    if (bDropDown && m_pEdit) {
       CFX_WideString wsText;
-      m_pOwner->m_pEdit->GetText(wsText);
-      iCurSel = m_pOwner->m_pListBox->MatchItem(wsText);
+      m_pEdit->GetText(wsText);
+      iCurSel = m_pListBox->MatchItem(wsText);
       if (iCurSel >= 0) {
         CFX_WideString wsTemp;
-        IFWL_ComboBoxDP* pData = static_cast<IFWL_ComboBoxDP*>(
-            m_pOwner->m_pProperties->m_pDataProvider);
-        IFWL_ListItem* hItem = pData->GetItem(m_pOwner, iCurSel);
-        m_pOwner->m_pListBox->GetItemText(hItem, wsTemp);
+        IFWL_ComboBoxDP* pData =
+            static_cast<IFWL_ComboBoxDP*>(m_pProperties->m_pDataProvider);
+        IFWL_ListItem* hItem = pData->GetItem(this, iCurSel);
+        m_pListBox->GetItemText(hItem, wsTemp);
         bMatchEqual = wsText == wsTemp;
       }
     }
     if (iCurSel < 0) {
       iCurSel = 0;
     } else if (!bDropDown || bMatchEqual) {
-      if ((bUp && iCurSel == 0) || (bDown && iCurSel == iCount - 1)) {
+      if ((bUp && iCurSel == 0) || (bDown && iCurSel == iCount - 1))
         return;
-      }
-      if (bUp) {
+      if (bUp)
         iCurSel--;
-      } else {
+      else
         iCurSel++;
-      }
     }
-    m_pOwner->m_iCurSel = iCurSel;
-    if (bDropDown && m_pOwner->m_pEdit) {
-      m_pOwner->SynchrEditText(m_pOwner->m_iCurSel);
-    } else {
-      m_pOwner->Repaint(&m_pOwner->m_rtClient);
-    }
+    m_iCurSel = iCurSel;
+    if (bDropDown && m_pEdit)
+      SynchrEditText(m_iCurSel);
+    else
+      Repaint(&m_rtClient);
     return;
   }
-  FX_BOOL bDropDown = m_pOwner->IsDropDownStyle();
+
+  FX_BOOL bDropDown = IsDropDownStyle();
   if (bDropDown)
-    m_pOwner->m_pEdit->GetCurrentDelegate()->OnProcessMessage(pMsg);
+    m_pEdit->GetDelegate()->OnProcessMessage(pMsg);
 }
 
-void CFWL_ComboBoxImpDelegate::DisForm_OnProcessMessage(
-    CFWL_Message* pMessage) {
+void IFWL_ComboBox::DisForm_OnProcessMessage(CFWL_Message* pMessage) {
   if (!pMessage)
     return;
 
@@ -1165,14 +1151,12 @@
       backDefault = FALSE;
       CFWL_MsgMouse* pMsg = static_cast<CFWL_MsgMouse*>(pMessage);
       switch (pMsg->m_dwCmd) {
-        case FWL_MouseCommand::LeftButtonDown: {
+        case FWL_MouseCommand::LeftButtonDown:
           DisForm_OnLButtonDown(pMsg);
           break;
-        }
-        case FWL_MouseCommand::LeftButtonUp: {
+        case FWL_MouseCommand::LeftButtonUp:
           OnLButtonUp(pMsg);
           break;
-        }
         default:
           break;
       }
@@ -1183,15 +1167,14 @@
       CFWL_MsgKey* pKey = static_cast<CFWL_MsgKey*>(pMessage);
       if (pKey->m_dwCmd == FWL_KeyCommand::KeyUp)
         break;
-      if (m_pOwner->DisForm_IsDropListShowed() &&
+      if (DisForm_IsDropListShowed() &&
           pKey->m_dwCmd == FWL_KeyCommand::KeyDown) {
         FX_BOOL bListKey = pKey->m_dwKeyCode == FWL_VKEY_Up ||
                            pKey->m_dwKeyCode == FWL_VKEY_Down ||
                            pKey->m_dwKeyCode == FWL_VKEY_Return ||
                            pKey->m_dwKeyCode == FWL_VKEY_Escape;
         if (bListKey) {
-          m_pOwner->m_pListBox->GetCurrentDelegate()->OnProcessMessage(
-              pMessage);
+          m_pListBox->GetDelegate()->OnProcessMessage(pMessage);
           break;
         }
       }
@@ -1202,199 +1185,80 @@
       break;
   }
   if (backDefault)
-    CFWL_WidgetImpDelegate::OnProcessMessage(pMessage);
+    IFWL_Widget::OnProcessMessage(pMessage);
 }
 
-void CFWL_ComboBoxImpDelegate::DisForm_OnLButtonDown(CFWL_MsgMouse* pMsg) {
-  FX_BOOL bDropDown = m_pOwner->DisForm_IsDropListShowed();
-  CFX_RectF& rtBtn = bDropDown ? m_pOwner->m_rtBtn : m_pOwner->m_rtClient;
-  FX_BOOL bClickBtn = rtBtn.Contains(pMsg->m_fx, pMsg->m_fy);
-  if (bClickBtn) {
-    if (m_pOwner->DisForm_IsDropListShowed()) {
-      m_pOwner->DisForm_ShowDropList(FALSE);
-      return;
-    }
-    {
-      if (m_pOwner->m_pEdit) {
-        m_pOwner->MatchEditText();
-      }
-      m_pOwner->DisForm_ShowDropList(TRUE);
-    }
+void IFWL_ComboBox::DisForm_OnLButtonDown(CFWL_MsgMouse* pMsg) {
+  FX_BOOL bDropDown = DisForm_IsDropListShowed();
+  CFX_RectF& rtBtn = bDropDown ? m_rtBtn : m_rtClient;
+  if (!rtBtn.Contains(pMsg->m_fx, pMsg->m_fy))
+    return;
+
+  if (DisForm_IsDropListShowed()) {
+    DisForm_ShowDropList(FALSE);
+    return;
   }
+  if (m_pEdit)
+    MatchEditText();
+  DisForm_ShowDropList(TRUE);
 }
 
-void CFWL_ComboBoxImpDelegate::DisForm_OnFocusChanged(CFWL_Message* pMsg,
-                                                      FX_BOOL bSet) {
+void IFWL_ComboBox::DisForm_OnFocusChanged(CFWL_Message* pMsg, FX_BOOL bSet) {
   if (bSet) {
-    m_pOwner->m_pProperties->m_dwStates |= FWL_WGTSTATE_Focused;
-    if ((m_pOwner->m_pEdit->GetStates() & FWL_WGTSTATE_Focused) == 0) {
+    m_pProperties->m_dwStates |= FWL_WGTSTATE_Focused;
+    if ((m_pEdit->GetStates() & FWL_WGTSTATE_Focused) == 0) {
       CFWL_MsgSetFocus msg;
-      msg.m_pDstTarget = m_pOwner->m_pEdit.get();
+      msg.m_pDstTarget = m_pEdit.get();
       msg.m_pSrcTarget = nullptr;
-      m_pOwner->m_pEdit->GetCurrentDelegate()->OnProcessMessage(&msg);
+      m_pEdit->GetDelegate()->OnProcessMessage(&msg);
     }
   } else {
-    m_pOwner->m_pProperties->m_dwStates &= ~FWL_WGTSTATE_Focused;
-    m_pOwner->DisForm_ShowDropList(FALSE);
+    m_pProperties->m_dwStates &= ~FWL_WGTSTATE_Focused;
+    DisForm_ShowDropList(FALSE);
     CFWL_MsgKillFocus msg;
     msg.m_pDstTarget = nullptr;
-    msg.m_pSrcTarget = m_pOwner->m_pEdit.get();
-    m_pOwner->m_pEdit->GetCurrentDelegate()->OnProcessMessage(&msg);
+    msg.m_pSrcTarget = m_pEdit.get();
+    m_pEdit->GetDelegate()->OnProcessMessage(&msg);
   }
 }
 
-void CFWL_ComboBoxImpDelegate::DisForm_OnKey(CFWL_MsgKey* pMsg) {
+void IFWL_ComboBox::DisForm_OnKey(CFWL_MsgKey* pMsg) {
   uint32_t dwKeyCode = pMsg->m_dwKeyCode;
   const bool bUp = dwKeyCode == FWL_VKEY_Up;
   const bool bDown = dwKeyCode == FWL_VKEY_Down;
   if (bUp || bDown) {
-    IFWL_ComboList* pComboList = m_pOwner->m_pListBox.get();
+    IFWL_ComboList* pComboList = m_pListBox.get();
     int32_t iCount = pComboList->CountItems();
-    if (iCount < 1) {
+    if (iCount < 1)
       return;
-    }
+
     FX_BOOL bMatchEqual = FALSE;
-    int32_t iCurSel = m_pOwner->m_iCurSel;
-    if (m_pOwner->m_pEdit) {
+    int32_t iCurSel = m_iCurSel;
+    if (m_pEdit) {
       CFX_WideString wsText;
-      m_pOwner->m_pEdit->GetText(wsText);
+      m_pEdit->GetText(wsText);
       iCurSel = pComboList->MatchItem(wsText);
       if (iCurSel >= 0) {
         CFX_WideString wsTemp;
-        IFWL_ListItem* item = m_pOwner->m_pListBox->GetSelItem(iCurSel);
-        m_pOwner->m_pListBox->GetItemText(item, wsTemp);
+        IFWL_ListItem* item = m_pListBox->GetSelItem(iCurSel);
+        m_pListBox->GetItemText(item, wsTemp);
         bMatchEqual = wsText == wsTemp;
       }
     }
     if (iCurSel < 0) {
       iCurSel = 0;
     } else if (bMatchEqual) {
-      if ((bUp && iCurSel == 0) || (bDown && iCurSel == iCount - 1)) {
+      if ((bUp && iCurSel == 0) || (bDown && iCurSel == iCount - 1))
         return;
-      }
-      if (bUp) {
+      if (bUp)
         iCurSel--;
-      } else {
+      else
         iCurSel++;
-      }
     }
-    m_pOwner->m_iCurSel = iCurSel;
-    m_pOwner->SynchrEditText(m_pOwner->m_iCurSel);
+    m_iCurSel = iCurSel;
+    SynchrEditText(m_iCurSel);
     return;
   }
-  if (m_pOwner->m_pEdit)
-    m_pOwner->m_pEdit->GetCurrentDelegate()->OnProcessMessage(pMsg);
-}
-
-CFWL_ComboProxyImpDelegate::CFWL_ComboProxyImpDelegate(IFWL_Form* pForm,
-                                                       IFWL_ComboBox* pComboBox)
-    : m_bLButtonDown(FALSE),
-      m_bLButtonUpSelf(FALSE),
-      m_fStartPos(0),
-      m_pForm(pForm),
-      m_pComboBox(pComboBox) {}
-
-void CFWL_ComboProxyImpDelegate::OnProcessMessage(CFWL_Message* pMessage) {
-  if (!pMessage)
-    return;
-
-  switch (pMessage->GetClassID()) {
-    case CFWL_MessageType::Mouse: {
-      CFWL_MsgMouse* pMsg = static_cast<CFWL_MsgMouse*>(pMessage);
-      switch (pMsg->m_dwCmd) {
-        case FWL_MouseCommand::LeftButtonDown: {
-          OnLButtonDown(pMsg);
-          break;
-        }
-        case FWL_MouseCommand::LeftButtonUp: {
-          OnLButtonUp(pMsg);
-          break;
-        }
-        case FWL_MouseCommand::Move: {
-          OnMouseMove(pMsg);
-          break;
-        }
-        default:
-          break;
-      }
-      break;
-    }
-    case CFWL_MessageType::Deactivate: {
-      OnDeactive(static_cast<CFWL_MsgDeactivate*>(pMessage));
-      break;
-    }
-    case CFWL_MessageType::KillFocus: {
-      OnFocusChanged(static_cast<CFWL_MsgKillFocus*>(pMessage), FALSE);
-      break;
-    }
-    case CFWL_MessageType::SetFocus: {
-      OnFocusChanged(static_cast<CFWL_MsgKillFocus*>(pMessage), TRUE);
-      break;
-    }
-    default:
-      break;
-  }
-  CFWL_WidgetImpDelegate::OnProcessMessage(pMessage);
-}
-
-void CFWL_ComboProxyImpDelegate::OnDrawWidget(CFX_Graphics* pGraphics,
-                                              const CFX_Matrix* pMatrix) {
-  m_pComboBox->DrawStretchHandler(pGraphics, pMatrix);
-}
-
-void CFWL_ComboProxyImpDelegate::OnLButtonDown(CFWL_MsgMouse* pMsg) {
-  const IFWL_App* pApp = m_pForm->GetOwnerApp();
-  if (!pApp)
-    return;
-
-  CFWL_NoteDriver* pDriver =
-      static_cast<CFWL_NoteDriver*>(pApp->GetNoteDriver());
-  CFX_RectF rtWidget;
-  m_pForm->GetWidgetRect(rtWidget);
-  rtWidget.left = rtWidget.top = 0;
-  if (rtWidget.Contains(pMsg->m_fx, pMsg->m_fy)) {
-    m_bLButtonDown = TRUE;
-    pDriver->SetGrab(m_pForm, TRUE);
-  } else {
-    m_bLButtonDown = FALSE;
-    pDriver->SetGrab(m_pForm, FALSE);
-    m_pComboBox->ShowDropList(FALSE);
-  }
-}
-
-void CFWL_ComboProxyImpDelegate::OnLButtonUp(CFWL_MsgMouse* pMsg) {
-  m_bLButtonDown = FALSE;
-  const IFWL_App* pApp = m_pForm->GetOwnerApp();
-  if (!pApp)
-    return;
-
-  CFWL_NoteDriver* pDriver =
-      static_cast<CFWL_NoteDriver*>(pApp->GetNoteDriver());
-  pDriver->SetGrab(m_pForm, FALSE);
-  if (m_bLButtonUpSelf) {
-    CFX_RectF rect;
-    m_pForm->GetWidgetRect(rect);
-    rect.left = rect.top = 0;
-    if (!rect.Contains(pMsg->m_fx, pMsg->m_fy) &&
-        m_pComboBox->IsDropListShowed()) {
-      m_pComboBox->ShowDropList(FALSE);
-    }
-  } else {
-    m_bLButtonUpSelf = TRUE;
-  }
-}
-
-void CFWL_ComboProxyImpDelegate::OnMouseMove(CFWL_MsgMouse* pMsg) {}
-
-void CFWL_ComboProxyImpDelegate::OnDeactive(CFWL_MsgDeactivate* pMsg) {
-  m_pComboBox->ShowDropList(FALSE);
-}
-
-void CFWL_ComboProxyImpDelegate::OnFocusChanged(CFWL_MsgKillFocus* pMsg,
-                                                FX_BOOL bSet) {
-  if (!bSet) {
-    if (!pMsg->m_pSetFocus) {
-      m_pComboBox->ShowDropList(FALSE);
-    }
-  }
+  if (m_pEdit)
+    m_pEdit->GetDelegate()->OnProcessMessage(pMsg);
 }
diff --git a/xfa/fwl/core/ifwl_combobox.h b/xfa/fwl/core/ifwl_combobox.h
index 5fab499..cde99d8 100644
--- a/xfa/fwl/core/ifwl_combobox.h
+++ b/xfa/fwl/core/ifwl_combobox.h
@@ -11,14 +11,9 @@
 #include "xfa/fwl/core/ifwl_listbox.h"
 #include "xfa/fxgraphics/cfx_graphics.h"
 
-class CFWL_ComboBoxImpDelegate;
-class CFWL_ComboEditImpDelegate;
-class CFWL_ComboListImpDelegate;
-class CFWL_ComboProxyImpDelegate;
-class CFWL_ListBoxImpDelegate;
 class CFWL_WidgetImpProperties;
-class CFWL_WidgetImpDelegate;
 class IFWL_ComboBox;
+class IFWL_ComboBoxProxy;
 class IFWL_ComboEdit;
 class IFWL_ComboList;
 class IFWL_FormProxy;
@@ -99,6 +94,10 @@
   FWL_Error DrawWidget(CFX_Graphics* pGraphics,
                        const CFX_Matrix* pMatrix = nullptr) override;
   FWL_Error SetThemeProvider(IFWL_ThemeProvider* pThemeProvider) override;
+  void OnProcessMessage(CFWL_Message* pMessage) override;
+  void OnProcessEvent(CFWL_Event* pEvent) override;
+  void OnDrawWidget(CFX_Graphics* pGraphics,
+                    const CFX_Matrix* pMatrix) override;
 
   int32_t GetCurSel();
   FWL_Error SetCurSel(int32_t iSel);
@@ -134,18 +133,16 @@
   FWL_Error EditModifyStylesEx(uint32_t dwStylesExAdded,
                                uint32_t dwStylesExRemoved);
 
- protected:
-  friend class CFWL_ComboBoxImpDelegate;
-  friend class CFWL_ComboEditImpDelegate;
-  friend class CFWL_ComboListImpDelegate;
-  friend class CFWL_ComboProxyImpDelegate;
-  friend class IFWL_ComboEdit;
-  friend class IFWL_ComboList;
-
   void DrawStretchHandler(CFX_Graphics* pGraphics, const CFX_Matrix* pMatrix);
-  FX_FLOAT GetListHeight();
-  void ShowDropList(FX_BOOL bActivate);
   FX_BOOL IsDropListShowed();
+  void ShowDropList(FX_BOOL bActivate);
+
+  IFWL_ComboEdit* GetComboEdit() const { return m_pEdit.get(); }
+  void ProcessSelChanged(FX_BOOL bLButtonUp);
+  int32_t GetCurrentSelection() const { return m_iCurSel; }
+
+ protected:
+  FX_FLOAT GetListHeight();
   FX_BOOL IsDropDownStyle() const;
   void MatchEditText();
   void SynchrEditText(int32_t iListItem);
@@ -153,7 +150,6 @@
   void ReSetTheme();
   void ReSetEditAlignment();
   void ReSetListItemAlignment();
-  void ProcessSelChanged(FX_BOOL bLButtonUp);
   void InitProxyForm();
   void DisForm_InitComboList();
   void DisForm_InitComboEdit();
@@ -176,7 +172,7 @@
   CFX_RectF m_rtHandler;
   std::unique_ptr<IFWL_ComboEdit> m_pEdit;
   std::unique_ptr<IFWL_ComboList> m_pListBox;
-  IFWL_FormProxy* m_pForm;
+  IFWL_ComboBoxProxy* m_pComboBoxProxy;
   FX_BOOL m_bLButtonDown;
   FX_BOOL m_bUpFormHandler;
   int32_t m_iCurSel;
@@ -184,18 +180,8 @@
   FX_FLOAT m_fComboFormHandler;
   FX_FLOAT m_fItemHeight;
   FX_BOOL m_bNeedShowList;
-  CFWL_ComboProxyImpDelegate* m_pListProxyDelegate;
-};
 
-class CFWL_ComboBoxImpDelegate : public CFWL_WidgetImpDelegate {
- public:
-  CFWL_ComboBoxImpDelegate(IFWL_ComboBox* pOwner);
-  void OnProcessMessage(CFWL_Message* pMessage) override;
-  void OnProcessEvent(CFWL_Event* pEvent) override;
-  void OnDrawWidget(CFX_Graphics* pGraphics,
-                    const CFX_Matrix* pMatrix = nullptr) override;
-
- protected:
+ private:
   void OnFocusChanged(CFWL_Message* pMsg, FX_BOOL bSet = TRUE);
   void OnLButtonDown(CFWL_MsgMouse* pMsg);
   void OnLButtonUp(CFWL_MsgMouse* pMsg);
@@ -208,30 +194,6 @@
   void DisForm_OnFocusChanged(CFWL_Message* pMsg, FX_BOOL bSet = TRUE);
   void DisForm_OnKey(CFWL_MsgKey* pMsg);
 
-  IFWL_ComboBox* m_pOwner;
-  friend class CFWL_ComboEditImpDelegate;
-  friend class CFWL_ComboListImpDelegate;
-};
-
-class CFWL_ComboProxyImpDelegate : public CFWL_WidgetImpDelegate {
- public:
-  CFWL_ComboProxyImpDelegate(IFWL_Form* pForm, IFWL_ComboBox* pComboBox);
-  void OnProcessMessage(CFWL_Message* pMessage) override;
-  void OnDrawWidget(CFX_Graphics* pGraphics,
-                    const CFX_Matrix* pMatrix = nullptr) override;
-  void Reset() { m_bLButtonUpSelf = FALSE; }
-
- protected:
-  void OnLButtonDown(CFWL_MsgMouse* pMsg);
-  void OnLButtonUp(CFWL_MsgMouse* pMsg);
-  void OnMouseMove(CFWL_MsgMouse* pMsg);
-  void OnDeactive(CFWL_MsgDeactivate* pMsg);
-  void OnFocusChanged(CFWL_MsgKillFocus* pMsg, FX_BOOL bSet);
-  FX_BOOL m_bLButtonDown;
-  FX_BOOL m_bLButtonUpSelf;
-  FX_FLOAT m_fStartPos;
-  IFWL_Form* m_pForm;
-  IFWL_ComboBox* m_pComboBox;
 };
 
 #endif  // XFA_FWL_CORE_IFWL_COMBOBOX_H_
diff --git a/xfa/fwl/core/ifwl_comboboxproxy.cpp b/xfa/fwl/core/ifwl_comboboxproxy.cpp
new file mode 100644
index 0000000..a0afcd1
--- /dev/null
+++ b/xfa/fwl/core/ifwl_comboboxproxy.cpp
@@ -0,0 +1,118 @@
+// Copyright 2016 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "xfa/fwl/core/ifwl_comboboxproxy.h"
+
+#include "xfa/fwl/core/fwl_noteimp.h"
+#include "xfa/fwl/core/ifwl_app.h"
+#include "xfa/fwl/core/ifwl_combobox.h"
+
+IFWL_ComboBoxProxy::IFWL_ComboBoxProxy(
+    IFWL_ComboBox* pComboBox,
+    const IFWL_App* app,
+    const CFWL_WidgetImpProperties& properties,
+    IFWL_Widget* pOuter)
+    : IFWL_FormProxy(app, properties, pOuter),
+      m_bLButtonDown(FALSE),
+      m_bLButtonUpSelf(FALSE),
+      m_pComboBox(pComboBox) {}
+
+IFWL_ComboBoxProxy::~IFWL_ComboBoxProxy() {}
+
+void IFWL_ComboBoxProxy::OnProcessMessage(CFWL_Message* pMessage) {
+  if (!pMessage)
+    return;
+
+  switch (pMessage->GetClassID()) {
+    case CFWL_MessageType::Mouse: {
+      CFWL_MsgMouse* pMsg = static_cast<CFWL_MsgMouse*>(pMessage);
+      switch (pMsg->m_dwCmd) {
+        case FWL_MouseCommand::LeftButtonDown:
+          OnLButtonDown(pMsg);
+          break;
+        case FWL_MouseCommand::LeftButtonUp:
+          OnLButtonUp(pMsg);
+          break;
+        case FWL_MouseCommand::Move:
+          break;
+        default:
+          break;
+      }
+      break;
+    }
+    case CFWL_MessageType::Deactivate:
+      OnDeactive(static_cast<CFWL_MsgDeactivate*>(pMessage));
+      break;
+    case CFWL_MessageType::KillFocus:
+      OnFocusChanged(static_cast<CFWL_MsgKillFocus*>(pMessage), FALSE);
+      break;
+    case CFWL_MessageType::SetFocus:
+      OnFocusChanged(static_cast<CFWL_MsgKillFocus*>(pMessage), TRUE);
+      break;
+    default:
+      break;
+  }
+  IFWL_Widget::OnProcessMessage(pMessage);
+}
+
+void IFWL_ComboBoxProxy::OnDrawWidget(CFX_Graphics* pGraphics,
+                                      const CFX_Matrix* pMatrix) {
+  m_pComboBox->DrawStretchHandler(pGraphics, pMatrix);
+}
+
+void IFWL_ComboBoxProxy::OnLButtonDown(CFWL_MsgMouse* pMsg) {
+  const IFWL_App* pApp = GetOwnerApp();
+  if (!pApp)
+    return;
+
+  CFWL_NoteDriver* pDriver =
+      static_cast<CFWL_NoteDriver*>(pApp->GetNoteDriver());
+  CFX_RectF rtWidget;
+  GetWidgetRect(rtWidget);
+  rtWidget.left = rtWidget.top = 0;
+  if (rtWidget.Contains(pMsg->m_fx, pMsg->m_fy)) {
+    m_bLButtonDown = TRUE;
+    pDriver->SetGrab(this, TRUE);
+  } else {
+    m_bLButtonDown = FALSE;
+    pDriver->SetGrab(this, FALSE);
+    m_pComboBox->ShowDropList(FALSE);
+  }
+}
+
+void IFWL_ComboBoxProxy::OnLButtonUp(CFWL_MsgMouse* pMsg) {
+  m_bLButtonDown = FALSE;
+  const IFWL_App* pApp = GetOwnerApp();
+  if (!pApp)
+    return;
+
+  CFWL_NoteDriver* pDriver =
+      static_cast<CFWL_NoteDriver*>(pApp->GetNoteDriver());
+  pDriver->SetGrab(this, FALSE);
+  if (m_bLButtonUpSelf) {
+    CFX_RectF rect;
+    GetWidgetRect(rect);
+    rect.left = rect.top = 0;
+    if (!rect.Contains(pMsg->m_fx, pMsg->m_fy) &&
+        m_pComboBox->IsDropListShowed()) {
+      m_pComboBox->ShowDropList(FALSE);
+    }
+  } else {
+    m_bLButtonUpSelf = TRUE;
+  }
+}
+
+void IFWL_ComboBoxProxy::OnDeactive(CFWL_MsgDeactivate* pMsg) {
+  m_pComboBox->ShowDropList(FALSE);
+}
+
+void IFWL_ComboBoxProxy::OnFocusChanged(CFWL_MsgKillFocus* pMsg, FX_BOOL bSet) {
+  if (bSet)
+    return;
+
+  if (!pMsg->m_pSetFocus)
+    m_pComboBox->ShowDropList(FALSE);
+}
diff --git a/xfa/fwl/core/ifwl_comboboxproxy.h b/xfa/fwl/core/ifwl_comboboxproxy.h
new file mode 100644
index 0000000..1cf7a06
--- /dev/null
+++ b/xfa/fwl/core/ifwl_comboboxproxy.h
@@ -0,0 +1,41 @@
+// Copyright 2016 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef XFA_FWL_CORE_IFWL_COMBOBOXPROXY_H_
+#define XFA_FWL_CORE_IFWL_COMBOBOXPROXY_H_
+
+#include "xfa/fwl/core/ifwl_formproxy.h"
+
+class IFWL_ComboBox;
+
+class IFWL_ComboBoxProxy : public IFWL_FormProxy {
+ public:
+  IFWL_ComboBoxProxy(IFWL_ComboBox* pCombobBox,
+                     const IFWL_App* app,
+                     const CFWL_WidgetImpProperties& properties,
+                     IFWL_Widget* pOuter);
+  ~IFWL_ComboBoxProxy() override;
+
+  // IFWL_FormProxy
+  void OnProcessMessage(CFWL_Message* pMessage) override;
+  void OnDrawWidget(CFX_Graphics* pGraphics,
+                    const CFX_Matrix* pMatrix) override;
+
+  void Reset() { m_bLButtonUpSelf = FALSE; }
+
+ private:
+  void OnLButtonDown(CFWL_MsgMouse* pMsg);
+  void OnLButtonUp(CFWL_MsgMouse* pMsg);
+  void OnDeactive(CFWL_MsgDeactivate* pMsg);
+  void OnFocusChanged(CFWL_MsgKillFocus* pMsg, FX_BOOL bSet);
+
+  FX_BOOL m_bLButtonDown;
+  FX_BOOL m_bLButtonUpSelf;
+
+  IFWL_ComboBox* m_pComboBox;
+};
+
+#endif  // XFA_FWL_CORE_IFWL_COMBOBOXPROXY_H_
diff --git a/xfa/fwl/core/ifwl_comboedit.cpp b/xfa/fwl/core/ifwl_comboedit.cpp
index fc28536..ece3541 100644
--- a/xfa/fwl/core/ifwl_comboedit.cpp
+++ b/xfa/fwl/core/ifwl_comboedit.cpp
@@ -44,31 +44,28 @@
   m_pOuter->SetFocus(bSet);
 }
 
-CFWL_ComboEditImpDelegate::CFWL_ComboEditImpDelegate(IFWL_ComboEdit* pOwner)
-    : CFWL_EditImpDelegate(pOwner), m_pOwner(pOwner) {}
-
-void CFWL_ComboEditImpDelegate::OnProcessMessage(CFWL_Message* pMessage) {
+void IFWL_ComboEdit::OnProcessMessage(CFWL_Message* pMessage) {
   if (!pMessage)
     return;
 
   FX_BOOL backDefault = TRUE;
   switch (pMessage->GetClassID()) {
     case CFWL_MessageType::SetFocus: {
-      m_pOwner->m_pProperties->m_dwStates |= FWL_WGTSTATE_Focused;
+      m_pProperties->m_dwStates |= FWL_WGTSTATE_Focused;
       backDefault = FALSE;
       break;
     }
     case CFWL_MessageType::KillFocus: {
-      m_pOwner->m_pProperties->m_dwStates &= ~FWL_WGTSTATE_Focused;
+      m_pProperties->m_dwStates &= ~FWL_WGTSTATE_Focused;
       backDefault = FALSE;
       break;
     }
     case CFWL_MessageType::Mouse: {
       CFWL_MsgMouse* pMsg = static_cast<CFWL_MsgMouse*>(pMessage);
       if ((pMsg->m_dwCmd == FWL_MouseCommand::LeftButtonDown) &&
-          ((m_pOwner->m_pProperties->m_dwStates & FWL_WGTSTATE_Focused) == 0)) {
-        m_pOwner->SetSelected();
-        m_pOwner->SetComboBoxFocus(TRUE);
+          ((m_pProperties->m_dwStates & FWL_WGTSTATE_Focused) == 0)) {
+        SetSelected();
+        SetComboBoxFocus(TRUE);
       }
       break;
     }
@@ -76,5 +73,5 @@
       break;
   }
   if (backDefault)
-    CFWL_EditImpDelegate::OnProcessMessage(pMessage);
+    IFWL_Edit::OnProcessMessage(pMessage);
 }
diff --git a/xfa/fwl/core/ifwl_comboedit.h b/xfa/fwl/core/ifwl_comboedit.h
index f4a529a..9c321d1 100644
--- a/xfa/fwl/core/ifwl_comboedit.h
+++ b/xfa/fwl/core/ifwl_comboedit.h
@@ -19,6 +19,9 @@
                  const CFWL_WidgetImpProperties& properties,
                  IFWL_Widget* pOuter);
 
+  // IFWL_Edit.
+  void OnProcessMessage(CFWL_Message* pMessage) override;
+
   void ClearSelected();
   void SetSelected();
   void EndCaret();
@@ -27,16 +30,6 @@
  protected:
   void SetComboBoxFocus(FX_BOOL bSet);
   IFWL_ComboBox* m_pOuter;
-  friend class CFWL_ComboEditImpDelegate;
-};
-
-class CFWL_ComboEditImpDelegate : public CFWL_EditImpDelegate {
- public:
-  CFWL_ComboEditImpDelegate(IFWL_ComboEdit* pOwner);
-  void OnProcessMessage(CFWL_Message* pMessage) override;
-
- protected:
-  IFWL_ComboEdit* m_pOwner;
 };
 
 #endif  // XFA_FWL_CORE_IFWL_COMBOEDIT_H_
diff --git a/xfa/fwl/core/ifwl_combolist.cpp b/xfa/fwl/core/ifwl_combolist.cpp
index 0fdc5ac..5a2ade9 100644
--- a/xfa/fwl/core/ifwl_combolist.cpp
+++ b/xfa/fwl/core/ifwl_combolist.cpp
@@ -15,7 +15,6 @@
                                IFWL_Widget* pOuter)
     : IFWL_ListBox(app, properties, pOuter), m_bNotifyOwner(TRUE) {
   ASSERT(pOuter);
-  SetDelegate(pdfium::MakeUnique<CFWL_ComboListImpDelegate>(this));
 }
 
 int32_t IFWL_ComboList::MatchItem(const CFX_WideString& wsMatch) {
@@ -92,10 +91,7 @@
   IFWL_Widget::SetFocus(bSet);
 }
 
-CFWL_ComboListImpDelegate::CFWL_ComboListImpDelegate(IFWL_ComboList* pOwner)
-    : CFWL_ListBoxImpDelegate(pOwner), m_pOwner(pOwner) {}
-
-void CFWL_ComboListImpDelegate::OnProcessMessage(CFWL_Message* pMessage) {
+void IFWL_ComboList::OnProcessMessage(CFWL_Message* pMessage) {
   if (!pMessage)
     return;
 
@@ -106,14 +102,13 @@
     OnDropListFocusChanged(pMessage, dwHashCode == CFWL_MessageType::SetFocus);
   } else if (dwHashCode == CFWL_MessageType::Mouse) {
     CFWL_MsgMouse* pMsg = static_cast<CFWL_MsgMouse*>(pMessage);
-    if (m_pOwner->IsShowScrollBar(TRUE) && m_pOwner->m_pVertScrollBar) {
+    if (IsShowScrollBar(TRUE) && m_pVertScrollBar) {
       CFX_RectF rect;
-      m_pOwner->m_pVertScrollBar->GetWidgetRect(rect);
+      m_pVertScrollBar->GetWidgetRect(rect);
       if (rect.Contains(pMsg->m_fx, pMsg->m_fy)) {
         pMsg->m_fx -= rect.left;
         pMsg->m_fy -= rect.top;
-        m_pOwner->m_pVertScrollBar->GetCurrentDelegate()->OnProcessMessage(
-            pMsg);
+        m_pVertScrollBar->GetDelegate()->OnProcessMessage(pMsg);
         return;
       }
     }
@@ -140,87 +135,86 @@
     backDefault = !OnDropListKey(static_cast<CFWL_MsgKey*>(pMessage));
   }
   if (backDefault)
-    CFWL_ListBoxImpDelegate::OnProcessMessage(pMessage);
+    IFWL_ListBox::OnProcessMessage(pMessage);
 }
 
-void CFWL_ComboListImpDelegate::OnDropListFocusChanged(CFWL_Message* pMsg,
-                                                       FX_BOOL bSet) {
-  if (!bSet) {
-    CFWL_MsgKillFocus* pKill = static_cast<CFWL_MsgKillFocus*>(pMsg);
-    IFWL_ComboBox* pOuter = static_cast<IFWL_ComboBox*>(m_pOwner->m_pOuter);
-    if (pKill->m_pSetFocus == m_pOwner->m_pOuter ||
-        pKill->m_pSetFocus == pOuter->m_pEdit.get()) {
-      pOuter->ShowDropList(FALSE);
-    }
+void IFWL_ComboList::OnDropListFocusChanged(CFWL_Message* pMsg, FX_BOOL bSet) {
+  if (bSet)
+    return;
+
+  CFWL_MsgKillFocus* pKill = static_cast<CFWL_MsgKillFocus*>(pMsg);
+  IFWL_ComboBox* pOuter = static_cast<IFWL_ComboBox*>(m_pOuter);
+  if (pKill->m_pSetFocus == m_pOuter ||
+      pKill->m_pSetFocus == pOuter->GetComboEdit()) {
+    pOuter->ShowDropList(FALSE);
   }
 }
 
-int32_t CFWL_ComboListImpDelegate::OnDropListMouseMove(CFWL_MsgMouse* pMsg) {
-  if (m_pOwner->m_rtClient.Contains(pMsg->m_fx, pMsg->m_fy)) {
-    if (m_pOwner->m_bNotifyOwner) {
-      m_pOwner->m_bNotifyOwner = FALSE;
+int32_t IFWL_ComboList::OnDropListMouseMove(CFWL_MsgMouse* pMsg) {
+  if (m_rtClient.Contains(pMsg->m_fx, pMsg->m_fy)) {
+    if (m_bNotifyOwner) {
+      m_bNotifyOwner = FALSE;
     }
-    if (m_pOwner->IsShowScrollBar(TRUE) && m_pOwner->m_pVertScrollBar) {
+    if (IsShowScrollBar(TRUE) && m_pVertScrollBar) {
       CFX_RectF rect;
-      m_pOwner->m_pVertScrollBar->GetWidgetRect(rect);
+      m_pVertScrollBar->GetWidgetRect(rect);
       if (rect.Contains(pMsg->m_fx, pMsg->m_fy)) {
         return 1;
       }
     }
-    IFWL_ListItem* hItem = m_pOwner->GetItemAtPoint(pMsg->m_fx, pMsg->m_fy);
+    IFWL_ListItem* hItem = GetItemAtPoint(pMsg->m_fx, pMsg->m_fy);
     if (hItem) {
-      if (!m_pOwner->m_pProperties->m_pDataProvider)
+      if (!m_pProperties->m_pDataProvider)
         return 0;
-      IFWL_ListBoxDP* pData = static_cast<IFWL_ListBoxDP*>(
-          m_pOwner->m_pProperties->m_pDataProvider);
-      int32_t iSel = pData->GetItemIndex(m_pOwner, hItem);
+      IFWL_ListBoxDP* pData =
+          static_cast<IFWL_ListBoxDP*>(m_pProperties->m_pDataProvider);
+      int32_t iSel = pData->GetItemIndex(this, hItem);
       CFWL_EvtCmbHoverChanged event;
-      event.m_pSrcTarget = m_pOwner->m_pOuter;
+      event.m_pSrcTarget = m_pOuter;
       event.m_iCurHover = iSel;
-      m_pOwner->DispatchEvent(&event);
-      m_pOwner->ChangeSelected(iSel);
+      DispatchEvent(&event);
+      ChangeSelected(iSel);
     }
-  } else if (m_pOwner->m_bNotifyOwner) {
-    m_pOwner->ClientToOuter(pMsg->m_fx, pMsg->m_fy);
-    IFWL_ComboBox* pOuter = static_cast<IFWL_ComboBox*>(m_pOwner->m_pOuter);
+  } else if (m_bNotifyOwner) {
+    ClientToOuter(pMsg->m_fx, pMsg->m_fy);
+    IFWL_ComboBox* pOuter = static_cast<IFWL_ComboBox*>(m_pOuter);
     pOuter->GetDelegate()->OnProcessMessage(pMsg);
   }
   return 1;
 }
 
-int32_t CFWL_ComboListImpDelegate::OnDropListLButtonDown(CFWL_MsgMouse* pMsg) {
-  if (m_pOwner->m_rtClient.Contains(pMsg->m_fx, pMsg->m_fy)) {
+int32_t IFWL_ComboList::OnDropListLButtonDown(CFWL_MsgMouse* pMsg) {
+  if (m_rtClient.Contains(pMsg->m_fx, pMsg->m_fy))
     return 0;
-  }
-  IFWL_ComboBox* pOuter = static_cast<IFWL_ComboBox*>(m_pOwner->m_pOuter);
+
+  IFWL_ComboBox* pOuter = static_cast<IFWL_ComboBox*>(m_pOuter);
   pOuter->ShowDropList(FALSE);
   return 1;
 }
 
-int32_t CFWL_ComboListImpDelegate::OnDropListLButtonUp(CFWL_MsgMouse* pMsg) {
-  IFWL_ComboBox* pOuter = static_cast<IFWL_ComboBox*>(m_pOwner->m_pOuter);
-  if (m_pOwner->m_bNotifyOwner) {
-    m_pOwner->ClientToOuter(pMsg->m_fx, pMsg->m_fy);
+int32_t IFWL_ComboList::OnDropListLButtonUp(CFWL_MsgMouse* pMsg) {
+  IFWL_ComboBox* pOuter = static_cast<IFWL_ComboBox*>(m_pOuter);
+  if (m_bNotifyOwner) {
+    ClientToOuter(pMsg->m_fx, pMsg->m_fy);
     pOuter->GetDelegate()->OnProcessMessage(pMsg);
   } else {
-    if (m_pOwner->IsShowScrollBar(TRUE) && m_pOwner->m_pVertScrollBar) {
+    if (IsShowScrollBar(TRUE) && m_pVertScrollBar) {
       CFX_RectF rect;
-      m_pOwner->m_pVertScrollBar->GetWidgetRect(rect);
+      m_pVertScrollBar->GetWidgetRect(rect);
       if (rect.Contains(pMsg->m_fx, pMsg->m_fy)) {
         return 1;
       }
     }
     pOuter->ShowDropList(FALSE);
-    IFWL_ListItem* hItem = m_pOwner->GetItemAtPoint(pMsg->m_fx, pMsg->m_fy);
-    if (hItem) {
+    IFWL_ListItem* hItem = GetItemAtPoint(pMsg->m_fx, pMsg->m_fy);
+    if (hItem)
       pOuter->ProcessSelChanged(TRUE);
-    }
   }
   return 1;
 }
 
-int32_t CFWL_ComboListImpDelegate::OnDropListKey(CFWL_MsgKey* pKey) {
-  IFWL_ComboBox* pOuter = static_cast<IFWL_ComboBox*>(m_pOwner->m_pOuter);
+int32_t IFWL_ComboList::OnDropListKey(CFWL_MsgKey* pKey) {
+  IFWL_ComboBox* pOuter = static_cast<IFWL_ComboBox*>(m_pOuter);
   FX_BOOL bPropagate = FALSE;
   if (pKey->m_dwCmd == FWL_KeyCommand::KeyDown) {
     uint32_t dwKeyCode = pKey->m_dwKeyCode;
@@ -242,34 +236,35 @@
     bPropagate = TRUE;
   }
   if (bPropagate) {
-    pKey->m_pDstTarget = m_pOwner->m_pOuter;
+    pKey->m_pDstTarget = m_pOuter;
     pOuter->GetDelegate()->OnProcessMessage(pKey);
     return 1;
   }
   return 0;
 }
 
-void CFWL_ComboListImpDelegate::OnDropListKeyDown(CFWL_MsgKey* pKey) {
+void IFWL_ComboList::OnDropListKeyDown(CFWL_MsgKey* pKey) {
   uint32_t dwKeyCode = pKey->m_dwKeyCode;
   switch (dwKeyCode) {
     case FWL_VKEY_Up:
     case FWL_VKEY_Down:
     case FWL_VKEY_Home:
     case FWL_VKEY_End: {
-      IFWL_ComboBox* pOuter = static_cast<IFWL_ComboBox*>(m_pOwner->m_pOuter);
-      IFWL_ListBoxDP* pData = static_cast<IFWL_ListBoxDP*>(
-          m_pOwner->m_pProperties->m_pDataProvider);
-      IFWL_ListItem* hItem = pData->GetItem(m_pOwner, pOuter->m_iCurSel);
-      hItem = m_pOwner->GetItem(hItem, dwKeyCode);
+      IFWL_ComboBox* pOuter = static_cast<IFWL_ComboBox*>(m_pOuter);
+      IFWL_ListBoxDP* pData =
+          static_cast<IFWL_ListBoxDP*>(m_pProperties->m_pDataProvider);
+      IFWL_ListItem* hItem =
+          pData->GetItem(this, pOuter->GetCurrentSelection());
+      hItem = GetItem(hItem, dwKeyCode);
       if (!hItem) {
         break;
       }
-      m_pOwner->SetSelection(hItem, hItem, TRUE);
-      m_pOwner->ScrollToVisible(hItem);
+      SetSelection(hItem, hItem, TRUE);
+      ScrollToVisible(hItem);
       CFX_RectF rtInvalidate;
-      rtInvalidate.Set(0, 0, m_pOwner->m_pProperties->m_rtWidget.width,
-                       m_pOwner->m_pProperties->m_rtWidget.height);
-      m_pOwner->Repaint(&rtInvalidate);
+      rtInvalidate.Set(0, 0, m_pProperties->m_rtWidget.width,
+                       m_pProperties->m_rtWidget.height);
+      Repaint(&rtInvalidate);
       break;
     }
     default:
diff --git a/xfa/fwl/core/ifwl_combolist.h b/xfa/fwl/core/ifwl_combolist.h
index 781fbad..a4e90f5 100644
--- a/xfa/fwl/core/ifwl_combolist.h
+++ b/xfa/fwl/core/ifwl_combolist.h
@@ -17,6 +17,9 @@
                  const CFWL_WidgetImpProperties& properties,
                  IFWL_Widget* pOuter);
 
+  // IFWL_ListBox.
+  void OnProcessMessage(CFWL_Message* pMessage) override;
+
   int32_t MatchItem(const CFX_WideString& wsMatch);
   void ChangeSelected(int32_t iSel);
   int32_t CountItems();
@@ -26,23 +29,15 @@
 
   FX_BOOL m_bNotifyOwner;
 
-  friend class CFWL_ComboListImpDelegate;
   friend class IFWL_ComboBox;
-};
 
-class CFWL_ComboListImpDelegate : public CFWL_ListBoxImpDelegate {
- public:
-  CFWL_ComboListImpDelegate(IFWL_ComboList* pOwner);
-  void OnProcessMessage(CFWL_Message* pMessage) override;
-
- protected:
-  void OnDropListFocusChanged(CFWL_Message* pMsg, FX_BOOL bSet = TRUE);
+ private:
+  void OnDropListFocusChanged(CFWL_Message* pMsg, FX_BOOL bSet);
   int32_t OnDropListMouseMove(CFWL_MsgMouse* pMsg);
   int32_t OnDropListLButtonDown(CFWL_MsgMouse* pMsg);
   int32_t OnDropListLButtonUp(CFWL_MsgMouse* pMsg);
   int32_t OnDropListKey(CFWL_MsgKey* pKey);
   void OnDropListKeyDown(CFWL_MsgKey* pKey);
-  IFWL_ComboList* m_pOwner;
 };
 
 #endif  // XFA_FWL_CORE_IFWL_COMBOLIST_H_
diff --git a/xfa/fwl/core/ifwl_datetimecalendar.cpp b/xfa/fwl/core/ifwl_datetimecalendar.cpp
index a44b558..f521c56 100644
--- a/xfa/fwl/core/ifwl_datetimecalendar.cpp
+++ b/xfa/fwl/core/ifwl_datetimecalendar.cpp
@@ -15,23 +15,14 @@
     const IFWL_App* app,
     const CFWL_WidgetImpProperties& properties,
     IFWL_Widget* pOuter)
-    : IFWL_MonthCalendar(app, properties, pOuter) {
-  SetDelegate(pdfium::MakeUnique<CFWL_DateTimeCalendarImpDelegate>(this));
-}
+    : IFWL_MonthCalendar(app, properties, pOuter), m_bFlag(FALSE) {}
 
-CFWL_DateTimeCalendarImpDelegate::CFWL_DateTimeCalendarImpDelegate(
-    IFWL_DateTimeCalendar* pOwner)
-    : CFWL_MonthCalendarImpDelegate(pOwner), m_pOwner(pOwner) {
-  m_bFlag = FALSE;
-}
-
-void CFWL_DateTimeCalendarImpDelegate::OnProcessMessage(
-    CFWL_Message* pMessage) {
+void IFWL_DateTimeCalendar::OnProcessMessage(CFWL_Message* pMessage) {
   CFWL_MessageType dwCode = pMessage->GetClassID();
   if (dwCode == CFWL_MessageType::SetFocus ||
       dwCode == CFWL_MessageType::KillFocus) {
-    IFWL_Widget* pOuter = m_pOwner->GetOuter();
-    pOuter->GetCurrentDelegate()->OnProcessMessage(pMessage);
+    IFWL_Widget* pOuter = GetOuter();
+    pOuter->GetDelegate()->OnProcessMessage(pMessage);
     return;
   }
   if (dwCode == CFWL_MessageType::Mouse) {
@@ -42,72 +33,67 @@
       OnLButtonUpEx(pMsg);
     return;
   }
-  CFWL_MonthCalendarImpDelegate::OnProcessMessage(pMessage);
+  IFWL_MonthCalendar::OnProcessMessage(pMessage);
 }
 
-void CFWL_DateTimeCalendarImpDelegate::OnLButtonDownEx(CFWL_MsgMouse* pMsg) {
-  if (m_pOwner->m_rtLBtn.Contains(pMsg->m_fx, pMsg->m_fy)) {
-    m_pOwner->m_iLBtnPartStates = CFWL_PartState_Pressed;
-    m_pOwner->PrevMonth();
-    m_pOwner->Repaint(&m_pOwner->m_rtClient);
-  } else if (m_pOwner->m_rtRBtn.Contains(pMsg->m_fx, pMsg->m_fy)) {
-    m_pOwner->m_iRBtnPartStates |= CFWL_PartState_Pressed;
-    m_pOwner->NextMonth();
-    m_pOwner->Repaint(&m_pOwner->m_rtClient);
-  } else if (m_pOwner->m_rtToday.Contains(pMsg->m_fx, pMsg->m_fy)) {
-    if ((m_pOwner->m_pProperties->m_dwStyleExes & FWL_STYLEEXT_MCD_NoToday) ==
-        0) {
-      m_pOwner->JumpToToday();
-      m_pOwner->Repaint(&m_pOwner->m_rtClient);
+void IFWL_DateTimeCalendar::OnLButtonDownEx(CFWL_MsgMouse* pMsg) {
+  if (m_rtLBtn.Contains(pMsg->m_fx, pMsg->m_fy)) {
+    m_iLBtnPartStates = CFWL_PartState_Pressed;
+    PrevMonth();
+    Repaint(&m_rtClient);
+  } else if (m_rtRBtn.Contains(pMsg->m_fx, pMsg->m_fy)) {
+    m_iRBtnPartStates |= CFWL_PartState_Pressed;
+    NextMonth();
+    Repaint(&m_rtClient);
+  } else if (m_rtToday.Contains(pMsg->m_fx, pMsg->m_fy)) {
+    if ((m_pProperties->m_dwStyleExes & FWL_STYLEEXT_MCD_NoToday) == 0) {
+      JumpToToday();
+      Repaint(&m_rtClient);
     }
   } else {
-    IFWL_DateTimePicker* pIPicker =
-        static_cast<IFWL_DateTimePicker*>(m_pOwner->m_pOuter);
-    if (pIPicker->IsMonthCalendarShowed()) {
+    IFWL_DateTimePicker* pIPicker = static_cast<IFWL_DateTimePicker*>(m_pOuter);
+    if (pIPicker->IsMonthCalendarShowed())
       m_bFlag = 1;
-    }
   }
 }
 
-void CFWL_DateTimeCalendarImpDelegate::OnLButtonUpEx(CFWL_MsgMouse* pMsg) {
-  if (m_pOwner->m_pWidgetMgr->IsFormDisabled()) {
+void IFWL_DateTimeCalendar::OnLButtonUpEx(CFWL_MsgMouse* pMsg) {
+  if (m_pWidgetMgr->IsFormDisabled())
     return DisForm_OnLButtonUpEx(pMsg);
-  }
-  if (m_pOwner->m_rtLBtn.Contains(pMsg->m_fx, pMsg->m_fy)) {
-    m_pOwner->m_iLBtnPartStates = 0;
-    m_pOwner->Repaint(&m_pOwner->m_rtLBtn);
+  if (m_rtLBtn.Contains(pMsg->m_fx, pMsg->m_fy)) {
+    m_iLBtnPartStates = 0;
+    Repaint(&m_rtLBtn);
     return;
   }
-  if (m_pOwner->m_rtRBtn.Contains(pMsg->m_fx, pMsg->m_fy)) {
-    m_pOwner->m_iRBtnPartStates = 0;
-    m_pOwner->Repaint(&m_pOwner->m_rtRBtn);
+  if (m_rtRBtn.Contains(pMsg->m_fx, pMsg->m_fy)) {
+    m_iRBtnPartStates = 0;
+    Repaint(&m_rtRBtn);
     return;
   }
-  if (m_pOwner->m_rtToday.Contains(pMsg->m_fx, pMsg->m_fy)) {
+  if (m_rtToday.Contains(pMsg->m_fx, pMsg->m_fy))
     return;
-  }
+
   int32_t iOldSel = 0;
-  if (m_pOwner->m_arrSelDays.GetSize() > 0) {
-    iOldSel = m_pOwner->m_arrSelDays[0];
-  }
-  int32_t iCurSel = m_pOwner->GetDayAtPoint(pMsg->m_fx, pMsg->m_fy);
+  if (m_arrSelDays.GetSize() > 0)
+    iOldSel = m_arrSelDays[0];
+
+  int32_t iCurSel = GetDayAtPoint(pMsg->m_fx, pMsg->m_fy);
   CFX_RectF rt;
-  IFWL_DateTimePicker* pIPicker =
-      static_cast<IFWL_DateTimePicker*>(m_pOwner->m_pOuter);
-  pIPicker->m_pForm->GetWidgetRect(rt);
+  IFWL_DateTimePicker* pIPicker = static_cast<IFWL_DateTimePicker*>(m_pOuter);
+  pIPicker->GetFormProxy()->GetWidgetRect(rt);
   rt.Set(0, 0, rt.width, rt.height);
   if (iCurSel > 0) {
-    FWL_DATEINFO* lpDatesInfo = m_pOwner->m_arrDates.GetAt(iCurSel - 1);
+    FWL_DATEINFO* lpDatesInfo = m_arrDates.GetAt(iCurSel - 1);
     CFX_RectF rtInvalidate(lpDatesInfo->rect);
-    if (iOldSel > 0 && iOldSel <= m_pOwner->m_arrDates.GetSize()) {
-      lpDatesInfo = m_pOwner->m_arrDates.GetAt(iOldSel - 1);
+    if (iOldSel > 0 && iOldSel <= m_arrDates.GetSize()) {
+      lpDatesInfo = m_arrDates.GetAt(iOldSel - 1);
       rtInvalidate.Union(lpDatesInfo->rect);
     }
-    m_pOwner->AddSelDay(iCurSel);
-    if (!m_pOwner->m_pOuter)
+    AddSelDay(iCurSel);
+    if (!m_pOuter)
       return;
-    pIPicker->ProcessSelChanged(m_pOwner->m_iCurYear, m_pOwner->m_iCurMonth,
-                                iCurSel);
+
+    pIPicker->ProcessSelChanged(m_iCurYear, m_iCurMonth, iCurSel);
     pIPicker->ShowMonthCalendar(FALSE);
   } else if (m_bFlag && (!rt.Contains(pMsg->m_fx, pMsg->m_fy))) {
     pIPicker->ShowMonthCalendar(FALSE);
@@ -115,48 +101,44 @@
   m_bFlag = 0;
 }
 
-void CFWL_DateTimeCalendarImpDelegate::OnMouseMoveEx(CFWL_MsgMouse* pMsg) {
-  if (m_pOwner->m_pProperties->m_dwStyleExes & FWL_STYLEEXT_MCD_MultiSelect) {
+void IFWL_DateTimeCalendar::OnMouseMoveEx(CFWL_MsgMouse* pMsg) {
+  if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_MCD_MultiSelect)
     return;
-  }
+
   FX_BOOL bRepaint = FALSE;
   CFX_RectF rtInvalidate;
   rtInvalidate.Set(0, 0, 0, 0);
-  if (m_pOwner->m_rtDates.Contains(pMsg->m_fx, pMsg->m_fy)) {
-    int32_t iHover = m_pOwner->GetDayAtPoint(pMsg->m_fx, pMsg->m_fy);
-    bRepaint = m_pOwner->m_iHovered != iHover;
+  if (m_rtDates.Contains(pMsg->m_fx, pMsg->m_fy)) {
+    int32_t iHover = GetDayAtPoint(pMsg->m_fx, pMsg->m_fy);
+    bRepaint = m_iHovered != iHover;
     if (bRepaint) {
-      if (m_pOwner->m_iHovered > 0) {
-        m_pOwner->GetDayRect(m_pOwner->m_iHovered, rtInvalidate);
-      }
+      if (m_iHovered > 0)
+        GetDayRect(m_iHovered, rtInvalidate);
       if (iHover > 0) {
         CFX_RectF rtDay;
-        m_pOwner->GetDayRect(iHover, rtDay);
-        if (rtInvalidate.IsEmpty()) {
+        GetDayRect(iHover, rtDay);
+        if (rtInvalidate.IsEmpty())
           rtInvalidate = rtDay;
-        } else {
+        else
           rtInvalidate.Union(rtDay);
-        }
       }
     }
-    m_pOwner->m_iHovered = iHover;
+    m_iHovered = iHover;
     CFWL_Event_DtpHoverChanged ev;
     ev.hoverday = iHover;
-    m_pOwner->DispatchEvent(&ev);
+    DispatchEvent(&ev);
   } else {
-    bRepaint = m_pOwner->m_iHovered > 0;
-    if (bRepaint) {
-      m_pOwner->GetDayRect(m_pOwner->m_iHovered, rtInvalidate);
-    }
-    m_pOwner->m_iHovered = -1;
+    bRepaint = m_iHovered > 0;
+    if (bRepaint)
+      GetDayRect(m_iHovered, rtInvalidate);
+
+    m_iHovered = -1;
   }
-  if (bRepaint && !rtInvalidate.IsEmpty()) {
-    m_pOwner->Repaint(&rtInvalidate);
-  }
+  if (bRepaint && !rtInvalidate.IsEmpty())
+    Repaint(&rtInvalidate);
 }
 
-void CFWL_DateTimeCalendarImpDelegate::DisForm_OnProcessMessage(
-    CFWL_Message* pMessage) {
+void IFWL_DateTimeCalendar::DisForm_OnProcessMessage(CFWL_Message* pMessage) {
   if (pMessage->GetClassID() == CFWL_MessageType::Mouse) {
     CFWL_MsgMouse* pMsg = static_cast<CFWL_MsgMouse*>(pMessage);
     if (pMsg->m_dwCmd == FWL_MouseCommand::LeftButtonUp) {
@@ -164,41 +146,39 @@
       return;
     }
   }
-  CFWL_MonthCalendarImpDelegate::OnProcessMessage(pMessage);
+  IFWL_MonthCalendar::OnProcessMessage(pMessage);
 }
 
-void CFWL_DateTimeCalendarImpDelegate::DisForm_OnLButtonUpEx(
-    CFWL_MsgMouse* pMsg) {
-  if (m_pOwner->m_rtLBtn.Contains(pMsg->m_fx, pMsg->m_fy)) {
-    m_pOwner->m_iLBtnPartStates = 0;
-    m_pOwner->Repaint(&(m_pOwner->m_rtLBtn));
+void IFWL_DateTimeCalendar::DisForm_OnLButtonUpEx(CFWL_MsgMouse* pMsg) {
+  if (m_rtLBtn.Contains(pMsg->m_fx, pMsg->m_fy)) {
+    m_iLBtnPartStates = 0;
+    Repaint(&(m_rtLBtn));
     return;
   }
-  if (m_pOwner->m_rtRBtn.Contains(pMsg->m_fx, pMsg->m_fy)) {
-    m_pOwner->m_iRBtnPartStates = 0;
-    m_pOwner->Repaint(&(m_pOwner->m_rtRBtn));
+  if (m_rtRBtn.Contains(pMsg->m_fx, pMsg->m_fy)) {
+    m_iRBtnPartStates = 0;
+    Repaint(&(m_rtRBtn));
     return;
   }
-  if (m_pOwner->m_rtToday.Contains(pMsg->m_fx, pMsg->m_fy)) {
+  if (m_rtToday.Contains(pMsg->m_fx, pMsg->m_fy))
     return;
-  }
+
   int32_t iOldSel = 0;
-  if (m_pOwner->m_arrSelDays.GetSize() > 0) {
-    iOldSel = m_pOwner->m_arrSelDays[0];
-  }
-  int32_t iCurSel = m_pOwner->GetDayAtPoint(pMsg->m_fx, pMsg->m_fy);
+  if (m_arrSelDays.GetSize() > 0)
+    iOldSel = m_arrSelDays[0];
+
+  int32_t iCurSel = GetDayAtPoint(pMsg->m_fx, pMsg->m_fy);
   if (iCurSel > 0) {
-    FWL_DATEINFO* lpDatesInfo = m_pOwner->m_arrDates.GetAt(iCurSel - 1);
+    FWL_DATEINFO* lpDatesInfo = m_arrDates.GetAt(iCurSel - 1);
     CFX_RectF rtInvalidate(lpDatesInfo->rect);
-    if (iOldSel > 0 && iOldSel <= m_pOwner->m_arrDates.GetSize()) {
-      lpDatesInfo = m_pOwner->m_arrDates.GetAt(iOldSel - 1);
+    if (iOldSel > 0 && iOldSel <= m_arrDates.GetSize()) {
+      lpDatesInfo = m_arrDates.GetAt(iOldSel - 1);
       rtInvalidate.Union(lpDatesInfo->rect);
     }
-    m_pOwner->AddSelDay(iCurSel);
+    AddSelDay(iCurSel);
     IFWL_DateTimePicker* pDateTime =
-        static_cast<IFWL_DateTimePicker*>(m_pOwner->m_pOuter);
-    pDateTime->ProcessSelChanged(m_pOwner->m_iCurYear, m_pOwner->m_iCurMonth,
-                                 iCurSel);
+        static_cast<IFWL_DateTimePicker*>(m_pOuter);
+    pDateTime->ProcessSelChanged(m_iCurYear, m_iCurMonth, iCurSel);
     pDateTime->ShowMonthCalendar(FALSE);
   }
 }
diff --git a/xfa/fwl/core/ifwl_datetimecalendar.h b/xfa/fwl/core/ifwl_datetimecalendar.h
index 7a3b960..721bc27 100644
--- a/xfa/fwl/core/ifwl_datetimecalendar.h
+++ b/xfa/fwl/core/ifwl_datetimecalendar.h
@@ -15,26 +15,17 @@
                         const CFWL_WidgetImpProperties& properties,
                         IFWL_Widget* pOuter);
 
- protected:
-  friend class CFWL_DateTimeCalendarImpDelegate;
-};
-
-class CFWL_DateTimeCalendarImpDelegate : public CFWL_MonthCalendarImpDelegate {
- public:
-  CFWL_DateTimeCalendarImpDelegate(IFWL_DateTimeCalendar* pOwner);
+  // IFWL_MonthCalendar
   void OnProcessMessage(CFWL_Message* pMessage) override;
 
+ private:
   void OnLButtonDownEx(CFWL_MsgMouse* pMsg);
   void OnLButtonUpEx(CFWL_MsgMouse* pMsg);
   void OnMouseMoveEx(CFWL_MsgMouse* pMsg);
-
- protected:
-  IFWL_DateTimeCalendar* m_pOwner;
-  FX_BOOL m_bFlag;
-
- private:
   void DisForm_OnProcessMessage(CFWL_Message* pMessage);
   void DisForm_OnLButtonUpEx(CFWL_MsgMouse* pMsg);
+
+  FX_BOOL m_bFlag;
 };
 
 #endif  // XFA_FWL_CORE_IFWL_DATETIMECALENDAR_H_
diff --git a/xfa/fwl/core/ifwl_datetimeedit.cpp b/xfa/fwl/core/ifwl_datetimeedit.cpp
index 1c0baae..906ba94 100644
--- a/xfa/fwl/core/ifwl_datetimeedit.cpp
+++ b/xfa/fwl/core/ifwl_datetimeedit.cpp
@@ -13,16 +13,10 @@
 IFWL_DateTimeEdit::IFWL_DateTimeEdit(const IFWL_App* app,
                                      const CFWL_WidgetImpProperties& properties,
                                      IFWL_Widget* pOuter)
-    : IFWL_Edit(app, properties, pOuter) {
-  SetDelegate(pdfium::MakeUnique<CFWL_DateTimeEditImpDelegate>(this));
-}
+    : IFWL_Edit(app, properties, pOuter) {}
 
-CFWL_DateTimeEditImpDelegate::CFWL_DateTimeEditImpDelegate(
-    IFWL_DateTimeEdit* pOwner)
-    : CFWL_EditImpDelegate(pOwner), m_pOwner(pOwner) {}
-
-void CFWL_DateTimeEditImpDelegate::OnProcessMessage(CFWL_Message* pMessage) {
-  if (m_pOwner->m_pWidgetMgr->IsFormDisabled()) {
+void IFWL_DateTimeEdit::OnProcessMessage(CFWL_Message* pMessage) {
+  if (m_pWidgetMgr->IsFormDisabled()) {
     DisForm_OnProcessMessage(pMessage);
     return;
   }
@@ -30,24 +24,23 @@
   CFWL_MessageType dwHashCode = pMessage->GetClassID();
   if (dwHashCode == CFWL_MessageType::SetFocus ||
       dwHashCode == CFWL_MessageType::KillFocus) {
-    IFWL_Widget* pOuter = m_pOwner->GetOuter();
-    pOuter->GetCurrentDelegate()->OnProcessMessage(pMessage);
+    IFWL_Widget* pOuter = GetOuter();
+    pOuter->GetDelegate()->OnProcessMessage(pMessage);
   }
 }
 
-void CFWL_DateTimeEditImpDelegate::DisForm_OnProcessMessage(
-    CFWL_Message* pMessage) {
+void IFWL_DateTimeEdit::DisForm_OnProcessMessage(CFWL_Message* pMessage) {
   CFWL_MessageType dwHashCode = pMessage->GetClassID();
-  if (m_pOwner->m_pWidgetMgr->IsFormDisabled()) {
+  if (m_pWidgetMgr->IsFormDisabled()) {
     if (dwHashCode == CFWL_MessageType::Mouse) {
       CFWL_MsgMouse* pMouse = static_cast<CFWL_MsgMouse*>(pMessage);
       if (pMouse->m_dwCmd == FWL_MouseCommand::LeftButtonDown ||
           pMouse->m_dwCmd == FWL_MouseCommand::RightButtonDown) {
-        if ((m_pOwner->m_pProperties->m_dwStates & FWL_WGTSTATE_Focused) == 0) {
-          m_pOwner->m_pProperties->m_dwStates |= FWL_WGTSTATE_Focused;
-        }
+        if ((m_pProperties->m_dwStates & FWL_WGTSTATE_Focused) == 0)
+          m_pProperties->m_dwStates |= FWL_WGTSTATE_Focused;
+
         IFWL_DateTimePicker* pDateTime =
-            static_cast<IFWL_DateTimePicker*>(m_pOwner->m_pOuter);
+            static_cast<IFWL_DateTimePicker*>(m_pOuter);
         if (pDateTime->IsMonthCalendarShowed()) {
           CFX_RectF rtInvalidate;
           pDateTime->GetWidgetRect(rtInvalidate);
@@ -58,5 +51,5 @@
       }
     }
   }
-  CFWL_EditImpDelegate::OnProcessMessage(pMessage);
+  IFWL_Edit::OnProcessMessage(pMessage);
 }
diff --git a/xfa/fwl/core/ifwl_datetimeedit.h b/xfa/fwl/core/ifwl_datetimeedit.h
index 39dd371..84ff7e7 100644
--- a/xfa/fwl/core/ifwl_datetimeedit.h
+++ b/xfa/fwl/core/ifwl_datetimeedit.h
@@ -19,18 +19,9 @@
                     const CFWL_WidgetImpProperties& properties,
                     IFWL_Widget* pOuter);
 
- protected:
-  friend class CFWL_DateTimeEditImpDelegate;
-};
-
-class CFWL_DateTimeEditImpDelegate : public CFWL_EditImpDelegate {
- public:
-  CFWL_DateTimeEditImpDelegate(IFWL_DateTimeEdit* pOwner);
+  // IFWL_Edit.
   void OnProcessMessage(CFWL_Message* pMessage) override;
 
- protected:
-  IFWL_DateTimeEdit* m_pOwner;
-
  private:
   void DisForm_OnProcessMessage(CFWL_Message* pMessage);
 };
diff --git a/xfa/fwl/core/ifwl_datetimepicker.cpp b/xfa/fwl/core/ifwl_datetimepicker.cpp
index 844eb9e..90f85a0 100644
--- a/xfa/fwl/core/ifwl_datetimepicker.cpp
+++ b/xfa/fwl/core/ifwl_datetimepicker.cpp
@@ -35,8 +35,6 @@
       m_bLBtnDown(FALSE) {
   m_rtBtn.Set(0, 0, 0, 0);
 
-  SetDelegate(pdfium::MakeUnique<CFWL_DateTimePickerImpDelegate>(this));
-
   m_pProperties->m_dwStyleExes = FWL_STYLEEXT_DTP_ShortDateFormat;
   CFWL_WidgetImpProperties propMonth;
   propMonth.m_dwStyles = FWL_WGTSTYLE_Popup | FWL_WGTSTYLE_Border;
@@ -520,7 +518,7 @@
     CFWL_MsgSetFocus msg;
     msg.m_pDstTarget = m_pMonthCal.get();
     msg.m_pSrcTarget = m_pEdit.get();
-    m_pEdit->GetCurrentDelegate()->OnProcessMessage(&msg);
+    m_pEdit->GetDelegate()->OnProcessMessage(&msg);
   }
   CFX_RectF rtInvalidate, rtCal;
   rtInvalidate.Set(0, 0, m_pProperties->m_rtWidget.width,
@@ -643,50 +641,40 @@
   return FWL_Error::Succeeded;
 }
 
-CFWL_DateTimePickerImpDelegate::CFWL_DateTimePickerImpDelegate(
-    IFWL_DateTimePicker* pOwner)
-    : m_pOwner(pOwner) {}
-
-void CFWL_DateTimePickerImpDelegate::OnProcessMessage(CFWL_Message* pMessage) {
+void IFWL_DateTimePicker::OnProcessMessage(CFWL_Message* pMessage) {
   if (!pMessage)
     return;
 
   switch (pMessage->GetClassID()) {
-    case CFWL_MessageType::SetFocus: {
+    case CFWL_MessageType::SetFocus:
       OnFocusChanged(pMessage, TRUE);
       break;
-    }
-    case CFWL_MessageType::KillFocus: {
+    case CFWL_MessageType::KillFocus:
       OnFocusChanged(pMessage, FALSE);
       break;
-    }
     case CFWL_MessageType::Mouse: {
       CFWL_MsgMouse* pMouse = static_cast<CFWL_MsgMouse*>(pMessage);
       switch (pMouse->m_dwCmd) {
-        case FWL_MouseCommand::LeftButtonDown: {
+        case FWL_MouseCommand::LeftButtonDown:
           OnLButtonDown(pMouse);
           break;
-        }
-        case FWL_MouseCommand::LeftButtonUp: {
+        case FWL_MouseCommand::LeftButtonUp:
           OnLButtonUp(pMouse);
           break;
-        }
-        case FWL_MouseCommand::Move: {
+        case FWL_MouseCommand::Move:
           OnMouseMove(pMouse);
           break;
-        }
-        case FWL_MouseCommand::Leave: {
+        case FWL_MouseCommand::Leave:
           OnMouseLeave(pMouse);
           break;
-        }
         default:
           break;
       }
       break;
     }
     case CFWL_MessageType::Key: {
-      if (m_pOwner->m_pEdit->GetStates() & FWL_WGTSTATE_Focused) {
-        m_pOwner->m_pEdit->GetCurrentDelegate()->OnProcessMessage(pMessage);
+      if (m_pEdit->GetStates() & FWL_WGTSTATE_Focused) {
+        m_pEdit->GetDelegate()->OnProcessMessage(pMessage);
         return;
       }
       break;
@@ -695,114 +683,105 @@
       break;
   }
 
-  CFWL_WidgetImpDelegate::OnProcessMessage(pMessage);
+  IFWL_Widget::OnProcessMessage(pMessage);
 }
 
-void CFWL_DateTimePickerImpDelegate::OnDrawWidget(CFX_Graphics* pGraphics,
-                                                  const CFX_Matrix* pMatrix) {
-  m_pOwner->DrawWidget(pGraphics, pMatrix);
+void IFWL_DateTimePicker::OnDrawWidget(CFX_Graphics* pGraphics,
+                                       const CFX_Matrix* pMatrix) {
+  DrawWidget(pGraphics, pMatrix);
 }
 
-void CFWL_DateTimePickerImpDelegate::OnFocusChanged(CFWL_Message* pMsg,
-                                                    FX_BOOL bSet) {
+void IFWL_DateTimePicker::OnFocusChanged(CFWL_Message* pMsg, FX_BOOL bSet) {
   if (!pMsg)
     return;
-  if (m_pOwner->m_pWidgetMgr->IsFormDisabled()) {
+  if (m_pWidgetMgr->IsFormDisabled())
     return DisForm_OnFocusChanged(pMsg, bSet);
-  }
+
   if (bSet) {
-    m_pOwner->m_pProperties->m_dwStates |= (FWL_WGTSTATE_Focused);
-    m_pOwner->Repaint(&m_pOwner->m_rtClient);
+    m_pProperties->m_dwStates |= (FWL_WGTSTATE_Focused);
+    Repaint(&m_rtClient);
   } else {
-    m_pOwner->m_pProperties->m_dwStates &= ~(FWL_WGTSTATE_Focused);
-    m_pOwner->Repaint(&m_pOwner->m_rtClient);
+    m_pProperties->m_dwStates &= ~(FWL_WGTSTATE_Focused);
+    Repaint(&m_rtClient);
   }
-  if (pMsg->m_pSrcTarget == m_pOwner->m_pMonthCal.get() &&
-      m_pOwner->IsMonthCalendarShowed()) {
-    m_pOwner->ShowMonthCalendar(FALSE);
+  if (pMsg->m_pSrcTarget == m_pMonthCal.get() && IsMonthCalendarShowed()) {
+    ShowMonthCalendar(FALSE);
   }
-  m_pOwner->Repaint(&m_pOwner->m_rtClient);
+  Repaint(&m_rtClient);
 }
 
-void CFWL_DateTimePickerImpDelegate::OnLButtonDown(CFWL_MsgMouse* pMsg) {
+void IFWL_DateTimePicker::OnLButtonDown(CFWL_MsgMouse* pMsg) {
   if (!pMsg)
     return;
-  if ((m_pOwner->m_pProperties->m_dwStates & FWL_WGTSTATE_Focused) == 0) {
-    m_pOwner->SetFocus(TRUE);
-  }
-  if (m_pOwner->m_rtBtn.Contains(pMsg->m_fx, pMsg->m_fy)) {
-    if (m_pOwner->IsMonthCalendarShowed()) {
-      m_pOwner->ShowMonthCalendar(FALSE);
+  if ((m_pProperties->m_dwStates & FWL_WGTSTATE_Focused) == 0)
+    SetFocus(TRUE);
+  if (m_rtBtn.Contains(pMsg->m_fx, pMsg->m_fy)) {
+    if (IsMonthCalendarShowed()) {
+      ShowMonthCalendar(FALSE);
       CFWL_Event_DtpCloseUp ev;
-      m_pOwner->DispatchEvent(&ev);
+      DispatchEvent(&ev);
     } else {
-      if (!(m_pOwner->m_pProperties->m_dwStyleExes &
-            FWL_STYLEEXT_DTP_TimeFormat)) {
-        m_pOwner->ShowMonthCalendar(TRUE);
+      if (!(m_pProperties->m_dwStyleExes & FWL_STYLEEXT_DTP_TimeFormat)) {
+        ShowMonthCalendar(TRUE);
         CFWL_Event_DtpDropDown ev;
-        m_pOwner->DispatchEvent(&ev);
-      } else {
+        DispatchEvent(&ev);
       }
-      m_pOwner->m_bLBtnDown = TRUE;
-      m_pOwner->Repaint(&m_pOwner->m_rtClient);
+      m_bLBtnDown = TRUE;
+      Repaint(&m_rtClient);
     }
   }
 }
 
-void CFWL_DateTimePickerImpDelegate::OnLButtonUp(CFWL_MsgMouse* pMsg) {
+void IFWL_DateTimePicker::OnLButtonUp(CFWL_MsgMouse* pMsg) {
   if (!pMsg)
     return;
-  m_pOwner->m_bLBtnDown = FALSE;
-  if (m_pOwner->m_rtBtn.Contains(pMsg->m_fx, pMsg->m_fy)) {
-    m_pOwner->m_iBtnState = CFWL_PartState_Hovered;
-  } else {
-    m_pOwner->m_iBtnState = CFWL_PartState_Normal;
-  }
-  m_pOwner->Repaint(&m_pOwner->m_rtBtn);
+
+  m_bLBtnDown = FALSE;
+  if (m_rtBtn.Contains(pMsg->m_fx, pMsg->m_fy))
+    m_iBtnState = CFWL_PartState_Hovered;
+  else
+    m_iBtnState = CFWL_PartState_Normal;
+  Repaint(&m_rtBtn);
 }
 
-void CFWL_DateTimePickerImpDelegate::OnMouseMove(CFWL_MsgMouse* pMsg) {
-  if (m_pOwner->m_rtBtn.Contains(pMsg->m_fx, pMsg->m_fy)) {
-  } else {
-    m_pOwner->m_iBtnState = CFWL_PartState_Normal;
-  }
-  m_pOwner->Repaint(&m_pOwner->m_rtBtn);
+void IFWL_DateTimePicker::OnMouseMove(CFWL_MsgMouse* pMsg) {
+  if (!m_rtBtn.Contains(pMsg->m_fx, pMsg->m_fy))
+    m_iBtnState = CFWL_PartState_Normal;
+
+  Repaint(&m_rtBtn);
 }
 
-void CFWL_DateTimePickerImpDelegate::OnMouseLeave(CFWL_MsgMouse* pMsg) {
+void IFWL_DateTimePicker::OnMouseLeave(CFWL_MsgMouse* pMsg) {
   if (!pMsg)
     return;
-  m_pOwner->m_iBtnState = CFWL_PartState_Normal;
-  m_pOwner->Repaint(&m_pOwner->m_rtBtn);
+  m_iBtnState = CFWL_PartState_Normal;
+  Repaint(&m_rtBtn);
 }
 
-void CFWL_DateTimePickerImpDelegate::DisForm_OnFocusChanged(CFWL_Message* pMsg,
-                                                            FX_BOOL bSet) {
-  CFX_RectF rtInvalidate(m_pOwner->m_rtBtn);
+void IFWL_DateTimePicker::DisForm_OnFocusChanged(CFWL_Message* pMsg,
+                                                 FX_BOOL bSet) {
+  CFX_RectF rtInvalidate(m_rtBtn);
   if (bSet) {
-    m_pOwner->m_pProperties->m_dwStates |= FWL_WGTSTATE_Focused;
-    if (m_pOwner->m_pEdit &&
-        !(m_pOwner->m_pEdit->GetStylesEx() & FWL_STYLEEXT_EDT_ReadOnly)) {
-      m_pOwner->m_rtBtn.Set(m_pOwner->m_pProperties->m_rtWidget.width, 0,
-                            m_pOwner->m_fBtn,
-                            m_pOwner->m_pProperties->m_rtWidget.height - 1);
+    m_pProperties->m_dwStates |= FWL_WGTSTATE_Focused;
+    if (m_pEdit && !(m_pEdit->GetStylesEx() & FWL_STYLEEXT_EDT_ReadOnly)) {
+      m_rtBtn.Set(m_pProperties->m_rtWidget.width, 0, m_fBtn,
+                  m_pProperties->m_rtWidget.height - 1);
     }
-    rtInvalidate = m_pOwner->m_rtBtn;
-    pMsg->m_pDstTarget = m_pOwner->m_pEdit.get();
-    m_pOwner->m_pEdit->GetCurrentDelegate()->OnProcessMessage(pMsg);
+    rtInvalidate = m_rtBtn;
+    pMsg->m_pDstTarget = m_pEdit.get();
+    m_pEdit->GetDelegate()->OnProcessMessage(pMsg);
   } else {
-    m_pOwner->m_pProperties->m_dwStates &= ~FWL_WGTSTATE_Focused;
-    m_pOwner->m_rtBtn.Set(0, 0, 0, 0);
-    if (m_pOwner->DisForm_IsMonthCalendarShowed()) {
-      m_pOwner->ShowMonthCalendar(FALSE);
-    }
-    if (m_pOwner->m_pEdit->GetStates() & FWL_WGTSTATE_Focused) {
-      pMsg->m_pSrcTarget = m_pOwner->m_pEdit.get();
-      m_pOwner->m_pEdit->GetCurrentDelegate()->OnProcessMessage(pMsg);
+    m_pProperties->m_dwStates &= ~FWL_WGTSTATE_Focused;
+    m_rtBtn.Set(0, 0, 0, 0);
+    if (DisForm_IsMonthCalendarShowed())
+      ShowMonthCalendar(FALSE);
+    if (m_pEdit->GetStates() & FWL_WGTSTATE_Focused) {
+      pMsg->m_pSrcTarget = m_pEdit.get();
+      m_pEdit->GetDelegate()->OnProcessMessage(pMsg);
     }
   }
   rtInvalidate.Inflate(2, 2);
-  m_pOwner->Repaint(&rtInvalidate);
+  Repaint(&rtInvalidate);
 }
 
 IFWL_DateTimePicker::CFWL_MonthCalendarImpDP::CFWL_MonthCalendarImpDP() {
diff --git a/xfa/fwl/core/ifwl_datetimepicker.h b/xfa/fwl/core/ifwl_datetimepicker.h
index 5b360d3..04d2869 100644
--- a/xfa/fwl/core/ifwl_datetimepicker.h
+++ b/xfa/fwl/core/ifwl_datetimepicker.h
@@ -74,6 +74,9 @@
   FWL_Error DrawWidget(CFX_Graphics* pGraphics,
                        const CFX_Matrix* pMatrix = nullptr) override;
   FWL_Error SetThemeProvider(IFWL_ThemeProvider* pTP) override;
+  void OnProcessMessage(CFWL_Message* pMessage) override;
+  void OnDrawWidget(CFX_Graphics* pGraphics,
+                    const CFX_Matrix* pMatrix) override;
 
   FWL_Error GetCurSel(int32_t& iYear, int32_t& iMonth, int32_t& iDay);
   FWL_Error SetCurSel(int32_t iYear, int32_t iMonth, int32_t iDay);
@@ -103,12 +106,13 @@
                                uint32_t dwStylesExRemoved);
   IFWL_DateTimeEdit* GetDataTimeEdit();
 
- protected:
-  friend class CFWL_DateTimeEditImpDelegate;
-  friend class IFWL_DateTimeCalendar;
-  friend class CFWL_DateTimeCalendarImpDelegate;
-  friend class CFWL_DateTimePickerImpDelegate;
+  FX_BOOL IsMonthCalendarShowed();
+  void ShowMonthCalendar(FX_BOOL bActivate);
+  void ProcessSelChanged(int32_t iYear, int32_t iMonth, int32_t iDay);
 
+  IFWL_FormProxy* GetFormProxy() const { return m_pForm.get(); }
+
+ protected:
   class CFWL_MonthCalendarImpDP : public IFWL_MonthCalendarDP {
    public:
     CFWL_MonthCalendarImpDP();
@@ -134,11 +138,8 @@
                         int32_t iMonth,
                         int32_t iDay,
                         CFX_WideString& wsText);
-  void ShowMonthCalendar(FX_BOOL bActivate);
-  FX_BOOL IsMonthCalendarShowed();
   void ReSetEditAlignment();
   void InitProxyForm();
-  void ProcessSelChanged(int32_t iYear, int32_t iMonth, int32_t iDay);
 
   CFX_RectF m_rtBtn;
   CFX_RectF m_rtClient;
@@ -166,28 +167,13 @@
   FWL_Error DisForm_GetBBox(CFX_RectF& rect);
   FWL_Error DisForm_DrawWidget(CFX_Graphics* pGraphics,
                                const CFX_Matrix* pMatrix = nullptr);
-};
 
-class CFWL_DateTimePickerImpDelegate : public CFWL_WidgetImpDelegate {
- public:
-  CFWL_DateTimePickerImpDelegate(IFWL_DateTimePicker* pOwner);
-
-  // CFWL_WidgetImpDelegate
-  void OnProcessMessage(CFWL_Message* pMessage) override;
-  void OnDrawWidget(CFX_Graphics* pGraphics,
-                    const CFX_Matrix* pMatrix = nullptr) override;
-
- protected:
-  void OnFocusChanged(CFWL_Message* pMsg, FX_BOOL bSet = TRUE);
+  void OnFocusChanged(CFWL_Message* pMsg, FX_BOOL bSet);
   void OnLButtonDown(CFWL_MsgMouse* pMsg);
   void OnLButtonUp(CFWL_MsgMouse* pMsg);
   void OnMouseMove(CFWL_MsgMouse* pMsg);
   void OnMouseLeave(CFWL_MsgMouse* pMsg);
-
-  IFWL_DateTimePicker* m_pOwner;
-
- private:
-  void DisForm_OnFocusChanged(CFWL_Message* pMsg, FX_BOOL bSet = TRUE);
+  void DisForm_OnFocusChanged(CFWL_Message* pMsg, FX_BOOL bSet);
 };
 
 #endif  // XFA_FWL_CORE_IFWL_DATETIMEPICKER_H_
diff --git a/xfa/fwl/core/ifwl_edit.cpp b/xfa/fwl/core/ifwl_edit.cpp
index 8edc69d..5222f37 100644
--- a/xfa/fwl/core/ifwl_edit.cpp
+++ b/xfa/fwl/core/ifwl_edit.cpp
@@ -76,7 +76,6 @@
   m_rtEngine.Reset();
   m_rtStatic.Reset();
 
-  SetDelegate(pdfium::MakeUnique<CFWL_EditImpDelegate>(this));
   InitCaret();
   if (!m_pEdtEngine)
     InitEngine();
@@ -1586,51 +1585,40 @@
   }
 }
 
-CFWL_EditImpDelegate::CFWL_EditImpDelegate(IFWL_Edit* pOwner)
-    : m_pOwner(pOwner) {}
-
-void CFWL_EditImpDelegate::OnProcessMessage(CFWL_Message* pMessage) {
+void IFWL_Edit::OnProcessMessage(CFWL_Message* pMessage) {
   if (!pMessage)
     return;
 
   CFWL_MessageType dwMsgCode = pMessage->GetClassID();
   switch (dwMsgCode) {
-    case CFWL_MessageType::Activate: {
+    case CFWL_MessageType::Activate:
       DoActivate(static_cast<CFWL_MsgActivate*>(pMessage));
       break;
-    }
-    case CFWL_MessageType::Deactivate: {
+    case CFWL_MessageType::Deactivate:
       DoDeactivate(static_cast<CFWL_MsgDeactivate*>(pMessage));
       break;
-    }
     case CFWL_MessageType::SetFocus:
-    case CFWL_MessageType::KillFocus: {
+    case CFWL_MessageType::KillFocus:
       OnFocusChanged(pMessage, dwMsgCode == CFWL_MessageType::SetFocus);
       break;
-    }
     case CFWL_MessageType::Mouse: {
       CFWL_MsgMouse* pMsg = static_cast<CFWL_MsgMouse*>(pMessage);
       switch (pMsg->m_dwCmd) {
-        case FWL_MouseCommand::LeftButtonDown: {
+        case FWL_MouseCommand::LeftButtonDown:
           OnLButtonDown(pMsg);
           break;
-        }
-        case FWL_MouseCommand::LeftButtonUp: {
+        case FWL_MouseCommand::LeftButtonUp:
           OnLButtonUp(pMsg);
           break;
-        }
-        case FWL_MouseCommand::LeftButtonDblClk: {
+        case FWL_MouseCommand::LeftButtonDblClk:
           OnButtonDblClk(pMsg);
           break;
-        }
-        case FWL_MouseCommand::Move: {
+        case FWL_MouseCommand::Move:
           OnMouseMove(pMsg);
           break;
-        }
-        case FWL_MouseCommand::RightButtonDown: {
+        case FWL_MouseCommand::RightButtonDown:
           DoButtonDown(pMsg);
           break;
-        }
         default:
           break;
       }
@@ -1644,175 +1632,179 @@
         OnChar(pKey);
       break;
     }
-    default: { break; }
+    default:
+      break;
   }
-  CFWL_WidgetImpDelegate::OnProcessMessage(pMessage);
+  IFWL_Widget::OnProcessMessage(pMessage);
 }
 
-void CFWL_EditImpDelegate::OnProcessEvent(CFWL_Event* pEvent) {
+void IFWL_Edit::OnProcessEvent(CFWL_Event* pEvent) {
   if (!pEvent)
     return;
   if (pEvent->GetClassID() != CFWL_EventType::Scroll)
     return;
 
   IFWL_Widget* pSrcTarget = pEvent->m_pSrcTarget;
-  if ((pSrcTarget == m_pOwner->m_pVertScrollBar.get() &&
-       m_pOwner->m_pVertScrollBar) ||
-      (pSrcTarget == m_pOwner->m_pHorzScrollBar.get() &&
-       m_pOwner->m_pHorzScrollBar)) {
+  if ((pSrcTarget == m_pVertScrollBar.get() && m_pVertScrollBar) ||
+      (pSrcTarget == m_pHorzScrollBar.get() && m_pHorzScrollBar)) {
     CFWL_EvtScroll* pScrollEvent = static_cast<CFWL_EvtScroll*>(pEvent);
     OnScroll(static_cast<IFWL_ScrollBar*>(pSrcTarget),
              pScrollEvent->m_iScrollCode, pScrollEvent->m_fPos);
   }
 }
 
-void CFWL_EditImpDelegate::OnDrawWidget(CFX_Graphics* pGraphics,
-                                        const CFX_Matrix* pMatrix) {
-  m_pOwner->DrawWidget(pGraphics, pMatrix);
+void IFWL_Edit::OnDrawWidget(CFX_Graphics* pGraphics,
+                             const CFX_Matrix* pMatrix) {
+  DrawWidget(pGraphics, pMatrix);
 }
 
-void CFWL_EditImpDelegate::DoActivate(CFWL_MsgActivate* pMsg) {
-  m_pOwner->m_pProperties->m_dwStates |= ~FWL_WGTSTATE_Deactivated;
-  m_pOwner->Repaint(&m_pOwner->m_rtClient);
+void IFWL_Edit::DoActivate(CFWL_MsgActivate* pMsg) {
+  m_pProperties->m_dwStates |= ~FWL_WGTSTATE_Deactivated;
+  Repaint(&m_rtClient);
 }
-void CFWL_EditImpDelegate::DoDeactivate(CFWL_MsgDeactivate* pMsg) {
-  m_pOwner->m_pProperties->m_dwStates &= FWL_WGTSTATE_Deactivated;
-  m_pOwner->Repaint(&m_pOwner->m_rtClient);
+
+void IFWL_Edit::DoDeactivate(CFWL_MsgDeactivate* pMsg) {
+  m_pProperties->m_dwStates &= FWL_WGTSTATE_Deactivated;
+  Repaint(&m_rtClient);
 }
-void CFWL_EditImpDelegate::DoButtonDown(CFWL_MsgMouse* pMsg) {
-  if ((m_pOwner->m_pProperties->m_dwStates & FWL_WGTSTATE_Focused) == 0) {
-    m_pOwner->SetFocus(TRUE);
-  }
-  if (!m_pOwner->m_pEdtEngine) {
-    m_pOwner->UpdateEditEngine();
-  }
-  IFDE_TxtEdtPage* pPage = m_pOwner->m_pEdtEngine->GetPage(0);
+
+void IFWL_Edit::DoButtonDown(CFWL_MsgMouse* pMsg) {
+  if ((m_pProperties->m_dwStates & FWL_WGTSTATE_Focused) == 0)
+    SetFocus(TRUE);
+  if (!m_pEdtEngine)
+    UpdateEditEngine();
+
+  IFDE_TxtEdtPage* pPage = m_pEdtEngine->GetPage(0);
   if (!pPage)
     return;
   CFX_PointF pt(pMsg->m_fx, pMsg->m_fy);
-  m_pOwner->DeviceToEngine(pt);
+  DeviceToEngine(pt);
   FX_BOOL bBefore = TRUE;
   int32_t nIndex = pPage->GetCharIndex(pt, bBefore);
-  if (nIndex < 0) {
+  if (nIndex < 0)
     nIndex = 0;
-  }
-  m_pOwner->m_pEdtEngine->SetCaretPos(nIndex, bBefore);
+
+  m_pEdtEngine->SetCaretPos(nIndex, bBefore);
 }
-void CFWL_EditImpDelegate::OnFocusChanged(CFWL_Message* pMsg, FX_BOOL bSet) {
-  uint32_t dwStyleEx = m_pOwner->GetStylesEx();
+
+void IFWL_Edit::OnFocusChanged(CFWL_Message* pMsg, FX_BOOL bSet) {
+  uint32_t dwStyleEx = GetStylesEx();
   bool bRepaint = !!(dwStyleEx & FWL_STYLEEXT_EDT_InnerCaret);
   if (bSet) {
-    m_pOwner->m_pProperties->m_dwStates |= FWL_WGTSTATE_Focused;
-    if (!m_pOwner->m_pEdtEngine) {
-      m_pOwner->UpdateEditEngine();
-    }
-    m_pOwner->UpdateVAlignment();
-    m_pOwner->UpdateOffset();
-    m_pOwner->UpdateCaret();
-  } else if (m_pOwner->m_pProperties->m_dwStates & FWL_WGTSTATE_Focused) {
-    m_pOwner->m_pProperties->m_dwStates &= ~FWL_WGTSTATE_Focused;
-    m_pOwner->ShowCaret(FALSE);
-    if (m_pOwner->m_pEdtEngine &&
-        (dwStyleEx & FWL_STYLEEXT_EDT_NoHideSel) == 0) {
-      int32_t nSel = m_pOwner->CountSelRanges();
+    m_pProperties->m_dwStates |= FWL_WGTSTATE_Focused;
+    if (!m_pEdtEngine)
+      UpdateEditEngine();
+
+    UpdateVAlignment();
+    UpdateOffset();
+    UpdateCaret();
+  } else if (m_pProperties->m_dwStates & FWL_WGTSTATE_Focused) {
+    m_pProperties->m_dwStates &= ~FWL_WGTSTATE_Focused;
+    ShowCaret(FALSE);
+    if (m_pEdtEngine && (dwStyleEx & FWL_STYLEEXT_EDT_NoHideSel) == 0) {
+      int32_t nSel = CountSelRanges();
       if (nSel > 0) {
-        m_pOwner->ClearSelections();
+        ClearSelections();
         bRepaint = TRUE;
       }
-      m_pOwner->SetCaretPos(0);
-      m_pOwner->UpdateOffset();
+      SetCaretPos(0);
+      UpdateOffset();
     }
-    m_pOwner->ClearRecord();
+    ClearRecord();
   }
-  m_pOwner->LayoutScrollBar();
+  LayoutScrollBar();
   if (bRepaint) {
     CFX_RectF rtInvalidate;
-    rtInvalidate.Set(0, 0, m_pOwner->m_pProperties->m_rtWidget.width,
-                     m_pOwner->m_pProperties->m_rtWidget.height);
-    m_pOwner->Repaint(&rtInvalidate);
+    rtInvalidate.Set(0, 0, m_pProperties->m_rtWidget.width,
+                     m_pProperties->m_rtWidget.height);
+    Repaint(&rtInvalidate);
   }
 }
-void CFWL_EditImpDelegate::OnLButtonDown(CFWL_MsgMouse* pMsg) {
-  DoCursor(pMsg);
-  if (m_pOwner->m_pProperties->m_dwStates & FWL_WGTSTATE_Disabled) {
+
+void IFWL_Edit::OnLButtonDown(CFWL_MsgMouse* pMsg) {
+  if (m_pProperties->m_dwStates & FWL_WGTSTATE_Disabled)
     return;
-  }
-  m_pOwner->m_bLButtonDown = TRUE;
-  m_pOwner->SetGrab(TRUE);
+
+  m_bLButtonDown = TRUE;
+  SetGrab(TRUE);
   DoButtonDown(pMsg);
-  int32_t nIndex = m_pOwner->m_pEdtEngine->GetCaretPos();
+  int32_t nIndex = m_pEdtEngine->GetCaretPos();
   FX_BOOL bRepaint = FALSE;
-  int32_t iCount = m_pOwner->m_pEdtEngine->CountSelRanges();
+  int32_t iCount = m_pEdtEngine->CountSelRanges();
   if (iCount > 0) {
-    m_pOwner->m_pEdtEngine->ClearSelection();
+    m_pEdtEngine->ClearSelection();
     bRepaint = TRUE;
   }
+
   bool bShift = !!(pMsg->m_dwFlags & FWL_KEYFLAG_Shift);
-  if (bShift && m_pOwner->m_nSelStart != nIndex) {
-    int32_t iStart = std::min(m_pOwner->m_nSelStart, nIndex);
-    int32_t iEnd = std::max(m_pOwner->m_nSelStart, nIndex);
-    m_pOwner->m_pEdtEngine->AddSelRange(iStart, iEnd - iStart);
+  if (bShift && m_nSelStart != nIndex) {
+    int32_t iStart = std::min(m_nSelStart, nIndex);
+    int32_t iEnd = std::max(m_nSelStart, nIndex);
+    m_pEdtEngine->AddSelRange(iStart, iEnd - iStart);
     bRepaint = TRUE;
   } else {
-    m_pOwner->m_nSelStart = nIndex;
+    m_nSelStart = nIndex;
   }
-  if (bRepaint) {
-    m_pOwner->Repaint(&m_pOwner->m_rtEngine);
-  }
+  if (bRepaint)
+    Repaint(&m_rtEngine);
 }
-void CFWL_EditImpDelegate::OnLButtonUp(CFWL_MsgMouse* pMsg) {
-  DoCursor(pMsg);
-  m_pOwner->m_bLButtonDown = FALSE;
-  m_pOwner->SetGrab(FALSE);
+
+void IFWL_Edit::OnLButtonUp(CFWL_MsgMouse* pMsg) {
+  m_bLButtonDown = FALSE;
+  SetGrab(FALSE);
 }
-void CFWL_EditImpDelegate::OnButtonDblClk(CFWL_MsgMouse* pMsg) {
-  if (!m_pOwner->m_pEdtEngine)
+
+void IFWL_Edit::OnButtonDblClk(CFWL_MsgMouse* pMsg) {
+  if (!m_pEdtEngine)
     return;
-  DoCursor(pMsg);
-  IFDE_TxtEdtPage* pPage = m_pOwner->m_pEdtEngine->GetPage(0);
+
+  IFDE_TxtEdtPage* pPage = m_pEdtEngine->GetPage(0);
   if (!pPage)
     return;
+
   CFX_PointF pt(pMsg->m_fx, pMsg->m_fy);
-  m_pOwner->DeviceToEngine(pt);
+  DeviceToEngine(pt);
   int32_t nCount = 0;
   int32_t nIndex = pPage->SelectWord(pt, nCount);
-  if (nIndex < 0) {
+  if (nIndex < 0)
     return;
-  }
-  m_pOwner->m_pEdtEngine->AddSelRange(nIndex, nCount);
-  m_pOwner->m_pEdtEngine->SetCaretPos(nIndex + nCount - 1, FALSE);
-  m_pOwner->Repaint(&m_pOwner->m_rtEngine);
+
+  m_pEdtEngine->AddSelRange(nIndex, nCount);
+  m_pEdtEngine->SetCaretPos(nIndex + nCount - 1, FALSE);
+  Repaint(&m_rtEngine);
 }
-void CFWL_EditImpDelegate::OnMouseMove(CFWL_MsgMouse* pMsg) {
-  if (!m_pOwner->m_pEdtEngine)
+
+void IFWL_Edit::OnMouseMove(CFWL_MsgMouse* pMsg) {
+  if (!m_pEdtEngine)
     return;
-  DoCursor(pMsg);
-  if (m_pOwner->m_nSelStart == -1 || !m_pOwner->m_bLButtonDown) {
+  if (m_nSelStart == -1 || !m_bLButtonDown)
     return;
-  }
-  IFDE_TxtEdtPage* pPage = m_pOwner->m_pEdtEngine->GetPage(0);
+
+  IFDE_TxtEdtPage* pPage = m_pEdtEngine->GetPage(0);
   if (!pPage)
     return;
+
   CFX_PointF pt(pMsg->m_fx, pMsg->m_fy);
-  m_pOwner->DeviceToEngine(pt);
+  DeviceToEngine(pt);
   FX_BOOL bBefore = TRUE;
   int32_t nIndex = pPage->GetCharIndex(pt, bBefore);
-  m_pOwner->m_pEdtEngine->SetCaretPos(nIndex, bBefore);
-  nIndex = m_pOwner->m_pEdtEngine->GetCaretPos();
-  m_pOwner->m_pEdtEngine->ClearSelection();
-  if (nIndex != m_pOwner->m_nSelStart) {
-    int32_t nLen = m_pOwner->m_pEdtEngine->GetTextLength();
-    if (m_pOwner->m_nSelStart >= nLen) {
-      m_pOwner->m_nSelStart = nLen;
-    }
-    m_pOwner->m_pEdtEngine->AddSelRange(
-        std::min(m_pOwner->m_nSelStart, nIndex),
-        FXSYS_abs(nIndex - m_pOwner->m_nSelStart));
+  m_pEdtEngine->SetCaretPos(nIndex, bBefore);
+  nIndex = m_pEdtEngine->GetCaretPos();
+  m_pEdtEngine->ClearSelection();
+  if (nIndex != m_nSelStart) {
+    int32_t nLen = m_pEdtEngine->GetTextLength();
+    if (m_nSelStart >= nLen)
+      m_nSelStart = nLen;
+
+    m_pEdtEngine->AddSelRange(std::min(m_nSelStart, nIndex),
+                              FXSYS_abs(nIndex - m_nSelStart));
   }
 }
-void CFWL_EditImpDelegate::OnKeyDown(CFWL_MsgKey* pMsg) {
-  if (!m_pOwner->m_pEdtEngine)
+
+void IFWL_Edit::OnKeyDown(CFWL_MsgKey* pMsg) {
+  if (!m_pEdtEngine)
     return;
+
   FDE_TXTEDTMOVECARET MoveCaret = MC_MoveNone;
   bool bShift = !!(pMsg->m_dwFlags & FWL_KEYFLAG_Shift);
   bool bCtrl = !!(pMsg->m_dwFlags & FWL_KEYFLAG_Ctrl);
@@ -1835,43 +1827,32 @@
       break;
     }
     case FWL_VKEY_Home: {
-      if (bCtrl) {
-        MoveCaret = MC_Home;
-      } else {
-        MoveCaret = MC_LineStart;
-      }
+      MoveCaret = bCtrl ? MC_Home : MC_LineStart;
       break;
     }
     case FWL_VKEY_End: {
-      if (bCtrl) {
-        MoveCaret = MC_End;
-      } else {
-        MoveCaret = MC_LineEnd;
-      }
+      MoveCaret = bCtrl ? MC_End : MC_LineEnd;
       break;
     }
-    case FWL_VKEY_Insert: {
+    case FWL_VKEY_Insert:
       break;
-    }
     case FWL_VKEY_Delete: {
-      if ((m_pOwner->m_pProperties->m_dwStyleExes &
-           FWL_STYLEEXT_EDT_ReadOnly) ||
-          (m_pOwner->m_pProperties->m_dwStates & FWL_WGTSTATE_Disabled)) {
+      if ((m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_ReadOnly) ||
+          (m_pProperties->m_dwStates & FWL_WGTSTATE_Disabled)) {
         break;
       }
-      int32_t nCaret = m_pOwner->m_pEdtEngine->GetCaretPos();
+      int32_t nCaret = m_pEdtEngine->GetCaretPos();
 #if (_FX_OS_ == _FX_MACOSX_)
-      m_pOwner->m_pEdtEngine->Delete(nCaret, TRUE);
+      m_pEdtEngine->Delete(nCaret, TRUE);
 #else
-      m_pOwner->m_pEdtEngine->Delete(nCaret);
+      m_pEdtEngine->Delete(nCaret);
 #endif
       break;
     }
-    case FWL_VKEY_F2: {
+    case FWL_VKEY_F2:
       break;
-    }
     case FWL_VKEY_Tab: {
-      m_pOwner->DispatchKeyEvent(pMsg);
+      DispatchKeyEvent(pMsg);
       break;
     }
     default: {
@@ -1881,67 +1862,63 @@
       if (pMsg->m_dwFlags & FWL_KEYFLAG_Ctrl) {
 #endif
         if (dwKeyCode == 0x43 || dwKeyCode == 0x63) {
-          m_pOwner->DoClipboard(1);
+          DoClipboard(1);
           return;
         }
         if (dwKeyCode == 0x58 || dwKeyCode == 0x78) {
-          m_pOwner->DoClipboard(2);
+          DoClipboard(2);
           return;
         }
         if (dwKeyCode == 0x56 || dwKeyCode == 0x76) {
-          m_pOwner->DoClipboard(3);
+          DoClipboard(3);
           return;
         }
       }
     }
   }
-  if (MoveCaret != MC_MoveNone) {
-    m_pOwner->m_pEdtEngine->MoveCaretPos(MoveCaret, bShift, bCtrl);
-  }
+  if (MoveCaret != MC_MoveNone)
+    m_pEdtEngine->MoveCaretPos(MoveCaret, bShift, bCtrl);
 }
-void CFWL_EditImpDelegate::OnChar(CFWL_MsgKey* pMsg) {
-  if ((m_pOwner->m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_ReadOnly) ||
-      (m_pOwner->m_pProperties->m_dwStates & FWL_WGTSTATE_Disabled)) {
+
+void IFWL_Edit::OnChar(CFWL_MsgKey* pMsg) {
+  if ((m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_ReadOnly) ||
+      (m_pProperties->m_dwStates & FWL_WGTSTATE_Disabled)) {
     return;
   }
-  if (!m_pOwner->m_pEdtEngine)
+  if (!m_pEdtEngine)
     return;
+
   int32_t iError = 0;
   FX_WCHAR c = (FX_WCHAR)pMsg->m_dwKeyCode;
-  int32_t nCaret = m_pOwner->m_pEdtEngine->GetCaretPos();
+  int32_t nCaret = m_pEdtEngine->GetCaretPos();
   switch (c) {
-    case FWL_VKEY_Back: {
-      m_pOwner->m_pEdtEngine->Delete(nCaret, TRUE);
+    case FWL_VKEY_Back:
+      m_pEdtEngine->Delete(nCaret, TRUE);
       break;
-    }
-    case 0x0A: {
+    case 0x0A:
       break;
-    }
-    case FWL_VKEY_Escape: {
+    case FWL_VKEY_Escape:
       break;
-    }
     case FWL_VKEY_Tab: {
-      iError = m_pOwner->m_pEdtEngine->Insert(nCaret, L"\t", 1);
+      iError = m_pEdtEngine->Insert(nCaret, L"\t", 1);
       break;
     }
     case FWL_VKEY_Return: {
-      if (m_pOwner->m_pProperties->m_dwStyleExes &
-          FWL_STYLEEXT_EDT_WantReturn) {
-        iError = m_pOwner->m_pEdtEngine->Insert(nCaret, L"\n", 1);
+      if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_WantReturn) {
+        iError = m_pEdtEngine->Insert(nCaret, L"\n", 1);
       }
       break;
     }
     default: {
-      if (!m_pOwner->m_pWidgetMgr->IsFormDisabled()) {
-        if (m_pOwner->m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_Number) {
+      if (!m_pWidgetMgr->IsFormDisabled()) {
+        if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_Number) {
           if (((pMsg->m_dwKeyCode < FWL_VKEY_0) &&
                (pMsg->m_dwKeyCode != 0x2E && pMsg->m_dwKeyCode != 0x2D)) ||
               pMsg->m_dwKeyCode > FWL_VKEY_9) {
             break;
           }
-          if (!m_pOwner->ValidateNumberChar(c)) {
+          if (!ValidateNumberChar(c))
             break;
-          }
         }
       }
 #if (_FX_OS_ == _FX_MACOSX_)
@@ -1952,17 +1929,17 @@
       {
         break;
       }
-      iError = m_pOwner->m_pEdtEngine->Insert(nCaret, &c, 1);
+      iError = m_pEdtEngine->Insert(nCaret, &c, 1);
       break;
     }
   }
-  if (iError < 0) {
-    m_pOwner->ProcessInsertError(iError);
-  }
+  if (iError < 0)
+    ProcessInsertError(iError);
 }
-FX_BOOL CFWL_EditImpDelegate::OnScroll(IFWL_ScrollBar* pScrollBar,
-                                       uint32_t dwCode,
-                                       FX_FLOAT fPos) {
+
+FX_BOOL IFWL_Edit::OnScroll(IFWL_ScrollBar* pScrollBar,
+                            uint32_t dwCode,
+                            FX_FLOAT fPos) {
   CFX_SizeF fs;
   pScrollBar->GetRange(fs.x, fs.y);
   FX_FLOAT iCurPos = pScrollBar->GetPos();
@@ -2005,27 +1982,25 @@
       break;
     }
     case FWL_SCBCODE_Pos:
-    case FWL_SCBCODE_TrackPos: {
+    case FWL_SCBCODE_TrackPos:
       break;
-    }
-    case FWL_SCBCODE_EndScroll: {
+    case FWL_SCBCODE_EndScroll:
       return FALSE;
-    }
-    default: {}
+    default:
+      break;
   }
   if (iCurPos != fPos) {
     pScrollBar->SetPos(fPos);
     pScrollBar->SetTrackPos(fPos);
-    m_pOwner->UpdateOffset(pScrollBar, fPos - iCurPos);
-    if (m_pOwner->m_pEdtEngine) {
-      m_pOwner->UpdateCaret();
+    UpdateOffset(pScrollBar, fPos - iCurPos);
+    if (m_pEdtEngine) {
+      UpdateCaret();
     }
     CFX_RectF rect;
-    m_pOwner->GetWidgetRect(rect);
+    GetWidgetRect(rect);
     CFX_RectF rtInvalidate;
     rtInvalidate.Set(0, 0, rect.width + 2, rect.height + 2);
-    m_pOwner->Repaint(&rtInvalidate);
+    Repaint(&rtInvalidate);
   }
   return TRUE;
 }
-void CFWL_EditImpDelegate::DoCursor(CFWL_MsgMouse* pMsg) {}
diff --git a/xfa/fwl/core/ifwl_edit.h b/xfa/fwl/core/ifwl_edit.h
index 4c44913..9959e42 100644
--- a/xfa/fwl/core/ifwl_edit.h
+++ b/xfa/fwl/core/ifwl_edit.h
@@ -94,11 +94,9 @@
 class CFWL_WidgetImpProperties;
 class IFDE_TxtEdtDoRecord;
 class IFWL_Edit;
-class CFWL_EditImpDelegate;
 class CFWL_MsgActivate;
 class CFWL_MsgDeactivate;
 class CFWL_MsgMouse;
-class CFWL_WidgetImpDelegate;
 class CFWL_WidgetImpProperties;
 class IFWL_Caret;
 
@@ -121,6 +119,10 @@
   FWL_Error DrawWidget(CFX_Graphics* pGraphics,
                        const CFX_Matrix* pMatrix = nullptr) override;
   FWL_Error SetThemeProvider(IFWL_ThemeProvider* pThemeProvider) override;
+  void OnProcessMessage(CFWL_Message* pMessage) override;
+  void OnProcessEvent(CFWL_Event* pEvent) override;
+  void OnDrawWidget(CFX_Graphics* pGraphics,
+                    const CFX_Matrix* pMatrix) override;
 
   virtual FWL_Error SetText(const CFX_WideString& wsText);
   virtual int32_t GetTextLength() const;
@@ -184,7 +186,6 @@
 
  protected:
   friend class CFWL_TxtEdtEventSink;
-  friend class CFWL_EditImpDelegate;
 
   void DrawTextBk(CFX_Graphics* pGraphics,
                   IFWL_ThemeProvider* pTheme,
@@ -250,21 +251,12 @@
   std::deque<std::unique_ptr<IFDE_TxtEdtDoRecord>> m_DoRecords;
   int32_t m_iCurRecord;
   int32_t m_iMaxRecord;
-};
 
-class CFWL_EditImpDelegate : public CFWL_WidgetImpDelegate {
- public:
-  CFWL_EditImpDelegate(IFWL_Edit* pOwner);
-  void OnProcessMessage(CFWL_Message* pMessage) override;
-  void OnProcessEvent(CFWL_Event* pEvent) override;
-  void OnDrawWidget(CFX_Graphics* pGraphics,
-                    const CFX_Matrix* pMatrix = nullptr) override;
-
- protected:
+ private:
   void DoActivate(CFWL_MsgActivate* pMsg);
   void DoDeactivate(CFWL_MsgDeactivate* pMsg);
   void DoButtonDown(CFWL_MsgMouse* pMsg);
-  void OnFocusChanged(CFWL_Message* pMsg, FX_BOOL bSet = TRUE);
+  void OnFocusChanged(CFWL_Message* pMsg, FX_BOOL bSet);
   void OnLButtonDown(CFWL_MsgMouse* pMsg);
   void OnLButtonUp(CFWL_MsgMouse* pMsg);
   void OnButtonDblClk(CFWL_MsgMouse* pMsg);
@@ -272,8 +264,6 @@
   void OnKeyDown(CFWL_MsgKey* pMsg);
   void OnChar(CFWL_MsgKey* pMsg);
   FX_BOOL OnScroll(IFWL_ScrollBar* pScrollBar, uint32_t dwCode, FX_FLOAT fPos);
-  void DoCursor(CFWL_MsgMouse* pMsg);
-  IFWL_Edit* m_pOwner;
 };
 
 #endif  // XFA_FWL_CORE_IFWL_EDIT_H_
diff --git a/xfa/fwl/core/ifwl_form.cpp b/xfa/fwl/core/ifwl_form.cpp
index 125f7c4..6021354 100644
--- a/xfa/fwl/core/ifwl_form.cpp
+++ b/xfa/fwl/core/ifwl_form.cpp
@@ -68,7 +68,6 @@
 
   RegisterForm();
   RegisterEventTarget();
-  SetDelegate(pdfium::MakeUnique<CFWL_FormImpDelegate>(this));
 }
 
 IFWL_Form::~IFWL_Form() {
@@ -770,23 +769,20 @@
   }
 }
 
-CFWL_FormImpDelegate::CFWL_FormImpDelegate(IFWL_Form* pOwner)
-    : m_pOwner(pOwner) {}
-
 #ifdef FWL_UseMacSystemBorder
-void CFWL_FormImpDelegate::OnProcessMessage(CFWL_Message* pMessage) {
+void IFWL_Form::OnProcessMessage(CFWL_Message* pMessage) {
   if (!pMessage)
     return;
 
   switch (pMessage->GetClassID()) {
     case CFWL_MessageType::Activate: {
-      m_pOwner->m_pProperties->m_dwStates &= ~FWL_WGTSTATE_Deactivated;
-      m_pOwner->Repaint(&m_pOwner->m_rtRelative);
+      m_pProperties->m_dwStates &= ~FWL_WGTSTATE_Deactivated;
+      Repaint(&m_rtRelative);
       break;
     }
     case CFWL_MessageType::Deactivate: {
-      m_pOwner->m_pProperties->m_dwStates |= FWL_WGTSTATE_Deactivated;
-      m_pOwner->Repaint(&m_pOwner->m_rtRelative);
+      m_pProperties->m_dwStates |= FWL_WGTSTATE_Deactivated;
+      Repaint(&m_rtRelative);
       break;
     }
     default:
@@ -794,211 +790,191 @@
   }
 }
 #else
-void CFWL_FormImpDelegate::OnProcessMessage(CFWL_Message* pMessage) {
+void IFWL_Form::OnProcessMessage(CFWL_Message* pMessage) {
   if (!pMessage)
     return;
 
   switch (pMessage->GetClassID()) {
     case CFWL_MessageType::Activate: {
-      m_pOwner->m_pProperties->m_dwStates &= ~FWL_WGTSTATE_Deactivated;
-      const IFWL_App* pApp = m_pOwner->GetOwnerApp();
+      m_pProperties->m_dwStates &= ~FWL_WGTSTATE_Deactivated;
+      const IFWL_App* pApp = GetOwnerApp();
       CFWL_NoteDriver* pDriver =
           static_cast<CFWL_NoteDriver*>(pApp->GetNoteDriver());
-      IFWL_Widget* pSubFocus = m_pOwner->GetSubFocus();
+      IFWL_Widget* pSubFocus = GetSubFocus();
       if (pSubFocus && pSubFocus != pDriver->GetFocus())
         pDriver->SetFocus(pSubFocus);
 
-      m_pOwner->Repaint(&m_pOwner->m_rtRelative);
+      Repaint(&m_rtRelative);
       break;
     }
     case CFWL_MessageType::Deactivate: {
-      m_pOwner->m_pProperties->m_dwStates |= FWL_WGTSTATE_Deactivated;
-      const IFWL_App* pApp = m_pOwner->GetOwnerApp();
+      m_pProperties->m_dwStates |= FWL_WGTSTATE_Deactivated;
+      const IFWL_App* pApp = GetOwnerApp();
       CFWL_NoteDriver* pDriver =
           static_cast<CFWL_NoteDriver*>(pApp->GetNoteDriver());
-      IFWL_Widget* pSubFocus = m_pOwner->GetSubFocus();
+      IFWL_Widget* pSubFocus = GetSubFocus();
       if (pSubFocus) {
         if (pSubFocus == pDriver->GetFocus()) {
           pDriver->SetFocus(nullptr);
         } else if (pSubFocus->GetStates() & FWL_WGTSTATE_Focused) {
-          if (IFWL_WidgetDelegate* pDelegate =
-                  pSubFocus->GetCurrentDelegate()) {
+          if (IFWL_WidgetDelegate* pDelegate = pSubFocus->GetDelegate()) {
             CFWL_MsgKillFocus ms;
             pDelegate->OnProcessMessage(&ms);
           }
         }
       }
-      m_pOwner->Repaint(&m_pOwner->m_rtRelative);
+      Repaint(&m_rtRelative);
       break;
     }
     case CFWL_MessageType::Mouse: {
       CFWL_MsgMouse* pMsg = static_cast<CFWL_MsgMouse*>(pMessage);
       switch (pMsg->m_dwCmd) {
-        case FWL_MouseCommand::LeftButtonDown: {
+        case FWL_MouseCommand::LeftButtonDown:
           OnLButtonDown(pMsg);
           break;
-        }
-        case FWL_MouseCommand::LeftButtonUp: {
+        case FWL_MouseCommand::LeftButtonUp:
           OnLButtonUp(pMsg);
           break;
-        }
-        case FWL_MouseCommand::Move: {
+        case FWL_MouseCommand::Move:
           OnMouseMove(pMsg);
           break;
-        }
-        case FWL_MouseCommand::Hover: {
+        case FWL_MouseCommand::Hover:
           OnMouseHover(pMsg);
           break;
-        }
-        case FWL_MouseCommand::Leave: {
+        case FWL_MouseCommand::Leave:
           OnMouseLeave(pMsg);
           break;
-        }
-        case FWL_MouseCommand::LeftButtonDblClk: {
+        case FWL_MouseCommand::LeftButtonDblClk:
           OnLButtonDblClk(pMsg);
           break;
-        }
         default:
           break;
       }
       break;
     }
     case CFWL_MessageType::Size: {
-      CFWL_WidgetMgr* pWidgetMgr = m_pOwner->GetOwnerApp()->GetWidgetMgr();
+      CFWL_WidgetMgr* pWidgetMgr = GetOwnerApp()->GetWidgetMgr();
       if (!pWidgetMgr)
         return;
 
-      pWidgetMgr->AddRedrawCounts(m_pOwner);
-      if (!m_pOwner->m_bSetMaximize)
+      pWidgetMgr->AddRedrawCounts(this);
+      if (!m_bSetMaximize)
         break;
 
-      m_pOwner->m_bSetMaximize = FALSE;
+      m_bSetMaximize = FALSE;
       CFWL_MsgSize* pMsg = static_cast<CFWL_MsgSize*>(pMessage);
-      m_pOwner->m_pProperties->m_rtWidget.left = 0;
-      m_pOwner->m_pProperties->m_rtWidget.top = 0;
-      m_pOwner->m_pProperties->m_rtWidget.width = (FX_FLOAT)pMsg->m_iWidth;
-      m_pOwner->m_pProperties->m_rtWidget.height = (FX_FLOAT)pMsg->m_iHeight;
-      m_pOwner->Update();
+      m_pProperties->m_rtWidget.left = 0;
+      m_pProperties->m_rtWidget.top = 0;
+      m_pProperties->m_rtWidget.width = (FX_FLOAT)pMsg->m_iWidth;
+      m_pProperties->m_rtWidget.height = (FX_FLOAT)pMsg->m_iHeight;
+      Update();
       break;
     }
-    case CFWL_MessageType::WindowMove: {
+    case CFWL_MessageType::WindowMove:
       OnWindowMove(static_cast<CFWL_MsgWindowMove*>(pMessage));
       break;
-    }
-    case CFWL_MessageType::Close: {
+    case CFWL_MessageType::Close:
       OnClose(static_cast<CFWL_MsgClose*>(pMessage));
       break;
-    }
-    default: { break; }
+    default:
+      break;
   }
 }
 #endif  // FWL_UseMacSystemBorder
 
-void CFWL_FormImpDelegate::OnProcessEvent(CFWL_Event* pEvent) {}
-
-void CFWL_FormImpDelegate::OnDrawWidget(CFX_Graphics* pGraphics,
-                                        const CFX_Matrix* pMatrix) {
-  m_pOwner->DrawWidget(pGraphics, pMatrix);
+void IFWL_Form::OnDrawWidget(CFX_Graphics* pGraphics,
+                             const CFX_Matrix* pMatrix) {
+  DrawWidget(pGraphics, pMatrix);
 }
 
-void CFWL_FormImpDelegate::OnLButtonDown(CFWL_MsgMouse* pMsg) {
-  m_pOwner->SetGrab(TRUE);
-  m_pOwner->m_bLButtonDown = TRUE;
-  m_pOwner->m_eResizeType = FORM_RESIZETYPE_None;
-  CFWL_SysBtn* pPressBtn = m_pOwner->GetSysBtnAtPoint(pMsg->m_fx, pMsg->m_fy);
-  m_pOwner->m_iCaptureBtn = m_pOwner->GetSysBtnIndex(pPressBtn);
+void IFWL_Form::OnLButtonDown(CFWL_MsgMouse* pMsg) {
+  SetGrab(TRUE);
+  m_bLButtonDown = TRUE;
+  m_eResizeType = FORM_RESIZETYPE_None;
+  CFWL_SysBtn* pPressBtn = GetSysBtnAtPoint(pMsg->m_fx, pMsg->m_fy);
+  m_iCaptureBtn = GetSysBtnIndex(pPressBtn);
   CFX_RectF rtCap;
-  rtCap.Set(m_pOwner->m_rtCaption.left + m_pOwner->m_fCYBorder,
-            m_pOwner->m_rtCaption.top + m_pOwner->m_fCXBorder,
-            m_pOwner->m_rtCaption.width -
-                kSystemButtonSize * m_pOwner->m_iSysBox -
-                2 * m_pOwner->m_fCYBorder,
-            m_pOwner->m_rtCaption.height - m_pOwner->m_fCXBorder);
+  rtCap.Set(m_rtCaption.left + m_fCYBorder, m_rtCaption.top + m_fCXBorder,
+            m_rtCaption.width - kSystemButtonSize * m_iSysBox - 2 * m_fCYBorder,
+            m_rtCaption.height - m_fCXBorder);
+
   if (pPressBtn) {
     pPressBtn->SetPressed();
-    m_pOwner->Repaint(&pPressBtn->m_rtBtn);
+    Repaint(&pPressBtn->m_rtBtn);
   } else if (rtCap.Contains(pMsg->m_fx, pMsg->m_fy)) {
-    m_pOwner->m_eResizeType = FORM_RESIZETYPE_Cap;
-  } else if ((m_pOwner->m_pProperties->m_dwStyles & FWL_WGTSTYLE_Border) &&
-             (m_pOwner->m_pProperties->m_dwStyleExes &
-              FWL_STYLEEXT_FRM_Resize) &&
-             !m_pOwner->m_bMaximized) {
-    m_pOwner->SetCursor(pMsg->m_fx, pMsg->m_fy);
+    m_eResizeType = FORM_RESIZETYPE_Cap;
+  } else if ((m_pProperties->m_dwStyles & FWL_WGTSTYLE_Border) &&
+             (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_FRM_Resize) &&
+             !m_bMaximized) {
+    SetCursor(pMsg->m_fx, pMsg->m_fy);
   }
-  m_pOwner->m_InfoStart.m_ptStart = CFX_PointF(pMsg->m_fx, pMsg->m_fy);
-  m_pOwner->m_InfoStart.m_szStart =
-      CFX_SizeF(m_pOwner->m_pProperties->m_rtWidget.width,
-                m_pOwner->m_pProperties->m_rtWidget.height);
+  m_InfoStart.m_ptStart = CFX_PointF(pMsg->m_fx, pMsg->m_fy);
+  m_InfoStart.m_szStart = CFX_SizeF(m_pProperties->m_rtWidget.width,
+                                    m_pProperties->m_rtWidget.height);
 }
-void CFWL_FormImpDelegate::OnLButtonUp(CFWL_MsgMouse* pMsg) {
-  m_pOwner->SetGrab(FALSE);
-  m_pOwner->m_bLButtonDown = FALSE;
-  CFWL_SysBtn* pPointBtn = m_pOwner->GetSysBtnAtPoint(pMsg->m_fx, pMsg->m_fy);
-  CFWL_SysBtn* pPressedBtn =
-      m_pOwner->GetSysBtnByIndex(m_pOwner->m_iCaptureBtn);
-  if (!pPressedBtn || pPointBtn != pPressedBtn) {
+
+void IFWL_Form::OnLButtonUp(CFWL_MsgMouse* pMsg) {
+  SetGrab(FALSE);
+  m_bLButtonDown = FALSE;
+  CFWL_SysBtn* pPointBtn = GetSysBtnAtPoint(pMsg->m_fx, pMsg->m_fy);
+  CFWL_SysBtn* pPressedBtn = GetSysBtnByIndex(m_iCaptureBtn);
+  if (!pPressedBtn || pPointBtn != pPressedBtn)
     return;
-  }
-  if (pPressedBtn == m_pOwner->GetSysBtnByState(FWL_SYSBUTTONSTATE_Pressed)) {
+  if (pPressedBtn == GetSysBtnByState(FWL_SYSBUTTONSTATE_Pressed))
     pPressedBtn->SetNormal();
-  }
-  if (pPressedBtn == m_pOwner->m_pMaxBox) {
-    if (m_pOwner->m_bMaximized) {
-      m_pOwner->SetWidgetRect(m_pOwner->m_rtRestore);
-      m_pOwner->Update();
-      m_pOwner->Repaint();
+  if (pPressedBtn == m_pMaxBox) {
+    if (m_bMaximized) {
+      SetWidgetRect(m_rtRestore);
+      Update();
+      Repaint();
     } else {
-      m_pOwner->SetWorkAreaRect();
-      m_pOwner->Update();
+      SetWorkAreaRect();
+      Update();
     }
-    m_pOwner->m_bMaximized = !m_pOwner->m_bMaximized;
-  } else if (pPressedBtn != m_pOwner->m_pMinBox) {
+    m_bMaximized = !m_bMaximized;
+  } else if (pPressedBtn != m_pMinBox) {
     CFWL_EvtClose eClose;
-    eClose.m_pSrcTarget = m_pOwner;
-    m_pOwner->DispatchEvent(&eClose);
+    eClose.m_pSrcTarget = this;
+    DispatchEvent(&eClose);
   }
 }
-void CFWL_FormImpDelegate::OnMouseMove(CFWL_MsgMouse* pMsg) {
-  if (m_pOwner->m_bLButtonDown) {
+
+void IFWL_Form::OnMouseMove(CFWL_MsgMouse* pMsg) {
+  if (m_bLButtonDown)
     return;
-  }
-  if ((m_pOwner->m_pProperties->m_dwStyles & FWL_WGTSTYLE_Border) &&
-      (m_pOwner->m_pProperties->m_dwStyleExes & FWL_STYLEEXT_FRM_Resize) &&
-      !m_pOwner->m_bMaximized) {
-    m_pOwner->SetCursor(pMsg->m_fx, pMsg->m_fy);
+
+  if ((m_pProperties->m_dwStyles & FWL_WGTSTYLE_Border) &&
+      (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_FRM_Resize) &&
+      !m_bMaximized) {
+    SetCursor(pMsg->m_fx, pMsg->m_fy);
   }
   CFX_RectF rtInvalidate;
   rtInvalidate.Reset();
-  CFWL_SysBtn* pPointBtn = m_pOwner->GetSysBtnAtPoint(pMsg->m_fx, pMsg->m_fy);
-  CFWL_SysBtn* pOldHover = m_pOwner->GetSysBtnByState(FWL_SYSBUTTONSTATE_Hover);
+  CFWL_SysBtn* pPointBtn = GetSysBtnAtPoint(pMsg->m_fx, pMsg->m_fy);
+  CFWL_SysBtn* pOldHover = GetSysBtnByState(FWL_SYSBUTTONSTATE_Hover);
 #if (_FX_OS_ == _FX_MACOSX_)
   {
-    if (pOldHover && pPointBtn != pOldHover) {
+    if (pOldHover && pPointBtn != pOldHover)
       pOldHover->SetNormal();
-    }
-    if (pPointBtn && pPointBtn != pOldHover) {
+    if (pPointBtn && pPointBtn != pOldHover)
       pPointBtn->SetHover();
+    if (m_pCloseBox)
+      rtInvalidate = m_pCloseBox->m_rtBtn;
+    if (m_pMaxBox) {
+      if (rtInvalidate.IsEmpty())
+        rtInvalidate = m_pMaxBox->m_rtBtn;
+      else
+        rtInvalidate.Union(m_pMaxBox->m_rtBtn);
     }
-    if (m_pOwner->m_pCloseBox) {
-      rtInvalidate = m_pOwner->m_pCloseBox->m_rtBtn;
-    }
-    if (m_pOwner->m_pMaxBox) {
-      if (rtInvalidate.IsEmpty()) {
-        rtInvalidate = m_pOwner->m_pMaxBox->m_rtBtn;
-      } else {
-        rtInvalidate.Union(m_pOwner->m_pMaxBox->m_rtBtn);
-      }
-    }
-    if (m_pOwner->m_pMinBox) {
-      if (rtInvalidate.IsEmpty()) {
-        rtInvalidate = m_pOwner->m_pMinBox->m_rtBtn;
-      } else {
-        rtInvalidate.Union(m_pOwner->m_pMinBox->m_rtBtn);
-      }
+    if (m_pMinBox) {
+      if (rtInvalidate.IsEmpty())
+        rtInvalidate = m_pMinBox->m_rtBtn;
+      else
+        rtInvalidate.Union(m_pMinBox->m_rtBtn);
     }
     if (!rtInvalidate.IsEmpty() &&
         rtInvalidate.Contains(pMsg->m_fx, pMsg->m_fy)) {
-      m_pOwner->m_bMouseIn = TRUE;
+      m_bMouseIn = TRUE;
     }
   }
 #else
@@ -1009,51 +985,53 @@
     }
     if (pPointBtn && pPointBtn != pOldHover) {
       pPointBtn->SetHover();
-      if (rtInvalidate.IsEmpty()) {
+      if (rtInvalidate.IsEmpty())
         rtInvalidate = pPointBtn->m_rtBtn;
-      } else {
+      else
         rtInvalidate.Union(pPointBtn->m_rtBtn);
-      }
     }
   }
 #endif
-  if (!rtInvalidate.IsEmpty()) {
-    m_pOwner->Repaint(&rtInvalidate);
-  }
+  if (!rtInvalidate.IsEmpty())
+    Repaint(&rtInvalidate);
 }
-void CFWL_FormImpDelegate::OnMouseHover(CFWL_MsgMouse* pMsg) {
-  m_pOwner->SetCursor(pMsg->m_fx, pMsg->m_fy);
+
+void IFWL_Form::OnMouseHover(CFWL_MsgMouse* pMsg) {
+  SetCursor(pMsg->m_fx, pMsg->m_fy);
 }
-void CFWL_FormImpDelegate::OnMouseLeave(CFWL_MsgMouse* pMsg) {
-  CFWL_SysBtn* pHover = m_pOwner->GetSysBtnByState(FWL_SYSBUTTONSTATE_Hover);
+
+void IFWL_Form::OnMouseLeave(CFWL_MsgMouse* pMsg) {
+  CFWL_SysBtn* pHover = GetSysBtnByState(FWL_SYSBUTTONSTATE_Hover);
   if (pHover) {
     pHover->SetNormal();
-    m_pOwner->Repaint(&pHover->m_rtBtn);
+    Repaint(&pHover->m_rtBtn);
   }
-  if (pMsg->m_dwCmd == FWL_MouseCommand::Leave && !m_pOwner->m_bLButtonDown) {
-    m_pOwner->SetCursor(pMsg->m_fx, pMsg->m_fy);
+  if (pMsg->m_dwCmd == FWL_MouseCommand::Leave && !m_bLButtonDown)
+    SetCursor(pMsg->m_fx, pMsg->m_fy);
+}
+
+void IFWL_Form::OnLButtonDblClk(CFWL_MsgMouse* pMsg) {
+  if ((m_pProperties->m_dwStyleExes & FWL_STYLEEXT_FRM_Resize) &&
+      HitTest(pMsg->m_fx, pMsg->m_fy) == FWL_WidgetHit::Titlebar) {
+    if (m_bMaximized)
+      SetWidgetRect(m_rtRestore);
+    else
+      SetWorkAreaRect();
+
+    Update();
+    m_bMaximized = !m_bMaximized;
   }
 }
-void CFWL_FormImpDelegate::OnLButtonDblClk(CFWL_MsgMouse* pMsg) {
-  if ((m_pOwner->m_pProperties->m_dwStyleExes & FWL_STYLEEXT_FRM_Resize) &&
-      m_pOwner->HitTest(pMsg->m_fx, pMsg->m_fy) == FWL_WidgetHit::Titlebar) {
-    if (m_pOwner->m_bMaximized) {
-      m_pOwner->SetWidgetRect(m_pOwner->m_rtRestore);
-    } else {
-      m_pOwner->SetWorkAreaRect();
-    }
-    m_pOwner->Update();
-    m_pOwner->m_bMaximized = !m_pOwner->m_bMaximized;
-  }
+
+void IFWL_Form::OnWindowMove(CFWL_MsgWindowMove* pMsg) {
+  m_pProperties->m_rtWidget.left = pMsg->m_fx;
+  m_pProperties->m_rtWidget.top = pMsg->m_fy;
 }
-void CFWL_FormImpDelegate::OnWindowMove(CFWL_MsgWindowMove* pMsg) {
-  m_pOwner->m_pProperties->m_rtWidget.left = pMsg->m_fx;
-  m_pOwner->m_pProperties->m_rtWidget.top = pMsg->m_fy;
-}
-void CFWL_FormImpDelegate::OnClose(CFWL_MsgClose* pMsg) {
+
+void IFWL_Form::OnClose(CFWL_MsgClose* pMsg) {
   CFWL_EvtClose eClose;
-  eClose.m_pSrcTarget = m_pOwner;
-  m_pOwner->DispatchEvent(&eClose);
+  eClose.m_pSrcTarget = this;
+  DispatchEvent(&eClose);
 }
 
 CFWL_SysBtn::CFWL_SysBtn() {
diff --git a/xfa/fwl/core/ifwl_form.h b/xfa/fwl/core/ifwl_form.h
index c6158c6..76634ab 100644
--- a/xfa/fwl/core/ifwl_form.h
+++ b/xfa/fwl/core/ifwl_form.h
@@ -76,7 +76,6 @@
 class IFWL_Widget;
 class IFWL_ThemeProvider;
 class CFWL_SysBtn;
-class CFWL_FormImpDelegate;
 
 class IFWL_FormDP : public IFWL_DataProvider {
  public:
@@ -99,6 +98,9 @@
   FWL_WidgetHit HitTest(FX_FLOAT fx, FX_FLOAT fy) override;
   FWL_Error DrawWidget(CFX_Graphics* pGraphics,
                        const CFX_Matrix* pMatrix = nullptr) override;
+  void OnProcessMessage(CFWL_Message* pMessage) override;
+  void OnDrawWidget(CFX_Graphics* pGraphics,
+                    const CFX_Matrix* pMatrix) override;
 
   FWL_FORMSIZE GetFormSize();
   FWL_Error SetFormSize(FWL_FORMSIZE eFormSize);
@@ -182,17 +184,8 @@
   CFX_DIBitmap* m_pBigIcon;
   CFX_DIBitmap* m_pSmallIcon;
   FX_BOOL m_bMouseIn;
-};
 
-class CFWL_FormImpDelegate : public CFWL_WidgetImpDelegate {
- public:
-  CFWL_FormImpDelegate(IFWL_Form* pOwner);
-  void OnProcessMessage(CFWL_Message* pMessage) override;
-  void OnProcessEvent(CFWL_Event* pEvent) override;
-  void OnDrawWidget(CFX_Graphics* pGraphics,
-                    const CFX_Matrix* pMatrix = nullptr) override;
-
- protected:
+ private:
   void OnLButtonDown(CFWL_MsgMouse* pMsg);
   void OnLButtonUp(CFWL_MsgMouse* pMsg);
   void OnMouseMove(CFWL_MsgMouse* pMsg);
@@ -201,7 +194,6 @@
   void OnLButtonDblClk(CFWL_MsgMouse* pMsg);
   void OnWindowMove(CFWL_MsgWindowMove* pMsg);
   void OnClose(CFWL_MsgClose* pMsg);
-  IFWL_Form* m_pOwner;
 };
 
 #endif  // XFA_FWL_CORE_IFWL_FORM_H_
diff --git a/xfa/fwl/core/ifwl_formproxy.cpp b/xfa/fwl/core/ifwl_formproxy.cpp
index dee8973..30c2582 100644
--- a/xfa/fwl/core/ifwl_formproxy.cpp
+++ b/xfa/fwl/core/ifwl_formproxy.cpp
@@ -13,7 +13,6 @@
                                const CFWL_WidgetImpProperties& properties,
                                IFWL_Widget* pOuter)
     : IFWL_Form(app, properties, pOuter) {
-  SetDelegate(pdfium::MakeUnique<CFWL_FormProxyImpDelegate>(this));
 }
 
 IFWL_FormProxy::~IFWL_FormProxy() {}
@@ -38,9 +37,6 @@
   return FWL_Error::Succeeded;
 }
 
-CFWL_FormProxyImpDelegate::CFWL_FormProxyImpDelegate(IFWL_FormProxy* pOwner)
-    : m_pOwner(pOwner) {}
-
-void CFWL_FormProxyImpDelegate::OnProcessMessage(CFWL_Message* pMessage) {
-  m_pOwner->m_pOuter->GetCurrentDelegate()->OnProcessMessage(pMessage);
+void IFWL_FormProxy::OnProcessMessage(CFWL_Message* pMessage) {
+  m_pOuter->GetDelegate()->OnProcessMessage(pMessage);
 }
diff --git a/xfa/fwl/core/ifwl_formproxy.h b/xfa/fwl/core/ifwl_formproxy.h
index c323bdc..d28208b 100644
--- a/xfa/fwl/core/ifwl_formproxy.h
+++ b/xfa/fwl/core/ifwl_formproxy.h
@@ -10,7 +10,6 @@
 #include "xfa/fwl/core/ifwl_form.h"
 
 class CFWL_WidgetImpProperties;
-class CFWL_FormProxyImpDelegate;
 
 class IFWL_FormProxy : public IFWL_Form {
  public:
@@ -25,18 +24,10 @@
   FWL_Error Update() override;
   FWL_Error DrawWidget(CFX_Graphics* pGraphics,
                        const CFX_Matrix* pMatrix = nullptr) override;
-
- protected:
-  friend class CFWL_FormProxyImpDelegate;
-};
-
-class CFWL_FormProxyImpDelegate : public CFWL_WidgetImpDelegate {
- public:
-  CFWL_FormProxyImpDelegate(IFWL_FormProxy* pOwner);
   void OnProcessMessage(CFWL_Message* pMessage) override;
 
  protected:
-  IFWL_FormProxy* m_pOwner;
+  friend class CFWL_FormProxyImpDelegate;
 };
 
 #endif  // XFA_FWL_CORE_IFWL_FORMPROXY_H_
diff --git a/xfa/fwl/core/ifwl_listbox.cpp b/xfa/fwl/core/ifwl_listbox.cpp
index b4b6c25..5d95c74 100644
--- a/xfa/fwl/core/ifwl_listbox.cpp
+++ b/xfa/fwl/core/ifwl_listbox.cpp
@@ -34,8 +34,6 @@
   m_rtClient.Reset();
   m_rtConent.Reset();
   m_rtStatic.Reset();
-
-  SetDelegate(pdfium::MakeUnique<CFWL_ListBoxImpDelegate>(this));
 }
 
 IFWL_ListBox::~IFWL_ListBox() {}
@@ -913,159 +911,142 @@
   DispatchEvent(&selEvent);
 }
 
-CFWL_ListBoxImpDelegate::CFWL_ListBoxImpDelegate(IFWL_ListBox* pOwner)
-    : m_pOwner(pOwner) {}
-
-void CFWL_ListBoxImpDelegate::OnProcessMessage(CFWL_Message* pMessage) {
+void IFWL_ListBox::OnProcessMessage(CFWL_Message* pMessage) {
   if (!pMessage)
     return;
-  if (!m_pOwner->IsEnabled())
+  if (!IsEnabled())
     return;
 
   CFWL_MessageType dwMsgCode = pMessage->GetClassID();
   switch (dwMsgCode) {
-    case CFWL_MessageType::SetFocus: {
+    case CFWL_MessageType::SetFocus:
       OnFocusChanged(pMessage, TRUE);
       break;
-    }
-    case CFWL_MessageType::KillFocus: {
+    case CFWL_MessageType::KillFocus:
       OnFocusChanged(pMessage, FALSE);
       break;
-    }
     case CFWL_MessageType::Mouse: {
       CFWL_MsgMouse* pMsg = static_cast<CFWL_MsgMouse*>(pMessage);
       switch (pMsg->m_dwCmd) {
-        case FWL_MouseCommand::LeftButtonDown: {
+        case FWL_MouseCommand::LeftButtonDown:
           OnLButtonDown(pMsg);
           break;
-        }
-        case FWL_MouseCommand::LeftButtonUp: {
+        case FWL_MouseCommand::LeftButtonUp:
           OnLButtonUp(pMsg);
           break;
-        }
         default:
           break;
       }
       break;
     }
-    case CFWL_MessageType::MouseWheel: {
+    case CFWL_MessageType::MouseWheel:
       OnMouseWheel(static_cast<CFWL_MsgMouseWheel*>(pMessage));
       break;
-    }
     case CFWL_MessageType::Key: {
       CFWL_MsgKey* pMsg = static_cast<CFWL_MsgKey*>(pMessage);
       if (pMsg->m_dwCmd == FWL_KeyCommand::KeyDown)
         OnKeyDown(pMsg);
       break;
     }
-    default: { break; }
+    default:
+      break;
   }
-  CFWL_WidgetImpDelegate::OnProcessMessage(pMessage);
+  IFWL_Widget::OnProcessMessage(pMessage);
 }
 
-void CFWL_ListBoxImpDelegate::OnProcessEvent(CFWL_Event* pEvent) {
+void IFWL_ListBox::OnProcessEvent(CFWL_Event* pEvent) {
   if (!pEvent)
     return;
   if (pEvent->GetClassID() != CFWL_EventType::Scroll)
     return;
 
   IFWL_Widget* pSrcTarget = pEvent->m_pSrcTarget;
-  if ((pSrcTarget == m_pOwner->m_pVertScrollBar.get() &&
-       m_pOwner->m_pVertScrollBar) ||
-      (pSrcTarget == m_pOwner->m_pHorzScrollBar.get() &&
-       m_pOwner->m_pHorzScrollBar)) {
+  if ((pSrcTarget == m_pVertScrollBar.get() && m_pVertScrollBar) ||
+      (pSrcTarget == m_pHorzScrollBar.get() && m_pHorzScrollBar)) {
     CFWL_EvtScroll* pScrollEvent = static_cast<CFWL_EvtScroll*>(pEvent);
     OnScroll(static_cast<IFWL_ScrollBar*>(pSrcTarget),
              pScrollEvent->m_iScrollCode, pScrollEvent->m_fPos);
   }
 }
 
-void CFWL_ListBoxImpDelegate::OnDrawWidget(CFX_Graphics* pGraphics,
-                                           const CFX_Matrix* pMatrix) {
-  m_pOwner->DrawWidget(pGraphics, pMatrix);
+void IFWL_ListBox::OnDrawWidget(CFX_Graphics* pGraphics,
+                                const CFX_Matrix* pMatrix) {
+  DrawWidget(pGraphics, pMatrix);
 }
 
-void CFWL_ListBoxImpDelegate::OnFocusChanged(CFWL_Message* pMsg, FX_BOOL bSet) {
-  if (m_pOwner->GetStylesEx() & FWL_STYLEEXT_LTB_ShowScrollBarFocus) {
-    if (m_pOwner->m_pVertScrollBar) {
-      m_pOwner->m_pVertScrollBar->SetStates(FWL_WGTSTATE_Invisible, !bSet);
-    }
-    if (m_pOwner->m_pHorzScrollBar) {
-      m_pOwner->m_pHorzScrollBar->SetStates(FWL_WGTSTATE_Invisible, !bSet);
-    }
+void IFWL_ListBox::OnFocusChanged(CFWL_Message* pMsg, FX_BOOL bSet) {
+  if (GetStylesEx() & FWL_STYLEEXT_LTB_ShowScrollBarFocus) {
+    if (m_pVertScrollBar)
+      m_pVertScrollBar->SetStates(FWL_WGTSTATE_Invisible, !bSet);
+    if (m_pHorzScrollBar)
+      m_pHorzScrollBar->SetStates(FWL_WGTSTATE_Invisible, !bSet);
   }
-  if (bSet) {
-    m_pOwner->m_pProperties->m_dwStates |= (FWL_WGTSTATE_Focused);
-  } else {
-    m_pOwner->m_pProperties->m_dwStates &= ~(FWL_WGTSTATE_Focused);
-  }
-  m_pOwner->Repaint(&m_pOwner->m_rtClient);
+  if (bSet)
+    m_pProperties->m_dwStates |= (FWL_WGTSTATE_Focused);
+  else
+    m_pProperties->m_dwStates &= ~(FWL_WGTSTATE_Focused);
+
+  Repaint(&m_rtClient);
 }
 
-void CFWL_ListBoxImpDelegate::OnLButtonDown(CFWL_MsgMouse* pMsg) {
-  m_pOwner->m_bLButtonDown = TRUE;
-  if ((m_pOwner->m_pProperties->m_dwStates & FWL_WGTSTATE_Focused) == 0) {
-    m_pOwner->SetFocus(TRUE);
-  }
-  IFWL_ListItem* pItem = m_pOwner->GetItemAtPoint(pMsg->m_fx, pMsg->m_fy);
-  if (!pItem) {
+void IFWL_ListBox::OnLButtonDown(CFWL_MsgMouse* pMsg) {
+  m_bLButtonDown = TRUE;
+  if ((m_pProperties->m_dwStates & FWL_WGTSTATE_Focused) == 0)
+    SetFocus(TRUE);
+
+  IFWL_ListItem* pItem = GetItemAtPoint(pMsg->m_fx, pMsg->m_fy);
+  if (!pItem)
     return;
-  }
-  if (m_pOwner->m_pProperties->m_dwStyleExes &
-      FWL_STYLEEXT_LTB_MultiSelection) {
+
+  if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_LTB_MultiSelection) {
     if (pMsg->m_dwFlags & FWL_KEYFLAG_Ctrl) {
-      FX_BOOL bSelected = m_pOwner->IsItemSelected(pItem);
-      m_pOwner->SetSelectionDirect(pItem, !bSelected);
-      m_pOwner->m_hAnchor = pItem;
+      FX_BOOL bSelected = IsItemSelected(pItem);
+      SetSelectionDirect(pItem, !bSelected);
+      m_hAnchor = pItem;
     } else if (pMsg->m_dwFlags & FWL_KEYFLAG_Shift) {
-      if (m_pOwner->m_hAnchor) {
-        m_pOwner->SetSelection(m_pOwner->m_hAnchor, pItem, TRUE);
-      } else {
-        m_pOwner->SetSelectionDirect(pItem, TRUE);
-      }
+      if (m_hAnchor)
+        SetSelection(m_hAnchor, pItem, TRUE);
+      else
+        SetSelectionDirect(pItem, TRUE);
     } else {
-      m_pOwner->SetSelection(pItem, pItem, TRUE);
-      m_pOwner->m_hAnchor = pItem;
+      SetSelection(pItem, pItem, TRUE);
+      m_hAnchor = pItem;
     }
   } else {
-    m_pOwner->SetSelection(pItem, pItem, TRUE);
+    SetSelection(pItem, pItem, TRUE);
   }
-  if (m_pOwner->m_pProperties->m_dwStyleExes & FWL_STYLEEXT_LTB_Check) {
-    IFWL_ListItem* hSelectedItem =
-        m_pOwner->GetItemAtPoint(pMsg->m_fx, pMsg->m_fy);
+  if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_LTB_Check) {
+    IFWL_ListItem* hSelectedItem = GetItemAtPoint(pMsg->m_fx, pMsg->m_fy);
     CFX_RectF rtCheck;
-    m_pOwner->GetItemCheckRect(hSelectedItem, rtCheck);
-    FX_BOOL bChecked = m_pOwner->GetItemChecked(pItem);
+    GetItemCheckRect(hSelectedItem, rtCheck);
+    FX_BOOL bChecked = GetItemChecked(pItem);
     if (rtCheck.Contains(pMsg->m_fx, pMsg->m_fy)) {
-      if (bChecked) {
-        m_pOwner->SetItemChecked(pItem, FALSE);
-      } else {
-        m_pOwner->SetItemChecked(pItem, TRUE);
-      }
-      m_pOwner->Update();
+      SetItemChecked(pItem, !bChecked);
+      Update();
     }
   }
-  m_pOwner->SetFocusItem(pItem);
-  m_pOwner->ScrollToVisible(pItem);
-  m_pOwner->SetGrab(TRUE);
-  m_pOwner->ProcessSelChanged();
-  m_pOwner->Repaint(&m_pOwner->m_rtClient);
+  SetFocusItem(pItem);
+  ScrollToVisible(pItem);
+  SetGrab(TRUE);
+  ProcessSelChanged();
+  Repaint(&m_rtClient);
 }
 
-void CFWL_ListBoxImpDelegate::OnLButtonUp(CFWL_MsgMouse* pMsg) {
-  if (m_pOwner->m_bLButtonDown) {
-    m_pOwner->m_bLButtonDown = FALSE;
-    m_pOwner->SetGrab(FALSE);
-    DispatchSelChangedEv();
-  }
+void IFWL_ListBox::OnLButtonUp(CFWL_MsgMouse* pMsg) {
+  if (!m_bLButtonDown)
+    return;
+
+  m_bLButtonDown = FALSE;
+  SetGrab(FALSE);
+  DispatchSelChangedEv();
 }
 
-void CFWL_ListBoxImpDelegate::OnMouseWheel(CFWL_MsgMouseWheel* pMsg) {
-  if (m_pOwner->IsShowScrollBar(TRUE))
-    m_pOwner->m_pVertScrollBar->GetCurrentDelegate()->OnProcessMessage(pMsg);
+void IFWL_ListBox::OnMouseWheel(CFWL_MsgMouseWheel* pMsg) {
+  if (IsShowScrollBar(TRUE))
+    m_pVertScrollBar->GetDelegate()->OnProcessMessage(pMsg);
 }
 
-void CFWL_ListBoxImpDelegate::OnKeyDown(CFWL_MsgKey* pMsg) {
+void IFWL_ListBox::OnKeyDown(CFWL_MsgKey* pMsg) {
   uint32_t dwKeyCode = pMsg->m_dwKeyCode;
   switch (dwKeyCode) {
     case FWL_VKEY_Tab:
@@ -1073,13 +1054,13 @@
     case FWL_VKEY_Down:
     case FWL_VKEY_Home:
     case FWL_VKEY_End: {
-      IFWL_ListItem* pItem = m_pOwner->GetFocusedItem();
-      pItem = m_pOwner->GetItem(pItem, dwKeyCode);
+      IFWL_ListItem* pItem = GetFocusedItem();
+      pItem = GetItem(pItem, dwKeyCode);
       bool bShift = !!(pMsg->m_dwFlags & FWL_KEYFLAG_Shift);
       bool bCtrl = !!(pMsg->m_dwFlags & FWL_KEYFLAG_Ctrl);
       OnVK(pItem, bShift, bCtrl);
       DispatchSelChangedEv();
-      m_pOwner->ProcessSelChanged();
+      ProcessSelChanged();
       break;
     }
     default:
@@ -1087,41 +1068,37 @@
   }
 }
 
-void CFWL_ListBoxImpDelegate::OnVK(IFWL_ListItem* pItem,
-                                   FX_BOOL bShift,
-                                   FX_BOOL bCtrl) {
-  if (!pItem) {
+void IFWL_ListBox::OnVK(IFWL_ListItem* pItem, FX_BOOL bShift, FX_BOOL bCtrl) {
+  if (!pItem)
     return;
-  }
-  if (m_pOwner->m_pProperties->m_dwStyleExes &
-      FWL_STYLEEXT_LTB_MultiSelection) {
+
+  if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_LTB_MultiSelection) {
     if (bCtrl) {
     } else if (bShift) {
-      if (m_pOwner->m_hAnchor) {
-        m_pOwner->SetSelection(m_pOwner->m_hAnchor, pItem, TRUE);
-      } else {
-        m_pOwner->SetSelectionDirect(pItem, TRUE);
-      }
+      if (m_hAnchor)
+        SetSelection(m_hAnchor, pItem, TRUE);
+      else
+        SetSelectionDirect(pItem, TRUE);
     } else {
-      m_pOwner->SetSelection(pItem, pItem, TRUE);
-      m_pOwner->m_hAnchor = pItem;
+      SetSelection(pItem, pItem, TRUE);
+      m_hAnchor = pItem;
     }
   } else {
-    m_pOwner->SetSelection(pItem, pItem, TRUE);
+    SetSelection(pItem, pItem, TRUE);
   }
-  m_pOwner->SetFocusItem(pItem);
-  m_pOwner->ScrollToVisible(pItem);
-  {
-    CFX_RectF rtInvalidate;
-    rtInvalidate.Set(0, 0, m_pOwner->m_pProperties->m_rtWidget.width,
-                     m_pOwner->m_pProperties->m_rtWidget.height);
-    m_pOwner->Repaint(&rtInvalidate);
-  }
+
+  SetFocusItem(pItem);
+  ScrollToVisible(pItem);
+
+  CFX_RectF rtInvalidate;
+  rtInvalidate.Set(0, 0, m_pProperties->m_rtWidget.width,
+                   m_pProperties->m_rtWidget.height);
+  Repaint(&rtInvalidate);
 }
 
-FX_BOOL CFWL_ListBoxImpDelegate::OnScroll(IFWL_ScrollBar* pScrollBar,
-                                          uint32_t dwCode,
-                                          FX_FLOAT fPos) {
+FX_BOOL IFWL_ListBox::OnScroll(IFWL_ScrollBar* pScrollBar,
+                               uint32_t dwCode,
+                               FX_FLOAT fPos) {
   CFX_SizeF fs;
   pScrollBar->GetRange(fs.x, fs.y);
   FX_FLOAT iCurPos = pScrollBar->GetPos();
@@ -1137,30 +1114,26 @@
     }
     case FWL_SCBCODE_StepBackward: {
       fPos -= fStep;
-      if (fPos < fs.x + fStep / 2) {
+      if (fPos < fs.x + fStep / 2)
         fPos = fs.x;
-      }
       break;
     }
     case FWL_SCBCODE_StepForward: {
       fPos += fStep;
-      if (fPos > fs.y - fStep / 2) {
+      if (fPos > fs.y - fStep / 2)
         fPos = fs.y;
-      }
       break;
     }
     case FWL_SCBCODE_PageBackward: {
       fPos -= pScrollBar->GetPageSize();
-      if (fPos < fs.x) {
+      if (fPos < fs.x)
         fPos = fs.x;
-      }
       break;
     }
     case FWL_SCBCODE_PageForward: {
       fPos += pScrollBar->GetPageSize();
-      if (fPos > fs.y) {
+      if (fPos > fs.y)
         fPos = fs.y;
-      }
       break;
     }
     case FWL_SCBCODE_Pos:
@@ -1172,13 +1145,13 @@
   if (iCurPos != fPos) {
     pScrollBar->SetPos(fPos);
     pScrollBar->SetTrackPos(fPos);
-    m_pOwner->Repaint(&m_pOwner->m_rtClient);
+    Repaint(&m_rtClient);
   }
   return TRUE;
 }
 
-void CFWL_ListBoxImpDelegate::DispatchSelChangedEv() {
+void IFWL_ListBox::DispatchSelChangedEv() {
   CFWL_EvtLtbSelChanged ev;
-  ev.m_pSrcTarget = m_pOwner;
-  m_pOwner->DispatchEvent(&ev);
+  ev.m_pSrcTarget = this;
+  DispatchEvent(&ev);
 }
diff --git a/xfa/fwl/core/ifwl_listbox.h b/xfa/fwl/core/ifwl_listbox.h
index 25e28cc..5d4f896 100644
--- a/xfa/fwl/core/ifwl_listbox.h
+++ b/xfa/fwl/core/ifwl_listbox.h
@@ -32,7 +32,6 @@
 #define FWL_ITEMSTATE_LTB_Focused (1L << 1)
 #define FWL_ITEMSTATE_LTB_Checked (1L << 2)
 
-class CFWL_ListBoxImpDelegate;
 class CFWL_MsgKillFocus;
 class CFWL_MsgMouse;
 class CFWL_MsgMouseWheel;
@@ -115,6 +114,10 @@
   FWL_Error DrawWidget(CFX_Graphics* pGraphics,
                        const CFX_Matrix* pMatrix = nullptr) override;
   FWL_Error SetThemeProvider(IFWL_ThemeProvider* pThemeProvider) override;
+  void OnProcessMessage(CFWL_Message* pMessage) override;
+  void OnProcessEvent(CFWL_Event* pEvent) override;
+  void OnDrawWidget(CFX_Graphics* pGraphics,
+                    const CFX_Matrix* pMatrix) override;
 
   int32_t CountSelItems();
   IFWL_ListItem* GetSelItem(int32_t nIndexSel);
@@ -180,17 +183,8 @@
   FX_FLOAT m_fScorllBarWidth;
   FX_BOOL m_bLButtonDown;
   IFWL_ThemeProvider* m_pScrollBarTP;
-};
 
-class CFWL_ListBoxImpDelegate : public CFWL_WidgetImpDelegate {
- public:
-  CFWL_ListBoxImpDelegate(IFWL_ListBox* pOwner);
-  void OnProcessMessage(CFWL_Message* pMessage) override;
-  void OnProcessEvent(CFWL_Event* pEvent) override;
-  void OnDrawWidget(CFX_Graphics* pGraphics,
-                    const CFX_Matrix* pMatrix = nullptr) override;
-
- protected:
+ private:
   void OnFocusChanged(CFWL_Message* pMsg, FX_BOOL bSet = TRUE);
   void OnLButtonDown(CFWL_MsgMouse* pMsg);
   void OnLButtonUp(CFWL_MsgMouse* pMsg);
@@ -199,7 +193,6 @@
   void OnVK(IFWL_ListItem* hItem, FX_BOOL bShift, FX_BOOL bCtrl);
   FX_BOOL OnScroll(IFWL_ScrollBar* pScrollBar, uint32_t dwCode, FX_FLOAT fPos);
   void DispatchSelChangedEv();
-  IFWL_ListBox* m_pOwner;
 };
 
 #endif  // XFA_FWL_CORE_IFWL_LISTBOX_H_
diff --git a/xfa/fwl/core/ifwl_monthcalendar.cpp b/xfa/fwl/core/ifwl_monthcalendar.cpp
index 8c5b350..4ac0d2b 100644
--- a/xfa/fwl/core/ifwl_monthcalendar.cpp
+++ b/xfa/fwl/core/ifwl_monthcalendar.cpp
@@ -146,8 +146,6 @@
   m_rtClient.Reset();
   m_rtWeekNum.Reset();
   m_rtWeekNumSep.Reset();
-
-  SetDelegate(pdfium::MakeUnique<CFWL_MonthCalendarImpDelegate>(this));
 }
 
 IFWL_MonthCalendar::~IFWL_MonthCalendar() {
@@ -1015,185 +1013,165 @@
   return TRUE;
 }
 
-CFWL_MonthCalendarImpDelegate::CFWL_MonthCalendarImpDelegate(
-    IFWL_MonthCalendar* pOwner)
-    : m_pOwner(pOwner) {}
-
-void CFWL_MonthCalendarImpDelegate::OnProcessMessage(CFWL_Message* pMessage) {
+void IFWL_MonthCalendar::OnProcessMessage(CFWL_Message* pMessage) {
   if (!pMessage)
     return;
 
   CFWL_MessageType dwMsgCode = pMessage->GetClassID();
   switch (dwMsgCode) {
-    case CFWL_MessageType::SetFocus: {
+    case CFWL_MessageType::SetFocus:
       OnFocusChanged(pMessage, TRUE);
       break;
-    }
-    case CFWL_MessageType::KillFocus: {
+    case CFWL_MessageType::KillFocus:
       OnFocusChanged(pMessage, FALSE);
       break;
-    }
-    case CFWL_MessageType::Key: {
+    case CFWL_MessageType::Key:
       break;
-    }
     case CFWL_MessageType::Mouse: {
       CFWL_MsgMouse* pMouse = static_cast<CFWL_MsgMouse*>(pMessage);
       switch (pMouse->m_dwCmd) {
-        case FWL_MouseCommand::LeftButtonDown: {
+        case FWL_MouseCommand::LeftButtonDown:
           OnLButtonDown(pMouse);
           break;
-        }
-        case FWL_MouseCommand::LeftButtonUp: {
+        case FWL_MouseCommand::LeftButtonUp:
           OnLButtonUp(pMouse);
           break;
-        }
-        case FWL_MouseCommand::Move: {
+        case FWL_MouseCommand::Move:
           OnMouseMove(pMouse);
           break;
-        }
-        case FWL_MouseCommand::Leave: {
+        case FWL_MouseCommand::Leave:
           OnMouseLeave(pMouse);
           break;
-        }
         default:
           break;
       }
       break;
     }
-    default: { break; }
+    default:
+      break;
   }
-  CFWL_WidgetImpDelegate::OnProcessMessage(pMessage);
+  IFWL_Widget::OnProcessMessage(pMessage);
 }
 
-void CFWL_MonthCalendarImpDelegate::OnDrawWidget(CFX_Graphics* pGraphics,
-                                                 const CFX_Matrix* pMatrix) {
-  m_pOwner->DrawWidget(pGraphics, pMatrix);
+void IFWL_MonthCalendar::OnDrawWidget(CFX_Graphics* pGraphics,
+                                      const CFX_Matrix* pMatrix) {
+  DrawWidget(pGraphics, pMatrix);
 }
 
-void CFWL_MonthCalendarImpDelegate::OnActivate(CFWL_Message* pMsg) {}
+void IFWL_MonthCalendar::OnFocusChanged(CFWL_Message* pMsg, FX_BOOL bSet) {
+  if (bSet)
+    m_pProperties->m_dwStates |= FWL_WGTSTATE_Focused;
+  else
+    m_pProperties->m_dwStates &= ~FWL_WGTSTATE_Focused;
 
-void CFWL_MonthCalendarImpDelegate::OnFocusChanged(CFWL_Message* pMsg,
-                                                   FX_BOOL bSet) {
-  if (bSet) {
-    m_pOwner->m_pProperties->m_dwStates |= FWL_WGTSTATE_Focused;
-  } else {
-    m_pOwner->m_pProperties->m_dwStates &= ~FWL_WGTSTATE_Focused;
-  }
-  m_pOwner->Repaint(&m_pOwner->m_rtClient);
+  Repaint(&m_rtClient);
 }
 
-void CFWL_MonthCalendarImpDelegate::OnLButtonDown(CFWL_MsgMouse* pMsg) {
-  if (m_pOwner->m_rtLBtn.Contains(pMsg->m_fx, pMsg->m_fy)) {
-    m_pOwner->m_iLBtnPartStates = CFWL_PartState_Pressed;
-    m_pOwner->PrevMonth();
-    m_pOwner->Repaint(&m_pOwner->m_rtClient);
-  } else if (m_pOwner->m_rtRBtn.Contains(pMsg->m_fx, pMsg->m_fy)) {
-    m_pOwner->m_iRBtnPartStates |= CFWL_PartState_Pressed;
-    m_pOwner->NextMonth();
-    m_pOwner->Repaint(&m_pOwner->m_rtClient);
-  } else if (m_pOwner->m_rtToday.Contains(pMsg->m_fx, pMsg->m_fy)) {
-    if ((m_pOwner->m_pProperties->m_dwStyleExes & FWL_STYLEEXT_MCD_NoToday) ==
-        0) {
-      m_pOwner->JumpToToday();
-      m_pOwner->Repaint(&m_pOwner->m_rtClient);
+void IFWL_MonthCalendar::OnLButtonDown(CFWL_MsgMouse* pMsg) {
+  if (m_rtLBtn.Contains(pMsg->m_fx, pMsg->m_fy)) {
+    m_iLBtnPartStates = CFWL_PartState_Pressed;
+    PrevMonth();
+    Repaint(&m_rtClient);
+  } else if (m_rtRBtn.Contains(pMsg->m_fx, pMsg->m_fy)) {
+    m_iRBtnPartStates |= CFWL_PartState_Pressed;
+    NextMonth();
+    Repaint(&m_rtClient);
+  } else if (m_rtToday.Contains(pMsg->m_fx, pMsg->m_fy)) {
+    if ((m_pProperties->m_dwStyleExes & FWL_STYLEEXT_MCD_NoToday) == 0) {
+      JumpToToday();
+      Repaint(&m_rtClient);
     }
   } else {
-    if (m_pOwner->m_pProperties->m_dwStyleExes & FWL_STYLEEXT_MCD_MultiSelect) {
-    } else {
+    if (!(m_pProperties->m_dwStyleExes & FWL_STYLEEXT_MCD_MultiSelect)) {
       int32_t iOldSel = 0;
-      if (m_pOwner->m_arrSelDays.GetSize() > 0) {
-        iOldSel = m_pOwner->m_arrSelDays[0];
-      } else {
+      if (m_arrSelDays.GetSize() <= 0)
         return;
-      }
-      int32_t iCurSel = m_pOwner->GetDayAtPoint(pMsg->m_fx, pMsg->m_fy);
+      iOldSel = m_arrSelDays[0];
+
+      int32_t iCurSel = GetDayAtPoint(pMsg->m_fx, pMsg->m_fy);
       FX_BOOL bSelChanged = iCurSel > 0 && iCurSel != iOldSel;
       if (bSelChanged) {
-        FWL_DATEINFO* lpDatesInfo = m_pOwner->m_arrDates.GetAt(iCurSel - 1);
+        FWL_DATEINFO* lpDatesInfo = m_arrDates.GetAt(iCurSel - 1);
         CFX_RectF rtInvalidate(lpDatesInfo->rect);
         if (iOldSel > 0) {
-          lpDatesInfo = m_pOwner->m_arrDates.GetAt(iOldSel - 1);
+          lpDatesInfo = m_arrDates.GetAt(iOldSel - 1);
           rtInvalidate.Union(lpDatesInfo->rect);
         }
-        m_pOwner->AddSelDay(iCurSel);
+        AddSelDay(iCurSel);
         CFWL_EvtClick wmClick;
-        wmClick.m_pSrcTarget = m_pOwner;
-        m_pOwner->DispatchEvent(&wmClick);
+        wmClick.m_pSrcTarget = this;
+        DispatchEvent(&wmClick);
         CFWL_EventMcdDateChanged wmDateSelected;
         wmDateSelected.m_iStartDay = iCurSel;
         wmDateSelected.m_iEndDay = iCurSel;
-        wmDateSelected.m_iOldMonth = m_pOwner->m_iCurMonth;
-        wmDateSelected.m_iOldYear = m_pOwner->m_iCurYear;
-        wmDateSelected.m_pSrcTarget = m_pOwner;
-        m_pOwner->DispatchEvent(&wmDateSelected);
-        m_pOwner->Repaint(&rtInvalidate);
+        wmDateSelected.m_iOldMonth = m_iCurMonth;
+        wmDateSelected.m_iOldYear = m_iCurYear;
+        wmDateSelected.m_pSrcTarget = this;
+        DispatchEvent(&wmDateSelected);
+        Repaint(&rtInvalidate);
       }
     }
   }
 }
 
-void CFWL_MonthCalendarImpDelegate::OnLButtonUp(CFWL_MsgMouse* pMsg) {
-  if (m_pOwner->m_rtLBtn.Contains(pMsg->m_fx, pMsg->m_fy)) {
-    m_pOwner->m_iLBtnPartStates = 0;
-    m_pOwner->Repaint(&m_pOwner->m_rtLBtn);
-  } else if (m_pOwner->m_rtRBtn.Contains(pMsg->m_fx, pMsg->m_fy)) {
-    m_pOwner->m_iRBtnPartStates = 0;
-    m_pOwner->Repaint(&m_pOwner->m_rtRBtn);
-  } else if (m_pOwner->m_rtDates.Contains(pMsg->m_fx, pMsg->m_fy)) {
-    int32_t iDay = m_pOwner->GetDayAtPoint(pMsg->m_fx, pMsg->m_fy);
-    if (iDay != -1) {
-      m_pOwner->AddSelDay(iDay);
-    }
+void IFWL_MonthCalendar::OnLButtonUp(CFWL_MsgMouse* pMsg) {
+  if (m_rtLBtn.Contains(pMsg->m_fx, pMsg->m_fy)) {
+    m_iLBtnPartStates = 0;
+    Repaint(&m_rtLBtn);
+  } else if (m_rtRBtn.Contains(pMsg->m_fx, pMsg->m_fy)) {
+    m_iRBtnPartStates = 0;
+    Repaint(&m_rtRBtn);
+  } else if (m_rtDates.Contains(pMsg->m_fx, pMsg->m_fy)) {
+    int32_t iDay = GetDayAtPoint(pMsg->m_fx, pMsg->m_fy);
+    if (iDay != -1)
+      AddSelDay(iDay);
   }
 }
 
-void CFWL_MonthCalendarImpDelegate::OnMouseMove(CFWL_MsgMouse* pMsg) {
-  if (m_pOwner->m_pProperties->m_dwStyleExes & FWL_STYLEEXT_MCD_MultiSelect) {
+void IFWL_MonthCalendar::OnMouseMove(CFWL_MsgMouse* pMsg) {
+  if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_MCD_MultiSelect)
     return;
-  }
+
   FX_BOOL bRepaint = FALSE;
   CFX_RectF rtInvalidate;
   rtInvalidate.Set(0, 0, 0, 0);
-  if (m_pOwner->m_rtDates.Contains(pMsg->m_fx, pMsg->m_fy)) {
-    int32_t iHover = m_pOwner->GetDayAtPoint(pMsg->m_fx, pMsg->m_fy);
-    bRepaint = m_pOwner->m_iHovered != iHover;
+  if (m_rtDates.Contains(pMsg->m_fx, pMsg->m_fy)) {
+    int32_t iHover = GetDayAtPoint(pMsg->m_fx, pMsg->m_fy);
+    bRepaint = m_iHovered != iHover;
     if (bRepaint) {
-      if (m_pOwner->m_iHovered > 0) {
-        m_pOwner->GetDayRect(m_pOwner->m_iHovered, rtInvalidate);
-      }
+      if (m_iHovered > 0)
+        GetDayRect(m_iHovered, rtInvalidate);
       if (iHover > 0) {
         CFX_RectF rtDay;
-        m_pOwner->GetDayRect(iHover, rtDay);
-        if (rtInvalidate.IsEmpty()) {
+        GetDayRect(iHover, rtDay);
+        if (rtInvalidate.IsEmpty())
           rtInvalidate = rtDay;
-        } else {
+        else
           rtInvalidate.Union(rtDay);
-        }
       }
     }
-    m_pOwner->m_iHovered = iHover;
+    m_iHovered = iHover;
   } else {
-    bRepaint = m_pOwner->m_iHovered > 0;
-    if (bRepaint) {
-      m_pOwner->GetDayRect(m_pOwner->m_iHovered, rtInvalidate);
-    }
-    m_pOwner->m_iHovered = -1;
+    bRepaint = m_iHovered > 0;
+    if (bRepaint)
+      GetDayRect(m_iHovered, rtInvalidate);
+
+    m_iHovered = -1;
   }
-  if (bRepaint && !rtInvalidate.IsEmpty()) {
-    m_pOwner->Repaint(&rtInvalidate);
-  }
+  if (bRepaint && !rtInvalidate.IsEmpty())
+    Repaint(&rtInvalidate);
 }
 
-void CFWL_MonthCalendarImpDelegate::OnMouseLeave(CFWL_MsgMouse* pMsg) {
-  if (m_pOwner->m_iHovered > 0) {
-    CFX_RectF rtInvalidate;
-    rtInvalidate.Set(0, 0, 0, 0);
-    m_pOwner->GetDayRect(m_pOwner->m_iHovered, rtInvalidate);
-    m_pOwner->m_iHovered = -1;
-    if (!rtInvalidate.IsEmpty()) {
-      m_pOwner->Repaint(&rtInvalidate);
-    }
-  }
+void IFWL_MonthCalendar::OnMouseLeave(CFWL_MsgMouse* pMsg) {
+  if (m_iHovered <= 0)
+    return;
+
+  CFX_RectF rtInvalidate;
+  rtInvalidate.Set(0, 0, 0, 0);
+  GetDayRect(m_iHovered, rtInvalidate);
+  m_iHovered = -1;
+  if (!rtInvalidate.IsEmpty())
+    Repaint(&rtInvalidate);
 }
 
 FWL_DATEINFO::FWL_DATEINFO(int32_t day,
diff --git a/xfa/fwl/core/ifwl_monthcalendar.h b/xfa/fwl/core/ifwl_monthcalendar.h
index 6bf8ad4..dfde394 100644
--- a/xfa/fwl/core/ifwl_monthcalendar.h
+++ b/xfa/fwl/core/ifwl_monthcalendar.h
@@ -34,7 +34,6 @@
               int32_t m_iStartDay;
               int32_t m_iEndDay;)
 
-class CFWL_MonthCalendarImpDelegate;
 class CFWL_MsgMouse;
 class CFWL_WidgetImpProperties;
 class IFWL_Widget;
@@ -63,6 +62,10 @@
   FWL_Error Update() override;
   FWL_Error DrawWidget(CFX_Graphics* pGraphics,
                        const CFX_Matrix* pMatrix = nullptr) override;
+  void OnProcessMessage(CFWL_Message* pMessage) override;
+  void OnDrawWidget(CFX_Graphics* pGraphics,
+                    const CFX_Matrix* pMatrix) override;
+
   int32_t CountSelect();
   FX_BOOL GetSelect(int32_t& iYear,
                     int32_t& iMonth,
@@ -236,7 +239,13 @@
   FX_FLOAT m_fTodayFlagWid;
   FX_FLOAT m_fMCWid;
   FX_FLOAT m_fMCHei;
-  friend class CFWL_MonthCalendarImpDelegate;
+
+ private:
+  void OnFocusChanged(CFWL_Message* pMsg, FX_BOOL bSet);
+  void OnLButtonDown(CFWL_MsgMouse* pMsg);
+  void OnLButtonUp(CFWL_MsgMouse* pMsg);
+  void OnMouseMove(CFWL_MsgMouse* pMsg);
+  void OnMouseLeave(CFWL_MsgMouse* pMsg);
 };
 
 struct FWL_DATEINFO {
@@ -254,21 +263,4 @@
   CFX_WideString wsDay;
 };
 
-class CFWL_MonthCalendarImpDelegate : public CFWL_WidgetImpDelegate {
- public:
-  CFWL_MonthCalendarImpDelegate(IFWL_MonthCalendar* pOwner);
-  void OnProcessMessage(CFWL_Message* pMessage) override;
-  void OnDrawWidget(CFX_Graphics* pGraphics,
-                    const CFX_Matrix* pMatrix = nullptr) override;
-
- protected:
-  void OnActivate(CFWL_Message* pMsg);
-  void OnFocusChanged(CFWL_Message* pMsg, FX_BOOL bSet = TRUE);
-  void OnLButtonDown(CFWL_MsgMouse* pMsg);
-  void OnLButtonUp(CFWL_MsgMouse* pMsg);
-  void OnMouseMove(CFWL_MsgMouse* pMsg);
-  void OnMouseLeave(CFWL_MsgMouse* pMsg);
-  IFWL_MonthCalendar* m_pOwner;
-};
-
 #endif  // XFA_FWL_CORE_IFWL_MONTHCALENDAR_H_
diff --git a/xfa/fwl/core/ifwl_picturebox.cpp b/xfa/fwl/core/ifwl_picturebox.cpp
index 50bf2a4..6ab792c 100644
--- a/xfa/fwl/core/ifwl_picturebox.cpp
+++ b/xfa/fwl/core/ifwl_picturebox.cpp
@@ -19,8 +19,6 @@
   m_rtClient.Reset();
   m_rtImage.Reset();
   m_matrix.SetIdentity();
-
-  SetDelegate(pdfium::MakeUnique<CFWL_PictureBoxImpDelegate>(this));
 }
 
 IFWL_PictureBox::~IFWL_PictureBox() {}
@@ -119,10 +117,7 @@
   return false;
 }
 
-CFWL_PictureBoxImpDelegate::CFWL_PictureBoxImpDelegate(IFWL_PictureBox* pOwner)
-    : m_pOwner(pOwner) {}
-
-void CFWL_PictureBoxImpDelegate::OnDrawWidget(CFX_Graphics* pGraphics,
-                                              const CFX_Matrix* pMatrix) {
-  m_pOwner->DrawWidget(pGraphics, pMatrix);
+void IFWL_PictureBox::OnDrawWidget(CFX_Graphics* pGraphics,
+                                   const CFX_Matrix* pMatrix) {
+  DrawWidget(pGraphics, pMatrix);
 }
diff --git a/xfa/fwl/core/ifwl_picturebox.h b/xfa/fwl/core/ifwl_picturebox.h
index ecbbc44..05f094b 100644
--- a/xfa/fwl/core/ifwl_picturebox.h
+++ b/xfa/fwl/core/ifwl_picturebox.h
@@ -27,7 +27,6 @@
 #define FWL_STYLEEXT_PTB_VAlignMask 3L << 2
 #define FWL_STYLEEXT_PTB_StretchAlignMask 7L << 4
 
-class CFWL_PictureBoxImpDelegate;
 class CFWL_WidgetImpProperties;
 class CFX_DIBitmap;
 class IFWL_Widget;
@@ -54,10 +53,10 @@
   FWL_Error Update() override;
   FWL_Error DrawWidget(CFX_Graphics* pGraphics,
                        const CFX_Matrix* pMatrix = nullptr) override;
+  void OnDrawWidget(CFX_Graphics* pGraphics,
+                    const CFX_Matrix* pMatrix) override;
 
  protected:
-  friend class CFWL_PictureBoxImpDelegate;
-
   void DrawBkground(CFX_Graphics* pGraphics,
                     IFWL_ThemeProvider* pTheme,
                     const CFX_Matrix* pMatrix = nullptr);
@@ -71,14 +70,4 @@
   FX_BOOL m_bButton;
 };
 
-class CFWL_PictureBoxImpDelegate : public CFWL_WidgetImpDelegate {
- public:
-  CFWL_PictureBoxImpDelegate(IFWL_PictureBox* pOwner);
-  void OnDrawWidget(CFX_Graphics* pGraphics,
-                    const CFX_Matrix* pMatrix = nullptr) override;
-
- protected:
-  IFWL_PictureBox* m_pOwner;
-};
-
 #endif  // XFA_FWL_CORE_IFWL_PICTUREBOX_H_
diff --git a/xfa/fwl/core/ifwl_pushbutton.cpp b/xfa/fwl/core/ifwl_pushbutton.cpp
index 597cf65..8eab8d6 100644
--- a/xfa/fwl/core/ifwl_pushbutton.cpp
+++ b/xfa/fwl/core/ifwl_pushbutton.cpp
@@ -23,8 +23,6 @@
       m_iTTOAlign(FDE_TTOALIGNMENT_Center) {
   m_rtClient.Set(0, 0, 0, 0);
   m_rtCaption.Set(0, 0, 0, 0);
-
-  SetDelegate(pdfium::MakeUnique<CFWL_PushButtonImpDelegate>(this));
 }
 
 IFWL_PushButton::~IFWL_PushButton() {}
@@ -381,44 +379,35 @@
   }
 }
 
-CFWL_PushButtonImpDelegate::CFWL_PushButtonImpDelegate(IFWL_PushButton* pOwner)
-    : m_pOwner(pOwner) {}
-
-void CFWL_PushButtonImpDelegate::OnProcessMessage(CFWL_Message* pMessage) {
+void IFWL_PushButton::OnProcessMessage(CFWL_Message* pMessage) {
   if (!pMessage)
     return;
-  if (!m_pOwner->IsEnabled())
+  if (!IsEnabled())
     return;
 
   CFWL_MessageType dwMsgCode = pMessage->GetClassID();
   switch (dwMsgCode) {
-    case CFWL_MessageType::SetFocus: {
+    case CFWL_MessageType::SetFocus:
       OnFocusChanged(pMessage, TRUE);
       break;
-    }
-    case CFWL_MessageType::KillFocus: {
+    case CFWL_MessageType::KillFocus:
       OnFocusChanged(pMessage, FALSE);
       break;
-    }
     case CFWL_MessageType::Mouse: {
       CFWL_MsgMouse* pMsg = static_cast<CFWL_MsgMouse*>(pMessage);
       switch (pMsg->m_dwCmd) {
-        case FWL_MouseCommand::LeftButtonDown: {
+        case FWL_MouseCommand::LeftButtonDown:
           OnLButtonDown(pMsg);
           break;
-        }
-        case FWL_MouseCommand::LeftButtonUp: {
+        case FWL_MouseCommand::LeftButtonUp:
           OnLButtonUp(pMsg);
           break;
-        }
-        case FWL_MouseCommand::Move: {
+        case FWL_MouseCommand::Move:
           OnMouseMove(pMsg);
           break;
-        }
-        case FWL_MouseCommand::Leave: {
+        case FWL_MouseCommand::Leave:
           OnMouseLeave(pMsg);
           break;
-        }
         default:
           break;
       }
@@ -430,111 +419,107 @@
         OnKeyDown(pKey);
       break;
     }
-    default: { break; }
+    default:
+      break;
   }
-  CFWL_WidgetImpDelegate::OnProcessMessage(pMessage);
+  IFWL_Widget::OnProcessMessage(pMessage);
 }
 
-void CFWL_PushButtonImpDelegate::OnProcessEvent(CFWL_Event* pEvent) {}
-
-void CFWL_PushButtonImpDelegate::OnDrawWidget(CFX_Graphics* pGraphics,
-                                              const CFX_Matrix* pMatrix) {
-  m_pOwner->DrawWidget(pGraphics, pMatrix);
+void IFWL_PushButton::OnDrawWidget(CFX_Graphics* pGraphics,
+                                   const CFX_Matrix* pMatrix) {
+  DrawWidget(pGraphics, pMatrix);
 }
 
-void CFWL_PushButtonImpDelegate::OnFocusChanged(CFWL_Message* pMsg,
-                                                FX_BOOL bSet) {
-  if (bSet) {
-    m_pOwner->m_pProperties->m_dwStates |= FWL_WGTSTATE_Focused;
+void IFWL_PushButton::OnFocusChanged(CFWL_Message* pMsg, FX_BOOL bSet) {
+  if (bSet)
+    m_pProperties->m_dwStates |= FWL_WGTSTATE_Focused;
+  else
+    m_pProperties->m_dwStates &= ~FWL_WGTSTATE_Focused;
+
+  Repaint(&m_rtClient);
+}
+
+void IFWL_PushButton::OnLButtonDown(CFWL_MsgMouse* pMsg) {
+  if ((m_pProperties->m_dwStates & FWL_WGTSTATE_Focused) == 0)
+    SetFocus(TRUE);
+
+  m_bBtnDown = TRUE;
+  m_pProperties->m_dwStates |= FWL_STATE_PSB_Hovered;
+  m_pProperties->m_dwStates |= FWL_STATE_PSB_Pressed;
+  Repaint(&m_rtClient);
+}
+
+void IFWL_PushButton::OnLButtonUp(CFWL_MsgMouse* pMsg) {
+  m_bBtnDown = FALSE;
+  if (m_rtClient.Contains(pMsg->m_fx, pMsg->m_fy)) {
+    m_pProperties->m_dwStates &= ~FWL_STATE_PSB_Pressed;
+    m_pProperties->m_dwStates |= FWL_STATE_PSB_Hovered;
   } else {
-    m_pOwner->m_pProperties->m_dwStates &= ~FWL_WGTSTATE_Focused;
+    m_pProperties->m_dwStates &= ~FWL_STATE_PSB_Hovered;
+    m_pProperties->m_dwStates &= ~FWL_STATE_PSB_Pressed;
   }
-  m_pOwner->Repaint(&m_pOwner->m_rtClient);
-}
-
-void CFWL_PushButtonImpDelegate::OnLButtonDown(CFWL_MsgMouse* pMsg) {
-  if ((m_pOwner->m_pProperties->m_dwStates & FWL_WGTSTATE_Focused) == 0) {
-    m_pOwner->SetFocus(TRUE);
-  }
-  m_pOwner->m_bBtnDown = TRUE;
-  m_pOwner->m_pProperties->m_dwStates |= FWL_STATE_PSB_Hovered;
-  m_pOwner->m_pProperties->m_dwStates |= FWL_STATE_PSB_Pressed;
-  m_pOwner->Repaint(&m_pOwner->m_rtClient);
-}
-
-void CFWL_PushButtonImpDelegate::OnLButtonUp(CFWL_MsgMouse* pMsg) {
-  m_pOwner->m_bBtnDown = FALSE;
-  if (m_pOwner->m_rtClient.Contains(pMsg->m_fx, pMsg->m_fy)) {
-    m_pOwner->m_pProperties->m_dwStates &= ~FWL_STATE_PSB_Pressed;
-    m_pOwner->m_pProperties->m_dwStates |= FWL_STATE_PSB_Hovered;
-  } else {
-    m_pOwner->m_pProperties->m_dwStates &= ~FWL_STATE_PSB_Hovered;
-    m_pOwner->m_pProperties->m_dwStates &= ~FWL_STATE_PSB_Pressed;
-  }
-  if (m_pOwner->m_rtClient.Contains(pMsg->m_fx, pMsg->m_fy)) {
+  if (m_rtClient.Contains(pMsg->m_fx, pMsg->m_fy)) {
     CFWL_EvtClick wmClick;
-    wmClick.m_pSrcTarget = m_pOwner;
-    m_pOwner->DispatchEvent(&wmClick);
+    wmClick.m_pSrcTarget = this;
+    DispatchEvent(&wmClick);
   }
-  m_pOwner->Repaint(&m_pOwner->m_rtClient);
+  Repaint(&m_rtClient);
 }
 
-void CFWL_PushButtonImpDelegate::OnMouseMove(CFWL_MsgMouse* pMsg) {
+void IFWL_PushButton::OnMouseMove(CFWL_MsgMouse* pMsg) {
   FX_BOOL bRepaint = FALSE;
-  if (m_pOwner->m_bBtnDown) {
-    if (m_pOwner->m_rtClient.Contains(pMsg->m_fx, pMsg->m_fy)) {
-      if ((m_pOwner->m_pProperties->m_dwStates & FWL_STATE_PSB_Pressed) == 0) {
-        m_pOwner->m_pProperties->m_dwStates |= FWL_STATE_PSB_Pressed;
+  if (m_bBtnDown) {
+    if (m_rtClient.Contains(pMsg->m_fx, pMsg->m_fy)) {
+      if ((m_pProperties->m_dwStates & FWL_STATE_PSB_Pressed) == 0) {
+        m_pProperties->m_dwStates |= FWL_STATE_PSB_Pressed;
         bRepaint = TRUE;
       }
-      if (m_pOwner->m_pProperties->m_dwStates & FWL_STATE_PSB_Hovered) {
-        m_pOwner->m_pProperties->m_dwStates &= ~FWL_STATE_PSB_Hovered;
+      if (m_pProperties->m_dwStates & FWL_STATE_PSB_Hovered) {
+        m_pProperties->m_dwStates &= ~FWL_STATE_PSB_Hovered;
         bRepaint = TRUE;
       }
     } else {
-      if (m_pOwner->m_pProperties->m_dwStates & FWL_STATE_PSB_Pressed) {
-        m_pOwner->m_pProperties->m_dwStates &= ~FWL_STATE_PSB_Pressed;
+      if (m_pProperties->m_dwStates & FWL_STATE_PSB_Pressed) {
+        m_pProperties->m_dwStates &= ~FWL_STATE_PSB_Pressed;
         bRepaint = TRUE;
       }
-      if ((m_pOwner->m_pProperties->m_dwStates & FWL_STATE_PSB_Hovered) == 0) {
-        m_pOwner->m_pProperties->m_dwStates |= FWL_STATE_PSB_Hovered;
+      if ((m_pProperties->m_dwStates & FWL_STATE_PSB_Hovered) == 0) {
+        m_pProperties->m_dwStates |= FWL_STATE_PSB_Hovered;
         bRepaint = TRUE;
       }
     }
   } else {
-    if (!m_pOwner->m_rtClient.Contains(pMsg->m_fx, pMsg->m_fy)) {
+    if (!m_rtClient.Contains(pMsg->m_fx, pMsg->m_fy))
       return;
-    }
-    if ((m_pOwner->m_pProperties->m_dwStates & FWL_STATE_PSB_Hovered) == 0) {
-      m_pOwner->m_pProperties->m_dwStates |= FWL_STATE_PSB_Hovered;
+    if ((m_pProperties->m_dwStates & FWL_STATE_PSB_Hovered) == 0) {
+      m_pProperties->m_dwStates |= FWL_STATE_PSB_Hovered;
       bRepaint = TRUE;
     }
   }
-  if (bRepaint) {
-    m_pOwner->Repaint(&m_pOwner->m_rtClient);
-  }
+  if (bRepaint)
+    Repaint(&m_rtClient);
 }
 
-void CFWL_PushButtonImpDelegate::OnMouseLeave(CFWL_MsgMouse* pMsg) {
-  m_pOwner->m_bBtnDown = FALSE;
-  m_pOwner->m_pProperties->m_dwStates &= ~FWL_STATE_PSB_Hovered;
-  m_pOwner->m_pProperties->m_dwStates &= ~FWL_STATE_PSB_Pressed;
-  m_pOwner->Repaint(&m_pOwner->m_rtClient);
+void IFWL_PushButton::OnMouseLeave(CFWL_MsgMouse* pMsg) {
+  m_bBtnDown = FALSE;
+  m_pProperties->m_dwStates &= ~FWL_STATE_PSB_Hovered;
+  m_pProperties->m_dwStates &= ~FWL_STATE_PSB_Pressed;
+  Repaint(&m_rtClient);
 }
 
-void CFWL_PushButtonImpDelegate::OnKeyDown(CFWL_MsgKey* pMsg) {
+void IFWL_PushButton::OnKeyDown(CFWL_MsgKey* pMsg) {
   if (pMsg->m_dwKeyCode == FWL_VKEY_Return) {
     CFWL_EvtMouse wmMouse;
-    wmMouse.m_pSrcTarget = m_pOwner;
+    wmMouse.m_pSrcTarget = this;
     wmMouse.m_dwCmd = FWL_MouseCommand::LeftButtonUp;
-    m_pOwner->DispatchEvent(&wmMouse);
+    DispatchEvent(&wmMouse);
     CFWL_EvtClick wmClick;
-    wmClick.m_pSrcTarget = m_pOwner;
-    m_pOwner->DispatchEvent(&wmClick);
+    wmClick.m_pSrcTarget = this;
+    DispatchEvent(&wmClick);
     return;
   }
-  if (pMsg->m_dwKeyCode != FWL_VKEY_Tab) {
+  if (pMsg->m_dwKeyCode != FWL_VKEY_Tab)
     return;
-  }
-  m_pOwner->DispatchKeyEvent(pMsg);
+
+  DispatchKeyEvent(pMsg);
 }
diff --git a/xfa/fwl/core/ifwl_pushbutton.h b/xfa/fwl/core/ifwl_pushbutton.h
index c009c47..18b15ab 100644
--- a/xfa/fwl/core/ifwl_pushbutton.h
+++ b/xfa/fwl/core/ifwl_pushbutton.h
@@ -28,7 +28,6 @@
 #define FWL_STATE_PSB_Default (1 << (FWL_WGTSTATE_MAX + 2))
 
 class CFWL_MsgMouse;
-class CFWL_PushButtonImpDelegate;
 class CFWL_WidgetImpProperties;
 class CFX_DIBitmap;
 class IFWL_Widget;
@@ -51,10 +50,11 @@
   FWL_Error Update() override;
   FWL_Error DrawWidget(CFX_Graphics* pGraphics,
                        const CFX_Matrix* pMatrix = nullptr) override;
+  void OnProcessMessage(CFWL_Message* pMessage) override;
+  void OnDrawWidget(CFX_Graphics* pGraphics,
+                    const CFX_Matrix* pMatrix) override;
 
  protected:
-  friend class CFWL_PushButtonImpDelegate;
-
   void DrawBkground(CFX_Graphics* pGraphics,
                     IFWL_ThemeProvider* pTheme,
                     const CFX_Matrix* pMatrix);
@@ -69,24 +69,14 @@
   FX_BOOL m_bBtnDown;
   uint32_t m_dwTTOStyles;
   int32_t m_iTTOAlign;
-};
 
-class CFWL_PushButtonImpDelegate : public CFWL_WidgetImpDelegate {
- public:
-  CFWL_PushButtonImpDelegate(IFWL_PushButton* pOwner);
-  void OnProcessMessage(CFWL_Message* pMessage) override;
-  void OnProcessEvent(CFWL_Event* pEvent) override;
-  void OnDrawWidget(CFX_Graphics* pGraphics,
-                    const CFX_Matrix* pMatrix = nullptr) override;
-
- protected:
-  void OnFocusChanged(CFWL_Message* pMsg, FX_BOOL bSet = TRUE);
+ private:
+  void OnFocusChanged(CFWL_Message* pMsg, FX_BOOL bSet);
   void OnLButtonDown(CFWL_MsgMouse* pMsg);
   void OnLButtonUp(CFWL_MsgMouse* pMsg);
   void OnMouseMove(CFWL_MsgMouse* pMsg);
   void OnMouseLeave(CFWL_MsgMouse* pMsg);
   void OnKeyDown(CFWL_MsgKey* pMsg);
-  IFWL_PushButton* m_pOwner;
 };
 
 #endif  // XFA_FWL_CORE_IFWL_PUSHBUTTON_H_
diff --git a/xfa/fwl/core/ifwl_scrollbar.cpp b/xfa/fwl/core/ifwl_scrollbar.cpp
index a66badd..24f6b36 100644
--- a/xfa/fwl/core/ifwl_scrollbar.cpp
+++ b/xfa/fwl/core/ifwl_scrollbar.cpp
@@ -52,8 +52,6 @@
   m_rtMaxBtn.Reset();
   m_rtMinTrack.Reset();
   m_rtMaxTrack.Reset();
-
-  SetDelegate(pdfium::MakeUnique<CFWL_ScrollBarImpDelegate>(this));
 }
 
 IFWL_ScrollBar::~IFWL_ScrollBar() {}
@@ -569,10 +567,7 @@
   return bRet;
 }
 
-CFWL_ScrollBarImpDelegate::CFWL_ScrollBarImpDelegate(IFWL_ScrollBar* pOwner)
-    : m_pOwner(pOwner) {}
-
-void CFWL_ScrollBarImpDelegate::OnProcessMessage(CFWL_Message* pMessage) {
+void IFWL_ScrollBar::OnProcessMessage(CFWL_Message* pMessage) {
   if (!pMessage)
     return;
 
@@ -580,23 +575,20 @@
   if (dwMsgCode == CFWL_MessageType::Mouse) {
     CFWL_MsgMouse* pMsg = static_cast<CFWL_MsgMouse*>(pMessage);
     switch (pMsg->m_dwCmd) {
-      case FWL_MouseCommand::LeftButtonDown: {
+      case FWL_MouseCommand::LeftButtonDown:
         OnLButtonDown(pMsg->m_dwFlags, pMsg->m_fx, pMsg->m_fy);
         break;
-      }
-      case FWL_MouseCommand::LeftButtonUp: {
+      case FWL_MouseCommand::LeftButtonUp:
         OnLButtonUp(pMsg->m_dwFlags, pMsg->m_fx, pMsg->m_fy);
         break;
-      }
-      case FWL_MouseCommand::Move: {
+      case FWL_MouseCommand::Move:
         OnMouseMove(pMsg->m_dwFlags, pMsg->m_fx, pMsg->m_fy);
         break;
-      }
-      case FWL_MouseCommand::Leave: {
+      case FWL_MouseCommand::Leave:
         OnMouseLeave();
         break;
-      }
-      default: { break; }
+      default:
+        break;
     }
   } else if (dwMsgCode == CFWL_MessageType::MouseWheel) {
     CFWL_MsgMouseWheel* pMsg = static_cast<CFWL_MsgMouseWheel*>(pMessage);
@@ -605,158 +597,138 @@
   }
 }
 
-void CFWL_ScrollBarImpDelegate::OnDrawWidget(CFX_Graphics* pGraphics,
-                                             const CFX_Matrix* pMatrix) {
-  m_pOwner->DrawWidget(pGraphics, pMatrix);
+void IFWL_ScrollBar::OnDrawWidget(CFX_Graphics* pGraphics,
+                                  const CFX_Matrix* pMatrix) {
+  DrawWidget(pGraphics, pMatrix);
 }
 
-void CFWL_ScrollBarImpDelegate::OnLButtonDown(uint32_t dwFlags,
-                                              FX_FLOAT fx,
-                                              FX_FLOAT fy) {
-  if (!m_pOwner->IsEnabled()) {
+void IFWL_ScrollBar::OnLButtonDown(uint32_t dwFlags, FX_FLOAT fx, FX_FLOAT fy) {
+  if (!IsEnabled())
     return;
-  }
-  m_pOwner->m_bMouseDown = TRUE;
-  m_pOwner->SetGrab(TRUE);
-  m_pOwner->m_cpTrackPointX = fx;
-  m_pOwner->m_cpTrackPointY = fy;
-  m_pOwner->m_fLastTrackPos = m_pOwner->m_fTrackPos;
-  if (m_pOwner->m_rtMinBtn.Contains(fx, fy)) {
-    DoMouseDown(0, m_pOwner->m_rtMinBtn, m_pOwner->m_iMinButtonState, fx, fy);
-  } else {
-    if (m_pOwner->m_rtThumb.Contains(fx, fy)) {
-      DoMouseDown(1, m_pOwner->m_rtThumb, m_pOwner->m_iThumbButtonState, fx,
-                  fy);
-    } else {
-      if (m_pOwner->m_rtMaxBtn.Contains(fx, fy)) {
-        DoMouseDown(2, m_pOwner->m_rtMaxBtn, m_pOwner->m_iMaxButtonState, fx,
-                    fy);
-      } else {
-        if (m_pOwner->m_rtMinTrack.Contains(fx, fy)) {
-          DoMouseDown(3, m_pOwner->m_rtMinTrack, m_pOwner->m_iMinTrackState, fx,
-                      fy);
-        } else {
-          DoMouseDown(4, m_pOwner->m_rtMaxTrack, m_pOwner->m_iMaxTrackState, fx,
-                      fy);
-        }
-      }
-    }
-  }
-  if (!m_pOwner->SendEvent())
-    m_pOwner->m_pTimerInfo =
-        m_pOwner->m_Timer.StartTimer(FWL_SCROLLBAR_Elapse, true);
+
+  m_bMouseDown = TRUE;
+  SetGrab(TRUE);
+  m_cpTrackPointX = fx;
+  m_cpTrackPointY = fy;
+  m_fLastTrackPos = m_fTrackPos;
+  if (m_rtMinBtn.Contains(fx, fy))
+    DoMouseDown(0, m_rtMinBtn, m_iMinButtonState, fx, fy);
+  else if (m_rtThumb.Contains(fx, fy))
+    DoMouseDown(1, m_rtThumb, m_iThumbButtonState, fx, fy);
+  else if (m_rtMaxBtn.Contains(fx, fy))
+    DoMouseDown(2, m_rtMaxBtn, m_iMaxButtonState, fx, fy);
+  else if (m_rtMinTrack.Contains(fx, fy))
+    DoMouseDown(3, m_rtMinTrack, m_iMinTrackState, fx, fy);
+  else
+    DoMouseDown(4, m_rtMaxTrack, m_iMaxTrackState, fx, fy);
+
+  if (!SendEvent())
+    m_pTimerInfo = m_Timer.StartTimer(FWL_SCROLLBAR_Elapse, true);
 }
 
-void CFWL_ScrollBarImpDelegate::OnLButtonUp(uint32_t dwFlags,
-                                            FX_FLOAT fx,
-                                            FX_FLOAT fy) {
-  m_pOwner->m_pTimerInfo->StopTimer();
-  m_pOwner->m_bMouseDown = FALSE;
-  DoMouseUp(0, m_pOwner->m_rtMinBtn, m_pOwner->m_iMinButtonState, fx, fy);
-  DoMouseUp(1, m_pOwner->m_rtThumb, m_pOwner->m_iThumbButtonState, fx, fy);
-  DoMouseUp(2, m_pOwner->m_rtMaxBtn, m_pOwner->m_iMaxButtonState, fx, fy);
-  DoMouseUp(3, m_pOwner->m_rtMinTrack, m_pOwner->m_iMinTrackState, fx, fy);
-  DoMouseUp(4, m_pOwner->m_rtMaxTrack, m_pOwner->m_iMaxTrackState, fx, fy);
-  m_pOwner->SetGrab(FALSE);
+void IFWL_ScrollBar::OnLButtonUp(uint32_t dwFlags, FX_FLOAT fx, FX_FLOAT fy) {
+  m_pTimerInfo->StopTimer();
+  m_bMouseDown = FALSE;
+  DoMouseUp(0, m_rtMinBtn, m_iMinButtonState, fx, fy);
+  DoMouseUp(1, m_rtThumb, m_iThumbButtonState, fx, fy);
+  DoMouseUp(2, m_rtMaxBtn, m_iMaxButtonState, fx, fy);
+  DoMouseUp(3, m_rtMinTrack, m_iMinTrackState, fx, fy);
+  DoMouseUp(4, m_rtMaxTrack, m_iMaxTrackState, fx, fy);
+  SetGrab(FALSE);
 }
 
-void CFWL_ScrollBarImpDelegate::OnMouseMove(uint32_t dwFlags,
-                                            FX_FLOAT fx,
-                                            FX_FLOAT fy) {
-  DoMouseMove(0, m_pOwner->m_rtMinBtn, m_pOwner->m_iMinButtonState, fx, fy);
-  DoMouseMove(1, m_pOwner->m_rtThumb, m_pOwner->m_iThumbButtonState, fx, fy);
-  DoMouseMove(2, m_pOwner->m_rtMaxBtn, m_pOwner->m_iMaxButtonState, fx, fy);
-  DoMouseMove(3, m_pOwner->m_rtMinTrack, m_pOwner->m_iMinTrackState, fx, fy);
-  DoMouseMove(4, m_pOwner->m_rtMaxTrack, m_pOwner->m_iMaxTrackState, fx, fy);
+void IFWL_ScrollBar::OnMouseMove(uint32_t dwFlags, FX_FLOAT fx, FX_FLOAT fy) {
+  DoMouseMove(0, m_rtMinBtn, m_iMinButtonState, fx, fy);
+  DoMouseMove(1, m_rtThumb, m_iThumbButtonState, fx, fy);
+  DoMouseMove(2, m_rtMaxBtn, m_iMaxButtonState, fx, fy);
+  DoMouseMove(3, m_rtMinTrack, m_iMinTrackState, fx, fy);
+  DoMouseMove(4, m_rtMaxTrack, m_iMaxTrackState, fx, fy);
 }
 
-void CFWL_ScrollBarImpDelegate::OnMouseLeave() {
-  DoMouseLeave(0, m_pOwner->m_rtMinBtn, m_pOwner->m_iMinButtonState);
-  DoMouseLeave(1, m_pOwner->m_rtThumb, m_pOwner->m_iThumbButtonState);
-  DoMouseLeave(2, m_pOwner->m_rtMaxBtn, m_pOwner->m_iMaxButtonState);
-  DoMouseLeave(3, m_pOwner->m_rtMinTrack, m_pOwner->m_iMinTrackState);
-  DoMouseLeave(4, m_pOwner->m_rtMaxTrack, m_pOwner->m_iMaxTrackState);
+void IFWL_ScrollBar::OnMouseLeave() {
+  DoMouseLeave(0, m_rtMinBtn, m_iMinButtonState);
+  DoMouseLeave(1, m_rtThumb, m_iThumbButtonState);
+  DoMouseLeave(2, m_rtMaxBtn, m_iMaxButtonState);
+  DoMouseLeave(3, m_rtMinTrack, m_iMinTrackState);
+  DoMouseLeave(4, m_rtMaxTrack, m_iMaxTrackState);
 }
 
-void CFWL_ScrollBarImpDelegate::OnMouseWheel(FX_FLOAT fx,
-                                             FX_FLOAT fy,
-                                             uint32_t dwFlags,
-                                             FX_FLOAT fDeltaX,
-                                             FX_FLOAT fDeltaY) {
-  m_pOwner->m_iMouseWheel = (int32_t)fDeltaX;
-  m_pOwner->SendEvent();
-  m_pOwner->m_iMouseWheel = 0;
+void IFWL_ScrollBar::OnMouseWheel(FX_FLOAT fx,
+                                  FX_FLOAT fy,
+                                  uint32_t dwFlags,
+                                  FX_FLOAT fDeltaX,
+                                  FX_FLOAT fDeltaY) {
+  m_iMouseWheel = (int32_t)fDeltaX;
+  SendEvent();
+  m_iMouseWheel = 0;
 }
 
-void CFWL_ScrollBarImpDelegate::DoMouseDown(int32_t iItem,
-                                            const CFX_RectF& rtItem,
-                                            int32_t& iState,
-                                            FX_FLOAT fx,
-                                            FX_FLOAT fy) {
-  if (!rtItem.Contains(fx, fy)) {
+void IFWL_ScrollBar::DoMouseDown(int32_t iItem,
+                                 const CFX_RectF& rtItem,
+                                 int32_t& iState,
+                                 FX_FLOAT fx,
+                                 FX_FLOAT fy) {
+  if (!rtItem.Contains(fx, fy))
     return;
-  }
-  if (iState == CFWL_PartState_Pressed) {
+  if (iState == CFWL_PartState_Pressed)
     return;
-  }
   iState = CFWL_PartState_Pressed;
-  m_pOwner->Repaint(&rtItem);
+  Repaint(&rtItem);
 }
 
-void CFWL_ScrollBarImpDelegate::DoMouseUp(int32_t iItem,
-                                          const CFX_RectF& rtItem,
-                                          int32_t& iState,
-                                          FX_FLOAT fx,
-                                          FX_FLOAT fy) {
+void IFWL_ScrollBar::DoMouseUp(int32_t iItem,
+                               const CFX_RectF& rtItem,
+                               int32_t& iState,
+                               FX_FLOAT fx,
+                               FX_FLOAT fy) {
   int32_t iNewState =
       rtItem.Contains(fx, fy) ? CFWL_PartState_Hovered : CFWL_PartState_Normal;
-  if (iState == iNewState) {
+  if (iState == iNewState)
     return;
-  }
+
   iState = iNewState;
-  m_pOwner->Repaint(&rtItem);
-  m_pOwner->OnScroll(FWL_SCBCODE_EndScroll, m_pOwner->m_fTrackPos);
+  Repaint(&rtItem);
+  OnScroll(FWL_SCBCODE_EndScroll, m_fTrackPos);
 }
 
-void CFWL_ScrollBarImpDelegate::DoMouseMove(int32_t iItem,
-                                            const CFX_RectF& rtItem,
-                                            int32_t& iState,
-                                            FX_FLOAT fx,
-                                            FX_FLOAT fy) {
-  if (!m_pOwner->m_bMouseDown) {
+void IFWL_ScrollBar::DoMouseMove(int32_t iItem,
+                                 const CFX_RectF& rtItem,
+                                 int32_t& iState,
+                                 FX_FLOAT fx,
+                                 FX_FLOAT fy) {
+  if (!m_bMouseDown) {
     int32_t iNewState = rtItem.Contains(fx, fy) ? CFWL_PartState_Hovered
                                                 : CFWL_PartState_Normal;
-    if (iState == iNewState) {
+    if (iState == iNewState)
       return;
-    }
+
     iState = iNewState;
-    m_pOwner->Repaint(&rtItem);
-  } else if ((2 == iItem) &&
-             (m_pOwner->m_iThumbButtonState == CFWL_PartState_Pressed)) {
-    FX_FLOAT fPos = m_pOwner->GetTrackPointPos(fx, fy);
-    m_pOwner->m_fTrackPos = fPos;
-    m_pOwner->OnScroll(FWL_SCBCODE_TrackPos, fPos);
+    Repaint(&rtItem);
+  } else if ((2 == iItem) && (m_iThumbButtonState == CFWL_PartState_Pressed)) {
+    FX_FLOAT fPos = GetTrackPointPos(fx, fy);
+    m_fTrackPos = fPos;
+    OnScroll(FWL_SCBCODE_TrackPos, fPos);
   }
 }
 
-void CFWL_ScrollBarImpDelegate::DoMouseLeave(int32_t iItem,
-                                             const CFX_RectF& rtItem,
-                                             int32_t& iState) {
-  if (iState == CFWL_PartState_Normal) {
+void IFWL_ScrollBar::DoMouseLeave(int32_t iItem,
+                                  const CFX_RectF& rtItem,
+                                  int32_t& iState) {
+  if (iState == CFWL_PartState_Normal)
     return;
-  }
+
   iState = CFWL_PartState_Normal;
-  m_pOwner->Repaint(&rtItem);
+  Repaint(&rtItem);
 }
 
-void CFWL_ScrollBarImpDelegate::DoMouseHover(int32_t iItem,
-                                             const CFX_RectF& rtItem,
-                                             int32_t& iState) {
-  if (iState == CFWL_PartState_Hovered) {
+void IFWL_ScrollBar::DoMouseHover(int32_t iItem,
+                                  const CFX_RectF& rtItem,
+                                  int32_t& iState) {
+  if (iState == CFWL_PartState_Hovered)
     return;
-  }
+
   iState = CFWL_PartState_Hovered;
-  m_pOwner->Repaint(&rtItem);
+  Repaint(&rtItem);
 }
 
 IFWL_ScrollBar::Timer::Timer(IFWL_ScrollBar* pToolTip) : IFWL_Timer(pToolTip) {}
diff --git a/xfa/fwl/core/ifwl_scrollbar.h b/xfa/fwl/core/ifwl_scrollbar.h
index 5d7fc97..1c10763 100644
--- a/xfa/fwl/core/ifwl_scrollbar.h
+++ b/xfa/fwl/core/ifwl_scrollbar.h
@@ -14,7 +14,6 @@
 #include "xfa/fwl/core/ifwl_timer.h"
 #include "xfa/fwl/core/ifwl_widget.h"
 
-class CFWL_ScrollBarImpDelegate;
 class CFWL_WidgetImpProperties;
 class IFWL_Widget;
 
@@ -49,6 +48,9 @@
   FWL_Error Update() override;
   FWL_Error DrawWidget(CFX_Graphics* pGraphics,
                        const CFX_Matrix* pMatrix = nullptr) override;
+  void OnProcessMessage(CFWL_Message* pMessage) override;
+  void OnDrawWidget(CFX_Graphics* pGraphics,
+                    const CFX_Matrix* pMatrix) override;
 
   FX_BOOL IsVertical();
   FWL_Error GetRange(FX_FLOAT& fMin, FX_FLOAT& fMax);
@@ -65,8 +67,6 @@
   FWL_Error SetOuter(IFWL_Widget* pOuter);
 
  protected:
-  friend class CFWL_ScrollBarImpDelegate;
-
   class Timer : public IFWL_Timer {
    public:
     explicit Timer(IFWL_ScrollBar* pToolTip);
@@ -131,16 +131,8 @@
   bool m_bCustomLayout;
   FX_FLOAT m_fMinThumb;
   IFWL_ScrollBar::Timer m_Timer;
-};
 
-class CFWL_ScrollBarImpDelegate : public CFWL_WidgetImpDelegate {
- public:
-  CFWL_ScrollBarImpDelegate(IFWL_ScrollBar* pOwner);
-  void OnProcessMessage(CFWL_Message* pMessage) override;
-  void OnDrawWidget(CFX_Graphics* pGraphics,
-                    const CFX_Matrix* pMatrix = nullptr) override;
-
- protected:
+ private:
   void OnLButtonDown(uint32_t dwFlags, FX_FLOAT fx, FX_FLOAT fy);
   void OnLButtonUp(uint32_t dwFlags, FX_FLOAT fx, FX_FLOAT fy);
   void OnMouseMove(uint32_t dwFlags, FX_FLOAT fx, FX_FLOAT fy);
@@ -167,8 +159,6 @@
                    FX_FLOAT fy);
   void DoMouseLeave(int32_t iItem, const CFX_RectF& rtItem, int32_t& iState);
   void DoMouseHover(int32_t iItem, const CFX_RectF& rtItem, int32_t& iState);
-
-  IFWL_ScrollBar* m_pOwner;
 };
 
 #endif  // XFA_FWL_CORE_IFWL_SCROLLBAR_H_
diff --git a/xfa/fwl/core/ifwl_spinbutton.cpp b/xfa/fwl/core/ifwl_spinbutton.cpp
index 81cff67..1ad5f0a 100644
--- a/xfa/fwl/core/ifwl_spinbutton.cpp
+++ b/xfa/fwl/core/ifwl_spinbutton.cpp
@@ -37,8 +37,6 @@
   m_rtUpButton.Reset();
   m_rtDnButton.Reset();
   m_pProperties->m_dwStyleExes |= FWL_STYLEEXE_SPB_Vert;
-
-  SetDelegate(pdfium::MakeUnique<CFWL_SpinButtonImpDelegate>(this));
 }
 
 IFWL_SpinButton::~IFWL_SpinButton() {}
@@ -98,43 +96,34 @@
                                       const CFX_Matrix* pMatrix) {
   if (!pGraphics)
     return FWL_Error::Indefinite;
+
   CFX_RectF rtClip(m_rtClient);
-  if (pMatrix) {
+  if (pMatrix)
     pMatrix->TransformRect(rtClip);
-  }
+
   IFWL_ThemeProvider* pTheme = GetAvailableTheme();
-  if (HasBorder()) {
+  if (HasBorder())
     DrawBorder(pGraphics, CFWL_Part::Border, pTheme, pMatrix);
-  }
-  if (HasEdge()) {
+  if (HasEdge())
     DrawEdge(pGraphics, CFWL_Part::Edge, pTheme, pMatrix);
-  }
+
   DrawUpButton(pGraphics, pTheme, pMatrix);
   DrawDownButton(pGraphics, pTheme, pMatrix);
   return FWL_Error::Succeeded;
 }
 
 FWL_Error IFWL_SpinButton::EnableButton(FX_BOOL bEnable, FX_BOOL bUp) {
-  if (bUp) {
-    if (bEnable) {
-      m_dwUpState = CFWL_PartState_Normal;
-    } else {
-      m_dwUpState = CFWL_PartState_Disabled;
-    }
-  } else {
-    if (bEnable) {
-      m_dwDnState = CFWL_PartState_Normal;
-    } else {
-      m_dwDnState = CFWL_PartState_Disabled;
-    }
-  }
+  if (bUp)
+    m_dwUpState = bEnable ? CFWL_PartState_Normal : CFWL_PartState_Disabled;
+  else
+    m_dwDnState = bEnable ? CFWL_PartState_Normal : CFWL_PartState_Disabled;
+
   return FWL_Error::Succeeded;
 }
 
 FX_BOOL IFWL_SpinButton::IsButtonEnable(FX_BOOL bUp) {
-  if (bUp) {
+  if (bUp)
     return (m_dwUpState != CFWL_PartState_Disabled);
-  }
   return (m_dwDnState != CFWL_PartState_Disabled);
 }
 
@@ -146,9 +135,9 @@
   params.m_iPart = CFWL_Part::UpButton;
   params.m_pGraphics = pGraphics;
   params.m_dwStates = m_dwUpState + 1;
-  if (pMatrix) {
+  if (pMatrix)
     params.m_matrix.Concat(*pMatrix);
-  }
+
   params.m_rtPart = m_rtUpButton;
   pTheme->DrawBackground(&params);
 }
@@ -161,17 +150,14 @@
   params.m_iPart = CFWL_Part::DownButton;
   params.m_pGraphics = pGraphics;
   params.m_dwStates = m_dwDnState + 1;
-  if (pMatrix) {
+  if (pMatrix)
     params.m_matrix.Concat(*pMatrix);
-  }
+
   params.m_rtPart = m_rtDnButton;
   pTheme->DrawBackground(&params);
 }
 
-CFWL_SpinButtonImpDelegate::CFWL_SpinButtonImpDelegate(IFWL_SpinButton* pOwner)
-    : m_pOwner(pOwner) {}
-
-void CFWL_SpinButtonImpDelegate::OnProcessMessage(CFWL_Message* pMessage) {
+void IFWL_SpinButton::OnProcessMessage(CFWL_Message* pMessage) {
   if (!pMessage)
     return;
 
@@ -188,22 +174,18 @@
     case CFWL_MessageType::Mouse: {
       CFWL_MsgMouse* pMsg = static_cast<CFWL_MsgMouse*>(pMessage);
       switch (pMsg->m_dwCmd) {
-        case FWL_MouseCommand::LeftButtonDown: {
+        case FWL_MouseCommand::LeftButtonDown:
           OnLButtonDown(pMsg);
           break;
-        }
-        case FWL_MouseCommand::LeftButtonUp: {
+        case FWL_MouseCommand::LeftButtonUp:
           OnLButtonUp(pMsg);
           break;
-        }
-        case FWL_MouseCommand::Move: {
+        case FWL_MouseCommand::Move:
           OnMouseMove(pMsg);
           break;
-        }
-        case FWL_MouseCommand::Leave: {
+        case FWL_MouseCommand::Leave:
           OnMouseLeave(pMsg);
           break;
-        }
         default:
           break;
       }
@@ -215,192 +197,179 @@
         OnKeyDown(pKey);
       break;
     }
-    default: { break; }
+    default:
+      break;
   }
-  CFWL_WidgetImpDelegate::OnProcessMessage(pMessage);
+  IFWL_Widget::OnProcessMessage(pMessage);
 }
 
-void CFWL_SpinButtonImpDelegate::OnProcessEvent(CFWL_Event* pEvent) {}
-
-void CFWL_SpinButtonImpDelegate::OnDrawWidget(CFX_Graphics* pGraphics,
-                                              const CFX_Matrix* pMatrix) {
-  m_pOwner->DrawWidget(pGraphics, pMatrix);
+void IFWL_SpinButton::OnDrawWidget(CFX_Graphics* pGraphics,
+                                   const CFX_Matrix* pMatrix) {
+  DrawWidget(pGraphics, pMatrix);
 }
 
-void CFWL_SpinButtonImpDelegate::OnFocusChanged(CFWL_Message* pMsg,
-                                                FX_BOOL bSet) {
-  if (bSet) {
-    m_pOwner->m_pProperties->m_dwStates |= (FWL_WGTSTATE_Focused);
-  } else {
-    m_pOwner->m_pProperties->m_dwStates &= ~(FWL_WGTSTATE_Focused);
-  }
-  m_pOwner->Repaint(&m_pOwner->m_rtClient);
+void IFWL_SpinButton::OnFocusChanged(CFWL_Message* pMsg, FX_BOOL bSet) {
+  if (bSet)
+    m_pProperties->m_dwStates |= (FWL_WGTSTATE_Focused);
+  else
+    m_pProperties->m_dwStates &= ~(FWL_WGTSTATE_Focused);
+
+  Repaint(&m_rtClient);
 }
 
-void CFWL_SpinButtonImpDelegate::OnLButtonDown(CFWL_MsgMouse* pMsg) {
-  m_pOwner->m_bLButtonDwn = TRUE;
-  m_pOwner->SetGrab(TRUE);
-  m_pOwner->SetFocus(TRUE);
-  if (!m_pOwner->m_pProperties->m_pDataProvider)
+void IFWL_SpinButton::OnLButtonDown(CFWL_MsgMouse* pMsg) {
+  m_bLButtonDwn = TRUE;
+  SetGrab(TRUE);
+  SetFocus(TRUE);
+  if (!m_pProperties->m_pDataProvider)
     return;
-  FX_BOOL bUpPress = (m_pOwner->m_rtUpButton.Contains(pMsg->m_fx, pMsg->m_fy) &&
-                      m_pOwner->IsButtonEnable(TRUE));
-  FX_BOOL bDnPress = (m_pOwner->m_rtDnButton.Contains(pMsg->m_fx, pMsg->m_fy) &&
-                      m_pOwner->IsButtonEnable(FALSE));
-  if (!bUpPress && !bDnPress) {
+
+  FX_BOOL bUpPress =
+      (m_rtUpButton.Contains(pMsg->m_fx, pMsg->m_fy) && IsButtonEnable(TRUE));
+  FX_BOOL bDnPress =
+      (m_rtDnButton.Contains(pMsg->m_fx, pMsg->m_fy) && IsButtonEnable(FALSE));
+  if (!bUpPress && !bDnPress)
     return;
-  }
   if (bUpPress) {
-    m_pOwner->m_iButtonIndex = 0;
-    m_pOwner->m_dwUpState = CFWL_PartState_Pressed;
+    m_iButtonIndex = 0;
+    m_dwUpState = CFWL_PartState_Pressed;
   }
   if (bDnPress) {
-    m_pOwner->m_iButtonIndex = 1;
-    m_pOwner->m_dwDnState = CFWL_PartState_Pressed;
+    m_iButtonIndex = 1;
+    m_dwDnState = CFWL_PartState_Pressed;
   }
   CFWL_EvtSpbClick wmPosChanged;
-  wmPosChanged.m_pSrcTarget = m_pOwner;
+  wmPosChanged.m_pSrcTarget = this;
   wmPosChanged.m_bUp = bUpPress;
-  m_pOwner->DispatchEvent(&wmPosChanged);
-  m_pOwner->Repaint(bUpPress ? &m_pOwner->m_rtUpButton
-                             : &m_pOwner->m_rtDnButton);
-  m_pOwner->m_pTimerInfo = m_pOwner->m_Timer.StartTimer(kElapseTime, true);
+  DispatchEvent(&wmPosChanged);
+  Repaint(bUpPress ? &m_rtUpButton : &m_rtDnButton);
+  m_pTimerInfo = m_Timer.StartTimer(kElapseTime, true);
 }
 
-void CFWL_SpinButtonImpDelegate::OnLButtonUp(CFWL_MsgMouse* pMsg) {
-  if (m_pOwner->m_pProperties->m_dwStates & CFWL_PartState_Disabled) {
+void IFWL_SpinButton::OnLButtonUp(CFWL_MsgMouse* pMsg) {
+  if (m_pProperties->m_dwStates & CFWL_PartState_Disabled)
     return;
-  }
-  m_pOwner->m_bLButtonDwn = FALSE;
-  m_pOwner->SetGrab(FALSE);
-  m_pOwner->SetFocus(FALSE);
-  if (m_pOwner->m_pTimerInfo) {
-    m_pOwner->m_pTimerInfo->StopTimer();
-    m_pOwner->m_pTimerInfo = nullptr;
+
+  m_bLButtonDwn = FALSE;
+  SetGrab(FALSE);
+  SetFocus(FALSE);
+  if (m_pTimerInfo) {
+    m_pTimerInfo->StopTimer();
+    m_pTimerInfo = nullptr;
   }
   FX_BOOL bRepaint = FALSE;
   CFX_RectF rtInvalidate;
-  if (m_pOwner->m_dwUpState == CFWL_PartState_Pressed &&
-      m_pOwner->IsButtonEnable(TRUE)) {
-    m_pOwner->m_dwUpState = CFWL_PartState_Normal;
+  if (m_dwUpState == CFWL_PartState_Pressed && IsButtonEnable(TRUE)) {
+    m_dwUpState = CFWL_PartState_Normal;
     bRepaint = TRUE;
-    rtInvalidate = m_pOwner->m_rtUpButton;
-  } else if (m_pOwner->m_dwDnState == CFWL_PartState_Pressed &&
-             m_pOwner->IsButtonEnable(FALSE)) {
-    m_pOwner->m_dwDnState = CFWL_PartState_Normal;
+    rtInvalidate = m_rtUpButton;
+  } else if (m_dwDnState == CFWL_PartState_Pressed && IsButtonEnable(FALSE)) {
+    m_dwDnState = CFWL_PartState_Normal;
     bRepaint = TRUE;
-    rtInvalidate = m_pOwner->m_rtDnButton;
+    rtInvalidate = m_rtDnButton;
   }
-  if (bRepaint) {
-    m_pOwner->Repaint(&rtInvalidate);
-  }
+  if (bRepaint)
+    Repaint(&rtInvalidate);
 }
 
-void CFWL_SpinButtonImpDelegate::OnMouseMove(CFWL_MsgMouse* pMsg) {
-  if (!m_pOwner->m_pProperties->m_pDataProvider)
+void IFWL_SpinButton::OnMouseMove(CFWL_MsgMouse* pMsg) {
+  if (!m_pProperties->m_pDataProvider)
     return;
-  if (m_pOwner->m_bLButtonDwn) {
+  if (m_bLButtonDwn)
     return;
-  }
+
   FX_BOOL bRepaint = FALSE;
   CFX_RectF rtInvlidate;
   rtInvlidate.Reset();
-  if (m_pOwner->m_rtUpButton.Contains(pMsg->m_fx, pMsg->m_fy)) {
-    if (m_pOwner->IsButtonEnable(TRUE)) {
-      if (m_pOwner->m_dwUpState == CFWL_PartState_Hovered) {
-        m_pOwner->m_dwUpState = CFWL_PartState_Hovered;
+  if (m_rtUpButton.Contains(pMsg->m_fx, pMsg->m_fy)) {
+    if (IsButtonEnable(TRUE)) {
+      if (m_dwUpState == CFWL_PartState_Hovered) {
+        m_dwUpState = CFWL_PartState_Hovered;
         bRepaint = TRUE;
-        rtInvlidate = m_pOwner->m_rtUpButton;
+        rtInvlidate = m_rtUpButton;
       }
-      if (m_pOwner->m_dwDnState != CFWL_PartState_Normal &&
-          m_pOwner->IsButtonEnable(FALSE)) {
-        m_pOwner->m_dwDnState = CFWL_PartState_Normal;
-        if (bRepaint) {
-          rtInvlidate.Union(m_pOwner->m_rtDnButton);
-        } else {
-          rtInvlidate = m_pOwner->m_rtDnButton;
-        }
+      if (m_dwDnState != CFWL_PartState_Normal && IsButtonEnable(FALSE)) {
+        m_dwDnState = CFWL_PartState_Normal;
+        if (bRepaint)
+          rtInvlidate.Union(m_rtDnButton);
+        else
+          rtInvlidate = m_rtDnButton;
+
         bRepaint = TRUE;
       }
     }
-    if (!m_pOwner->IsButtonEnable(FALSE)) {
-      m_pOwner->EnableButton(FALSE, FALSE);
-    }
-  } else if (m_pOwner->m_rtDnButton.Contains(pMsg->m_fx, pMsg->m_fy)) {
-    if (m_pOwner->IsButtonEnable(FALSE)) {
-      if (m_pOwner->m_dwDnState != CFWL_PartState_Hovered) {
-        m_pOwner->m_dwDnState = CFWL_PartState_Hovered;
+    if (!IsButtonEnable(FALSE))
+      EnableButton(FALSE, FALSE);
+
+  } else if (m_rtDnButton.Contains(pMsg->m_fx, pMsg->m_fy)) {
+    if (IsButtonEnable(FALSE)) {
+      if (m_dwDnState != CFWL_PartState_Hovered) {
+        m_dwDnState = CFWL_PartState_Hovered;
         bRepaint = TRUE;
-        rtInvlidate = m_pOwner->m_rtDnButton;
+        rtInvlidate = m_rtDnButton;
       }
-      if (m_pOwner->m_dwUpState != CFWL_PartState_Normal &&
-          m_pOwner->IsButtonEnable(TRUE)) {
-        m_pOwner->m_dwUpState = CFWL_PartState_Normal;
-        if (bRepaint) {
-          rtInvlidate.Union(m_pOwner->m_rtUpButton);
-        } else {
-          rtInvlidate = m_pOwner->m_rtUpButton;
-        }
+      if (m_dwUpState != CFWL_PartState_Normal && IsButtonEnable(TRUE)) {
+        m_dwUpState = CFWL_PartState_Normal;
+        if (bRepaint)
+          rtInvlidate.Union(m_rtUpButton);
+        else
+          rtInvlidate = m_rtUpButton;
         bRepaint = TRUE;
       }
     }
-  } else if (m_pOwner->m_dwUpState != CFWL_PartState_Normal ||
-             m_pOwner->m_dwDnState != CFWL_PartState_Normal) {
-    if (m_pOwner->m_dwUpState != CFWL_PartState_Normal) {
-      m_pOwner->m_dwUpState = CFWL_PartState_Normal;
+  } else if (m_dwUpState != CFWL_PartState_Normal ||
+             m_dwDnState != CFWL_PartState_Normal) {
+    if (m_dwUpState != CFWL_PartState_Normal) {
+      m_dwUpState = CFWL_PartState_Normal;
       bRepaint = TRUE;
-      rtInvlidate = m_pOwner->m_rtUpButton;
+      rtInvlidate = m_rtUpButton;
     }
-    if (m_pOwner->m_dwDnState != CFWL_PartState_Normal) {
-      m_pOwner->m_dwDnState = CFWL_PartState_Normal;
-      if (bRepaint) {
-        rtInvlidate.Union(m_pOwner->m_rtDnButton);
-      } else {
-        rtInvlidate = m_pOwner->m_rtDnButton;
-      }
+    if (m_dwDnState != CFWL_PartState_Normal) {
+      m_dwDnState = CFWL_PartState_Normal;
+      if (bRepaint)
+        rtInvlidate.Union(m_rtDnButton);
+      else
+        rtInvlidate = m_rtDnButton;
+
       bRepaint = TRUE;
     }
   }
-  if (bRepaint) {
-    m_pOwner->Repaint(&rtInvlidate);
-  }
+  if (bRepaint)
+    Repaint(&rtInvlidate);
 }
 
-void CFWL_SpinButtonImpDelegate::OnMouseLeave(CFWL_MsgMouse* pMsg) {
+void IFWL_SpinButton::OnMouseLeave(CFWL_MsgMouse* pMsg) {
   if (!pMsg)
     return;
-  if (m_pOwner->m_dwUpState != CFWL_PartState_Normal &&
-      m_pOwner->IsButtonEnable(TRUE)) {
-    m_pOwner->m_dwUpState = CFWL_PartState_Normal;
-  }
-  if (m_pOwner->m_dwDnState != CFWL_PartState_Normal &&
-      m_pOwner->IsButtonEnable(FALSE)) {
-    m_pOwner->m_dwDnState = CFWL_PartState_Normal;
-  }
-  m_pOwner->Repaint(&m_pOwner->m_rtClient);
+  if (m_dwUpState != CFWL_PartState_Normal && IsButtonEnable(TRUE))
+    m_dwUpState = CFWL_PartState_Normal;
+  if (m_dwDnState != CFWL_PartState_Normal && IsButtonEnable(FALSE))
+    m_dwDnState = CFWL_PartState_Normal;
+
+  Repaint(&m_rtClient);
 }
 
-void CFWL_SpinButtonImpDelegate::OnKeyDown(CFWL_MsgKey* pMsg) {
-  if (!m_pOwner->m_pProperties->m_pDataProvider)
+void IFWL_SpinButton::OnKeyDown(CFWL_MsgKey* pMsg) {
+  if (!m_pProperties->m_pDataProvider)
     return;
+
   FX_BOOL bUp =
       pMsg->m_dwKeyCode == FWL_VKEY_Up || pMsg->m_dwKeyCode == FWL_VKEY_Left;
   FX_BOOL bDown =
       pMsg->m_dwKeyCode == FWL_VKEY_Down || pMsg->m_dwKeyCode == FWL_VKEY_Right;
-  if (!bUp && !bDown) {
+  if (!bUp && !bDown)
     return;
-  }
-  FX_BOOL bUpEnable = m_pOwner->IsButtonEnable(TRUE);
-  FX_BOOL bDownEnable = m_pOwner->IsButtonEnable(FALSE);
-  if (!bUpEnable && !bDownEnable) {
+
+  FX_BOOL bUpEnable = IsButtonEnable(TRUE);
+  FX_BOOL bDownEnable = IsButtonEnable(FALSE);
+  if (!bUpEnable && !bDownEnable)
     return;
-  }
+
   CFWL_EvtSpbClick wmPosChanged;
-  wmPosChanged.m_pSrcTarget = m_pOwner;
+  wmPosChanged.m_pSrcTarget = this;
   wmPosChanged.m_bUp = bUpEnable;
-  m_pOwner->DispatchEvent(&wmPosChanged);
-  m_pOwner->Repaint(bUpEnable ? &m_pOwner->m_rtUpButton
-                              : &m_pOwner->m_rtDnButton);
+  DispatchEvent(&wmPosChanged);
+  Repaint(bUpEnable ? &m_rtUpButton : &m_rtDnButton);
 }
 
 IFWL_SpinButton::Timer::Timer(IFWL_SpinButton* pToolTip)
diff --git a/xfa/fwl/core/ifwl_spinbutton.h b/xfa/fwl/core/ifwl_spinbutton.h
index 5bbd7fb..5a6b156 100644
--- a/xfa/fwl/core/ifwl_spinbutton.h
+++ b/xfa/fwl/core/ifwl_spinbutton.h
@@ -15,7 +15,6 @@
 #define FWL_STYLEEXE_SPB_Vert (1L << 0)
 
 class CFWL_MsgMouse;
-class CFWL_SpinButtonImpDelegate;
 class CFWL_WidgetImpProperties;
 
 FWL_EVENT_DEF(CFWL_EvtSpbClick, CFWL_EventType::Click, FX_BOOL m_bUp;)
@@ -33,13 +32,15 @@
   FWL_WidgetHit HitTest(FX_FLOAT fx, FX_FLOAT fy) override;
   FWL_Error DrawWidget(CFX_Graphics* pGraphics,
                        const CFX_Matrix* pMatrix = nullptr) override;
+  void OnProcessMessage(CFWL_Message* pMessage) override;
+  void OnProcessEvent(CFWL_Event* pEvent) override;
+  void OnDrawWidget(CFX_Graphics* pGraphics,
+                    const CFX_Matrix* pMatrix) override;
 
   FWL_Error EnableButton(FX_BOOL bEnable, FX_BOOL bUp = TRUE);
   FX_BOOL IsButtonEnable(FX_BOOL bUp = TRUE);
 
  protected:
-  friend class CFWL_SpinButtonImpDelegate;
-
   class Timer : public IFWL_Timer {
    public:
     explicit Timer(IFWL_SpinButton* pToolTip);
@@ -65,24 +66,14 @@
   FX_BOOL m_bLButtonDwn;
   IFWL_TimerInfo* m_pTimerInfo;
   IFWL_SpinButton::Timer m_Timer;
-};
 
-class CFWL_SpinButtonImpDelegate : public CFWL_WidgetImpDelegate {
- public:
-  CFWL_SpinButtonImpDelegate(IFWL_SpinButton* pOwner);
-  void OnProcessMessage(CFWL_Message* pMessage) override;
-  void OnProcessEvent(CFWL_Event* pEvent) override;
-  void OnDrawWidget(CFX_Graphics* pGraphics,
-                    const CFX_Matrix* pMatrix = nullptr) override;
-
- protected:
-  void OnFocusChanged(CFWL_Message* pMsg, FX_BOOL bSet = TRUE);
+ private:
+  void OnFocusChanged(CFWL_Message* pMsg, FX_BOOL bSet);
   void OnLButtonDown(CFWL_MsgMouse* pMsg);
   void OnLButtonUp(CFWL_MsgMouse* pMsg);
   void OnMouseMove(CFWL_MsgMouse* pMsg);
   void OnMouseLeave(CFWL_MsgMouse* pMsg);
   void OnKeyDown(CFWL_MsgKey* pMsg);
-  IFWL_SpinButton* m_pOwner;
 };
 
 #endif  // XFA_FWL_CORE_IFWL_SPINBUTTON_H_
diff --git a/xfa/fwl/core/ifwl_tooltip.cpp b/xfa/fwl/core/ifwl_tooltip.cpp
index 3717097..200cf7a 100644
--- a/xfa/fwl/core/ifwl_tooltip.cpp
+++ b/xfa/fwl/core/ifwl_tooltip.cpp
@@ -32,8 +32,6 @@
   m_rtAnchor.Set(0, 0, 0, 0);
   m_pProperties->m_dwStyles &= ~FWL_WGTSTYLE_Child;
   m_pProperties->m_dwStyles |= FWL_WGTSTYLE_Popup;
-
-  SetDelegate(pdfium::MakeUnique<CFWL_ToolTipImpDelegate>(this));
 }
 
 IFWL_ToolTip::~IFWL_ToolTip() {}
@@ -228,6 +226,11 @@
   }
 }
 
+void IFWL_ToolTip::OnDrawWidget(CFX_Graphics* pGraphics,
+                                const CFX_Matrix* pMatrix) {
+  DrawWidget(pGraphics, pMatrix);
+}
+
 IFWL_ToolTip::Timer::Timer(IFWL_ToolTip* pToolTip) : IFWL_Timer(pToolTip) {}
 
 void IFWL_ToolTip::Timer::Run(IFWL_TimerInfo* pTimerInfo) {
@@ -248,17 +251,3 @@
     pToolTip->m_pTimerInfoHide = nullptr;
   }
 }
-
-CFWL_ToolTipImpDelegate::CFWL_ToolTipImpDelegate(IFWL_ToolTip* pOwner)
-    : m_pOwner(pOwner) {}
-
-void CFWL_ToolTipImpDelegate::OnProcessMessage(CFWL_Message* pMessage) {
-  CFWL_WidgetImpDelegate::OnProcessMessage(pMessage);
-}
-
-void CFWL_ToolTipImpDelegate::OnProcessEvent(CFWL_Event* pEvent) {}
-
-void CFWL_ToolTipImpDelegate::OnDrawWidget(CFX_Graphics* pGraphics,
-                                           const CFX_Matrix* pMatrix) {
-  m_pOwner->DrawWidget(pGraphics, pMatrix);
-}
diff --git a/xfa/fwl/core/ifwl_tooltip.h b/xfa/fwl/core/ifwl_tooltip.h
index 63708a7..0293759 100644
--- a/xfa/fwl/core/ifwl_tooltip.h
+++ b/xfa/fwl/core/ifwl_tooltip.h
@@ -47,14 +47,14 @@
                        const CFX_Matrix* pMatrix = nullptr) override;
   void SetStates(uint32_t dwStates, FX_BOOL bSet) override;
   FWL_Error GetClientRect(CFX_RectF& rect) override;
+  void OnDrawWidget(CFX_Graphics* pGraphics,
+                    const CFX_Matrix* pMatrix) override;
 
   void SetAnchor(const CFX_RectF& rtAnchor);
   void Show();
   void Hide();
 
  protected:
-  friend class CFWL_ToolTipImpDelegate;
-
   class Timer : public IFWL_Timer {
    public:
     explicit Timer(IFWL_ToolTip* pToolTip);
@@ -83,24 +83,14 @@
   IFWL_TimerInfo* m_pTimerInfoHide;
   IFWL_ToolTip::Timer m_TimerShow;
   IFWL_ToolTip::Timer m_TimerHide;
-};
 
-class CFWL_ToolTipImpDelegate : public CFWL_WidgetImpDelegate {
- public:
-  CFWL_ToolTipImpDelegate(IFWL_ToolTip* pOwner);
-  void OnProcessMessage(CFWL_Message* pMessage) override;
-  void OnProcessEvent(CFWL_Event* pEvent) override;
-  void OnDrawWidget(CFX_Graphics* pGraphics,
-                    const CFX_Matrix* pMatrix = nullptr) override;
-
- protected:
-  void OnFocusChanged(CFWL_Message* pMsg, FX_BOOL bSet = TRUE);
+ private:
+  void OnFocusChanged(CFWL_Message* pMsg, FX_BOOL bSet);
   void OnLButtonDown(CFWL_MsgMouse* pMsg);
   void OnLButtonUp(CFWL_MsgMouse* pMsg);
   void OnMouseMove(CFWL_MsgMouse* pMsg);
   void OnMouseLeave(CFWL_MsgMouse* pMsg);
   void OnKeyDown(CFWL_MsgKey* pMsg);
-  IFWL_ToolTip* m_pOwner;
 };
 
 #endif  // XFA_FWL_CORE_IFWL_TOOLTIP_H_
diff --git a/xfa/fwl/core/ifwl_widget.cpp b/xfa/fwl/core/ifwl_widget.cpp
index 961c024..f57d0a1 100644
--- a/xfa/fwl/core/ifwl_widget.cpp
+++ b/xfa/fwl/core/ifwl_widget.cpp
@@ -30,12 +30,12 @@
     : m_pOwnerApp(app),
       m_pWidgetMgr(app->GetWidgetMgr()),
       m_pProperties(new CFWL_WidgetImpProperties(properties)),
-      m_pCurDelegate(nullptr),
       m_pOuter(pOuter),
       m_pLayoutItem(nullptr),
       m_pAssociate(nullptr),
       m_iLock(0),
-      m_nEventKey(0) {
+      m_nEventKey(0),
+      m_pDelegate(nullptr) {
   ASSERT(m_pWidgetMgr);
 
   IFWL_Widget* pParent = m_pProperties->m_pParent;
@@ -97,7 +97,7 @@
       ev.m_rtOld = rtOld;
       ev.m_rtNew = rect;
 
-      if (IFWL_WidgetDelegate* pDelegate = GetCurrentDelegate())
+      if (IFWL_WidgetDelegate* pDelegate = GetDelegate())
         pDelegate->OnProcessEvent(&ev);
     }
     return FWL_Error::Succeeded;
@@ -348,16 +348,6 @@
   return FWL_Error::Succeeded;
 }
 
-IFWL_WidgetDelegate* IFWL_Widget::GetCurrentDelegate() {
-  if (!m_pCurDelegate)
-    m_pCurDelegate = m_pDelegate.get();
-  return m_pCurDelegate;
-}
-
-void IFWL_Widget::SetCurrentDelegate(IFWL_WidgetDelegate* pDelegate) {
-  m_pCurDelegate = pDelegate;
-}
-
 const IFWL_App* IFWL_Widget::GetOwnerApp() const {
   return m_pOwnerApp;
 }
@@ -720,7 +710,7 @@
 
 void IFWL_Widget::DispatchEvent(CFWL_Event* pEvent) {
   if (m_pOuter) {
-    m_pOuter->GetCurrentDelegate()->OnProcessEvent(pEvent);
+    m_pOuter->GetDelegate()->OnProcessEvent(pEvent);
     return;
   }
   const IFWL_App* pApp = GetOwnerApp();
@@ -838,9 +828,7 @@
   return FALSE;
 }
 
-CFWL_WidgetImpDelegate::CFWL_WidgetImpDelegate() {}
-
-void CFWL_WidgetImpDelegate::OnProcessMessage(CFWL_Message* pMessage) {
+void IFWL_Widget::OnProcessMessage(CFWL_Message* pMessage) {
   if (!pMessage->m_pDstTarget)
     return;
 
@@ -908,10 +896,7 @@
   }
 }
 
-void CFWL_WidgetImpDelegate::OnProcessEvent(CFWL_Event* pEvent) {}
+void IFWL_Widget::OnProcessEvent(CFWL_Event* pEvent) {}
 
-void CFWL_WidgetImpDelegate::OnDrawWidget(CFX_Graphics* pGraphics,
-                                          const CFX_Matrix* pMatrix) {
-  CFWL_EvtDraw evt;
-  evt.m_pGraphics = pGraphics;
-}
+void IFWL_Widget::OnDrawWidget(CFX_Graphics* pGraphics,
+                               const CFX_Matrix* pMatrix) {}
diff --git a/xfa/fwl/core/ifwl_widget.h b/xfa/fwl/core/ifwl_widget.h
index 264ff67..0c8cef1 100644
--- a/xfa/fwl/core/ifwl_widget.h
+++ b/xfa/fwl/core/ifwl_widget.h
@@ -62,9 +62,9 @@
 class IFWL_Widget;
 enum class FWL_Type;
 
-class IFWL_Widget {
+class IFWL_Widget : public IFWL_WidgetDelegate {
  public:
-  virtual ~IFWL_Widget();
+  ~IFWL_Widget() override;
 
   virtual FWL_Type GetClassID() const = 0;
   virtual FX_BOOL IsInstance(const CFX_WideStringC& wsClass) const;
@@ -112,8 +112,19 @@
   virtual IFWL_ThemeProvider* GetThemeProvider();
   virtual FWL_Error SetThemeProvider(IFWL_ThemeProvider* pThemeProvider);
 
-  IFWL_WidgetDelegate* GetCurrentDelegate();
-  void SetCurrentDelegate(IFWL_WidgetDelegate* pDelegate);
+  void SetDelegate(IFWL_WidgetDelegate* delegate) { m_pDelegate = delegate; }
+  IFWL_WidgetDelegate* GetDelegate() {
+    return m_pDelegate ? m_pDelegate : this;
+  }
+  const IFWL_WidgetDelegate* GetDelegate() const {
+    return m_pDelegate ? m_pDelegate : this;
+  }
+
+  // IFWL_WidgetDelegate.
+  void OnProcessMessage(CFWL_Message* pMessage) override;
+  void OnProcessEvent(CFWL_Event* pEvent) override;
+  void OnDrawWidget(CFX_Graphics* pGraphics,
+                    const CFX_Matrix* pMatrix = nullptr) override;
 
   const IFWL_App* GetOwnerApp() const;
 
@@ -127,6 +138,9 @@
 
   void SetAssociateWidget(CFWL_Widget* pAssociate);
 
+  void SetFocus(FX_BOOL bFocus);
+  void Repaint(const CFX_RectF* pRect = nullptr);
+
  protected:
   friend class CFWL_WidgetImpDelegate;
 
@@ -160,7 +174,6 @@
                     uint32_t dwTTOStyles,
                     int32_t iTTOAlign,
                     CFX_RectF& rect);
-  void SetFocus(FX_BOOL bFocus);
   void SetGrab(FX_BOOL bSet);
   FX_BOOL GetPopupPos(FX_FLOAT fMinHeight,
                       FX_FLOAT fMaxHeight,
@@ -184,7 +197,6 @@
   void UnregisterEventTarget();
   void DispatchKeyEvent(CFWL_MsgKey* pNote);
   void DispatchEvent(CFWL_Event* pEvent);
-  void Repaint(const CFX_RectF* pRect = nullptr);
   void DrawBackground(CFX_Graphics* pGraphics,
                       CFWL_Part iPartBk,
                       IFWL_ThemeProvider* pTheme,
@@ -201,15 +213,9 @@
 
   FX_BOOL IsParent(IFWL_Widget* pParent);
 
-  void SetDelegate(std::unique_ptr<IFWL_WidgetDelegate> delegate) {
-    m_pDelegate = std::move(delegate);
-  }
-  IFWL_WidgetDelegate* GetDelegate() const { return m_pDelegate.get(); }
-
   const IFWL_App* const m_pOwnerApp;
   CFWL_WidgetMgr* const m_pWidgetMgr;
   std::unique_ptr<CFWL_WidgetImpProperties> m_pProperties;
-  IFWL_WidgetDelegate* m_pCurDelegate;  // Not owned.
   IFWL_Widget* m_pOuter;
   void* m_pLayoutItem;
   CFWL_Widget* m_pAssociate;
@@ -217,17 +223,7 @@
   uint32_t m_nEventKey;
 
  private:
-  std::unique_ptr<IFWL_WidgetDelegate> m_pDelegate;
-};
-
-class CFWL_WidgetImpDelegate : public IFWL_WidgetDelegate {
- public:
-  CFWL_WidgetImpDelegate();
-  ~CFWL_WidgetImpDelegate() override {}
-  void OnProcessMessage(CFWL_Message* pMessage) override;
-  void OnProcessEvent(CFWL_Event* pEvent) override;
-  void OnDrawWidget(CFX_Graphics* pGraphics,
-                    const CFX_Matrix* pMatrix = nullptr) override;
+  IFWL_WidgetDelegate* m_pDelegate;  // Not owned.
 };
 
 #endif  // XFA_FWL_CORE_IFWL_WIDGET_H_
diff --git a/xfa/fxfa/app/xfa_ffbarcode.cpp b/xfa/fxfa/app/xfa_ffbarcode.cpp
index cd172c5..181b3be 100644
--- a/xfa/fxfa/app/xfa_ffbarcode.cpp
+++ b/xfa/fxfa/app/xfa_ffbarcode.cpp
@@ -132,8 +132,8 @@
   CFWL_NoteDriver* pNoteDriver = pWidget->GetOwnerApp()->GetNoteDriver();
   pNoteDriver->RegisterEventTarget(pWidget, pWidget);
 
-  m_pOldDelegate = m_pNormalWidget->GetCurrentDelegate();
-  m_pNormalWidget->SetCurrentDelegate(this);
+  m_pOldDelegate = m_pNormalWidget->GetDelegate();
+  m_pNormalWidget->SetDelegate(this);
   m_pNormalWidget->LockUpdate();
 
   CFX_WideString wsText;
diff --git a/xfa/fxfa/app/xfa_ffcheckbutton.cpp b/xfa/fxfa/app/xfa_ffcheckbutton.cpp
index 9dfb12f..9365ccf 100644
--- a/xfa/fxfa/app/xfa_ffcheckbutton.cpp
+++ b/xfa/fxfa/app/xfa_ffcheckbutton.cpp
@@ -36,8 +36,8 @@
   CFWL_NoteDriver* pNoteDriver = pWidget->GetOwnerApp()->GetNoteDriver();
   pNoteDriver->RegisterEventTarget(pWidget, pWidget);
 
-  m_pOldDelegate = m_pNormalWidget->GetCurrentDelegate();
-  m_pNormalWidget->SetCurrentDelegate(this);
+  m_pOldDelegate = m_pNormalWidget->GetDelegate();
+  m_pNormalWidget->SetDelegate(this);
 
   if (m_pDataAcc->IsRadioButton())
     pCheckBox->ModifyStylesEx(FWL_STYLEEXT_CKB_RadioButton, 0xFFFFFFFF);
diff --git a/xfa/fxfa/app/xfa_ffchoicelist.cpp b/xfa/fxfa/app/xfa_ffchoicelist.cpp
index 06bbc38..1575889 100644
--- a/xfa/fxfa/app/xfa_ffchoicelist.cpp
+++ b/xfa/fxfa/app/xfa_ffchoicelist.cpp
@@ -43,8 +43,8 @@
   CFWL_NoteDriver* pNoteDriver = pWidget->GetOwnerApp()->GetNoteDriver();
   pNoteDriver->RegisterEventTarget(pWidget, pWidget);
 
-  m_pOldDelegate = m_pNormalWidget->GetCurrentDelegate();
-  m_pNormalWidget->SetCurrentDelegate(this);
+  m_pOldDelegate = m_pNormalWidget->GetDelegate();
+  m_pNormalWidget->SetDelegate(this);
   m_pNormalWidget->LockUpdate();
 
   CFX_WideStringArray wsLabelArray;
@@ -242,8 +242,8 @@
   CFWL_NoteDriver* pNoteDriver = pWidget->GetOwnerApp()->GetNoteDriver();
   pNoteDriver->RegisterEventTarget(pWidget, pWidget);
 
-  m_pOldDelegate = m_pNormalWidget->GetCurrentDelegate();
-  m_pNormalWidget->SetCurrentDelegate(this);
+  m_pOldDelegate = m_pNormalWidget->GetDelegate();
+  m_pNormalWidget->SetDelegate(this);
   m_pNormalWidget->LockUpdate();
 
   CFX_WideStringArray wsLabelArray;
diff --git a/xfa/fxfa/app/xfa_ffimageedit.cpp b/xfa/fxfa/app/xfa_ffimageedit.cpp
index 9e29119..4b77ccf 100644
--- a/xfa/fxfa/app/xfa_ffimageedit.cpp
+++ b/xfa/fxfa/app/xfa_ffimageedit.cpp
@@ -32,8 +32,8 @@
   CFWL_NoteDriver* pNoteDriver = pWidget->GetOwnerApp()->GetNoteDriver();
   pNoteDriver->RegisterEventTarget(pWidget, pWidget);
 
-  m_pOldDelegate = pPictureBox->GetCurrentDelegate();
-  pPictureBox->SetCurrentDelegate(this);
+  m_pOldDelegate = pPictureBox->GetDelegate();
+  pPictureBox->SetDelegate(this);
 
   CXFA_FFField::LoadWidget();
   if (m_pDataAcc->GetImageEditImage()) {
diff --git a/xfa/fxfa/app/xfa_ffpushbutton.cpp b/xfa/fxfa/app/xfa_ffpushbutton.cpp
index e648581..2439eae 100644
--- a/xfa/fxfa/app/xfa_ffpushbutton.cpp
+++ b/xfa/fxfa/app/xfa_ffpushbutton.cpp
@@ -55,8 +55,8 @@
   CFWL_PushButton* pPushButton = new CFWL_PushButton(GetFWLApp());
   pPushButton->Initialize();
 
-  m_pOldDelegate = pPushButton->GetCurrentDelegate();
-  pPushButton->SetCurrentDelegate(this);
+  m_pOldDelegate = pPushButton->GetDelegate();
+  pPushButton->SetDelegate(this);
 
   m_pNormalWidget = pPushButton;
   m_pNormalWidget->SetLayoutItem(this);
diff --git a/xfa/fxfa/app/xfa_fftextedit.cpp b/xfa/fxfa/app/xfa_fftextedit.cpp
index e268f1c..ffbcac1 100644
--- a/xfa/fxfa/app/xfa_fftextedit.cpp
+++ b/xfa/fxfa/app/xfa_fftextedit.cpp
@@ -46,8 +46,8 @@
   CFWL_NoteDriver* pNoteDriver = pWidget->GetOwnerApp()->GetNoteDriver();
   pNoteDriver->RegisterEventTarget(pWidget, pWidget);
 
-  m_pOldDelegate = m_pNormalWidget->GetCurrentDelegate();
-  m_pNormalWidget->SetCurrentDelegate(this);
+  m_pOldDelegate = m_pNormalWidget->GetDelegate();
+  m_pNormalWidget->SetDelegate(this);
   m_pNormalWidget->LockUpdate();
 
   UpdateWidgetProperty();
@@ -451,8 +451,8 @@
   CFWL_NoteDriver* pNoteDriver = pIWidget->GetOwnerApp()->GetNoteDriver();
   pNoteDriver->RegisterEventTarget(pIWidget, pIWidget);
 
-  m_pOldDelegate = m_pNormalWidget->GetCurrentDelegate();
-  m_pNormalWidget->SetCurrentDelegate(this);
+  m_pOldDelegate = m_pNormalWidget->GetDelegate();
+  m_pNormalWidget->SetDelegate(this);
   m_pNormalWidget->LockUpdate();
 
   CFX_WideString wsText;
@@ -531,8 +531,8 @@
   CFWL_NoteDriver* pNoteDriver = pIWidget->GetOwnerApp()->GetNoteDriver();
   pNoteDriver->RegisterEventTarget(pIWidget, pIWidget);
 
-  m_pOldDelegate = m_pNormalWidget->GetCurrentDelegate();
-  m_pNormalWidget->SetCurrentDelegate(this);
+  m_pOldDelegate = m_pNormalWidget->GetDelegate();
+  m_pNormalWidget->SetDelegate(this);
   m_pNormalWidget->LockUpdate();
 
   CFX_WideString wsText;
@@ -600,8 +600,8 @@
   CFWL_NoteDriver* pNoteDriver = pIWidget->GetOwnerApp()->GetNoteDriver();
   pNoteDriver->RegisterEventTarget(pIWidget, pIWidget);
 
-  m_pOldDelegate = m_pNormalWidget->GetCurrentDelegate();
-  m_pNormalWidget->SetCurrentDelegate(this);
+  m_pOldDelegate = m_pNormalWidget->GetDelegate();
+  m_pNormalWidget->SetDelegate(this);
   m_pNormalWidget->LockUpdate();
 
   CFX_WideString wsText;