diff --git a/fpdfsdk/cpdfsdk_widgethandler.cpp b/fpdfsdk/cpdfsdk_widgethandler.cpp
index 62ab33a..1be5b62 100644
--- a/fpdfsdk/cpdfsdk_widgethandler.cpp
+++ b/fpdfsdk/cpdfsdk_widgethandler.cpp
@@ -19,6 +19,7 @@
 #include "fpdfsdk/cpdfsdk_pageview.h"
 #include "fpdfsdk/cpdfsdk_widget.h"
 #include "fpdfsdk/formfiller/cffl_formfield.h"
+#include "fpdfsdk/formfiller/cffl_interactiveformfiller.h"
 #include "third_party/base/check.h"
 #include "third_party/base/check_op.h"
 #include "third_party/base/containers/contains.h"
@@ -30,7 +31,6 @@
 void CPDFSDK_WidgetHandler::SetFormFillEnvironment(
     CPDFSDK_FormFillEnvironment* pFormFillEnv) {
   m_pFormFillEnv = pFormFillEnv;
-  m_pInteractiveFormFiller = m_pFormFillEnv->GetInteractiveFormFiller();
 }
 
 bool CPDFSDK_WidgetHandler::CanAnswer(CPDFSDK_Annot* pAnnot) {
@@ -73,7 +73,7 @@
 void CPDFSDK_WidgetHandler::ReleaseAnnot(
     std::unique_ptr<CPDFSDK_Annot> pAnnot) {
   DCHECK(pAnnot);
-  m_pInteractiveFormFiller->OnDelete(pAnnot.get());
+  m_pFormFillEnv->GetInteractiveFormFiller()->OnDelete(pAnnot.get());
 
   std::unique_ptr<CPDFSDK_Widget> pWidget(ToCPDFSDKWidget(pAnnot.release()));
   CPDFSDK_InteractiveForm* pForm = pWidget->GetInteractiveForm();
@@ -90,22 +90,27 @@
     pAnnot->AsBAAnnot()->DrawAppearance(
         pDevice, mtUser2Device, CPDF_Annot::AppearanceMode::kNormal, nullptr);
   } else {
-    m_pInteractiveFormFiller->OnDraw(pPageView, pAnnot, pDevice, mtUser2Device);
+    m_pFormFillEnv->GetInteractiveFormFiller()->OnDraw(pPageView, pAnnot,
+                                                       pDevice, mtUser2Device);
   }
 }
 
 void CPDFSDK_WidgetHandler::OnMouseEnter(CPDFSDK_PageView* pPageView,
                                          ObservedPtr<CPDFSDK_Annot>* pAnnot,
                                          Mask<FWL_EVENTFLAG> nFlag) {
-  if (!(*pAnnot)->IsSignatureWidget())
-    m_pInteractiveFormFiller->OnMouseEnter(pPageView, pAnnot, nFlag);
+  if (!(*pAnnot)->IsSignatureWidget()) {
+    m_pFormFillEnv->GetInteractiveFormFiller()->OnMouseEnter(pPageView, pAnnot,
+                                                             nFlag);
+  }
 }
 
 void CPDFSDK_WidgetHandler::OnMouseExit(CPDFSDK_PageView* pPageView,
                                         ObservedPtr<CPDFSDK_Annot>* pAnnot,
                                         Mask<FWL_EVENTFLAG> nFlag) {
-  if (!(*pAnnot)->IsSignatureWidget())
-    m_pInteractiveFormFiller->OnMouseExit(pPageView, pAnnot, nFlag);
+  if (!(*pAnnot)->IsSignatureWidget()) {
+    m_pFormFillEnv->GetInteractiveFormFiller()->OnMouseExit(pPageView, pAnnot,
+                                                            nFlag);
+  }
 }
 
 bool CPDFSDK_WidgetHandler::OnLButtonDown(CPDFSDK_PageView* pPageView,
@@ -113,8 +118,8 @@
                                           Mask<FWL_EVENTFLAG> nFlags,
                                           const CFX_PointF& point) {
   return !(*pAnnot)->IsSignatureWidget() &&
-         m_pInteractiveFormFiller->OnLButtonDown(pPageView, pAnnot, nFlags,
-                                                 point);
+         m_pFormFillEnv->GetInteractiveFormFiller()->OnLButtonDown(
+             pPageView, pAnnot, nFlags, point);
 }
 
 bool CPDFSDK_WidgetHandler::OnLButtonUp(CPDFSDK_PageView* pPageView,
@@ -122,8 +127,8 @@
                                         Mask<FWL_EVENTFLAG> nFlags,
                                         const CFX_PointF& point) {
   return !(*pAnnot)->IsSignatureWidget() &&
-         m_pInteractiveFormFiller->OnLButtonUp(pPageView, pAnnot, nFlags,
-                                               point);
+         m_pFormFillEnv->GetInteractiveFormFiller()->OnLButtonUp(
+             pPageView, pAnnot, nFlags, point);
 }
 
 bool CPDFSDK_WidgetHandler::OnLButtonDblClk(CPDFSDK_PageView* pPageView,
@@ -131,8 +136,8 @@
                                             Mask<FWL_EVENTFLAG> nFlags,
                                             const CFX_PointF& point) {
   return !(*pAnnot)->IsSignatureWidget() &&
-         m_pInteractiveFormFiller->OnLButtonDblClk(pPageView, pAnnot, nFlags,
-                                                   point);
+         m_pFormFillEnv->GetInteractiveFormFiller()->OnLButtonDblClk(
+             pPageView, pAnnot, nFlags, point);
 }
 
 bool CPDFSDK_WidgetHandler::OnMouseMove(CPDFSDK_PageView* pPageView,
@@ -140,8 +145,8 @@
                                         Mask<FWL_EVENTFLAG> nFlags,
                                         const CFX_PointF& point) {
   return !(*pAnnot)->IsSignatureWidget() &&
-         m_pInteractiveFormFiller->OnMouseMove(pPageView, pAnnot, nFlags,
-                                               point);
+         m_pFormFillEnv->GetInteractiveFormFiller()->OnMouseMove(
+             pPageView, pAnnot, nFlags, point);
 }
 
 bool CPDFSDK_WidgetHandler::OnMouseWheel(CPDFSDK_PageView* pPageView,
@@ -150,8 +155,8 @@
                                          const CFX_PointF& point,
                                          const CFX_Vector& delta) {
   return !(*pAnnot)->IsSignatureWidget() &&
-         m_pInteractiveFormFiller->OnMouseWheel(pPageView, pAnnot, nFlags,
-                                                point, delta);
+         m_pFormFillEnv->GetInteractiveFormFiller()->OnMouseWheel(
+             pPageView, pAnnot, nFlags, point, delta);
 }
 
 bool CPDFSDK_WidgetHandler::OnRButtonDown(CPDFSDK_PageView* pPageView,
@@ -159,8 +164,8 @@
                                           Mask<FWL_EVENTFLAG> nFlags,
                                           const CFX_PointF& point) {
   return !(*pAnnot)->IsSignatureWidget() &&
-         m_pInteractiveFormFiller->OnRButtonDown(pPageView, pAnnot, nFlags,
-                                                 point);
+         m_pFormFillEnv->GetInteractiveFormFiller()->OnRButtonDown(
+             pPageView, pAnnot, nFlags, point);
 }
 
 bool CPDFSDK_WidgetHandler::OnRButtonUp(CPDFSDK_PageView* pPageView,
@@ -168,8 +173,8 @@
                                         Mask<FWL_EVENTFLAG> nFlags,
                                         const CFX_PointF& point) {
   return !(*pAnnot)->IsSignatureWidget() &&
-         m_pInteractiveFormFiller->OnRButtonUp(pPageView, pAnnot, nFlags,
-                                               point);
+         m_pFormFillEnv->GetInteractiveFormFiller()->OnRButtonUp(
+             pPageView, pAnnot, nFlags, point);
 }
 
 bool CPDFSDK_WidgetHandler::OnRButtonDblClk(CPDFSDK_PageView* pPageView,
@@ -183,14 +188,16 @@
                                    uint32_t nChar,
                                    Mask<FWL_EVENTFLAG> nFlags) {
   return !pAnnot->IsSignatureWidget() &&
-         m_pInteractiveFormFiller->OnChar(pAnnot, nChar, nFlags);
+         m_pFormFillEnv->GetInteractiveFormFiller()->OnChar(pAnnot, nChar,
+                                                            nFlags);
 }
 
 bool CPDFSDK_WidgetHandler::OnKeyDown(CPDFSDK_Annot* pAnnot,
                                       FWL_VKEYCODE nKeyCode,
                                       Mask<FWL_EVENTFLAG> nFlag) {
   return !pAnnot->IsSignatureWidget() &&
-         m_pInteractiveFormFiller->OnKeyDown(pAnnot, nKeyCode, nFlag);
+         m_pFormFillEnv->GetInteractiveFormFiller()->OnKeyDown(pAnnot, nKeyCode,
+                                                               nFlag);
 }
 
 bool CPDFSDK_WidgetHandler::OnKeyUp(CPDFSDK_Annot* pAnnot,
@@ -235,7 +242,7 @@
     return false;
 
   return (*pAnnot)->IsSignatureWidget() ||
-         m_pInteractiveFormFiller->OnSetFocus(pAnnot, nFlag);
+         m_pFormFillEnv->GetInteractiveFormFiller()->OnSetFocus(pAnnot, nFlag);
 }
 
 bool CPDFSDK_WidgetHandler::OnKillFocus(ObservedPtr<CPDFSDK_Annot>* pAnnot,
@@ -244,70 +251,75 @@
     return false;
 
   return (*pAnnot)->IsSignatureWidget() ||
-         m_pInteractiveFormFiller->OnKillFocus(pAnnot, nFlag);
+         m_pFormFillEnv->GetInteractiveFormFiller()->OnKillFocus(pAnnot, nFlag);
 }
 
 bool CPDFSDK_WidgetHandler::SetIndexSelected(ObservedPtr<CPDFSDK_Annot>* pAnnot,
                                              int index,
                                              bool selected) {
   return !(*pAnnot)->IsSignatureWidget() &&
-         m_pInteractiveFormFiller->SetIndexSelected(pAnnot, index, selected);
+         m_pFormFillEnv->GetInteractiveFormFiller()->SetIndexSelected(
+             pAnnot, index, selected);
 }
 
 bool CPDFSDK_WidgetHandler::IsIndexSelected(ObservedPtr<CPDFSDK_Annot>* pAnnot,
                                             int index) {
   return !(*pAnnot)->IsSignatureWidget() &&
-         m_pInteractiveFormFiller->IsIndexSelected(pAnnot, index);
+         m_pFormFillEnv->GetInteractiveFormFiller()->IsIndexSelected(pAnnot,
+                                                                     index);
 }
 
 CFX_FloatRect CPDFSDK_WidgetHandler::GetViewBBox(CPDFSDK_PageView* pPageView,
                                                  CPDFSDK_Annot* pAnnot) {
   if (!pAnnot->IsSignatureWidget()) {
     return CFX_FloatRect(
-        m_pInteractiveFormFiller->GetViewBBox(pPageView, pAnnot));
+        m_pFormFillEnv->GetInteractiveFormFiller()->GetViewBBox(pPageView,
+                                                                pAnnot));
   }
   return CFX_FloatRect();
 }
 
 WideString CPDFSDK_WidgetHandler::GetText(CPDFSDK_Annot* pAnnot) {
   if (!pAnnot->IsSignatureWidget())
-    return m_pInteractiveFormFiller->GetText(pAnnot);
+    return m_pFormFillEnv->GetInteractiveFormFiller()->GetText(pAnnot);
   return WideString();
 }
 
 WideString CPDFSDK_WidgetHandler::GetSelectedText(CPDFSDK_Annot* pAnnot) {
   if (!pAnnot->IsSignatureWidget())
-    return m_pInteractiveFormFiller->GetSelectedText(pAnnot);
+    return m_pFormFillEnv->GetInteractiveFormFiller()->GetSelectedText(pAnnot);
   return WideString();
 }
 
 void CPDFSDK_WidgetHandler::ReplaceSelection(CPDFSDK_Annot* pAnnot,
                                              const WideString& text) {
   if (!pAnnot->IsSignatureWidget())
-    m_pInteractiveFormFiller->ReplaceSelection(pAnnot, text);
+    m_pFormFillEnv->GetInteractiveFormFiller()->ReplaceSelection(pAnnot, text);
 }
 
 bool CPDFSDK_WidgetHandler::SelectAllText(CPDFSDK_Annot* pAnnot) {
   return !pAnnot->IsSignatureWidget() &&
-         m_pInteractiveFormFiller->SelectAllText(pAnnot);
+         m_pFormFillEnv->GetInteractiveFormFiller()->SelectAllText(pAnnot);
 }
 
 bool CPDFSDK_WidgetHandler::CanUndo(CPDFSDK_Annot* pAnnot) {
   return !pAnnot->IsSignatureWidget() &&
-         m_pInteractiveFormFiller->CanUndo(pAnnot);
+         m_pFormFillEnv->GetInteractiveFormFiller()->CanUndo(pAnnot);
 }
 
 bool CPDFSDK_WidgetHandler::CanRedo(CPDFSDK_Annot* pAnnot) {
   return !pAnnot->IsSignatureWidget() &&
-         m_pInteractiveFormFiller->CanRedo(pAnnot);
+         m_pFormFillEnv->GetInteractiveFormFiller()->CanRedo(pAnnot);
 }
 
 bool CPDFSDK_WidgetHandler::Undo(CPDFSDK_Annot* pAnnot) {
-  return !pAnnot->IsSignatureWidget() && m_pInteractiveFormFiller->Undo(pAnnot);
+  return !pAnnot->IsSignatureWidget() &&
+         m_pFormFillEnv->GetInteractiveFormFiller()->Undo(pAnnot);
 }
 
 bool CPDFSDK_WidgetHandler::Redo(CPDFSDK_Annot* pAnnot) {
-  return !pAnnot->IsSignatureWidget() && m_pInteractiveFormFiller->Redo(pAnnot);
+  return !pAnnot->IsSignatureWidget() &&
+         m_pFormFillEnv->GetInteractiveFormFiller()->Redo(pAnnot);
 }
 
 bool CPDFSDK_WidgetHandler::HitTest(CPDFSDK_PageView* pPageView,
diff --git a/fpdfsdk/cpdfsdk_widgethandler.h b/fpdfsdk/cpdfsdk_widgethandler.h
index 7c9d5bc..ee1aa63 100644
--- a/fpdfsdk/cpdfsdk_widgethandler.h
+++ b/fpdfsdk/cpdfsdk_widgethandler.h
@@ -11,7 +11,6 @@
 
 #include "core/fxcrt/fx_coordinates.h"
 #include "core/fxcrt/unowned_ptr.h"
-#include "fpdfsdk/formfiller/cffl_interactiveformfiller.h"
 #include "fpdfsdk/ipdfsdk_annothandler.h"
 
 class CFX_Matrix;
@@ -113,7 +112,6 @@
   bool IsFocusableAnnot(const CPDF_Annot::Subtype& annot_type) const;
 
   UnownedPtr<CPDFSDK_FormFillEnvironment> m_pFormFillEnv;
-  UnownedPtr<CFFL_InteractiveFormFiller> m_pInteractiveFormFiller;
 };
 
 #endif  // FPDFSDK_CPDFSDK_WIDGETHANDLER_H_
