diff options
Diffstat (limited to 'fpdfsdk/src/javascript')
-rw-r--r-- | fpdfsdk/src/javascript/JS_Object.cpp | 54 |
1 files changed, 40 insertions, 14 deletions
diff --git a/fpdfsdk/src/javascript/JS_Object.cpp b/fpdfsdk/src/javascript/JS_Object.cpp index ef9bab971d..96e1d1d564 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 @@ CPDFSDK_PageView* FXJS_GetPageView(IFXJS_Context* cc) { return NULL; } -/* --------------------------------- CJS_EmbedObj - * --------------------------------- */ - CJS_EmbedObj::CJS_EmbedObj(CJS_Object* pJSObject) : m_pJSObject(pJSObject) {} CJS_EmbedObj::~CJS_EmbedObj() { @@ -79,8 +70,6 @@ void CJS_EmbedObj::EndTimer(CJS_Timer* pTimer) { 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(JSFXObject pObject) : m_pEmbedObj(NULL) { }; CJS_Object::~CJS_Object(void) { - delete m_pEmbedObj; - m_pEmbedObj = NULL; - m_pObject.Reset(); }; @@ -137,3 +123,43 @@ void CJS_Object::Alert(CJS_Context* pContext, const FX_WCHAR* swMsg) { 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; +} |