blob: 6b2b4b95f6e3ee99b353932fc22b95995e2db2c0 [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"
Lei Zhangc3450652018-10-11 16:54:42 +000014#include "core/fpdfdoc/cpdf_interactiveform.h"
dsinclair735606d2016-10-05 15:47:02 -070015#include "fpdfsdk/cpdfsdk_formfillenvironment.h"
Lei Zhangc3450652018-10-11 16:54:42 +000016#include "fpdfsdk/cpdfsdk_interactiveform.h"
Dan Sinclaire0345a42017-10-30 20:20:42 +000017#include "fxjs/ijs_event_context.h"
18#include "fxjs/ijs_runtime.h"
Lei Zhangb45324b2017-05-22 17:05:40 -070019#include "third_party/base/logging.h"
Tom Sepez6c7508b2016-01-20 14:59:25 -080020#include "third_party/base/stl_util.h"
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070021
tsepez4cf55152016-11-02 14:37:54 -070022bool CPDFSDK_ActionHandler::DoAction_DocOpen(
dsinclair19c198b2016-10-11 12:51:37 -070023 const CPDF_Action& action,
24 CPDFSDK_FormFillEnvironment* pFormFillEnv) {
Lei Zhang5cee3f22018-05-25 21:48:49 +000025 std::set<const CPDF_Dictionary*> visited;
dsinclair19c198b2016-10-11 12:51:37 -070026 return ExecuteDocumentOpenAction(action, pFormFillEnv, &visited);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070027}
28
tsepez4cf55152016-11-02 14:37:54 -070029bool CPDFSDK_ActionHandler::DoAction_JavaScript(
Nico Weber9d8ec5a2015-08-04 13:00:21 -070030 const CPDF_Action& JsAction,
Ryan Harrison275e2602017-09-18 14:23:18 -040031 WideString csJSName,
dsinclair19c198b2016-10-11 12:51:37 -070032 CPDFSDK_FormFillEnvironment* pFormFillEnv) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -070033 if (JsAction.GetType() == CPDF_Action::JavaScript) {
Ryan Harrison275e2602017-09-18 14:23:18 -040034 WideString swJS = JsAction.GetJavaScript();
Nico Weber9d8ec5a2015-08-04 13:00:21 -070035 if (!swJS.IsEmpty()) {
dsinclair19c198b2016-10-11 12:51:37 -070036 RunDocumentOpenJavaScript(pFormFillEnv, csJSName, swJS);
tsepez4cf55152016-11-02 14:37:54 -070037 return true;
Nico Weber9d8ec5a2015-08-04 13:00:21 -070038 }
39 }
40
tsepez4cf55152016-11-02 14:37:54 -070041 return false;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070042}
43
tsepez4cf55152016-11-02 14:37:54 -070044bool CPDFSDK_ActionHandler::DoAction_FieldJavaScript(
Nico Weber9d8ec5a2015-08-04 13:00:21 -070045 const CPDF_Action& JsAction,
46 CPDF_AAction::AActionType type,
dsinclair19c198b2016-10-11 12:51:37 -070047 CPDFSDK_FormFillEnvironment* pFormFillEnv,
Nico Weber9d8ec5a2015-08-04 13:00:21 -070048 CPDF_FormField* pFormField,
Dan Sinclair7d125322018-03-28 18:49:34 +000049 CPDFSDK_FieldAction* data) {
dsinclair19c198b2016-10-11 12:51:37 -070050 ASSERT(pFormFillEnv);
Tom Sepezf5ca90c2018-02-01 02:15:44 +000051 if (pFormFillEnv->IsJSPlatformPresent() &&
dsinclair19c198b2016-10-11 12:51:37 -070052 JsAction.GetType() == CPDF_Action::JavaScript) {
Ryan Harrison275e2602017-09-18 14:23:18 -040053 WideString swJS = JsAction.GetJavaScript();
Nico Weber9d8ec5a2015-08-04 13:00:21 -070054 if (!swJS.IsEmpty()) {
dsinclair19c198b2016-10-11 12:51:37 -070055 RunFieldJavaScript(pFormFillEnv, pFormField, type, data, swJS);
tsepez4cf55152016-11-02 14:37:54 -070056 return true;
Nico Weber9d8ec5a2015-08-04 13:00:21 -070057 }
58 }
tsepez4cf55152016-11-02 14:37:54 -070059 return false;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070060}
61
tsepez4cf55152016-11-02 14:37:54 -070062bool CPDFSDK_ActionHandler::DoAction_Page(
Nico Weber9d8ec5a2015-08-04 13:00:21 -070063 const CPDF_Action& action,
64 enum CPDF_AAction::AActionType eType,
dsinclair19c198b2016-10-11 12:51:37 -070065 CPDFSDK_FormFillEnvironment* pFormFillEnv) {
Lei Zhang5cee3f22018-05-25 21:48:49 +000066 std::set<const CPDF_Dictionary*> visited;
dsinclair19c198b2016-10-11 12:51:37 -070067 return ExecuteDocumentPageAction(action, eType, pFormFillEnv, &visited);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070068}
69
tsepez4cf55152016-11-02 14:37:54 -070070bool CPDFSDK_ActionHandler::DoAction_Document(
Nico Weber9d8ec5a2015-08-04 13:00:21 -070071 const CPDF_Action& action,
72 enum CPDF_AAction::AActionType eType,
dsinclair19c198b2016-10-11 12:51:37 -070073 CPDFSDK_FormFillEnvironment* pFormFillEnv) {
Lei Zhang5cee3f22018-05-25 21:48:49 +000074 std::set<const CPDF_Dictionary*> visited;
dsinclair19c198b2016-10-11 12:51:37 -070075 return ExecuteDocumentPageAction(action, eType, pFormFillEnv, &visited);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070076}
77
tsepez4cf55152016-11-02 14:37:54 -070078bool CPDFSDK_ActionHandler::DoAction_Field(
dsinclair19c198b2016-10-11 12:51:37 -070079 const CPDF_Action& action,
80 CPDF_AAction::AActionType type,
81 CPDFSDK_FormFillEnvironment* pFormFillEnv,
82 CPDF_FormField* pFormField,
Dan Sinclair7d125322018-03-28 18:49:34 +000083 CPDFSDK_FieldAction* data) {
Lei Zhang5cee3f22018-05-25 21:48:49 +000084 std::set<const CPDF_Dictionary*> visited;
dsinclair19c198b2016-10-11 12:51:37 -070085 return ExecuteFieldAction(action, type, pFormFillEnv, pFormField, data,
Tom Sepez6c7508b2016-01-20 14:59:25 -080086 &visited);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070087}
88
tsepez4cf55152016-11-02 14:37:54 -070089bool CPDFSDK_ActionHandler::ExecuteDocumentOpenAction(
Nico Weber9d8ec5a2015-08-04 13:00:21 -070090 const CPDF_Action& action,
dsinclair19c198b2016-10-11 12:51:37 -070091 CPDFSDK_FormFillEnvironment* pFormFillEnv,
Lei Zhang5cee3f22018-05-25 21:48:49 +000092 std::set<const CPDF_Dictionary*>* visited) {
93 const CPDF_Dictionary* pDict = action.GetDict();
Tom Sepez6c7508b2016-01-20 14:59:25 -080094 if (pdfium::ContainsKey(*visited, pDict))
tsepez4cf55152016-11-02 14:37:54 -070095 return false;
Nico Weber9d8ec5a2015-08-04 13:00:21 -070096
Tom Sepez6c7508b2016-01-20 14:59:25 -080097 visited->insert(pDict);
Nico Weber9d8ec5a2015-08-04 13:00:21 -070098
dsinclair19c198b2016-10-11 12:51:37 -070099 ASSERT(pFormFillEnv);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700100 if (action.GetType() == CPDF_Action::JavaScript) {
Tom Sepezf5ca90c2018-02-01 02:15:44 +0000101 if (pFormFillEnv->IsJSPlatformPresent()) {
Ryan Harrison275e2602017-09-18 14:23:18 -0400102 WideString swJS = action.GetJavaScript();
Dan Sinclairce047a62018-01-30 18:15:02 +0000103 if (!swJS.IsEmpty())
Tom Sepez890eac22018-12-03 20:35:51 +0000104 RunDocumentOpenJavaScript(pFormFillEnv, WideString(), swJS);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700105 }
106 } else {
Hans Wennborgc320e9c2018-10-22 18:28:52 +0000107 DoAction_NoJs(action, CPDF_AAction::AActionType::kDocumentOpen,
Henrique Nakashima9ef93d02018-10-03 18:41:03 +0000108 pFormFillEnv);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700109 }
110
111 for (int32_t i = 0, sz = action.GetSubActionsCount(); i < sz; i++) {
112 CPDF_Action subaction = action.GetSubAction(i);
dsinclair19c198b2016-10-11 12:51:37 -0700113 if (!ExecuteDocumentOpenAction(subaction, pFormFillEnv, visited))
tsepez4cf55152016-11-02 14:37:54 -0700114 return false;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700115 }
116
tsepez4cf55152016-11-02 14:37:54 -0700117 return true;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700118}
119
tsepez4cf55152016-11-02 14:37:54 -0700120bool CPDFSDK_ActionHandler::ExecuteDocumentPageAction(
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700121 const CPDF_Action& action,
122 CPDF_AAction::AActionType type,
dsinclair19c198b2016-10-11 12:51:37 -0700123 CPDFSDK_FormFillEnvironment* pFormFillEnv,
Lei Zhang5cee3f22018-05-25 21:48:49 +0000124 std::set<const CPDF_Dictionary*>* visited) {
125 const CPDF_Dictionary* pDict = action.GetDict();
Tom Sepez6c7508b2016-01-20 14:59:25 -0800126 if (pdfium::ContainsKey(*visited, pDict))
tsepez4cf55152016-11-02 14:37:54 -0700127 return false;
Tom Sepez7b5bc262015-03-05 16:44:22 -0800128
Tom Sepez6c7508b2016-01-20 14:59:25 -0800129 visited->insert(pDict);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700130
dsinclair19c198b2016-10-11 12:51:37 -0700131 ASSERT(pFormFillEnv);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700132 if (action.GetType() == CPDF_Action::JavaScript) {
Tom Sepezf5ca90c2018-02-01 02:15:44 +0000133 if (pFormFillEnv->IsJSPlatformPresent()) {
Ryan Harrison275e2602017-09-18 14:23:18 -0400134 WideString swJS = action.GetJavaScript();
Dan Sinclairce047a62018-01-30 18:15:02 +0000135 if (!swJS.IsEmpty())
dsinclair19c198b2016-10-11 12:51:37 -0700136 RunDocumentPageJavaScript(pFormFillEnv, type, swJS);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700137 }
138 } else {
Henrique Nakashima9ef93d02018-10-03 18:41:03 +0000139 DoAction_NoJs(action, type, pFormFillEnv);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700140 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700141
Dan Sinclairce047a62018-01-30 18:15:02 +0000142 ASSERT(pFormFillEnv);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700143
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700144 for (int32_t i = 0, sz = action.GetSubActionsCount(); i < sz; i++) {
145 CPDF_Action subaction = action.GetSubAction(i);
dsinclair19c198b2016-10-11 12:51:37 -0700146 if (!ExecuteDocumentPageAction(subaction, type, pFormFillEnv, visited))
tsepez4cf55152016-11-02 14:37:54 -0700147 return false;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700148 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700149
tsepez4cf55152016-11-02 14:37:54 -0700150 return true;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700151}
152
tsepez4cf55152016-11-02 14:37:54 -0700153bool CPDFSDK_ActionHandler::IsValidField(
dsinclair19c198b2016-10-11 12:51:37 -0700154 CPDFSDK_FormFillEnvironment* pFormFillEnv,
155 CPDF_Dictionary* pFieldDict) {
Lei Zhang96660d62015-12-14 18:27:25 -0800156 ASSERT(pFieldDict);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700157
Lei Zhang073ecf42018-10-11 16:56:00 +0000158 CPDFSDK_InteractiveForm* pForm = pFormFillEnv->GetInteractiveForm();
159 CPDF_InteractiveForm* pPDFForm = pForm->GetInteractiveForm();
160 return !!pPDFForm->GetFieldByDict(pFieldDict);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700161}
162
tsepez4cf55152016-11-02 14:37:54 -0700163bool CPDFSDK_ActionHandler::ExecuteFieldAction(
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700164 const CPDF_Action& action,
165 CPDF_AAction::AActionType type,
dsinclair19c198b2016-10-11 12:51:37 -0700166 CPDFSDK_FormFillEnvironment* pFormFillEnv,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700167 CPDF_FormField* pFormField,
Dan Sinclair7d125322018-03-28 18:49:34 +0000168 CPDFSDK_FieldAction* data,
Lei Zhang5cee3f22018-05-25 21:48:49 +0000169 std::set<const CPDF_Dictionary*>* visited) {
170 const CPDF_Dictionary* pDict = action.GetDict();
Tom Sepez6c7508b2016-01-20 14:59:25 -0800171 if (pdfium::ContainsKey(*visited, pDict))
tsepez4cf55152016-11-02 14:37:54 -0700172 return false;
Tom Sepez7b5bc262015-03-05 16:44:22 -0800173
Tom Sepez6c7508b2016-01-20 14:59:25 -0800174 visited->insert(pDict);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700175
dsinclair19c198b2016-10-11 12:51:37 -0700176 ASSERT(pFormFillEnv);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700177 if (action.GetType() == CPDF_Action::JavaScript) {
Tom Sepezf5ca90c2018-02-01 02:15:44 +0000178 if (pFormFillEnv->IsJSPlatformPresent()) {
Ryan Harrison275e2602017-09-18 14:23:18 -0400179 WideString swJS = action.GetJavaScript();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700180 if (!swJS.IsEmpty()) {
dsinclair19c198b2016-10-11 12:51:37 -0700181 RunFieldJavaScript(pFormFillEnv, pFormField, type, data, swJS);
182 if (!IsValidField(pFormFillEnv, pFormField->GetFieldDict()))
tsepez4cf55152016-11-02 14:37:54 -0700183 return false;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700184 }
185 }
186 } else {
Henrique Nakashima9ef93d02018-10-03 18:41:03 +0000187 DoAction_NoJs(action, type, pFormFillEnv);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700188 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700189
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700190 for (int32_t i = 0, sz = action.GetSubActionsCount(); i < sz; i++) {
191 CPDF_Action subaction = action.GetSubAction(i);
dsinclair19c198b2016-10-11 12:51:37 -0700192 if (!ExecuteFieldAction(subaction, type, pFormFillEnv, pFormField, data,
Tom Sepez6c7508b2016-01-20 14:59:25 -0800193 visited))
tsepez4cf55152016-11-02 14:37:54 -0700194 return false;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700195 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700196
tsepez4cf55152016-11-02 14:37:54 -0700197 return true;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700198}
199
dsinclair19c198b2016-10-11 12:51:37 -0700200void CPDFSDK_ActionHandler::DoAction_NoJs(
201 const CPDF_Action& action,
Henrique Nakashima9ef93d02018-10-03 18:41:03 +0000202 CPDF_AAction::AActionType type,
dsinclair19c198b2016-10-11 12:51:37 -0700203 CPDFSDK_FormFillEnvironment* pFormFillEnv) {
204 ASSERT(pFormFillEnv);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700205
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700206 switch (action.GetType()) {
207 case CPDF_Action::GoTo:
dsinclair19c198b2016-10-11 12:51:37 -0700208 DoAction_GoTo(pFormFillEnv, action);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700209 break;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700210 case CPDF_Action::URI:
Henrique Nakashima9ef93d02018-10-03 18:41:03 +0000211 if (CPDF_AAction::IsUserClick(type))
212 DoAction_URI(pFormFillEnv, action);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700213 break;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700214 case CPDF_Action::Hide:
dsinclair19c198b2016-10-11 12:51:37 -0700215 DoAction_Hide(action, pFormFillEnv);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700216 break;
217 case CPDF_Action::Named:
dsinclair19c198b2016-10-11 12:51:37 -0700218 DoAction_Named(pFormFillEnv, action);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700219 break;
220 case CPDF_Action::SubmitForm:
Henrique Nakashima9ef93d02018-10-03 18:41:03 +0000221 if (CPDF_AAction::IsUserClick(type))
222 DoAction_SubmitForm(action, pFormFillEnv);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700223 break;
224 case CPDF_Action::ResetForm:
dsinclair19c198b2016-10-11 12:51:37 -0700225 DoAction_ResetForm(action, pFormFillEnv);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700226 break;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700227 case CPDF_Action::JavaScript:
Lei Zhangb45324b2017-05-22 17:05:40 -0700228 NOTREACHED();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700229 break;
230 case CPDF_Action::SetOCGState:
Dan Sinclairce047a62018-01-30 18:15:02 +0000231 case CPDF_Action::Thread:
232 case CPDF_Action::Sound:
233 case CPDF_Action::Movie:
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700234 case CPDF_Action::Rendition:
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700235 case CPDF_Action::Trans:
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700236 case CPDF_Action::GoTo3DView:
Dan Sinclairce047a62018-01-30 18:15:02 +0000237 case CPDF_Action::GoToR:
238 case CPDF_Action::GoToE:
239 case CPDF_Action::Launch:
240 case CPDF_Action::ImportData:
241 // Unimplemented
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700242 break;
243 default:
244 break;
245 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700246}
247
dsinclair19c198b2016-10-11 12:51:37 -0700248void CPDFSDK_ActionHandler::DoAction_GoTo(
249 CPDFSDK_FormFillEnvironment* pFormFillEnv,
250 const CPDF_Action& action) {
Wei Li0fc6b252016-03-01 16:29:41 -0800251 ASSERT(action.GetDict());
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700252
dsinclair7cbe68e2016-10-12 11:56:23 -0700253 CPDF_Document* pPDFDocument = pFormFillEnv->GetPDFDocument();
Dan Sinclair2b11dc12015-10-22 15:02:06 -0400254 ASSERT(pPDFDocument);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700255
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700256 CPDF_Dest MyDest = action.GetDest(pPDFDocument);
Henrique Nakashima27028362018-02-01 22:00:33 +0000257 int nPageIndex = MyDest.GetDestPageIndex(pPDFDocument);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700258 int nFitType = MyDest.GetZoomMode();
Lei Zhang76525c42018-08-27 18:57:36 +0000259 const CPDF_Array* pMyArray = MyDest.GetArray();
Tom Sepezd7188f72017-05-02 15:10:58 -0700260 std::vector<float> posArray;
Dan Sinclair2b11dc12015-10-22 15:02:06 -0400261 if (pMyArray) {
Lei Zhangf40380f2018-10-12 18:31:51 +0000262 for (size_t i = 2; i < pMyArray->size(); i++)
Lei Zhang12d7da22019-05-28 17:49:58 +0000263 posArray.push_back(pMyArray->GetNumberAt(i));
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700264 }
Tom Sepezd7188f72017-05-02 15:10:58 -0700265 pFormFillEnv->DoGoToAction(nPageIndex, nFitType, posArray.data(),
266 posArray.size());
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700267}
268
dsinclair19c198b2016-10-11 12:51:37 -0700269void CPDFSDK_ActionHandler::DoAction_URI(
270 CPDFSDK_FormFillEnvironment* pFormFillEnv,
271 const CPDF_Action& action) {
Wei Li0fc6b252016-03-01 16:29:41 -0800272 ASSERT(action.GetDict());
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700273
Ryan Harrison275e2602017-09-18 14:23:18 -0400274 ByteString sURI = action.GetURI(pFormFillEnv->GetPDFDocument());
dsinclair19c198b2016-10-11 12:51:37 -0700275 pFormFillEnv->DoURIAction(sURI.c_str());
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700276}
277
dsinclair19c198b2016-10-11 12:51:37 -0700278void CPDFSDK_ActionHandler::DoAction_Named(
279 CPDFSDK_FormFillEnvironment* pFormFillEnv,
280 const CPDF_Action& action) {
Wei Li0fc6b252016-03-01 16:29:41 -0800281 ASSERT(action.GetDict());
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700282
Ryan Harrison275e2602017-09-18 14:23:18 -0400283 ByteString csName = action.GetNamedAction();
dsinclair19c198b2016-10-11 12:51:37 -0700284 pFormFillEnv->ExecuteNamedAction(csName.c_str());
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700285}
286
dsinclair19c198b2016-10-11 12:51:37 -0700287void CPDFSDK_ActionHandler::RunFieldJavaScript(
288 CPDFSDK_FormFillEnvironment* pFormFillEnv,
289 CPDF_FormField* pFormField,
290 CPDF_AAction::AActionType type,
Dan Sinclair7d125322018-03-28 18:49:34 +0000291 CPDFSDK_FieldAction* data,
Ryan Harrison275e2602017-09-18 14:23:18 -0400292 const WideString& script) {
Hans Wennborgc320e9c2018-10-22 18:28:52 +0000293 ASSERT(type != CPDF_AAction::kCalculate);
294 ASSERT(type != CPDF_AAction::kFormat);
Tom Sepezd7e5cc72015-06-10 14:33:37 -0700295
Lei Zhang537d3a62019-12-13 17:39:38 +0000296 RunScript(pFormFillEnv, script,
297 [type, data, pFormField](IJS_EventContext* context) {
298 switch (type) {
299 case CPDF_AAction::kCursorEnter:
300 context->OnField_MouseEnter(data->bModifier, data->bShift,
301 pFormField);
302 break;
303 case CPDF_AAction::kCursorExit:
304 context->OnField_MouseExit(data->bModifier, data->bShift,
305 pFormField);
306 break;
307 case CPDF_AAction::kButtonDown:
308 context->OnField_MouseDown(data->bModifier, data->bShift,
309 pFormField);
310 break;
311 case CPDF_AAction::kButtonUp:
312 context->OnField_MouseUp(data->bModifier, data->bShift,
313 pFormField);
314 break;
315 case CPDF_AAction::kGetFocus:
316 context->OnField_Focus(data->bModifier, data->bShift,
317 pFormField, &data->sValue);
318 break;
319 case CPDF_AAction::kLoseFocus:
320 context->OnField_Blur(data->bModifier, data->bShift,
321 pFormField, &data->sValue);
322 break;
323 case CPDF_AAction::kKeyStroke:
324 context->OnField_Keystroke(
325 &data->sChange, data->sChangeEx, data->bKeyDown,
326 data->bModifier, &data->nSelEnd, &data->nSelStart,
327 data->bShift, pFormField, &data->sValue,
328 data->bWillCommit, data->bFieldFull, &data->bRC);
329 break;
330 case CPDF_AAction::kValidate:
331 context->OnField_Validate(&data->sChange, data->sChangeEx,
332 data->bKeyDown, data->bModifier,
333 data->bShift, pFormField,
334 &data->sValue, &data->bRC);
335 break;
336 default:
337 NOTREACHED();
338 break;
339 }
340 });
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700341}
342
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700343void CPDFSDK_ActionHandler::RunDocumentOpenJavaScript(
dsinclair19c198b2016-10-11 12:51:37 -0700344 CPDFSDK_FormFillEnvironment* pFormFillEnv,
Ryan Harrison275e2602017-09-18 14:23:18 -0400345 const WideString& sScriptName,
346 const WideString& script) {
Dan Sinclair8cdea722018-01-30 18:56:50 +0000347 RunScript(pFormFillEnv, script,
348 [pFormFillEnv, sScriptName](IJS_EventContext* context) {
349 context->OnDoc_Open(pFormFillEnv, sScriptName);
350 });
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700351}
352
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700353void CPDFSDK_ActionHandler::RunDocumentPageJavaScript(
dsinclair19c198b2016-10-11 12:51:37 -0700354 CPDFSDK_FormFillEnvironment* pFormFillEnv,
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700355 CPDF_AAction::AActionType type,
Ryan Harrison275e2602017-09-18 14:23:18 -0400356 const WideString& script) {
Dan Sinclair8cdea722018-01-30 18:56:50 +0000357 RunScript(pFormFillEnv, script,
358 [type, pFormFillEnv](IJS_EventContext* context) {
359 switch (type) {
Hans Wennborgc320e9c2018-10-22 18:28:52 +0000360 case CPDF_AAction::kOpenPage:
Dan Sinclair8cdea722018-01-30 18:56:50 +0000361 context->OnPage_Open(pFormFillEnv);
362 break;
Hans Wennborgc320e9c2018-10-22 18:28:52 +0000363 case CPDF_AAction::kClosePage:
Dan Sinclair8cdea722018-01-30 18:56:50 +0000364 context->OnPage_Close(pFormFillEnv);
365 break;
Hans Wennborgc320e9c2018-10-22 18:28:52 +0000366 case CPDF_AAction::kCloseDocument:
Dan Sinclair8cdea722018-01-30 18:56:50 +0000367 context->OnDoc_WillClose(pFormFillEnv);
368 break;
Hans Wennborgc320e9c2018-10-22 18:28:52 +0000369 case CPDF_AAction::kSaveDocument:
Dan Sinclair8cdea722018-01-30 18:56:50 +0000370 context->OnDoc_WillSave(pFormFillEnv);
371 break;
Hans Wennborgc320e9c2018-10-22 18:28:52 +0000372 case CPDF_AAction::kDocumentSaved:
Dan Sinclair8cdea722018-01-30 18:56:50 +0000373 context->OnDoc_DidSave(pFormFillEnv);
374 break;
Hans Wennborgc320e9c2018-10-22 18:28:52 +0000375 case CPDF_AAction::kPrintDocument:
Dan Sinclair8cdea722018-01-30 18:56:50 +0000376 context->OnDoc_WillPrint(pFormFillEnv);
377 break;
Hans Wennborgc320e9c2018-10-22 18:28:52 +0000378 case CPDF_AAction::kDocumentPrinted:
Dan Sinclair8cdea722018-01-30 18:56:50 +0000379 context->OnDoc_DidPrint(pFormFillEnv);
380 break;
Hans Wennborgc320e9c2018-10-22 18:28:52 +0000381 case CPDF_AAction::kPageVisible:
Dan Sinclair8cdea722018-01-30 18:56:50 +0000382 context->OnPage_InView(pFormFillEnv);
383 break;
Hans Wennborgc320e9c2018-10-22 18:28:52 +0000384 case CPDF_AAction::kPageInvisible:
Dan Sinclair8cdea722018-01-30 18:56:50 +0000385 context->OnPage_OutView(pFormFillEnv);
386 break;
387 default:
388 NOTREACHED();
389 break;
390 }
391 });
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700392}
393
tsepez4cf55152016-11-02 14:37:54 -0700394bool CPDFSDK_ActionHandler::DoAction_Hide(
dsinclair19c198b2016-10-11 12:51:37 -0700395 const CPDF_Action& action,
396 CPDFSDK_FormFillEnvironment* pFormFillEnv) {
Lei Zhang073ecf42018-10-11 16:56:00 +0000397 CPDFSDK_InteractiveForm* pForm = pFormFillEnv->GetInteractiveForm();
398 if (pForm->DoAction_Hide(action)) {
dsinclair7cbe68e2016-10-12 11:56:23 -0700399 pFormFillEnv->SetChangeMark();
tsepez4cf55152016-11-02 14:37:54 -0700400 return true;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700401 }
tsepez4cf55152016-11-02 14:37:54 -0700402 return false;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700403}
404
tsepez4cf55152016-11-02 14:37:54 -0700405bool CPDFSDK_ActionHandler::DoAction_SubmitForm(
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700406 const CPDF_Action& action,
dsinclair19c198b2016-10-11 12:51:37 -0700407 CPDFSDK_FormFillEnvironment* pFormFillEnv) {
Lei Zhang073ecf42018-10-11 16:56:00 +0000408 CPDFSDK_InteractiveForm* pForm = pFormFillEnv->GetInteractiveForm();
409 return pForm->DoAction_SubmitForm(action);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700410}
411
dan sinclair7544a4b2018-03-08 15:19:50 +0000412void CPDFSDK_ActionHandler::DoAction_ResetForm(
dsinclair19c198b2016-10-11 12:51:37 -0700413 const CPDF_Action& action,
414 CPDFSDK_FormFillEnvironment* pFormFillEnv) {
Lei Zhang073ecf42018-10-11 16:56:00 +0000415 CPDFSDK_InteractiveForm* pForm = pFormFillEnv->GetInteractiveForm();
416 pForm->DoAction_ResetForm(action);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700417}
418
Lei Zhang9d7c7ff2018-03-16 19:25:30 +0000419void CPDFSDK_ActionHandler::RunScript(CPDFSDK_FormFillEnvironment* pFormFillEnv,
420 const WideString& script,
421 const RunScriptCallback& cb) {
Tom Sepezc22d6712018-06-05 22:33:31 +0000422 IJS_Runtime::ScopedEventContext pContext(pFormFillEnv->GetIJSRuntime());
423 cb(pContext.Get());
Dan Sinclairdc5d88b2018-05-17 13:53:52 +0000424 pContext->RunScript(script);
Dan Sinclairdc5d88b2018-05-17 13:53:52 +0000425 // TODO(dsinclair): Return error if RunScript returns a IJS_Runtime::JS_Error.
Dan Sinclair8cdea722018-01-30 18:56:50 +0000426}