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/fsdk_define.h"
8 #include "../include/fsdk_mgr.h"
9 #include "../include/fsdk_actionhandler.h"
10 #include "../include/javascript/IJavaScript.h"
11
12 /* -------------------------- CBA_ActionHandler -------------------------- */
13
CPDFSDK_ActionHandler(CPDFDoc_Environment * pEvi)14 CPDFSDK_ActionHandler::CPDFSDK_ActionHandler(CPDFDoc_Environment* pEvi) :
15 m_pFormActionHandler(NULL),
16 m_pMediaActionHandler(NULL)
17 {
18 m_pFormActionHandler = new CPDFSDK_FormActionHandler;
19 }
20
~CPDFSDK_ActionHandler()21 CPDFSDK_ActionHandler::~CPDFSDK_ActionHandler()
22 {
23 if(m_pFormActionHandler)
24 {
25 delete m_pFormActionHandler;
26 m_pFormActionHandler = NULL;
27 }
28 }
29
SetFormActionHandler(CPDFSDK_FormActionHandler * pHandler)30 void CPDFSDK_ActionHandler::SetFormActionHandler(CPDFSDK_FormActionHandler* pHandler)
31 {
32 ASSERT(pHandler != NULL);
33 ASSERT(m_pFormActionHandler == NULL);
34 m_pFormActionHandler = pHandler;
35 }
36
SetMediaActionHandler(CPDFSDK_MediaActionHandler * pHandler)37 void CPDFSDK_ActionHandler::SetMediaActionHandler(CPDFSDK_MediaActionHandler* pHandler)
38 {
39 ASSERT(pHandler != NULL);
40 ASSERT(m_pMediaActionHandler == NULL);
41 m_pMediaActionHandler = pHandler;
42 }
43
Destroy()44 void CPDFSDK_ActionHandler::Destroy()
45 {
46 delete this;
47 }
48
49 //document open
DoAction_DocOpen(const CPDF_Action & action,CPDFSDK_Document * pDocument)50 FX_BOOL CPDFSDK_ActionHandler::DoAction_DocOpen(const CPDF_Action& action, CPDFSDK_Document* pDocument)
51 {
52 CFX_PtrList list;
53 return ExecuteDocumentOpenAction(action, pDocument, list);
54 }
55
56 //document open
DoAction_JavaScript(const CPDF_Action & JsAction,CFX_WideString csJSName,CPDFSDK_Document * pDocument)57 FX_BOOL CPDFSDK_ActionHandler::DoAction_JavaScript(const CPDF_Action& JsAction,CFX_WideString csJSName,
58 CPDFSDK_Document* pDocument)
59 {
60 if (JsAction.GetType() == CPDF_Action::JavaScript)
61 {
62 CFX_WideString swJS = JsAction.GetJavaScript();
63 if (!swJS.IsEmpty())
64 {
65 RunDocumentOpenJavaScript(pDocument, csJSName, swJS);
66 return TRUE;
67 }
68 }
69
70 return FALSE;
71 }
72
DoAction_FieldJavaScript(const CPDF_Action & JsAction,CPDF_AAction::AActionType type,CPDFSDK_Document * pDocument,CPDF_FormField * pFormField,PDFSDK_FieldAction & data)73 FX_BOOL CPDFSDK_ActionHandler::DoAction_FieldJavaScript(const CPDF_Action& JsAction, CPDF_AAction::AActionType type,
74 CPDFSDK_Document* pDocument, CPDF_FormField* pFormField,
75 PDFSDK_FieldAction& data)
76 {
77 CPDFDoc_Environment* pEnv = pDocument->GetEnv();
78 ASSERT(pEnv);
79 if (pEnv->IsJSInitiated() && JsAction.GetType() == CPDF_Action::JavaScript)
80 {
81 CFX_WideString swJS = JsAction.GetJavaScript();
82 if (!swJS.IsEmpty())
83 {
84 RunFieldJavaScript(pDocument, pFormField, type, data, swJS);
85 return TRUE;
86 }
87 }
88 return FALSE;
89 }
90
DoAction_Page(const CPDF_Action & action,enum CPDF_AAction::AActionType eType,CPDFSDK_Document * pDocument)91 FX_BOOL CPDFSDK_ActionHandler::DoAction_Page(const CPDF_Action& action, enum CPDF_AAction::AActionType eType,
92 CPDFSDK_Document* pDocument)
93 {
94 CFX_PtrList list;
95 return ExecuteDocumentPageAction(action, eType, pDocument, list);
96 }
97
DoAction_Document(const CPDF_Action & action,enum CPDF_AAction::AActionType eType,CPDFSDK_Document * pDocument)98 FX_BOOL CPDFSDK_ActionHandler::DoAction_Document(const CPDF_Action& action, enum CPDF_AAction::AActionType eType,
99 CPDFSDK_Document* pDocument)
100 {
101 CFX_PtrList list;
102 return ExecuteDocumentPageAction(action, eType, pDocument, list);
103 }
104
DoAction_BookMark(CPDF_Bookmark * pBookMark,const CPDF_Action & action,CPDF_AAction::AActionType type,CPDFSDK_Document * pDocument)105 FX_BOOL CPDFSDK_ActionHandler::DoAction_BookMark(CPDF_Bookmark *pBookMark, const CPDF_Action& action, CPDF_AAction::AActionType type,
106 CPDFSDK_Document* pDocument)
107 {
108 CFX_PtrList list;
109 return this->ExecuteBookMark(action, pDocument, pBookMark, list);
110 }
111
DoAction_Screen(const CPDF_Action & action,CPDF_AAction::AActionType type,CPDFSDK_Document * pDocument,CPDFSDK_Annot * pScreen)112 FX_BOOL CPDFSDK_ActionHandler::DoAction_Screen(const CPDF_Action& action, CPDF_AAction::AActionType type,
113 CPDFSDK_Document* pDocument, CPDFSDK_Annot* pScreen)
114 {
115 CFX_PtrList list;
116 return this->ExecuteScreenAction(action, type, pDocument, pScreen, list);
117 }
118
DoAction_Link(const CPDF_Action & action,CPDFSDK_Document * pDocument)119 FX_BOOL CPDFSDK_ActionHandler::DoAction_Link(const CPDF_Action& action,
120 CPDFSDK_Document* pDocument)
121 {
122 CFX_PtrList list;
123 return ExecuteLinkAction(action, pDocument, list);
124 }
125
DoAction_Field(const CPDF_Action & action,CPDF_AAction::AActionType type,CPDFSDK_Document * pDocument,CPDF_FormField * pFormField,PDFSDK_FieldAction & data)126 FX_BOOL CPDFSDK_ActionHandler::DoAction_Field(const CPDF_Action& action, CPDF_AAction::AActionType type,
127 CPDFSDK_Document* pDocument,
128 CPDF_FormField* pFormField, PDFSDK_FieldAction& data)
129 {
130 CFX_PtrList list;
131 return ExecuteFieldAction(action, type, pDocument, pFormField, data, list);
132 }
133
ExecuteDocumentOpenAction(const CPDF_Action & action,CPDFSDK_Document * pDocument,CFX_PtrList & list)134 FX_BOOL CPDFSDK_ActionHandler::ExecuteDocumentOpenAction(const CPDF_Action& action, CPDFSDK_Document* pDocument,
135 CFX_PtrList& list)
136 {
137 CPDF_Dictionary* pDict = action.GetDict();
138 if (list.Find(pDict))
139 return FALSE;
140
141 list.AddTail(pDict);
142
143 CPDFDoc_Environment* pEnv = pDocument->GetEnv();
144 ASSERT(pEnv);
145 if (action.GetType() == CPDF_Action::JavaScript)
146 {
147 if(pEnv->IsJSInitiated())
148 {
149 CFX_WideString swJS = action.GetJavaScript();
150 if (!swJS.IsEmpty())
151 {
152 RunDocumentOpenJavaScript(pDocument, L"", swJS);
153 }
154 }
155 }
156 else
157 {
158 DoAction_NoJs(action, pDocument);
159 }
160
161 for (FX_INT32 i=0,sz=action.GetSubActionsCount(); i<sz; i++)
162 {
163 CPDF_Action subaction = action.GetSubAction(i);
164 if (!ExecuteDocumentOpenAction(subaction, pDocument, list)) return FALSE;
165 }
166
167 return TRUE;
168 }
169
ExecuteLinkAction(const CPDF_Action & action,CPDFSDK_Document * pDocument,CFX_PtrList & list)170 FX_BOOL CPDFSDK_ActionHandler::ExecuteLinkAction(const CPDF_Action& action, CPDFSDK_Document* pDocument,
171 CFX_PtrList& list)
172 {
173 ASSERT(pDocument != NULL);
174
175 CPDF_Dictionary* pDict = action.GetDict();
176 if (list.Find(pDict))
177 return FALSE;
178
179 list.AddTail(pDict);
180
181 CPDFDoc_Environment* pEnv = pDocument->GetEnv();
182 ASSERT(pEnv);
183 if (action.GetType() == CPDF_Action::JavaScript)
184 {
185 if(pEnv->IsJSInitiated())
186 {
187 CFX_WideString swJS = action.GetJavaScript();
188 if (!swJS.IsEmpty())
189 {
190 IFXJS_Runtime* pRuntime = pDocument->GetJsRuntime(); //????
191 ASSERT(pRuntime != NULL);
192
193 pRuntime->SetReaderDocument(pDocument);
194
195 IFXJS_Context* pContext = pRuntime->NewContext();
196 ASSERT(pContext != NULL);
197
198 pContext->OnLink_MouseUp(pDocument);
199
200 CFX_WideString csInfo;
201 FX_BOOL bRet = pContext->RunScript(swJS, csInfo);
202 if (!bRet)
203 {
204 // FIXME: return error.
205 }
206
207 pRuntime->ReleaseContext(pContext);
208 }
209 }
210 }
211 else
212 {
213 DoAction_NoJs(action, pDocument);
214 }
215
216 for (FX_INT32 i=0,sz=action.GetSubActionsCount(); i<sz; i++)
217 {
218 CPDF_Action subaction = action.GetSubAction(i);
219 if (!ExecuteLinkAction(subaction, pDocument, list)) return FALSE;
220 }
221
222 return TRUE;
223 }
224
ExecuteDocumentPageAction(const CPDF_Action & action,CPDF_AAction::AActionType type,CPDFSDK_Document * pDocument,CFX_PtrList & list)225 FX_BOOL CPDFSDK_ActionHandler::ExecuteDocumentPageAction(const CPDF_Action& action, CPDF_AAction::AActionType type,
226 CPDFSDK_Document* pDocument, CFX_PtrList& list)
227 {
228 ASSERT(pDocument != NULL);
229
230 CPDF_Dictionary* pDict = action.GetDict();
231 if (list.Find(pDict))
232 return FALSE;
233
234 list.AddTail(pDict);
235
236 CPDFDoc_Environment* pEnv = pDocument->GetEnv();
237 ASSERT(pEnv);
238 if (action.GetType() == CPDF_Action::JavaScript)
239 {
240 if(pEnv->IsJSInitiated())
241 {
242 CFX_WideString swJS = action.GetJavaScript();
243 if (!swJS.IsEmpty())
244 {
245 RunDocumentPageJavaScript(pDocument, type, swJS);
246 }
247 }
248 }
249 else
250 {
251 DoAction_NoJs(action, pDocument);
252 }
253
254 if (!IsValidDocView(pDocument))
255 return FALSE;
256
257 for (FX_INT32 i=0,sz=action.GetSubActionsCount(); i<sz; i++)
258 {
259 CPDF_Action subaction = action.GetSubAction(i);
260 if (!ExecuteDocumentPageAction(subaction, type, pDocument, list)) return FALSE;
261 }
262
263 return TRUE;
264 }
265
IsValidField(CPDFSDK_Document * pDocument,CPDF_Dictionary * pFieldDict)266 FX_BOOL CPDFSDK_ActionHandler::IsValidField(CPDFSDK_Document* pDocument, CPDF_Dictionary* pFieldDict)
267 {
268 ASSERT(pDocument != NULL);
269 ASSERT(pFieldDict != NULL);
270
271 CPDFSDK_InterForm* pInterForm = pDocument->GetInterForm();
272 ASSERT(pInterForm != NULL);
273
274 CPDF_InterForm* pPDFInterForm = pInterForm->GetInterForm();
275 ASSERT(pPDFInterForm != NULL);
276
277 return pPDFInterForm->GetFieldByDict(pFieldDict) != NULL;
278 }
279
ExecuteFieldAction(const CPDF_Action & action,CPDF_AAction::AActionType type,CPDFSDK_Document * pDocument,CPDF_FormField * pFormField,PDFSDK_FieldAction & data,CFX_PtrList & list)280 FX_BOOL CPDFSDK_ActionHandler::ExecuteFieldAction(const CPDF_Action& action, CPDF_AAction::AActionType type,
281 CPDFSDK_Document* pDocument, CPDF_FormField* pFormField,
282 PDFSDK_FieldAction& data, CFX_PtrList& list)
283 {
284 ASSERT(pDocument != NULL);
285
286 CPDF_Dictionary* pDict = action.GetDict();
287 if (list.Find(pDict))
288 return FALSE;
289
290 list.AddTail(pDict);
291
292 CPDFDoc_Environment* pEnv = pDocument->GetEnv();
293 ASSERT(pEnv);
294 if (action.GetType() == CPDF_Action::JavaScript)
295 {
296 if(pEnv->IsJSInitiated())
297 {
298 CFX_WideString swJS = action.GetJavaScript();
299 if (!swJS.IsEmpty())
300 {
301 RunFieldJavaScript(pDocument, pFormField, type, data, swJS);
302 if (!IsValidField(pDocument, pFormField->GetFieldDict()))
303 return FALSE;
304 }
305 }
306 }
307 else
308 {
309 DoAction_NoJs(action, pDocument);
310 }
311
312 for (FX_INT32 i=0,sz=action.GetSubActionsCount(); i<sz; i++)
313 {
314 CPDF_Action subaction = action.GetSubAction(i);
315 if (!ExecuteFieldAction(subaction, type, pDocument, pFormField, data, list)) return FALSE;
316 }
317
318 return TRUE;
319 }
320
ExecuteScreenAction(const CPDF_Action & action,CPDF_AAction::AActionType type,CPDFSDK_Document * pDocument,CPDFSDK_Annot * pScreen,CFX_PtrList & list)321 FX_BOOL CPDFSDK_ActionHandler::ExecuteScreenAction(const CPDF_Action& action, CPDF_AAction::AActionType type,
322 CPDFSDK_Document* pDocument, CPDFSDK_Annot* pScreen, CFX_PtrList& list)
323 {
324 ASSERT(pDocument != NULL);
325
326 CPDF_Dictionary* pDict = action.GetDict();
327 if (list.Find(pDict))
328 return FALSE;
329
330 list.AddTail(pDict);
331
332 CPDFDoc_Environment* pEnv = pDocument->GetEnv();
333 ASSERT(pEnv);
334 if (action.GetType() == CPDF_Action::JavaScript)
335 {
336 if(pEnv->IsJSInitiated())
337 {
338 CFX_WideString swJS = action.GetJavaScript();
339 if (!swJS.IsEmpty())
340 {
341 IFXJS_Runtime* pRuntime = pDocument->GetJsRuntime();
342 ASSERT(pRuntime != NULL);
343
344 pRuntime->SetReaderDocument(pDocument);
345
346 IFXJS_Context* pContext = pRuntime->NewContext();
347 ASSERT(pContext != NULL);
348
349 // switch (type)
350 // {
351 // case CPDF_AAction::CursorEnter:
352 // pContext->OnScreen_MouseEnter(IsCTRLpressed(), IsSHIFTpressed(), pScreen);
353 // break;
354 // case CPDF_AAction::CursorExit:
355 // pContext->OnScreen_MouseExit(IsCTRLpressed(), IsSHIFTpressed(), pScreen);
356 // break;
357 // case CPDF_AAction::ButtonDown:
358 // pContext->OnScreen_MouseDown(IsCTRLpressed(), IsSHIFTpressed(), pScreen);
359 // break;
360 // case CPDF_AAction::ButtonUp:
361 // pContext->OnScreen_MouseUp(IsCTRLpressed(), IsSHIFTpressed(), pScreen);
362 // break;
363 // case CPDF_AAction::GetFocus:
364 // pContext->OnScreen_Focus(IsCTRLpressed(), IsSHIFTpressed(), pScreen);
365 // break;
366 // case CPDF_AAction::LoseFocus:
367 // pContext->OnScreen_Blur(IsCTRLpressed(), IsSHIFTpressed(), pScreen);
368 // break;
369 // case CPDF_AAction::PageOpen:
370 // pContext->OnScreen_Open(IsCTRLpressed(), IsSHIFTpressed(), pScreen);
371 // break;
372 // case CPDF_AAction::PageClose:
373 // pContext->OnScreen_Close(IsCTRLpressed(), IsSHIFTpressed(), pScreen);
374 // break;
375 // case CPDF_AAction::PageVisible:
376 // pContext->OnScreen_InView(IsCTRLpressed(), IsSHIFTpressed(), pScreen);
377 // break;
378 // case CPDF_AAction::PageInvisible:
379 // pContext->OnScreen_OutView(IsCTRLpressed(), IsSHIFTpressed(), pScreen);
380 // break;
381 // default:
382 // ASSERT(FALSE);
383 // break;
384 // }
385
386 CFX_WideString csInfo;
387 FX_BOOL bRet = pContext->RunScript(swJS, csInfo);
388 if (!bRet)
389 {
390 //CBCL_FormNotify::MsgBoxJSError(pPageView->GetPageViewWnd(), csInfo);
391 }
392
393 pRuntime->ReleaseContext(pContext);
394 }
395 }
396 }
397 else
398 {
399 DoAction_NoJs(action, pDocument);
400 }
401
402 for (FX_INT32 i=0,sz=action.GetSubActionsCount(); i<sz; i++)
403 {
404 CPDF_Action subaction = action.GetSubAction(i);
405 if (!ExecuteScreenAction(subaction, type, pDocument, pScreen, list)) return FALSE;
406 }
407
408 return TRUE;
409 }
410
ExecuteBookMark(const CPDF_Action & action,CPDFSDK_Document * pDocument,CPDF_Bookmark * pBookmark,CFX_PtrList & list)411 FX_BOOL CPDFSDK_ActionHandler::ExecuteBookMark(const CPDF_Action& action, CPDFSDK_Document* pDocument,
412 CPDF_Bookmark* pBookmark, CFX_PtrList& list)
413 {
414 ASSERT(pDocument != NULL);
415
416 CPDF_Dictionary* pDict = action.GetDict();
417 if (list.Find(pDict))
418 return FALSE;
419
420 list.AddTail(pDict);
421
422 CPDFDoc_Environment* pEnv = pDocument->GetEnv();
423 ASSERT(pEnv);
424 if (action.GetType() == CPDF_Action::JavaScript)
425 {
426 if(pEnv->IsJSInitiated())
427 {
428 CFX_WideString swJS = action.GetJavaScript();
429 if (!swJS.IsEmpty())
430 {
431 IFXJS_Runtime* pRuntime = pDocument->GetJsRuntime();
432 ASSERT(pRuntime != NULL);
433
434 pRuntime->SetReaderDocument(pDocument);
435
436 IFXJS_Context* pContext = pRuntime->NewContext();
437 ASSERT(pContext != NULL);
438
439 pContext->OnBookmark_MouseUp(pBookmark);
440
441 CFX_WideString csInfo;
442 FX_BOOL bRet = pContext->RunScript(swJS, csInfo);
443 if (!bRet)
444 {
445 //CBCL_FormNotify::MsgBoxJSError(pPageView->GetPageViewWnd(), csInfo);
446 }
447
448 pRuntime->ReleaseContext(pContext);
449 }
450 }
451 }
452 else
453 {
454 DoAction_NoJs(action, pDocument);
455 }
456
457 for (FX_INT32 i=0,sz=action.GetSubActionsCount(); i<sz; i++)
458 {
459 CPDF_Action subaction = action.GetSubAction(i);
460 if (!ExecuteBookMark(subaction, pDocument, pBookmark, list)) return FALSE;
461 }
462
463 return TRUE;
464 }
465
DoAction_NoJs(const CPDF_Action & action,CPDFSDK_Document * pDocument)466 void CPDFSDK_ActionHandler::DoAction_NoJs(const CPDF_Action& action, CPDFSDK_Document* pDocument)
467 {
468 ASSERT(pDocument != NULL);
469
470 switch (action.GetType())
471 {
472 case CPDF_Action::GoTo:
473 DoAction_GoTo(pDocument, action);
474 break;
475 case CPDF_Action::GoToR:
476 DoAction_GoToR(pDocument, action);
477 break;
478 case CPDF_Action::GoToE:
479 break;
480 case CPDF_Action::Launch:
481 DoAction_Launch(pDocument, action);
482 break;
483 case CPDF_Action::Thread:
484 break;
485 case CPDF_Action::URI:
486 DoAction_URI(pDocument, action);
487 break;
488 case CPDF_Action::Sound:
489 if (m_pMediaActionHandler)
490 {
491 m_pMediaActionHandler->DoAction_Sound(action, pDocument);
492 }
493 break;
494 case CPDF_Action::Movie:
495 if (m_pMediaActionHandler)
496 {
497 m_pMediaActionHandler->DoAction_Movie(action, pDocument);
498 }
499 break;
500 case CPDF_Action::Hide:
501 if (m_pFormActionHandler)
502 {
503 m_pFormActionHandler->DoAction_Hide(action, pDocument);
504 }
505 break;
506 case CPDF_Action::Named:
507 DoAction_Named(pDocument, action);
508 break;
509 case CPDF_Action::SubmitForm:
510 if (m_pFormActionHandler)
511 {
512 m_pFormActionHandler->DoAction_SubmitForm(action, pDocument);
513 }
514 break;
515 case CPDF_Action::ResetForm:
516 if (m_pFormActionHandler)
517 {
518 m_pFormActionHandler->DoAction_ResetForm(action, pDocument);
519 }
520 break;
521 case CPDF_Action::ImportData:
522 if (m_pFormActionHandler)
523 {
524 m_pFormActionHandler->DoAction_ImportData(action, pDocument);
525 }
526 break;
527 case CPDF_Action::JavaScript:
528 ASSERT(FALSE);
529 break;
530 case CPDF_Action::SetOCGState:
531 DoAction_SetOCGState(pDocument, action);
532 break;
533 case CPDF_Action::Rendition:
534 if (m_pMediaActionHandler)
535 {
536 m_pMediaActionHandler->DoAction_Rendition(action, pDocument);
537 }
538 break;
539 case CPDF_Action::Trans:
540 break;
541 case CPDF_Action::GoTo3DView:
542 break;
543 default:
544 break;
545 }
546 }
547
IsValidDocView(CPDFSDK_Document * pDocument)548 FX_BOOL CPDFSDK_ActionHandler::IsValidDocView(CPDFSDK_Document* pDocument)
549 {
550 ASSERT(pDocument != NULL);
551 return TRUE;
552 }
553
DoAction_GoTo(CPDFSDK_Document * pDocument,const CPDF_Action & action)554 void CPDFSDK_ActionHandler::DoAction_GoTo(CPDFSDK_Document* pDocument,
555 const CPDF_Action& action)
556 {
557 ASSERT(action);
558
559 CPDF_Document* pPDFDocument = pDocument->GetDocument();
560 ASSERT(pPDFDocument != NULL);
561 CPDFDoc_Environment* pApp = pDocument->GetEnv();
562 ASSERT(pApp != NULL);
563
564 CPDF_Dest MyDest = action.GetDest(pPDFDocument);
565 int nPageIndex = MyDest.GetPageIndex(pPDFDocument);
566 int nFitType = MyDest.GetZoomMode();
567 const CPDF_Array * pMyArray = (CPDF_Array*)MyDest.GetObject();
568 float* pPosAry = NULL;
569 int sizeOfAry = 0;
570 if (pMyArray != NULL)
571 {
572 pPosAry = new float[pMyArray->GetCount()];
573 int j = 0;
574 for (int i = 2; i < (int)pMyArray->GetCount(); i++)
575 {
576 pPosAry[j++] = pMyArray->GetFloat(i);
577 }
578 sizeOfAry = j;
579 }
580 pApp->FFI_DoGoToAction(nPageIndex, nFitType, pPosAry, sizeOfAry);
581 if(pPosAry)
582 delete[] pPosAry;
583 }
584
DoAction_GoToR(CPDFSDK_Document * pDocument,const CPDF_Action & action)585 void CPDFSDK_ActionHandler::DoAction_GoToR(CPDFSDK_Document* pDocument, const CPDF_Action& action)
586 {
587
588 }
589
DoAction_Launch(CPDFSDK_Document * pDocument,const CPDF_Action & action)590 void CPDFSDK_ActionHandler::DoAction_Launch(CPDFSDK_Document* pDocument, const CPDF_Action& action)
591 {
592
593 }
594
DoAction_URI(CPDFSDK_Document * pDocument,const CPDF_Action & action)595 void CPDFSDK_ActionHandler::DoAction_URI(CPDFSDK_Document* pDocument, const CPDF_Action& action)
596 {
597 ASSERT(action);
598
599 CPDFDoc_Environment* pApp = pDocument->GetEnv();
600 ASSERT(pApp != NULL);
601
602 CFX_ByteString sURI = action.GetURI(pDocument->GetDocument());
603 pApp->FFI_DoURIAction(FX_LPCSTR(sURI));
604 }
605
DoAction_Named(CPDFSDK_Document * pDocument,const CPDF_Action & action)606 void CPDFSDK_ActionHandler::DoAction_Named(CPDFSDK_Document* pDocument, const CPDF_Action& action)
607 {
608 ASSERT(action);
609
610 CFX_ByteString csName = action.GetNamedAction();
611 pDocument->GetEnv()->FFI_ExecuteNamedAction(csName);
612 }
613
614
DoAction_SetOCGState(CPDFSDK_Document * pDocument,const CPDF_Action & action)615 void CPDFSDK_ActionHandler::DoAction_SetOCGState(CPDFSDK_Document* pDocument, const CPDF_Action& action)
616 {
617 }
618
RunFieldJavaScript(CPDFSDK_Document * pDocument,CPDF_FormField * pFormField,CPDF_AAction::AActionType type,PDFSDK_FieldAction & data,const CFX_WideString & script)619 void CPDFSDK_ActionHandler::RunFieldJavaScript(CPDFSDK_Document* pDocument, CPDF_FormField* pFormField, CPDF_AAction::AActionType type,
620 PDFSDK_FieldAction& data, const CFX_WideString& script)
621 {
622 ASSERT(type != CPDF_AAction::Calculate);
623 ASSERT(type != CPDF_AAction::Format);
624
625 ASSERT(pDocument != NULL);
626
627 IFXJS_Runtime* pRuntime = pDocument->GetJsRuntime();
628 ASSERT(pRuntime != NULL);
629
630 pRuntime->SetReaderDocument(pDocument);
631
632 IFXJS_Context* pContext = pRuntime->NewContext();
633 ASSERT(pContext != NULL);
634
635 switch (type)
636 {
637 case CPDF_AAction::CursorEnter:
638 pContext->OnField_MouseEnter(data.bModifier, data.bShift, pFormField);
639 break;
640 case CPDF_AAction::CursorExit:
641 pContext->OnField_MouseExit(data.bModifier, data.bShift, pFormField);
642 break;
643 case CPDF_AAction::ButtonDown:
644 pContext->OnField_MouseDown(data.bModifier, data.bShift, pFormField);
645 break;
646 case CPDF_AAction::ButtonUp:
647 pContext->OnField_MouseUp(data.bModifier, data.bShift, pFormField);
648 break;
649 case CPDF_AAction::GetFocus:
650 pContext->OnField_Focus(data.bModifier, data.bShift, pFormField, data.sValue);
651 break;
652 case CPDF_AAction::LoseFocus:
653 pContext->OnField_Blur(data.bModifier, data.bShift, pFormField, data.sValue);
654 break;
655 case CPDF_AAction::KeyStroke:
656 pContext->OnField_Keystroke(data.nCommitKey, data.sChange, data.sChangeEx, data.bKeyDown,
657 data.bModifier, data.nSelEnd, data.nSelStart, data.bShift, pFormField, data.sValue,
658 data.bWillCommit, data.bFieldFull, data.bRC);
659 break;
660 case CPDF_AAction::Validate:
661 pContext->OnField_Validate(data.sChange, data.sChangeEx, data.bKeyDown, data.bModifier,
662 data.bShift, pFormField, data.sValue, data.bRC);
663 break;
664 default:
665 ASSERT(FALSE);
666 break;
667 }
668
669 CFX_WideString csInfo;
670 FX_BOOL bRet = pContext->RunScript(script, csInfo);
671 if (!bRet)
672 {
673 //CBCL_FormNotify::MsgBoxJSError(pPageView->GetPageViewWnd(), csInfo);
674 }
675
676 pRuntime->ReleaseContext(pContext);
677 }
678
RunDocumentOpenJavaScript(CPDFSDK_Document * pDocument,const CFX_WideString & sScriptName,const CFX_WideString & script)679 void CPDFSDK_ActionHandler::RunDocumentOpenJavaScript(CPDFSDK_Document* pDocument, const CFX_WideString& sScriptName, const CFX_WideString& script)
680 {
681 ASSERT(pDocument != NULL);
682
683 IFXJS_Runtime* pRuntime = pDocument->GetJsRuntime();
684 ASSERT(pRuntime != NULL);
685
686 pRuntime->SetReaderDocument(pDocument);
687
688 IFXJS_Context* pContext = pRuntime->NewContext();
689 ASSERT(pContext != NULL);
690
691 pContext->OnDoc_Open(pDocument, sScriptName);
692
693 CFX_WideString csInfo;
694 FX_BOOL bRet = pContext->RunScript(script, csInfo);
695 if (!bRet)
696 {
697 //CBCL_FormNotify::MsgBoxJSError(pPageView->GetPageViewWnd(), csInfo);
698 }
699
700 pRuntime->ReleaseContext(pContext);
701 }
702
RunDocumentPageJavaScript(CPDFSDK_Document * pDocument,CPDF_AAction::AActionType type,const CFX_WideString & script)703 void CPDFSDK_ActionHandler::RunDocumentPageJavaScript(CPDFSDK_Document* pDocument, CPDF_AAction::AActionType type, const CFX_WideString& script)
704 {
705 ASSERT(pDocument != NULL);
706
707 IFXJS_Runtime* pRuntime = pDocument->GetJsRuntime();
708 ASSERT(pRuntime != NULL);
709
710 pRuntime->SetReaderDocument(pDocument);
711
712 IFXJS_Context* pContext = pRuntime->NewContext();
713 ASSERT(pContext != NULL);
714
715 switch (type)
716 {
717 case CPDF_AAction::OpenPage:
718 pContext->OnPage_Open(pDocument);
719 break;
720 case CPDF_AAction::ClosePage:
721 pContext->OnPage_Close(pDocument);
722 break;
723 case CPDF_AAction::CloseDocument:
724 pContext->OnDoc_WillClose(pDocument);
725 break;
726 case CPDF_AAction::SaveDocument:
727 pContext->OnDoc_WillSave(pDocument);
728 break;
729 case CPDF_AAction::DocumentSaved:
730 pContext->OnDoc_DidSave(pDocument);
731 break;
732 case CPDF_AAction::PrintDocument:
733 pContext->OnDoc_WillPrint(pDocument);
734 break;
735 case CPDF_AAction::DocumentPrinted:
736 pContext->OnDoc_DidPrint(pDocument);
737 break;
738 case CPDF_AAction::PageVisible:
739 pContext->OnPage_InView(pDocument);
740 break;
741 case CPDF_AAction::PageInvisible:
742 pContext->OnPage_OutView(pDocument);
743 break;
744 default:
745 ASSERT(FALSE);
746 break;
747 }
748
749 CFX_WideString csInfo;
750 FX_BOOL bRet = pContext->RunScript(script, csInfo);
751 if (!bRet)
752 {
753 //CBCL_FormNotify::MsgBoxJSError(pPageView->GetPageViewWnd(), csInfo);
754 }
755
756 pRuntime->ReleaseContext(pContext);
757 }
758
759
DoAction_Hide(const CPDF_Action & action,CPDFSDK_Document * pDocument)760 FX_BOOL CPDFSDK_FormActionHandler::DoAction_Hide(const CPDF_Action& action, CPDFSDK_Document* pDocument)
761 {
762 ASSERT(pDocument != NULL);
763
764 CPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)pDocument->GetInterForm();
765 ASSERT(pInterForm != NULL);
766
767 if (pInterForm->DoAction_Hide(action))
768 {
769 pDocument->SetChangeMark();
770 return TRUE;
771 }
772
773 return FALSE;
774 }
775
DoAction_SubmitForm(const CPDF_Action & action,CPDFSDK_Document * pDocument)776 FX_BOOL CPDFSDK_FormActionHandler::DoAction_SubmitForm(const CPDF_Action& action, CPDFSDK_Document* pDocument)
777 {
778 ASSERT(pDocument != NULL);
779
780 CPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)pDocument->GetInterForm();
781 ASSERT(pInterForm != NULL);
782
783 return pInterForm->DoAction_SubmitForm(action);
784 }
785
DoAction_ResetForm(const CPDF_Action & action,CPDFSDK_Document * pDocument)786 FX_BOOL CPDFSDK_FormActionHandler::DoAction_ResetForm(const CPDF_Action& action, CPDFSDK_Document* pDocument)
787 {
788 ASSERT(pDocument != NULL);
789
790 CPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)pDocument->GetInterForm();
791 ASSERT(pInterForm != NULL);
792
793 if (pInterForm->DoAction_ResetForm(action))
794 {
795 return TRUE;
796 }
797
798 return FALSE;
799 }
800
DoAction_ImportData(const CPDF_Action & action,CPDFSDK_Document * pDocument)801 FX_BOOL CPDFSDK_FormActionHandler::DoAction_ImportData(const CPDF_Action& action, CPDFSDK_Document* pDocument)
802 {
803 ASSERT(pDocument != NULL);
804
805 CPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)pDocument->GetInterForm();
806 ASSERT(pInterForm != NULL);
807
808 if (pInterForm->DoAction_ImportData(action))
809 {
810 pDocument->SetChangeMark();
811 return TRUE;
812 }
813
814 return FALSE;
815 }
816
DoAction_Rendition(const CPDF_Action & action,CPDFSDK_Document * pDocument)817 FX_BOOL CPDFSDK_MediaActionHandler::DoAction_Rendition(const CPDF_Action& action, CPDFSDK_Document* pDocument)
818 {
819 return FALSE;
820 }
821
DoAction_Sound(const CPDF_Action & action,CPDFSDK_Document * pDocument)822 FX_BOOL CPDFSDK_MediaActionHandler::DoAction_Sound(const CPDF_Action& action, CPDFSDK_Document* pDocument)
823 {
824 return FALSE;
825 }
826
DoAction_Movie(const CPDF_Action & action,CPDFSDK_Document * pDocument)827 FX_BOOL CPDFSDK_MediaActionHandler::DoAction_Movie(const CPDF_Action& action, CPDFSDK_Document* pDocument)
828 {
829 return FALSE;
830 }
831