Split IPWL_SystemHandler and fxcrt::TimerHandlerIface

Change-Id: I62a69d51d8544cb75da9f5e82a105cfcfab54f58
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/58953
Commit-Queue: Tom Sepez <tsepez@chromium.org>
Reviewed-by: Lei Zhang <thestig@chromium.org>
diff --git a/fpdfsdk/cfx_systemhandler.h b/fpdfsdk/cfx_systemhandler.h
index def797e..c72e587 100644
--- a/fpdfsdk/cfx_systemhandler.h
+++ b/fpdfsdk/cfx_systemhandler.h
@@ -9,6 +9,7 @@
 
 #include "core/fxcrt/fx_coordinates.h"
 #include "core/fxcrt/fx_system.h"
+#include "core/fxcrt/timerhandler_iface.h"
 #include "core/fxcrt/unowned_ptr.h"
 #include "fpdfsdk/pwl/ipwl_systemhandler.h"
 
@@ -16,7 +17,8 @@
 class CPDFSDK_FormFillEnvironment;
 class CPDFSDK_Widget;
 
-class CFX_SystemHandler final : public IPWL_SystemHandler {
+class CFX_SystemHandler final : public TimerHandlerIface,
+                                public IPWL_SystemHandler {
  public:
   explicit CFX_SystemHandler(CPDFSDK_FormFillEnvironment* pFormFillEnv);
   ~CFX_SystemHandler() override;
diff --git a/fpdfsdk/cpdfsdk_formfillenvironment.h b/fpdfsdk/cpdfsdk_formfillenvironment.h
index c4afcac..48a0ec6 100644
--- a/fpdfsdk/cpdfsdk_formfillenvironment.h
+++ b/fpdfsdk/cpdfsdk_formfillenvironment.h
@@ -197,6 +197,7 @@
   void JS_docSubmitForm(void* formData, int length, const WideString& URL);
 
   ByteString GetAppName() const { return ByteString(); }
+  TimerHandlerIface* GetTimerHandler() const { return m_pSysHandler.get(); }
   IPWL_SystemHandler* GetSysHandler() const { return m_pSysHandler.get(); }
   FPDF_FORMFILLINFO* GetFormFillInfo() const { return m_pInfo; }
 
diff --git a/fpdfsdk/formfiller/cffl_formfiller.cpp b/fpdfsdk/formfiller/cffl_formfiller.cpp
index 44ad7ff..4bc42af 100644
--- a/fpdfsdk/formfiller/cffl_formfiller.cpp
+++ b/fpdfsdk/formfiller/cffl_formfiller.cpp
@@ -365,6 +365,7 @@
     dwCreateFlags |= PWS_AUTOFONTSIZE;
 
   cp.dwFlags = dwCreateFlags;
+  cp.pTimerHandler = m_pFormFillEnv->GetTimerHandler();
   cp.pSystemHandler = m_pFormFillEnv->GetSysHandler();
   return cp;
 }
diff --git a/fpdfsdk/fpdfxfa/cpdfxfa_context.cpp b/fpdfsdk/fpdfxfa/cpdfxfa_context.cpp
index f441d019..0725670 100644
--- a/fpdfsdk/fpdfxfa/cpdfxfa_context.cpp
+++ b/fpdfsdk/fpdfxfa/cpdfxfa_context.cpp
@@ -304,5 +304,5 @@
   if (!m_pFormFillEnv)
     return nullptr;
   return pdfium::MakeUnique<CXFA_FWLAdapterTimerMgr>(
-      m_pFormFillEnv->GetSysHandler());
+      m_pFormFillEnv->GetTimerHandler());
 }
diff --git a/fpdfsdk/pwl/cpwl_caret.cpp b/fpdfsdk/pwl/cpwl_caret.cpp
index 936c1c6..5be6ff0 100644
--- a/fpdfsdk/pwl/cpwl_caret.cpp
+++ b/fpdfsdk/pwl/cpwl_caret.cpp
@@ -85,7 +85,7 @@
 
     m_ptHead = ptHead;
     m_ptFoot = ptFoot;
