blob: a1ab632a4e021b9d19c4ff70745b9909d0868fa8 [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
Lei Zhangbde53d22015-11-12 22:21:30 -08007#include "fpdfsdk/include/fsdk_actionhandler.h"
8#include "fpdfsdk/include/fsdk_define.h"
9#include "fpdfsdk/include/fsdk_mgr.h"
10#include "fpdfsdk/include/javascript/IJavaScript.h"
Tom Sepez6c7508b2016-01-20 14:59:25 -080011#include "third_party/base/stl_util.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) {
Tom Sepez6c7508b2016-01-20 14:59:25 -080019 std::set<CPDF_Dictionary*> visited;
20 return ExecuteDocumentOpenAction(action, pDocument, &visited);
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) {
Tom Sepez6c7508b2016-01-20 14:59:25 -080060 std::set<CPDF_Dictionary*> visited;
61 return ExecuteDocumentPageAction(action, eType, pDocument, &visited);
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) {
Tom Sepez6c7508b2016-01-20 14:59:25 -080068 std::set<CPDF_Dictionary*> visited;
69 return ExecuteDocumentPageAction(action, eType, pDocument, &visited);
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) {
Tom Sepez6c7508b2016-01-20 14:59:25 -080076 std::set<CPDF_Dictionary*> visited;
77 return ExecuteBookMark(action, pDocument, pBookMark, &visited);
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) {
Tom Sepez6c7508b2016-01-20 14:59:25 -080084 std::set<CPDF_Dictionary*> visited;
85 return ExecuteScreenAction(action, type, pDocument, pScreen, &visited);
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) {
Tom Sepez6c7508b2016-01-20 14:59:25 -080090 std::set<CPDF_Dictionary*> visited;
91 return ExecuteLinkAction(action, pDocument, &visited);
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) {
Tom Sepez6c7508b2016-01-20 14:59:25 -080099 std::set<CPDF_Dictionary*> visited;
100 return ExecuteFieldAction(action, type, pDocument, pFormField, data,
101 &visited);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700102}
103
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700104FX_BOOL CPDFSDK_ActionHandler::ExecuteDocumentOpenAction(
105 const CPDF_Action& action,
106 CPDFSDK_Document* pDocument,
Tom Sepez6c7508b2016-01-20 14:59:25 -0800107 std::set<CPDF_Dictionary*>* visited) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700108 CPDF_Dictionary* pDict = action.GetDict();
Tom Sepez6c7508b2016-01-20 14:59:25 -0800109 if (pdfium::ContainsKey(*visited, pDict))
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700110 return FALSE;
111
Tom Sepez6c7508b2016-01-20 14:59:25 -0800112 visited->insert(pDict);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700113
114 CPDFDoc_Environment* pEnv = pDocument->GetEnv();
115 ASSERT(pEnv);
116 if (action.GetType() == CPDF_Action::JavaScript) {
117 if (pEnv->IsJSInitiated()) {
118 CFX_WideString swJS = action.GetJavaScript();
119 if (!swJS.IsEmpty()) {
120 RunDocumentOpenJavaScript(pDocument, L"", swJS);
121 }
122 }
123 } else {
124 DoAction_NoJs(action, pDocument);
125 }
126
127 for (int32_t i = 0, sz = action.GetSubActionsCount(); i < sz; i++) {
128 CPDF_Action subaction = action.GetSubAction(i);
Tom Sepez6c7508b2016-01-20 14:59:25 -0800129 if (!ExecuteDocumentOpenAction(subaction, pDocument, visited))
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700130 return FALSE;
131 }
132
133 return TRUE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700134}
135
Tom Sepez6c7508b2016-01-20 14:59:25 -0800136FX_BOOL CPDFSDK_ActionHandler::ExecuteLinkAction(
137 const CPDF_Action& action,
138 CPDFSDK_Document* pDocument,
139 std::set<CPDF_Dictionary*>* visited) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700140 CPDF_Dictionary* pDict = action.GetDict();
Tom Sepez6c7508b2016-01-20 14:59:25 -0800141 if (pdfium::ContainsKey(*visited, pDict))
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700142 return FALSE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700143
Tom Sepez6c7508b2016-01-20 14:59:25 -0800144 visited->insert(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);
Tom Sepez6c7508b2016-01-20 14:59:25 -0800173 if (!ExecuteLinkAction(subaction, pDocument, visited))
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700174 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,
Tom Sepez6c7508b2016-01-20 14:59:25 -0800184 std::set<CPDF_Dictionary*>* visited) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700185 CPDF_Dictionary* pDict = action.GetDict();
Tom Sepez6c7508b2016-01-20 14:59:25 -0800186 if (pdfium::ContainsKey(*visited, pDict))
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700187 return FALSE;
Tom Sepez7b5bc262015-03-05 16:44:22 -0800188
Tom Sepez6c7508b2016-01-20 14:59:25 -0800189 visited->insert(pDict);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700190
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700191 CPDFDoc_Environment* pEnv = pDocument->GetEnv();
192 ASSERT(pEnv);
193 if (action.GetType() == CPDF_Action::JavaScript) {
194 if (pEnv->IsJSInitiated()) {
195 CFX_WideString swJS = action.GetJavaScript();
196 if (!swJS.IsEmpty()) {
197 RunDocumentPageJavaScript(pDocument, type, swJS);
198 }
199 }
200 } else {
201 DoAction_NoJs(action, pDocument);
202 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700203
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700204 if (!IsValidDocView(pDocument))
205 return FALSE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700206
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700207 for (int32_t i = 0, sz = action.GetSubActionsCount(); i < sz; i++) {
208 CPDF_Action subaction = action.GetSubAction(i);
Tom Sepez6c7508b2016-01-20 14:59:25 -0800209 if (!ExecuteDocumentPageAction(subaction, type, pDocument, visited))
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700210 return FALSE;
211 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700212
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700213 return TRUE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700214}
215
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700216FX_BOOL CPDFSDK_ActionHandler::IsValidField(CPDFSDK_Document* pDocument,
217 CPDF_Dictionary* pFieldDict) {
Lei Zhang96660d62015-12-14 18:27:25 -0800218 ASSERT(pFieldDict);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700219
Chris Palmer9047b8b2014-08-06 14:17:45 -0700220 CPDFSDK_InterForm* pInterForm = pDocument->GetInterForm();
Chris Palmer9047b8b2014-08-06 14:17:45 -0700221 CPDF_InterForm* pPDFInterForm = pInterForm->GetInterForm();
Chris Palmer9047b8b2014-08-06 14:17:45 -0700222 return pPDFInterForm->GetFieldByDict(pFieldDict) != NULL;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700223}
224
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700225FX_BOOL CPDFSDK_ActionHandler::ExecuteFieldAction(
226 const CPDF_Action& action,
227 CPDF_AAction::AActionType type,
228 CPDFSDK_Document* pDocument,
229 CPDF_FormField* pFormField,
230 PDFSDK_FieldAction& data,
Tom Sepez6c7508b2016-01-20 14:59:25 -0800231 std::set<CPDF_Dictionary*>* visited) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700232 CPDF_Dictionary* pDict = action.GetDict();
Tom Sepez6c7508b2016-01-20 14:59:25 -0800233 if (pdfium::ContainsKey(*visited, pDict))
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700234 return FALSE;
Tom Sepez7b5bc262015-03-05 16:44:22 -0800235
Tom Sepez6c7508b2016-01-20 14:59:25 -0800236 visited->insert(pDict);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700237
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700238 CPDFDoc_Environment* pEnv = pDocument->GetEnv();
239 ASSERT(pEnv);
240 if (action.GetType() == CPDF_Action::JavaScript) {
241 if (pEnv->IsJSInitiated()) {
242 CFX_WideString swJS = action.GetJavaScript();
243 if (!swJS.IsEmpty()) {
244 RunFieldJavaScript(pDocument, pFormField, type, data, swJS);
245 if (!IsValidField(pDocument, pFormField->GetFieldDict()))
246 return FALSE;
247 }
248 }
249 } else {
250 DoAction_NoJs(action, pDocument);
251 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700252
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700253 for (int32_t i = 0, sz = action.GetSubActionsCount(); i < sz; i++) {
254 CPDF_Action subaction = action.GetSubAction(i);
Tom Sepez6c7508b2016-01-20 14:59:25 -0800255 if (!ExecuteFieldAction(subaction, type, pDocument, pFormField, data,
256 visited))
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700257 return FALSE;
258 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700259
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700260 return TRUE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700261}
262
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700263FX_BOOL CPDFSDK_ActionHandler::ExecuteScreenAction(
264 const CPDF_Action& action,
265 CPDF_AAction::AActionType type,
266 CPDFSDK_Document* pDocument,
267 CPDFSDK_Annot* pScreen,
Tom Sepez6c7508b2016-01-20 14:59:25 -0800268 std::set<CPDF_Dictionary*>* visited) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700269 CPDF_Dictionary* pDict = action.GetDict();
Tom Sepez6c7508b2016-01-20 14:59:25 -0800270 if (pdfium::ContainsKey(*visited, pDict))
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700271 return FALSE;
Tom Sepez7b5bc262015-03-05 16:44:22 -0800272
Tom Sepez6c7508b2016-01-20 14:59:25 -0800273 visited->insert(pDict);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700274
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700275 CPDFDoc_Environment* pEnv = pDocument->GetEnv();
276 ASSERT(pEnv);
277 if (action.GetType() == CPDF_Action::JavaScript) {
278 if (pEnv->IsJSInitiated()) {
279 CFX_WideString swJS = action.GetJavaScript();
280 if (!swJS.IsEmpty()) {
Tom Sepezba038bc2015-10-08 12:03:00 -0700281 IJS_Runtime* pRuntime = pDocument->GetJsRuntime();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700282 pRuntime->SetReaderDocument(pDocument);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700283
Tom Sepezba038bc2015-10-08 12:03:00 -0700284 IJS_Context* pContext = pRuntime->NewContext();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700285 CFX_WideString csInfo;
Tom Sepez33420902015-10-13 15:00:10 -0700286 FX_BOOL bRet = pContext->RunScript(swJS, &csInfo);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700287 if (!bRet) {
Tom Sepez33420902015-10-13 15:00:10 -0700288 // FIXME: return error.
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700289 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700290
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700291 pRuntime->ReleaseContext(pContext);
292 }
293 }
294 } else {
295 DoAction_NoJs(action, pDocument);
296 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700297
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700298 for (int32_t i = 0, sz = action.GetSubActionsCount(); i < sz; i++) {
299 CPDF_Action subaction = action.GetSubAction(i);
Tom Sepez6c7508b2016-01-20 14:59:25 -0800300 if (!ExecuteScreenAction(subaction, type, pDocument, pScreen, visited))
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700301 return FALSE;
302 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700303
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700304 return TRUE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700305}
306
Tom Sepez6c7508b2016-01-20 14:59:25 -0800307FX_BOOL CPDFSDK_ActionHandler::ExecuteBookMark(
308 const CPDF_Action& action,
309 CPDFSDK_Document* pDocument,
310 CPDF_Bookmark* pBookmark,
311 std::set<CPDF_Dictionary*>* visited) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700312 CPDF_Dictionary* pDict = action.GetDict();
Tom Sepez6c7508b2016-01-20 14:59:25 -0800313 if (pdfium::ContainsKey(*visited, pDict))
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700314 return FALSE;
Tom Sepez7b5bc262015-03-05 16:44:22 -0800315
Tom Sepez6c7508b2016-01-20 14:59:25 -0800316 visited->insert(pDict);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700317
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700318 CPDFDoc_Environment* pEnv = pDocument->GetEnv();
319 ASSERT(pEnv);
320 if (action.GetType() == CPDF_Action::JavaScript) {
321 if (pEnv->IsJSInitiated()) {
322 CFX_WideString swJS = action.GetJavaScript();
323 if (!swJS.IsEmpty()) {
Tom Sepezba038bc2015-10-08 12:03:00 -0700324 IJS_Runtime* pRuntime = pDocument->GetJsRuntime();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700325 pRuntime->SetReaderDocument(pDocument);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700326
Tom Sepezba038bc2015-10-08 12:03:00 -0700327 IJS_Context* pContext = pRuntime->NewContext();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700328 pContext->OnBookmark_MouseUp(pBookmark);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700329
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700330 CFX_WideString csInfo;
Tom Sepez33420902015-10-13 15:00:10 -0700331 FX_BOOL bRet = pContext->RunScript(swJS, &csInfo);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700332 if (!bRet) {
Tom Sepez33420902015-10-13 15:00:10 -0700333 // FIXME: return error.
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700334 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700335
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700336 pRuntime->ReleaseContext(pContext);
337 }
338 }
339 } else {
340 DoAction_NoJs(action, pDocument);
341 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700342
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700343 for (int32_t i = 0, sz = action.GetSubActionsCount(); i < sz; i++) {
344 CPDF_Action subaction = action.GetSubAction(i);
Tom Sepez6c7508b2016-01-20 14:59:25 -0800345 if (!ExecuteBookMark(subaction, pDocument, pBookmark, visited))
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700346 return FALSE;
347 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700348
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700349 return TRUE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700350}
351
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700352void CPDFSDK_ActionHandler::DoAction_NoJs(const CPDF_Action& action,
353 CPDFSDK_Document* pDocument) {
Lei Zhang96660d62015-12-14 18:27:25 -0800354 ASSERT(pDocument);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700355
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700356 switch (action.GetType()) {
357 case CPDF_Action::GoTo:
358 DoAction_GoTo(pDocument, action);
359 break;
360 case CPDF_Action::GoToR:
361 DoAction_GoToR(pDocument, action);
362 break;
363 case CPDF_Action::GoToE:
364 break;
365 case CPDF_Action::Launch:
366 DoAction_Launch(pDocument, action);
367 break;
368 case CPDF_Action::Thread:
369 break;
370 case CPDF_Action::URI:
371 DoAction_URI(pDocument, action);
372 break;
373 case CPDF_Action::Sound:
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700374 break;
375 case CPDF_Action::Movie:
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700376 break;
377 case CPDF_Action::Hide:
378 if (m_pFormActionHandler) {
379 m_pFormActionHandler->DoAction_Hide(action, pDocument);
380 }
381 break;
382 case CPDF_Action::Named:
383 DoAction_Named(pDocument, action);
384 break;
385 case CPDF_Action::SubmitForm:
386 if (m_pFormActionHandler) {
387 m_pFormActionHandler->DoAction_SubmitForm(action, pDocument);
388 }
389 break;
390 case CPDF_Action::ResetForm:
391 if (m_pFormActionHandler) {
392 m_pFormActionHandler->DoAction_ResetForm(action, pDocument);
393 }
394 break;
395 case CPDF_Action::ImportData:
396 if (m_pFormActionHandler) {
397 m_pFormActionHandler->DoAction_ImportData(action, pDocument);
398 }
399 break;
400 case CPDF_Action::JavaScript:
401 ASSERT(FALSE);
402 break;
403 case CPDF_Action::SetOCGState:
404 DoAction_SetOCGState(pDocument, action);
405 break;
406 case CPDF_Action::Rendition:
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700407 break;
408 case CPDF_Action::Trans:
409 break;
410 case CPDF_Action::GoTo3DView:
411 break;
412 default:
413 break;
414 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700415}
416
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700417FX_BOOL CPDFSDK_ActionHandler::IsValidDocView(CPDFSDK_Document* pDocument) {
Dan Sinclair2b11dc12015-10-22 15:02:06 -0400418 ASSERT(pDocument);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700419 return TRUE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700420}
421
Tom Sepez7b5bc262015-03-05 16:44:22 -0800422void CPDFSDK_ActionHandler::DoAction_GoTo(CPDFSDK_Document* pDocument,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700423 const CPDF_Action& action) {
424 ASSERT(action);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700425
Tom Sepez50d12ad2015-11-24 09:50:51 -0800426 CPDF_Document* pPDFDocument = pDocument->GetPDFDocument();
Dan Sinclair2b11dc12015-10-22 15:02:06 -0400427 ASSERT(pPDFDocument);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700428
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700429 CPDF_Dest MyDest = action.GetDest(pPDFDocument);
430 int nPageIndex = MyDest.GetPageIndex(pPDFDocument);
431 int nFitType = MyDest.GetZoomMode();
Dan Sinclair2b11dc12015-10-22 15:02:06 -0400432 const CPDF_Array* pMyArray = ToArray(MyDest.GetObject());
433 float* pPosAry = nullptr;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700434 int sizeOfAry = 0;
Dan Sinclair2b11dc12015-10-22 15:02:06 -0400435 if (pMyArray) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700436 pPosAry = new float[pMyArray->GetCount()];
437 int j = 0;
438 for (int i = 2; i < (int)pMyArray->GetCount(); i++) {
439 pPosAry[j++] = pMyArray->GetFloat(i);
440 }
441 sizeOfAry = j;
442 }
Dan Sinclair2b11dc12015-10-22 15:02:06 -0400443
444 CPDFDoc_Environment* pApp = pDocument->GetEnv();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700445 pApp->FFI_DoGoToAction(nPageIndex, nFitType, pPosAry, sizeOfAry);
Lei Zhangda180e92015-08-14 22:22:13 -0700446 delete[] pPosAry;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700447}
448
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700449void CPDFSDK_ActionHandler::DoAction_GoToR(CPDFSDK_Document* pDocument,
450 const CPDF_Action& action) {}
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700451
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700452void CPDFSDK_ActionHandler::DoAction_Launch(CPDFSDK_Document* pDocument,
453 const CPDF_Action& action) {}
454
455void CPDFSDK_ActionHandler::DoAction_URI(CPDFSDK_Document* pDocument,
456 const CPDF_Action& action) {
457 ASSERT(action);
458
459 CPDFDoc_Environment* pApp = pDocument->GetEnv();
Tom Sepez50d12ad2015-11-24 09:50:51 -0800460 CFX_ByteString sURI = action.GetURI(pDocument->GetPDFDocument());
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700461 pApp->FFI_DoURIAction(sURI.c_str());
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700462}
463
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700464void CPDFSDK_ActionHandler::DoAction_Named(CPDFSDK_Document* pDocument,
465 const CPDF_Action& action) {
466 ASSERT(action);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700467
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700468 CFX_ByteString csName = action.GetNamedAction();
469 pDocument->GetEnv()->FFI_ExecuteNamedAction(csName);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700470}
471
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700472void CPDFSDK_ActionHandler::DoAction_SetOCGState(CPDFSDK_Document* pDocument,
473 const CPDF_Action& action) {}
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700474
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700475void CPDFSDK_ActionHandler::RunFieldJavaScript(CPDFSDK_Document* pDocument,
476 CPDF_FormField* pFormField,
477 CPDF_AAction::AActionType type,
478 PDFSDK_FieldAction& data,
479 const CFX_WideString& script) {
480 ASSERT(type != CPDF_AAction::Calculate);
481 ASSERT(type != CPDF_AAction::Format);
Tom Sepezd7e5cc72015-06-10 14:33:37 -0700482
Tom Sepezba038bc2015-10-08 12:03:00 -0700483 IJS_Runtime* pRuntime = pDocument->GetJsRuntime();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700484 pRuntime->SetReaderDocument(pDocument);
485
Tom Sepezba038bc2015-10-08 12:03:00 -0700486 IJS_Context* pContext = pRuntime->NewContext();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700487 switch (type) {
488 case CPDF_AAction::CursorEnter:
489 pContext->OnField_MouseEnter(data.bModifier, data.bShift, pFormField);
490 break;
491 case CPDF_AAction::CursorExit:
492 pContext->OnField_MouseExit(data.bModifier, data.bShift, pFormField);
493 break;
494 case CPDF_AAction::ButtonDown:
495 pContext->OnField_MouseDown(data.bModifier, data.bShift, pFormField);
496 break;
497 case CPDF_AAction::ButtonUp:
498 pContext->OnField_MouseUp(data.bModifier, data.bShift, pFormField);
499 break;
500 case CPDF_AAction::GetFocus:
501 pContext->OnField_Focus(data.bModifier, data.bShift, pFormField,
502 data.sValue);
503 break;
504 case CPDF_AAction::LoseFocus:
505 pContext->OnField_Blur(data.bModifier, data.bShift, pFormField,
506 data.sValue);
507 break;
508 case CPDF_AAction::KeyStroke:
509 pContext->OnField_Keystroke(data.sChange, data.sChangeEx, data.bKeyDown,
510 data.bModifier, data.nSelEnd, data.nSelStart,
511 data.bShift, pFormField, data.sValue,
512 data.bWillCommit, data.bFieldFull, data.bRC);
513 break;
514 case CPDF_AAction::Validate:
515 pContext->OnField_Validate(data.sChange, data.sChangeEx, data.bKeyDown,
516 data.bModifier, data.bShift, pFormField,
517 data.sValue, data.bRC);
518 break;
519 default:
520 ASSERT(FALSE);
521 break;
522 }
523
524 CFX_WideString csInfo;
Tom Sepez33420902015-10-13 15:00:10 -0700525 FX_BOOL bRet = pContext->RunScript(script, &csInfo);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700526 if (!bRet) {
Tom Sepez33420902015-10-13 15:00:10 -0700527 // FIXME: return error.
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700528 }
529
530 pRuntime->ReleaseContext(pContext);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700531}
532
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700533void CPDFSDK_ActionHandler::RunDocumentOpenJavaScript(
534 CPDFSDK_Document* pDocument,
535 const CFX_WideString& sScriptName,
536 const CFX_WideString& script) {
Tom Sepezba038bc2015-10-08 12:03:00 -0700537 IJS_Runtime* pRuntime = pDocument->GetJsRuntime();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700538 pRuntime->SetReaderDocument(pDocument);
Tom Sepezba038bc2015-10-08 12:03:00 -0700539 IJS_Context* pContext = pRuntime->NewContext();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700540 pContext->OnDoc_Open(pDocument, sScriptName);
541
542 CFX_WideString csInfo;
Tom Sepez33420902015-10-13 15:00:10 -0700543 FX_BOOL bRet = pContext->RunScript(script, &csInfo);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700544 if (!bRet) {
Tom Sepez33420902015-10-13 15:00:10 -0700545 // FIXME: return error.
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700546 }
547
548 pRuntime->ReleaseContext(pContext);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700549}
550
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700551void CPDFSDK_ActionHandler::RunDocumentPageJavaScript(
552 CPDFSDK_Document* pDocument,
553 CPDF_AAction::AActionType type,
554 const CFX_WideString& script) {
Tom Sepezba038bc2015-10-08 12:03:00 -0700555 IJS_Runtime* pRuntime = pDocument->GetJsRuntime();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700556 pRuntime->SetReaderDocument(pDocument);
557
Tom Sepezba038bc2015-10-08 12:03:00 -0700558 IJS_Context* pContext = pRuntime->NewContext();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700559 switch (type) {
560 case CPDF_AAction::OpenPage:
561 pContext->OnPage_Open(pDocument);
562 break;
563 case CPDF_AAction::ClosePage:
564 pContext->OnPage_Close(pDocument);
565 break;
566 case CPDF_AAction::CloseDocument:
567 pContext->OnDoc_WillClose(pDocument);
568 break;
569 case CPDF_AAction::SaveDocument:
570 pContext->OnDoc_WillSave(pDocument);
571 break;
572 case CPDF_AAction::DocumentSaved:
573 pContext->OnDoc_DidSave(pDocument);
574 break;
575 case CPDF_AAction::PrintDocument:
576 pContext->OnDoc_WillPrint(pDocument);
577 break;
578 case CPDF_AAction::DocumentPrinted:
579 pContext->OnDoc_DidPrint(pDocument);
580 break;
581 case CPDF_AAction::PageVisible:
582 pContext->OnPage_InView(pDocument);
583 break;
584 case CPDF_AAction::PageInvisible:
585 pContext->OnPage_OutView(pDocument);
586 break;
587 default:
588 ASSERT(FALSE);
589 break;
590 }
591
592 CFX_WideString csInfo;
Tom Sepez33420902015-10-13 15:00:10 -0700593 FX_BOOL bRet = pContext->RunScript(script, &csInfo);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700594 if (!bRet) {
Tom Sepez33420902015-10-13 15:00:10 -0700595 // FIXME: return error.
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700596 }
597
598 pRuntime->ReleaseContext(pContext);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700599}
600
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700601FX_BOOL CPDFSDK_FormActionHandler::DoAction_Hide(const CPDF_Action& action,
602 CPDFSDK_Document* pDocument) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700603 CPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)pDocument->GetInterForm();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700604 if (pInterForm->DoAction_Hide(action)) {
605 pDocument->SetChangeMark();
606 return TRUE;
607 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700608
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700609 return FALSE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700610}
611
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700612FX_BOOL CPDFSDK_FormActionHandler::DoAction_SubmitForm(
613 const CPDF_Action& action,
614 CPDFSDK_Document* pDocument) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700615 CPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)pDocument->GetInterForm();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700616 return pInterForm->DoAction_SubmitForm(action);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700617}
618
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700619FX_BOOL CPDFSDK_FormActionHandler::DoAction_ResetForm(
620 const CPDF_Action& action,
621 CPDFSDK_Document* pDocument) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700622 CPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)pDocument->GetInterForm();
Lei Zhang96660d62015-12-14 18:27:25 -0800623 return pInterForm->DoAction_ResetForm(action);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700624}
625
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700626FX_BOOL CPDFSDK_FormActionHandler::DoAction_ImportData(
627 const CPDF_Action& action,
628 CPDFSDK_Document* pDocument) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700629 CPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)pDocument->GetInterForm();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700630 if (pInterForm->DoAction_ImportData(action)) {
631 pDocument->SetChangeMark();
632 return TRUE;
633 }
Tom Sepez7b5bc262015-03-05 16:44:22 -0800634
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700635 return FALSE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700636}