blob: 64d82b93bab1006560a5eef274bffc2c49de6734 [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
Dan Sinclair7d125322018-03-28 18:49:34 +00007#include "fpdfsdk/cpdfsdk_actionhandler.h"
Dan Sinclair3ebd1212016-03-09 09:59:23 -05008
9#include <set>
Tom Sepezd7188f72017-05-02 15:10:58 -070010#include <vector>
Dan Sinclair3ebd1212016-03-09 09:59:23 -050011
dsinclair488b7ad2016-10-04 11:55:50 -070012#include "core/fpdfapi/parser/cpdf_array.h"
dsinclair1727aee2016-09-29 13:12:56 -070013#include "core/fpdfdoc/cpdf_formfield.h"
14#include "core/fpdfdoc/cpdf_interform.h"
dsinclair735606d2016-10-05 15:47:02 -070015#include "fpdfsdk/cpdfsdk_formfillenvironment.h"
Dan Sinclair00d47a62018-03-28 18:39:04 +000016#include "fpdfsdk/cpdfsdk_helpers.h"
dsinclair114e46a2016-09-29 17:18:21 -070017#include "fpdfsdk/cpdfsdk_interform.h"
Dan Sinclaire0345a42017-10-30 20:20:42 +000018#include "fxjs/ijs_event_context.h"
19#include "fxjs/ijs_runtime.h"
Lei Zhangb45324b2017-05-22 17:05:40 -070020#include "third_party/base/logging.h"
Tom Sepez6c7508b2016-01-20 14:59:25 -080021#include "third_party/base/stl_util.h"
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070022
tsepez4cf55152016-11-02 14:37:54 -070023bool CPDFSDK_ActionHandler::DoAction_DocOpen(
dsinclair19c198b2016-10-11 12:51:37 -070024 const CPDF_Action& action,
25 CPDFSDK_FormFillEnvironment* pFormFillEnv) {
Lei Zhang5cee3f22018-05-25 21:48:49 +000026 std::set<const CPDF_Dictionary*> visited;
dsinclair19c198b2016-10-11 12:51:37 -070027 return ExecuteDocumentOpenAction(action, pFormFillEnv, &visited);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070028}
29
tsepez4cf55152016-11-02 14:37:54 -070030bool CPDFSDK_ActionHandler::DoAction_JavaScript(
Nico Weber9d8ec5a2015-08-04 13:00:21 -070031 const CPDF_Action& JsAction,
Ryan Harrison275e2602017-09-18 14:23:18 -040032 WideString csJSName,
dsinclair19c198b2016-10-11 12:51:37 -070033 CPDFSDK_FormFillEnvironment* pFormFillEnv) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -070034 if (JsAction.GetType() == CPDF_Action::JavaScript) {
Ryan Harrison275e2602017-09-18 14:23:18 -040035 WideString swJS = JsAction.GetJavaScript();
Nico Weber9d8ec5a2015-08-04 13:00:21 -070036 if (!swJS.IsEmpty()) {
dsinclair19c198b2016-10-11 12:51:37 -070037 RunDocumentOpenJavaScript(pFormFillEnv, csJSName, swJS);
tsepez4cf55152016-11-02 14:37:54 -070038 return true;
Nico Weber9d8ec5a2015-08-04 13:00:21 -070039 }
40 }
41
tsepez4cf55152016-11-02 14:37:54 -070042 return false;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070043}
44
tsepez4cf55152016-11-02 14:37:54 -070045bool CPDFSDK_ActionHandler::DoAction_FieldJavaScript(
Nico Weber9d8ec5a2015-08-04 13:00:21 -070046 const CPDF_Action& JsAction,
47 CPDF_AAction::AActionType type,
dsinclair19c198b2016-10-11 12:51:37 -070048 CPDFSDK_FormFillEnvironment* pFormFillEnv,
Nico Weber9d8ec5a2015-08-04 13:00:21 -070049 CPDF_FormField* pFormField,
Dan Sinclair7d125322018-03-28 18:49:34 +000050 CPDFSDK_FieldAction* data) {
dsinclair19c198b2016-10-11 12:51:37 -070051 ASSERT(pFormFillEnv);
Tom Sepezf5ca90c2018-02-01 02:15:44 +000052 if (pFormFillEnv->IsJSPlatformPresent() &&
dsinclair19c198b2016-10-11 12:51:37 -070053 JsAction.GetType() == CPDF_Action::JavaScript) {
Ryan Harrison275e2602017-09-18 14:23:18 -040054 WideString swJS = JsAction.GetJavaScript();
Nico Weber9d8ec5a2015-08-04 13:00:21 -070055 if (!swJS.IsEmpty()) {
dsinclair19c198b2016-10-11 12:51:37 -070056 RunFieldJavaScript(pFormFillEnv, pFormField, type, data, swJS);
tsepez4cf55152016-11-02 14:37:54 -070057 return true;
Nico Weber9d8ec5a2015-08-04 13:00:21 -070058 }
59 }
tsepez4cf55152016-11-02 14:37:54 -070060 return false;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070061}
62
tsepez4cf55152016-11-02 14:37:54 -070063bool CPDFSDK_ActionHandler::DoAction_Page(
Nico Weber9d8ec5a2015-08-04 13:00:21 -070064 const CPDF_Action& action,
65 enum CPDF_AAction::AActionType eType,
dsinclair19c198b2016-10-11 12:51:37 -070066 CPDFSDK_FormFillEnvironment* pFormFillEnv) {
Lei Zhang5cee3f22018-05-25 21:48:49 +000067 std::set<const CPDF_Dictionary*> visited;
dsinclair19c198b2016-10-11 12:51:37 -070068 return ExecuteDocumentPageAction(action, eType, pFormFillEnv, &visited);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070069}
70
tsepez4cf55152016-11-02 14:37:54 -070071bool CPDFSDK_ActionHandler::DoAction_Document(
Nico Weber9d8ec5a2015-08-04 13:00:21 -070072 const CPDF_Action& action,
73 enum CPDF_AAction::AActionType eType,
dsinclair19c198b2016-10-11 12:51:37 -070074 CPDFSDK_FormFillEnvironment* pFormFillEnv) {
Lei Zhang5cee3f22018-05-25 21:48:49 +000075 std::set<const CPDF_Dictionary*> visited;
dsinclair19c198b2016-10-11 12:51:37 -070076 return ExecuteDocumentPageAction(action, eType, pFormFillEnv, &visited);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070077}
78
tsepez4cf55152016-11-02 14:37:54 -070079bool CPDFSDK_ActionHandler::DoAction_BookMark(
dsinclair19c198b2016-10-11 12:51:37 -070080 CPDF_Bookmark* pBookMark,
81 const CPDF_Action& action,
82 CPDF_AAction::AActionType type,
83 CPDFSDK_FormFillEnvironment* pFormFillEnv) {
Lei Zhang5cee3f22018-05-25 21:48:49 +000084 std::set<const CPDF_Dictionary*> visited;
dsinclair19c198b2016-10-11 12:51:37 -070085 return ExecuteBookMark(action, pFormFillEnv, pBookMark, &visited);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070086}
87
tsepez4cf55152016-11-02 14:37:54 -070088bool CPDFSDK_ActionHandler::DoAction_Screen(
dsinclair19c198b2016-10-11 12:51:37 -070089 const CPDF_Action& action,
90 CPDF_AAction::AActionType type,
91 CPDFSDK_FormFillEnvironment* pFormFillEnv,
92 CPDFSDK_Annot* pScreen) {
Lei Zhang5cee3f22018-05-25 21:48:49 +000093 std::set<const CPDF_Dictionary*> visited;
dsinclair19c198b2016-10-11 12:51:37 -070094 return ExecuteScreenAction(action, type, pFormFillEnv, pScreen, &visited);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070095}
96
tsepez4cf55152016-11-02 14:37:54 -070097bool CPDFSDK_ActionHandler::DoAction_Link(
dsinclair19c198b2016-10-11 12:51:37 -070098 const CPDF_Action& action,
99 CPDFSDK_FormFillEnvironment* pFormFillEnv) {
Lei Zhang5cee3f22018-05-25 21:48:49 +0000100 std::set<const CPDF_Dictionary*> visited;
dsinclair19c198b2016-10-11 12:51:37 -0700101 return ExecuteLinkAction(action, pFormFillEnv, &visited);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700102}
103
tsepez4cf55152016-11-02 14:37:54 -0700104bool CPDFSDK_ActionHandler::DoAction_Field(
dsinclair19c198b2016-10-11 12:51:37 -0700105 const CPDF_Action& action,
106 CPDF_AAction::AActionType type,
107 CPDFSDK_FormFillEnvironment* pFormFillEnv,
108 CPDF_FormField* pFormField,
Dan Sinclair7d125322018-03-28 18:49:34 +0000109 CPDFSDK_FieldAction* data) {
Lei Zhang5cee3f22018-05-25 21:48:49 +0000110 std::set<const CPDF_Dictionary*> visited;
dsinclair19c198b2016-10-11 12:51:37 -0700111 return ExecuteFieldAction(action, type, pFormFillEnv, pFormField, data,
Tom Sepez6c7508b2016-01-20 14:59:25 -0800112 &visited);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700113}
114
tsepez4cf55152016-11-02 14:37:54 -0700115bool CPDFSDK_ActionHandler::ExecuteDocumentOpenAction(
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700116 const CPDF_Action& action,
dsinclair19c198b2016-10-11 12:51:37 -0700117 CPDFSDK_FormFillEnvironment* pFormFillEnv,
Lei Zhang5cee3f22018-05-25 21:48:49 +0000118 std::set<const CPDF_Dictionary*>* visited) {
119 const CPDF_Dictionary* pDict = action.GetDict();
Tom Sepez6c7508b2016-01-20 14:59:25 -0800120 if (pdfium::ContainsKey(*visited, pDict))
tsepez4cf55152016-11-02 14:37:54 -0700121 return false;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700122
Tom Sepez6c7508b2016-01-20 14:59:25 -0800123 visited->insert(pDict);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700124
dsinclair19c198b2016-10-11 12:51:37 -0700125 ASSERT(pFormFillEnv);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700126 if (action.GetType() == CPDF_Action::JavaScript) {
Tom Sepezf5ca90c2018-02-01 02:15:44 +0000127 if (pFormFillEnv->IsJSPlatformPresent()) {
Ryan Harrison275e2602017-09-18 14:23:18 -0400128 WideString swJS = action.GetJavaScript();
Dan Sinclairce047a62018-01-30 18:15:02 +0000129 if (!swJS.IsEmpty())
dsinclair19c198b2016-10-11 12:51:37 -0700130 RunDocumentOpenJavaScript(pFormFillEnv, L"", swJS);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700131 }
132 } else {
dsinclair19c198b2016-10-11 12:51:37 -0700133 DoAction_NoJs(action, pFormFillEnv);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700134 }
135
136 for (int32_t i = 0, sz = action.GetSubActionsCount(); i < sz; i++) {
137 CPDF_Action subaction = action.GetSubAction(i);
dsinclair19c198b2016-10-11 12:51:37 -0700138 if (!ExecuteDocumentOpenAction(subaction, pFormFillEnv, visited))
tsepez4cf55152016-11-02 14:37:54 -0700139 return false;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700140 }
141
tsepez4cf55152016-11-02 14:37:54 -0700142 return true;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700143}
144
tsepez4cf55152016-11-02 14:37:54 -0700145bool CPDFSDK_ActionHandler::ExecuteLinkAction(
Tom Sepez6c7508b2016-01-20 14:59:25 -0800146 const CPDF_Action& action,
dsinclair19c198b2016-10-11 12:51:37 -0700147 CPDFSDK_FormFillEnvironment* pFormFillEnv,
Lei Zhang5cee3f22018-05-25 21:48:49 +0000148 std::set<const CPDF_Dictionary*>* visited) {
149 const CPDF_Dictionary* pDict = action.GetDict();
Tom Sepez6c7508b2016-01-20 14:59:25 -0800150 if (pdfium::ContainsKey(*visited, pDict))
tsepez4cf55152016-11-02 14:37:54 -0700151 return false;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700152
Tom Sepez6c7508b2016-01-20 14:59:25 -0800153 visited->insert(pDict);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700154
dsinclair4526faf2016-10-11 10:54:49 -0700155 ASSERT(pFormFillEnv);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700156 if (action.GetType() == CPDF_Action::JavaScript) {
Dan Sinclair8cdea722018-01-30 18:56:50 +0000157 RunScriptForAction(action, pFormFillEnv,
158 [pFormFillEnv](IJS_EventContext* context) {
159 context->OnLink_MouseUp(pFormFillEnv);
160 });
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700161 } else {
dsinclair19c198b2016-10-11 12:51:37 -0700162 DoAction_NoJs(action, pFormFillEnv);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700163 }
164
165 for (int32_t i = 0, sz = action.GetSubActionsCount(); i < sz; i++) {
166 CPDF_Action subaction = action.GetSubAction(i);
dsinclair19c198b2016-10-11 12:51:37 -0700167 if (!ExecuteLinkAction(subaction, pFormFillEnv, visited))
tsepez4cf55152016-11-02 14:37:54 -0700168 return false;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700169 }
170
tsepez4cf55152016-11-02 14:37:54 -0700171 return true;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700172}
173
tsepez4cf55152016-11-02 14:37:54 -0700174bool CPDFSDK_ActionHandler::ExecuteDocumentPageAction(
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700175 const CPDF_Action& action,
176 CPDF_AAction::AActionType type,
dsinclair19c198b2016-10-11 12:51:37 -0700177 CPDFSDK_FormFillEnvironment* pFormFillEnv,
Lei Zhang5cee3f22018-05-25 21:48:49 +0000178 std::set<const CPDF_Dictionary*>* visited) {
179 const CPDF_Dictionary* pDict = action.GetDict();
Tom Sepez6c7508b2016-01-20 14:59:25 -0800180 if (pdfium::ContainsKey(*visited, pDict))
tsepez4cf55152016-11-02 14:37:54 -0700181 return false;
Tom Sepez7b5bc262015-03-05 16:44:22 -0800182
Tom Sepez6c7508b2016-01-20 14:59:25 -0800183 visited->insert(pDict);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700184
dsinclair19c198b2016-10-11 12:51:37 -0700185 ASSERT(pFormFillEnv);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700186 if (action.GetType() == CPDF_Action::JavaScript) {
Tom Sepezf5ca90c2018-02-01 02:15:44 +0000187 if (pFormFillEnv->IsJSPlatformPresent()) {
Ryan Harrison275e2602017-09-18 14:23:18 -0400188 WideString swJS = action.GetJavaScript();
Dan Sinclairce047a62018-01-30 18:15:02 +0000189 if (!swJS.IsEmpty())
dsinclair19c198b2016-10-11 12:51:37 -0700190 RunDocumentPageJavaScript(pFormFillEnv, type, swJS);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700191 }
192 } else {
dsinclair19c198b2016-10-11 12:51:37 -0700193 DoAction_NoJs(action, pFormFillEnv);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700194 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700195
Dan Sinclairce047a62018-01-30 18:15:02 +0000196 ASSERT(pFormFillEnv);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700197
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700198 for (int32_t i = 0, sz = action.GetSubActionsCount(); i < sz; i++) {
199 CPDF_Action subaction = action.GetSubAction(i);
dsinclair19c198b2016-10-11 12:51:37 -0700200 if (!ExecuteDocumentPageAction(subaction, type, pFormFillEnv, visited))
tsepez4cf55152016-11-02 14:37:54 -0700201 return false;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700202 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700203
tsepez4cf55152016-11-02 14:37:54 -0700204 return true;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700205}
206
tsepez4cf55152016-11-02 14:37:54 -0700207bool CPDFSDK_ActionHandler::IsValidField(
dsinclair19c198b2016-10-11 12:51:37 -0700208 CPDFSDK_FormFillEnvironment* pFormFillEnv,
209 CPDF_Dictionary* pFieldDict) {
Lei Zhang96660d62015-12-14 18:27:25 -0800210 ASSERT(pFieldDict);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700211
dsinclair7cbe68e2016-10-12 11:56:23 -0700212 CPDFSDK_InterForm* pInterForm = pFormFillEnv->GetInterForm();
Chris Palmer9047b8b2014-08-06 14:17:45 -0700213 CPDF_InterForm* pPDFInterForm = pInterForm->GetInterForm();
thestig1cd352e2016-06-07 17:53:06 -0700214 return !!pPDFInterForm->GetFieldByDict(pFieldDict);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700215}
216
tsepez4cf55152016-11-02 14:37:54 -0700217bool CPDFSDK_ActionHandler::ExecuteFieldAction(
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700218 const CPDF_Action& action,
219 CPDF_AAction::AActionType type,
dsinclair19c198b2016-10-11 12:51:37 -0700220 CPDFSDK_FormFillEnvironment* pFormFillEnv,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700221 CPDF_FormField* pFormField,
Dan Sinclair7d125322018-03-28 18:49:34 +0000222 CPDFSDK_FieldAction* data,
Lei Zhang5cee3f22018-05-25 21:48:49 +0000223 std::set<const CPDF_Dictionary*>* visited) {
224 const CPDF_Dictionary* pDict = action.GetDict();
Tom Sepez6c7508b2016-01-20 14:59:25 -0800225 if (pdfium::ContainsKey(*visited, pDict))
tsepez4cf55152016-11-02 14:37:54 -0700226 return false;
Tom Sepez7b5bc262015-03-05 16:44:22 -0800227
Tom Sepez6c7508b2016-01-20 14:59:25 -0800228 visited->insert(pDict);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700229
dsinclair19c198b2016-10-11 12:51:37 -0700230 ASSERT(pFormFillEnv);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700231 if (action.GetType() == CPDF_Action::JavaScript) {
Tom Sepezf5ca90c2018-02-01 02:15:44 +0000232 if (pFormFillEnv->IsJSPlatformPresent()) {
Ryan Harrison275e2602017-09-18 14:23:18 -0400233 WideString swJS = action.GetJavaScript();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700234 if (!swJS.IsEmpty()) {
dsinclair19c198b2016-10-11 12:51:37 -0700235 RunFieldJavaScript(pFormFillEnv, pFormField, type, data, swJS);
236 if (!IsValidField(pFormFillEnv, pFormField->GetFieldDict()))
tsepez4cf55152016-11-02 14:37:54 -0700237 return false;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700238 }
239 }
240 } else {
dsinclair19c198b2016-10-11 12:51:37 -0700241 DoAction_NoJs(action, pFormFillEnv);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700242 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700243
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700244 for (int32_t i = 0, sz = action.GetSubActionsCount(); i < sz; i++) {
245 CPDF_Action subaction = action.GetSubAction(i);
dsinclair19c198b2016-10-11 12:51:37 -0700246 if (!ExecuteFieldAction(subaction, type, pFormFillEnv, pFormField, data,
Tom Sepez6c7508b2016-01-20 14:59:25 -0800247 visited))
tsepez4cf55152016-11-02 14:37:54 -0700248 return false;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700249 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700250
tsepez4cf55152016-11-02 14:37:54 -0700251 return true;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700252}
253
tsepez4cf55152016-11-02 14:37:54 -0700254bool CPDFSDK_ActionHandler::ExecuteScreenAction(
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700255 const CPDF_Action& action,
256 CPDF_AAction::AActionType type,
dsinclair19c198b2016-10-11 12:51:37 -0700257 CPDFSDK_FormFillEnvironment* pFormFillEnv,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700258 CPDFSDK_Annot* pScreen,
Lei Zhang5cee3f22018-05-25 21:48:49 +0000259 std::set<const CPDF_Dictionary*>* visited) {
260 const CPDF_Dictionary* pDict = action.GetDict();
Tom Sepez6c7508b2016-01-20 14:59:25 -0800261 if (pdfium::ContainsKey(*visited, pDict))
tsepez4cf55152016-11-02 14:37:54 -0700262 return false;
Tom Sepez7b5bc262015-03-05 16:44:22 -0800263
Tom Sepez6c7508b2016-01-20 14:59:25 -0800264 visited->insert(pDict);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700265
dsinclair19c198b2016-10-11 12:51:37 -0700266 ASSERT(pFormFillEnv);
Dan Sinclair8cdea722018-01-30 18:56:50 +0000267 if (action.GetType() == CPDF_Action::JavaScript)
268 RunScriptForAction(action, pFormFillEnv, [](IJS_EventContext*) {});
269 else
dsinclair19c198b2016-10-11 12:51:37 -0700270 DoAction_NoJs(action, pFormFillEnv);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700271
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700272 for (int32_t i = 0, sz = action.GetSubActionsCount(); i < sz; i++) {
273 CPDF_Action subaction = action.GetSubAction(i);
dsinclair19c198b2016-10-11 12:51:37 -0700274 if (!ExecuteScreenAction(subaction, type, pFormFillEnv, pScreen, visited))
tsepez4cf55152016-11-02 14:37:54 -0700275 return false;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700276 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700277
tsepez4cf55152016-11-02 14:37:54 -0700278 return true;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700279}
280
tsepez4cf55152016-11-02 14:37:54 -0700281bool CPDFSDK_ActionHandler::ExecuteBookMark(
Tom Sepez6c7508b2016-01-20 14:59:25 -0800282 const CPDF_Action& action,
dsinclair19c198b2016-10-11 12:51:37 -0700283 CPDFSDK_FormFillEnvironment* pFormFillEnv,
Tom Sepez6c7508b2016-01-20 14:59:25 -0800284 CPDF_Bookmark* pBookmark,
Lei Zhang5cee3f22018-05-25 21:48:49 +0000285 std::set<const CPDF_Dictionary*>* visited) {
286 const CPDF_Dictionary* pDict = action.GetDict();
Tom Sepez6c7508b2016-01-20 14:59:25 -0800287 if (pdfium::ContainsKey(*visited, pDict))
tsepez4cf55152016-11-02 14:37:54 -0700288 return false;
Tom Sepez7b5bc262015-03-05 16:44:22 -0800289
Tom Sepez6c7508b2016-01-20 14:59:25 -0800290 visited->insert(pDict);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700291
dsinclair19c198b2016-10-11 12:51:37 -0700292 ASSERT(pFormFillEnv);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700293 if (action.GetType() == CPDF_Action::JavaScript) {
Dan Sinclair8cdea722018-01-30 18:56:50 +0000294 RunScriptForAction(action, pFormFillEnv,
295 [pFormFillEnv, pBookmark](IJS_EventContext* context) {
296 context->OnBookmark_MouseUp(pBookmark);
297 });
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700298 } else {
dsinclair19c198b2016-10-11 12:51:37 -0700299 DoAction_NoJs(action, pFormFillEnv);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700300 }
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);
dsinclair19c198b2016-10-11 12:51:37 -0700304 if (!ExecuteBookMark(subaction, pFormFillEnv, pBookmark, visited))
tsepez4cf55152016-11-02 14:37:54 -0700305 return false;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700306 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700307
tsepez4cf55152016-11-02 14:37:54 -0700308 return true;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700309}
310
dsinclair19c198b2016-10-11 12:51:37 -0700311void CPDFSDK_ActionHandler::DoAction_NoJs(
312 const CPDF_Action& action,
313 CPDFSDK_FormFillEnvironment* pFormFillEnv) {
314 ASSERT(pFormFillEnv);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700315
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700316 switch (action.GetType()) {
317 case CPDF_Action::GoTo:
dsinclair19c198b2016-10-11 12:51:37 -0700318 DoAction_GoTo(pFormFillEnv, action);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700319 break;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700320 case CPDF_Action::URI:
dsinclair19c198b2016-10-11 12:51:37 -0700321 DoAction_URI(pFormFillEnv, action);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700322 break;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700323 case CPDF_Action::Hide:
dsinclair19c198b2016-10-11 12:51:37 -0700324 DoAction_Hide(action, pFormFillEnv);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700325 break;
326 case CPDF_Action::Named:
dsinclair19c198b2016-10-11 12:51:37 -0700327 DoAction_Named(pFormFillEnv, action);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700328 break;
329 case CPDF_Action::SubmitForm:
dsinclair19c198b2016-10-11 12:51:37 -0700330 DoAction_SubmitForm(action, pFormFillEnv);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700331 break;
332 case CPDF_Action::ResetForm:
dsinclair19c198b2016-10-11 12:51:37 -0700333 DoAction_ResetForm(action, pFormFillEnv);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700334 break;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700335 case CPDF_Action::JavaScript:
Lei Zhangb45324b2017-05-22 17:05:40 -0700336 NOTREACHED();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700337 break;
338 case CPDF_Action::SetOCGState:
Dan Sinclairce047a62018-01-30 18:15:02 +0000339 case CPDF_Action::Thread:
340 case CPDF_Action::Sound:
341 case CPDF_Action::Movie:
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700342 case CPDF_Action::Rendition:
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700343 case CPDF_Action::Trans:
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700344 case CPDF_Action::GoTo3DView:
Dan Sinclairce047a62018-01-30 18:15:02 +0000345 case CPDF_Action::GoToR:
346 case CPDF_Action::GoToE:
347 case CPDF_Action::Launch:
348 case CPDF_Action::ImportData:
349 // Unimplemented
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700350 break;
351 default:
352 break;
353 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700354}
355
dsinclair19c198b2016-10-11 12:51:37 -0700356void CPDFSDK_ActionHandler::DoAction_GoTo(
357 CPDFSDK_FormFillEnvironment* pFormFillEnv,
358 const CPDF_Action& action) {
Wei Li0fc6b252016-03-01 16:29:41 -0800359 ASSERT(action.GetDict());
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700360
dsinclair7cbe68e2016-10-12 11:56:23 -0700361 CPDF_Document* pPDFDocument = pFormFillEnv->GetPDFDocument();
Dan Sinclair2b11dc12015-10-22 15:02:06 -0400362 ASSERT(pPDFDocument);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700363
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700364 CPDF_Dest MyDest = action.GetDest(pPDFDocument);
Henrique Nakashima27028362018-02-01 22:00:33 +0000365 int nPageIndex = MyDest.GetDestPageIndex(pPDFDocument);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700366 int nFitType = MyDest.GetZoomMode();
Dan Sinclair2b11dc12015-10-22 15:02:06 -0400367 const CPDF_Array* pMyArray = ToArray(MyDest.GetObject());
Tom Sepezd7188f72017-05-02 15:10:58 -0700368 std::vector<float> posArray;
Dan Sinclair2b11dc12015-10-22 15:02:06 -0400369 if (pMyArray) {
Tom Sepezd7188f72017-05-02 15:10:58 -0700370 for (size_t i = 2; i < pMyArray->GetCount(); i++)
371 posArray.push_back(pMyArray->GetFloatAt(i));
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700372 }
Tom Sepezd7188f72017-05-02 15:10:58 -0700373 pFormFillEnv->DoGoToAction(nPageIndex, nFitType, posArray.data(),
374 posArray.size());
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700375}
376
dsinclair19c198b2016-10-11 12:51:37 -0700377void CPDFSDK_ActionHandler::DoAction_URI(
378 CPDFSDK_FormFillEnvironment* pFormFillEnv,
379 const CPDF_Action& action) {
Wei Li0fc6b252016-03-01 16:29:41 -0800380 ASSERT(action.GetDict());
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700381
Ryan Harrison275e2602017-09-18 14:23:18 -0400382 ByteString sURI = action.GetURI(pFormFillEnv->GetPDFDocument());
dsinclair19c198b2016-10-11 12:51:37 -0700383 pFormFillEnv->DoURIAction(sURI.c_str());
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700384}
385
dsinclair19c198b2016-10-11 12:51:37 -0700386void CPDFSDK_ActionHandler::DoAction_Named(
387 CPDFSDK_FormFillEnvironment* pFormFillEnv,
388 const CPDF_Action& action) {
Wei Li0fc6b252016-03-01 16:29:41 -0800389 ASSERT(action.GetDict());
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700390
Ryan Harrison275e2602017-09-18 14:23:18 -0400391 ByteString csName = action.GetNamedAction();
dsinclair19c198b2016-10-11 12:51:37 -0700392 pFormFillEnv->ExecuteNamedAction(csName.c_str());
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700393}
394
dsinclair19c198b2016-10-11 12:51:37 -0700395void CPDFSDK_ActionHandler::RunFieldJavaScript(
396 CPDFSDK_FormFillEnvironment* pFormFillEnv,
397 CPDF_FormField* pFormField,
398 CPDF_AAction::AActionType type,
Dan Sinclair7d125322018-03-28 18:49:34 +0000399 CPDFSDK_FieldAction* data,
Ryan Harrison275e2602017-09-18 14:23:18 -0400400 const WideString& script) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700401 ASSERT(type != CPDF_AAction::Calculate);
402 ASSERT(type != CPDF_AAction::Format);
Tom Sepezd7e5cc72015-06-10 14:33:37 -0700403
Dan Sinclair8cdea722018-01-30 18:56:50 +0000404 RunScript(
405 pFormFillEnv, script,
406 [type, data, pFormField](IJS_EventContext* context) {
407 switch (type) {
408 case CPDF_AAction::CursorEnter:
409 context->OnField_MouseEnter(data->bModifier, data->bShift,
410 pFormField);
411 break;
412 case CPDF_AAction::CursorExit:
413 context->OnField_MouseExit(data->bModifier, data->bShift,
414 pFormField);
415 break;
416 case CPDF_AAction::ButtonDown:
417 context->OnField_MouseDown(data->bModifier, data->bShift,
418 pFormField);
419 break;
420 case CPDF_AAction::ButtonUp:
421 context->OnField_MouseUp(data->bModifier, data->bShift, pFormField);
422 break;
423 case CPDF_AAction::GetFocus:
424 context->OnField_Focus(data->bModifier, data->bShift, pFormField,
Tom Sepez3d813152018-06-21 17:28:24 +0000425 &data->sValue);
Dan Sinclair8cdea722018-01-30 18:56:50 +0000426 break;
427 case CPDF_AAction::LoseFocus:
428 context->OnField_Blur(data->bModifier, data->bShift, pFormField,
Tom Sepez3d813152018-06-21 17:28:24 +0000429 &data->sValue);
Dan Sinclair8cdea722018-01-30 18:56:50 +0000430 break;
431 case CPDF_AAction::KeyStroke:
432 context->OnField_Keystroke(
Tom Sepez3d813152018-06-21 17:28:24 +0000433 &data->sChange, data->sChangeEx, data->bKeyDown,
434 data->bModifier, &data->nSelEnd, &data->nSelStart, data->bShift,
435 pFormField, &data->sValue, data->bWillCommit, data->bFieldFull,
436 &data->bRC);
Dan Sinclair8cdea722018-01-30 18:56:50 +0000437 break;
438 case CPDF_AAction::Validate:
Tom Sepez3d813152018-06-21 17:28:24 +0000439 context->OnField_Validate(&data->sChange, data->sChangeEx,
440 data->bKeyDown, data->bModifier,
441 data->bShift, pFormField, &data->sValue,
442 &data->bRC);
Dan Sinclair8cdea722018-01-30 18:56:50 +0000443 break;
444 default:
445 NOTREACHED();
446 break;
447 }
448 });
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700449}
450
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700451void CPDFSDK_ActionHandler::RunDocumentOpenJavaScript(
dsinclair19c198b2016-10-11 12:51:37 -0700452 CPDFSDK_FormFillEnvironment* pFormFillEnv,
Ryan Harrison275e2602017-09-18 14:23:18 -0400453 const WideString& sScriptName,
454 const WideString& script) {
Dan Sinclair8cdea722018-01-30 18:56:50 +0000455 RunScript(pFormFillEnv, script,
456 [pFormFillEnv, sScriptName](IJS_EventContext* context) {
457 context->OnDoc_Open(pFormFillEnv, sScriptName);
458 });
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700459}
460
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700461void CPDFSDK_ActionHandler::RunDocumentPageJavaScript(
dsinclair19c198b2016-10-11 12:51:37 -0700462 CPDFSDK_FormFillEnvironment* pFormFillEnv,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700463 CPDF_AAction::AActionType type,
Ryan Harrison275e2602017-09-18 14:23:18 -0400464 const WideString& script) {
Dan Sinclair8cdea722018-01-30 18:56:50 +0000465 RunScript(pFormFillEnv, script,
466 [type, pFormFillEnv](IJS_EventContext* context) {
467 switch (type) {
468 case CPDF_AAction::OpenPage:
469 context->OnPage_Open(pFormFillEnv);
470 break;
471 case CPDF_AAction::ClosePage:
472 context->OnPage_Close(pFormFillEnv);
473 break;
474 case CPDF_AAction::CloseDocument:
475 context->OnDoc_WillClose(pFormFillEnv);
476 break;
477 case CPDF_AAction::SaveDocument:
478 context->OnDoc_WillSave(pFormFillEnv);
479 break;
480 case CPDF_AAction::DocumentSaved:
481 context->OnDoc_DidSave(pFormFillEnv);
482 break;
483 case CPDF_AAction::PrintDocument:
484 context->OnDoc_WillPrint(pFormFillEnv);
485 break;
486 case CPDF_AAction::DocumentPrinted:
487 context->OnDoc_DidPrint(pFormFillEnv);
488 break;
489 case CPDF_AAction::PageVisible:
490 context->OnPage_InView(pFormFillEnv);
491 break;
492 case CPDF_AAction::PageInvisible:
493 context->OnPage_OutView(pFormFillEnv);
494 break;
495 default:
496 NOTREACHED();
497 break;
498 }
499 });
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700500}
501
tsepez4cf55152016-11-02 14:37:54 -0700502bool CPDFSDK_ActionHandler::DoAction_Hide(
dsinclair19c198b2016-10-11 12:51:37 -0700503 const CPDF_Action& action,
504 CPDFSDK_FormFillEnvironment* pFormFillEnv) {
dsinclair7cbe68e2016-10-12 11:56:23 -0700505 CPDFSDK_InterForm* pInterForm = pFormFillEnv->GetInterForm();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700506 if (pInterForm->DoAction_Hide(action)) {
dsinclair7cbe68e2016-10-12 11:56:23 -0700507 pFormFillEnv->SetChangeMark();
tsepez4cf55152016-11-02 14:37:54 -0700508 return true;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700509 }
tsepez4cf55152016-11-02 14:37:54 -0700510 return false;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700511}
512
tsepez4cf55152016-11-02 14:37:54 -0700513bool CPDFSDK_ActionHandler::DoAction_SubmitForm(
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700514 const CPDF_Action& action,
dsinclair19c198b2016-10-11 12:51:37 -0700515 CPDFSDK_FormFillEnvironment* pFormFillEnv) {
dsinclair7cbe68e2016-10-12 11:56:23 -0700516 CPDFSDK_InterForm* pInterForm = pFormFillEnv->GetInterForm();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700517 return pInterForm->DoAction_SubmitForm(action);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700518}
519
dan sinclair7544a4b2018-03-08 15:19:50 +0000520void CPDFSDK_ActionHandler::DoAction_ResetForm(
dsinclair19c198b2016-10-11 12:51:37 -0700521 const CPDF_Action& action,
522 CPDFSDK_FormFillEnvironment* pFormFillEnv) {
dsinclair7cbe68e2016-10-12 11:56:23 -0700523 CPDFSDK_InterForm* pInterForm = pFormFillEnv->GetInterForm();
dan sinclair7544a4b2018-03-08 15:19:50 +0000524 pInterForm->DoAction_ResetForm(action);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700525}
526
Dan Sinclair8cdea722018-01-30 18:56:50 +0000527void CPDFSDK_ActionHandler::RunScriptForAction(
528 const CPDF_Action& action,
529 CPDFSDK_FormFillEnvironment* pFormFillEnv,
Lei Zhang9d7c7ff2018-03-16 19:25:30 +0000530 const RunScriptCallback& cb) {
Tom Sepezf5ca90c2018-02-01 02:15:44 +0000531 if (!pFormFillEnv->IsJSPlatformPresent())
Dan Sinclair8cdea722018-01-30 18:56:50 +0000532 return;
533
534 WideString swJS = action.GetJavaScript();
535 if (swJS.IsEmpty())
536 return;
537
538 RunScript(pFormFillEnv, swJS, cb);
539}
540
Lei Zhang9d7c7ff2018-03-16 19:25:30 +0000541void CPDFSDK_ActionHandler::RunScript(CPDFSDK_FormFillEnvironment* pFormFillEnv,
542 const WideString& script,
543 const RunScriptCallback& cb) {
Tom Sepezc22d6712018-06-05 22:33:31 +0000544 IJS_Runtime::ScopedEventContext pContext(pFormFillEnv->GetIJSRuntime());
545 cb(pContext.Get());
Dan Sinclairdc5d88b2018-05-17 13:53:52 +0000546 pContext->RunScript(script);
Dan Sinclairdc5d88b2018-05-17 13:53:52 +0000547 // TODO(dsinclair): Return error if RunScript returns a IJS_Runtime::JS_Error.
Dan Sinclair8cdea722018-01-30 18:56:50 +0000548}