-    m_pTimer = pdfium::MakeUnique<CPWL_Timer>(GetSystemHandler(), this,
+    m_pTimer = pdfium::MakeUnique<CPWL_Timer>(GetTimerHandler(), this,
                                               kCaretFlashIntervalMs);
 
     if (!CPWL_Wnd::SetVisible(true))
diff --git a/fpdfsdk/pwl/cpwl_scroll_bar.cpp b/fpdfsdk/pwl/cpwl_scroll_bar.cpp
index e1deb8f..209c465 100644
--- a/fpdfsdk/pwl/cpwl_scroll_bar.cpp
+++ b/fpdfsdk/pwl/cpwl_scroll_bar.cpp
@@ -676,7 +676,7 @@
 
   NotifyScrollWindow();
   m_bMinOrMax = true;
-  m_pTimer = pdfium::MakeUnique<CPWL_Timer>(GetSystemHandler(), this, 100);
+  m_pTimer = pdfium::MakeUnique<CPWL_Timer>(GetTimerHandler(), this, 100);
 }
 
 void CPWL_ScrollBar::OnMinButtonLBUp(const CFX_PointF& point) {}
@@ -690,7 +690,7 @@
 
   NotifyScrollWindow();
   m_bMinOrMax = false;
-  m_pTimer = pdfium::MakeUnique<CPWL_Timer>(GetSystemHandler(), this, 100);
+  m_pTimer = pdfium::MakeUnique<CPWL_Timer>(GetTimerHandler(), this, 100);
 }
 
 void CPWL_ScrollBar::OnMaxButtonLBUp(const CFX_PointF& point) {}
diff --git a/fpdfsdk/pwl/cpwl_timer.cpp b/fpdfsdk/pwl/cpwl_timer.cpp
index 9979138..a501c7f 100644
--- a/fpdfsdk/pwl/cpwl_timer.cpp
+++ b/fpdfsdk/pwl/cpwl_timer.cpp
@@ -18,11 +18,11 @@
 
 }  // namespace
 
