mirror of
https://pdfium.googlesource.com/pdfium
synced 2026-07-31 22:26:36 +08:00
Change-Id: I0529c85bd612da83ccb2db11498a5a8860f1563f Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/130732 Reviewed-by: Tom Sepez <tsepez@chromium.org> Commit-Queue: Lei Zhang <thestig@chromium.org>
110 lines
2.6 KiB
C++
110 lines
2.6 KiB
C++
// Copyright 2017 The PDFium Authors
|
|
// Use of this source code is governed by a BSD-style license that can be
|
|
// found in the LICENSE file.
|
|
|
|
// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
|
|
|
|
#include "fxjs/global_timer.h"
|
|
|
|
#include <map>
|
|
|
|
#include "core/fxcrt/cfx_timer.h"
|
|
#include "core/fxcrt/check.h"
|
|
#include "core/fxcrt/containers/contains.h"
|
|
#include "fxjs/cjs_app.h"
|
|
|
|
namespace {
|
|
|
|
using TimerMap = std::map<int32_t, GlobalTimer*>;
|
|
TimerMap* g_global_timer_map = nullptr;
|
|
|
|
} // namespace
|
|
|
|
// static
|
|
void GlobalTimer::InitializeGlobals() {
|
|
CHECK(!g_global_timer_map);
|
|
g_global_timer_map = new TimerMap();
|
|
}
|
|
|
|
// static
|
|
void GlobalTimer::DestroyGlobals() {
|
|
delete g_global_timer_map;
|
|
g_global_timer_map = nullptr;
|
|
}
|
|
|
|
GlobalTimer::GlobalTimer(CJS_App* pObj,
|
|
CJS_Runtime* pRuntime,
|
|
Type nType,
|
|
const WideString& script,
|
|
uint32_t dwElapse,
|
|
uint32_t dwTimeOut)
|
|
: type_(nType),
|
|
timer_id_(pRuntime->GetTimerHandler()->SetTimer(dwElapse, Trigger)),
|
|
time_out_(dwTimeOut),
|
|
jscript_(script),
|
|
runtime_(pRuntime),
|
|
embed_app_(pObj) {
|
|
if (HasValidID()) {
|
|
DCHECK(!pdfium::Contains((*g_global_timer_map), timer_id_));
|
|
(*g_global_timer_map)[timer_id_] = this;
|
|
}
|
|
}
|
|
|
|
GlobalTimer::~GlobalTimer() {
|
|
if (!HasValidID()) {
|
|
return;
|
|
}
|
|
|
|
if (runtime_ && runtime_->GetTimerHandler()) {
|
|
runtime_->GetTimerHandler()->KillTimer(timer_id_);
|
|
}
|
|
|
|
DCHECK(pdfium::Contains((*g_global_timer_map), timer_id_));
|
|
g_global_timer_map->erase(timer_id_);
|
|
}
|
|
|
|
// static
|
|
void GlobalTimer::Trigger(int32_t nTimerID) {
|
|
auto it = g_global_timer_map->find(nTimerID);
|
|
if (it == g_global_timer_map->end()) {
|
|
return;
|
|
}
|
|
|
|
GlobalTimer* pTimer = it->second;
|
|
if (pTimer->processing_) {
|
|
return;
|
|
}
|
|
|
|
pTimer->processing_ = true;
|
|
if (pTimer->embed_app_) {
|
|
pTimer->embed_app_->TimerProc(pTimer);
|
|
}
|
|
|
|
// Timer proc may have destroyed timer, find it again.
|
|
it = g_global_timer_map->find(nTimerID);
|
|
if (it == g_global_timer_map->end()) {
|
|
return;
|
|
}
|
|
|
|
pTimer = it->second;
|
|
pTimer->processing_ = false;
|
|
if (pTimer->IsOneShot()) {
|
|
pTimer->embed_app_->CancelProc(pTimer);
|
|
}
|
|
}
|
|
|
|
// static
|
|
void GlobalTimer::Cancel(int32_t nTimerID) {
|
|
auto it = g_global_timer_map->find(nTimerID);
|
|
if (it == g_global_timer_map->end()) {
|
|
return;
|
|
}
|
|
|
|
GlobalTimer* pTimer = it->second;
|
|
pTimer->embed_app_->CancelProc(pTimer);
|
|
}
|
|
|
|
bool GlobalTimer::HasValidID() const {
|
|
return timer_id_ != CFX_Timer::HandlerIface::kInvalidTimerID;
|
|
}
|