• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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, 6)
97 	JS_STATIC_METHOD_ENTRY(beep, 1)
98 	JS_STATIC_METHOD_ENTRY(browseForDoc, 0)
99 	JS_STATIC_METHOD_ENTRY(clearInterval, 1)
100 	JS_STATIC_METHOD_ENTRY(clearTimeOut, 1)
101 	JS_STATIC_METHOD_ENTRY(execDialog, 3)
102 	JS_STATIC_METHOD_ENTRY(execMenuItem,  1)
103 	JS_STATIC_METHOD_ENTRY(findComponent, 1)
104 	JS_STATIC_METHOD_ENTRY(goBack, 0)
105 	JS_STATIC_METHOD_ENTRY(goForward, 0)
106 	JS_STATIC_METHOD_ENTRY(launchURL, 0)
107 	JS_STATIC_METHOD_ENTRY(mailMsg, 0)
108 	JS_STATIC_METHOD_ENTRY(newFDF, 0)
109 	JS_STATIC_METHOD_ENTRY(newDoc, 0)
110 	JS_STATIC_METHOD_ENTRY(openDoc, 0)
111 	JS_STATIC_METHOD_ENTRY(openFDF, 5)
112 	JS_STATIC_METHOD_ENTRY(popUpMenuEx, 0)
113 	JS_STATIC_METHOD_ENTRY(popUpMenu, 0)
114 	JS_STATIC_METHOD_ENTRY(response, 0)
115 	JS_STATIC_METHOD_ENTRY(setInterval, 2)
116 	JS_STATIC_METHOD_ENTRY(setTimeOut, 2)
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_pRuntime(NULL),
124 	m_bRuntimeHighLight(false)
125 //	m_pMenuHead(NULL)
126 {
127 }
128 
~app(void)129 app::~app(void)
130 {
131 	for (int i=0,sz=m_aTimer.GetSize(); i<sz; i++)
132 		delete m_aTimer[i];
133 
134 	m_aTimer.RemoveAll();
135 }
136 
activeDocs(OBJ_PROP_PARAMS)137 FX_BOOL app::activeDocs(OBJ_PROP_PARAMS)
138 {
139 	if (vp.IsGetting())
140 	{
141 
142 		CJS_Context* pContext = (CJS_Context *)cc;
143 		ASSERT(pContext != NULL);
144 
145 		CPDFDoc_Environment* pApp = pContext->GetReaderApp();
146 		ASSERT(pApp != NULL);
147 
148 		CJS_Runtime* pRuntime = pContext->GetJSRuntime();
149 		ASSERT(pRuntime != NULL);
150 
151 		CPDFSDK_Document* pCurDoc = pContext->GetReaderDocument();
152 
153 		CJS_Array aDocs(pRuntime->GetIsolate());
154 //		int iNumDocs = pApp->CountDocuments();
155 
156 // 		for(int iIndex = 0; iIndex<iNumDocs; iIndex++)
157 // 		{
158 			CPDFSDK_Document* pDoc = pApp->GetCurrentDoc();
159 			if (pDoc)
160 			{
161 				CJS_Document * pJSDocument = NULL;
162 
163 				if (pDoc == pCurDoc)
164 				{
165 					JSFXObject pObj = JS_GetThisObj(*pRuntime);
166 
167 					if (JS_GetObjDefnID(pObj) == JS_GetObjDefnID(*pRuntime, L"Document"))
168 					{
169 						pJSDocument = (CJS_Document*)JS_GetPrivate(pRuntime->GetIsolate(),pObj);
170 					}
171 				}
172 				else
173 				{
174 					JSFXObject pObj = JS_NewFxDynamicObj(*pRuntime, pContext, JS_GetObjDefnID(*pRuntime,L"Document"));
175 					pJSDocument = (CJS_Document*)JS_GetPrivate(pRuntime->GetIsolate(),pObj);
176 					ASSERT(pJSDocument != NULL);
177 
178 
179 					//			pDocument->AttachDoc(pDoc);
180 				}
181 
182 				aDocs.SetElement(0,CJS_Value(pRuntime->GetIsolate(),pJSDocument));
183 			}
184 	//		}
185 
186 		if (aDocs.GetLength() > 0)
187 			vp << aDocs;
188 		else
189 			vp.SetNull();
190 		return TRUE;
191 	}
192 	return FALSE;
193 }
194 
calculate(OBJ_PROP_PARAMS)195 FX_BOOL app::calculate(OBJ_PROP_PARAMS)
196 {
197 	if (vp.IsSetting())
198 	{
199 		bool bVP;
200 		vp >> bVP;
201 		m_bCalculate = (FX_BOOL)bVP;
202 
203 		CJS_Context* pContext = (CJS_Context*)cc;
204 		ASSERT(pContext != NULL);
205 
206 		CPDFDoc_Environment* pApp = pContext->GetReaderApp();
207 		ASSERT(pApp != NULL);
208 
209 		CJS_Runtime* pRuntime = pContext->GetJSRuntime();
210 		ASSERT(pRuntime != NULL);
211 
212 		CJS_Array aDocs(pRuntime->GetIsolate());
213 // 		int iNumDocs = pApp->CountDocuments();
214 //
215 // 		for (int iIndex = 0;iIndex < iNumDocs; iIndex++)
216 // 		{
217 			if (CPDFSDK_Document* pDoc = pApp->GetCurrentDoc())
218 			{
219 				CPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)pDoc->GetInterForm();
220 				ASSERT(pInterForm != NULL);
221 				pInterForm->EnableCalculate((FX_BOOL)m_bCalculate);
222 			}
223 //		}
224 	}
225 	else
226 	{
227 		vp << (bool)m_bCalculate;
228 	}
229 
230 	return TRUE;
231 }
232 
formsVersion(OBJ_PROP_PARAMS)233 FX_BOOL app::formsVersion(OBJ_PROP_PARAMS)
234 {
235 	if (vp.IsGetting())
236 	{
237 		vp << JS_NUM_FORMSVERSION;
238 		return TRUE;
239 	}
240 
241 	return FALSE;
242 }
243 
viewerType(OBJ_PROP_PARAMS)244 FX_BOOL app::viewerType(OBJ_PROP_PARAMS)
245 {
246 
247 
248 
249 
250 
251 
252 	if (vp.IsGetting())
253 	{
254 // 		if (pApp->GetAppName() == PHANTOM)
255 // 			vp << JS_STR_VIEWERTYPE_STANDARD;
256 // 		else
257 // 			vp << JS_STR_VIEWERTYPE_READER;
258 		vp << L"unknown";
259 
260 		//vp << pApp->GetAppTitle();
261 		return TRUE;
262 	}
263 
264 	return FALSE;
265 }
266 
viewerVariation(OBJ_PROP_PARAMS)267 FX_BOOL app::viewerVariation(OBJ_PROP_PARAMS)
268 {
269 	if (vp.IsGetting())
270 	{
271 		vp << JS_STR_VIEWERVARIATION;
272 		return TRUE;
273 	}
274 
275 	return FALSE;
276 }
277 
viewerVersion(OBJ_PROP_PARAMS)278 FX_BOOL app::viewerVersion(OBJ_PROP_PARAMS)
279 {
280 	if (vp.IsGetting())
281 	{
282 		vp << JS_STR_VIEWERVERSION;
283 		return TRUE;
284 	}
285 
286 	return FALSE;
287 }
288 
platform(OBJ_PROP_PARAMS)289 FX_BOOL app::platform(OBJ_PROP_PARAMS)
290 {
291 	if (vp.IsGetting())
292 	{
293 		vp << JS_STR_PLATFORM;
294 		return TRUE;
295 	}
296 
297 	return FALSE;
298 }
299 
language(OBJ_PROP_PARAMS)300 FX_BOOL app::language(OBJ_PROP_PARAMS)
301 {
302 	if (vp.IsGetting())
303 	{
304 		vp << JS_STR_LANGUANGE;
305 		return TRUE;
306 	}
307 
308 	return FALSE;
309 }
310 
311 //creates a new fdf object that contains no data
312 //comment: need reader support
313 //note:
314 //CFDF_Document * CPDFDoc_Environment::NewFDF();
newFDF(OBJ_METHOD_PARAMS)315 FX_BOOL app::newFDF(OBJ_METHOD_PARAMS)
316 {
317 	return TRUE;
318 }
319 //opens a specified pdf document and returns its document object
320 //comment:need reader support
321 //note: as defined in js reference, the proto of this function's fourth parmeters, how old an fdf document while do not show it.
322 //CFDF_Document * CPDFDoc_Environment::OpenFDF(string strPath,bool bUserConv);
323 
openFDF(OBJ_METHOD_PARAMS)324 FX_BOOL app::openFDF(OBJ_METHOD_PARAMS)
325 {
326 	return TRUE;
327 }
328 
alert(OBJ_METHOD_PARAMS)329 FX_BOOL app::alert(OBJ_METHOD_PARAMS)
330 {
331 	int iSize = params.size();
332 	if (iSize < 1)
333 		return FALSE;
334 
335 	CFX_WideString swMsg = L"";
336 	CFX_WideString swTitle = L"";
337 	int iIcon = 0;
338 	int iType = 0;
339 
340 	v8::Isolate* isolate = GetIsolate(cc);
341 
342 	if (iSize == 1)
343 	{
344 		if (params[0].GetType() == VT_object)
345 		{
346 			JSObject pObj = params[0];
347 			{
348 				v8::Handle<v8::Value> pValue = JS_GetObjectElement(isolate, pObj, L"cMsg");
349 				swMsg = CJS_Value(isolate,pValue,VT_unknown).operator CFX_WideString();
350 
351 				pValue = JS_GetObjectElement(isolate,pObj,L"cTitle");
352 				swTitle = CJS_Value(isolate, pValue,VT_unknown).operator CFX_WideString();
353 
354 				pValue = JS_GetObjectElement(isolate,pObj,L"nIcon");
355 				iIcon = (int)CJS_Value(isolate,pValue,VT_unknown);
356 
357 				pValue = JS_GetObjectElement(isolate,pObj,L"nType");
358 				iType = (int)CJS_Value(isolate,pValue,VT_unknown);
359 			}
360 
361 			if (swMsg == L"")
362 			{
363 				CJS_Array carray(isolate);
364 				if (params[0].ConvertToArray(carray))
365 				{
366 					int iLenth = carray.GetLength();
367 					CJS_Value* pValue = new CJS_Value(isolate);
368 //					if (iLenth == 1)
369 //						pValue = new CJS_Value(isolate);
370 // 					else if (iLenth > 1)
371 // 						pValue = new CJS_Value[iLenth];
372 
373 					for(int i = 0; i < iLenth; i++)
374 					{
375 						carray.GetElement(i, *pValue);
376 						swMsg += (*pValue).operator CFX_WideString();
377 						if (i < iLenth - 1)
378 							swMsg += L",  ";
379 					}
380 
381 					if(pValue) delete pValue;
382 // 					if ((iLenth > 1) && pValue)
383 // 					{
384 // 						delete[]pValue;
385 // 						pValue = NULL;
386 // 					}
387 // 					else if ((iLenth == 1) && pValue)
388 // 					{
389 // 						delete pValue;
390 // 						pValue = NULL;
391 // 					}
392 				}
393 			}
394 
395 			if (swTitle == L"")
396 				swTitle = JSGetStringFromID((CJS_Context*)cc, IDS_STRING_JSALERT);
397 		}
398 		else if (params[0].GetType() == VT_boolean)
399 		{
400 			FX_BOOL bGet = (FX_BOOL)params[0];
401 			if (bGet)
402 				swMsg = L"true";
403 			else
404 				swMsg = L"false";
405 
406 			swTitle = JSGetStringFromID((CJS_Context*)cc, IDS_STRING_JSALERT);
407 		}
408 		else
409 		{
410 			swMsg = params[0];
411 			swTitle = JSGetStringFromID((CJS_Context*)cc, IDS_STRING_JSALERT);
412 		}
413 	}
414 	else
415 	{
416 		if (params[0].GetType() == VT_boolean)
417 		{
418 			FX_BOOL bGet = (FX_BOOL)params[0];
419 			if (bGet)
420 				swMsg = L"true";
421 			else
422 				swMsg = L"false";
423 		}
424 		else
425 		{
426 			swMsg = params[0];
427 		}
428 		swTitle = JSGetStringFromID((CJS_Context*)cc, IDS_STRING_JSALERT);
429 
430 		for(int i = 1;i<iSize;i++)
431 		{
432 			if (i == 1)
433 				iIcon = int(params[i]);
434 			if (i == 2)
435 				iType = int(params[i]);
436 			if (i == 3)
437 				swTitle = params[i];
438 		}
439 	}
440 
441 
442 	CJS_Context* pContext = (CJS_Context*)cc;
443 	ASSERT(pContext != NULL);
444 	CJS_Runtime* pRuntime = pContext->GetJSRuntime();
445 	ASSERT(pRuntime != NULL);
446 	pRuntime->BeginBlock();
447 	vRet = MsgBox(pRuntime->GetReaderApp(), JSGetPageView(cc),swMsg,swTitle,iType,iIcon);
448 	pRuntime->EndBlock();
449 
450 	return TRUE;
451 }
452 
453 
beep(OBJ_METHOD_PARAMS)454 FX_BOOL app::beep(OBJ_METHOD_PARAMS)
455 {
456 	if (params.size() == 1)
457 	{
458 		CJS_Context* pContext = (CJS_Context*)cc;
459 		CJS_Runtime* pRuntime = pContext->GetJSRuntime();
460 		CPDFDoc_Environment * pEnv = pRuntime->GetReaderApp();
461 		pEnv->JS_appBeep((int)params[0]);
462 
463 		return TRUE;
464 	}
465 	else
466 	{
467 		sError = JSGetStringFromID((CJS_Context*)cc, IDS_STRING_JSPARAMERROR);
468 		return FALSE;
469 	}
470 }
471 
findComponent(OBJ_METHOD_PARAMS)472 FX_BOOL app::findComponent(OBJ_METHOD_PARAMS)
473 {
474 	return TRUE;
475 }
476 
popUpMenuEx(OBJ_METHOD_PARAMS)477 FX_BOOL app::popUpMenuEx(OBJ_METHOD_PARAMS)
478 {
479 	return FALSE;
480 }
481 
fs(OBJ_PROP_PARAMS)482 FX_BOOL app::fs(OBJ_PROP_PARAMS)
483 {
484 #ifdef FOXIT_CHROME_BUILD
485 	return FALSE;
486 #else
487 	CJS_Context* pContext = (CJS_Context*)cc;
488 	ASSERT(pContext != NULL);
489 	CJS_Runtime* pRuntime = pContext->GetJSRuntime();
490 	ASSERT(pRuntime != NULL);
491 
492 	if (vp.IsGetting())
493 	{
494 		return TRUE;
495 	}
496 	else
497 	{
498 		return TRUE;
499 	}
500 #endif
501 }
502 
setInterval(OBJ_METHOD_PARAMS)503 FX_BOOL app::setInterval(OBJ_METHOD_PARAMS)
504 {
505 	if (params.size() > 2 || params.size() == 0)
506 	{
507 		sError = JSGetStringFromID((CJS_Context*)cc, IDS_STRING_JSPARAMERROR);
508 		return FALSE;
509 	}
510 
511 	CJS_Context* pContext = (CJS_Context*)cc;
512 	ASSERT(pContext != NULL);
513 	CJS_Runtime* pRuntime = pContext->GetJSRuntime();
514 	ASSERT(pRuntime != NULL);
515 
516 	CFX_WideString script = params.size() > 0 ?  (FX_LPCWSTR)(params[0].operator CFX_WideString()) : (FX_LPCWSTR)L"";
517 	if (script.IsEmpty())
518 	{
519 		sError = JSGetStringFromID((CJS_Context*)cc, IDS_STRING_JSAFNUMBER_KEYSTROKE);
520 		return TRUE;
521 	}
522 
523 	FX_DWORD dwInterval = params.size() > 1 ? (int)params[1] : 1000;
524 
525 	CPDFDoc_Environment* pApp = pRuntime->GetReaderApp();
526 	ASSERT(pApp);
527 	CJS_Timer* pTimer = new CJS_Timer(this, pApp);
528 	m_aTimer.Add(pTimer);
529 
530 	pTimer->SetType(0);
531 	pTimer->SetRuntime(pRuntime);
532 	pTimer->SetJScript(script);
533 	pTimer->SetTimeOut(0);
534 //	pTimer->SetStartTime(GetTickCount());
535 	pTimer->SetJSTimer(dwInterval);
536 
537 	JSFXObject pRetObj = JS_NewFxDynamicObj(*pRuntime, pContext, JS_GetObjDefnID(*pRuntime, L"TimerObj"));
538 
539 	CJS_TimerObj* pJS_TimerObj = (CJS_TimerObj*)JS_GetPrivate(pRuntime->GetIsolate(),pRetObj);
540 	ASSERT(pJS_TimerObj != NULL);
541 
542 	TimerObj* pTimerObj = (TimerObj*)pJS_TimerObj->GetEmbedObject();
543 	ASSERT(pTimerObj != NULL);
544 
545 	pTimerObj->SetTimer(pTimer);
546 
547 	vRet = pRetObj;
548 
549 	return TRUE;
550 }
551 
setTimeOut(OBJ_METHOD_PARAMS)552 FX_BOOL app::setTimeOut(OBJ_METHOD_PARAMS)
553 {
554 	if (params.size() > 2 || params.size() == 0)
555 	{
556 		sError = JSGetStringFromID((CJS_Context*)cc, IDS_STRING_JSPARAMERROR);
557 		return FALSE;
558 	}
559 
560 	CJS_Context* pContext = (CJS_Context*)cc;
561 	ASSERT(pContext != NULL);
562 	CJS_Runtime* pRuntime = pContext->GetJSRuntime();
563 	ASSERT(pRuntime != NULL);
564 
565 	CFX_WideString script = params.size() > 0 ?  (FX_LPCWSTR)(params[0].operator CFX_WideString()) : (FX_LPCWSTR)L"";
566 	if (script.IsEmpty())
567 	{
568 		sError = JSGetStringFromID((CJS_Context*)cc, IDS_STRING_JSAFNUMBER_KEYSTROKE);
569 		return TRUE;
570 	}
571 
572 	FX_DWORD dwTimeOut = params.size() > 1 ? (int)params[1] : 1000;
573 
574 	CPDFDoc_Environment* pApp = pRuntime->GetReaderApp();
575 	ASSERT(pApp);
576 	CJS_Timer* pTimer = new CJS_Timer(this, pApp);
577 	m_aTimer.Add(pTimer);
578 
579 	pTimer->SetType(1);
580 	pTimer->SetRuntime(pRuntime);
581 	pTimer->SetJScript(script);
582 	pTimer->SetTimeOut(dwTimeOut);
583 //	pTimer->SetStartTime(GetTickCount());
584 //	pTimer->SetJSTimer(1000);
585 	pTimer->SetJSTimer(dwTimeOut);
586 
587 	JSFXObject pRetObj = JS_NewFxDynamicObj(*pRuntime, pContext, JS_GetObjDefnID(*pRuntime, L"TimerObj"));
588 //	ASSERT(pRetObj != NULL);
589 
590 	CJS_TimerObj* pJS_TimerObj = (CJS_TimerObj*)JS_GetPrivate(pRuntime->GetIsolate(),pRetObj);
591 	ASSERT(pJS_TimerObj != NULL);
592 
593 	TimerObj* pTimerObj = (TimerObj*)pJS_TimerObj->GetEmbedObject();
594 	ASSERT(pTimerObj != NULL);
595 
596 	pTimerObj->SetTimer(pTimer);
597 
598 	vRet = pRetObj;
599 
600 	return TRUE;
601 }
602 
clearTimeOut(OBJ_METHOD_PARAMS)603 FX_BOOL app::clearTimeOut(OBJ_METHOD_PARAMS)
604 {
605 	CJS_Context* pContext = (CJS_Context*)cc;
606 	ASSERT(pContext != NULL);
607 	CJS_Runtime* pRuntime = pContext->GetJSRuntime();
608 	ASSERT(pRuntime != NULL);
609 
610 	if (params.size() != 1)
611 	{
612 		sError = JSGetStringFromID((CJS_Context*)cc, IDS_STRING_JSPARAMERROR);
613 		return FALSE;
614 	}
615 
616 	if (params[0].GetType() == VT_fxobject)
617 	{
618 		JSFXObject pObj = (JSFXObject)params[0];
619 		{
620 			if (JS_GetObjDefnID(pObj) == JS_GetObjDefnID(*pRuntime, L"TimerObj"))
621 			{
622 				if (CJS_Object* pJSObj = (CJS_Object*)params[0])
623 				{
624 					if (TimerObj* pTimerObj = (TimerObj*)pJSObj->GetEmbedObject())
625 					{
626 						if (CJS_Timer* pTimer = pTimerObj->GetTimer())
627 						{
628 							pTimer->KillJSTimer();
629 
630 							for (int i=0,sz=m_aTimer.GetSize(); i<sz; i++)
631 							{
632 								if (m_aTimer[i] == pTimer)
633 								{
634 									m_aTimer.RemoveAt(i);
635 									break;
636 								}
637 							}
638 
639 							delete pTimer;
640 							pTimerObj->SetTimer(NULL);
641 						}
642 					}
643 				}
644 			}
645 		}
646 	}
647 
648 	return TRUE;
649 }
650 
clearInterval(OBJ_METHOD_PARAMS)651 FX_BOOL app::clearInterval(OBJ_METHOD_PARAMS)
652 {
653 	CJS_Context* pContext = (CJS_Context*)cc;
654 	ASSERT(pContext != NULL);
655 	CJS_Runtime* pRuntime = pContext->GetJSRuntime();
656 	ASSERT(pRuntime != NULL);
657 
658 	if (params.size() != 1)
659 	{
660 		sError = JSGetStringFromID((CJS_Context*)cc, IDS_STRING_JSPARAMERROR);
661 		return FALSE;
662 	}
663 
664 	if (params[0].GetType() == VT_fxobject)
665 	{
666 		JSFXObject pObj = (JSFXObject)params[0];
667 		{
668 			if (JS_GetObjDefnID(pObj) == JS_GetObjDefnID(*pRuntime, L"TimerObj"))
669 			{
670 				if (CJS_Object* pJSObj = (CJS_Object*)params[0])
671 				{
672 					if (TimerObj* pTimerObj = (TimerObj*)pJSObj->GetEmbedObject())
673 					{
674 						if (CJS_Timer* pTimer = pTimerObj->GetTimer())
675 						{
676 							pTimer->KillJSTimer();
677 
678 							for (int i=0,sz=m_aTimer.GetSize(); i<sz; i++)
679 							{
680 								if (m_aTimer[i] == pTimer)
681 								{
682 									m_aTimer.RemoveAt(i);
683 									break;
684 								}
685 							}
686 
687 							delete pTimer;
688 							pTimerObj->SetTimer(NULL);
689 						}
690 					}
691 				}
692 			}
693 		}
694 	}
695 
696 	return TRUE;
697 }
698 
execMenuItem(OBJ_METHOD_PARAMS)699 FX_BOOL app::execMenuItem(OBJ_METHOD_PARAMS)
700 {
701 	return FALSE;
702 }
703 
TimerProc(CJS_Timer * pTimer)704 void app::TimerProc(CJS_Timer* pTimer)
705 {
706 	ASSERT(pTimer != NULL);
707 
708 	switch (pTimer->GetType())
709 	{
710 	case 0: //interval
711 		RunJsScript(pTimer->GetRuntime(), pTimer->GetJScript());
712 		break;
713 	case 1:
714 		if (pTimer->GetTimeOut() > 0)
715 		{
716 			RunJsScript(pTimer->GetRuntime(), pTimer->GetJScript());
717 			pTimer->KillJSTimer();
718 		}
719 		break;
720 	}
721 
722 }
723 
RunJsScript(CJS_Runtime * pRuntime,const CFX_WideString & wsScript)724 void app::RunJsScript(CJS_Runtime* pRuntime,const CFX_WideString& wsScript)
725 {
726 	ASSERT(pRuntime != NULL);
727 
728 	if (!pRuntime->IsBlocking())
729 	{
730 		IFXJS_Context* pContext = pRuntime->NewContext();
731 		ASSERT(pContext != NULL);
732 		pContext->OnExternal_Exec();
733 		CFX_WideString wtInfo;
734 		pContext->RunScript(wsScript,wtInfo);
735 		pRuntime->ReleaseContext(pContext);
736 	}
737 }
738 
goBack(OBJ_METHOD_PARAMS)739 FX_BOOL app::goBack(OBJ_METHOD_PARAMS)
740 {
741 
742 
743 
744 
745 
746 
747 	return TRUE;
748 }
749 
goForward(OBJ_METHOD_PARAMS)750 FX_BOOL app::goForward(OBJ_METHOD_PARAMS)
751 {
752 
753 
754 
755 
756 
757 
758 	return TRUE;
759 }
760 
mailMsg(OBJ_METHOD_PARAMS)761 FX_BOOL app::mailMsg(OBJ_METHOD_PARAMS)
762 {
763 	CJS_Context* pContext = (CJS_Context*)cc;
764 	ASSERT(pContext != NULL);
765 
766 	v8::Isolate* isolate = GetIsolate(cc);
767 
768 	FX_BOOL bUI = TRUE;
769 	CFX_WideString cTo = L"";
770 	CFX_WideString cCc = L"";
771 	CFX_WideString cBcc = L"";
772 	CFX_WideString cSubject = L"";
773 	CFX_WideString cMsg = L"";
774 	if(params.size() < 2)
775 		return FALSE;
776 
777 	bUI = params.size()>=1?(int)params[0]:TRUE;
778 	cTo = params.size()>=2?(const wchar_t*)(FX_LPCWSTR)params[1].operator CFX_WideString():L"";
779 	cCc = params.size()>=3?(const wchar_t*)(FX_LPCWSTR)params[2].operator CFX_WideString():L"";
780 	cBcc = params.size()>=4?(const wchar_t*)(FX_LPCWSTR)params[3].operator CFX_WideString():L"";
781 	cSubject = params.size()>=5?(const wchar_t*)(FX_LPCWSTR)params[4].operator CFX_WideString():L"";
782 	cMsg = params.size()>=6?(const wchar_t*)(FX_LPCWSTR)params[5].operator CFX_WideString():L"";
783 
784 
785 	if (params[0].GetType() == VT_object)
786 	{
787 		JSObject pObj = (JSObject)params[0];
788 
789 		v8::Handle<v8::Value> pValue = JS_GetObjectElement(isolate,pObj, L"bUI");
790 			bUI = (int)CJS_Value(isolate,pValue,GET_VALUE_TYPE(pValue));
791 
792 		pValue = JS_GetObjectElement(isolate, pObj, L"cTo");
793 			cTo = CJS_Value(isolate,pValue,GET_VALUE_TYPE(pValue)).operator CFX_WideString();
794 
795 		pValue = JS_GetObjectElement(isolate,pObj, L"cCc");
796 			cCc = CJS_Value(isolate,pValue,GET_VALUE_TYPE(pValue)).operator CFX_WideString();
797 
798 		pValue = JS_GetObjectElement(isolate,pObj, L"cBcc");
799 			cBcc = CJS_Value(isolate,pValue,GET_VALUE_TYPE(pValue)).operator CFX_WideString();
800 
801 		pValue = JS_GetObjectElement(isolate,pObj, L"cSubject");
802 			cSubject = CJS_Value(isolate,pValue,GET_VALUE_TYPE(pValue)).operator CFX_WideString();
803 
804 		pValue = JS_GetObjectElement(isolate,pObj, L"cMsg");
805 			cMsg = CJS_Value(isolate,pValue,GET_VALUE_TYPE(pValue)).operator CFX_WideString();
806 	}
807 
808 
809 
810 	CJS_Runtime* pRuntime = pContext->GetJSRuntime();
811 	ASSERT(pRuntime != NULL);
812 
813 	CPDFDoc_Environment* pApp = pContext->GetReaderApp();
814 	ASSERT(pApp != NULL);
815 
816 	pRuntime->BeginBlock();
817 	pApp->JS_docmailForm(NULL, 0, bUI, (FX_LPCWSTR)cTo, (FX_LPCWSTR)cSubject, (FX_LPCWSTR)cCc, (FX_LPCWSTR)cBcc, (FX_LPCWSTR)cMsg);
818 	///////////////////////////////////////////////////////////////////////////////////////////////
819 	pRuntime->EndBlock();
820 
821 	//return bRet;
822 	return FALSE;
823 }
824 
launchURL(OBJ_METHOD_PARAMS)825 FX_BOOL app::launchURL(OBJ_METHOD_PARAMS)
826 {
827 	if (IsSafeMode(cc)) return TRUE;
828 
829 	CJS_Context* pContext = (CJS_Context*)cc;
830 	ASSERT(pContext != NULL);
831 
832 
833 
834 
835 	CFX_WideString swURL = params[0].operator CFX_WideString();
836 
837 	CJS_Runtime* pRuntime = pContext->GetJSRuntime();
838 	ASSERT(pRuntime != NULL);
839 
840 	pRuntime->BeginBlock();
841 //	FX_BOOL bRet = pApp->OpenURL(swURL);
842 	pRuntime->EndBlock();
843 
844 //	return bRet;
845 	return FALSE;
846 }
847 
runtimeHighlight(OBJ_PROP_PARAMS)848 FX_BOOL app::runtimeHighlight(OBJ_PROP_PARAMS)
849 {
850 	if (vp.IsSetting())
851 	{
852 		vp>>m_bRuntimeHighLight;
853 	}
854 	else
855 	{
856 		vp<<m_bRuntimeHighLight;
857 	}
858 
859 	return TRUE;
860 }
861 
fullscreen(OBJ_PROP_PARAMS)862 FX_BOOL app::fullscreen(OBJ_PROP_PARAMS)
863 {
864 	return FALSE;
865 }
866 
popUpMenu(OBJ_METHOD_PARAMS)867 FX_BOOL app::popUpMenu(OBJ_METHOD_PARAMS)
868 {
869 	return FALSE;
870 }
871 
872 
browseForDoc(OBJ_METHOD_PARAMS)873 FX_BOOL app::browseForDoc(OBJ_METHOD_PARAMS)
874 {
875 	//This method may trigger a "file save" dialog,while enable user to save contents of the document.
876 	//Such action is considered to be unsafe.
877 	if (IsSafeMode(cc)) return TRUE;
878 
879 	v8::Isolate* isolate = GetIsolate(cc);
880 
881 	bool bSave = false;
882 	CFX_ByteString cFilenameInit = CFX_ByteString();
883 	CFX_ByteString cFSInit = CFX_ByteString();
884 
885 	if(params.size()>0 && (params[0].GetType() == VT_object))
886 	{
887 		JSObject pObj = (JSObject )params[0];
888 
889  		v8::Handle<v8::Value> pValue = JS_GetObjectElement(isolate,pObj,L"bSave");
890  			bSave = (bool)CJS_Value(isolate,pValue,GET_VALUE_TYPE(pValue));
891 
892 		pValue = JS_GetObjectElement(isolate, pObj,L"cFilenameInit");
893 		{
894 			CJS_Value t = CJS_Value(isolate, pValue, GET_VALUE_TYPE(pValue));
895  			cFilenameInit = t.operator CFX_ByteString();
896 		}
897 
898 		pValue = JS_GetObjectElement(isolate,pObj,L"cFSInit");
899 		{
900 			CJS_Value t = CJS_Value(isolate, pValue, GET_VALUE_TYPE(pValue));
901 			cFSInit = t.operator CFX_ByteString();
902 		}
903 	}
904 	else
905 	{
906 		if(params.size() >= 1)
907 		{
908 			bSave = (bool)params[0];
909 		}
910 		if(params.size() >= 2)
911 		{
912 			CJS_Value t = params[1];
913 			cFilenameInit = t.operator CFX_ByteString();
914 		}
915 		if(params.size() >= 3)
916 		{
917 			CJS_Value t = params[2];
918 			cFSInit = t.operator CFX_ByteString();
919 		}
920 	}
921 	CJS_Context* pContext = (CJS_Context *)cc;
922 	ASSERT(pContext != NULL);
923 
924 	CPDFDoc_Environment* pApp = pContext->GetReaderApp();
925 	ASSERT(pApp != NULL);
926 
927 	CJS_Runtime* pRuntime = pContext->GetJSRuntime();
928 	ASSERT(pRuntime != NULL);
929 
930 	CFX_WideString wsFileNameInit = CFX_WideString::FromLocal(cFilenameInit);
931 	CFX_WideString wsFSInit = CFX_WideString::FromLocal(cFSInit);
932 	CFX_WideString wsFilePath = pApp->JS_appbrowseForDoc(bSave, wsFileNameInit);
933 	if(wsFilePath.IsEmpty())
934 		return FALSE;
935 
936 	JSFXObject pRetObj = JS_NewFxDynamicObj(*pRuntime, pContext, -1);
937 
938 	JS_PutObjectString(isolate,pRetObj, L"cPath", SysPathToPDFPath(wsFilePath));
939 	JS_PutObjectString(isolate,pRetObj, L"cURL", SysPathToPDFPath(wsFilePath));
940 
941 	if (!cFSInit.IsEmpty())
942 	{
943 		JS_PutObjectString(isolate,pRetObj, L"cFS", CFX_WideString::FromLocal(cFSInit.GetBuffer(cFSInit.GetLength())));
944 	}
945 	else
946 	{
947 		JS_PutObjectString(isolate,pRetObj, L"cFS", CFX_WideString::FromLocal("DOS"));
948 	}
949 
950 	vRet =  pRetObj;
951 
952 	return TRUE;
953 }
954 
SysPathToPDFPath(const CFX_WideString & sOldPath)955 CFX_WideString app::SysPathToPDFPath(const CFX_WideString& sOldPath)
956 {
957 	CFX_WideString sRet = L"/";
958 
959 	for (int i=0,sz=sOldPath.GetLength(); i<sz; i++)
960 	{
961 		wchar_t c = sOldPath.GetAt(i);
962 		if (c == L':')
963 		{
964 		}
965 		else
966 		{
967 			if (c == L'\\')
968 			{
969 				sRet += L"/";
970 			}
971 			else
972 			{
973 				sRet += c;
974 			}
975 		}
976 	}
977 
978 	return sRet;
979 }
980 
PDFPathToSysPath(const CFX_WideString & sOldPath)981 CFX_WideString app::PDFPathToSysPath(const CFX_WideString& sOldPath)
982 {
983 	//strLPath = "D:\temporay.fdf";
984 	CFX_WideString strOPath = sOldPath;
985 	strOPath.TrimLeft();
986 	strOPath.TrimRight();
987 
988 	if (strOPath.GetAt(0) == L'/' && strOPath.GetAt(2) == L'/')
989 	{
990 		wchar_t c_Drive = strOPath.GetAt(1);
991 		if ((c_Drive >= L'a' && c_Drive <= L'z' )||( c_Drive >= L'A' && c_Drive <= L'Z'))
992 		{
993 			strOPath.Replace((FX_LPCWSTR)L"/",(FX_LPCWSTR)L"\\");
994 			//strOPath.SetAt(0,'');
995 			strOPath.Insert(2,':');
996 			strOPath.Delete(0);
997 		}
998 	}
999 
1000 	return strOPath;
1001 }
1002 
RelativePathToSysPath(const CFX_WideString & sOldPath,const CFX_WideString & sFilePath)1003 CFX_WideString app::RelativePathToSysPath(const CFX_WideString& sOldPath, const CFX_WideString& sFilePath)
1004 {
1005 //	if (!PathIsRelative(sOldPath)) return sOldPath;
1006 
1007 	int nSplit = 0;
1008 	for (int i=sFilePath.GetLength()-1; i>=0; i--)
1009 	{
1010 		if (sFilePath[i] == '\\' || sFilePath[i] == '/')
1011 		{
1012 			nSplit = i;
1013 			break;
1014 		}
1015 	}
1016 
1017 	return sFilePath.Left(nSplit+1) + sOldPath;
1018 }
1019 
newDoc(OBJ_METHOD_PARAMS)1020 FX_BOOL app::newDoc(OBJ_METHOD_PARAMS)
1021 {
1022 	return FALSE;
1023 }
1024 
openDoc(OBJ_METHOD_PARAMS)1025 FX_BOOL app::openDoc(OBJ_METHOD_PARAMS)
1026 {
1027 	return FALSE;
1028 }
1029 
response(OBJ_METHOD_PARAMS)1030 FX_BOOL app::response(OBJ_METHOD_PARAMS)
1031 {
1032 	CFX_WideString swQuestion = L"";
1033 	CFX_WideString swLabel = L"";
1034 #ifndef FOXIT_CHROME_BUILD
1035 	CFX_WideString swTitle = L"Foxit";
1036 #else
1037 	CFX_WideString swTitle = L"PDF";
1038 #endif
1039 	CFX_WideString swDefault = L"";
1040 	CFX_WideString swResponse = L"";
1041 	bool bPassWord = false;
1042 
1043 	v8::Isolate* isolate = GetIsolate(cc);
1044 
1045 	int iLength = params.size();
1046 	if (iLength > 0 && params[0].GetType() == VT_object)
1047 	{
1048 
1049 		JSObject pObj = (JSObject )params[0];
1050 		v8::Handle<v8::Value> pValue = JS_GetObjectElement(isolate,pObj,L"cQuestion");
1051 			swQuestion = CJS_Value(isolate,pValue,GET_VALUE_TYPE(pValue)).operator CFX_WideString();
1052 
1053 		pValue = JS_GetObjectElement(isolate,pObj,L"cTitle");
1054 			swTitle = CJS_Value(isolate,pValue,GET_VALUE_TYPE(pValue)).operator CFX_WideString();
1055 
1056 		pValue = JS_GetObjectElement(isolate,pObj,L"cDefault");
1057 			swDefault = CJS_Value(isolate,pValue,GET_VALUE_TYPE(pValue)).operator CFX_WideString();
1058 
1059 		pValue = JS_GetObjectElement(isolate,pObj,L"cLabel");
1060 			swLabel = CJS_Value(isolate,pValue,GET_VALUE_TYPE(pValue)).operator CFX_WideString();
1061 
1062 		pValue = JS_GetObjectElement(isolate,pObj,L"bPassword");
1063 			bPassWord = (bool)CJS_Value(isolate,pValue,GET_VALUE_TYPE(pValue));
1064 	}
1065 	else
1066 	{
1067 		switch(iLength)
1068 		{
1069 		case 1:
1070 			swQuestion = params[0];
1071 			break;
1072 		case 2:
1073 			swQuestion = params[0];
1074 			swTitle = params[1];
1075 			break;
1076 		case 3:
1077 			swQuestion = params[0];
1078 			swTitle = params[1];
1079 			swDefault = params[2];
1080 			break;
1081 		case 4:
1082 			swQuestion = params[0];
1083 			swTitle = params[1];
1084 			swDefault = params[2];
1085 			bPassWord = params[3];
1086 			break;
1087 		case 5:
1088 			swQuestion = params[0];
1089 			swTitle = params[1];
1090 			swDefault = params[2];
1091 			bPassWord = params[3];
1092 			swLabel = params[4];
1093 			break;
1094 		default:
1095 			break;
1096 		}
1097 	}
1098 
1099 	CJS_Context* pContext = (CJS_Context *)cc;
1100  	ASSERT(pContext != NULL);
1101 
1102 	CPDFDoc_Environment* pApp = pContext->GetReaderApp();
1103  	ASSERT(pApp != NULL);
1104 	int nLength = 2048;
1105 	char* pBuff = new char[nLength];
1106 	nLength = pApp->JS_appResponse(swQuestion, swTitle, swDefault, swLabel, bPassWord, pBuff, nLength);
1107 	if(nLength<=0)
1108 	{
1109 		vRet.SetNull();
1110 		return FALSE;
1111 	}
1112 	else
1113 	{
1114 		nLength = nLength>2046?2046:nLength;
1115     pBuff[nLength] = 0;
1116     pBuff[nLength+1] = 0;
1117 		swResponse = CFX_WideString::FromUTF16LE((unsigned short*)pBuff, nLength);
1118 		vRet = swResponse;
1119 	}
1120 	delete[] pBuff;
1121 
1122 	return TRUE;
1123 }
1124 
media(OBJ_PROP_PARAMS)1125 FX_BOOL app::media(OBJ_PROP_PARAMS)
1126 {
1127 	return FALSE;
1128 }
1129 
execDialog(OBJ_METHOD_PARAMS)1130 FX_BOOL app::execDialog(OBJ_METHOD_PARAMS)
1131 {
1132 	return TRUE;
1133 }
1134 
1135