diff --git a/fpdfsdk/cpdfsdk_formfillenvironment.cpp b/fpdfsdk/cpdfsdk_formfillenvironment.cpp
index 4b512b1..2ba3aec 100644
--- a/fpdfsdk/cpdfsdk_formfillenvironment.cpp
+++ b/fpdfsdk/cpdfsdk_formfillenvironment.cpp
@@ -78,10 +78,10 @@
   // itself up. Make sure it is deleted before |m_pFormFiller|.
   m_pAnnotHandlerMgr.reset();
 
-  // Must destroy the |m_pFormFiller| before the environment (|this|)
+  // Must destroy the |m_pInteractiveFormFiller| before the environment (|this|)
   // because any created form widgets hold a pointer to the environment.
   // Those widgets may call things like KillTimer() as they are shutdown.
-  m_pFormFiller.reset();
+  m_pInteractiveFormFiller.reset();
 
   if (m_pInfo && m_pInfo->Release)
     m_pInfo->Release(m_pInfo);
@@ -351,9 +351,11 @@
 
 CFFL_InteractiveFormFiller*
 CPDFSDK_FormFillEnvironment::GetInteractiveFormFiller() {
-  if (!m_pFormFiller)
-    m_pFormFiller = std::make_unique<CFFL_InteractiveFormFiller>(this);
-  return m_pFormFiller.get();
+  if (!m_pInteractiveFormFiller) {
+    m_pInteractiveFormFiller =
+        std::make_unique<CFFL_InteractiveFormFiller>(this);
+  }
+  return m_pInteractiveFormFiller.get();
 }
 
 void CPDFSDK_FormFillEnvironment::Invalidate(IPDF_Page* page,
diff --git a/fpdfsdk/cpdfsdk_formfillenvironment.h b/fpdfsdk/cpdfsdk_formfillenvironment.h
index ec538dd..fa76a56 100644
--- a/fpdfsdk/cpdfsdk_formfillenvironment.h
+++ b/fpdfsdk/cpdfsdk_formfillenvironment.h
@@ -229,7 +229,7 @@
   ObservedPtr<CPDFSDK_Annot> m_pFocusAnnot;
   UnownedPtr<CPDF_Document> const m_pCPDFDoc;
   std::unique_ptr<CPDFSDK_AnnotHandlerMgr> m_pAnnotHandlerMgr;
-  std::unique_ptr<CFFL_InteractiveFormFiller> m_pFormFiller;
+  std::unique_ptr<CFFL_InteractiveFormFiller> m_pInteractiveFormFiller;
   bool m_bChangeMask = false;
   bool m_bBeingDestroyed = false;
 
diff --git a/fpdfsdk/cpdfsdk_widgethandler.cpp b/fpdfsdk/cpdfsdk_widgethandler.cpp
index 79bf5f2..ef922c1 100644
--- a/fpdfsdk/cpdfsdk_widgethandler.cpp
+++ b/fpdfsdk/cpdfsdk_widgethandler.cpp
@@ -30,7 +30,7 @@
 void CPDFSDK_WidgetHandler::SetFormFillEnvironment(
     CPDFSDK_FormFillEnvironment* pFormFillEnv) {
   m_pFormFillEnv = pFormFillEnv;
-  m_pFormFiller = m_pFormFillEnv->GetInteractiveFormFiller();
+  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_pFormFiller->OnDelete(pAnnot.get());
+  m_pInteractiveFormFiller->OnDelete(pAnnot.get());
 
   std::unique_ptr<CPDFSDK_Widget> pWidget(ToCPDFSDKWidget(pAnnot.release()));
   CPDFSDK_InteractiveForm* pForm = pWidget->GetInteractiveForm();
@@ -90,7 +90,7 @@
     pAnnot->AsBAAnnot()->DrawAppearance(pDevice, mtUser2Device,
                                         CPDF_Annot::Normal, nullptr);
   } else {
-    m_pFormFiller->OnDraw(pPageView, pAnnot, pDevice, mtUser2Device);
+    m_pInteractiveFormFiller->OnDraw(pPageView, pAnnot, pDevice, mtUser2Device);
   }
 }
 
