blob: b51b5aa265dc77b7cde0f645c9a54fdcf05e457a [file] [log] [blame]
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001// 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.
Lei Zhanga6d9f0e2015-06-13 00:48:38 -07004
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07005// 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_ResMgr.h"
10#include "../../include/javascript/JS_Context.h"
11#include "../../include/javascript/JS_EventHandler.h"
12#include "../../include/javascript/JS_Runtime.h"
13#include "../../include/javascript/resource.h"
14
15/* -------------------------- CJS_Context -------------------------- */
16
Nico Weber9d8ec5a2015-08-04 13:00:21 -070017CJS_Context::CJS_Context(CJS_Runtime* pRuntime)
18 : m_pRuntime(pRuntime), m_bBusy(FALSE), m_bMsgBoxEnable(TRUE) {
19 m_pEventHandler = new CJS_EventHandler(this);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070020}
21
Lei Zhang2b1a2d52015-08-14 22:16:22 -070022CJS_Context::~CJS_Context() {
Nico Weber9d8ec5a2015-08-04 13:00:21 -070023 delete m_pEventHandler;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070024}
25
Nico Weber9d8ec5a2015-08-04 13:00:21 -070026CPDFSDK_Document* CJS_Context::GetReaderDocument() {
27 ASSERT(m_pRuntime != NULL);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070028
Nico Weber9d8ec5a2015-08-04 13:00:21 -070029 return m_pRuntime->GetReaderDocument();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070030}
31
Nico Weber9d8ec5a2015-08-04 13:00:21 -070032CPDFDoc_Environment* CJS_Context::GetReaderApp() {
33 ASSERT(m_pRuntime != NULL);
Lei Zhanga6d9f0e2015-06-13 00:48:38 -070034
Nico Weber9d8ec5a2015-08-04 13:00:21 -070035 return m_pRuntime->GetReaderApp();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070036}
37
Nico Weber9d8ec5a2015-08-04 13:00:21 -070038FX_BOOL CJS_Context::DoJob(int nMode,
39 const CFX_WideString& script,
40 CFX_WideString& info) {
41 if (m_bBusy) {
42 info = JSGetStringFromID(this, IDS_STRING_JSBUSY);
43 return FALSE;
44 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070045
Nico Weber9d8ec5a2015-08-04 13:00:21 -070046 m_bBusy = TRUE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070047
Nico Weber9d8ec5a2015-08-04 13:00:21 -070048 ASSERT(m_pRuntime != NULL);
49 ASSERT(m_pEventHandler != NULL);
50 ASSERT(m_pEventHandler->IsValid());
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070051
Nico Weber9d8ec5a2015-08-04 13:00:21 -070052 if (!m_pRuntime->AddEventToLoop(m_pEventHandler->TargetName(),
53 m_pEventHandler->EventType())) {
54 info = JSGetStringFromID(this, IDS_STRING_JSEVENT);
55 return FALSE;
56 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070057
Nico Weber9d8ec5a2015-08-04 13:00:21 -070058 FXJSErr error = {NULL, NULL, 0};
59 int nRet = 0;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070060
Nico Weber9d8ec5a2015-08-04 13:00:21 -070061 if (script.GetLength() > 0) {
62 if (nMode == 0) {
63 nRet = JS_Execute(*m_pRuntime, this, script.c_str(), script.GetLength(),
64 &error);
65 } else {
66 nRet = JS_Parse(*m_pRuntime, this, script.c_str(), script.GetLength(),
67 &error);
68 }
69 }
Bo Xud4e406e2014-08-13 11:03:19 -070070
Nico Weber9d8ec5a2015-08-04 13:00:21 -070071 if (nRet < 0) {
72 CFX_WideString sLine;
73 sLine.Format(L"[ Line: %05d { %s } ] : %s", error.linnum - 1, error.srcline,
74 error.message);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070075
Nico Weber9d8ec5a2015-08-04 13:00:21 -070076 // TRACE(L"/* -------------- JS Error --------------
77 //*/\n");
78 // TRACE(sLine);
79 // TRACE(L"\n");
80 // CFX_ByteString sTemp = CFX_ByteString::FromUnicode(error.message);
81 info += sLine;
82 } else {
83 info = JSGetStringFromID(this, IDS_STRING_RUN);
84 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070085
Nico Weber9d8ec5a2015-08-04 13:00:21 -070086 m_pRuntime->RemoveEventInLoop(m_pEventHandler->TargetName(),
87 m_pEventHandler->EventType());
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070088
Nico Weber9d8ec5a2015-08-04 13:00:21 -070089 m_pEventHandler->Destroy();
90 m_bBusy = FALSE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070091
Nico Weber9d8ec5a2015-08-04 13:00:21 -070092 return nRet >= 0;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070093}
94
Nico Weber9d8ec5a2015-08-04 13:00:21 -070095FX_BOOL CJS_Context::RunScript(const CFX_WideString& script,
96 CFX_WideString& info) {
97 v8::Isolate::Scope isolate_scope(m_pRuntime->GetIsolate());
98 v8::Locker locker(m_pRuntime->GetIsolate());
99 v8::HandleScope handle_scope(m_pRuntime->GetIsolate());
100 v8::Local<v8::Context> context = m_pRuntime->NewJSContext();
101 v8::Context::Scope context_scope(context);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700102
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700103 return DoJob(0, script, info);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700104}
105
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700106FX_BOOL CJS_Context::Compile(const CFX_WideString& script,
107 CFX_WideString& info) {
108 v8::Isolate::Scope isolate_scope(m_pRuntime->GetIsolate());
109 v8::HandleScope handle_scope(m_pRuntime->GetIsolate());
110 v8::Local<v8::Context> context = m_pRuntime->NewJSContext();
111 v8::Context::Scope context_scope(context);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700112
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700113 return DoJob(1, script, info);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700114}
115
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700116void CJS_Context::OnApp_Init() {
117 ASSERT(m_pEventHandler != NULL);
118 m_pEventHandler->OnApp_Init();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700119}
120
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700121void CJS_Context::OnDoc_Open(CPDFSDK_Document* pDoc,
122 const CFX_WideString& strTargetName) {
123 ASSERT(m_pEventHandler != NULL);
124 m_pEventHandler->OnDoc_Open(pDoc, strTargetName);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700125}
126
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700127void CJS_Context::OnDoc_WillPrint(CPDFSDK_Document* pDoc) {
128 ASSERT(m_pEventHandler != NULL);
129 m_pEventHandler->OnDoc_WillPrint(pDoc);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700130}
131
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700132void CJS_Context::OnDoc_DidPrint(CPDFSDK_Document* pDoc) {
133 ASSERT(m_pEventHandler != NULL);
134 m_pEventHandler->OnDoc_DidPrint(pDoc);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700135}
136
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700137void CJS_Context::OnDoc_WillSave(CPDFSDK_Document* pDoc) {
138 ASSERT(m_pEventHandler != NULL);
139 m_pEventHandler->OnDoc_WillSave(pDoc);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700140}
141
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700142void CJS_Context::OnDoc_DidSave(CPDFSDK_Document* pDoc) {
143 ASSERT(m_pEventHandler != NULL);
144 m_pEventHandler->OnDoc_DidSave(pDoc);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700145}
146
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700147void CJS_Context::OnDoc_WillClose(CPDFSDK_Document* pDoc) {
148 ASSERT(m_pEventHandler != NULL);
149 m_pEventHandler->OnDoc_WillClose(pDoc);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700150}
151
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700152void CJS_Context::OnPage_Open(CPDFSDK_Document* pTarget) {
153 ASSERT(m_pEventHandler != NULL);
154 m_pEventHandler->OnPage_Open(pTarget);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700155}
156
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700157void CJS_Context::OnPage_Close(CPDFSDK_Document* pTarget) {
158 ASSERT(m_pEventHandler != NULL);
159 m_pEventHandler->OnPage_Close(pTarget);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700160}
161
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700162void CJS_Context::OnPage_InView(CPDFSDK_Document* pTarget) {
163 ASSERT(m_pEventHandler != NULL);
164 m_pEventHandler->OnPage_InView(pTarget);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700165}
166
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700167void CJS_Context::OnPage_OutView(CPDFSDK_Document* pTarget) {
168 ASSERT(m_pEventHandler != NULL);
169 m_pEventHandler->OnPage_OutView(pTarget);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700170}
171
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700172void CJS_Context::OnField_MouseDown(FX_BOOL bModifier,
173 FX_BOOL bShift,
174 CPDF_FormField* pTarget) {
175 ASSERT(m_pEventHandler != NULL);
176 m_pEventHandler->OnField_MouseDown(bModifier, bShift, pTarget);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700177}
178
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700179void CJS_Context::OnField_MouseEnter(FX_BOOL bModifier,
180 FX_BOOL bShift,
181 CPDF_FormField* pTarget) {
182 ASSERT(m_pEventHandler != NULL);
183 m_pEventHandler->OnField_MouseEnter(bModifier, bShift, pTarget);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700184}
185
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700186void CJS_Context::OnField_MouseExit(FX_BOOL bModifier,
187 FX_BOOL bShift,
188 CPDF_FormField* pTarget) {
189 ASSERT(m_pEventHandler != NULL);
190 m_pEventHandler->OnField_MouseExit(bModifier, bShift, pTarget);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700191}
192
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700193void CJS_Context::OnField_MouseUp(FX_BOOL bModifier,
194 FX_BOOL bShift,
195 CPDF_FormField* pTarget) {
196 ASSERT(m_pEventHandler != NULL);
197 m_pEventHandler->OnField_MouseUp(bModifier, bShift, pTarget);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700198}
199
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700200void CJS_Context::OnField_Focus(FX_BOOL bModifier,
201 FX_BOOL bShift,
202 CPDF_FormField* pTarget,
203 const CFX_WideString& Value) {
204 ASSERT(m_pEventHandler != NULL);
205 m_pEventHandler->OnField_Focus(bModifier, bShift, pTarget, Value);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700206}
207
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700208void CJS_Context::OnField_Blur(FX_BOOL bModifier,
209 FX_BOOL bShift,
210 CPDF_FormField* pTarget,
211 const CFX_WideString& Value) {
212 ASSERT(m_pEventHandler != NULL);
213 m_pEventHandler->OnField_Blur(bModifier, bShift, pTarget, Value);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700214}
215
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700216void CJS_Context::OnField_Calculate(CPDF_FormField* pSource,
217 CPDF_FormField* pTarget,
218 CFX_WideString& Value,
219 FX_BOOL& bRc) {
220 ASSERT(m_pEventHandler != NULL);
221 m_pEventHandler->OnField_Calculate(pSource, pTarget, Value, bRc);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700222}
223
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700224void CJS_Context::OnField_Format(CPDF_FormField* pTarget,
225 CFX_WideString& Value,
226 FX_BOOL bWillCommit) {
227 m_pEventHandler->OnField_Format(pTarget, Value, bWillCommit);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700228}
229
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700230void CJS_Context::OnField_Keystroke(CFX_WideString& strChange,
231 const CFX_WideString& strChangeEx,
232 FX_BOOL bKeyDown,
233 FX_BOOL bModifier,
234 int& nSelEnd,
235 int& nSelStart,
236 FX_BOOL bShift,
237 CPDF_FormField* pTarget,
238 CFX_WideString& Value,
239 FX_BOOL bWillCommit,
240 FX_BOOL bFieldFull,
241 FX_BOOL& bRc) {
242 m_pEventHandler->OnField_Keystroke(
243 strChange, strChangeEx, bKeyDown, bModifier, nSelEnd, nSelStart, bShift,
244 pTarget, Value, bWillCommit, bFieldFull, bRc);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700245}
246
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700247void CJS_Context::OnField_Validate(CFX_WideString& strChange,
248 const CFX_WideString& strChangeEx,
249 FX_BOOL bKeyDown,
250 FX_BOOL bModifier,
251 FX_BOOL bShift,
252 CPDF_FormField* pTarget,
253 CFX_WideString& Value,
254 FX_BOOL& bRc) {
255 ASSERT(m_pEventHandler != NULL);
256 m_pEventHandler->OnField_Validate(strChange, strChangeEx, bKeyDown, bModifier,
257 bShift, pTarget, Value, bRc);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700258}
259
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700260void CJS_Context::OnScreen_Focus(FX_BOOL bModifier,
261 FX_BOOL bShift,
262 CPDFSDK_Annot* pScreen) {
263 ASSERT(m_pEventHandler != NULL);
264 m_pEventHandler->OnScreen_Focus(bModifier, bShift, pScreen);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700265}
266
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700267void CJS_Context::OnScreen_Blur(FX_BOOL bModifier,
268 FX_BOOL bShift,
269 CPDFSDK_Annot* pScreen) {
270 ASSERT(m_pEventHandler != NULL);
271 m_pEventHandler->OnScreen_Blur(bModifier, bShift, pScreen);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700272}
273
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700274void CJS_Context::OnScreen_Open(FX_BOOL bModifier,
275 FX_BOOL bShift,
276 CPDFSDK_Annot* pScreen) {
277 ASSERT(m_pEventHandler != NULL);
278 m_pEventHandler->OnScreen_Open(bModifier, bShift, pScreen);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700279}
280
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700281void CJS_Context::OnScreen_Close(FX_BOOL bModifier,
282 FX_BOOL bShift,
283 CPDFSDK_Annot* pScreen) {
284 ASSERT(m_pEventHandler != NULL);
285 m_pEventHandler->OnScreen_Close(bModifier, bShift, pScreen);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700286}
287
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700288void CJS_Context::OnScreen_MouseDown(FX_BOOL bModifier,
289 FX_BOOL bShift,
290 CPDFSDK_Annot* pScreen) {
291 ASSERT(m_pEventHandler != NULL);
292 m_pEventHandler->OnScreen_MouseDown(bModifier, bShift, pScreen);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700293}
294
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700295void CJS_Context::OnScreen_MouseUp(FX_BOOL bModifier,
296 FX_BOOL bShift,
297 CPDFSDK_Annot* pScreen) {
298 ASSERT(m_pEventHandler != NULL);
299 m_pEventHandler->OnScreen_MouseUp(bModifier, bShift, pScreen);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700300}
301
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700302void CJS_Context::OnScreen_MouseEnter(FX_BOOL bModifier,
303 FX_BOOL bShift,
304 CPDFSDK_Annot* pScreen) {
305 ASSERT(m_pEventHandler != NULL);
306 m_pEventHandler->OnScreen_MouseEnter(bModifier, bShift, pScreen);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700307}
308
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700309void CJS_Context::OnScreen_MouseExit(FX_BOOL bModifier,
310 FX_BOOL bShift,
311 CPDFSDK_Annot* pScreen) {
312 ASSERT(m_pEventHandler != NULL);
313 m_pEventHandler->OnScreen_MouseExit(bModifier, bShift, pScreen);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700314}
315
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700316void CJS_Context::OnScreen_InView(FX_BOOL bModifier,
317 FX_BOOL bShift,
318 CPDFSDK_Annot* pScreen) {
319 ASSERT(m_pEventHandler != NULL);
320 m_pEventHandler->OnScreen_InView(bModifier, bShift, pScreen);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700321}
322
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700323void CJS_Context::OnScreen_OutView(FX_BOOL bModifier,
324 FX_BOOL bShift,
325 CPDFSDK_Annot* pScreen) {
326 ASSERT(m_pEventHandler != NULL);
327 m_pEventHandler->OnScreen_OutView(bModifier, bShift, pScreen);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700328}
329
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700330void CJS_Context::OnBookmark_MouseUp(CPDF_Bookmark* pBookMark) {
331 ASSERT(m_pEventHandler != NULL);
332 m_pEventHandler->OnBookmark_MouseUp(pBookMark);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700333}
334
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700335void CJS_Context::OnLink_MouseUp(CPDFSDK_Document* pTarget) {
336 ASSERT(m_pEventHandler != NULL);
337 m_pEventHandler->OnLink_MouseUp(pTarget);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700338}
339
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700340void CJS_Context::OnConsole_Exec() {
341 ASSERT(m_pEventHandler != NULL);
342 m_pEventHandler->OnConsole_Exec();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700343}
344
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700345void CJS_Context::OnExternal_Exec() {
346 ASSERT(m_pEventHandler != NULL);
347 m_pEventHandler->OnExternal_Exec();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700348}
349
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700350void CJS_Context::OnBatchExec(CPDFSDK_Document* pTarget) {
351 ASSERT(m_pEventHandler != NULL);
352 m_pEventHandler->OnBatchExec(pTarget);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700353}
354
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700355void CJS_Context::OnMenu_Exec(CPDFSDK_Document* pTarget,
356 const CFX_WideString& strTargetName) {
357 ASSERT(m_pEventHandler != NULL);
358 m_pEventHandler->OnMenu_Exec(pTarget, strTargetName);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700359}