Kill JS_TIMER_MAPARRAY
[pdfium.git] / fpdfsdk / include / javascript / JS_Object.h
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 #ifndef FPDFSDK_INCLUDE_JAVASCRIPT_JS_OBJECT_H_
8 #define FPDFSDK_INCLUDE_JAVASCRIPT_JS_OBJECT_H_
9
10 #include <map>
11
12 #include "../fsdk_define.h"       // For FX_UINT
13 #include "../fsdk_mgr.h"          // For CPDFDoc_Environment
14 #include "../fx_systemhandler.h"  // For IFX_SystemHandler
15 #include "../jsapi/fxjs_v8.h"
16
17 class CPDFSDK_PageView;
18 class CJS_Object;
19 class CJS_Timer;
20 class CJS_Context;
21
22 class CJS_EmbedObj {
23  public:
24   CJS_EmbedObj(CJS_Object* pJSObject);
25   virtual ~CJS_EmbedObj();
26
27   virtual void TimerProc(CJS_Timer* pTimer){};
28
29   CJS_Timer* BeginTimer(CPDFDoc_Environment* pApp, FX_UINT nElapse);
30   void EndTimer(CJS_Timer* pTimer);
31
32   CJS_Object* GetJSObject() { return m_pJSObject; };
33   operator CJS_Object*() { return m_pJSObject; };
34
35   CPDFSDK_PageView* JSGetPageView(IFXJS_Context* cc);
36   int MsgBox(CPDFDoc_Environment* pApp,
37              CPDFSDK_PageView* pPageView,
38              const FX_WCHAR* swMsg,
39              const FX_WCHAR* swTitle = NULL,
40              FX_UINT nType = 0,
41              FX_UINT nIcon = 0);
42   void Alert(CJS_Context* pContext, const FX_WCHAR* swMsg);
43
44  protected:
45   CJS_Object* m_pJSObject;
46 };
47
48 class CJS_Object {
49  public:
50   CJS_Object(JSFXObject pObject);
51   virtual ~CJS_Object(void);
52
53   void MakeWeak();
54   void Dispose();
55
56   virtual FX_BOOL IsType(const FX_CHAR* sClassName) { return TRUE; };
57   virtual CFX_ByteString GetClassName() { return ""; };
58
59   virtual FX_BOOL InitInstance(IFXJS_Context* cc) { return TRUE; };
60   virtual FX_BOOL ExitInstance() { return TRUE; };
61
62   operator JSFXObject() {
63     return v8::Local<v8::Object>::New(m_pIsolate, m_pObject);
64   }
65   operator CJS_EmbedObj*() { return m_pEmbedObj; };
66
67   void SetEmbedObject(CJS_EmbedObj* pObj) { m_pEmbedObj = pObj; };
68   CJS_EmbedObj* GetEmbedObject() { return m_pEmbedObj; };
69
70   static CPDFSDK_PageView* JSGetPageView(IFXJS_Context* cc);
71   static int MsgBox(CPDFDoc_Environment* pApp,
72                     CPDFSDK_PageView* pPageView,
73                     const FX_WCHAR* swMsg,
74                     const FX_WCHAR* swTitle = NULL,
75                     FX_UINT nType = 0,
76                     FX_UINT nIcon = 0);
77   static void Alert(CJS_Context* pContext, const FX_WCHAR* swMsg);
78
79   v8::Isolate* GetIsolate() { return m_pIsolate; }
80
81  protected:
82   CJS_EmbedObj* m_pEmbedObj;
83   v8::Global<v8::Object> m_pObject;
84   v8::Isolate* m_pIsolate;
85 };
86
87 using JSTimerMap = std::map<FX_UINT, CJS_Timer*>;
88 JSTimerMap* GetGlobalTimerMap();
89
90 class CJS_Runtime;
91
92 class CJS_Timer {
93  public:
94   CJS_Timer(CJS_EmbedObj* pObj, CPDFDoc_Environment* pApp)
95       : m_nTimerID(0),
96         m_pEmbedObj(pObj),
97         m_bProcessing(FALSE),
98         m_dwStartTime(0),
99         m_dwTimeOut(0),
100         m_dwElapse(0),
101         m_pRuntime(NULL),
102         m_nType(0),
103         m_pApp(pApp) {}
104
105   virtual ~CJS_Timer() { KillJSTimer(); }
106
107  public:
108   FX_UINT SetJSTimer(FX_UINT nElapse) {
109     if (m_nTimerID)
110       KillJSTimer();
111     IFX_SystemHandler* pHandler = m_pApp->GetSysHandler();
112     m_nTimerID = pHandler->SetTimer(nElapse, TimerProc);
113     (*GetGlobalTimerMap())[m_nTimerID] = this;
114     m_dwElapse = nElapse;
115     return m_nTimerID;
116   };
117
118   void KillJSTimer() {
119     if (m_nTimerID) {
120       IFX_SystemHandler* pHandler = m_pApp->GetSysHandler();
121       pHandler->KillTimer(m_nTimerID);
122       GetGlobalTimerMap()->erase(m_nTimerID);
123       m_nTimerID = 0;
124     }
125   };
126
127   void SetType(int nType) { m_nType = nType; }
128
129   int GetType() const { return m_nType; }
130
131   void SetStartTime(FX_DWORD dwStartTime) { m_dwStartTime = dwStartTime; }
132
133   FX_DWORD GetStartTime() const { return m_dwStartTime; }
134
135   void SetTimeOut(FX_DWORD dwTimeOut) { m_dwTimeOut = dwTimeOut; }
136
137   FX_DWORD GetTimeOut() const { return m_dwTimeOut; }
138
139   void SetRuntime(CJS_Runtime* pRuntime) { m_pRuntime = pRuntime; }
140
141   CJS_Runtime* GetRuntime() const { return m_pRuntime; }
142
143   void SetJScript(const CFX_WideString& script) { m_swJScript = script; }
144
145   CFX_WideString GetJScript() const { return m_swJScript; }
146
147   static void TimerProc(int idEvent) {
148     const auto it = GetGlobalTimerMap()->find(idEvent);
149     if (it != GetGlobalTimerMap()->end()) {
150       CJS_Timer* pTimer = it->second;
151       if (!pTimer->m_bProcessing) {
152         pTimer->m_bProcessing = TRUE;
153         if (pTimer->m_pEmbedObj)
154           pTimer->m_pEmbedObj->TimerProc(pTimer);
155         pTimer->m_bProcessing = FALSE;
156       }
157     }
158   };
159
160  private:
161   FX_UINT m_nTimerID;
162   CJS_EmbedObj* m_pEmbedObj;
163   FX_BOOL m_bProcessing;
164
165   // data
166   FX_DWORD m_dwStartTime;
167   FX_DWORD m_dwTimeOut;
168   FX_DWORD m_dwElapse;
169   CJS_Runtime* m_pRuntime;
170   CFX_WideString m_swJScript;
171   int m_nType;  // 0:Interval; 1:TimeOut
172
173   CPDFDoc_Environment* m_pApp;
174 };
175
176 #endif  // FPDFSDK_INCLUDE_JAVASCRIPT_JS_OBJECT_H_