blob: ebcaf354ada0e818106ea087a95f75f62f8add5f [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"
dsinclair64376be2016-03-31 20:03:24 -070014#include "fpdfsdk/javascript/ijs_context.h"
15#include "fpdfsdk/javascript/ijs_runtime.h"
Tom Sepez6c7508b2016-01-20 14:59:25 -080016#include "third_party/base/stl_util.h"
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070017
Tom Sepez3b5f1242015-09-01 14:06:55 -070018CPDFSDK_ActionHandler::CPDFSDK_ActionHandler()
Dan Sinclairf766ad22016-03-14 13:51:24 -040019 : m_pFormActionHandler(new CPDFSDK_FormActionHandler) {}
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070020
Nico Weber9d8ec5a2015-08-04 13:00:21 -070021FX_BOOL CPDFSDK_ActionHandler::DoAction_DocOpen(const CPDF_Action& action,
22 CPDFSDK_Document* pDocument) {
Tom Sepez6c7508b2016-01-20 14:59:25 -080023 std::set<CPDF_Dictionary*> visited;
24 return ExecuteDocumentOpenAction(action, pDocument, &visited);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070025}
26
Nico Weber9d8ec5a2015-08-04 13:00:21 -070027FX_BOOL CPDFSDK_ActionHandler::DoAction_JavaScript(
28 const CPDF_Action& JsAction,
29 CFX_WideString csJSName,
30 CPDFSDK_Document* pDocument) {
31 if (JsAction.GetType() == CPDF_Action::JavaScript) {
32 CFX_WideString swJS = JsAction.GetJavaScript();
33 if (!swJS.IsEmpty()) {
34 RunDocumentOpenJavaScript(pDocument, csJSName, swJS);
35 return TRUE;
36 }
37 }
38
39 return FALSE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070040}
41
Nico Weber9d8ec5a2015-08-04 13:00:21 -070042FX_BOOL CPDFSDK_ActionHandler::DoAction_FieldJavaScript(
43 const CPDF_Action& JsAction,
44 CPDF_AAction::AActionType type,
45 CPDFSDK_Document* pDocument,
46 CPDF_FormField* pFormField,
47 PDFSDK_FieldAction& data) {
48 CPDFDoc_Environment* pEnv = pDocument->GetEnv();
49 ASSERT(pEnv);
50 if (pEnv->IsJSInitiated() && JsAction.GetType() == CPDF_Action::JavaScript) {
51 CFX_WideString swJS = JsAction.GetJavaScript();
52 if (!swJS.IsEmpty()) {
53 RunFieldJavaScript(pDocument, pFormField, type, data, swJS);
54 return TRUE;
55 }
56 }
57 return FALSE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070058}
59
Nico Weber9d8ec5a2015-08-04 13:00:21 -070060FX_BOOL CPDFSDK_ActionHandler::DoAction_Page(
61 const CPDF_Action& action,
62 enum CPDF_AAction::AActionType eType,
63 CPDFSDK_Document* pDocument) {
Tom Sepez6c7508b2016-01-20 14:59:25 -080064 std::set<CPDF_Dictionary*> visited;
65 return ExecuteDocumentPageAction(action, eType, pDocument, &visited);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070066}
67
Nico Weber9d8ec5a2015-08-04 13:00:21 -070068FX_BOOL CPDFSDK_ActionHandler::DoAction_Document(
69 const CPDF_Action& action,
70 enum CPDF_AAction::AActionType eType,
71 CPDFSDK_Document* pDocument) {
Tom Sepez6c7508b2016-01-20 14:59:25 -080072 std::set<CPDF_Dictionary*> visited;
73 return ExecuteDocumentPageAction(action, eType, pDocument, &visited);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070074}
75
Nico Weber9d8ec5a2015-08-04 13:00:21 -070076FX_BOOL CPDFSDK_ActionHandler::DoAction_BookMark(CPDF_Bookmark* pBookMark,
77 const CPDF_Action& action,
78 CPDF_AAction::AActionType type,
79 CPDFSDK_Document* pDocument) {
Tom Sepez6c7508b2016-01-20 14:59:25 -080080 std::set<CPDF_Dictionary*> visited;
81 return ExecuteBookMark(action, pDocument, pBookMark, &visited);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070082}
83
Nico Weber9d8ec5a2015-08-04 13:00:21 -070084FX_BOOL CPDFSDK_ActionHandler::DoAction_Screen(const CPDF_Action& action,
85 CPDF_AAction::AActionType type,
86 CPDFSDK_Document* pDocument,
87 CPDFSDK_Annot* pScreen) {
Tom Sepez6c7508b2016-01-20 14:59:25 -080088 std::set<CPDF_Dictionary*> visited;
89 return ExecuteScreenAction(action, type, pDocument, pScreen, &visited);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070090}
91
Nico Weber9d8ec5a2015-08-04 13:00:21 -070092FX_BOOL CPDFSDK_ActionHandler::DoAction_Link(const CPDF_Action& action,
93 CPDFSDK_Document* pDocument) {
Tom Sepez6c7508b2016-01-20 14:59:25 -080094 std::set<CPDF_Dictionary*> visited;
95 return ExecuteLinkAction(action, pDocument, &visited);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070096}
97
Nico Weber9d8ec5a2015-08-04 13:00:21 -070098FX_BOOL CPDFSDK_ActionHandler::DoAction_Field(const CPDF_Action& action,
99 CPDF_AAction::AActionType type,
100 CPDFSDK_Document* pDocument,
101 CPDF_FormField* pFormField,
102 PDFSDK_FieldAction& data) {
Tom Sepez6c7508b2016-01-20 14:59:25 -0800103 std::set<CPDF_Dictionary*> visited;
104 return ExecuteFieldAction(action, type, pDocument, pFormField, data,
105 &visited);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700106}
107
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700108FX_BOOL CPDFSDK_ActionHandler::ExecuteDocumentOpenAction(
109 const CPDF_Action& action,
110 CPDFSDK_Document* pDocument,
Tom Sepez6c7508b2016-01-20 14:59:25 -0800111 std::set<CPDF_Dictionary*>* visited) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700112 CPDF_Dictionary* pDict = action.GetDict();
Tom Sepez6c7508b2016-01-20 14:59:25 -0800113 if (pdfium::ContainsKey(*visited, pDict))
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700114 return FALSE;
115
Tom Sepez6c7508b2016-01-20 14:59:25 -0800116 visited->insert(pDict);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700117
118 CPDFDoc_Environment* pEnv = pDocument->GetEnv();
119 ASSERT(pEnv);
120 if (action.GetType() == CPDF_Action::JavaScript) {
121 if (pEnv->IsJSInitiated()) {
122 CFX_WideString swJS = action.GetJavaScript();
123 if (!swJS.IsEmpty()) {
124 RunDocumentOpenJavaScript(pDocument, L"", swJS);
125 }
126 }
127 } else {
128 DoAction_NoJs(action, pDocument);
129 }
130
131 for (int32_t i = 0, sz = action.GetSubActionsCount(); i < sz; i++) {
132 CPDF_Action subaction = action.GetSubAction(i);
Tom Sepez6c7508b2016-01-20 14:59:25 -0800133 if (!ExecuteDocumentOpenAction(subaction, pDocument, visited))
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700134 return FALSE;
135 }
136
137 return TRUE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700138}
139
Tom Sepez6c7508b2016-01-20 14:59:25 -0800140FX_BOOL CPDFSDK_ActionHandler::ExecuteLinkAction(
141 const CPDF_Action& action,
142 CPDFSDK_Document* pDocument,
143 std::set<CPDF_Dictionary*>* visited) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700144 CPDF_Dictionary* pDict = action.GetDict();
Tom Sepez6c7508b2016-01-20 14:59:25 -0800145 if (pdfium::ContainsKey(*visited, pDict))
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700146 return FALSE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700147
Tom Sepez6c7508b2016-01-20 14:59:25 -0800148 visited->insert(pDict);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700149
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700150 CPDFDoc_Environment* pEnv = pDocument->GetEnv();
151 ASSERT(pEnv);
152 if (action.GetType() == CPDF_Action::JavaScript) {
153 if (pEnv->IsJSInitiated()) {
154 CFX_WideString swJS = action.GetJavaScript();
155 if (!swJS.IsEmpty()) {
Tom Sepez33420902015-10-13 15:00:10 -0700156 IJS_Runtime* pRuntime = pDocument->GetJsRuntime();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700157 pRuntime->SetReaderDocument(pDocument);
158
Tom Sepezba038bc2015-10-08 12:03:00 -0700159 IJS_Context* pContext = pRuntime->NewContext();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700160 pContext->OnLink_MouseUp(pDocument);
161
162 CFX_WideString csInfo;
Tom Sepez33420902015-10-13 15:00:10 -0700163 FX_BOOL bRet = pContext->RunScript(swJS, &csInfo);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700164 if (!bRet) {
165 // FIXME: return error.
166 }
167
168 pRuntime->ReleaseContext(pContext);
169 }
170 }
171 } else {
172 DoAction_NoJs(action, pDocument);
173 }
174
175 for (int32_t i = 0, sz = action.GetSubActionsCount(); i < sz; i++) {
176 CPDF_Action subaction = action.GetSubAction(i);
Tom Sepez6c7508b2016-01-20 14:59:25 -0800177 if (!ExecuteLinkAction(subaction, pDocument, visited))
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700178 return FALSE;
179 }
180
181 return TRUE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700182}
183
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700184FX_BOOL CPDFSDK_ActionHandler::ExecuteDocumentPageAction(
185 const CPDF_Action& action,
186 CPDF_AAction::AActionType type,
187 CPDFSDK_Document* pDocument,
Tom Sepez6c7508b2016-01-20 14:59:25 -0800188 std::set<CPDF_Dictionary*>* visited) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700189 CPDF_Dictionary* pDict = action.GetDict();
Tom Sepez6c7508b2016-01-20 14:59:25 -0800190 if (pdfium::ContainsKey(*visited, pDict))
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700191 return FALSE;
Tom Sepez7b5bc262015-03-05 16:44:22 -0800192
Tom Sepez6c7508b2016-01-20 14:59:25 -0800193 visited->insert(pDict);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700194
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700195 CPDFDoc_Environment* pEnv = pDocument->GetEnv();
196 ASSERT(pEnv);
197 if (action.GetType() == CPDF_Action::JavaScript) {
198 if (pEnv->IsJSInitiated()) {
199 CFX_WideString swJS = action.GetJavaScript();
200 if (!swJS.IsEmpty()) {
201 RunDocumentPageJavaScript(pDocument, type, swJS);
202 }
203 }
204 } else {
205 DoAction_NoJs(action, pDocument);
206 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700207
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700208 if (!IsValidDocView(pDocument))
209 return FALSE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700210
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700211 for (int32_t i = 0, sz = action.GetSubActionsCount(); i < sz; i++) {
212 CPDF_Action subaction = action.GetSubAction(i);
Tom Sepez6c7508b2016-01-20 14:59:25 -0800213 if (!ExecuteDocumentPageAction(subaction, type, pDocument, visited))
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700214 return FALSE;
215 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700216
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700217 return TRUE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700218}
219
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700220FX_BOOL CPDFSDK_ActionHandler::IsValidField(CPDFSDK_Document* pDocument,
221 CPDF_Dictionary* pFieldDict) {
Lei Zhang96660d62015-12-14 18:27:25 -0800222 ASSERT(pFieldDict);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700223
Chris Palmer9047b8b2014-08-06 14:17:45 -0700224 CPDFSDK_InterForm* pInterForm = pDocument->GetInterForm();
Chris Palmer9047b8b2014-08-06 14:17:45 -0700225 CPDF_InterForm* pPDFInterForm = pInterForm->GetInterForm();
Chris Palmer9047b8b2014-08-06 14:17:45 -0700226 return pPDFInterForm->GetFieldByDict(pFieldDict) != NULL;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700227}
228
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700229FX_BOOL CPDFSDK_ActionHandler::ExecuteFieldAction(
230 const CPDF_Action& action,
231 CPDF_AAction::AActionType type,
232 CPDFSDK_Document* pDocument,
233 CPDF_FormField* pFormField,
234 PDFSDK_FieldAction& data,
Tom Sepez6c7508b2016-01-20 14:59:25 -0800235 std::set<CPDF_Dictionary*>* visited) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700236 CPDF_Dictionary* pDict = action.GetDict();
Tom Sepez6c7508b2016-01-20 14:59:25 -0800237 if (pdfium::ContainsKey(*visited, pDict))
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700238 return FALSE;
Tom Sepez7b5bc262015-03-05 16:44:22 -0800239
Tom Sepez6c7508b2016-01-20 14:59:25 -0800240 visited->insert(pDict);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700241
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700242 CPDFDoc_Environment* pEnv = pDocument->GetEnv();
243 ASSERT(pEnv);
244 if (action.GetType() == CPDF_Action::JavaScript) {
245 if (pEnv->IsJSInitiated()) {
246 CFX_WideString swJS = action.GetJavaScript();
247 if (!swJS.IsEmpty()) {
248 RunFieldJavaScript(pDocument, pFormField, type, data, swJS);
249 if (!IsValidField(pDocument, pFormField->GetFieldDict()))
250 return FALSE;
251 }
252 }
253 } else {
254 DoAction_NoJs(action, pDocument);
255 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700256
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700257 for (int32_t i = 0, sz = action.GetSubActionsCount(); i < sz; i++) {
258 CPDF_Action subaction = action.GetSubAction(i);
Tom Sepez6c7508b2016-01-20 14:59:25 -0800259 if (!ExecuteFieldAction(subaction, type, pDocument, pFormField, data,
260 visited))
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700261 return FALSE;
262 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700263
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700264 return TRUE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700265}
266
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700267FX_BOOL CPDFSDK_ActionHandler::ExecuteScreenAction(
268 const CPDF_Action& action,
269 CPDF_AAction::AActionType type,
270 CPDFSDK_Document* pDocument,
271 CPDFSDK_Annot* pScreen,
Tom Sepez6c7508b2016-01-20 14:59:25 -0800272 std::set<CPDF_Dictionary*>* visited) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700273 CPDF_Dictionary* pDict = action.GetDict();
Tom Sepez6c7508b2016-01-20 14:59:25 -0800274 if (pdfium::ContainsKey(*visited, pDict))
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700275 return FALSE;
Tom Sepez7b5bc262015-03-05 16:44:22 -0800276
Tom Sepez6c7508b2016-01-20 14:59:25 -0800277 visited->insert(pDict);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700278
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700279 CPDFDoc_Environment* pEnv = pDocument->GetEnv();
280 ASSERT(pEnv);
281 if (action.GetType() == CPDF_Action::JavaScript) {
282 if (pEnv->IsJSInitiated()) {
283 CFX_WideString swJS = action.GetJavaScript();
284 if (!swJS.IsEmpty()) {
Tom Sepezba038bc2015-10-08 12:03:00 -0700285 IJS_Runtime* pRuntime = pDocument->GetJsRuntime();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700286 pRuntime->SetReaderDocument(pDocument);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700287
Tom Sepezba038bc2015-10-08 12:03:00 -0700288 IJS_Context* pContext = pRuntime->NewContext();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700289 CFX_WideString csInfo;
Tom Sepez33420902015-10-13 15:00:10 -0700290 FX_BOOL bRet = pContext->RunScript(swJS, &csInfo);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700291 if (!bRet) {
Tom Sepez33420902015-10-13 15:00:10 -0700292 // FIXME: return error.
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700293 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700294
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700295 pRuntime->ReleaseContext(pContext);
296 }
297 }
298 } else {
299 DoAction_NoJs(action, pDocument);
300 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700301
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700302 for (int32_t i = 0, sz = action.GetSubActionsCount(); i < sz; i++) {
303 CPDF_Action subaction = action.GetSubAction(i);
Tom Sepez6c7508b2016-01-20 14:59:25 -0800304 if (!ExecuteScreenAction(subaction, type, pDocument, pScreen, visited))
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700305 return FALSE;
306 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700307
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700308 return TRUE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700309}
310
Tom Sepez6c7508b2016-01-20 14:59:25 -0800311FX_BOOL CPDFSDK_ActionHandler::ExecuteBookMark(
312 const CPDF_Action& action,
313 CPDFSDK_Document* pDocument,
314 CPDF_Bookmark* pBookmark,
315 std::set<CPDF_Dictionary*>* visited) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700316 CPDF_Dictionary* pDict = action.GetDict();
Tom Sepez6c7508b2016-01-20 14:59:25 -0800317 if (pdfium::ContainsKey(*visited, pDict))
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700318 return FALSE;
Tom Sepez7b5bc262015-03-05 16:44:22 -0800319
Tom Sepez6c7508b2016-01-20 14:59:25 -0800320 visited->insert(pDict);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700321
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700322 CPDFDoc_Environment* pEnv = pDocument->GetEnv();
323 ASSERT(pEnv);
324 if (action.GetType() == CPDF_Action::JavaScript) {
325 if (pEnv->IsJSInitiated()) {
326 CFX_WideString swJS = action.GetJavaScript();
327 if (!swJS.IsEmpty()) {
Tom Sepezba038bc2015-10-08 12:03:00 -0700328 IJS_Runtime* pRuntime = pDocument->GetJsRuntime();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700329 pRuntime->SetReaderDocument(pDocument);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700330
Tom Sepezba038bc2015-10-08 12:03:00 -0700331 IJS_Context* pContext = pRuntime->NewContext();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700332 pContext->OnBookmark_MouseUp(pBookmark);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700333
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700334 CFX_WideString csInfo;
Tom Sepez33420902015-10-13 15:00:10 -0700335 FX_BOOL bRet = pContext->RunScript(swJS, &csInfo);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700336 if (!bRet) {
Tom Sepez33420902015-10-13 15:00:10 -0700337 // FIXME: return error.
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700338 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700339
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700340 pRuntime->ReleaseContext(pContext);
341 }
342 }
343 } else {
344 DoAction_NoJs(action, pDocument);
345 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700346
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700347 for (int32_t i = 0, sz = action.GetSubActionsCount(); i < sz; i++) {
348 CPDF_Action subaction = action.GetSubAction(i);
Tom Sepez6c7508b2016-01-20 14:59:25 -0800349 if (!ExecuteBookMark(subaction, pDocument, pBookmark, visited))
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700350 return FALSE;
351 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700352
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700353 return TRUE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700354}
355
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700356void CPDFSDK_ActionHandler::DoAction_NoJs(const CPDF_Action& action,
357 CPDFSDK_Document* pDocument) {
Lei Zhang96660d62015-12-14 18:27:25 -0800358 ASSERT(pDocument);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700359
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700360 switch (action.GetType()) {
361 case CPDF_Action::GoTo:
362 DoAction_GoTo(pDocument, action);
363 break;
364 case CPDF_Action::GoToR:
365 DoAction_GoToR(pDocument, action);
366 break;
367 case CPDF_Action::GoToE:
368 break;
369 case CPDF_Action::Launch:
370 DoAction_Launch(pDocument, action);
371 break;
372 case CPDF_Action::Thread:
373 break;
374 case CPDF_Action::URI:
375 DoAction_URI(pDocument, action);
376 break;
377 case CPDF_Action::Sound:
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700378 break;
379 case CPDF_Action::Movie:
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700380 break;
381 case CPDF_Action::Hide:
382 if (m_pFormActionHandler) {
383 m_pFormActionHandler->DoAction_Hide(action, pDocument);
384 }
385 break;
386 case CPDF_Action::Named:
387 DoAction_Named(pDocument, action);
388 break;
389 case CPDF_Action::SubmitForm:
390 if (m_pFormActionHandler) {
391 m_pFormActionHandler->DoAction_SubmitForm(action, pDocument);
392 }
393 break;
394 case CPDF_Action::ResetForm:
395 if (m_pFormActionHandler) {
396 m_pFormActionHandler->DoAction_ResetForm(action, pDocument);
397 }
398 break;
399 case CPDF_Action::ImportData:
400 if (m_pFormActionHandler) {
401 m_pFormActionHandler->DoAction_ImportData(action, pDocument);
402 }
403 break;
404 case CPDF_Action::JavaScript:
405 ASSERT(FALSE);
406 break;
407 case CPDF_Action::SetOCGState:
408 DoAction_SetOCGState(pDocument, action);
409 break;
410 case CPDF_Action::Rendition:
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700411 break;
412 case CPDF_Action::Trans:
413 break;
414 case CPDF_Action::GoTo3DView:
415 break;
416 default:
417 break;
418 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700419}
420
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700421FX_BOOL CPDFSDK_ActionHandler::IsValidDocView(CPDFSDK_Document* pDocument) {
Dan Sinclair2b11dc12015-10-22 15:02:06 -0400422 ASSERT(pDocument);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700423 return TRUE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700424}
425
Tom Sepez7b5bc262015-03-05 16:44:22 -0800426void CPDFSDK_ActionHandler::DoAction_GoTo(CPDFSDK_Document* pDocument,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700427 const CPDF_Action& action) {
Wei Li0fc6b252016-03-01 16:29:41 -0800428 ASSERT(action.GetDict());
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700429
Tom Sepez50d12ad2015-11-24 09:50:51 -0800430 CPDF_Document* pPDFDocument = pDocument->GetPDFDocument();
Dan Sinclair2b11dc12015-10-22 15:02:06 -0400431 ASSERT(pPDFDocument);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700432
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700433 CPDF_Dest MyDest = action.GetDest(pPDFDocument);
434 int nPageIndex = MyDest.GetPageIndex(pPDFDocument);
435 int nFitType = MyDest.GetZoomMode();
Dan Sinclair2b11dc12015-10-22 15:02:06 -0400436 const CPDF_Array* pMyArray = ToArray(MyDest.GetObject());
437 float* pPosAry = nullptr;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700438 int sizeOfAry = 0;
Dan Sinclair2b11dc12015-10-22 15:02:06 -0400439 if (pMyArray) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700440 pPosAry = new float[pMyArray->GetCount()];
441 int j = 0;
442 for (int i = 2; i < (int)pMyArray->GetCount(); i++) {
Wei Li9b761132016-01-29 15:44:20 -0800443 pPosAry[j++] = pMyArray->GetFloatAt(i);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700444 }
445 sizeOfAry = j;
446 }
Dan Sinclair2b11dc12015-10-22 15:02:06 -0400447
448 CPDFDoc_Environment* pApp = pDocument->GetEnv();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700449 pApp->FFI_DoGoToAction(nPageIndex, nFitType, pPosAry, sizeOfAry);
Lei Zhangda180e92015-08-14 22:22:13 -0700450 delete[] pPosAry;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700451}
452
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700453void CPDFSDK_ActionHandler::DoAction_GoToR(CPDFSDK_Document* pDocument,
454 const CPDF_Action& action) {}
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700455
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700456void CPDFSDK_ActionHandler::DoAction_Launch(CPDFSDK_Document* pDocument,
457 const CPDF_Action& action) {}
458
459void CPDFSDK_ActionHandler::DoAction_URI(CPDFSDK_Document* pDocument,
460 const CPDF_Action& action) {
Wei Li0fc6b252016-03-01 16:29:41 -0800461 ASSERT(action.GetDict());
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700462
463 CPDFDoc_Environment* pApp = pDocument->GetEnv();
Tom Sepez50d12ad2015-11-24 09:50:51 -0800464 CFX_ByteString sURI = action.GetURI(pDocument->GetPDFDocument());
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700465 pApp->FFI_DoURIAction(sURI.c_str());
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700466}
467
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700468void CPDFSDK_ActionHandler::DoAction_Named(CPDFSDK_Document* pDocument,
469 const CPDF_Action& action) {
Wei Li0fc6b252016-03-01 16:29:41 -0800470 ASSERT(action.GetDict());
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700471
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700472 CFX_ByteString csName = action.GetNamedAction();
473 pDocument->GetEnv()->FFI_ExecuteNamedAction(csName);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700474}
475
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700476void CPDFSDK_ActionHandler::DoAction_SetOCGState(CPDFSDK_Document* pDocument,
477 const CPDF_Action& action) {}
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700478
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700479void CPDFSDK_ActionHandler::RunFieldJavaScript(CPDFSDK_Document* pDocument,
480 CPDF_FormField* pFormField,
481 CPDF_AAction::AActionType type,
482 PDFSDK_FieldAction& data,
483 const CFX_WideString& script) {
484 ASSERT(type != CPDF_AAction::Calculate);
485 ASSERT(type != CPDF_AAction::Format);
Tom Sepezd7e5cc72015-06-10 14:33:37 -0700486
Tom Sepezba038bc2015-10-08 12:03:00 -0700487 IJS_Runtime* pRuntime = pDocument->GetJsRuntime();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700488 pRuntime->SetReaderDocument(pDocument);
489
Tom Sepezba038bc2015-10-08 12:03:00 -0700490 IJS_Context* pContext = pRuntime->NewContext();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700491 switch (type) {
492 case CPDF_AAction::CursorEnter:
493 pContext->OnField_MouseEnter(data.bModifier, data.bShift, pFormField);
494 break;
495 case CPDF_AAction::CursorExit:
496 pContext->OnField_MouseExit(data.bModifier, data.bShift, pFormField);
497 break;
498 case CPDF_AAction::ButtonDown:
499 pContext->OnField_MouseDown(data.bModifier, data.bShift, pFormField);
500 break;
501 case CPDF_AAction::ButtonUp:
502 pContext->OnField_MouseUp(data.bModifier, data.bShift, pFormField);
503 break;
504 case CPDF_AAction::GetFocus:
505 pContext->OnField_Focus(data.bModifier, data.bShift, pFormField,
506 data.sValue);
507 break;
508 case CPDF_AAction::LoseFocus:
509 pContext->OnField_Blur(data.bModifier, data.bShift, pFormField,
510 data.sValue);
511 break;
512 case CPDF_AAction::KeyStroke:
513 pContext->OnField_Keystroke(data.sChange, data.sChangeEx, data.bKeyDown,
514 data.bModifier, data.nSelEnd, data.nSelStart,
515 data.bShift, pFormField, data.sValue,
516 data.bWillCommit, data.bFieldFull, data.bRC);
517 break;
518 case CPDF_AAction::Validate:
519 pContext->OnField_Validate(data.sChange, data.sChangeEx, data.bKeyDown,
520 data.bModifier, data.bShift, pFormField,
521 data.sValue, data.bRC);
522 break;
523 default:
524 ASSERT(FALSE);
525 break;
526 }
527
528 CFX_WideString csInfo;
Tom Sepez33420902015-10-13 15:00:10 -0700529 FX_BOOL bRet = pContext->RunScript(script, &csInfo);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700530 if (!bRet) {
Tom Sepez33420902015-10-13 15:00:10 -0700531 // FIXME: return error.
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700532 }
533
534 pRuntime->ReleaseContext(pContext);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700535}
536
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700537void CPDFSDK_ActionHandler::RunDocumentOpenJavaScript(
538 CPDFSDK_Document* pDocument,
539 const CFX_WideString& sScriptName,
540 const CFX_WideString& script) {
Tom Sepezba038bc2015-10-08 12:03:00 -0700541 IJS_Runtime* pRuntime = pDocument->GetJsRuntime();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700542 pRuntime->SetReaderDocument(pDocument);
Tom Sepezba038bc2015-10-08 12:03:00 -0700543 IJS_Context* pContext = pRuntime->NewContext();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700544 pContext->OnDoc_Open(pDocument, sScriptName);
545
546 CFX_WideString csInfo;
Tom Sepez33420902015-10-13 15:00:10 -0700547 FX_BOOL bRet = pContext->RunScript(script, &csInfo);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700548 if (!bRet) {
Tom Sepez33420902015-10-13 15:00:10 -0700549 // FIXME: return error.
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700550 }
551
552 pRuntime->ReleaseContext(pContext);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700553}
554
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700555void CPDFSDK_ActionHandler::RunDocumentPageJavaScript(
556 CPDFSDK_Document* pDocument,
557 CPDF_AAction::AActionType type,
558 const CFX_WideString& script) {
Tom Sepezba038bc2015-10-08 12:03:00 -0700559 IJS_Runtime* pRuntime = pDocument->GetJsRuntime();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700560 pRuntime->SetReaderDocument(pDocument);
561
Tom Sepezba038bc2015-10-08 12:03:00 -0700562 IJS_Context* pContext = pRuntime->NewContext();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700563 switch (type) {
564 case CPDF_AAction::OpenPage:
565 pContext->OnPage_Open(pDocument);
566 break;
567 case CPDF_AAction::ClosePage:
568 pContext->OnPage_Close(pDocument);
569 break;
570 case CPDF_AAction::CloseDocument:
571 pContext->OnDoc_WillClose(pDocument);
572 break;
573 case CPDF_AAction::SaveDocument:
574 pContext->OnDoc_WillSave(pDocument);
575 break;
576 case CPDF_AAction::DocumentSaved:
577 pContext->OnDoc_DidSave(pDocument);
578 break;
579 case CPDF_AAction::PrintDocument:
580 pContext->OnDoc_WillPrint(pDocument);
581 break;
582 case CPDF_AAction::DocumentPrinted:
583 pContext->OnDoc_DidPrint(pDocument);
584 break;
585 case CPDF_AAction::PageVisible:
586 pContext->OnPage_InView(pDocument);
587 break;
588 case CPDF_AAction::PageInvisible:
589 pContext->OnPage_OutView(pDocument);
590 break;
591 default:
592 ASSERT(FALSE);
593 break;
594 }
595
596 CFX_WideString csInfo;
Tom Sepez33420902015-10-13 15:00:10 -0700597 FX_BOOL bRet = pContext->RunScript(script, &csInfo);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700598 if (!bRet) {
Tom Sepez33420902015-10-13 15:00:10 -0700599 // FIXME: return error.
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700600 }
601
602 pRuntime->ReleaseContext(pContext);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700603}
604
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700605FX_BOOL CPDFSDK_FormActionHandler::DoAction_Hide(const CPDF_Action& action,
606 CPDFSDK_Document* pDocument) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700607 CPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)pDocument->GetInterForm();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700608 if (pInterForm->DoAction_Hide(action)) {
609 pDocument->SetChangeMark();
610 return TRUE;
611 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700612
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700613 return FALSE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700614}
615
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700616FX_BOOL CPDFSDK_FormActionHandler::DoAction_SubmitForm(
617 const CPDF_Action& action,
618 CPDFSDK_Document* pDocument) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700619 CPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)pDocument->GetInterForm();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700620 return pInterForm->DoAction_SubmitForm(action);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700621}
622
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700623FX_BOOL CPDFSDK_FormActionHandler::DoAction_ResetForm(
624 const CPDF_Action& action,
625 CPDFSDK_Document* pDocument) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700626 CPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)pDocument->GetInterForm();
Lei Zhang96660d62015-12-14 18:27:25 -0800627 return pInterForm->DoAction_ResetForm(action);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700628}
629
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700630FX_BOOL CPDFSDK_FormActionHandler::DoAction_ImportData(
631 const CPDF_Action& action,
632 CPDFSDK_Document* pDocument) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700633 CPDFSDK_InterForm* pInterForm = (CPDFSDK_InterForm*)pDocument->GetInterForm();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700634 if (pInterForm->DoAction_ImportData(action)) {
635 pDocument->SetChangeMark();
636 return TRUE;
637 }
Tom Sepez7b5bc262015-03-05 16:44:22 -0800638
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700639 return FALSE;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700640}