diff --git a/BUILD.gn b/BUILD.gn
index 7614dad..10fe5df 100644
--- a/BUILD.gn
+++ b/BUILD.gn
@@ -1051,7 +1051,6 @@
       "xfa/fwl/core/ifwl_form.h",
       "xfa/fwl/core/ifwl_themeprovider.h",
       "xfa/fwl/core/ifwl_timer.h",
-      "xfa/fwl/core/ifwl_tooltiptarget.h",
       "xfa/fwl/core/ifwl_widget.h",
       "xfa/fwl/core/ifwl_widgetdelegate.h",
       "xfa/fwl/core/include/fwl_widgethit.h",
diff --git a/xfa.gyp b/xfa.gyp
index 7cf0cf7..6a0d562 100644
--- a/xfa.gyp
+++ b/xfa.gyp
@@ -198,7 +198,6 @@
         "xfa/fwl/core/ifwl_form.h",
         "xfa/fwl/core/ifwl_themeprovider.h",
         "xfa/fwl/core/ifwl_timer.h",
-        "xfa/fwl/core/ifwl_tooltiptarget.h",
         "xfa/fwl/core/ifwl_widget.h",
         "xfa/fwl/core/ifwl_widgetdelegate.h",
         "xfa/fwl/core/include/fwl_widgethit.h",
diff --git a/xfa/fwl/basewidget/fwl_tooltipctrlimp.cpp b/xfa/fwl/basewidget/fwl_tooltipctrlimp.cpp
index e09113e..85af738 100644
--- a/xfa/fwl/basewidget/fwl_tooltipctrlimp.cpp
+++ b/xfa/fwl/basewidget/fwl_tooltipctrlimp.cpp
@@ -15,7 +15,6 @@
 #include "xfa/fwl/core/fwl_noteimp.h"
 #include "xfa/fwl/core/fwl_widgetimp.h"
 #include "xfa/fwl/core/ifwl_themeprovider.h"
-#include "xfa/fwl/core/ifwl_tooltiptarget.h"
 #include "xfa/fwl/theme/cfwl_widgettp.h"
 
 // static
@@ -142,22 +141,18 @@
   rect.Deflate(x, t, x, y);
   return FWL_Error::Succeeded;
 }
+
 FWL_Error CFWL_ToolTipImp::DrawWidget(CFX_Graphics* pGraphics,
                                       const CFX_Matrix* pMatrix) {
-  IFWL_ToolTipTarget* toolTipTarget =
-      CFWL_ToolTipContainer::getInstance()->GetCurrentToolTipTarget();
-  if (toolTipTarget && !toolTipTarget->UseDefaultTheme()) {
-    return toolTipTarget->DrawToolTip(pGraphics, pMatrix, m_pInterface);
-  }
-  if (!pGraphics)
+  if (!pGraphics || !m_pProperties->m_pThemeProvider)
     return FWL_Error::Indefinite;
-  if (!m_pProperties->m_pThemeProvider)
-    return FWL_Error::Indefinite;
+
   IFWL_ThemeProvider* pTheme = m_pProperties->m_pThemeProvider;
   DrawBkground(pGraphics, pTheme, pMatrix);
   DrawText(pGraphics, pTheme, pMatrix);
   return FWL_Error::Succeeded;
 }
