| Index: fpdfsdk/src/javascript/JS_Object.cpp
|
| diff --git a/fpdfsdk/src/javascript/JS_Object.cpp b/fpdfsdk/src/javascript/JS_Object.cpp
|
| index 3cffec785da2c1db0b5ad898451489c8e7118be7..7520a997782b26e5966b45aaaeeae197074b0139 100644
|
| --- a/fpdfsdk/src/javascript/JS_Object.cpp
|
| +++ b/fpdfsdk/src/javascript/JS_Object.cpp
|
| @@ -56,20 +56,6 @@ void CJS_EmbedObj::Alert(CJS_Context* pContext, const FX_WCHAR* swMsg) {
|
| CJS_Object::Alert(pContext, swMsg);
|
| }
|
|
|
| -CJS_Timer* CJS_EmbedObj::BeginTimer(CPDFDoc_Environment* pApp,
|
| - FX_UINT nElapse) {
|
| - CJS_Timer* pTimer = new CJS_Timer(this, pApp);
|
| - pTimer->SetJSTimer(nElapse);
|
| -
|
| - return pTimer;
|
| -}
|
| -
|
| -void CJS_EmbedObj::EndTimer(CJS_Timer* pTimer) {
|
| - ASSERT(pTimer != NULL);
|
| - pTimer->KillJSTimer();
|
| - delete pTimer;
|
| -}
|
| -
|
| void FreeObject(const v8::WeakCallbackInfo<CJS_Object>& data) {
|
| CJS_Object* pJSObj = data.GetParameter();
|
| pJSObj->ExitInstance();
|
| @@ -123,20 +109,40 @@ void CJS_Object::Alert(CJS_Context* pContext, const FX_WCHAR* swMsg) {
|
| }
|
| }
|
|
|
| -FX_UINT CJS_Timer::SetJSTimer(FX_UINT nElapse) {
|
| - if (m_nTimerID)
|
| - KillJSTimer();
|
| +CJS_Timer::CJS_Timer(CJS_EmbedObj* pObj,
|
| + CPDFDoc_Environment* pApp,
|
| + CJS_Runtime* pRuntime,
|
| + int nType,
|
| + const CFX_WideString& script,
|
| + FX_DWORD dwElapse,
|
| + FX_DWORD dwTimeOut)
|
| + : m_nTimerID(0),
|
| + m_pEmbedObj(pObj),
|
| + m_bProcessing(false),
|
| + m_bValid(true),
|
| + m_nType(nType),
|
| + m_dwTimeOut(dwTimeOut),
|
| + m_pRuntime(pRuntime),
|
| + m_pApp(pApp) {
|
| IFX_SystemHandler* pHandler = m_pApp->GetSysHandler();
|
| - m_nTimerID = pHandler->SetTimer(nElapse, TimerProc);
|
| + m_nTimerID = pHandler->SetTimer(dwElapse, TimerProc);
|
| (*GetGlobalTimerMap())[m_nTimerID] = this;
|
| - m_dwElapse = nElapse;
|
| - return m_nTimerID;
|
| + m_pRuntime->AddObserver(this);
|
| +}
|
| +
|
| +CJS_Timer::~CJS_Timer() {
|
| + CJS_Runtime* pRuntime = GetRuntime();
|
| + if (pRuntime)
|
| + pRuntime->RemoveObserver(this);
|
| + KillJSTimer();
|
| }
|
|
|
| void CJS_Timer::KillJSTimer() {
|
| if (m_nTimerID) {
|
| - IFX_SystemHandler* pHandler = m_pApp->GetSysHandler();
|
| - pHandler->KillTimer(m_nTimerID);
|
| + if (m_bValid) {
|
| + IFX_SystemHandler* pHandler = m_pApp->GetSysHandler();
|
| + pHandler->KillTimer(m_nTimerID);
|
| + }
|
| GetGlobalTimerMap()->erase(m_nTimerID);
|
| m_nTimerID = 0;
|
| }
|
| @@ -148,10 +154,10 @@ void CJS_Timer::TimerProc(int idEvent) {
|
| if (it != GetGlobalTimerMap()->end()) {
|
| CJS_Timer* pTimer = it->second;
|
| if (!pTimer->m_bProcessing) {
|
| - pTimer->m_bProcessing = TRUE;
|
| + CFX_AutoRestorer<bool> scoped_processing(&pTimer->m_bProcessing);
|
| + pTimer->m_bProcessing = true;
|
| if (pTimer->m_pEmbedObj)
|
| pTimer->m_pEmbedObj->TimerProc(pTimer);
|
| - pTimer->m_bProcessing = FALSE;
|
| }
|
| }
|
| }
|
| @@ -162,3 +168,7 @@ CJS_Timer::TimerMap* CJS_Timer::GetGlobalTimerMap() {
|
| static auto* s_TimerMap = new TimerMap;
|
| return s_TimerMap;
|
| }
|
| +
|
| +void CJS_Timer::OnDestroyed() {
|
| + m_bValid = false;
|
| +}
|
|
|