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_Value.h"
12 #include "../../include/javascript/app.h"
13 #include "../../include/javascript/JS_EventHandler.h"
14 #include "../../include/javascript/resource.h"
15 #include "../../include/javascript/JS_Context.h"
16 #include "../../include/javascript/JS_Runtime.h"
17 #include "../../include/javascript/Document.h"
18
19
GetIsolate(IFXJS_Context * cc)20 static v8::Isolate* GetIsolate(IFXJS_Context* cc)
21 {
22 CJS_Context* pContext = (CJS_Context *)cc;
23 ASSERT(pContext != NULL);
24
25 CJS_Runtime* pRuntime = pContext->GetJSRuntime();
26 ASSERT(pRuntime != NULL);
27
28 return pRuntime->GetIsolate();
29 }
30
31 /* ---------------------------- TimerObj ---------------------------- */
32
33 BEGIN_JS_STATIC_CONST(CJS_TimerObj)
END_JS_STATIC_CONST()34 END_JS_STATIC_CONST()
35
36 BEGIN_JS_STATIC_PROP(CJS_TimerObj)
37 END_JS_STATIC_PROP()
38
39 BEGIN_JS_STATIC_METHOD(CJS_TimerObj)
40 END_JS_STATIC_METHOD()
41
42 IMPLEMENT_JS_CLASS(CJS_TimerObj, TimerObj)
43
44 TimerObj::TimerObj(CJS_Object* pJSObject)
45 : CJS_EmbedObj(pJSObject),
46 m_pTimer(NULL)
47 {
48
49 }
50
~TimerObj()51 TimerObj::~TimerObj()
52 {
53 }
54
SetTimer(CJS_Timer * pTimer)55 void TimerObj::SetTimer(CJS_Timer* pTimer)
56 {
57 m_pTimer = pTimer;
58 }
59
GetTimer() const60 CJS_Timer* TimerObj::GetTimer() const
61 {
62 return m_pTimer;
63 }
64
65 #define JS_STR_VIEWERTYPE_READER L"Reader"
66 #define JS_STR_VIEWERTYPE_STANDARD L"Exchange"
67 #define JS_STR_VIEWERVARIATION L"Full"
68 #define JS_STR_PLATFORM L"WIN"
69 #define JS_STR_LANGUANGE L"ENU"
70 #define JS_STR_VIEWERVERSION 8
71 #define JS_NUM_FORMSVERSION 7
72
73 #define JS_FILEPATH_MAXLEN 2000
74
75 /* ---------------------------- app ---------------------------- */
76
77 BEGIN_JS_STATIC_CONST(CJS_App)
END_JS_STATIC_CONST()78 END_JS_STATIC_CONST()
79
80 BEGIN_JS_STATIC_PROP(CJS_App)
81 JS_STATIC_PROP_ENTRY(activeDocs)
82 JS_STATIC_PROP_ENTRY(calculate)
83 JS_STATIC_PROP_ENTRY(formsVersion)
84 JS_STATIC_PROP_ENTRY(fs)
85 JS_STATIC_PROP_ENTRY(fullscreen)
86 JS_STATIC_PROP_ENTRY(language)
87 JS_STATIC_PROP_ENTRY(media)
88 JS_STATIC_PROP_ENTRY(platform)
89 JS_STATIC_PROP_ENTRY(runtimeHighlight)
90 JS_STATIC_PROP_ENTRY(viewerType)
91 JS_STATIC_PROP_ENTRY(viewerVariation)
92 JS_STATIC_PROP_ENTRY(viewerVersion)
93 END_JS_STATIC_PROP()
94
95 BEGIN_JS_STATIC_METHOD(CJS_App)
96 JS_STATIC_METHOD_ENTRY(alert)
97 JS_STATIC_METHOD_ENTRY(beep)
98 JS_STATIC_METHOD_ENTRY(browseForDoc)
99 JS_STATIC_METHOD_ENTRY(clearInterval)
100 JS_STATIC_METHOD_ENTRY(clearTimeOut)
101 JS_STATIC_METHOD_ENTRY(execDialog)
102 JS_STATIC_METHOD_ENTRY(execMenuItem)
103 JS_STATIC_METHOD_ENTRY(findComponent)
104 JS_STATIC_METHOD_ENTRY(goBack)
105 JS_STATIC_METHOD_ENTRY(goForward)
106 JS_STATIC_METHOD_ENTRY(launchURL)
107 JS_STATIC_METHOD_ENTRY(mailMsg)
108 JS_STATIC_METHOD_ENTRY(newFDF)
109 JS_STATIC_METHOD_ENTRY(newDoc)
110 JS_STATIC_METHOD_ENTRY(openDoc)
111 JS_STATIC_METHOD_ENTRY(openFDF)
112 JS_STATIC_METHOD_ENTRY(popUpMenuEx)
113 JS_STATIC_METHOD_ENTRY(popUpMenu)
114 JS_STATIC_METHOD_ENTRY(response)
115 JS_STATIC_METHOD_ENTRY(setInterval)
116 JS_STATIC_METHOD_ENTRY(setTimeOut)
117 END_JS_STATIC_METHOD()
118
119 IMPLEMENT_JS_CLASS(CJS_App,app)
120
121 app::app(CJS_Object * pJSObject) : CJS_EmbedObj(pJSObject) ,
122 m_bCalculate(true),
123 m_bRuntimeHighLight(false)
124 // m_pMenuHead(NULL)
125 {
126 }
127
~app(void)128 app::~app(void)
129 {
130 for (int i=0,sz=m_aTimer.GetSize(); i<sz; i++)
131 delete m_aTimer[i];
132
133 m_aTimer.RemoveAll();
134 }
135
activeDocs(IFXJS_Context * cc,CJS_PropValue & vp,CFX_WideString & sError)136 FX_BOOL app::activeDocs(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError)
137 {
138 if (vp.IsGetting())
139 {
140
141 CJS_Context* pContext = (CJS_Context *)cc;
142 ASSERT(pContext != NULL);
143
144 CPDFDoc_Environment* pApp = pContext->GetReaderApp();
145 ASSERT(pApp != NULL);
146
147 CJS_Runtime* pRuntime = pContext->GetJSRuntime();
148 ASSERT(pRuntime != NULL);
149
150 CPDFSDK_Document* pCurDoc = pContext->GetReaderDocument();
151
152 CJS_Array aDocs(pRuntime->GetIsolate());
153 // int iNumDocs = pApp->CountDocuments();
154
155 // for(int iIndex = 0; iIndex<iNumDocs; iIndex++)
156 // {
157 CPDFSDK_Document* pDoc = pApp->GetCurrentDoc();
158 if (pDoc)
159 {
160 CJS_Document * pJSDocument = NULL;
161
162 if (pDoc == pCurDoc)
163 {
164 JSFXObject pObj = JS_GetThisObj(*pRuntime);
165
166 if (JS_GetObjDefnID(pObj) == JS_GetObjDefnID(*pRuntime, L"Document"))
167 {
168 pJSDocument = (CJS_Document*)JS_GetPrivate(pRuntime->GetIsolate(),pObj);
169 }
170 }
171 else
172 {
173 JSFXObject pObj = JS_NewFxDynamicObj(*pRuntime, pContext, JS_GetObjDefnID(*pRuntime,L"Document"));
174 pJSDocument = (CJS_Document*)JS_GetPrivate(pRuntime->GetIsolate(),pObj);
175 ASSERT(pJSDocument != NULL);
176
177
178 // pDocument->AttachDoc(pDoc);
179 }
180
181 aDocs.SetElement(0,CJS_Value(pRuntime->GetIsolate(),pJSDocument));
182 }
183 // }
184
185 if (aDocs.GetLength() > 0)
186 vp << aDocs;
187 else
188 vp.SetNull();
189 return TRUE;
190 }
191 return FALSE;
192 }
193
calculate(IFXJS_Context * cc,CJS_PropValue & vp,CFX_WideString & sError)194 FX_BOOL app::calculate(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError)
195 {
196 if (vp.IsSetting())
197 {
198 bool bVP;
199 vp >> bVP;
200 m_bCalculate = (FX_BOOL)bVP;
201
202 CJS_Context* pContext = (CJS_Context*)cc;
203 ASSERT(pContext != NULL);
204
205 CPDFDoc_Environment* pApp = pContext->GetReaderApp();
206 ASSERT(pApp != NULL);
207
208 CJS_Runtime* pRuntime = pContext->GetJSRuntime();
209 ASSERT(pRuntime != NULL);
210
211 CJS_Array aDocs(pRuntime->GetIsolate());
212 if (CPDFSDK_Document* pDoc = pApp->GetCurrentDoc())
213 {
214 CPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)pDoc->GetInterForm();
215 ASSERT(pInterForm != NULL);
216 pInterForm->EnableCalculate((FX_BOOL)m_bCalculate);
217 }
218 }
219 else
220 {
221 vp << (bool)m_bCalculate;
222 }
223
224 return TRUE;
225 }
226
formsVersion(IFXJS_Context * cc,CJS_PropValue & vp,CFX_WideString & sError)227 FX_BOOL app::formsVersion(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError)
228 {
229 if (vp.IsGetting())
230 {
231 vp << JS_NUM_FORMSVERSION;
232 return TRUE;
233 }
234
235 return FALSE;
236 }
237
viewerType(IFXJS_Context * cc,CJS_PropValue & vp,CFX_WideString & sError)238 FX_BOOL app::viewerType(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError)
239 {
240 if (vp.IsGetting())
241 {
242 vp << L"unknown";
243 return TRUE;
244 }
245
246 return FALSE;
247 }
248
viewerVariation(IFXJS_Context * cc,CJS_PropValue & vp,CFX_WideString & sError)249 FX_BOOL app::viewerVariation(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError)
250 {
251 if (vp.IsGetting())
252 {
253 vp << JS_STR_VIEWERVARIATION;
254 return TRUE;
255 }
256
257 return FALSE;
258 }
259
viewerVersion(IFXJS_Context * cc,CJS_PropValue & vp,CFX_WideString & sError)260 FX_BOOL app::viewerVersion(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError)
261 {
262 if (vp.IsGetting())
263 {
264 vp << JS_STR_VIEWERVERSION;
265 return TRUE;
266 }
267
268 return FALSE;
269 }
270
platform(IFXJS_Context * cc,CJS_PropValue & vp,CFX_WideString & sError)271 FX_BOOL app::platform(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError)
272 {
273 if (vp.IsGetting())
274 {
275 vp << JS_STR_PLATFORM;
276 return TRUE;
277 }
278
279 return FALSE;
280 }
281
language(IFXJS_Context * cc,CJS_PropValue & vp,CFX_WideString & sError)282 FX_BOOL app::language(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError)
283 {
284 if (vp.IsGetting())
285 {
286 vp << JS_STR_LANGUANGE;
287 return TRUE;
288 }
289
290 return FALSE;
291 }
292
293 //creates a new fdf object that contains no data
294 //comment: need reader support
295 //note:
296 //CFDF_Document * CPDFDoc_Environment::NewFDF();
newFDF(IFXJS_Context * cc,const CJS_Parameters & params,CJS_Value & vRet,CFX_WideString & sError)297 FX_BOOL app::newFDF(IFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, CFX_WideString& sError)
298 {
299 return TRUE;
300 }
301 //opens a specified pdf document and returns its document object
302 //comment:need reader support
303 //note: as defined in js reference, the proto of this function's fourth parmeters, how old an fdf document while do not show it.
304 //CFDF_Document * CPDFDoc_Environment::OpenFDF(string strPath,bool bUserConv);
305
openFDF(IFXJS_Context * cc,const CJS_Parameters & params,CJS_Value & vRet,CFX_WideString & sError)306 FX_BOOL app::openFDF(IFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, CFX_WideString& sError)
307 {
308 return TRUE;
309 }
310
alert(IFXJS_Context * cc,const CJS_Parameters & params,CJS_Value & vRet,CFX_WideString & sError)311 FX_BOOL app::alert(IFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, CFX_WideString& sError)
312 {
313 int iSize = params.size();
314 if (iSize < 1)
315 return FALSE;
316
317 CFX_WideString swMsg = L"";
318 CFX_WideString swTitle = L"";
319 int iIcon = 0;
320 int iType = 0;
321
322 v8::Isolate* isolate = GetIsolate(cc);
323
324 if (iSize == 1)
325 {
326 if (params[0].GetType() == VT_object)
327 {
328 JSObject pObj = params[0].ToV8Object();
329 {
330 v8::Local<v8::Value> pValue = JS_GetObjectElement(isolate, pObj, L"cMsg");
331 swMsg = CJS_Value(isolate, pValue, VT_unknown).ToCFXWideString();
332
333 pValue = JS_GetObjectElement(isolate, pObj, L"cTitle");
334 swTitle = CJS_Value(isolate, pValue, VT_unknown).ToCFXWideString();
335
336 pValue = JS_GetObjectElement(isolate, pObj, L"nIcon");
337 iIcon = CJS_Value(isolate, pValue, VT_unknown).ToInt();
338
339 pValue = JS_GetObjectElement(isolate, pObj, L"nType");
340 iType = CJS_Value(isolate, pValue, VT_unknown).ToInt();
341 }
342
343 if (swMsg == L"")
344 {
345 CJS_Array carray(isolate);
346 if (params[0].ConvertToArray(carray))
347 {
348 int iLenth = carray.GetLength();
349 CJS_Value* pValue = new CJS_Value(isolate);
350 // if (iLenth == 1)
351 // pValue = new CJS_Value(isolate);
352 // else if (iLenth > 1)
353 // pValue = new CJS_Value[iLenth];
354
355 for(int i = 0; i < iLenth; i++)
356 {
357 carray.GetElement(i, *pValue);
358 swMsg += (*pValue).ToCFXWideString();
359 if (i < iLenth - 1)
360 swMsg += L", ";
361 }
362
363 if(pValue) delete pValue;
364 }
365 }
366
367 if (swTitle == L"")
368 swTitle = JSGetStringFromID((CJS_Context*)cc, IDS_STRING_JSALERT);
369 }
370 else if (params[0].GetType() == VT_boolean)
371 {
372 FX_BOOL bGet = params[0].ToBool();
373 if (bGet)
374 swMsg = L"true";
375 else
376 swMsg = L"false";
377
378 swTitle = JSGetStringFromID((CJS_Context*)cc, IDS_STRING_JSALERT);
379 }
380 else
381 {
382 swMsg = params[0].ToCFXWideString();
383 swTitle = JSGetStringFromID((CJS_Context*)cc, IDS_STRING_JSALERT);
384 }
385 }
386 else
387 {
388 if (params[0].GetType() == VT_boolean)
389 {
390 FX_BOOL bGet = params[0].ToBool();
391 if (bGet)
392 swMsg = L"true";
393 else
394 swMsg = L"false";
395 }
396 else
397 {
398 swMsg = params[0].ToCFXWideString();
399 }
400 swTitle = JSGetStringFromID((CJS_Context*)cc, IDS_STRING_JSALERT);
401
402 for(int i = 1;i<iSize;i++)
403 {
404 if (i == 1)
405 iIcon = params[i].ToInt();
406 if (i == 2)
407 iType = params[i].ToInt();
408 if (i == 3)
409 swTitle = params[i].ToCFXWideString();
410 }
411 }
412
413
414 CJS_Context* pContext = (CJS_Context*)cc;
415 ASSERT(pContext != NULL);
416 CJS_Runtime* pRuntime = pContext->GetJSRuntime();
417 ASSERT(pRuntime != NULL);
418 pRuntime->BeginBlock();
419 vRet = MsgBox(pRuntime->GetReaderApp(), JSGetPageView(cc), swMsg.c_str(), swTitle.c_str(), iType, iIcon);
420 pRuntime->EndBlock();
421
422 return TRUE;
423 }
424
425
beep(IFXJS_Context * cc,const CJS_Parameters & params,CJS_Value & vRet,CFX_WideString & sError)426 FX_BOOL app::beep(IFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, CFX_WideString& sError)
427 {
428 if (params.size() == 1)
429 {
430 CJS_Context* pContext = (CJS_Context*)cc;
431 CJS_Runtime* pRuntime = pContext->GetJSRuntime();
432 CPDFDoc_Environment * pEnv = pRuntime->GetReaderApp();
433 pEnv->JS_appBeep(params[0].ToInt());
434 return TRUE;
435 }
436
437 sError = JSGetStringFromID((CJS_Context*)cc, IDS_STRING_JSPARAMERROR);
438 return FALSE;
439 }
440
findComponent(IFXJS_Context * cc,const CJS_Parameters & params,CJS_Value & vRet,CFX_WideString & sError)441 FX_BOOL app::findComponent(IFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, CFX_WideString& sError)
442 {
443 return TRUE;
444 }
445
popUpMenuEx(IFXJS_Context * cc,const CJS_Parameters & params,CJS_Value & vRet,CFX_WideString & sError)446 FX_BOOL app::popUpMenuEx(IFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, CFX_WideString& sError)
447 {
448 return FALSE;
449 }
450
fs(IFXJS_Context * cc,CJS_PropValue & vp,CFX_WideString & sError)451 FX_BOOL app::fs(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError)
452 {
453 return FALSE;
454 }
455
setInterval(IFXJS_Context * cc,const CJS_Parameters & params,CJS_Value & vRet,CFX_WideString & sError)456 FX_BOOL app::setInterval(IFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, CFX_WideString& sError)
457 {
458 CJS_Context* pContext = (CJS_Context*)cc;
459 if (params.size() > 2 || params.size() == 0)
460 {
461 sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
462 return FALSE;
463 }
464
465 CFX_WideString script = params.size() > 0 ? params[0].ToCFXWideString() : L"";
466 if (script.IsEmpty())
467 {
468 sError = JSGetStringFromID(pContext, IDS_STRING_JSAFNUMBER_KEYSTROKE);
469 return TRUE;
470 }
471
472 CJS_Runtime* pRuntime = pContext->GetJSRuntime();
473 FX_DWORD dwInterval = params.size() > 1 ? params[1].ToInt() : 1000;
474
475 CPDFDoc_Environment* pApp = pRuntime->GetReaderApp();
476 ASSERT(pApp);
477 CJS_Timer* pTimer = new CJS_Timer(this, pApp);
478 m_aTimer.Add(pTimer);
479
480 pTimer->SetType(0);
481 pTimer->SetRuntime(pRuntime);
482 pTimer->SetJScript(script);
483 pTimer->SetTimeOut(0);
484 // pTimer->SetStartTime(GetTickCount());
485 pTimer->SetJSTimer(dwInterval);
486
487 JSFXObject pRetObj = JS_NewFxDynamicObj(*pRuntime, pContext, JS_GetObjDefnID(*pRuntime, L"TimerObj"));
488
489 CJS_TimerObj* pJS_TimerObj = (CJS_TimerObj*)JS_GetPrivate(pRuntime->GetIsolate(),pRetObj);
490 ASSERT(pJS_TimerObj != NULL);
491
492 TimerObj* pTimerObj = (TimerObj*)pJS_TimerObj->GetEmbedObject();
493 ASSERT(pTimerObj != NULL);
494
495 pTimerObj->SetTimer(pTimer);
496
497 vRet = pRetObj;
498
499 return TRUE;
500 }
501
setTimeOut(IFXJS_Context * cc,const CJS_Parameters & params,CJS_Value & vRet,CFX_WideString & sError)502 FX_BOOL app::setTimeOut(IFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, CFX_WideString& sError)
503 {
504 if (params.size() > 2 || params.size() == 0)
505 {
506 sError = JSGetStringFromID((CJS_Context*)cc, IDS_STRING_JSPARAMERROR);
507 return FALSE;
508 }
509
510 CJS_Context* pContext = (CJS_Context*)cc;
511 ASSERT(pContext != NULL);
512 CJS_Runtime* pRuntime = pContext->GetJSRuntime();
513 ASSERT(pRuntime != NULL);
514
515 CFX_WideString script = params.size() > 0 ? params[0].ToCFXWideString() : L"";
516 if (script.IsEmpty())
517 {
518 sError = JSGetStringFromID((CJS_Context*)cc, IDS_STRING_JSAFNUMBER_KEYSTROKE);
519 return TRUE;
520 }
521
522 FX_DWORD dwTimeOut = params.size() > 1 ? params[1].ToInt() : 1000;
523
524 CPDFDoc_Environment* pApp = pRuntime->GetReaderApp();
525 ASSERT(pApp);
526
527 CJS_Timer* pTimer = new CJS_Timer(this, pApp);
528 m_aTimer.Add(pTimer);
529
530 pTimer->SetType(1);
531 pTimer->SetRuntime(pRuntime);
532 pTimer->SetJScript(script);
533 pTimer->SetTimeOut(dwTimeOut);
534 pTimer->SetJSTimer(dwTimeOut);
535
536 JSFXObject pRetObj = JS_NewFxDynamicObj(*pRuntime, pContext, JS_GetObjDefnID(*pRuntime, L"TimerObj"));
537
538 CJS_TimerObj* pJS_TimerObj = (CJS_TimerObj*)JS_GetPrivate(pRuntime->GetIsolate(),pRetObj);
539 ASSERT(pJS_TimerObj != NULL);
540
541 TimerObj* pTimerObj = (TimerObj*)pJS_TimerObj->GetEmbedObject();
542 ASSERT(pTimerObj != NULL);
543
544 pTimerObj->SetTimer(pTimer);
545
546 vRet = pRetObj;
547
548 return TRUE;
549 }
550
clearTimeOut(IFXJS_Context * cc,const CJS_Parameters & params,CJS_Value & vRet,CFX_WideString & sError)551 FX_BOOL app::clearTimeOut(IFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, CFX_WideString& sError)
552 {
553 CJS_Context* pContext = (CJS_Context*)cc;
554 ASSERT(pContext != NULL);
555 CJS_Runtime* pRuntime = pContext->GetJSRuntime();
556 ASSERT(pRuntime != NULL);
557
558 if (params.size() != 1)
559 {
560 sError = JSGetStringFromID((CJS_Context*)cc, IDS_STRING_JSPARAMERROR);
561 return FALSE;
562 }
563
564 if (params[0].GetType() == VT_fxobject)
565 {
566 JSFXObject pObj = params[0].ToV8Object();
567 {
568 if (JS_GetObjDefnID(pObj) == JS_GetObjDefnID(*pRuntime, L"TimerObj"))
569 {
570 if (CJS_Object* pJSObj = params[0].ToCJSObject())
571 {
572 if (TimerObj* pTimerObj = (TimerObj*)pJSObj->GetEmbedObject())
573 {
574 if (CJS_Timer* pTimer = pTimerObj->GetTimer())
575 {
576 pTimer->KillJSTimer();
577
578 for (int i=0,sz=m_aTimer.GetSize(); i<sz; i++)
579 {
580 if (m_aTimer[i] == pTimer)
581 {
582 m_aTimer.RemoveAt(i);
583 break;
584 }
585 }
586
587 delete pTimer;
588 pTimerObj->SetTimer(NULL);
589 }
590 }
591 }
592 }
593 }
594 }
595
596 return TRUE;
597 }
598
clearInterval(IFXJS_Context * cc,const CJS_Parameters & params,CJS_Value & vRet,CFX_WideString & sError)599 FX_BOOL app::clearInterval(IFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, CFX_WideString& sError)
600 {
601 CJS_Context* pContext = (CJS_Context*)cc;
602 ASSERT(pContext != NULL);
603 CJS_Runtime* pRuntime = pContext->GetJSRuntime();
604 ASSERT(pRuntime != NULL);
605
606 if (params.size() != 1)
607 {
608 sError = JSGetStringFromID((CJS_Context*)cc, IDS_STRING_JSPARAMERROR);
609 return FALSE;
610 }
611
612 if (params[0].GetType() == VT_fxobject)
613 {
614 JSFXObject pObj = params[0].ToV8Object();
615 {
616 if (JS_GetObjDefnID(pObj) == JS_GetObjDefnID(*pRuntime, L"TimerObj"))
617 {
618 if (CJS_Object* pJSObj = params[0].ToCJSObject())
619 {
620 if (TimerObj* pTimerObj = (TimerObj*)pJSObj->GetEmbedObject())
621 {
622 if (CJS_Timer* pTimer = pTimerObj->GetTimer())
623 {
624 pTimer->KillJSTimer();
625
626 for (int i=0,sz=m_aTimer.GetSize(); i<sz; i++)
627 {
628 if (m_aTimer[i] == pTimer)
629 {
630 m_aTimer.RemoveAt(i);
631 break;
632 }
633 }
634
635 delete pTimer;
636 pTimerObj->SetTimer(NULL);
637 }
638 }
639 }
640 }
641 }
642 }
643
644 return TRUE;
645 }
646
execMenuItem(IFXJS_Context * cc,const CJS_Parameters & params,CJS_Value & vRet,CFX_WideString & sError)647 FX_BOOL app::execMenuItem(IFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, CFX_WideString& sError)
648 {
649 return FALSE;
650 }
651
TimerProc(CJS_Timer * pTimer)652 void app::TimerProc(CJS_Timer* pTimer)
653 {
654 ASSERT(pTimer != NULL);
655
656 switch (pTimer->GetType())
657 {
658 case 0: //interval
659 RunJsScript(pTimer->GetRuntime(), pTimer->GetJScript());
660 break;
661 case 1:
662 if (pTimer->GetTimeOut() > 0)
663 {
664 RunJsScript(pTimer->GetRuntime(), pTimer->GetJScript());
665 pTimer->KillJSTimer();
666 }
667 break;
668 }
669
670 }
671
RunJsScript(CJS_Runtime * pRuntime,const CFX_WideString & wsScript)672 void app::RunJsScript(CJS_Runtime* pRuntime,const CFX_WideString& wsScript)
673 {
674 ASSERT(pRuntime != NULL);
675
676 if (!pRuntime->IsBlocking())
677 {
678 IFXJS_Context* pContext = pRuntime->NewContext();
679 ASSERT(pContext != NULL);
680 pContext->OnExternal_Exec();
681 CFX_WideString wtInfo;
682 pContext->RunScript(wsScript,wtInfo);
683 pRuntime->ReleaseContext(pContext);
684 }
685 }
686
goBack(IFXJS_Context * cc,const CJS_Parameters & params,CJS_Value & vRet,CFX_WideString & sError)687 FX_BOOL app::goBack(IFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, CFX_WideString& sError)
688 {
689 // Not supported.
690 return TRUE;
691 }
692
goForward(IFXJS_Context * cc,const CJS_Parameters & params,CJS_Value & vRet,CFX_WideString & sError)693 FX_BOOL app::goForward(IFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, CFX_WideString& sError)
694 {
695 // Not supported.
696 return TRUE;
697 }
698
mailMsg(IFXJS_Context * cc,const CJS_Parameters & params,CJS_Value & vRet,CFX_WideString & sError)699 FX_BOOL app::mailMsg(IFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, CFX_WideString& sError)
700 {
701 CJS_Context* pContext = (CJS_Context*)cc;
702 v8::Isolate* isolate = GetIsolate(cc);
703
704 FX_BOOL bUI = TRUE;
705 CFX_WideString cTo = L"";
706 CFX_WideString cCc = L"";
707 CFX_WideString cBcc = L"";
708 CFX_WideString cSubject = L"";
709 CFX_WideString cMsg = L"";
710
711 if (params.size() < 1)
712 return FALSE;
713
714 if (params[0].GetType() == VT_object)
715 {
716 JSObject pObj = params[0].ToV8Object();
717
718 v8::Local<v8::Value> pValue = JS_GetObjectElement(isolate, pObj, L"bUI");
719 bUI = CJS_Value(isolate, pValue, GET_VALUE_TYPE(pValue)).ToBool();
720
721 pValue = JS_GetObjectElement(isolate, pObj, L"cTo");
722 cTo = CJS_Value(isolate, pValue, GET_VALUE_TYPE(pValue)).ToCFXWideString();
723
724 pValue = JS_GetObjectElement(isolate, pObj, L"cCc");
725 cCc = CJS_Value(isolate, pValue, GET_VALUE_TYPE(pValue)).ToCFXWideString();
726
727 pValue = JS_GetObjectElement(isolate, pObj, L"cBcc");
728 cBcc = CJS_Value(isolate, pValue, GET_VALUE_TYPE(pValue)).ToCFXWideString();
729
730 pValue = JS_GetObjectElement(isolate, pObj, L"cSubject");
731 cSubject = CJS_Value(isolate, pValue, GET_VALUE_TYPE(pValue)).ToCFXWideString();
732
733 pValue = JS_GetObjectElement(isolate, pObj, L"cMsg");
734 cMsg = CJS_Value(isolate, pValue, GET_VALUE_TYPE(pValue)).ToCFXWideString();
735 } else {
736 if (params.size() < 2)
737 return FALSE;
738
739 bUI = params[0].ToBool();
740 cTo = params[1].ToCFXWideString();
741
742 if (params.size() >= 3)
743 cCc = params[2].ToCFXWideString();
744 if (params.size() >= 4)
745 cBcc = params[3].ToCFXWideString();
746 if (params.size() >= 5)
747 cSubject = params[4].ToCFXWideString();
748 if (params.size() >= 6)
749 cMsg = params[5].ToCFXWideString();
750 }
751
752 CJS_Runtime* pRuntime = pContext->GetJSRuntime();
753 ASSERT(pRuntime != NULL);
754
755 CPDFDoc_Environment* pApp = pContext->GetReaderApp();
756 ASSERT(pApp != NULL);
757
758 pRuntime->BeginBlock();
759 pApp->JS_docmailForm(NULL, 0, bUI, cTo.c_str(), cSubject.c_str(), cCc.c_str(), cBcc.c_str(), cMsg.c_str());
760 pRuntime->EndBlock();
761
762 return FALSE;
763 }
764
launchURL(IFXJS_Context * cc,const CJS_Parameters & params,CJS_Value & vRet,CFX_WideString & sError)765 FX_BOOL app::launchURL(IFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, CFX_WideString& sError)
766 {
767 // Unsafe, not supported.
768 return TRUE;
769 }
770
runtimeHighlight(IFXJS_Context * cc,CJS_PropValue & vp,CFX_WideString & sError)771 FX_BOOL app::runtimeHighlight(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError)
772 {
773 if (vp.IsSetting())
774 {
775 vp>>m_bRuntimeHighLight;
776 }
777 else
778 {
779 vp<<m_bRuntimeHighLight;
780 }
781
782 return TRUE;
783 }
784
fullscreen(IFXJS_Context * cc,CJS_PropValue & vp,CFX_WideString & sError)785 FX_BOOL app::fullscreen(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError)
786 {
787 return FALSE;
788 }
789
popUpMenu(IFXJS_Context * cc,const CJS_Parameters & params,CJS_Value & vRet,CFX_WideString & sError)790 FX_BOOL app::popUpMenu(IFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, CFX_WideString& sError)
791 {
792 return FALSE;
793 }
794
795
browseForDoc(IFXJS_Context * cc,const CJS_Parameters & params,CJS_Value & vRet,CFX_WideString & sError)796 FX_BOOL app::browseForDoc(IFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, CFX_WideString& sError)
797 {
798 // Unsafe, not supported.
799 return TRUE;
800 }
801
SysPathToPDFPath(const CFX_WideString & sOldPath)802 CFX_WideString app::SysPathToPDFPath(const CFX_WideString& sOldPath)
803 {
804 CFX_WideString sRet = L"/";
805
806 for (int i=0,sz=sOldPath.GetLength(); i<sz; i++)
807 {
808 wchar_t c = sOldPath.GetAt(i);
809 if (c == L':')
810 {
811 }
812 else
813 {
814 if (c == L'\\')
815 {
816 sRet += L"/";
817 }
818 else
819 {
820 sRet += c;
821 }
822 }
823 }
824
825 return sRet;
826 }
827
newDoc(IFXJS_Context * cc,const CJS_Parameters & params,CJS_Value & vRet,CFX_WideString & sError)828 FX_BOOL app::newDoc(IFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, CFX_WideString& sError)
829 {
830 return FALSE;
831 }
832
openDoc(IFXJS_Context * cc,const CJS_Parameters & params,CJS_Value & vRet,CFX_WideString & sError)833 FX_BOOL app::openDoc(IFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, CFX_WideString& sError)
834 {
835 return FALSE;
836 }
837
response(IFXJS_Context * cc,const CJS_Parameters & params,CJS_Value & vRet,CFX_WideString & sError)838 FX_BOOL app::response(IFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, CFX_WideString& sError)
839 {
840 CFX_WideString swQuestion = L"";
841 CFX_WideString swLabel = L"";
842 CFX_WideString swTitle = L"PDF";
843 CFX_WideString swDefault = L"";
844 bool bPassWord = false;
845
846 v8::Isolate* isolate = GetIsolate(cc);
847
848 int iLength = params.size();
849 if (iLength > 0 && params[0].GetType() == VT_object)
850 {
851 JSObject pObj = params[0].ToV8Object();
852 v8::Local<v8::Value> pValue = JS_GetObjectElement(isolate,pObj,L"cQuestion");
853 swQuestion = CJS_Value(isolate,pValue,GET_VALUE_TYPE(pValue)).ToCFXWideString();
854
855 pValue = JS_GetObjectElement(isolate,pObj,L"cTitle");
856 swTitle = CJS_Value(isolate,pValue,GET_VALUE_TYPE(pValue)).ToCFXWideString();
857
858 pValue = JS_GetObjectElement(isolate,pObj,L"cDefault");
859 swDefault = CJS_Value(isolate,pValue,GET_VALUE_TYPE(pValue)).ToCFXWideString();
860
861 pValue = JS_GetObjectElement(isolate,pObj,L"cLabel");
862 swLabel = CJS_Value(isolate,pValue,GET_VALUE_TYPE(pValue)).ToCFXWideString();
863
864 pValue = JS_GetObjectElement(isolate,pObj,L"bPassword");
865 bPassWord = CJS_Value(isolate,pValue,GET_VALUE_TYPE(pValue)).ToBool();
866 }
867 else
868 {
869 switch(iLength)
870 {
871 case 5:
872 swLabel = params[4].ToCFXWideString();
873 // FALLTHROUGH
874 case 4:
875 bPassWord = params[3].ToBool();
876 // FALLTHROUGH
877 case 3:
878 swDefault = params[2].ToCFXWideString();
879 // FALLTHROUGH
880 case 2:
881 swTitle = params[1].ToCFXWideString();
882 // FALLTHROUGH
883 case 1:
884 swQuestion = params[0].ToCFXWideString();
885 // FALLTHROUGH
886 default:
887 break;
888 }
889 }
890
891 CJS_Context* pContext = (CJS_Context *)cc;
892 ASSERT(pContext != NULL);
893
894 CPDFDoc_Environment* pApp = pContext->GetReaderApp();
895 ASSERT(pApp != NULL);
896
897 const int MAX_INPUT_BYTES = 2048;
898 char* pBuff = new char[MAX_INPUT_BYTES + 2];
899 if (!pBuff)
900 return FALSE;
901
902 memset(pBuff, 0, MAX_INPUT_BYTES + 2);
903 int nLengthBytes = pApp->JS_appResponse(swQuestion.c_str(), swTitle.c_str(), swDefault.c_str(),
904 swLabel.c_str(), bPassWord, pBuff, MAX_INPUT_BYTES);
905 if (nLengthBytes <= 0)
906 {
907 vRet.SetNull();
908 delete[] pBuff;
909 return FALSE;
910 }
911 if (nLengthBytes > MAX_INPUT_BYTES)
912 nLengthBytes = MAX_INPUT_BYTES;
913
914 vRet = CFX_WideString::FromUTF16LE((unsigned short*)pBuff, nLengthBytes / sizeof(unsigned short)).c_str();
915 delete[] pBuff;
916 return TRUE;
917 }
918
media(IFXJS_Context * cc,CJS_PropValue & vp,CFX_WideString & sError)919 FX_BOOL app::media(IFXJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError)
920 {
921 return FALSE;
922 }
923
execDialog(IFXJS_Context * cc,const CJS_Parameters & params,CJS_Value & vRet,CFX_WideString & sError)924 FX_BOOL app::execDialog(IFXJS_Context* cc, const CJS_Parameters& params, CJS_Value& vRet, CFX_WideString& sError)
925 {
926 return TRUE;
927 }
928