Index: fpdfsdk/javascript/app.cpp |
diff --git a/fpdfsdk/javascript/app.cpp b/fpdfsdk/javascript/app.cpp |
index 41fa15259a218d6f6ef2b91006b3d2fe1493c89b..83836759d763a946616bacbc8b8bab59de23fcf3 100644 |
--- a/fpdfsdk/javascript/app.cpp |
+++ b/fpdfsdk/javascript/app.cpp |
@@ -32,7 +32,7 @@ END_JS_STATIC_METHOD() |
IMPLEMENT_JS_CLASS(CJS_TimerObj, TimerObj) |
TimerObj::TimerObj(CJS_Object* pJSObject) |
- : CJS_EmbedObj(pJSObject), m_pTimer(NULL) {} |
+ : CJS_EmbedObj(pJSObject), m_pTimer(nullptr) {} |
TimerObj::~TimerObj() {} |
@@ -102,10 +102,6 @@ app::app(CJS_Object* pJSObject) |
: CJS_EmbedObj(pJSObject), m_bCalculate(true), m_bRuntimeHighLight(false) {} |
app::~app() { |
- for (int i = 0, sz = m_aTimer.GetSize(); i < sz; i++) |
- delete m_aTimer[i]; |
- |
- m_aTimer.RemoveAll(); |
} |
FX_BOOL app::activeDocs(IJS_Context* cc, |
@@ -120,7 +116,7 @@ FX_BOOL app::activeDocs(IJS_Context* cc, |
CPDFSDK_Document* pCurDoc = pContext->GetReaderDocument(); |
CJS_Array aDocs(pRuntime); |
if (CPDFSDK_Document* pDoc = pApp->GetSDKDocument()) { |
- CJS_Document* pJSDocument = NULL; |
+ CJS_Document* pJSDocument = nullptr; |
if (pDoc == pCurDoc) { |
v8::Local<v8::Object> pObj = FXJS_GetThisObj(pRuntime->GetIsolate()); |
if (FXJS_GetObjDefnID(pObj) == CJS_Document::g_nObjDefnID) |
@@ -384,19 +380,16 @@ FX_BOOL app::setInterval(IJS_Context* cc, |
CJS_Runtime* pRuntime = pContext->GetJSRuntime(); |
uint32_t dwInterval = params.size() > 1 ? params[1].ToInt() : 1000; |
- |
CPDFDoc_Environment* pApp = pRuntime->GetReaderApp(); |
- ASSERT(pApp); |
- CJS_Timer* pTimer = |
- new CJS_Timer(this, pApp, pRuntime, 0, script, dwInterval, 0); |
- m_aTimer.Add(pTimer); |
+ m_Timers.push_back(std::unique_ptr<CJS_Timer>( |
+ new CJS_Timer(this, pApp, pRuntime, 0, script, dwInterval, 0))); |
v8::Local<v8::Object> pRetObj = FXJS_NewFxDynamicObj( |
pRuntime->GetIsolate(), pRuntime, CJS_TimerObj::g_nObjDefnID); |
- CJS_TimerObj* pJS_TimerObj = |
- (CJS_TimerObj*)FXJS_GetPrivate(pRuntime->GetIsolate(), pRetObj); |
- TimerObj* pTimerObj = (TimerObj*)pJS_TimerObj->GetEmbedObject(); |
- pTimerObj->SetTimer(pTimer); |
+ CJS_TimerObj* pJS_TimerObj = static_cast<CJS_TimerObj*>( |
+ FXJS_GetPrivate(pRuntime->GetIsolate(), pRetObj)); |
+ TimerObj* pTimerObj = static_cast<TimerObj*>(pJS_TimerObj->GetEmbedObject()); |
+ pTimerObj->SetTimer(m_Timers.back().get()); |
vRet = pRetObj; |
return TRUE; |
@@ -406,36 +399,32 @@ FX_BOOL app::setTimeOut(IJS_Context* cc, |
const std::vector<CJS_Value>& params, |
CJS_Value& vRet, |
CFX_WideString& sError) { |
+ CJS_Context* pContext = static_cast<CJS_Context*>(cc); |
if (params.size() > 2 || params.size() == 0) { |
- sError = JSGetStringFromID((CJS_Context*)cc, IDS_STRING_JSPARAMERROR); |
+ sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR); |
return FALSE; |
} |
- CJS_Context* pContext = (CJS_Context*)cc; |
- CJS_Runtime* pRuntime = pContext->GetJSRuntime(); |
- |
- CFX_WideString script = params.size() > 0 ? params[0].ToCFXWideString() : L""; |
+ CFX_WideString script = params[0].ToCFXWideString(); |
if (script.IsEmpty()) { |
- sError = |
- JSGetStringFromID((CJS_Context*)cc, IDS_STRING_JSAFNUMBER_KEYSTROKE); |
+ sError = JSGetStringFromID(pContext, IDS_STRING_JSAFNUMBER_KEYSTROKE); |
return TRUE; |
} |
uint32_t dwTimeOut = params.size() > 1 ? params[1].ToInt() : 1000; |
- |
+ CJS_Runtime* pRuntime = pContext->GetJSRuntime(); |
CPDFDoc_Environment* pApp = pRuntime->GetReaderApp(); |
- ASSERT(pApp); |
- |
- CJS_Timer* pTimer = |
- new CJS_Timer(this, pApp, pRuntime, 1, script, dwTimeOut, dwTimeOut); |
- m_aTimer.Add(pTimer); |
+ m_Timers.push_back(std::unique_ptr<CJS_Timer>( |
+ new CJS_Timer(this, pApp, pRuntime, 1, script, dwTimeOut, dwTimeOut))); |
v8::Local<v8::Object> pRetObj = FXJS_NewFxDynamicObj( |
pRuntime->GetIsolate(), pRuntime, CJS_TimerObj::g_nObjDefnID); |
- CJS_TimerObj* pJS_TimerObj = |
- (CJS_TimerObj*)FXJS_GetPrivate(pRuntime->GetIsolate(), pRetObj); |
- TimerObj* pTimerObj = (TimerObj*)pJS_TimerObj->GetEmbedObject(); |
- pTimerObj->SetTimer(pTimer); |
+ |
+ CJS_TimerObj* pJS_TimerObj = static_cast<CJS_TimerObj*>( |
+ FXJS_GetPrivate(pRuntime->GetIsolate(), pRetObj)); |
+ |
+ TimerObj* pTimerObj = static_cast<TimerObj*>(pJS_TimerObj->GetEmbedObject()); |
+ pTimerObj->SetTimer(m_Timers.back().get()); |
vRet = pRetObj; |
return TRUE; |
@@ -451,29 +440,7 @@ FX_BOOL app::clearTimeOut(IJS_Context* cc, |
return FALSE; |
} |
- if (params[0].GetType() == CJS_Value::VT_fxobject) { |
- v8::Local<v8::Object> pObj = params[0].ToV8Object(); |
- if (FXJS_GetObjDefnID(pObj) == CJS_TimerObj::g_nObjDefnID) { |
- if (CJS_Object* pJSObj = params[0].ToCJSObject()) { |
- if (TimerObj* pTimerObj = (TimerObj*)pJSObj->GetEmbedObject()) { |
- if (CJS_Timer* pTimer = pTimerObj->GetTimer()) { |
- pTimer->KillJSTimer(); |
- |
- for (int i = 0, sz = m_aTimer.GetSize(); i < sz; i++) { |
- if (m_aTimer[i] == pTimer) { |
- m_aTimer.RemoveAt(i); |
- break; |
- } |
- } |
- |
- delete pTimer; |
- pTimerObj->SetTimer(NULL); |
- } |
- } |
- } |
- } |
- } |
- |
+ app::ClearTimerCommon(params[0]); |
return TRUE; |
} |
@@ -487,32 +454,42 @@ FX_BOOL app::clearInterval(IJS_Context* cc, |
return FALSE; |
} |
- if (params[0].GetType() == CJS_Value::VT_fxobject) { |
- v8::Local<v8::Object> pObj = params[0].ToV8Object(); |
- if (FXJS_GetObjDefnID(pObj) == CJS_TimerObj::g_nObjDefnID) { |
- if (CJS_Object* pJSObj = params[0].ToCJSObject()) { |
- if (TimerObj* pTimerObj = (TimerObj*)pJSObj->GetEmbedObject()) { |
- if (CJS_Timer* pTimer = pTimerObj->GetTimer()) { |
- pTimer->KillJSTimer(); |
- |
- for (int i = 0, sz = m_aTimer.GetSize(); i < sz; i++) { |
- if (m_aTimer[i] == pTimer) { |
- m_aTimer.RemoveAt(i); |
- break; |
- } |
- } |
- |
- delete pTimer; |
- pTimerObj->SetTimer(NULL); |
- } |
- } |
- } |
- } |
- } |
- |
+ app::ClearTimerCommon(params[0]); |
return TRUE; |
} |
+void app::ClearTimerCommon(const CJS_Value& param) { |
+ if (param.GetType() != CJS_Value::VT_fxobject) |
+ return; |
+ |
+ v8::Local<v8::Object> pObj = param.ToV8Object(); |
+ if (FXJS_GetObjDefnID(pObj) != CJS_TimerObj::g_nObjDefnID) |
+ return; |
+ |
+ CJS_Object* pJSObj = param.ToCJSObject(); |
+ if (!pJSObj) |
+ return; |
+ |
+ TimerObj* pTimerObj = static_cast<TimerObj*>(pJSObj->GetEmbedObject()); |
+ if (!pTimerObj) |
+ return; |
+ |
+ CJS_Timer* pTimer = pTimerObj->GetTimer(); |
+ if (!pTimer) |
+ return; |
+ |
+ pTimer->KillJSTimer(); |
+ auto iter = std::find_if(m_Timers.begin(), m_Timers.end(), |
+ [pTimer](const std::unique_ptr<CJS_Timer>& that) { |
+ return pTimer == that.get(); |
+ }); |
+ |
+ if (iter != m_Timers.end()) |
+ m_Timers.erase(iter); |
+ |
+ pTimerObj->SetTimer(nullptr); |
+} |
+ |
FX_BOOL app::execMenuItem(IJS_Context* cc, |
const std::vector<CJS_Value>& params, |
CJS_Value& vRet, |