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 "fpdfsdk/javascript/cjs_context.h"
8 
9 #include "fpdfsdk/javascript/JS_EventHandler.h"
10 #include "fpdfsdk/javascript/cjs_runtime.h"
11 #include "fpdfsdk/javascript/resource.h"
12 
CJS_Context(CJS_Runtime * pRuntime)13 CJS_Context::CJS_Context(CJS_Runtime* pRuntime)
14     : m_pRuntime(pRuntime), m_bBusy(FALSE), m_bMsgBoxEnable(TRUE) {
15   m_pEventHandler = new CJS_EventHandler(this);
16 }
17 
~CJS_Context()18 CJS_Context::~CJS_Context() {
19   delete m_pEventHandler;
20 }
21 
GetReaderDocument()22 CPDFSDK_Document* CJS_Context::GetReaderDocument() {
23   return m_pRuntime->GetReaderDocument();
24 }
25 
GetReaderApp()26 CPDFDoc_Environment* CJS_Context::GetReaderApp() {
27   return m_pRuntime->GetReaderApp();
28 }
29 
RunScript(const CFX_WideString & script,CFX_WideString * info)30 FX_BOOL CJS_Context::RunScript(const CFX_WideString& script,
31                                CFX_WideString* info) {
32   v8::Isolate::Scope isolate_scope(m_pRuntime->GetIsolate());
33   v8::HandleScope handle_scope(m_pRuntime->GetIsolate());
34   v8::Local<v8::Context> context = m_pRuntime->NewJSContext();
35   v8::Context::Scope context_scope(context);
36 
37   if (m_bBusy) {
38     *info = JSGetStringFromID(this, IDS_STRING_JSBUSY);
39     return FALSE;
40   }
41   m_bBusy = TRUE;
42 
43   ASSERT(m_pEventHandler->IsValid());
44   CJS_Runtime::FieldEvent event(m_pEventHandler->TargetName(),
45                                 m_pEventHandler->EventType());
46   if (!m_pRuntime->AddEventToSet(event)) {
47     *info = JSGetStringFromID(this, IDS_STRING_JSEVENT);
48     return FALSE;
49   }
50 
51   CFX_WideString sErrorMessage;
52   int nRet = 0;
53   if (script.GetLength() > 0) {
54     nRet = m_pRuntime->Execute(script.c_str(), &sErrorMessage);
55   }
56 
57   if (nRet < 0) {
58     *info += sErrorMessage;
59   } else {
60     *info = JSGetStringFromID(this, IDS_STRING_RUN);
61   }
62 
63   m_pRuntime->RemoveEventFromSet(event);
64   m_pEventHandler->Destroy();
65   m_bBusy = FALSE;
66 
67   return nRet >= 0;
68 }
69 
OnApp_Init()70 void CJS_Context::OnApp_Init() {
71   m_pEventHandler->OnApp_Init();
72 }
73 
OnDoc_Open(CPDFSDK_Document * pDoc,const CFX_WideString & strTargetName)74 void CJS_Context::OnDoc_Open(CPDFSDK_Document* pDoc,
75                              const CFX_WideString& strTargetName) {
76   m_pEventHandler->OnDoc_Open(pDoc, strTargetName);
77 }
78 
OnDoc_WillPrint(CPDFSDK_Document * pDoc)79 void CJS_Context::OnDoc_WillPrint(CPDFSDK_Document* pDoc) {
80   m_pEventHandler->OnDoc_WillPrint(pDoc);
81 }
82 
OnDoc_DidPrint(CPDFSDK_Document * pDoc)83 void CJS_Context::OnDoc_DidPrint(CPDFSDK_Document* pDoc) {
84   m_pEventHandler->OnDoc_DidPrint(pDoc);
85 }
86 
OnDoc_WillSave(CPDFSDK_Document * pDoc)87 void CJS_Context::OnDoc_WillSave(CPDFSDK_Document* pDoc) {
88   m_pEventHandler->OnDoc_WillSave(pDoc);
89 }
90 
OnDoc_DidSave(CPDFSDK_Document * pDoc)91 void CJS_Context::OnDoc_DidSave(CPDFSDK_Document* pDoc) {
92   m_pEventHandler->OnDoc_DidSave(pDoc);
93 }
94 
OnDoc_WillClose(CPDFSDK_Document * pDoc)95 void CJS_Context::OnDoc_WillClose(CPDFSDK_Document* pDoc) {
96   m_pEventHandler->OnDoc_WillClose(pDoc);
97 }
98 
OnPage_Open(CPDFSDK_Document * pTarget)99 void CJS_Context::OnPage_Open(CPDFSDK_Document* pTarget) {
100   m_pEventHandler->OnPage_Open(pTarget);
101 }
102 
OnPage_Close(CPDFSDK_Document * pTarget)103 void CJS_Context::OnPage_Close(CPDFSDK_Document* pTarget) {
104   m_pEventHandler->OnPage_Close(pTarget);
105 }
106 
OnPage_InView(CPDFSDK_Document * pTarget)107 void CJS_Context::OnPage_InView(CPDFSDK_Document* pTarget) {
108   m_pEventHandler->OnPage_InView(pTarget);
109 }
110 
OnPage_OutView(CPDFSDK_Document * pTarget)111 void CJS_Context::OnPage_OutView(CPDFSDK_Document* pTarget) {
112   m_pEventHandler->OnPage_OutView(pTarget);
113 }
114 
OnField_MouseDown(FX_BOOL bModifier,FX_BOOL bShift,CPDF_FormField * pTarget)115 void CJS_Context::OnField_MouseDown(FX_BOOL bModifier,
116                                     FX_BOOL bShift,
117                                     CPDF_FormField* pTarget) {
118   m_pEventHandler->OnField_MouseDown(bModifier, bShift, pTarget);
119 }
120 
OnField_MouseEnter(FX_BOOL bModifier,FX_BOOL bShift,CPDF_FormField * pTarget)121 void CJS_Context::OnField_MouseEnter(FX_BOOL bModifier,
122                                      FX_BOOL bShift,
123                                      CPDF_FormField* pTarget) {
124   m_pEventHandler->OnField_MouseEnter(bModifier, bShift, pTarget);
125 }
126 
OnField_MouseExit(FX_BOOL bModifier,FX_BOOL bShift,CPDF_FormField * pTarget)127 void CJS_Context::OnField_MouseExit(FX_BOOL bModifier,
128                                     FX_BOOL bShift,
129                                     CPDF_FormField* pTarget) {
130   m_pEventHandler->OnField_MouseExit(bModifier, bShift, pTarget);
131 }
132 
OnField_MouseUp(FX_BOOL bModifier,FX_BOOL bShift,CPDF_FormField * pTarget)133 void CJS_Context::OnField_MouseUp(FX_BOOL bModifier,
134                                   FX_BOOL bShift,
135                                   CPDF_FormField* pTarget) {
136   m_pEventHandler->OnField_MouseUp(bModifier, bShift, pTarget);
137 }
138 
OnField_Focus(FX_BOOL bModifier,FX_BOOL bShift,CPDF_FormField * pTarget,const CFX_WideString & Value)139 void CJS_Context::OnField_Focus(FX_BOOL bModifier,
140                                 FX_BOOL bShift,
141                                 CPDF_FormField* pTarget,
142                                 const CFX_WideString& Value) {
143   m_pEventHandler->OnField_Focus(bModifier, bShift, pTarget, Value);
144 }
145 
OnField_Blur(FX_BOOL bModifier,FX_BOOL bShift,CPDF_FormField * pTarget,const CFX_WideString & Value)146 void CJS_Context::OnField_Blur(FX_BOOL bModifier,
147                                FX_BOOL bShift,
148                                CPDF_FormField* pTarget,
149                                const CFX_WideString& Value) {
150   m_pEventHandler->OnField_Blur(bModifier, bShift, pTarget, Value);
151 }
152 
OnField_Calculate(CPDF_FormField * pSource,CPDF_FormField * pTarget,CFX_WideString & Value,FX_BOOL & bRc)153 void CJS_Context::OnField_Calculate(CPDF_FormField* pSource,
154                                     CPDF_FormField* pTarget,
155                                     CFX_WideString& Value,
156                                     FX_BOOL& bRc) {
157   m_pEventHandler->OnField_Calculate(pSource, pTarget, Value, bRc);
158 }
159 
OnField_Format(CPDF_FormField * pTarget,CFX_WideString & Value,FX_BOOL bWillCommit)160 void CJS_Context::OnField_Format(CPDF_FormField* pTarget,
161                                  CFX_WideString& Value,
162                                  FX_BOOL bWillCommit) {
163   m_pEventHandler->OnField_Format(pTarget, Value, bWillCommit);
164 }
165 
OnField_Keystroke(CFX_WideString & strChange,const CFX_WideString & strChangeEx,FX_BOOL bKeyDown,FX_BOOL bModifier,int & nSelEnd,int & nSelStart,FX_BOOL bShift,CPDF_FormField * pTarget,CFX_WideString & Value,FX_BOOL bWillCommit,FX_BOOL bFieldFull,FX_BOOL & bRc)166 void CJS_Context::OnField_Keystroke(CFX_WideString& strChange,
167                                     const CFX_WideString& strChangeEx,
168                                     FX_BOOL bKeyDown,
169                                     FX_BOOL bModifier,
170                                     int& nSelEnd,
171                                     int& nSelStart,
172                                     FX_BOOL bShift,
173                                     CPDF_FormField* pTarget,
174                                     CFX_WideString& Value,
175                                     FX_BOOL bWillCommit,
176                                     FX_BOOL bFieldFull,
177                                     FX_BOOL& bRc) {
178   m_pEventHandler->OnField_Keystroke(
179       strChange, strChangeEx, bKeyDown, bModifier, nSelEnd, nSelStart, bShift,
180       pTarget, Value, bWillCommit, bFieldFull, bRc);
181 }
182 
OnField_Validate(CFX_WideString & strChange,const CFX_WideString & strChangeEx,FX_BOOL bKeyDown,FX_BOOL bModifier,FX_BOOL bShift,CPDF_FormField * pTarget,CFX_WideString & Value,FX_BOOL & bRc)183 void CJS_Context::OnField_Validate(CFX_WideString& strChange,
184                                    const CFX_WideString& strChangeEx,
185                                    FX_BOOL bKeyDown,
186                                    FX_BOOL bModifier,
187                                    FX_BOOL bShift,
188                                    CPDF_FormField* pTarget,
189                                    CFX_WideString& Value,
190                                    FX_BOOL& bRc) {
191   m_pEventHandler->OnField_Validate(strChange, strChangeEx, bKeyDown, bModifier,
192                                     bShift, pTarget, Value, bRc);
193 }
194 
OnScreen_Focus(FX_BOOL bModifier,FX_BOOL bShift,CPDFSDK_Annot * pScreen)195 void CJS_Context::OnScreen_Focus(FX_BOOL bModifier,
196                                  FX_BOOL bShift,
197                                  CPDFSDK_Annot* pScreen) {
198   m_pEventHandler->OnScreen_Focus(bModifier, bShift, pScreen);
199 }
200 
OnScreen_Blur(FX_BOOL bModifier,FX_BOOL bShift,CPDFSDK_Annot * pScreen)201 void CJS_Context::OnScreen_Blur(FX_BOOL bModifier,
202                                 FX_BOOL bShift,
203                                 CPDFSDK_Annot* pScreen) {
204   m_pEventHandler->OnScreen_Blur(bModifier, bShift, pScreen);
205 }
206 
OnScreen_Open(FX_BOOL bModifier,FX_BOOL bShift,CPDFSDK_Annot * pScreen)207 void CJS_Context::OnScreen_Open(FX_BOOL bModifier,
208                                 FX_BOOL bShift,
209                                 CPDFSDK_Annot* pScreen) {
210   m_pEventHandler->OnScreen_Open(bModifier, bShift, pScreen);
211 }
212 
OnScreen_Close(FX_BOOL bModifier,FX_BOOL bShift,CPDFSDK_Annot * pScreen)213 void CJS_Context::OnScreen_Close(FX_BOOL bModifier,
214                                  FX_BOOL bShift,
215                                  CPDFSDK_Annot* pScreen) {
216   m_pEventHandler->OnScreen_Close(bModifier, bShift, pScreen);
217 }
218 
OnScreen_MouseDown(FX_BOOL bModifier,FX_BOOL bShift,CPDFSDK_Annot * pScreen)219 void CJS_Context::OnScreen_MouseDown(FX_BOOL bModifier,
220                                      FX_BOOL bShift,
221                                      CPDFSDK_Annot* pScreen) {
222   m_pEventHandler->OnScreen_MouseDown(bModifier, bShift, pScreen);
223 }
224 
OnScreen_MouseUp(FX_BOOL bModifier,FX_BOOL bShift,CPDFSDK_Annot * pScreen)225 void CJS_Context::OnScreen_MouseUp(FX_BOOL bModifier,
226                                    FX_BOOL bShift,
227                                    CPDFSDK_Annot* pScreen) {
228   m_pEventHandler->OnScreen_MouseUp(bModifier, bShift, pScreen);
229 }
230 
OnScreen_MouseEnter(FX_BOOL bModifier,FX_BOOL bShift,CPDFSDK_Annot * pScreen)231 void CJS_Context::OnScreen_MouseEnter(FX_BOOL bModifier,
232                                       FX_BOOL bShift,
233                                       CPDFSDK_Annot* pScreen) {
234   m_pEventHandler->OnScreen_MouseEnter(bModifier, bShift, pScreen);
235 }
236 
OnScreen_MouseExit(FX_BOOL bModifier,FX_BOOL bShift,CPDFSDK_Annot * pScreen)237 void CJS_Context::OnScreen_MouseExit(FX_BOOL bModifier,
238                                      FX_BOOL bShift,
239                                      CPDFSDK_Annot* pScreen) {
240   m_pEventHandler->OnScreen_MouseExit(bModifier, bShift, pScreen);
241 }
242 
OnScreen_InView(FX_BOOL bModifier,FX_BOOL bShift,CPDFSDK_Annot * pScreen)243 void CJS_Context::OnScreen_InView(FX_BOOL bModifier,
244                                   FX_BOOL bShift,
245                                   CPDFSDK_Annot* pScreen) {
246   m_pEventHandler->OnScreen_InView(bModifier, bShift, pScreen);
247 }
248 
OnScreen_OutView(FX_BOOL bModifier,FX_BOOL bShift,CPDFSDK_Annot * pScreen)249 void CJS_Context::OnScreen_OutView(FX_BOOL bModifier,
250                                    FX_BOOL bShift,
251                                    CPDFSDK_Annot* pScreen) {
252   m_pEventHandler->OnScreen_OutView(bModifier, bShift, pScreen);
253 }
254 
OnBookmark_MouseUp(CPDF_Bookmark * pBookMark)255 void CJS_Context::OnBookmark_MouseUp(CPDF_Bookmark* pBookMark) {
256   m_pEventHandler->OnBookmark_MouseUp(pBookMark);
257 }
258 
OnLink_MouseUp(CPDFSDK_Document * pTarget)259 void CJS_Context::OnLink_MouseUp(CPDFSDK_Document* pTarget) {
260   m_pEventHandler->OnLink_MouseUp(pTarget);
261 }
262 
OnConsole_Exec()263 void CJS_Context::OnConsole_Exec() {
264   m_pEventHandler->OnConsole_Exec();
265 }
266 
OnExternal_Exec()267 void CJS_Context::OnExternal_Exec() {
268   m_pEventHandler->OnExternal_Exec();
269 }
270 
EnableMessageBox(FX_BOOL bEnable)271 void CJS_Context::EnableMessageBox(FX_BOOL bEnable) {
272   m_bMsgBoxEnable = bEnable;
273 }
274 
OnBatchExec(CPDFSDK_Document * pTarget)275 void CJS_Context::OnBatchExec(CPDFSDK_Document* pTarget) {
276   m_pEventHandler->OnBatchExec(pTarget);
277 }
278 
OnMenu_Exec(CPDFSDK_Document * pTarget,const CFX_WideString & strTargetName)279 void CJS_Context::OnMenu_Exec(CPDFSDK_Document* pTarget,
280                               const CFX_WideString& strTargetName) {
281   m_pEventHandler->OnMenu_Exec(pTarget, strTargetName);
282 }
283