1 // Copyright 2017 PDFium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com 6 7 #include "fxjs/global_timer.h" 8 9 GlobalTimer::GlobalTimer(app* pObj, 10 CPDFSDK_FormFillEnvironment* pFormFillEnv, 11 CJS_Runtime* pRuntime, 12 int nType, 13 const WideString& script, 14 uint32_t dwElapse, 15 uint32_t dwTimeOut) 16 : m_nTimerID(0), 17 m_pEmbedObj(pObj), 18 m_bProcessing(false), 19 m_nType(nType), 20 m_dwTimeOut(dwTimeOut), 21 m_swJScript(script), 22 m_pRuntime(pRuntime), 23 m_pFormFillEnv(pFormFillEnv) { 24 CFX_SystemHandler* pHandler = m_pFormFillEnv->GetSysHandler(); 25 m_nTimerID = pHandler->SetTimer(dwElapse, Trigger); 26 if (m_nTimerID) 27 (*GetGlobalTimerMap())[m_nTimerID] = this; 28 } 29 30 GlobalTimer::~GlobalTimer() { 31 if (!m_nTimerID) 32 return; 33 34 if (GetRuntime()) 35 m_pFormFillEnv->GetSysHandler()->KillTimer(m_nTimerID); 36 37 GetGlobalTimerMap()->erase(m_nTimerID); 38 } 39 40 // static 41 void GlobalTimer::Trigger(int nTimerID) { 42 auto it = GetGlobalTimerMap()->find(nTimerID); 43 if (it == GetGlobalTimerMap()->end()) 44 return; 45 46 GlobalTimer* pTimer = it->second; 47 if (pTimer->m_bProcessing) 48 return; 49 50 pTimer->m_bProcessing = true; 51 if (pTimer->m_pEmbedObj) 52 pTimer->m_pEmbedObj->TimerProc(pTimer); 53 54 // Timer proc may have destroyed timer, find it again. 55 it = GetGlobalTimerMap()->find(nTimerID); 56 if (it == GetGlobalTimerMap()->end()) 57 return; 58 59 pTimer = it->second; 60 pTimer->m_bProcessing = false; 61 if (pTimer->IsOneShot()) 62 pTimer->m_pEmbedObj->CancelProc(pTimer); 63 } 64 65 // static 66 void GlobalTimer::Cancel(int nTimerID) { 67 auto it = GetGlobalTimerMap()->find(nTimerID); 68 if (it == GetGlobalTimerMap()->end()) 69 return; 70 71 GlobalTimer* pTimer = it->second; 72 pTimer->m_pEmbedObj->CancelProc(pTimer); 73 } 74 75 // static 76 GlobalTimer::TimerMap* GlobalTimer::GetGlobalTimerMap() { 77 // Leak the timer array at shutdown. 78 static auto* s_TimerMap = new TimerMap; 79 return s_TimerMap; 80 } 81