@@ -98,14 +98,14 @@
                                          ObservedPtr<CPDFSDK_Annot>* pAnnot,
                                          uint32_t nFlag) {
   if (!(*pAnnot)->IsSignatureWidget())
-    m_pFormFiller->OnMouseEnter(pPageView, pAnnot, nFlag);
+    m_pInteractiveFormFiller->OnMouseEnter(pPageView, pAnnot, nFlag);
 }
 
 void CPDFSDK_WidgetHandler::OnMouseExit(CPDFSDK_PageView* pPageView,
                                         ObservedPtr<CPDFSDK_Annot>* pAnnot,
                                         uint32_t nFlag) {
   if (!(*pAnnot)->IsSignatureWidget())
-    m_pFormFiller->OnMouseExit(pPageView, pAnnot, nFlag);
+    m_pInteractiveFormFiller->OnMouseExit(pPageView, pAnnot, nFlag);
 }
 
 bool CPDFSDK_WidgetHandler::OnLButtonDown(CPDFSDK_PageView* pPageView,
@@ -113,7 +113,8 @@
                                           uint32_t nFlags,
                                           const CFX_PointF& point) {
   return !(*pAnnot)->IsSignatureWidget() &&
-         m_pFormFiller->OnLButtonDown(pPageView, pAnnot, nFlags, point);
+         m_pInteractiveFormFiller->OnLButtonDown(pPageView, pAnnot, nFlags,
+                                                 point);
 }
 
 bool CPDFSDK_WidgetHandler::OnLButtonUp(CPDFSDK_PageView* pPageView,
@@ -121,7 +122,8 @@
                                         uint32_t nFlags,
                                         const CFX_PointF& point) {
   return !(*pAnnot)->IsSignatureWidget() &&
-         m_pFormFiller->OnLButtonUp(pPageView, pAnnot, nFlags, point);
+         m_pInteractiveFormFiller->OnLButtonUp(pPageView, pAnnot, nFlags,
+                                               point);
 }
 
 bool CPDFSDK_WidgetHandler::OnLButtonDblClk(CPDFSDK_PageView* pPageView,
@@ -129,7 +131,8 @@
                                             uint32_t nFlags,
                                             const CFX_PointF& point) {
   return !(*pAnnot)->IsSignatureWidget() &&
-         m_pFormFiller->OnLButtonDblClk(pPageView, pAnnot, nFlags, point);
+         m_pInteractiveFormFiller->OnLButtonDblClk(pPageView, pAnnot, nFlags,
+                                                   point);
 }
 
 bool CPDFSDK_WidgetHandler::OnMouseMove(CPDFSDK_PageView* pPageView,
@@ -137,7 +140,8 @@
                                         uint32_t nFlags,
                                         const CFX_PointF& point) {
   return !(*pAnnot)->IsSignatureWidget() &&
-         m_pFormFiller->OnMouseMove(pPageView, pAnnot, nFlags, point);
+         m_pInteractiveFormFiller->OnMouseMove(pPageView, pAnnot, nFlags,
+                                               point);
 }
 
 bool CPDFSDK_WidgetHandler::OnMouseWheel(CPDFSDK_PageView* pPageView,
@@ -146,7 +150,8 @@
                                          const CFX_PointF& point,
                                          const CFX_Vector& delta) {
   return !(*pAnnot)->IsSignatureWidget() &&
-         m_pFormFiller->OnMouseWheel(pPageView, pAnnot, nFlags, point, delta);
+         m_pInteractiveFormFiller->OnMouseWheel(pPageView, pAnnot, nFlags,
+                                                point, delta);
 }
 
 bool CPDFSDK_WidgetHandler::OnRButtonDown(CPDFSDK_PageView* pPageView,
@@ -154,7 +159,8 @@
                                           uint32_t nFlags,
                                           const CFX_PointF& point) {
   return !(*pAnnot)->IsSignatureWidget() &&
-         m_pFormFiller->OnRButtonDown(pPageView, pAnnot, nFlags, point);
+         m_pInteractiveFormFiller->OnRButtonDown(pPageView, pAnnot, nFlags,
+                                                 point);
 }
 
 bool CPDFSDK_WidgetHandler::OnRButtonUp(CPDFSDK_PageView* pPageView,
@@ -162,7 +168,8 @@
                                         uint32_t nFlags,
                                         const CFX_PointF& point) {
   return !(*pAnnot)->IsSignatureWidget() &&
-         m_pFormFiller->OnRButtonUp(pPageView, pAnnot, nFlags, point);
+         m_pInteractiveFormFiller->OnRButtonUp(pPageView, pAnnot, nFlags,
+                                               point);
 }
 
 bool CPDFSDK_WidgetHandler::OnRButtonDblClk(CPDFSDK_PageView* pPageView,
@@ -176,14 +183,14 @@
                                    uint32_t nChar,
                                    uint32_t nFlags) {
   return !pAnnot->IsSignatureWidget() &&
-         m_pFormFiller->OnChar(pAnnot, nChar, nFlags);
+         m_pInteractiveFormFiller->OnChar(pAnnot, nChar, nFlags);
 }
 
 bool CPDFSDK_WidgetHandler::OnKeyDown(CPDFSDK_Annot* pAnnot,
                                       int nKeyCode,
                                       int nFlag) {
   return !pAnnot->IsSignatureWidget() &&
-         m_pFormFiller->OnKeyDown(pAnnot, nKeyCode, nFlag);
+         m_pInteractiveFormFiller->OnKeyDown(pAnnot, nKeyCode, nFlag);
 }
 
 bool CPDFSDK_WidgetHandler::OnKeyUp(CPDFSDK_Annot* pAnnot,
@@ -228,7 +235,7 @@
     return false;
 
   return (*pAnnot)->IsSignatureWidget() ||
-         m_pFormFiller->OnSetFocus(pAnnot, nFlag);
+         m_pInteractiveFormFiller->OnSetFocus(pAnnot, nFlag);
 }
 
 bool CPDFSDK_WidgetHandler::OnKillFocus(ObservedPtr<CPDFSDK_Annot>* pAnnot,
@@ -237,65 +244,70 @@
     return false;
 
   return (*pAnnot)->IsSignatureWidget() ||
-         m_pFormFiller->OnKillFocus(pAnnot, nFlag);
+         m_pInteractiveFormFiller->OnKillFocus(pAnnot, nFlag);
 }
 
 bool CPDFSDK_WidgetHandler::SetIndexSelected(ObservedPtr<CPDFSDK_Annot>* pAnnot,
                                              int index,
                                              bool selected) {
   return !(*pAnnot)->IsSignatureWidget() &&
-         m_pFormFiller->SetIndexSelected(pAnnot, index, selected);
+         m_pInteractiveFormFiller->SetIndexSelected(pAnnot, index, selected);
 }
 
 bool CPDFSDK_WidgetHandler::IsIndexSelected(ObservedPtr<CPDFSDK_Annot>* pAnnot,
                                             int index) {
   return !(*pAnnot)->IsSignatureWidget() &&
-         m_pFormFiller->IsIndexSelected(pAnnot, index);
+         m_pInteractiveFormFiller->IsIndexSelected(pAnnot, index);
 }
 
 CFX_FloatRect CPDFSDK_WidgetHandler::GetViewBBox(CPDFSDK_PageView* pPageView,
                                                  CPDFSDK_Annot* pAnnot) {
-  if (!pAnnot->IsSignatureWidget())
-    return CFX_FloatRect(m_pFormFiller->GetViewBBox(pPageView, pAnnot));
+  if (!pAnnot->IsSignatureWidget()) {
+    return CFX_FloatRect(
+        m_pInteractiveFormFiller->GetViewBBox(pPageView, pAnnot));
+  }
   return CFX_FloatRect();
 }
 
 WideString CPDFSDK_WidgetHandler::GetText(CPDFSDK_Annot* pAnnot) {
   if (!pAnnot->IsSignatureWidget())
-    return m_pFormFiller->GetText(pAnnot);
+    return m_pInteractiveFormFiller->GetText(pAnnot);
   return WideString();
 }
 
 WideString CPDFSDK_WidgetHandler::GetSelectedText(CPDFSDK_Annot* pAnnot) {
   if (!pAnnot->IsSignatureWidget())
-    return m_pFormFiller->GetSelectedText(pAnnot);
+    return m_pInteractiveFormFiller->GetSelectedText(pAnnot);
   return WideString();
 }
 
 void CPDFSDK_WidgetHandler::ReplaceSelection(CPDFSDK_Annot* pAnnot,
                                              const WideString& text) {
   if (!pAnnot->IsSignatureWidget())
-    m_pFormFiller->ReplaceSelection(pAnnot, text);
+    m_pInteractiveFormFiller->ReplaceSelection(pAnnot, text);
 }
 
 bool CPDFSDK_WidgetHandler::SelectAllText(CPDFSDK_Annot* pAnnot) {
-  return !pAnnot->IsSignatureWidget() && m_pFormFiller->SelectAllText(pAnnot);
+  return !pAnnot->IsSignatureWidget() &&
+         m_pInteractiveFormFiller->SelectAllText(pAnnot);
 }
 
 bool CPDFSDK_WidgetHandler::CanUndo(CPDFSDK_Annot* pAnnot) {
-  return !pAnnot->IsSignatureWidget() && m_pFormFiller->CanUndo(pAnnot);
+  return !pAnnot->IsSignatureWidget() &&
+         m_pInteractiveFormFiller->CanUndo(pAnnot);
 }
 
 bool CPDFSDK_WidgetHandler::CanRedo(CPDFSDK_Annot* pAnnot) {
-  return !pAnnot->IsSignatureWidget() && m_pFormFiller->CanRedo(pAnnot);
+  return !pAnnot->IsSignatureWidget() &&
+         m_pInteractiveFormFiller->CanRedo(pAnnot);
 }
 
 bool CPDFSDK_WidgetHandler::Undo(CPDFSDK_Annot* pAnnot) {
-  return !pAnnot->IsSignatureWidget() && m_pFormFiller->Undo(pAnnot);
+  return !pAnnot->IsSignatureWidget() && m_pInteractiveFormFiller->Undo(pAnnot);
 }
 
 bool CPDFSDK_WidgetHandler::Redo(CPDFSDK_Annot* pAnnot) {
-  return !pAnnot->IsSignatureWidget() && m_pFormFiller->Redo(pAnnot);
+  return !pAnnot->IsSignatureWidget() && m_pInteractiveFormFiller->Redo(pAnnot);
 }
 
 bool CPDFSDK_WidgetHandler::HitTest(CPDFSDK_PageView* pPageView,
diff --git a/fpdfsdk/cpdfsdk_widgethandler.h b/fpdfsdk/cpdfsdk_widgethandler.h
index 5e2236e..22b8d07 100644
--- a/fpdfsdk/cpdfsdk_widgethandler.h
+++ b/fpdfsdk/cpdfsdk_widgethandler.h
@@ -105,7 +105,7 @@
   bool IsFocusableAnnot(const CPDF_Annot::Subtype& annot_type) const;
 
   UnownedPtr<CPDFSDK_FormFillEnvironment> m_pFormFillEnv;
-  UnownedPtr<CFFL_InteractiveFormFiller> m_pFormFiller;
+  UnownedPtr<CFFL_InteractiveFormFiller> m_pInteractiveFormFiller;
 };
 
 #endif  // FPDFSDK_CPDFSDK_WIDGETHANDLER_H_
