| // Copyright 2014 PDFium Authors. All rights reserved. | |
| // 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 | |
| #ifndef _JS_OBJECT_H_ | |
| #define _JS_OBJECT_H_ | |
| class CJS_Object; | |
| class CJS_Timer; | |
| class CJS_Context; | |
| class CJS_EmbedObj : public CFX_Object | |
| { | |
| public: | |
| CJS_EmbedObj(CJS_Object* pJSObject); | |
| virtual ~CJS_EmbedObj(); | |
| virtual void TimerProc(CJS_Timer* pTimer){}; | |
| CJS_Timer* BeginTimer(CPDFDoc_Environment * pApp, FX_UINT nElapse); | |
| void EndTimer(CJS_Timer* pTimer); | |
| CJS_Object* GetJSObject(){return m_pJSObject;}; | |
| operator CJS_Object* (){return m_pJSObject;}; | |
| CPDFSDK_PageView * JSGetPageView(IFXJS_Context* cc); | |
| int MsgBox(CPDFDoc_Environment* pApp, CPDFSDK_PageView* pPageView, FX_LPCWSTR swMsg, FX_LPCWSTR swTitle = NULL, FX_UINT nType = 0, FX_UINT nIcon = 0); | |
| void Alert(CJS_Context* pContext, FX_LPCWSTR swMsg); | |
| FX_BOOL IsSafeMode(IFXJS_Context* cc); | |
| protected: | |
| CJS_Object* m_pJSObject; | |
| }; | |
| class CJS_Object : public CFX_Object | |
| { | |
| public: | |
| CJS_Object(JSFXObject pObject); | |
| virtual ~CJS_Object(void); | |
| void MakeWeak(); | |
| virtual FX_BOOL IsType(FX_LPCSTR sClassName){return TRUE;}; | |
| virtual CFX_ByteString GetClassName(){return "";}; | |
| virtual FX_BOOL InitInstance(IFXJS_Context* cc){return TRUE;}; | |
| virtual FX_BOOL ExitInstance(){return TRUE;}; | |
| operator JSFXObject () {return v8::Local<v8::Object>::New(m_pIsolate, m_pObject);} | |
| operator CJS_EmbedObj* (){return m_pEmbedObj;}; | |
| void SetEmbedObject(CJS_EmbedObj* pObj){m_pEmbedObj = pObj;}; | |
| CJS_EmbedObj * GetEmbedObject(){return m_pEmbedObj;}; | |
| static CPDFSDK_PageView * JSGetPageView(IFXJS_Context* cc); | |
| static int MsgBox(CPDFDoc_Environment* pApp, CPDFSDK_PageView* pPageView, FX_LPCWSTR swMsg, FX_LPCWSTR swTitle = NULL, FX_UINT nType = 0,FX_UINT nIcon = 0); | |
| static void Alert(CJS_Context* pContext, FX_LPCWSTR swMsg); | |
| v8::Isolate* GetIsolate() {return m_pIsolate;} | |
| protected: | |
| CJS_EmbedObj * m_pEmbedObj; | |
| v8::Persistent<v8::Object> m_pObject; | |
| v8::Isolate* m_pIsolate; | |
| }; | |
| struct JS_TIMER_MAP | |
| { | |
| FX_UINT nID; | |
| CJS_Timer * pTimer; | |
| }; | |
| typedef CFX_ArrayTemplate<JS_TIMER_MAP*> CTimerMapArray; | |
| struct JS_TIMER_MAPARRAY | |
| { | |
| public: | |
| JS_TIMER_MAPARRAY() | |
| { | |
| } | |
| ~JS_TIMER_MAPARRAY() | |
| { | |
| Reset(); | |
| } | |
| void Reset() | |
| { | |
| for (int i=0,sz=m_Array.GetSize(); i<sz; i++) | |
| delete m_Array.GetAt(i); | |
| m_Array.RemoveAll(); | |
| } | |
| void SetAt(FX_UINT nIndex,CJS_Timer * pTimer) | |
| { | |
| int i = Find(nIndex); | |
| if (i>=0) | |
| { | |
| if (JS_TIMER_MAP * pMap = m_Array.GetAt(i)) | |
| pMap->pTimer = pTimer; | |
| } | |
| else | |
| { | |
| if (JS_TIMER_MAP * pMap = new JS_TIMER_MAP) | |
| { | |
| pMap->nID = nIndex; | |
| pMap->pTimer = pTimer; | |
| m_Array.Add(pMap); | |
| } | |
| } | |
| } | |
| CJS_Timer * GetAt(FX_UINT nIndex) | |
| { | |
| int i = Find(nIndex); | |
| if (i>=0) | |
| { | |
| if (JS_TIMER_MAP * pMap = m_Array.GetAt(i)) | |
| return pMap->pTimer; | |
| } | |
| return NULL; | |
| } | |
| void RemoveAt(FX_UINT nIndex) | |
| { | |
| int i = Find(nIndex); | |
| if (i>=0) | |
| { | |
| delete m_Array.GetAt(i); | |
| m_Array.RemoveAt(i); | |
| } | |
| //To prevent potential fake memory leak reported by vc6. | |
| if(m_Array.GetSize() == 0) | |
| m_Array.RemoveAll(); | |
| } | |
| int Find(FX_UINT nIndex) | |
| { | |
| for (int i=0,sz=m_Array.GetSize(); i<sz; i++) | |
| { | |
| if (JS_TIMER_MAP * pMap = m_Array.GetAt(i)) | |
| { | |
| if (pMap->nID == nIndex) | |
| return i; | |
| } | |
| } | |
| return -1; | |
| } | |
| CTimerMapArray m_Array; | |
| }; | |
| static JS_TIMER_MAPARRAY m_sTimeMap; | |
| class CJS_Runtime; | |
| class CJS_Timer | |
| { | |
| public: | |
| CJS_Timer(CJS_EmbedObj * pObj,CPDFDoc_Environment* pApp): m_pEmbedObj(pObj), | |
| m_nTimerID(0), | |
| m_bProcessing(FALSE), | |
| m_dwStartTime(0), | |
| m_dwTimeOut(0), | |
| m_dwElapse(0), | |
| m_pRuntime(NULL), | |
| m_nType(0), | |
| m_pApp(pApp) | |
| { | |
| } | |
| virtual ~CJS_Timer() | |
| { | |
| KillJSTimer(); | |
| } | |
| public: | |
| FX_UINT SetJSTimer(FX_UINT nElapse) | |
| { | |
| if (m_nTimerID)KillJSTimer(); | |
| IFX_SystemHandler* pHandler = m_pApp->GetSysHandler(); | |
| m_nTimerID = pHandler->SetTimer(nElapse,TimerProc); | |
| m_sTimeMap.SetAt(m_nTimerID,this); | |
| m_dwElapse = nElapse; | |
| return m_nTimerID; | |
| }; | |
| void KillJSTimer() | |
| { | |
| if (m_nTimerID) | |
| { | |
| IFX_SystemHandler* pHandler = m_pApp->GetSysHandler(); | |
| pHandler->KillTimer(m_nTimerID); | |
| m_sTimeMap.RemoveAt(m_nTimerID); | |
| m_nTimerID = 0; | |
| } | |
| }; | |
| void SetType(int nType) | |
| { | |
| m_nType = nType; | |
| } | |
| int GetType() const | |
| { | |
| return m_nType; | |
| } | |
| void SetStartTime(FX_DWORD dwStartTime) | |
| { | |
| m_dwStartTime = dwStartTime; | |
| } | |
| FX_DWORD GetStartTime() const | |
| { | |
| return m_dwStartTime; | |
| } | |
| void SetTimeOut(FX_DWORD dwTimeOut) | |
| { | |
| m_dwTimeOut = dwTimeOut; | |
| } | |
| FX_DWORD GetTimeOut() const | |
| { | |
| return m_dwTimeOut; | |
| } | |
| void SetRuntime(CJS_Runtime* pRuntime) | |
| { | |
| m_pRuntime = pRuntime; | |
| } | |
| CJS_Runtime* GetRuntime() const | |
| { | |
| return m_pRuntime; | |
| } | |
| void SetJScript(const CFX_WideString& script) | |
| { | |
| m_swJScript = script; | |
| } | |
| CFX_WideString GetJScript() const | |
| { | |
| return m_swJScript; | |
| } | |
| static void TimerProc(int idEvent) | |
| { | |
| if (CJS_Timer * pTimer = m_sTimeMap.GetAt(idEvent)) | |
| { | |
| if (!pTimer->m_bProcessing) | |
| { | |
| pTimer->m_bProcessing = TRUE; | |
| if (pTimer->m_pEmbedObj) pTimer->m_pEmbedObj->TimerProc(pTimer); | |
| pTimer->m_bProcessing = FALSE; | |
| } | |
| else | |
| { | |
| // TRACE(L"BUSY!\n"); | |
| } | |
| } | |
| }; | |
| private: | |
| FX_UINT m_nTimerID; | |
| CJS_EmbedObj* m_pEmbedObj; | |
| FX_BOOL m_bProcessing; | |
| //data | |
| FX_DWORD m_dwStartTime; | |
| FX_DWORD m_dwTimeOut; | |
| FX_DWORD m_dwElapse; | |
| CJS_Runtime* m_pRuntime; | |
| CFX_WideString m_swJScript; | |
| int m_nType; //0:Interval; 1:TimeOut | |
| CPDFDoc_Environment* m_pApp; | |
| }; | |
| #endif //_JS_OBJECT_H_ |