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