diff --git a/fpdfsdk/formfiller/cffl_combobox.cpp b/fpdfsdk/formfiller/cffl_combobox.cpp
index 3a54ba0..e4e0867 100644
--- a/fpdfsdk/formfiller/cffl_combobox.cpp
+++ b/fpdfsdk/formfiller/cffl_combobox.cpp
@@ -46,10 +46,7 @@
   auto pWnd = std::make_unique<CPWL_ComboBox>(cp, std::move(pAttachedData));
   pWnd->AttachFFLData(this);
   pWnd->Realize();
-
-  CFFL_InteractiveFormFiller* pFormFiller =
-      m_pFormFillEnv->GetInteractiveFormFiller();
-  pWnd->SetFillerNotify(pFormFiller);
+  pWnd->SetFillerNotify(m_pFormFillEnv->GetInteractiveFormFiller());
 
   int32_t nCurSel = m_pWidget->GetSelectedIndex(0);
   WideString swText;
diff --git a/fpdfsdk/formfiller/cffl_formfield.cpp b/fpdfsdk/formfiller/cffl_formfield.cpp
index 397218d..3db3e8b 100644
--- a/fpdfsdk/formfiller/cffl_formfield.cpp
+++ b/fpdfsdk/formfiller/cffl_formfield.cpp
@@ -463,11 +463,12 @@
   if (!IsDataChanged(pPageView))
     return true;
 
