Kill JS_TIMER_MAPARRAY
[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 JSTimerMap* GetGlobalTimerMap() {
14   // Leak the timer array at shutdown.
15   static auto* timeMap = new JSTimerMap;
16   return timeMap;
17 }
18
19 int FXJS_MsgBox(CPDFDoc_Environment* pApp,
20                 CPDFSDK_PageView* pPageView,
21                 const FX_WCHAR* swMsg,
22                 const FX_WCHAR* swTitle,
23                 FX_UINT nType,
24                 FX_UINT nIcon) {
25   if (!pApp)
26     return 0;
27
28   if (CPDFSDK_Document* pDoc = pApp->GetSDKDocument())
29     pDoc->KillFocusAnnot();
30
31   return pApp->JS_appAlert(swMsg, swTitle, nType, nIcon);
32 }
33
34 CPDFSDK_PageView* FXJS_GetPageView(IFXJS_Context* cc) {
35   if (CJS_Context* pContext = (CJS_Context*)cc) {
36     if (pContext->GetReaderDocument())
37       return NULL;
38   }
39   return NULL;
40 }
41
42 /* ---------------------------------  CJS_EmbedObj
43  * --------------------------------- */
44
45 CJS_EmbedObj::CJS_EmbedObj(CJS_Object* pJSObject) : m_pJSObject(pJSObject) {}
46
47 CJS_EmbedObj::~CJS_EmbedObj() {
48   m_pJSObject = NULL;
49 }
50
51 CPDFSDK_PageView* CJS_EmbedObj::JSGetPageView(IFXJS_Context* cc) {
52   return FXJS_GetPageView(cc);
53 }
54
55 int CJS_EmbedObj::MsgBox(CPDFDoc_Environment* pApp,
56                          CPDFSDK_PageView* pPageView,
57                          const FX_WCHAR* swMsg,
58                          const FX_WCHAR* swTitle,
59                          FX_UINT nType,
60                          FX_UINT nIcon) {
61   return FXJS_MsgBox(pApp, pPageView, swMsg, swTitle, nType, nIcon);
62 }
63
64 void CJS_EmbedObj::Alert(CJS_Context* pContext, const FX_WCHAR* swMsg) {
65   CJS_Object::Alert(pContext, swMsg);
66 }
67
68 CJS_Timer* CJS_EmbedObj::BeginTimer(CPDFDoc_Environment* pApp,
69                                     FX_UINT nElapse) {
70   CJS_Timer* pTimer = new CJS_Timer(this, pApp);
71   pTimer->SetJSTimer(nElapse);
72
73   return pTimer;
74 }
75
76 void CJS_EmbedObj::EndTimer(CJS_Timer* pTimer) {
77   ASSERT(pTimer != NULL);
78   pTimer->KillJSTimer();
79   delete pTimer;
80 }
81
82 /* ---------------------------------  CJS_Object
83  * --------------------------------- */
84 void FreeObject(const v8::WeakCallbackInfo<CJS_Object>& data) {
85   CJS_Object* pJSObj = data.GetParameter();
86   pJSObj->ExitInstance();
87   delete pJSObj;
88   JS_FreePrivate(data.GetInternalField(0));
89 }
90
91 void DisposeObject(const v8::WeakCallbackInfo<CJS_Object>& data) {
92   CJS_Object* pJSObj = data.GetParameter();
93   pJSObj->Dispose();
94   data.SetSecondPassCallback(FreeObject);
95 }
96
97 CJS_Object::CJS_Object(JSFXObject pObject) : m_pEmbedObj(NULL) {
98   v8::Local<v8::Context> context = pObject->CreationContext();
99   m_pIsolate = context->GetIsolate();
100   m_pObject.Reset(m_pIsolate, pObject);
101 };
102
103 CJS_Object::~CJS_Object(void) {
104   delete m_pEmbedObj;
105   m_pEmbedObj = NULL;
106
107   m_pObject.Reset();
108 };
109
110 void CJS_Object::MakeWeak() {
111   m_pObject.SetWeak(this, DisposeObject, v8::WeakCallbackType::kInternalFields);
112 }
113
114 void CJS_Object::Dispose() {
115   m_pObject.Reset();
116 }
117
118 CPDFSDK_PageView* CJS_Object::JSGetPageView(IFXJS_Context* cc) {
119   return FXJS_GetPageView(cc);
120 }
121
122 int CJS_Object::MsgBox(CPDFDoc_Environment* pApp,
123                        CPDFSDK_PageView* pPageView,
124                        const FX_WCHAR* swMsg,
125                        const FX_WCHAR* swTitle,
126                        FX_UINT nType,
127                        FX_UINT nIcon) {
128   return FXJS_MsgBox(pApp, pPageView, swMsg, swTitle, nType, nIcon);
129 }
130
131 void CJS_Object::Alert(CJS_Context* pContext, const FX_WCHAR* swMsg) {
132   ASSERT(pContext != NULL);
133
134   if (pContext->IsMsgBoxEnabled()) {
135     CPDFDoc_Environment* pApp = pContext->GetReaderApp();
136     if (pApp)
137       pApp->JS_appAlert(swMsg, NULL, 0, 3);
138   }
139 }