OLD | NEW |
| (Empty) |
1 // Copyright 2014 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 "fpdfsdk/src/javascript/JS_Object.h" | |
8 | |
9 #include "fpdfsdk/include/fsdk_mgr.h" // For CPDFDoc_Environment. | |
10 #include "fpdfsdk/include/javascript/IJavaScript.h" | |
11 #include "fpdfsdk/src/javascript/JS_Context.h" | |
12 #include "fpdfsdk/src/javascript/JS_Define.h" | |
13 | |
14 namespace { | |
15 | |
16 int FXJS_MsgBox(CPDFDoc_Environment* pApp, | |
17 const FX_WCHAR* swMsg, | |
18 const FX_WCHAR* swTitle, | |
19 FX_UINT nType, | |
20 FX_UINT nIcon) { | |
21 if (!pApp) | |
22 return 0; | |
23 | |
24 if (CPDFSDK_Document* pDoc = pApp->GetSDKDocument()) | |
25 pDoc->KillFocusAnnot(); | |
26 | |
27 return pApp->JS_appAlert(swMsg, swTitle, nType, nIcon); | |
28 } | |
29 | |
30 } // namespace | |
31 | |
32 CJS_EmbedObj::CJS_EmbedObj(CJS_Object* pJSObject) : m_pJSObject(pJSObject) {} | |
33 | |
34 CJS_EmbedObj::~CJS_EmbedObj() { | |
35 m_pJSObject = NULL; | |
36 } | |
37 | |
38 int CJS_EmbedObj::MsgBox(CPDFDoc_Environment* pApp, | |
39 const FX_WCHAR* swMsg, | |
40 const FX_WCHAR* swTitle, | |
41 FX_UINT nType, | |
42 FX_UINT nIcon) { | |
43 return FXJS_MsgBox(pApp, swMsg, swTitle, nType, nIcon); | |
44 } | |
45 | |
46 void CJS_EmbedObj::Alert(CJS_Context* pContext, const FX_WCHAR* swMsg) { | |
47 CJS_Object::Alert(pContext, swMsg); | |
48 } | |
49 | |
50 void FreeObject(const v8::WeakCallbackInfo<CJS_Object>& data) { | |
51 CJS_Object* pJSObj = data.GetParameter(); | |
52 pJSObj->ExitInstance(); | |
53 delete pJSObj; | |
54 FXJS_FreePrivate(data.GetInternalField(0)); | |
55 } | |
56 | |
57 void DisposeObject(const v8::WeakCallbackInfo<CJS_Object>& data) { | |
58 CJS_Object* pJSObj = data.GetParameter(); | |
59 pJSObj->Dispose(); | |
60 data.SetSecondPassCallback(FreeObject); | |
61 } | |
62 | |
63 CJS_Object::CJS_Object(v8::Local<v8::Object> pObject) { | |
64 m_pIsolate = pObject->GetIsolate(); | |
65 m_pV8Object.Reset(m_pIsolate, pObject); | |
66 } | |
67 | |
68 CJS_Object::~CJS_Object() { | |
69 } | |
70 | |
71 void CJS_Object::MakeWeak() { | |
72 m_pV8Object.SetWeak(this, DisposeObject, | |
73 v8::WeakCallbackType::kInternalFields); | |
74 } | |
75 | |
76 void CJS_Object::Dispose() { | |
77 m_pV8Object.Reset(); | |
78 } | |
79 | |
80 int CJS_Object::MsgBox(CPDFDoc_Environment* pApp, | |
81 const FX_WCHAR* swMsg, | |
82 const FX_WCHAR* swTitle, | |
83 FX_UINT nType, | |
84 FX_UINT nIcon) { | |
85 return FXJS_MsgBox(pApp, swMsg, swTitle, nType, nIcon); | |
86 } | |
87 | |
88 void CJS_Object::Alert(CJS_Context* pContext, const FX_WCHAR* swMsg) { | |
89 if (pContext->IsMsgBoxEnabled()) { | |
90 CPDFDoc_Environment* pApp = pContext->GetReaderApp(); | |
91 if (pApp) | |
92 pApp->JS_appAlert(swMsg, NULL, 0, 3); | |
93 } | |
94 } | |
95 | |
96 CJS_Timer::CJS_Timer(CJS_EmbedObj* pObj, | |
97 CPDFDoc_Environment* pApp, | |
98 CJS_Runtime* pRuntime, | |
99 int nType, | |
100 const CFX_WideString& script, | |
101 FX_DWORD dwElapse, | |
102 FX_DWORD dwTimeOut) | |
103 : m_nTimerID(0), | |
104 m_pEmbedObj(pObj), | |
105 m_bProcessing(false), | |
106 m_bValid(true), | |
107 m_nType(nType), | |
108 m_dwTimeOut(dwTimeOut), | |
109 m_swJScript(script), | |
110 m_pRuntime(pRuntime), | |
111 m_pApp(pApp) { | |
112 IFX_SystemHandler* pHandler = m_pApp->GetSysHandler(); | |
113 m_nTimerID = pHandler->SetTimer(dwElapse, TimerProc); | |
114 (*GetGlobalTimerMap())[m_nTimerID] = this; | |
115 m_pRuntime->AddObserver(this); | |
116 } | |
117 | |
118 CJS_Timer::~CJS_Timer() { | |
119 CJS_Runtime* pRuntime = GetRuntime(); | |
120 if (pRuntime) | |
121 pRuntime->RemoveObserver(this); | |
122 KillJSTimer(); | |
123 } | |
124 | |
125 void CJS_Timer::KillJSTimer() { | |
126 if (m_nTimerID) { | |
127 if (m_bValid) { | |
128 IFX_SystemHandler* pHandler = m_pApp->GetSysHandler(); | |
129 pHandler->KillTimer(m_nTimerID); | |
130 } | |
131 GetGlobalTimerMap()->erase(m_nTimerID); | |
132 m_nTimerID = 0; | |
133 } | |
134 } | |
135 | |
136 // static | |
137 void CJS_Timer::TimerProc(int idEvent) { | |
138 const auto it = GetGlobalTimerMap()->find(idEvent); | |
139 if (it != GetGlobalTimerMap()->end()) { | |
140 CJS_Timer* pTimer = it->second; | |
141 if (!pTimer->m_bProcessing) { | |
142 CFX_AutoRestorer<bool> scoped_processing(&pTimer->m_bProcessing); | |
143 pTimer->m_bProcessing = true; | |
144 if (pTimer->m_pEmbedObj) | |
145 pTimer->m_pEmbedObj->TimerProc(pTimer); | |
146 } | |
147 } | |
148 } | |
149 | |
150 // static | |
151 CJS_Timer::TimerMap* CJS_Timer::GetGlobalTimerMap() { | |
152 // Leak the timer array at shutdown. | |
153 static auto* s_TimerMap = new TimerMap; | |
154 return s_TimerMap; | |
155 } | |
156 | |
157 void CJS_Timer::OnDestroyed() { | |
158 m_bValid = false; | |
159 } | |
OLD | NEW |