-CPWL_Timer::CPWL_Timer(IPWL_SystemHandler* pSystemHandler,
+CPWL_Timer::CPWL_Timer(TimerHandlerIface* pTimerHandler,
                        CallbackIface* pCallbackIface,
                        int32_t nInterval)
-    : m_nTimerID(pSystemHandler->SetTimer(nInterval, TimerProc)),
-      m_pSystemHandler(pSystemHandler),
+    : m_nTimerID(pTimerHandler->SetTimer(nInterval, TimerProc)),
+      m_pTimerHandler(pTimerHandler),
       m_pCallbackIface(pCallbackIface) {
   ASSERT(m_pCallbackIface);
   if (HasValidID())
@@ -31,7 +31,7 @@
 
 CPWL_Timer::~CPWL_Timer() {
   if (HasValidID()) {
-    m_pSystemHandler->KillTimer(m_nTimerID);
+    m_pTimerHandler->KillTimer(m_nTimerID);
     GetPWLTimeMap().erase(m_nTimerID);
   }
 }
diff --git a/fpdfsdk/pwl/cpwl_timer.h b/fpdfsdk/pwl/cpwl_timer.h
index 8d1a093..2258674 100644
--- a/fpdfsdk/pwl/cpwl_timer.h
+++ b/fpdfsdk/pwl/cpwl_timer.h
@@ -7,8 +7,8 @@
 #ifndef FPDFSDK_PWL_CPWL_TIMER_H_
 #define FPDFSDK_PWL_CPWL_TIMER_H_
 
+#include "core/fxcrt/timerhandler_iface.h"
 #include "core/fxcrt/unowned_ptr.h"
-#include "fpdfsdk/pwl/ipwl_systemhandler.h"
 
 class CPWL_TimerHandler;
 
@@ -20,7 +20,7 @@
     virtual void OnTimerFired() = 0;
   };
 
-  CPWL_Timer(IPWL_SystemHandler* pSystemHandler,
+  CPWL_Timer(TimerHandlerIface* pTimerHandler,
              CallbackIface* pCallbackIface,
              int32_t nInterval);
   ~CPWL_Timer();
@@ -29,11 +29,11 @@
   static void TimerProc(int32_t idEvent);
 
   bool HasValidID() const {
-    return m_nTimerID != IPWL_SystemHandler::kInvalidTimerID;
+    return m_nTimerID != TimerHandlerIface::kInvalidTimerID;
   }
 
   const int32_t m_nTimerID;
-  UnownedPtr<IPWL_SystemHandler> const m_pSystemHandler;
+  UnownedPtr<TimerHandlerIface> const m_pTimerHandler;
   UnownedPtr<CallbackIface> const m_pCallbackIface;
 };
 
diff --git a/fpdfsdk/pwl/cpwl_wnd.h b/fpdfsdk/pwl/cpwl_wnd.h
index da6db99..45e6955 100644
--- a/fpdfsdk/pwl/cpwl_wnd.h
+++ b/fpdfsdk/pwl/cpwl_wnd.h
@@ -114,6 +114,7 @@
     ~CreateParams();
 
     CFX_FloatRect rcRectWnd;                          // required
+    UnownedPtr<TimerHandlerIface> pTimerHandler;      // required
     UnownedPtr<IPWL_SystemHandler> pSystemHandler;    // required
     UnownedPtr<IPVT_FontMap> pFontMap;                // required
     ObservedPtr<ProviderIface> pProvider;             // required
@@ -270,6 +271,9 @@
   bool IsNotifying() const { return m_bNotifying; }
   bool IsValid() const { return m_bCreated; }
   CreateParams* GetCreationParams() { return &m_CreationParams; }
+  TimerHandlerIface* GetTimerHandler() const {
+    return m_CreationParams.pTimerHandler.Get();
+  }
   IPWL_SystemHandler* GetSystemHandler() const {
     return m_CreationParams.pSystemHandler.Get();
   }
diff --git a/fpdfsdk/pwl/ipwl_systemhandler.h b/fpdfsdk/pwl/ipwl_systemhandler.h
index 017bffe..8a14d8e 100644
--- a/fpdfsdk/pwl/ipwl_systemhandler.h
+++ b/fpdfsdk/pwl/ipwl_systemhandler.h
@@ -11,11 +11,10 @@
 
 #include "core/fxcrt/fx_coordinates.h"
 #include "core/fxcrt/fx_system.h"
-#include "core/fxcrt/timerhandler_iface.h"
 
 class CFFL_FormFiller;
 
-class IPWL_SystemHandler : public TimerHandlerIface {
+class IPWL_SystemHandler {
  public:
   class PerWindowData {
    public:
@@ -23,7 +22,7 @@
     virtual std::unique_ptr<PerWindowData> Clone() const = 0;
   };
 
-  ~IPWL_SystemHandler() override = default;
+  virtual ~IPWL_SystemHandler() = default;
 
   virtual void InvalidateRect(PerWindowData* pWidgetData,
                               const CFX_FloatRect& rect) = 0;
diff --git a/fxjs/cjs_runtime.cpp b/fxjs/cjs_runtime.cpp
index 1cded27..4cb37dd 100644
--- a/fxjs/cjs_runtime.cpp
+++ b/fxjs/cjs_runtime.cpp
@@ -143,7 +143,7 @@
 }
 
 TimerHandlerIface* CJS_Runtime::GetTimerHandler() const {
-  return m_pFormFillEnv ? m_pFormFillEnv->GetSysHandler() : nullptr;
+  return m_pFormFillEnv ? m_pFormFillEnv->GetTimerHandler() : nullptr;
 }
 
 void CJS_Runtime::SetFormFillEnvToDocument() {
diff --git a/fxjs/global_timer.cpp b/fxjs/global_timer.cpp
index 75c0a42..b3049a0 100644
--- a/fxjs/global_timer.cpp
+++ b/fxjs/global_timer.cpp
@@ -84,5 +84,5 @@
 }
 
 bool GlobalTimer::HasValidID() const {
-  return m_nTimerID != IPWL_SystemHandler::kInvalidTimerID;
+  return m_nTimerID != TimerHandlerIface::kInvalidTimerID;
 }