Get rid of fifteen copies of m_sTimeMap and their initializers.

m_sTimeMap is a global variable with a constructor and destructor, which
is not allowed. This change moves it to a function with a static pointer
so that it is constructed on demand and then leaked, thus avoiding
having startup and shutdown code.

This also fixes a worrisome bug caused by having m_sTimeMap defined in
a header file. Because m_sTimeMap was defined (and marked as static) in
a header file there were fifteen separate copies of it, one for each
source file which included the header file. This could easily lead to
bugs because a timer that was added from one source file would be
invisible to other source files.

Each instance of m_sTimeMap added four entries to the
dump-static-initializers.py report, for a total of sixty, so this fix
significantly cleans up that report.

BUG=441899
R=tsepez@chromium.org

Review URL: https://codereview.chromium.org/831903002
diff --git a/fpdfsdk/include/javascript/JS_Object.h b/fpdfsdk/include/javascript/JS_Object.h
index a6dac5d..2351b09 100644
--- a/fpdfsdk/include/javascript/JS_Object.h
+++ b/fpdfsdk/include/javascript/JS_Object.h
@@ -157,7 +157,7 @@
 	CTimerMapArray		m_Array;
 };
 
-static JS_TIMER_MAPARRAY	m_sTimeMap;
+JS_TIMER_MAPARRAY& GetTimeMap();
 
 class CJS_Runtime;
 
@@ -188,7 +188,7 @@
 		if (m_nTimerID)KillJSTimer();
 		IFX_SystemHandler* pHandler = m_pApp->GetSysHandler();
 		m_nTimerID = pHandler->SetTimer(nElapse,TimerProc);
-		m_sTimeMap.SetAt(m_nTimerID,this);
+		GetTimeMap().SetAt(m_nTimerID,this);
 		m_dwElapse = nElapse;
 		return m_nTimerID;
 	};
@@ -199,7 +199,7 @@
 		{
 			IFX_SystemHandler* pHandler = m_pApp->GetSysHandler();
 			pHandler->KillTimer(m_nTimerID);
-			m_sTimeMap.RemoveAt(m_nTimerID);
+			GetTimeMap().RemoveAt(m_nTimerID);
 			m_nTimerID = 0;
 		}
 	};
@@ -256,7 +256,7 @@
 
 	static void TimerProc(int idEvent)
 	{
-		if (CJS_Timer * pTimer = m_sTimeMap.GetAt(idEvent))
+		if (CJS_Timer * pTimer = GetTimeMap().GetAt(idEvent))
 		{
 			if (!pTimer->m_bProcessing)
 			{
diff --git a/fpdfsdk/src/javascript/JS_Object.cpp b/fpdfsdk/src/javascript/JS_Object.cpp
index 3b7774d..8a019d4 100644
--- a/fpdfsdk/src/javascript/JS_Object.cpp
+++ b/fpdfsdk/src/javascript/JS_Object.cpp
@@ -12,6 +12,13 @@
 // #include "../../include/javascript/JS_ResMgr.h"
 #include "../../include/javascript/JS_Context.h"
 
+JS_TIMER_MAPARRAY& GetTimeMap()
+{
+  // Leak the timer array at shutdown.
+  static auto* timeMap = new JS_TIMER_MAPARRAY;
+  return *timeMap;
+}
+
 int FXJS_MsgBox(CPDFDoc_Environment* pApp, CPDFSDK_PageView* pPageView, FX_LPCWSTR swMsg, FX_LPCWSTR swTitle, FX_UINT nType, FX_UINT nIcon)
 {
 	int nRet = 0;