+
 void CFWL_ToolTipImp::DrawBkground(CFX_Graphics* pGraphics,
                                    IFWL_ThemeProvider* pTheme,
                                    const CFX_Matrix* pMatrix) {
diff --git a/xfa/fwl/core/fwl_noteimp.cpp b/xfa/fwl/core/fwl_noteimp.cpp
index cc5ff8d..f115e2f 100644
--- a/xfa/fwl/core/fwl_noteimp.cpp
+++ b/xfa/fwl/core/fwl_noteimp.cpp
@@ -16,7 +16,6 @@
 #include "xfa/fwl/core/fwl_formimp.h"
 #include "xfa/fwl/core/fwl_widgetimp.h"
 #include "xfa/fwl/core/ifwl_app.h"
-#include "xfa/fwl/core/ifwl_tooltiptarget.h"
 
 CFWL_NoteLoop::CFWL_NoteLoop(CFWL_WidgetImp* pForm)
     : m_pForm(pForm), m_bContinueModal(TRUE) {}
@@ -81,20 +80,7 @@
 void CFWL_NoteDriver::SendEvent(CFWL_Event* pNote) {
   if (m_eventTargets.empty())
     return;
-  if (CFWL_EventType::Mouse == pNote->GetClassID()) {
-    CFWL_EvtMouse* pMouse = static_cast<CFWL_EvtMouse*>(pNote);
-    if (FWL_MouseCommand::Hover == pMouse->m_dwCmd) {
-      if (m_pNoteLoop->GetForm()) {
-        CFWL_ToolTipContainer::getInstance()->ProcessEnter(
-            pMouse, m_pNoteLoop->GetForm()->GetInterface());
-      }
-    } else if (FWL_MouseCommand::Leave == pMouse->m_dwCmd) {
-      CFWL_ToolTipContainer::getInstance()->ProcessLeave(pMouse);
-    } else if ((FWL_MouseCommand::LeftButtonDown <= pMouse->m_dwCmd) &&
-               (FWL_MouseCommand::MiddleButtonDblClk >= pMouse->m_dwCmd)) {
-      CFWL_ToolTipContainer::getInstance()->ProcessLeave(pMouse);
-    }
-  }
+
   for (const auto& pair : m_eventTargets) {
     CFWL_EventTarget* pEventTarget = pair.second;
     if (pEventTarget && !pEventTarget->IsInvalid())
@@ -787,8 +773,7 @@
 
 CFWL_ToolTipContainer* CFWL_ToolTipContainer::s_pInstance = nullptr;
 
-CFWL_ToolTipContainer::CFWL_ToolTipContainer()
-    : pCurTarget(nullptr), m_pToolTipImp(nullptr) {
+CFWL_ToolTipContainer::CFWL_ToolTipContainer() : m_pToolTipImp(nullptr) {
   m_ToolTipDp = new CFWL_CoreToolTipDP;
   m_ToolTipDp->m_nInitDelayTime = 0;
   m_ToolTipDp->m_nAutoPopDelayTime = 2000;
@@ -815,97 +800,3 @@
   delete s_pInstance;
   s_pInstance = nullptr;
 }
-
-FWL_Error CFWL_ToolTipContainer::AddToolTipTarget(IFWL_ToolTipTarget* pTarget) {
-  if (m_arrWidget.Find(pTarget) < 0) {
-    m_arrWidget.Add(pTarget);
-    return FWL_Error::Succeeded;
-  }
-  return FWL_Error::Indefinite;
-}
-FWL_Error CFWL_ToolTipContainer::RemoveToolTipTarget(
-    IFWL_ToolTipTarget* pTarget) {
-  int index = m_arrWidget.Find(pTarget);
-  if (index >= 0) {
-    m_arrWidget.RemoveAt(index);
-    return FWL_Error::Succeeded;
-  }
-  return FWL_Error::Indefinite;
-}
-FX_BOOL CFWL_ToolTipContainer::HasToolTip(IFWL_Widget* pWedget) {
-  int32_t iCount = m_arrWidget.GetSize();
-  for (int32_t i = 0; i < iCount; i++) {
-    IFWL_ToolTipTarget* p = m_arrWidget[i];
-    if (p->GetWidget() == pWedget) {
-      pCurTarget = p;
-      return TRUE;
-    }
-  }
-  return FALSE;
-}
-FX_BOOL CFWL_ToolTipContainer::ProcessEnter(CFWL_EvtMouse* pEvt,
-                                            IFWL_Widget* pOwner) {
-  if (HasToolTip(pEvt->m_pDstTarget)) {
-    if (!m_pToolTipImp) {
-      CFWL_WidgetImpProperties prop;
-      prop.m_pDataProvider = m_ToolTipDp;
-      prop.m_pOwner = pOwner;
-      CFX_RectF rtTooltip;
-      rtTooltip.Set(150, 150, 100, 50);
-      prop.m_rtWidget = rtTooltip;
-      IFWL_ToolTip* pToolTip = IFWL_ToolTip::Create(prop, nullptr);
-      pToolTip->Initialize();
-      m_pToolTipImp = static_cast<CFWL_ToolTipImp*>(pToolTip->GetImpl());
-      m_pToolTipImp->ModifyStylesEx(FWL_STYLEEXT_TTP_Multiline, 0);
-      m_pToolTipImp->SetStates(FWL_WGTSTATE_Invisible, TRUE);
-    }
-    if (pCurTarget->IsShowed()) {
-      CFX_WideString wsCaption;
-      pCurTarget->GetCaption(wsCaption);
-      if (!wsCaption.IsEmpty()) {
-        m_ToolTipDp->m_wsCaption = wsCaption;
-      }
-      CFX_RectF rt;
-      CFX_SizeF sz;
-      pCurTarget->GetToolTipSize(sz);
-      if (sz.x > 0 && sz.y > 0) {
-        rt.width = sz.x;
-        rt.height = sz.y;
-      } else {
-        CFX_RectF r;
-        m_pToolTipImp->GetWidgetRect(r, TRUE);
-        rt.width = r.width;
-        rt.height = r.height;
-      }
-      CFX_PointF pt(pEvt->m_fx, pEvt->m_fy);
-      if (pCurTarget->GetToolTipPos(pt) == FWL_Error::Succeeded) {
-        rt.left = pt.x;
-        rt.top = pt.y;
-        m_pToolTipImp->ModifyStylesEx(FWL_STYLEEXT_TTP_NoAnchor, 0);
-      } else {
-        CFX_RectF rtAnchor;
-        pCurTarget->GetWidget()->GetClientRect(rtAnchor);
-        pCurTarget->GetWidget()->TransformTo(nullptr, rtAnchor.left,
-                                             rtAnchor.top);
-        m_pToolTipImp->SetAnchor(rtAnchor);
-        m_pToolTipImp->ModifyStylesEx(0, FWL_STYLEEXT_TTP_NoAnchor);
-      }
-      m_pToolTipImp->SetWidgetRect(rt);
-      m_pToolTipImp->Update();
-      m_pToolTipImp->Show();
-    }
-    return TRUE;
-  }
-  return FALSE;
-}
-FX_BOOL CFWL_ToolTipContainer::ProcessLeave(CFWL_EvtMouse* pEvt) {
-  if (HasToolTip(pEvt->m_pDstTarget) && m_pToolTipImp) {
-    m_pToolTipImp->Hide();
-    pCurTarget = nullptr;
-    return TRUE;
-  }
-  return FALSE;
-}
-IFWL_ToolTipTarget* CFWL_ToolTipContainer::GetCurrentToolTipTarget() {
-  return pCurTarget;
-}
diff --git a/xfa/fwl/core/fwl_noteimp.h b/xfa/fwl/core/fwl_noteimp.h
index eb922f9..c92395a 100644
--- a/xfa/fwl/core/fwl_noteimp.h
+++ b/xfa/fwl/core/fwl_noteimp.h
@@ -40,7 +40,6 @@
 class CFWL_TargetImp;
 class CFWL_ToolTipImp;
 class CFWL_WidgetImp;
-class IFWL_ToolTipTarget;
 
 class CFWL_NoteLoop {
  public:
@@ -138,28 +137,17 @@
   FX_BOOL m_bInvalid;
 };
 
-class CFWL_ToolTipContainer {
+class CFWL_ToolTipContainer final {
  public:
   static CFWL_ToolTipContainer* getInstance();
   static void DeleteInstance();
 
-  FWL_Error AddToolTipTarget(IFWL_ToolTipTarget* pTarget);
-  FWL_Error RemoveToolTipTarget(IFWL_ToolTipTarget* pTarget);
-  IFWL_ToolTipTarget* GetCurrentToolTipTarget();
-
-  FX_BOOL HasToolTip(IFWL_Widget* pWidget);
-
-  FX_BOOL ProcessEnter(CFWL_EvtMouse* pEvt, IFWL_Widget* pOwner);
-  FX_BOOL ProcessLeave(CFWL_EvtMouse* pEvt);
-
  protected:
   CFWL_ToolTipContainer();
-  virtual ~CFWL_ToolTipContainer();
+  ~CFWL_ToolTipContainer();
 
-  IFWL_ToolTipTarget* pCurTarget;
   CFWL_ToolTipImp* m_pToolTipImp;
   CFWL_CoreToolTipDP* m_ToolTipDp;
-  CFX_ArrayTemplate<IFWL_ToolTipTarget*> m_arrWidget;
 
  private:
   static CFWL_ToolTipContainer* s_pInstance;
diff --git a/xfa/fwl/core/ifwl_tooltiptarget.h b/xfa/fwl/core/ifwl_tooltiptarget.h
deleted file mode 100644
index c6a47d0..0000000
--- a/xfa/fwl/core/ifwl_tooltiptarget.h
+++ /dev/null
@@ -1,36 +0,0 @@
-// 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_TOOLTIPTARGET_H_
-#define XFA_FWL_CORE_IFWL_TOOLTIPTARGET_H_
-
-#include "core/fxcrt/include/fx_coordinates.h"
-#include "core/fxcrt/include/fx_string.h"
-#include "core/fxcrt/include/fx_system.h"
-#include "xfa/fwl/core/fwl_error.h"
-
-class CFX_Graphics;
-class IFWL_Widget;
-
-class IFWL_ToolTipTarget {
- public:
-  virtual ~IFWL_ToolTipTarget() {}
-  virtual IFWL_Widget* GetWidget() = 0;
-  virtual FX_BOOL IsShowed() = 0;
-  virtual FWL_Error DrawToolTip(CFX_Graphics* pGraphics,
-                                const CFX_Matrix* pMatrix,
-                                IFWL_Widget* pToolTip) = 0;
-  virtual FX_BOOL UseDefaultTheme() = 0;
-  virtual FWL_Error GetCaption(CFX_WideString& wsCaption) = 0;
-  virtual FWL_Error GetToolTipSize(CFX_SizeF& sz) = 0;
-  virtual FWL_Error GetToolTipPos(CFX_PointF& pt);
-};
-
-inline FWL_Error GetToolTipPos(CFX_PointF& pt) {
-  return FWL_Error::Indefinite;
-}
-
-#endif  // XFA_FWL_CORE_IFWL_TOOLTIPTARGET_H_