-  CFFL_InteractiveFormFiller* pFormFiller =
+  CFFL_InteractiveFormFiller* pInteractiveFormFiller =
       m_pFormFillEnv->GetInteractiveFormFiller();
   ObservedPtr<CPDFSDK_Annot> pObserved(m_pWidget.Get());
 
-  if (!pFormFiller->OnKeyStrokeCommit(&pObserved, pPageView, nFlag)) {
+  if (!pInteractiveFormFiller->OnKeyStrokeCommit(&pObserved, pPageView,
+                                                 nFlag)) {
     if (!pObserved)
       return false;
     ResetPWLWindow(pPageView, false);
@@ -476,7 +477,7 @@
   if (!pObserved)
     return false;
 
-  if (!pFormFiller->OnValidate(&pObserved, pPageView, nFlag)) {
+  if (!pInteractiveFormFiller->OnValidate(&pObserved, pPageView, nFlag)) {
     if (!pObserved)
       return false;
     ResetPWLWindow(pPageView, false);
@@ -489,11 +490,11 @@
   if (!pObserved)
     return false;
 
-  pFormFiller->OnCalculate(&pObserved, pPageView, nFlag);
+  pInteractiveFormFiller->OnCalculate(&pObserved, pPageView, nFlag);
   if (!pObserved)
     return false;
 
-  pFormFiller->OnFormat(&pObserved, pPageView, nFlag);
+  pInteractiveFormFiller->OnFormat(&pObserved, pPageView, nFlag);
   if (!pObserved)
     return false;
 
