Remove pointless CPDFSDK_PageView usage in CJS_Object / CJS_EmbedObj.
[pdfium.git] / fpdfsdk / include / javascript / JS_Object.h
index 8b91f8c..6116a83 100644 (file)
-// Copyright 2014 PDFium Authors. All rights reserved.\r
-// Use of this source code is governed by a BSD-style license that can be\r
-// found in the LICENSE file.\r
\r
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com\r
-\r
-#ifndef _JS_OBJECT_H_\r
-#define _JS_OBJECT_H_\r
-\r
-class CJS_Object;\r
-class CJS_Timer;\r
-class CJS_Context;\r
-\r
-class CJS_EmbedObj : public CFX_Object\r
-{\r
-public:\r
-       CJS_EmbedObj(CJS_Object* pJSObject);\r
-       virtual ~CJS_EmbedObj();\r
-\r
-       virtual void                            TimerProc(CJS_Timer* pTimer){};\r
-\r
-       CJS_Timer*                                      BeginTimer(CPDFDoc_Environment * pApp, FX_UINT nElapse);\r
-       void                                            EndTimer(CJS_Timer* pTimer);\r
-\r
-       CJS_Object*                                     GetJSObject(){return m_pJSObject;};\r
-       operator                                        CJS_Object* (){return m_pJSObject;};\r
-\r
-       CPDFSDK_PageView *                      JSGetPageView(IFXJS_Context* cc);\r
-       int                                                     MsgBox(CPDFDoc_Environment* pApp, CPDFSDK_PageView* pPageView, FX_LPCWSTR swMsg, FX_LPCWSTR swTitle = NULL, FX_UINT nType = 0, FX_UINT nIcon = 0);\r
-       void                                            Alert(CJS_Context* pContext, FX_LPCWSTR swMsg);\r
-       FX_BOOL                                         IsSafeMode(IFXJS_Context* cc);\r
-\r
-protected:\r
-\r
-       CJS_Object*                                     m_pJSObject;\r
-};\r
-\r
-class CJS_Object : public CFX_Object\r
-{\r
-public:\r
-       CJS_Object(JSFXObject pObject);\r
-       virtual ~CJS_Object(void);\r
-       \r
-       void                                            MakeWeak();\r
-\r
-       virtual FX_BOOL                         IsType(FX_LPCSTR sClassName){return TRUE;};\r
-       virtual CFX_ByteString          GetClassName(){return "";};\r
-\r
-       virtual FX_BOOL                         InitInstance(IFXJS_Context* cc){return TRUE;};\r
-       virtual FX_BOOL                         ExitInstance(){return TRUE;};\r
-\r
-       operator                                        JSFXObject () {return v8::Local<v8::Object>::New(m_pIsolate, m_pObject);}\r
-       operator                                        CJS_EmbedObj* (){return m_pEmbedObj;};\r
-\r
-       void                                            SetEmbedObject(CJS_EmbedObj* pObj){m_pEmbedObj = pObj;};\r
-       CJS_EmbedObj *                          GetEmbedObject(){return m_pEmbedObj;};\r
-\r
-       static CPDFSDK_PageView *       JSGetPageView(IFXJS_Context* cc);\r
-       static int                                      MsgBox(CPDFDoc_Environment* pApp, CPDFSDK_PageView* pPageView, FX_LPCWSTR swMsg, FX_LPCWSTR swTitle = NULL, FX_UINT nType = 0,FX_UINT nIcon = 0);\r
-       static void                                     Alert(CJS_Context* pContext, FX_LPCWSTR swMsg);\r
-\r
-       v8::Isolate*                                    GetIsolate() {return m_pIsolate;}\r
-protected:\r
-       CJS_EmbedObj *                          m_pEmbedObj;\r
-       v8::Persistent<v8::Object>                      m_pObject;\r
-       v8::Isolate*                                    m_pIsolate;\r
-};\r
-\r
-struct JS_TIMER_MAP\r
-{\r
-       FX_UINT nID;\r
-       CJS_Timer * pTimer;\r
-};\r
-\r
-typedef CFX_ArrayTemplate<JS_TIMER_MAP*>       CTimerMapArray;\r
-\r
-struct JS_TIMER_MAPARRAY\r
-{\r
-public:\r
-       JS_TIMER_MAPARRAY()\r
-       {\r
-       }\r
-\r
-       ~JS_TIMER_MAPARRAY()\r
-       {\r
-               Reset();\r
-       }\r
-\r
-       void Reset()\r
-       {\r
-               for (int i=0,sz=m_Array.GetSize(); i<sz; i++)\r
-                       delete m_Array.GetAt(i);\r
-\r
-               m_Array.RemoveAll();\r
-       }\r
-\r
-       void SetAt(FX_UINT nIndex,CJS_Timer * pTimer)\r
-       {\r
-               int i = Find(nIndex);\r
-\r
-               if (i>=0)\r
-               {\r
-                       if (JS_TIMER_MAP * pMap = m_Array.GetAt(i))\r
-                               pMap->pTimer = pTimer;\r
-               }\r
-               else\r
-               {\r
-                       if (JS_TIMER_MAP * pMap = new JS_TIMER_MAP)\r
-                       {\r
-                               pMap->nID = nIndex;\r
-                               pMap->pTimer = pTimer;\r
-                               m_Array.Add(pMap);\r
-                       }\r
-               }\r
-       }\r
-\r
-       CJS_Timer * GetAt(FX_UINT nIndex)\r
-       {\r
-               int i = Find(nIndex);\r
-\r
-               if (i>=0)\r
-               {\r
-                       if (JS_TIMER_MAP * pMap = m_Array.GetAt(i))\r
-                               return pMap->pTimer;\r
-               }\r
-               return NULL;\r
-       }\r
-\r
-       void RemoveAt(FX_UINT nIndex)\r
-       {\r
-               int i = Find(nIndex);\r
-\r
-               if (i>=0)\r
-               {\r
-                       delete m_Array.GetAt(i);\r
-                       m_Array.RemoveAt(i);\r
-               }\r
-               //To prevent potential fake memory leak reported by vc6.\r
-               if(m_Array.GetSize() == 0)\r
-                       m_Array.RemoveAll();\r
-       }\r
-\r
-       int Find(FX_UINT nIndex)\r
-       {               \r
-               for (int i=0,sz=m_Array.GetSize(); i<sz; i++)\r
-               {                       \r
-                       if (JS_TIMER_MAP * pMap = m_Array.GetAt(i))\r
-                       {\r
-                               if (pMap->nID == nIndex)\r
-                                       return i;\r
-                       }\r
-               }\r
-\r
-               return -1;\r
-       }\r
-\r
-       CTimerMapArray          m_Array;\r
-};\r
-\r
-static JS_TIMER_MAPARRAY       m_sTimeMap;\r
-\r
-class CJS_Runtime;\r
-\r
-class CJS_Timer\r
-{\r
-public:\r
-       CJS_Timer(CJS_EmbedObj * pObj,CPDFDoc_Environment* pApp): m_pEmbedObj(pObj), \r
-               m_nTimerID(0), \r
-               m_bProcessing(FALSE),\r
-               m_dwStartTime(0),\r
-               m_dwTimeOut(0),\r
-               m_dwElapse(0),\r
-               m_pRuntime(NULL),\r
-               m_nType(0),\r
-               m_pApp(pApp)\r
-       {\r
-       }\r
-       \r
-       virtual ~CJS_Timer()\r
-       {\r
-               KillJSTimer();\r
-       }\r
-\r
-public:\r
-       FX_UINT SetJSTimer(FX_UINT nElapse)\r
-       {       \r
-               if (m_nTimerID)KillJSTimer();\r
-               IFX_SystemHandler* pHandler = m_pApp->GetSysHandler();\r
-               m_nTimerID = pHandler->SetTimer(nElapse,TimerProc);\r
-               m_sTimeMap.SetAt(m_nTimerID,this);\r
-               m_dwElapse = nElapse;\r
-               return m_nTimerID;\r
-       };\r
-\r
-       void KillJSTimer()\r
-       {\r
-               if (m_nTimerID)\r
-               {\r
-                       IFX_SystemHandler* pHandler = m_pApp->GetSysHandler();\r
-                       pHandler->KillTimer(m_nTimerID);\r
-                       m_sTimeMap.RemoveAt(m_nTimerID);\r
-                       m_nTimerID = 0;\r
-               }\r
-       };\r
-\r
-       void SetType(int nType)\r
-       {\r
-               m_nType = nType;\r
-       }\r
-\r
-       int GetType() const\r
-       {\r
-               return m_nType;\r
-       }\r
-\r
-       void SetStartTime(FX_DWORD dwStartTime)\r
-       {\r
-               m_dwStartTime = dwStartTime;\r
-       }\r
-\r
-       FX_DWORD GetStartTime() const\r
-       {\r
-               return m_dwStartTime;\r
-       }\r
-\r
-       void SetTimeOut(FX_DWORD dwTimeOut)\r
-       {\r
-               m_dwTimeOut = dwTimeOut;\r
-       }\r
-\r
-       FX_DWORD GetTimeOut() const\r
-       {\r
-               return m_dwTimeOut;\r
-       }\r
-\r
-       void SetRuntime(CJS_Runtime* pRuntime)\r
-       {\r
-               m_pRuntime = pRuntime;\r
-       }\r
-       \r
-       CJS_Runtime* GetRuntime() const\r
-       {\r
-               return m_pRuntime;\r
-       }\r
-\r
-       void SetJScript(const CFX_WideString& script)\r
-       {\r
-               m_swJScript = script;\r
-       }\r
-\r
-       CFX_WideString GetJScript() const\r
-       {\r
-               return m_swJScript;\r
-       }\r
-\r
-       static void TimerProc(int idEvent)\r
-       {\r
-               if (CJS_Timer * pTimer = m_sTimeMap.GetAt(idEvent))\r
-               {\r
-                       if (!pTimer->m_bProcessing)\r
-                       {\r
-                               pTimer->m_bProcessing = TRUE;\r
-                               if (pTimer->m_pEmbedObj) pTimer->m_pEmbedObj->TimerProc(pTimer);\r
-                               pTimer->m_bProcessing = FALSE;\r
-                       }\r
-                       else\r
-                       {\r
-                       //      TRACE(L"BUSY!\n");\r
-                       }\r
-               }\r
-       };\r
-\r
-private:\r
-       FX_UINT                                                 m_nTimerID;     \r
-       CJS_EmbedObj*                                   m_pEmbedObj;\r
-       FX_BOOL                                                 m_bProcessing;\r
-\r
-       //data\r
-       FX_DWORD                                                        m_dwStartTime;\r
-       FX_DWORD                                                        m_dwTimeOut;\r
-       FX_DWORD                                                m_dwElapse;\r
-       CJS_Runtime*                                    m_pRuntime;\r
-       CFX_WideString                                  m_swJScript;\r
-       int                                                             m_nType; //0:Interval; 1:TimeOut\r
-\r
-       CPDFDoc_Environment*                    m_pApp;\r
-};\r
-#endif //_JS_OBJECT_H_\r
+// 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 FPDFSDK_INCLUDE_JAVASCRIPT_JS_OBJECT_H_
+#define FPDFSDK_INCLUDE_JAVASCRIPT_JS_OBJECT_H_
+
+#include <map>
+
+#include "../../../third_party/base/nonstd_unique_ptr.h"
+
+#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"
+
+class CJS_Context;
+class CJS_Object;
+class CJS_Timer;
+
+class CJS_EmbedObj {
+ public:
+  explicit CJS_EmbedObj(CJS_Object* pJSObject);
+  virtual ~CJS_EmbedObj();
+
+  virtual void TimerProc(CJS_Timer* pTimer) {}
+
+  CJS_Object* GetJSObject() const { return m_pJSObject; }
+
+  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);
+
+ protected:
+  CJS_Object* m_pJSObject;
+};
+
+class CJS_Object {
+ public:
+  explicit CJS_Object(v8::Local<v8::Object> pObject);
+  virtual ~CJS_Object();
+
+  void MakeWeak();
+  void Dispose();
+
+  virtual FX_BOOL IsType(const FX_CHAR* sClassName) { return TRUE; }
+  virtual CFX_ByteString GetClassName() { return ""; }
+
+  virtual FX_BOOL InitInstance(IFXJS_Context* cc) { return TRUE; }
+  virtual FX_BOOL ExitInstance() { return TRUE; }
+
+  v8::Local<v8::Object> ToV8Object() { return m_pV8Object.Get(m_pIsolate); }
+
+  // Takes ownership of |pObj|.
+  void SetEmbedObject(CJS_EmbedObj* pObj) { m_pEmbedObj.reset(pObj); }
+  CJS_EmbedObj* GetEmbedObject() const { return m_pEmbedObj.get(); }
+
+  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);
+
+  v8::Isolate* GetIsolate() { return m_pIsolate; }
+
+ protected:
+  nonstd::unique_ptr<CJS_EmbedObj> m_pEmbedObj;
+  v8::Global<v8::Object> m_pV8Object;
+  v8::Isolate* m_pIsolate;
+};
+
+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  // FPDFSDK_INCLUDE_JAVASCRIPT_JS_OBJECT_H_