From 5110c4743751145c4ae1934cd1d83bc6c55bb43f Mon Sep 17 00:00:00 2001 From: John Abd-El-Malek Date: Sat, 17 May 2014 22:33:34 -0700 Subject: Initial commit. --- fpdfsdk/include/javascript/JS_Object.h | 288 +++++++++++++++++++++++++++++++++ 1 file changed, 288 insertions(+) create mode 100644 fpdfsdk/include/javascript/JS_Object.h (limited to 'fpdfsdk/include/javascript/JS_Object.h') diff --git a/fpdfsdk/include/javascript/JS_Object.h b/fpdfsdk/include/javascript/JS_Object.h new file mode 100644 index 0000000000..8b91f8cd0d --- /dev/null +++ b/fpdfsdk/include/javascript/JS_Object.h @@ -0,0 +1,288 @@ +// 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::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 m_pObject; + v8::Isolate* m_pIsolate; +}; + +struct JS_TIMER_MAP +{ + FX_UINT nID; + CJS_Timer * pTimer; +}; + +typedef CFX_ArrayTemplate CTimerMapArray; + +struct JS_TIMER_MAPARRAY +{ +public: + JS_TIMER_MAPARRAY() + { + } + + ~JS_TIMER_MAPARRAY() + { + Reset(); + } + + void Reset() + { + for (int i=0,sz=m_Array.GetSize(); 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(); inID == 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_ -- cgit v1.2.3