Merge to XFA: Tidy up JS_Object.h and JS_Object.cpp.

(cherry picked from commit b0b1a8bd45ed72e4fd22f5f0a394b7897ae573c7)
Original Review URL: https://codereview.chromium.org/1293673003 .

TBR=thestig@chromium.org

Review URL: https://codereview.chromium.org/1292283002 .
diff --git a/fpdfsdk/src/javascript/JS_Object.cpp b/fpdfsdk/src/javascript/JS_Object.cpp
index ef9bab9..96e1d1d 100644
--- a/fpdfsdk/src/javascript/JS_Object.cpp
+++ b/fpdfsdk/src/javascript/JS_Object.cpp
@@ -10,12 +10,6 @@
 #include "../../include/javascript/JS_Object.h"
 #include "../../include/javascript/JS_Context.h"
 
-JSTimerMap* GetGlobalTimerMap() {
-  // Leak the timer array at shutdown.
-  static auto* timeMap = new JSTimerMap;
-  return timeMap;
-}
-
 int FXJS_MsgBox(CPDFDoc_Environment* pApp,
                 CPDFSDK_PageView* pPageView,
                 const FX_WCHAR* swMsg,
@@ -39,9 +33,6 @@
   return NULL;
 }
 
-/* ---------------------------------  CJS_EmbedObj
- * --------------------------------- */
-
 CJS_EmbedObj::CJS_EmbedObj(CJS_Object* pJSObject) : m_pJSObject(pJSObject) {}
 
 CJS_EmbedObj::~CJS_EmbedObj() {
@@ -79,8 +70,6 @@
   delete pTimer;
 }
 
-/* ---------------------------------  CJS_Object
- * --------------------------------- */
 void FreeObject(const v8::WeakCallbackInfo<CJS_Object>& data) {
   CJS_Object* pJSObj = data.GetParameter();
   pJSObj->ExitInstance();
@@ -101,9 +90,6 @@
 };
 
 CJS_Object::~CJS_Object(void) {
-  delete m_pEmbedObj;
-  m_pEmbedObj = NULL;
-
   m_pObject.Reset();
 };
 
@@ -137,3 +123,43 @@
       pApp->JS_appAlert(swMsg, NULL, 0, 3);
   }
 }
+
+FX_UINT CJS_Timer::SetJSTimer(FX_UINT nElapse) {
+  if (m_nTimerID)
+    KillJSTimer();
+  IFX_SystemHandler* pHandler = m_pApp->GetSysHandler();
+  m_nTimerID = pHandler->SetTimer(nElapse, TimerProc);
+  (*GetGlobalTimerMap())[m_nTimerID] = this;
+  m_dwElapse = nElapse;
+  return m_nTimerID;
+}
+
+void CJS_Timer::KillJSTimer() {
+  if (m_nTimerID) {
+    IFX_SystemHandler* pHandler = m_pApp->GetSysHandler();
+    pHandler->KillTimer(m_nTimerID);
+    GetGlobalTimerMap()->erase(m_nTimerID);
+    m_nTimerID = 0;
+  }
+}
+
+// static
+void CJS_Timer::TimerProc(int idEvent) {
+  const auto it = GetGlobalTimerMap()->find(idEvent);
+  if (it != GetGlobalTimerMap()->end()) {
+    CJS_Timer* pTimer = it->second;
+    if (!pTimer->m_bProcessing) {
+      pTimer->m_bProcessing = TRUE;
+      if (pTimer->m_pEmbedObj)
+        pTimer->m_pEmbedObj->TimerProc(pTimer);
+      pTimer->m_bProcessing = FALSE;
+    }
+  }
+}
+
+// static
+CJS_Timer::TimerMap* CJS_Timer::GetGlobalTimerMap() {
+  // Leak the timer array at shutdown.
+  static auto* s_TimerMap = new TimerMap;
+  return s_TimerMap;
+}