blob: 1977ce5ceea1dfe83d7b8683bd8db84adff52a67 [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"
Dan Sinclair3ebd1212016-03-09 09:59:23 -05008
9#include <set>
10
Dan Sinclairaa403d32016-03-15 14:57:22 -040011#include "core/fpdfapi/fpdf_parser/include/cpdf_array.h"
Lei Zhangbde53d22015-11-12 22:21:30 -080012#include "fpdfsdk/include/fsdk_define.h"
13#include "fpdfsdk/include/fsdk_mgr.h"
14#include "fpdfsdk/include/javascript/IJavaScript.h"
Tom Sepez6c7508b2016-01-20 14:59:25 -080015#include "third_party/base/stl_util.h"
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070016
Tom Sepez3b5f1242015-09-01 14:06:55 -070017CPDFSDK_ActionHandler::CPDFSDK_ActionHandler()
Dan Sinclairf766ad22016-03-14 13:51:24 -040018 : m_pFormActionHandler(new CPDFSDK_FormActionHandler) {}
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070019
Nico Weber9d8ec5a2015-08-04 13:00:21 -070020FX_BOOL CPDFSDK_ActionHandler::DoAction_DocOpen(const CPDF_Action& action,
21 CPDFSDK_Document* pDocument) {
Tom Sepez6c7508b2016-01-20 14:59:25 -080022 std::set<CPDF_Dictionary*> visited;
23 return ExecuteDocumentOpenAction(action, pDocument, &visited);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070024}
25
Nico Weber9d8ec5a2015-08-04 13:00:21 -070026FX_BOOL CPDFSDK_ActionHandler::DoAction_JavaScript(
27 const CPDF_Action& JsAction,
28 CFX_WideString csJSName,
29 CPDFSDK_Document* pDocument) {
30 if (JsAction.GetType() == CPDF_Action::JavaScript) {
31 CFX_WideString swJS = JsAction.GetJavaScript();
32 if (!swJS.IsEmpty()) {
33 RunDocumentOpenJavaScript(pDocument, csJSName, swJS);
34 return TRUE;
35 }
36 }
37
38 return FALSE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070039}
40
Nico Weber9d8ec5a2015-08-04 13:00:21 -070041FX_BOOL CPDFSDK_ActionHandler::DoAction_FieldJavaScript(
42 const CPDF_Action& JsAction,
43 CPDF_AAction::AActionType type,
44 CPDFSDK_Document* pDocument,
45 CPDF_FormField* pFormField,
46 PDFSDK_FieldAction& data) {
47 CPDFDoc_Environment* pEnv = pDocument->GetEnv();
48 ASSERT(pEnv);
49 if (pEnv->IsJSInitiated() && JsAction.GetType() == CPDF_Action::JavaScript) {
50 CFX_WideString swJS = JsAction.GetJavaScript();
51 if (!swJS.IsEmpty()) {
52 RunFieldJavaScript(pDocument, pFormField, type, data, swJS);
53 return TRUE;
54 }
55 }
56 return FALSE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070057}
58
Nico Weber9d8ec5a2015-08-04 13:00:21 -070059FX_BOOL CPDFSDK_ActionHandler::DoAction_Page(
60 const CPDF_Action& action,
61 enum CPDF_AAction::AActionType eType,
62 CPDFSDK_Document* pDocument) {
Tom Sepez6c7508b2016-01-20 14:59:25 -080063 std::set<CPDF_Dictionary*> visited;
64 return ExecuteDocumentPageAction(action, eType, pDocument, &visited);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070065}
66
Nico Weber9d8ec5a2015-08-04 13:00:21 -070067FX_BOOL CPDFSDK_ActionHandler::DoAction_Document(
68 const CPDF_Action& action,
69 enum CPDF_AAction::AActionType eType,
70 CPDFSDK_Document* pDocument) {
Tom Sepez6c7508b2016-01-20 14:59:25 -080071 std::set<CPDF_Dictionary*> visited;
72 return ExecuteDocumentPageAction(action, eType, pDocument, &visited);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070073}
74
Nico Weber9d8ec5a2015-08-04 13:00:21 -070075FX_BOOL CPDFSDK_ActionHandler::DoAction_BookMark(CPDF_Bookmark* pBookMark,
76 const CPDF_Action& action,
77 CPDF_AAction::AActionType type,
78 CPDFSDK_Document* pDocument) {
Tom Sepez6c7508b2016-01-20 14:59:25 -080079 std::set<CPDF_Dictionary*> visited;
80 return ExecuteBookMark(action, pDocument, pBookMark, &visited);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070081}
82
Nico Weber9d8ec5a2015-08-04 13:00:21 -070083FX_BOOL CPDFSDK_ActionHandler::DoAction_Screen(const CPDF_Action& action,
84 CPDF_AAction::AActionType type,
85 CPDFSDK_Document* pDocument,
86 CPDFSDK_Annot* pScreen) {
Tom Sepez6c7508b2016-01-20 14:59:25 -080087 std::set<CPDF_Dictionary*> visited;
88 return ExecuteScreenAction(action, type, pDocument, pScreen, &visited);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070089}
90
Nico Weber9d8ec5a2015-08-04 13:00:21 -070091FX_BOOL CPDFSDK_ActionHandler::DoAction_Link(const CPDF_Action& action,
92 CPDFSDK_Document* pDocument) {
Tom Sepez6c7508b2016-01-20 14:59:25 -080093 std::set<CPDF_Dictionary*> visited;
94 return ExecuteLinkAction(action, pDocument, &visited);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070095}
96
Nico Weber9d8ec5a2015-08-04 13:00:21 -070097FX_BOOL CPDFSDK_ActionHandler::DoAction_Field(const CPDF_Action& action,
98 CPDF_AAction::AActionType type,
99 CPDFSDK_Document* pDocument,
100 CPDF_FormField* pFormField,
101 PDFSDK_FieldAction& data) {
Tom Sepez6c7508b2016-01-20 14:59:25 -0800102 std::set<CPDF_Dictionary*> visited;
103 return ExecuteFieldAction(action, type, pDocument, pFormField, data,
104 &visited);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700105}
106
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700107FX_BOOL CPDFSDK_ActionHandler::ExecuteDocumentOpenAction(
108 const CPDF_Action& action,
109 CPDFSDK_Document* pDocument,
Tom Sepez6c7508b2016-01-20 14:59:25 -0800110 std::set<CPDF_Dictionary*>* visited) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700111 CPDF_Dictionary* pDict = action.GetDict();
Tom Sepez6c7508b2016-01-20 14:59:25 -0800112 if (pdfium::ContainsKey(*visited, pDict))
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700113 return FALSE;
114
Tom Sepez6c7508b2016-01-20 14:59:25 -0800115 visited->insert(pDict);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700116
117 CPDFDoc_Environment* pEnv = pDocument->GetEnv();
118 ASSERT(pEnv);
119 if (action.GetType() == CPDF_Action::JavaScript) {
120 if (pEnv->IsJSInitiated()) {
121 CFX_WideString swJS = action.GetJavaScript();
122 if (!swJS.IsEmpty()) {
123 RunDocumentOpenJavaScript(pDocument, L"", swJS);
124 }
125 }
126 } else {
127 DoAction_NoJs(action, pDocument);
128 }
129
130 for (int32_t i = 0, sz = action.GetSubActionsCount(); i < sz; i++) {
131 CPDF_Action subaction = action.GetSubAction(i);
Tom Sepez6c7508b2016-01-20 14:59:25 -0800132 if (!ExecuteDocumentOpenAction(subaction, pDocument, visited))
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700133 return FALSE;
134 }
135
136 return TRUE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700137}
138
Tom Sepez6c7508b2016-01-20 14:59:25 -0800139FX_BOOL CPDFSDK_ActionHandler::ExecuteLinkAction(
140 const CPDF_Action& action,
141 CPDFSDK_Document* pDocument,
142 std::set<CPDF_Dictionary*>* visited) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700143 CPDF_Dictionary* pDict = action.GetDict();
Tom Sepez6c7508b2016-01-20 14:59:25 -0800144 if (pdfium::ContainsKey(*visited, pDict))
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700145 return FALSE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700146
Tom Sepez6c7508b2016-01-20 14:59:25 -0800147 visited->insert(pDict);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700148
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700149 CPDFDoc_Environment* pEnv = pDocument->GetEnv();
150 ASSERT(pEnv);
151 if (action.GetType() == CPDF_Action::JavaScript) {
152 if (pEnv->IsJSInitiated()) {
153 CFX_WideString swJS = action.GetJavaScript();
154 if (!swJS.IsEmpty()) {
Tom Sepez33420902015-10-13 15:00:10 -0700155 IJS_Runtime* pRuntime = pDocument->GetJsRuntime();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700156 pRuntime->SetReaderDocument(pDocument);
157
Tom Sepezba038bc2015-10-08 12:03:00 -0700158 IJS_Context* pContext = pRuntime->NewContext();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700159 pContext->OnLink_MouseUp(pDocument);
160
161 CFX_WideString csInfo;
Tom Sepez33420902015-10-13 15:00:10 -0700162 FX_BOOL bRet = pContext->RunScript(swJS, &csInfo);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700163 if (!bRet) {
164 // FIXME: return error.
165 }
166
167 pRuntime->ReleaseContext(pContext);
168 }
169 }
170 } else {
171 DoAction_NoJs(action, pDocument);
172 }
173
174 for (int32_t i = 0, sz = action.GetSubActionsCount(); i < sz; i++) {
175 CPDF_Action subaction = action.GetSubAction(i);
Tom Sepez6c7508b2016-01-20 14:59:25 -0800176 if (!ExecuteLinkAction(subaction, pDocument, visited))
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700177 return FALSE;
178 }
179
180 return TRUE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700181}
182
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700183FX_BOOL CPDFSDK_ActionHandler::ExecuteDocumentPageAction(
184 const CPDF_Action& action,
185 CPDF_AAction::AActionType type,
186 CPDFSDK_Document* pDocument,
Tom Sepez6c7508b2016-01-20 14:59:25 -0800187 std::set<CPDF_Dictionary*>* visited) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700188 CPDF_Dictionary* pDict = action.GetDict();
Tom Sepez6c7508b2016-01-20 14:59:25 -0800189 if (pdfium::ContainsKey(*visited, pDict))
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700190 return FALSE;
Tom Sepez7b5bc262015-03-05 16:44:22 -0800191
Tom Sepez6c7508b2016-01-20 14:59:25 -0800192 visited->insert(pDict);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700193
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700194 CPDFDoc_Environment* pEnv = pDocument->GetEnv();
195 ASSERT(pEnv);
196 if (action.GetType() == CPDF_Action::JavaScript) {
197 if (pEnv->IsJSInitiated()) {
198 CFX_WideString swJS = action.GetJavaScript();
199 if (!swJS.IsEmpty()) {
200 RunDocumentPageJavaScript(pDocument, type, swJS);
201 }
202 }
203 } else {
204 DoAction_NoJs(action, pDocument);
205 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700206
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700207 if (!IsValidDocView(pDocument))
208 return FALSE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700209
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700210 for (int32_t i = 0, sz = action.GetSubActionsCount(); i < sz; i++) {
211 CPDF_Action subaction = action.GetSubAction(i);
Tom Sepez6c7508b2016-01-20 14:59:25 -0800212 if (!ExecuteDocumentPageAction(subaction, type, pDocument, visited))
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700213 return FALSE;
214 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700215
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700216 return TRUE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700217}
218
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700219FX_BOOL CPDFSDK_ActionHandler::IsValidField(CPDFSDK_Document* pDocument,
220 CPDF_Dictionary* pFieldDict) {
Lei Zhang96660d62015-12-14 18:27:25 -0800221 ASSERT(pFieldDict);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700222
Chris Palmer9047b8b2014-08-06 14:17:45 -0700223 CPDFSDK_InterForm* pInterForm = pDocument->GetInterForm();
Chris Palmer9047b8b2014-08-06 14:17:45 -0700224 CPDF_InterForm* pPDFInterForm = pInterForm->GetInterForm();
Chris Palmer9047b8b2014-08-06 14:17:45 -0700225 return pPDFInterForm->GetFieldByDict(pFieldDict) != NULL;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700226}
227
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700228FX_BOOL CPDFSDK_ActionHandler::ExecuteFieldAction(
229 const CPDF_Action& action,
230 CPDF_AAction::AActionType type,
231 CPDFSDK_Document* pDocument,
232 CPDF_FormField* pFormField,
233 PDFSDK_FieldAction& data,
Tom Sepez6c7508b2016-01-20 14:59:25 -0800234 std::set<CPDF_Dictionary*>* visited) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700235 CPDF_Dictionary* pDict = action.GetDict();
Tom Sepez6c7508b2016-01-20 14:59:25 -0800236 if (pdfium::ContainsKey(*visited, pDict))
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700237 return FALSE;
Tom Sepez7b5bc262015-03-05 16:44:22 -0800238
Tom Sepez6c7508b2016-01-20 14:59:25 -0800239 visited->insert(pDict);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700240
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700241 CPDFDoc_Environment* pEnv = pDocument->GetEnv();
242 ASSERT(pEnv);
243 if (action.GetType() == CPDF_Action::JavaScript) {
244 if (pEnv->IsJSInitiated()) {
245 CFX_WideString swJS = action.GetJavaScript();
246 if (!swJS.IsEmpty()) {
247 RunFieldJavaScript(pDocument, pFormField, type, data, swJS);
248 if (!IsValidField(pDocument, pFormField->GetFieldDict()))
249 return FALSE;
250 }
251 }
252 } else {
253 DoAction_NoJs(action, pDocument);
254 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700255
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700256 for (int32_t i = 0, sz = action.GetSubActionsCount(); i < sz; i++) {
257 CPDF_Action subaction = action.GetSubAction(i);
Tom Sepez6c7508b2016-01-20 14:59:25 -0800258 if (!ExecuteFieldAction(subaction, type, pDocument, pFormField, data,
259 visited))
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700260 return FALSE;
261 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700262
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700263 return TRUE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700264}
265
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700266FX_BOOL CPDFSDK_ActionHandler::ExecuteScreenAction(
267 const CPDF_Action& action,
268 CPDF_AAction::AActionType type,
269 CPDFSDK_Document* pDocument,
270 CPDFSDK_Annot* pScreen,
Tom Sepez6c7508b2016-01-20 14:59:25 -0800271 std::set<CPDF_Dictionary*>* visited) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700272 CPDF_Dictionary* pDict = action.GetDict();
Tom Sepez6c7508b2016-01-20 14:59:25 -0800273 if (pdfium::ContainsKey(*visited, pDict))
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700274 return FALSE;
Tom Sepez7b5bc262015-03-05 16:44:22 -0800275
Tom Sepez6c7508b2016-01-20 14:59:25 -0800276 visited->insert(pDict);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700277
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700278 CPDFDoc_Environment* pEnv = pDocument->GetEnv();
279 ASSERT(pEnv);
280 if (action.GetType() == CPDF_Action::JavaScript) {
281 if (pEnv->IsJSInitiated()) {
282 CFX_WideString swJS = action.GetJavaScript();
283 if (!swJS.IsEmpty()) {
Tom Sepezba038bc2015-10-08 12:03:00 -0700284 IJS_Runtime* pRuntime = pDocument->GetJsRuntime();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700285 pRuntime->SetReaderDocument(pDocument);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700286
Tom Sepezba038bc2015-10-08 12:03:00 -0700287 IJS_Context* pContext = pRuntime->NewContext();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700288 CFX_WideString csInfo;
Tom Sepez33420902015-10-13 15:00:10 -0700289 FX_BOOL bRet = pContext->RunScript(swJS, &csInfo);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700290 if (!bRet) {
Tom Sepez33420902015-10-13 15:00:10 -0700291 // FIXME: return error.
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700292 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700293
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700294 pRuntime->ReleaseContext(pContext);
295 }
296 }
297 } else {
298 DoAction_NoJs(action, pDocument);
299 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700300
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700301 for (int32_t i = 0, sz = action.GetSubActionsCount(); i < sz; i++) {
302 CPDF_Action subaction = action.GetSubAction(i);
Tom Sepez6c7508b2016-01-20 14:59:25 -0800303 if (!ExecuteScreenAction(subaction, type, pDocument, pScreen, visited))
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700304 return FALSE;
305 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700306
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700307 return TRUE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700308}
309
Tom Sepez6c7508b2016-01-20 14:59:25 -0800310FX_BOOL CPDFSDK_ActionHandler::ExecuteBookMark(
311 const CPDF_Action& action,
312 CPDFSDK_Document* pDocument,
313 CPDF_Bookmark* pBookmark,
314 std::set<CPDF_Dictionary*>* visited) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700315 CPDF_Dictionary* pDict = action.GetDict();
Tom Sepez6c7508b2016-01-20 14:59:25 -0800316 if (pdfium::ContainsKey(*visited, pDict))
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700317 return FALSE;
Tom Sepez7b5bc262015-03-05 16:44:22 -0800318
Tom Sepez6c7508b2016-01-20 14:59:25 -0800319 visited->insert(pDict);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700320
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700321 CPDFDoc_Environment* pEnv = pDocument->GetEnv();
322 ASSERT(pEnv);
323 if (action.GetType() == CPDF_Action::JavaScript) {
324 if (pEnv->IsJSInitiated()) {
325 CFX_WideString swJS = action.GetJavaScript();
326 if (!swJS.IsEmpty()) {
Tom Sepezba038bc2015-10-08 12:03:00 -0700327 IJS_Runtime* pRuntime = pDocument->GetJsRuntime();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700328 pRuntime->SetReaderDocument(pDocument);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700329
Tom Sepezba038bc2015-10-08 12:03:00 -0700330 IJS_Context* pContext = pRuntime->NewContext();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700331 pContext->OnBookmark_MouseUp(pBookmark);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700332
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700333 CFX_WideString csInfo;
Tom Sepez33420902015-10-13 15:00:10 -0700334 FX_BOOL bRet = pContext->RunScript(swJS, &csInfo);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700335 if (!bRet) {
Tom Sepez33420902015-10-13 15:00:10 -0700336 // FIXME: return error.
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700337 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700338
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700339 pRuntime->ReleaseContext(pContext);
340 }
341 }
342 } else {
343 DoAction_NoJs(action, pDocument);
344 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700345
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700346 for (int32_t i = 0, sz = action.GetSubActionsCount(); i < sz; i++) {
347 CPDF_Action subaction = action.GetSubAction(i);
Tom Sepez6c7508b2016-01-20 14:59:25 -0800348 if (!ExecuteBookMark(subaction, pDocument, pBookmark, visited))
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700349 return FALSE;
350 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700351
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700352 return TRUE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700353}
354
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700355void CPDFSDK_ActionHandler::DoAction_NoJs(const CPDF_Action& action,
356 CPDFSDK_Document* pDocument) {
Lei Zhang96660d62015-12-14 18:27:25 -0800357 ASSERT(pDocument);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700358
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700359 switch (action.GetType()) {
360 case CPDF_Action::GoTo:
361 DoAction_GoTo(pDocument, action);
362 break;
363 case CPDF_Action::GoToR:
364 DoAction_GoToR(pDocument, action);
365 break;
366 case CPDF_Action::GoToE:
367 break;
368 case CPDF_Action::Launch:
369 DoAction_Launch(pDocument, action);
370 break;
371 case CPDF_Action::Thread:
372 break;
373 case CPDF_Action::URI:
374 DoAction_URI(pDocument, action);
375 break;
376 case CPDF_Action::Sound:
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700377 break;
378 case CPDF_Action::Movie:
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700379 break;
380 case CPDF_Action::Hide:
381 if (m_pFormActionHandler) {
382 m_pFormActionHandler->DoAction_Hide(action, pDocument);
383 }
384 break;
385 case CPDF_Action::Named:
386 DoAction_Named(pDocument, action);
387 break;
388 case CPDF_Action::SubmitForm:
389 if (m_pFormActionHandler) {
390 m_pFormActionHandler->DoAction_SubmitForm(action, pDocument);
391 }
392 break;
393 case CPDF_Action::ResetForm:
394 if (m_pFormActionHandler) {
395 m_pFormActionHandler->DoAction_ResetForm(action, pDocument);
396 }
397 break;
398 case CPDF_Action::ImportData:
399 if (m_pFormActionHandler) {
400 m_pFormActionHandler->DoAction_ImportData(action, pDocument);
401 }
402 break;
403 case CPDF_Action::JavaScript:
404 ASSERT(FALSE);
405 break;
406 case CPDF_Action::SetOCGState:
407 DoAction_SetOCGState(pDocument, action);
408 break;
409 case CPDF_Action::Rendition:
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700410 break;
411 case CPDF_Action::Trans:
412 break;
413 case CPDF_Action::GoTo3DView:
414 break;
415 default:
416 break;
417 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700418}
419
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700420FX_BOOL CPDFSDK_ActionHandler::IsValidDocView(CPDFSDK_Document* pDocument) {
Dan Sinclair2b11dc12015-10-22 15:02:06 -0400421 ASSERT(pDocument);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700422 return TRUE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700423}
424
Tom Sepez7b5bc262015-03-05 16:44:22 -0800425void CPDFSDK_ActionHandler::DoAction_GoTo(CPDFSDK_Document* pDocument,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700426 const CPDF_Action& action) {
Wei Li0fc6b252016-03-01 16:29:41 -0800427 ASSERT(action.GetDict());
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700428
Tom Sepez50d12ad2015-11-24 09:50:51 -0800429 CPDF_Document* pPDFDocument = pDocument->GetPDFDocument();
Dan Sinclair2b11dc12015-10-22 15:02:06 -0400430 ASSERT(pPDFDocument);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700431
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700432 CPDF_Dest MyDest = action.GetDest(pPDFDocument);
433 int nPageIndex = MyDest.GetPageIndex(pPDFDocument);
434 int nFitType = MyDest.GetZoomMode();
Dan Sinclair2b11dc12015-10-22 15:02:06 -0400435 const CPDF_Array* pMyArray = ToArray(MyDest.GetObject());
436 float* pPosAry = nullptr;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700437 int sizeOfAry = 0;
Dan Sinclair2b11dc12015-10-22 15:02:06 -0400438 if (pMyArray) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700439 pPosAry = new float[pMyArray->GetCount()];
440 int j = 0;
441 for (int i = 2; i < (int)pMyArray->GetCount(); i++) {
Wei Li9b761132016-01-29 15:44:20 -0800442 pPosAry[j++] = pMyArray->GetFloatAt(i);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700443 }
444 sizeOfAry = j;
445 }
Dan Sinclair2b11dc12015-10-22 15:02:06 -0400446
447 CPDFDoc_Environment* pApp = pDocument->GetEnv();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700448 pApp->FFI_DoGoToAction(nPageIndex, nFitType, pPosAry, sizeOfAry);
Lei Zhangda180e92015-08-14 22:22:13 -0700449 delete[] pPosAry;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700450}
451
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700452void CPDFSDK_ActionHandler::DoAction_GoToR(CPDFSDK_Document* pDocument,
453 const CPDF_Action& action) {}
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700454
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700455void CPDFSDK_ActionHandler::DoAction_Launch(CPDFSDK_Document* pDocument,
456 const CPDF_Action& action) {}
457
458void CPDFSDK_ActionHandler::DoAction_URI(CPDFSDK_Document* pDocument,
459 const CPDF_Action& action) {
Wei Li0fc6b252016-03-01 16:29:41 -0800460 ASSERT(action.GetDict());
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700461
462 CPDFDoc_Environment* pApp = pDocument->GetEnv();
Tom Sepez50d12ad2015-11-24 09:50:51 -0800463 CFX_ByteString sURI = action.GetURI(pDocument->GetPDFDocument());
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700464 pApp->FFI_DoURIAction(sURI.c_str());
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700465}
466
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700467void CPDFSDK_ActionHandler::DoAction_Named(CPDFSDK_Document* pDocument,
468 const CPDF_Action& action) {
Wei Li0fc6b252016-03-01 16:29:41 -0800469 ASSERT(action.GetDict());
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700470
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700471 CFX_ByteString csName = action.GetNamedAction();
472 pDocument->GetEnv()->FFI_ExecuteNamedAction(csName);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700473}
474
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700475void CPDFSDK_ActionHandler::DoAction_SetOCGState(CPDFSDK_Document* pDocument,
476 const CPDF_Action& action) {}
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700477
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700478void CPDFSDK_ActionHandler::RunFieldJavaScript(CPDFSDK_Document* pDocument,
479 CPDF_FormField* pFormField,
480 CPDF_AAction::AActionType type,
481 PDFSDK_FieldAction& data,
482 const CFX_WideString& script) {
483 ASSERT(type != CPDF_AAction::Calculate);
484 ASSERT(type != CPDF_AAction::Format);
Tom Sepezd7e5cc72015-06-10 14:33:37 -0700485
Tom Sepezba038bc2015-10-08 12:03:00 -0700486 IJS_Runtime* pRuntime = pDocument->GetJsRuntime();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700487 pRuntime->SetReaderDocument(pDocument);
488
Tom Sepezba038bc2015-10-08 12:03:00 -0700489 IJS_Context* pContext = pRuntime->NewContext();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700490 switch (type) {
491 case CPDF_AAction::CursorEnter:
492 pContext->OnField_MouseEnter(data.bModifier, data.bShift, pFormField);
493 break;
494 case CPDF_AAction::CursorExit:
495 pContext->OnField_MouseExit(data.bModifier, data.bShift, pFormField);
496 break;
497 case CPDF_AAction::ButtonDown:
498 pContext->OnField_MouseDown(data.bModifier, data.bShift, pFormField);
499 break;
500 case CPDF_AAction::ButtonUp:
501 pContext->OnField_MouseUp(data.bModifier, data.bShift, pFormField);
502 break;
503 case CPDF_AAction::GetFocus:
504 pContext->OnField_Focus(data.bModifier, data.bShift, pFormField,
505 data.sValue);
506 break;
507 case CPDF_AAction::LoseFocus:
508 pContext->OnField_Blur(data.bModifier, data.bShift, pFormField,
509 data.sValue);
510 break;
511 case CPDF_AAction::KeyStroke:
512 pContext->OnField_Keystroke(data.sChange, data.sChangeEx, data.bKeyDown,
513 data.bModifier, data.nSelEnd, data.nSelStart,
514 data.bShift, pFormField, data.sValue,
515 data.bWillCommit, data.bFieldFull, data.bRC);
516 break;
517 case CPDF_AAction::Validate:
518 pContext->OnField_Validate(data.sChange, data.sChangeEx, data.bKeyDown,
519 data.bModifier, data.bShift, pFormField,
520 data.sValue, data.bRC);
521 break;
522 default:
523 ASSERT(FALSE);
524 break;
525 }
526
527 CFX_WideString csInfo;
Tom Sepez33420902015-10-13 15:00:10 -0700528 FX_BOOL bRet = pContext->RunScript(script, &csInfo);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700529 if (!bRet) {
Tom Sepez33420902015-10-13 15:00:10 -0700530 // FIXME: return error.
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700531 }
532
533 pRuntime->ReleaseContext(pContext);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700534}
535
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700536void CPDFSDK_ActionHandler::RunDocumentOpenJavaScript(
537 CPDFSDK_Document* pDocument,
538 const CFX_WideString& sScriptName,
539 const CFX_WideString& script) {
Tom Sepezba038bc2015-10-08 12:03:00 -0700540 IJS_Runtime* pRuntime = pDocument->GetJsRuntime();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700541 pRuntime->SetReaderDocument(pDocument);
Tom Sepezba038bc2015-10-08 12:03:00 -0700542 IJS_Context* pContext = pRuntime->NewContext();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700543 pContext->OnDoc_Open(pDocument, sScriptName);
544
545 CFX_WideString csInfo;
Tom Sepez33420902015-10-13 15:00:10 -0700546 FX_BOOL bRet = pContext->RunScript(script, &csInfo);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700547 if (!bRet) {
Tom Sepez33420902015-10-13 15:00:10 -0700548 // FIXME: return error.
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700549 }
550
551 pRuntime->ReleaseContext(pContext);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700552}
553
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700554void CPDFSDK_ActionHandler::RunDocumentPageJavaScript(
555 CPDFSDK_Document* pDocument,
556 CPDF_AAction::AActionType type,
557 const CFX_WideString& script) {
Tom Sepezba038bc2015-10-08 12:03:00 -0700558 IJS_Runtime* pRuntime = pDocument->GetJsRuntime();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700559 pRuntime->SetReaderDocument(pDocument);
560
Tom Sepezba038bc2015-10-08 12:03:00 -0700561 IJS_Context* pContext = pRuntime->NewContext();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700562 switch (type) {
563 case CPDF_AAction::OpenPage:
564 pContext->OnPage_Open(pDocument);
565 break;
566 case CPDF_AAction::ClosePage:
567 pContext->OnPage_Close(pDocument);
568 break;
569 case CPDF_AAction::CloseDocument:
570 pContext->OnDoc_WillClose(pDocument);
571 break;
572 case CPDF_AAction::SaveDocument:
573 pContext->OnDoc_WillSave(pDocument);
574 break;
575 case CPDF_AAction::DocumentSaved:
576 pContext->OnDoc_DidSave(pDocument);
577 break;
578 case CPDF_AAction::PrintDocument:
579 pContext->OnDoc_WillPrint(pDocument);
580 break;
581 case CPDF_AAction::DocumentPrinted:
582 pContext->OnDoc_DidPrint(pDocument);
583 break;
584 case CPDF_AAction::PageVisible:
585 pContext->OnPage_InView(pDocument);
586 break;
587 case CPDF_AAction::PageInvisible:
588 pContext->OnPage_OutView(pDocument);
589 break;
590 default:
591 ASSERT(FALSE);
592 break;
593 }
594
595 CFX_WideString csInfo;
Tom Sepez33420902015-10-13 15:00:10 -0700596 FX_BOOL bRet = pContext->RunScript(script, &csInfo);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700597 if (!bRet) {
Tom Sepez33420902015-10-13 15:00:10 -0700598 // FIXME: return error.
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700599 }
600
601 pRuntime->ReleaseContext(pContext);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700602}
603
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700604FX_BOOL CPDFSDK_FormActionHandler::DoAction_Hide(const CPDF_Action& action,
605 CPDFSDK_Document* pDocument) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700606 CPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)pDocument->GetInterForm();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700607 if (pInterForm->DoAction_Hide(action)) {
608 pDocument->SetChangeMark();
609 return TRUE;
610 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700611
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700612 return FALSE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700613}
614
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700615FX_BOOL CPDFSDK_FormActionHandler::DoAction_SubmitForm(
616 const CPDF_Action& action,
617 CPDFSDK_Document* pDocument) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700618 CPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)pDocument->GetInterForm();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700619 return pInterForm->DoAction_SubmitForm(action);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700620}
621
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700622FX_BOOL CPDFSDK_FormActionHandler::DoAction_ResetForm(
623 const CPDF_Action& action,
624 CPDFSDK_Document* pDocument) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700625 CPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)pDocument->GetInterForm();
Lei Zhang96660d62015-12-14 18:27:25 -0800626 return pInterForm->DoAction_ResetForm(action);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700627}
628
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700629FX_BOOL CPDFSDK_FormActionHandler::DoAction_ImportData(
630 const CPDF_Action& action,
631 CPDFSDK_Document* pDocument) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700632 CPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)pDocument->GetInterForm();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700633 if (pInterForm->DoAction_ImportData(action)) {
634 pDocument->SetChangeMark();
635 return TRUE;
636 }
Tom Sepez7b5bc262015-03-05 16:44:22 -0800637
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700638 return FALSE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700639}