Remove pointless CPDFSDK_PageView usage in CJS_Object / CJS_EmbedObj.
[pdfium.git] / fpdfsdk / include / javascript / JS_Object.h
index a6dac5d..6116a83 100644 (file)
 // 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);
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
 
-protected:
+#ifndef FPDFSDK_INCLUDE_JAVASCRIPT_JS_OBJECT_H_
+#define FPDFSDK_INCLUDE_JAVASCRIPT_JS_OBJECT_H_
 
-       CJS_Object*                                     m_pJSObject;
-};
+#include <map>
 
-class CJS_Object : public CFX_Object
-{
-public:
-       CJS_Object(JSFXObject pObject);
-       virtual ~CJS_Object(void);
-       
-       void                                            MakeWeak();
+#include "../../../third_party/base/nonstd_unique_ptr.h"
 
-       virtual FX_BOOL                         IsType(FX_LPCSTR sClassName){return TRUE;};
-       virtual CFX_ByteString          GetClassName(){return "";};
+#include "../fsdk_define.h"       // For FX_UINT
+#include "../fsdk_mgr.h"          // For CPDFDoc_Environment
+#include "../fx_systemhandler.h"  // For IFX_SystemHandler
+#include "../jsapi/fxjs_v8.h"
+#include "JS_Runtime.h"
 
-       virtual FX_BOOL                         InitInstance(IFXJS_Context* cc){return TRUE;};
-       virtual FX_BOOL                         ExitInstance(){return TRUE;};
+class CJS_Context;
+class CJS_Object;
+class CJS_Timer;
 
-       operator                                        JSFXObject () {return v8::Local<v8::Object>::New(m_pIsolate, m_pObject);}
-       operator                                        CJS_EmbedObj* (){return m_pEmbedObj;};
+class CJS_EmbedObj {
+ public:
+  explicit CJS_EmbedObj(CJS_Object* pJSObject);
+  virtual ~CJS_EmbedObj();
 
-       void                                            SetEmbedObject(CJS_EmbedObj* pObj){m_pEmbedObj = pObj;};
-       CJS_EmbedObj *                          GetEmbedObject(){return m_pEmbedObj;};
+  virtual void TimerProc(CJS_Timer* pTimer) {}
 
-       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);
+  CJS_Object* GetJSObject() const { return m_pJSObject; }
 
-       v8::Isolate*                                    GetIsolate() {return m_pIsolate;}
-protected:
-       CJS_EmbedObj *                          m_pEmbedObj;
-       v8::Persistent<v8::Object>                      m_pObject;
-       v8::Isolate*                                    m_pIsolate;
-};
+  int MsgBox(CPDFDoc_Environment* pApp,
+             const FX_WCHAR* swMsg,
+             const FX_WCHAR* swTitle,
+             FX_UINT nType,
+             FX_UINT nIcon);
+  void Alert(CJS_Context* pContext, const FX_WCHAR* swMsg);
 
-struct JS_TIMER_MAP
-{
-       FX_UINT nID;
-       CJS_Timer * pTimer;
+ protected:
+  CJS_Object* m_pJSObject;
 };
 
-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();
-       }
+class CJS_Object {
+ public:
+  explicit CJS_Object(v8::Local<v8::Object> pObject);
+  virtual ~CJS_Object();
 
-       void SetAt(FX_UINT nIndex,CJS_Timer * pTimer)
-       {
-               int i = Find(nIndex);
+  void MakeWeak();
+  void Dispose();
 
-               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);
-                       }
-               }
-       }
+  virtual FX_BOOL IsType(const FX_CHAR* sClassName) { return TRUE; }
+  virtual CFX_ByteString GetClassName() { return ""; }
 
-       CJS_Timer * GetAt(FX_UINT nIndex)
-       {
-               int i = Find(nIndex);
+  virtual FX_BOOL InitInstance(IFXJS_Context* cc) { return TRUE; }
+  virtual FX_BOOL ExitInstance() { return TRUE; }
 
-               if (i>=0)
-               {
-                       if (JS_TIMER_MAP * pMap = m_Array.GetAt(i))
-                               return pMap->pTimer;
-               }
-               return NULL;
-       }
+  v8::Local<v8::Object> ToV8Object() { return m_pV8Object.Get(m_pIsolate); }
 
-       void RemoveAt(FX_UINT nIndex)
-       {
-               int i = Find(nIndex);
+  // Takes ownership of |pObj|.
+  void SetEmbedObject(CJS_EmbedObj* pObj) { m_pEmbedObj.reset(pObj); }
+  CJS_EmbedObj* GetEmbedObject() const { return m_pEmbedObj.get(); }
 
-               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();
-       }
+  static int MsgBox(CPDFDoc_Environment* pApp,
+                    const FX_WCHAR* swMsg,
+                    const FX_WCHAR* swTitle,
+                    FX_UINT nType,
+                    FX_UINT nIcon);
+  static void Alert(CJS_Context* pContext, const FX_WCHAR* swMsg);
 
-       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;
-                       }
-               }
+  v8::Isolate* GetIsolate() { return m_pIsolate; }
 
-               return -1;
-       }
-
-       CTimerMapArray          m_Array;
+ protected:
+  nonstd::unique_ptr<CJS_EmbedObj> m_pEmbedObj;
+  v8::Global<v8::Object> m_pV8Object;
+  v8::Isolate* m_pIsolate;
 };
 
-static JS_TIMER_MAPARRAY       m_sTimeMap;
-
-class CJS_Runtime;
-
-class CJS_Timer
-{
-public:
-       CJS_Timer(CJS_EmbedObj * pObj,CPDFDoc_Environment* pApp):
-               m_nTimerID(0), 
-               m_pEmbedObj(pObj), 
-               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;
+class CJS_Timer : public CJS_Runtime::Observer {
+ public:
+  CJS_Timer(CJS_EmbedObj* pObj,
+            CPDFDoc_Environment* pApp,
+            CJS_Runtime* pRuntime,
+            int nType,
+            const CFX_WideString& script,
+            FX_DWORD dwElapse,
+            FX_DWORD dwTimeOut);
+  ~CJS_Timer() override;
+
+  void KillJSTimer();
+
+  int GetType() const { return m_nType; }
+  FX_DWORD GetTimeOut() const { return m_dwTimeOut; }
+  CJS_Runtime* GetRuntime() const { return m_bValid ? m_pRuntime : nullptr; }
+  CFX_WideString GetJScript() const { return m_swJScript; }
+
+  static void TimerProc(int idEvent);
+
+ private:
+  using TimerMap = std::map<FX_UINT, CJS_Timer*>;
+  static TimerMap* GetGlobalTimerMap();
+
+  // CJS_Runtime::Observer
+  void OnDestroyed() override;
+
+  FX_DWORD m_nTimerID;
+  CJS_EmbedObj* const m_pEmbedObj;
+  bool m_bProcessing;
+  bool m_bValid;
+
+  // data
+  const int m_nType;  // 0:Interval; 1:TimeOut
+  const FX_DWORD m_dwTimeOut;
+  const CFX_WideString m_swJScript;
+  CJS_Runtime* const m_pRuntime;
+  CPDFDoc_Environment* const m_pApp;
 };
-#endif //_JS_OBJECT_H_
+
+#endif  // FPDFSDK_INCLUDE_JAVASCRIPT_JS_OBJECT_H_