| // 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_JAVASCRIPT_JS_OBJECT_H_ |
| #define FPDFSDK_JAVASCRIPT_JS_OBJECT_H_ |
| |
| #include <map> |
| #include <memory> |
| |
| #include "fpdfsdk/include/fsdk_define.h" |
| #include "fpdfsdk/javascript/cjs_runtime.h" |
| #include "fpdfsdk/jsapi/include/fxjs_v8.h" |
| |
| class CJS_Context; |
| class CJS_Object; |
| class CJS_Timer; |
| class CPDFDoc_Environment; |
| 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 void InitInstance(IJS_Runtime* pIRuntime) {} |
| virtual void ExitInstance() {} |
| |
| 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: |
| std::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, |
| uint32_t dwElapse, |
| uint32_t dwTimeOut); |
| ~CJS_Timer() override; |
| |
| void KillJSTimer(); |
| |
| int GetType() const { return m_nType; } |
| uint32_t 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; |
| |
| uint32_t m_nTimerID; |
| CJS_EmbedObj* const m_pEmbedObj; |
| bool m_bProcessing; |
| bool m_bValid; |
| |
| // data |
| const int m_nType; // 0:Interval; 1:TimeOut |
| const uint32_t m_dwTimeOut; |
| const CFX_WideString m_swJScript; |
| CJS_Runtime* const m_pRuntime; |
| CPDFDoc_Environment* const m_pApp; |
| }; |
| |
| #endif // FPDFSDK_JAVASCRIPT_JS_OBJECT_H_ |