Remove CJS_RuntimeFactory
[pdfium.git] / fpdfsdk / src / javascript / JS_Object.cpp
1 // Copyright 2014 PDFium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6
7 #include "../../include/javascript/JavaScript.h"
8 #include "../../include/javascript/IJavaScript.h"
9 #include "../../include/javascript/JS_Define.h"
10 #include "../../include/javascript/JS_Object.h"
11 #include "../../include/javascript/JS_Context.h"
12
13 int FXJS_MsgBox(CPDFDoc_Environment* pApp,
14                 CPDFSDK_PageView* pPageView,
15                 const FX_WCHAR* swMsg,
16                 const FX_WCHAR* swTitle,
17                 FX_UINT nType,
18                 FX_UINT nIcon) {
19   if (!pApp)
20     return 0;
21
22   if (CPDFSDK_Document* pDoc = pApp->GetSDKDocument())
23     pDoc->KillFocusAnnot();
24
25   return pApp->JS_appAlert(swMsg, swTitle, nType, nIcon);
26 }
27
28 CPDFSDK_PageView* FXJS_GetPageView(IFXJS_Context* cc) {
29   if (CJS_Context* pContext = (CJS_Context*)cc) {
30     if (pContext->GetReaderDocument())
31       return NULL;
32   }
33   return NULL;
34 }
35
36 CJS_EmbedObj::CJS_EmbedObj(CJS_Object* pJSObject) : m_pJSObject(pJSObject) {}
37
38 CJS_EmbedObj::~CJS_EmbedObj() {
39   m_pJSObject = NULL;
40 }
41
42 CPDFSDK_PageView* CJS_EmbedObj::JSGetPageView(IFXJS_Context* cc) {
43   return FXJS_GetPageView(cc);
44 }
45
46 int CJS_EmbedObj::MsgBox(CPDFDoc_Environment* pApp,
47                          CPDFSDK_PageView* pPageView,
48                          const FX_WCHAR* swMsg,
49                          const FX_WCHAR* swTitle,
50                          FX_UINT nType,
51                          FX_UINT nIcon) {
52   return FXJS_MsgBox(pApp, pPageView, swMsg, swTitle, nType, nIcon);
53 }
54
55 void CJS_EmbedObj::Alert(CJS_Context* pContext, const FX_WCHAR* swMsg) {
56   CJS_Object::Alert(pContext, swMsg);
57 }
58
59 CJS_Timer* CJS_EmbedObj::BeginTimer(CPDFDoc_Environment* pApp,
60                                     FX_UINT nElapse) {
61   CJS_Timer* pTimer = new CJS_Timer(this, pApp);
62   pTimer->SetJSTimer(nElapse);
63
64   return pTimer;
65 }
66
67 void CJS_EmbedObj::EndTimer(CJS_Timer* pTimer) {
68   ASSERT(pTimer != NULL);
69   pTimer->KillJSTimer();
70   delete pTimer;
71 }
72
73 void FreeObject(const v8::WeakCallbackInfo<CJS_Object>& data) {
74   CJS_Object* pJSObj = data.GetParameter();
75   pJSObj->ExitInstance();
76   delete pJSObj;
77   FXJS_FreePrivate(data.GetInternalField(0));
78 }
79
80 void DisposeObject(const v8::WeakCallbackInfo<CJS_Object>& data) {
81   CJS_Object* pJSObj = data.GetParameter();
82   pJSObj->Dispose();
83   data.SetSecondPassCallback(FreeObject);
84 }
85
86 CJS_Object::CJS_Object(v8::Local<v8::Object> pObject) {
87   m_pIsolate = pObject->CreationContext()->GetIsolate();
88   m_pV8Object.Reset(m_pIsolate, pObject);
89 }
90
91 CJS_Object::~CJS_Object() {
92 }
93
94 void CJS_Object::MakeWeak() {
95   m_pV8Object.SetWeak(this, DisposeObject,
96                       v8::WeakCallbackType::kInternalFields);
97 }
98
99 void CJS_Object::Dispose() {
100   m_pV8Object.Reset();
101 }
102
103 CPDFSDK_PageView* CJS_Object::JSGetPageView(IFXJS_Context* cc) {
104   return FXJS_GetPageView(cc);
105 }
106
107 int CJS_Object::MsgBox(CPDFDoc_Environment* pApp,
108                        CPDFSDK_PageView* pPageView,
109                        const FX_WCHAR* swMsg,
110                        const FX_WCHAR* swTitle,
111                        FX_UINT nType,
112                        FX_UINT nIcon) {
113   return FXJS_MsgBox(pApp, pPageView, swMsg, swTitle, nType, nIcon);
114 }
115
116 void CJS_Object::Alert(CJS_Context* pContext, const FX_WCHAR* swMsg) {
117   ASSERT(pContext != NULL);
118
119   if (pContext->IsMsgBoxEnabled()) {
120     CPDFDoc_Environment* pApp = pContext->GetReaderApp();
121     if (pApp)
122       pApp->JS_appAlert(swMsg, NULL, 0, 3);
123   }
124 }
125
126 FX_UINT CJS_Timer::SetJSTimer(FX_UINT nElapse) {
127   if (m_nTimerID)
128     KillJSTimer();
129   IFX_SystemHandler* pHandler = m_pApp->GetSysHandler();
130   m_nTimerID = pHandler->SetTimer(nElapse, TimerProc);
131   (*GetGlobalTimerMap())[m_nTimerID] = this;
132   m_dwElapse = nElapse;
133   return m_nTimerID;
134 }
135
136 void CJS_Timer::KillJSTimer() {
137   if (m_nTimerID) {
138     IFX_SystemHandler* pHandler = m_pApp->GetSysHandler();
139     pHandler->KillTimer(m_nTimerID);
140     GetGlobalTimerMap()->erase(m_nTimerID);
141     m_nTimerID = 0;
142   }
143 }
144
145 // static
146 void CJS_Timer::TimerProc(int idEvent) {
147   const auto it = GetGlobalTimerMap()->find(idEvent);
148   if (it != GetGlobalTimerMap()->end()) {
149     CJS_Timer* pTimer = it->second;
150     if (!pTimer->m_bProcessing) {
151       pTimer->m_bProcessing = TRUE;
152       if (pTimer->m_pEmbedObj)
153         pTimer->m_pEmbedObj->TimerProc(pTimer);
154       pTimer->m_bProcessing = FALSE;
155     }
156   }
157 }
158
159 // static
160 CJS_Timer::TimerMap* CJS_Timer::GetGlobalTimerMap() {
161   // Leak the timer array at shutdown.
162   static auto* s_TimerMap = new TimerMap;
163   return s_TimerMap;
164 }