blob: 451381b289854de288525cad600bf08fa5ec0dfa [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.
Tom Sepez7b5bc262015-03-05 16:44:22 -08004
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07005// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6
Bo Xufdc00a72014-10-28 23:03:33 -07007#include "../include/fpdfxfa/fpdfxfa_doc.h"
Lei Zhangbde53d22015-11-12 22:21:30 -08008#include "fpdfsdk/include/fsdk_actionhandler.h"
9#include "fpdfsdk/include/fsdk_define.h"
10#include "fpdfsdk/include/fsdk_mgr.h"
11#include "fpdfsdk/include/javascript/IJavaScript.h"
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070012
Tom Sepez3b5f1242015-09-01 14:06:55 -070013CPDFSDK_ActionHandler::CPDFSDK_ActionHandler()
14 : m_pFormActionHandler(new CPDFSDK_FormActionHandler) {
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070015}
16
Nico Weber9d8ec5a2015-08-04 13:00:21 -070017FX_BOOL CPDFSDK_ActionHandler::DoAction_DocOpen(const CPDF_Action& action,
18 CPDFSDK_Document* pDocument) {
19 CFX_PtrList list;
20 return ExecuteDocumentOpenAction(action, pDocument, list);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070021}
22
Nico Weber9d8ec5a2015-08-04 13:00:21 -070023FX_BOOL CPDFSDK_ActionHandler::DoAction_JavaScript(
24 const CPDF_Action& JsAction,
25 CFX_WideString csJSName,
26 CPDFSDK_Document* pDocument) {
27 if (JsAction.GetType() == CPDF_Action::JavaScript) {
28 CFX_WideString swJS = JsAction.GetJavaScript();
29 if (!swJS.IsEmpty()) {
30 RunDocumentOpenJavaScript(pDocument, csJSName, swJS);
31 return TRUE;
32 }
33 }
34
35 return FALSE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070036}
37
Nico Weber9d8ec5a2015-08-04 13:00:21 -070038FX_BOOL CPDFSDK_ActionHandler::DoAction_FieldJavaScript(
39 const CPDF_Action& JsAction,
40 CPDF_AAction::AActionType type,
41 CPDFSDK_Document* pDocument,
42 CPDF_FormField* pFormField,
43 PDFSDK_FieldAction& data) {
44 CPDFDoc_Environment* pEnv = pDocument->GetEnv();
45 ASSERT(pEnv);
46 if (pEnv->IsJSInitiated() && JsAction.GetType() == CPDF_Action::JavaScript) {
47 CFX_WideString swJS = JsAction.GetJavaScript();
48 if (!swJS.IsEmpty()) {
49 RunFieldJavaScript(pDocument, pFormField, type, data, swJS);
50 return TRUE;
51 }
52 }
53 return FALSE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070054}
55
Nico Weber9d8ec5a2015-08-04 13:00:21 -070056FX_BOOL CPDFSDK_ActionHandler::DoAction_Page(
57 const CPDF_Action& action,
58 enum CPDF_AAction::AActionType eType,
59 CPDFSDK_Document* pDocument) {
60 CFX_PtrList list;
61 return ExecuteDocumentPageAction(action, eType, pDocument, list);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070062}
63
Nico Weber9d8ec5a2015-08-04 13:00:21 -070064FX_BOOL CPDFSDK_ActionHandler::DoAction_Document(
65 const CPDF_Action& action,
66 enum CPDF_AAction::AActionType eType,
67 CPDFSDK_Document* pDocument) {
68 CFX_PtrList list;
69 return ExecuteDocumentPageAction(action, eType, pDocument, list);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070070}
71
Nico Weber9d8ec5a2015-08-04 13:00:21 -070072FX_BOOL CPDFSDK_ActionHandler::DoAction_BookMark(CPDF_Bookmark* pBookMark,
73 const CPDF_Action& action,
74 CPDF_AAction::AActionType type,
75 CPDFSDK_Document* pDocument) {
76 CFX_PtrList list;
77 return ExecuteBookMark(action, pDocument, pBookMark, list);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070078}
79
Nico Weber9d8ec5a2015-08-04 13:00:21 -070080FX_BOOL CPDFSDK_ActionHandler::DoAction_Screen(const CPDF_Action& action,
81 CPDF_AAction::AActionType type,
82 CPDFSDK_Document* pDocument,
83 CPDFSDK_Annot* pScreen) {
84 CFX_PtrList list;
85 return ExecuteScreenAction(action, type, pDocument, pScreen, list);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070086}
87
Nico Weber9d8ec5a2015-08-04 13:00:21 -070088FX_BOOL CPDFSDK_ActionHandler::DoAction_Link(const CPDF_Action& action,
89 CPDFSDK_Document* pDocument) {
90 CFX_PtrList list;
91 return ExecuteLinkAction(action, pDocument, list);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070092}
93
Nico Weber9d8ec5a2015-08-04 13:00:21 -070094FX_BOOL CPDFSDK_ActionHandler::DoAction_Field(const CPDF_Action& action,
95 CPDF_AAction::AActionType type,
96 CPDFSDK_Document* pDocument,
97 CPDF_FormField* pFormField,
98 PDFSDK_FieldAction& data) {
99 CFX_PtrList list;
100 return ExecuteFieldAction(action, type, pDocument, pFormField, data, list);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700101}
102
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700103FX_BOOL CPDFSDK_ActionHandler::ExecuteDocumentOpenAction(
104 const CPDF_Action& action,
105 CPDFSDK_Document* pDocument,
106 CFX_PtrList& list) {
107 CPDF_Dictionary* pDict = action.GetDict();
108 if (list.Find(pDict))
109 return FALSE;
110
111 list.AddTail(pDict);
112
113 CPDFDoc_Environment* pEnv = pDocument->GetEnv();
114 ASSERT(pEnv);
115 if (action.GetType() == CPDF_Action::JavaScript) {
116 if (pEnv->IsJSInitiated()) {
117 CFX_WideString swJS = action.GetJavaScript();
118 if (!swJS.IsEmpty()) {
119 RunDocumentOpenJavaScript(pDocument, L"", swJS);
120 }
121 }
122 } else {
123 DoAction_NoJs(action, pDocument);
124 }
125
126 for (int32_t i = 0, sz = action.GetSubActionsCount(); i < sz; i++) {
127 CPDF_Action subaction = action.GetSubAction(i);
128 if (!ExecuteDocumentOpenAction(subaction, pDocument, list))
129 return FALSE;
130 }
131
132 return TRUE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700133}
134
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700135FX_BOOL CPDFSDK_ActionHandler::ExecuteLinkAction(const CPDF_Action& action,
136 CPDFSDK_Document* pDocument,
137 CFX_PtrList& list) {
138 ASSERT(pDocument != NULL);
Tom Sepez7b5bc262015-03-05 16:44:22 -0800139
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700140 CPDF_Dictionary* pDict = action.GetDict();
141 if (list.Find(pDict))
142 return FALSE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700143
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700144 list.AddTail(pDict);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700145
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700146 CPDFDoc_Environment* pEnv = pDocument->GetEnv();
147 ASSERT(pEnv);
148 if (action.GetType() == CPDF_Action::JavaScript) {
149 if (pEnv->IsJSInitiated()) {
150 CFX_WideString swJS = action.GetJavaScript();
151 if (!swJS.IsEmpty()) {
Tom Sepez33420902015-10-13 15:00:10 -0700152 IJS_Runtime* pRuntime = pDocument->GetJsRuntime();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700153 pRuntime->SetReaderDocument(pDocument);
154
Tom Sepezba038bc2015-10-08 12:03:00 -0700155 IJS_Context* pContext = pRuntime->NewContext();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700156 pContext->OnLink_MouseUp(pDocument);
157
158 CFX_WideString csInfo;
Tom Sepez33420902015-10-13 15:00:10 -0700159 FX_BOOL bRet = pContext->RunScript(swJS, &csInfo);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700160 if (!bRet) {
161 // FIXME: return error.
162 }
163
164 pRuntime->ReleaseContext(pContext);
165 }
166 }
167 } else {
168 DoAction_NoJs(action, pDocument);
169 }
170
171 for (int32_t i = 0, sz = action.GetSubActionsCount(); i < sz; i++) {
172 CPDF_Action subaction = action.GetSubAction(i);
173 if (!ExecuteLinkAction(subaction, pDocument, list))
174 return FALSE;
175 }
176
177 return TRUE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700178}
179
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700180FX_BOOL CPDFSDK_ActionHandler::ExecuteDocumentPageAction(
181 const CPDF_Action& action,
182 CPDF_AAction::AActionType type,
183 CPDFSDK_Document* pDocument,
184 CFX_PtrList& list) {
185 ASSERT(pDocument != NULL);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700186
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700187 CPDF_Dictionary* pDict = action.GetDict();
188 if (list.Find(pDict))
189 return FALSE;
Tom Sepez7b5bc262015-03-05 16:44:22 -0800190
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700191 list.AddTail(pDict);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700192
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700193 CPDFDoc_Environment* pEnv = pDocument->GetEnv();
194 ASSERT(pEnv);
195 if (action.GetType() == CPDF_Action::JavaScript) {
196 if (pEnv->IsJSInitiated()) {
197 CFX_WideString swJS = action.GetJavaScript();
198 if (!swJS.IsEmpty()) {
199 RunDocumentPageJavaScript(pDocument, type, swJS);
200 }
201 }
202 } else {
203 DoAction_NoJs(action, pDocument);
204 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700205
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700206 if (!IsValidDocView(pDocument))
207 return FALSE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700208
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700209 for (int32_t i = 0, sz = action.GetSubActionsCount(); i < sz; i++) {
210 CPDF_Action subaction = action.GetSubAction(i);
211 if (!ExecuteDocumentPageAction(subaction, type, pDocument, list))
212 return FALSE;
213 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700214
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700215 return TRUE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700216}
217
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700218FX_BOOL CPDFSDK_ActionHandler::IsValidField(CPDFSDK_Document* pDocument,
219 CPDF_Dictionary* pFieldDict) {
Chris Palmer9047b8b2014-08-06 14:17:45 -0700220 ASSERT(pDocument != NULL);
221 ASSERT(pFieldDict != NULL);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700222
Chris Palmer9047b8b2014-08-06 14:17:45 -0700223 CPDFSDK_InterForm* pInterForm = pDocument->GetInterForm();
224 ASSERT(pInterForm != NULL);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700225
Chris Palmer9047b8b2014-08-06 14:17:45 -0700226 CPDF_InterForm* pPDFInterForm = pInterForm->GetInterForm();
227 ASSERT(pPDFInterForm != NULL);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700228
Chris Palmer9047b8b2014-08-06 14:17:45 -0700229 return pPDFInterForm->GetFieldByDict(pFieldDict) != NULL;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700230}
231
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700232FX_BOOL CPDFSDK_ActionHandler::ExecuteFieldAction(
233 const CPDF_Action& action,
234 CPDF_AAction::AActionType type,
235 CPDFSDK_Document* pDocument,
236 CPDF_FormField* pFormField,
237 PDFSDK_FieldAction& data,
238 CFX_PtrList& list) {
239 ASSERT(pDocument != NULL);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700240
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700241 CPDF_Dictionary* pDict = action.GetDict();
242 if (list.Find(pDict))
243 return FALSE;
Tom Sepez7b5bc262015-03-05 16:44:22 -0800244
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700245 list.AddTail(pDict);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700246
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700247 CPDFDoc_Environment* pEnv = pDocument->GetEnv();
248 ASSERT(pEnv);
249 if (action.GetType() == CPDF_Action::JavaScript) {
250 if (pEnv->IsJSInitiated()) {
251 CFX_WideString swJS = action.GetJavaScript();
252 if (!swJS.IsEmpty()) {
253 RunFieldJavaScript(pDocument, pFormField, type, data, swJS);
254 if (!IsValidField(pDocument, pFormField->GetFieldDict()))
255 return FALSE;
256 }
257 }
258 } else {
259 DoAction_NoJs(action, pDocument);
260 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700261
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700262 for (int32_t i = 0, sz = action.GetSubActionsCount(); i < sz; i++) {
263 CPDF_Action subaction = action.GetSubAction(i);
264 if (!ExecuteFieldAction(subaction, type, pDocument, pFormField, data, list))
265 return FALSE;
266 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700267
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700268 return TRUE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700269}
270
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700271FX_BOOL CPDFSDK_ActionHandler::ExecuteScreenAction(
272 const CPDF_Action& action,
273 CPDF_AAction::AActionType type,
274 CPDFSDK_Document* pDocument,
275 CPDFSDK_Annot* pScreen,
276 CFX_PtrList& list) {
277 ASSERT(pDocument != NULL);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700278
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700279 CPDF_Dictionary* pDict = action.GetDict();
280 if (list.Find(pDict))
281 return FALSE;
Tom Sepez7b5bc262015-03-05 16:44:22 -0800282
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700283 list.AddTail(pDict);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700284
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700285 CPDFDoc_Environment* pEnv = pDocument->GetEnv();
286 ASSERT(pEnv);
287 if (action.GetType() == CPDF_Action::JavaScript) {
288 if (pEnv->IsJSInitiated()) {
289 CFX_WideString swJS = action.GetJavaScript();
290 if (!swJS.IsEmpty()) {
Tom Sepezba038bc2015-10-08 12:03:00 -0700291 IJS_Runtime* pRuntime = pDocument->GetJsRuntime();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700292 pRuntime->SetReaderDocument(pDocument);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700293
Tom Sepezba038bc2015-10-08 12:03:00 -0700294 IJS_Context* pContext = pRuntime->NewContext();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700295 CFX_WideString csInfo;
Tom Sepez33420902015-10-13 15:00:10 -0700296 FX_BOOL bRet = pContext->RunScript(swJS, &csInfo);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700297 if (!bRet) {
Tom Sepez33420902015-10-13 15:00:10 -0700298 // FIXME: return error.
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700299 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700300
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700301 pRuntime->ReleaseContext(pContext);
302 }
303 }
304 } else {
305 DoAction_NoJs(action, pDocument);
306 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700307
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700308 for (int32_t i = 0, sz = action.GetSubActionsCount(); i < sz; i++) {
309 CPDF_Action subaction = action.GetSubAction(i);
310 if (!ExecuteScreenAction(subaction, type, pDocument, pScreen, list))
311 return FALSE;
312 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700313
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700314 return TRUE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700315}
316
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700317FX_BOOL CPDFSDK_ActionHandler::ExecuteBookMark(const CPDF_Action& action,
318 CPDFSDK_Document* pDocument,
319 CPDF_Bookmark* pBookmark,
320 CFX_PtrList& list) {
321 ASSERT(pDocument != NULL);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700322
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700323 CPDF_Dictionary* pDict = action.GetDict();
324 if (list.Find(pDict))
325 return FALSE;
Tom Sepez7b5bc262015-03-05 16:44:22 -0800326
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700327 list.AddTail(pDict);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700328
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700329 CPDFDoc_Environment* pEnv = pDocument->GetEnv();
330 ASSERT(pEnv);
331 if (action.GetType() == CPDF_Action::JavaScript) {
332 if (pEnv->IsJSInitiated()) {
333 CFX_WideString swJS = action.GetJavaScript();
334 if (!swJS.IsEmpty()) {
Tom Sepezba038bc2015-10-08 12:03:00 -0700335 IJS_Runtime* pRuntime = pDocument->GetJsRuntime();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700336 pRuntime->SetReaderDocument(pDocument);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700337
Tom Sepezba038bc2015-10-08 12:03:00 -0700338 IJS_Context* pContext = pRuntime->NewContext();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700339 pContext->OnBookmark_MouseUp(pBookmark);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700340
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700341 CFX_WideString csInfo;
Tom Sepez33420902015-10-13 15:00:10 -0700342 FX_BOOL bRet = pContext->RunScript(swJS, &csInfo);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700343 if (!bRet) {
Tom Sepez33420902015-10-13 15:00:10 -0700344 // FIXME: return error.
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700345 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700346
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700347 pRuntime->ReleaseContext(pContext);
348 }
349 }
350 } else {
351 DoAction_NoJs(action, pDocument);
352 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700353
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700354 for (int32_t i = 0, sz = action.GetSubActionsCount(); i < sz; i++) {
355 CPDF_Action subaction = action.GetSubAction(i);
356 if (!ExecuteBookMark(subaction, pDocument, pBookmark, list))
357 return FALSE;
358 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700359
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700360 return TRUE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700361}
362
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700363void CPDFSDK_ActionHandler::DoAction_NoJs(const CPDF_Action& action,
364 CPDFSDK_Document* pDocument) {
365 ASSERT(pDocument != NULL);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700366
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700367 switch (action.GetType()) {
368 case CPDF_Action::GoTo:
369 DoAction_GoTo(pDocument, action);
370 break;
371 case CPDF_Action::GoToR:
372 DoAction_GoToR(pDocument, action);
373 break;
374 case CPDF_Action::GoToE:
375 break;
376 case CPDF_Action::Launch:
377 DoAction_Launch(pDocument, action);
378 break;
379 case CPDF_Action::Thread:
380 break;
381 case CPDF_Action::URI:
382 DoAction_URI(pDocument, action);
383 break;
384 case CPDF_Action::Sound:
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700385 break;
386 case CPDF_Action::Movie:
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700387 break;
388 case CPDF_Action::Hide:
389 if (m_pFormActionHandler) {
390 m_pFormActionHandler->DoAction_Hide(action, pDocument);
391 }
392 break;
393 case CPDF_Action::Named:
394 DoAction_Named(pDocument, action);
395 break;
396 case CPDF_Action::SubmitForm:
397 if (m_pFormActionHandler) {
398 m_pFormActionHandler->DoAction_SubmitForm(action, pDocument);
399 }
400 break;
401 case CPDF_Action::ResetForm:
402 if (m_pFormActionHandler) {
403 m_pFormActionHandler->DoAction_ResetForm(action, pDocument);
404 }
405 break;
406 case CPDF_Action::ImportData:
407 if (m_pFormActionHandler) {
408 m_pFormActionHandler->DoAction_ImportData(action, pDocument);
409 }
410 break;
411 case CPDF_Action::JavaScript:
412 ASSERT(FALSE);
413 break;
414 case CPDF_Action::SetOCGState:
415 DoAction_SetOCGState(pDocument, action);
416 break;
417 case CPDF_Action::Rendition:
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700418 break;
419 case CPDF_Action::Trans:
420 break;
421 case CPDF_Action::GoTo3DView:
422 break;
423 default:
424 break;
425 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700426}
427
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700428FX_BOOL CPDFSDK_ActionHandler::IsValidDocView(CPDFSDK_Document* pDocument) {
Dan Sinclair2b11dc12015-10-22 15:02:06 -0400429 ASSERT(pDocument);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700430 return TRUE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700431}
432
Tom Sepez7b5bc262015-03-05 16:44:22 -0800433void CPDFSDK_ActionHandler::DoAction_GoTo(CPDFSDK_Document* pDocument,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700434 const CPDF_Action& action) {
435 ASSERT(action);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700436
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700437 CPDF_Document* pPDFDocument = pDocument->GetDocument()->GetPDFDoc();
Dan Sinclair2b11dc12015-10-22 15:02:06 -0400438 ASSERT(pPDFDocument);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700439
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700440 CPDF_Dest MyDest = action.GetDest(pPDFDocument);
441 int nPageIndex = MyDest.GetPageIndex(pPDFDocument);
442 int nFitType = MyDest.GetZoomMode();
Dan Sinclair2b11dc12015-10-22 15:02:06 -0400443 const CPDF_Array* pMyArray = ToArray(MyDest.GetObject());
444 float* pPosAry = nullptr;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700445 int sizeOfAry = 0;
Dan Sinclair2b11dc12015-10-22 15:02:06 -0400446 if (pMyArray) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700447 pPosAry = new float[pMyArray->GetCount()];
448 int j = 0;
449 for (int i = 2; i < (int)pMyArray->GetCount(); i++) {
450 pPosAry[j++] = pMyArray->GetFloat(i);
451 }
452 sizeOfAry = j;
453 }
Dan Sinclair2b11dc12015-10-22 15:02:06 -0400454
455 CPDFDoc_Environment* pApp = pDocument->GetEnv();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700456 pApp->FFI_DoGoToAction(nPageIndex, nFitType, pPosAry, sizeOfAry);
Lei Zhangda180e92015-08-14 22:22:13 -0700457 delete[] pPosAry;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700458}
459
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700460void CPDFSDK_ActionHandler::DoAction_GoToR(CPDFSDK_Document* pDocument,
461 const CPDF_Action& action) {}
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700462
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700463void CPDFSDK_ActionHandler::DoAction_Launch(CPDFSDK_Document* pDocument,
464 const CPDF_Action& action) {}
465
466void CPDFSDK_ActionHandler::DoAction_URI(CPDFSDK_Document* pDocument,
467 const CPDF_Action& action) {
468 ASSERT(action);
469
470 CPDFDoc_Environment* pApp = pDocument->GetEnv();
471 ASSERT(pApp != NULL);
472
473 CFX_ByteString sURI = action.GetURI(pDocument->GetDocument()->GetPDFDoc());
474 pApp->FFI_DoURIAction(sURI.c_str());
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700475}
476
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700477void CPDFSDK_ActionHandler::DoAction_Named(CPDFSDK_Document* pDocument,
478 const CPDF_Action& action) {
479 ASSERT(action);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700480
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700481 CFX_ByteString csName = action.GetNamedAction();
482 pDocument->GetEnv()->FFI_ExecuteNamedAction(csName);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700483}
484
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700485void CPDFSDK_ActionHandler::DoAction_SetOCGState(CPDFSDK_Document* pDocument,
486 const CPDF_Action& action) {}
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700487
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700488void CPDFSDK_ActionHandler::RunFieldJavaScript(CPDFSDK_Document* pDocument,
489 CPDF_FormField* pFormField,
490 CPDF_AAction::AActionType type,
491 PDFSDK_FieldAction& data,
492 const CFX_WideString& script) {
493 ASSERT(type != CPDF_AAction::Calculate);
494 ASSERT(type != CPDF_AAction::Format);
Tom Sepezd7e5cc72015-06-10 14:33:37 -0700495
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700496 ASSERT(pDocument != NULL);
497
Tom Sepezba038bc2015-10-08 12:03:00 -0700498 IJS_Runtime* pRuntime = pDocument->GetJsRuntime();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700499 ASSERT(pRuntime != NULL);
500
501 pRuntime->SetReaderDocument(pDocument);
502
Tom Sepezba038bc2015-10-08 12:03:00 -0700503 IJS_Context* pContext = pRuntime->NewContext();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700504 ASSERT(pContext != NULL);
505
506 switch (type) {
507 case CPDF_AAction::CursorEnter:
508 pContext->OnField_MouseEnter(data.bModifier, data.bShift, pFormField);
509 break;
510 case CPDF_AAction::CursorExit:
511 pContext->OnField_MouseExit(data.bModifier, data.bShift, pFormField);
512 break;
513 case CPDF_AAction::ButtonDown:
514 pContext->OnField_MouseDown(data.bModifier, data.bShift, pFormField);
515 break;
516 case CPDF_AAction::ButtonUp:
517 pContext->OnField_MouseUp(data.bModifier, data.bShift, pFormField);
518 break;
519 case CPDF_AAction::GetFocus:
520 pContext->OnField_Focus(data.bModifier, data.bShift, pFormField,
521 data.sValue);
522 break;
523 case CPDF_AAction::LoseFocus:
524 pContext->OnField_Blur(data.bModifier, data.bShift, pFormField,
525 data.sValue);
526 break;
527 case CPDF_AAction::KeyStroke:
528 pContext->OnField_Keystroke(data.sChange, data.sChangeEx, data.bKeyDown,
529 data.bModifier, data.nSelEnd, data.nSelStart,
530 data.bShift, pFormField, data.sValue,
531 data.bWillCommit, data.bFieldFull, data.bRC);
532 break;
533 case CPDF_AAction::Validate:
534 pContext->OnField_Validate(data.sChange, data.sChangeEx, data.bKeyDown,
535 data.bModifier, data.bShift, pFormField,
536 data.sValue, data.bRC);
537 break;
538 default:
539 ASSERT(FALSE);
540 break;
541 }
542
543 CFX_WideString csInfo;
Tom Sepez33420902015-10-13 15:00:10 -0700544 FX_BOOL bRet = pContext->RunScript(script, &csInfo);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700545 if (!bRet) {
Tom Sepez33420902015-10-13 15:00:10 -0700546 // FIXME: return error.
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700547 }
548
549 pRuntime->ReleaseContext(pContext);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700550}
551
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700552void CPDFSDK_ActionHandler::RunDocumentOpenJavaScript(
553 CPDFSDK_Document* pDocument,
554 const CFX_WideString& sScriptName,
555 const CFX_WideString& script) {
556 ASSERT(pDocument != NULL);
Tom Sepez7b5bc262015-03-05 16:44:22 -0800557
Tom Sepezba038bc2015-10-08 12:03:00 -0700558 IJS_Runtime* pRuntime = pDocument->GetJsRuntime();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700559 ASSERT(pRuntime != NULL);
560
561 pRuntime->SetReaderDocument(pDocument);
562
Tom Sepezba038bc2015-10-08 12:03:00 -0700563 IJS_Context* pContext = pRuntime->NewContext();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700564 ASSERT(pContext != NULL);
565
566 pContext->OnDoc_Open(pDocument, sScriptName);
567
568 CFX_WideString csInfo;
Tom Sepez33420902015-10-13 15:00:10 -0700569 FX_BOOL bRet = pContext->RunScript(script, &csInfo);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700570 if (!bRet) {
Tom Sepez33420902015-10-13 15:00:10 -0700571 // FIXME: return error.
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700572 }
573
574 pRuntime->ReleaseContext(pContext);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700575}
576
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700577void CPDFSDK_ActionHandler::RunDocumentPageJavaScript(
578 CPDFSDK_Document* pDocument,
579 CPDF_AAction::AActionType type,
580 const CFX_WideString& script) {
581 ASSERT(pDocument != NULL);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700582
Tom Sepezba038bc2015-10-08 12:03:00 -0700583 IJS_Runtime* pRuntime = pDocument->GetJsRuntime();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700584 ASSERT(pRuntime != NULL);
585
586 pRuntime->SetReaderDocument(pDocument);
587
Tom Sepezba038bc2015-10-08 12:03:00 -0700588 IJS_Context* pContext = pRuntime->NewContext();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700589 ASSERT(pContext != NULL);
590
591 switch (type) {
592 case CPDF_AAction::OpenPage:
593 pContext->OnPage_Open(pDocument);
594 break;
595 case CPDF_AAction::ClosePage:
596 pContext->OnPage_Close(pDocument);
597 break;
598 case CPDF_AAction::CloseDocument:
599 pContext->OnDoc_WillClose(pDocument);
600 break;
601 case CPDF_AAction::SaveDocument:
602 pContext->OnDoc_WillSave(pDocument);
603 break;
604 case CPDF_AAction::DocumentSaved:
605 pContext->OnDoc_DidSave(pDocument);
606 break;
607 case CPDF_AAction::PrintDocument:
608 pContext->OnDoc_WillPrint(pDocument);
609 break;
610 case CPDF_AAction::DocumentPrinted:
611 pContext->OnDoc_DidPrint(pDocument);
612 break;
613 case CPDF_AAction::PageVisible:
614 pContext->OnPage_InView(pDocument);
615 break;
616 case CPDF_AAction::PageInvisible:
617 pContext->OnPage_OutView(pDocument);
618 break;
619 default:
620 ASSERT(FALSE);
621 break;
622 }
623
624 CFX_WideString csInfo;
Tom Sepez33420902015-10-13 15:00:10 -0700625 FX_BOOL bRet = pContext->RunScript(script, &csInfo);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700626 if (!bRet) {
Tom Sepez33420902015-10-13 15:00:10 -0700627 // FIXME: return error.
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700628 }
629
630 pRuntime->ReleaseContext(pContext);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700631}
632
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700633FX_BOOL CPDFSDK_FormActionHandler::DoAction_Hide(const CPDF_Action& action,
634 CPDFSDK_Document* pDocument) {
635 ASSERT(pDocument != NULL);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700636
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700637 CPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)pDocument->GetInterForm();
638 ASSERT(pInterForm != NULL);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700639
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700640 if (pInterForm->DoAction_Hide(action)) {
641 pDocument->SetChangeMark();
642 return TRUE;
643 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700644
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700645 return FALSE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700646}
647
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700648FX_BOOL CPDFSDK_FormActionHandler::DoAction_SubmitForm(
649 const CPDF_Action& action,
650 CPDFSDK_Document* pDocument) {
651 ASSERT(pDocument != NULL);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700652
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700653 CPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)pDocument->GetInterForm();
654 ASSERT(pInterForm != NULL);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700655
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700656 return pInterForm->DoAction_SubmitForm(action);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700657}
658
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700659FX_BOOL CPDFSDK_FormActionHandler::DoAction_ResetForm(
660 const CPDF_Action& action,
661 CPDFSDK_Document* pDocument) {
662 ASSERT(pDocument != NULL);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700663
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700664 CPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)pDocument->GetInterForm();
665 ASSERT(pInterForm != NULL);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700666
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700667 if (pInterForm->DoAction_ResetForm(action)) {
668 return TRUE;
669 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700670
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700671 return FALSE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700672}
673
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700674FX_BOOL CPDFSDK_FormActionHandler::DoAction_ImportData(
675 const CPDF_Action& action,
676 CPDFSDK_Document* pDocument) {
677 ASSERT(pDocument != NULL);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700678
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700679 CPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)pDocument->GetInterForm();
680 ASSERT(pInterForm != NULL);
Tom Sepez7b5bc262015-03-05 16:44:22 -0800681
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700682 if (pInterForm->DoAction_ImportData(action)) {
683 pDocument->SetChangeMark();
684 return TRUE;
685 }
Tom Sepez7b5bc262015-03-05 16:44:22 -0800686
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700687 return FALSE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700688}