blob: c9127dd0fc93a0af75df03a755723a73e0bd2b35 [file] [log] [blame]
K. Moon832a6942022-10-31 20:11:31 +00001// Copyright 2014 The PDFium Authors
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07002// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
Lei Zhanga6d9f0e2015-06-13 00:48:38 -07004
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07005// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6
Dan Sinclaire0345a42017-10-30 20:20:42 +00007#include "fxjs/cjs_field.h"
Tom Sepez37458412015-10-06 11:33:46 -07008
Tom Sepezb9cc7a02016-02-01 13:42:30 -08009#include <algorithm>
10#include <memory>
Tom Sepez75acda62018-01-29 20:17:36 +000011#include <utility>
Tom Sepezb9cc7a02016-02-01 13:42:30 -080012
Lei Zhangbc2b59e2020-01-31 03:27:44 +000013#include "constants/access_permissions.h"
Lei Zhang85549b42019-02-02 00:40:19 +000014#include "constants/annotation_flags.h"
Lei Zhanga676aca2019-02-02 00:41:09 +000015#include "constants/form_flags.h"
Tom Sepezd1edcc82022-06-27 20:11:00 +000016#include "core/fpdfapi/parser/cpdf_stream.h"
Lei Zhangbc75f622018-10-15 18:12:40 +000017#include "core/fpdfdoc/cpdf_formcontrol.h"
Dan Sinclair51230322017-10-30 15:36:02 +000018#include "core/fpdfdoc/cpdf_formfield.h"
Lei Zhangc3450652018-10-11 16:54:42 +000019#include "core/fpdfdoc/cpdf_interactiveform.h"
Tom Sepeze2acc372021-08-17 22:32:53 +000020#include "fpdfsdk/cpdfsdk_formfillenvironment.h"
Lei Zhangc3450652018-10-11 16:54:42 +000021#include "fpdfsdk/cpdfsdk_interactiveform.h"
dsinclair114e46a2016-09-29 17:18:21 -070022#include "fpdfsdk/cpdfsdk_pageview.h"
23#include "fpdfsdk/cpdfsdk_widget.h"
Dan Sinclaire0345a42017-10-30 20:20:42 +000024#include "fxjs/cjs_color.h"
25#include "fxjs/cjs_delaydata.h"
26#include "fxjs/cjs_document.h"
27#include "fxjs/cjs_icon.h"
Tom Sepezaf6371f2020-11-02 20:13:01 +000028#include "fxjs/fxv8.h"
Dan Sinclaire0345a42017-10-30 20:20:42 +000029#include "fxjs/js_resources.h"
Lei Zhang455cf862021-10-08 01:01:50 +000030#include "third_party/abseil-cpp/absl/types/optional.h"
Tom Sepez08b23fc2021-01-27 22:23:27 +000031#include "third_party/base/check.h"
Lei Zhang30632072020-10-02 01:57:54 +000032#include "third_party/base/notreached.h"
Dan Elphick05673a32021-09-09 15:42:55 +000033#include "v8/include/v8-container.h"
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070034
tonikitoo7c05a7a2016-08-17 11:08:46 -070035namespace {
36
Lei Zhang359be402022-03-08 22:03:34 +000037constexpr wchar_t kCheckSelector = L'4';
38constexpr wchar_t kCircleSelector = L'l';
39constexpr wchar_t kCrossSelector = L'8';
40constexpr wchar_t kDiamondSelector = L'u';
41constexpr wchar_t kSquareSelector = L'n';
42constexpr wchar_t kStarSelector = L'H';
43
Lei Zhang94919f72018-07-12 21:16:30 +000044bool IsCheckBoxOrRadioButton(const CPDF_FormField* pFormField) {
45 return pFormField->GetFieldType() == FormFieldType::kCheckBox ||
46 pFormField->GetFieldType() == FormFieldType::kRadioButton;
47}
48
49bool IsComboBoxOrListBox(const CPDF_FormField* pFormField) {
50 return pFormField->GetFieldType() == FormFieldType::kComboBox ||
51 pFormField->GetFieldType() == FormFieldType::kListBox;
52}
53
54bool IsComboBoxOrTextField(const CPDF_FormField* pFormField) {
55 return pFormField->GetFieldType() == FormFieldType::kComboBox ||
56 pFormField->GetFieldType() == FormFieldType::kTextField;
57}
58
59void UpdateFormField(CPDFSDK_FormFillEnvironment* pFormFillEnv,
60 CPDF_FormField* pFormField,
Tom Sepez5c7f4422022-04-05 00:22:22 +000061 bool bResetAP) {
Lei Zhang073ecf42018-10-11 16:56:00 +000062 CPDFSDK_InteractiveForm* pForm = pFormFillEnv->GetInteractiveForm();
Lei Zhang94919f72018-07-12 21:16:30 +000063 if (bResetAP) {
Tom Sepez8885ece2022-08-09 21:04:50 +000064 std::vector<ObservedPtr<CPDFSDK_Widget>> widgets;
Lei Zhang073ecf42018-10-11 16:56:00 +000065 pForm->GetWidgets(pFormField, &widgets);
Lei Zhang94919f72018-07-12 21:16:30 +000066
67 if (IsComboBoxOrTextField(pFormField)) {
Tom Sepez8885ece2022-08-09 21:04:50 +000068 for (auto& pWidget : widgets) {
69 if (pWidget) {
70 absl::optional<WideString> sValue = pWidget->OnFormat();
71 if (pWidget) { // Not redundant, may be clobbered by OnFormat.
Lei Zhangcaf0bb82021-06-07 18:41:25 +000072 pWidget->ResetAppearance(sValue, CPDFSDK_Widget::kValueUnchanged);
Lei Zhang94919f72018-07-12 21:16:30 +000073 }
74 }
75 }
76 } else {
Tom Sepez8885ece2022-08-09 21:04:50 +000077 for (auto& pWidget : widgets) {
78 if (pWidget) {
Lei Zhanga3a739d2021-10-07 20:46:31 +000079 pWidget->ResetAppearance(absl::nullopt,
Lei Zhangcaf0bb82021-06-07 18:41:25 +000080 CPDFSDK_Widget::kValueUnchanged);
81 }
Lei Zhang94919f72018-07-12 21:16:30 +000082 }
83 }
84 }
85
Tom Sepez5c7f4422022-04-05 00:22:22 +000086 // Refresh the widget list. The calls in |bResetAP| may have caused widgets
87 // to be removed from the list. We need to call |GetWidgets| again to be
88 // sure none of the widgets have been deleted.
Tom Sepez8885ece2022-08-09 21:04:50 +000089 std::vector<ObservedPtr<CPDFSDK_Widget>> widgets;
Tom Sepez5c7f4422022-04-05 00:22:22 +000090 pForm->GetWidgets(pFormField, &widgets);
Tom Sepez8885ece2022-08-09 21:04:50 +000091 for (auto& pWidget : widgets) {
Tom Sepez565fe792022-08-09 23:12:43 +000092 if (pWidget)
93 pFormFillEnv->UpdateAllViews(pWidget.Get());
Lei Zhang94919f72018-07-12 21:16:30 +000094 }
Tom Sepez5c7f4422022-04-05 00:22:22 +000095 pFormFillEnv->SetChangeMark();
Lei Zhang94919f72018-07-12 21:16:30 +000096}
97
98void UpdateFormControl(CPDFSDK_FormFillEnvironment* pFormFillEnv,
99 CPDF_FormControl* pFormControl,
Tom Sepeza657b4d2022-04-05 18:44:19 +0000100 bool bResetAP) {
Tom Sepez08b23fc2021-01-27 22:23:27 +0000101 DCHECK(pFormControl);
Lei Zhang073ecf42018-10-11 16:56:00 +0000102 CPDFSDK_InteractiveForm* pForm = pFormFillEnv->GetInteractiveForm();
Lei Zhang94919f72018-07-12 21:16:30 +0000103 CPDFSDK_Widget* pWidget = pForm->GetWidget(pFormControl);
Lei Zhang94919f72018-07-12 21:16:30 +0000104 if (pWidget) {
Tom Sepezd8ae8f82019-06-12 17:58:33 +0000105 ObservedPtr<CPDFSDK_Widget> observed_widget(pWidget);
Lei Zhang94919f72018-07-12 21:16:30 +0000106 if (bResetAP) {
107 FormFieldType fieldType = pWidget->GetFieldType();
108 if (fieldType == FormFieldType::kComboBox ||
109 fieldType == FormFieldType::kTextField) {
Lei Zhang2c495302021-10-07 23:13:30 +0000110 absl::optional<WideString> sValue = pWidget->OnFormat();
Lei Zhang94919f72018-07-12 21:16:30 +0000111 if (!observed_widget)
112 return;
Lei Zhangcaf0bb82021-06-07 18:41:25 +0000113 pWidget->ResetAppearance(sValue, CPDFSDK_Widget::kValueUnchanged);
Lei Zhang94919f72018-07-12 21:16:30 +0000114 } else {
Lei Zhanga3a739d2021-10-07 20:46:31 +0000115 pWidget->ResetAppearance(absl::nullopt,
Lei Zhangcaf0bb82021-06-07 18:41:25 +0000116 CPDFSDK_Widget::kValueUnchanged);
Lei Zhang94919f72018-07-12 21:16:30 +0000117 }
118 if (!observed_widget)
119 return;
120 }
Tom Sepez565fe792022-08-09 23:12:43 +0000121 pFormFillEnv->UpdateAllViews(pWidget);
Lei Zhang94919f72018-07-12 21:16:30 +0000122 }
Tom Sepeza657b4d2022-04-05 18:44:19 +0000123 pFormFillEnv->SetChangeMark();
Lei Zhang94919f72018-07-12 21:16:30 +0000124}
125
Lei Zhangd168ee72021-06-07 23:51:14 +0000126struct FieldNameData {
127 FieldNameData(WideString field_name_in, int control_index_in)
128 : field_name(field_name_in), control_index(control_index_in) {}
129
130 WideString field_name;
131 int control_index;
132};
133
Lei Zhang2c495302021-10-07 23:13:30 +0000134absl::optional<FieldNameData> ParseFieldName(const WideString& field_name) {
Lei Zhangd168ee72021-06-07 23:51:14 +0000135 auto reverse_it = field_name.rbegin();
136 while (reverse_it != field_name.rend()) {
Lei Zhang4bd03e82019-12-11 19:08:41 +0000137 if (*reverse_it == L'.')
138 break;
139 ++reverse_it;
140 }
Lei Zhangd168ee72021-06-07 23:51:14 +0000141 if (reverse_it == field_name.rend()) {
Lei Zhanga3a739d2021-10-07 20:46:31 +0000142 return absl::nullopt;
Lei Zhang4bd03e82019-12-11 19:08:41 +0000143 }
Lei Zhangd168ee72021-06-07 23:51:14 +0000144 WideString suffixal = field_name.Last(reverse_it - field_name.rbegin());
145 int control_index = FXSYS_wtoi(suffixal.c_str());
146 if (control_index == 0) {
Lei Zhang4bd03e82019-12-11 19:08:41 +0000147 suffixal.TrimRight(L' ');
148 if (suffixal != L"0") {
Lei Zhanga3a739d2021-10-07 20:46:31 +0000149 return absl::nullopt;
Lei Zhang4bd03e82019-12-11 19:08:41 +0000150 }
151 }
Lei Zhangd168ee72021-06-07 23:51:14 +0000152 return FieldNameData(field_name.First(field_name.rend() - reverse_it - 1),
153 control_index);
Lei Zhang4bd03e82019-12-11 19:08:41 +0000154}
155
Lei Zhang94919f72018-07-12 21:16:30 +0000156std::vector<CPDF_FormField*> GetFormFieldsForName(
157 CPDFSDK_FormFillEnvironment* pFormFillEnv,
158 const WideString& csFieldName) {
159 std::vector<CPDF_FormField*> fields;
Lei Zhang073ecf42018-10-11 16:56:00 +0000160 CPDFSDK_InteractiveForm* pReaderForm = pFormFillEnv->GetInteractiveForm();
161 CPDF_InteractiveForm* pForm = pReaderForm->GetInteractiveForm();
Tom Sepeza0de6da2021-11-11 01:40:23 +0000162 const size_t sz = pForm->CountFields(csFieldName);
163 for (size_t i = 0; i < sz; ++i) {
164 CPDF_FormField* pFormField = pForm->GetField(i, csFieldName);
165 if (pFormField)
Lei Zhang94919f72018-07-12 21:16:30 +0000166 fields.push_back(pFormField);
167 }
168 return fields;
169}
170
Lei Zhange9826282021-06-08 08:30:48 +0000171CFX_Color GetFormControlColor(CPDF_FormControl* pFormControl,
172 const ByteString& entry) {
Lei Zhange9826282021-06-08 08:30:48 +0000173 switch (pFormControl->GetColorARGB(entry).color_type) {
174 case CFX_Color::Type::kTransparent:
175 return CFX_Color(CFX_Color::Type::kTransparent);
176 case CFX_Color::Type::kGray:
177 return CFX_Color(CFX_Color::Type::kGray,
178 pFormControl->GetOriginalColorComponent(0, entry));
179 case CFX_Color::Type::kRGB:
180 return CFX_Color(CFX_Color::Type::kRGB,
181 pFormControl->GetOriginalColorComponent(0, entry),
182 pFormControl->GetOriginalColorComponent(1, entry),
183 pFormControl->GetOriginalColorComponent(2, entry));
184 case CFX_Color::Type::kCMYK:
185 return CFX_Color(CFX_Color::Type::kCMYK,
186 pFormControl->GetOriginalColorComponent(0, entry),
187 pFormControl->GetOriginalColorComponent(1, entry),
188 pFormControl->GetOriginalColorComponent(2, entry),
189 pFormControl->GetOriginalColorComponent(3, entry));
190 }
191}
192
tonikitoo7c05a7a2016-08-17 11:08:46 -0700193bool SetWidgetDisplayStatus(CPDFSDK_Widget* pWidget, int value) {
194 if (!pWidget)
195 return false;
196
197 uint32_t dwFlag = pWidget->GetFlags();
198 switch (value) {
199 case 0:
Lei Zhang85549b42019-02-02 00:40:19 +0000200 dwFlag &= ~pdfium::annotation_flags::kInvisible;
201 dwFlag &= ~pdfium::annotation_flags::kHidden;
202 dwFlag &= ~pdfium::annotation_flags::kNoView;
203 dwFlag |= pdfium::annotation_flags::kPrint;
tonikitoo7c05a7a2016-08-17 11:08:46 -0700204 break;
205 case 1:
Lei Zhang85549b42019-02-02 00:40:19 +0000206 dwFlag &= ~pdfium::annotation_flags::kInvisible;
207 dwFlag &= ~pdfium::annotation_flags::kNoView;
208 dwFlag |= (pdfium::annotation_flags::kHidden |
209 pdfium::annotation_flags::kPrint);
tonikitoo7c05a7a2016-08-17 11:08:46 -0700210 break;
211 case 2:
Lei Zhang85549b42019-02-02 00:40:19 +0000212 dwFlag &= ~pdfium::annotation_flags::kInvisible;
213 dwFlag &= ~pdfium::annotation_flags::kPrint;
214 dwFlag &= ~pdfium::annotation_flags::kHidden;
215 dwFlag &= ~pdfium::annotation_flags::kNoView;
tonikitoo7c05a7a2016-08-17 11:08:46 -0700216 break;
217 case 3:
Lei Zhang85549b42019-02-02 00:40:19 +0000218 dwFlag |= pdfium::annotation_flags::kNoView;
219 dwFlag |= pdfium::annotation_flags::kPrint;
220 dwFlag &= ~pdfium::annotation_flags::kHidden;
tonikitoo7c05a7a2016-08-17 11:08:46 -0700221 break;
222 }
223
224 if (dwFlag != pWidget->GetFlags()) {
225 pWidget->SetFlags(dwFlag);
226 return true;
227 }
228
229 return false;
230}
231
Lei Zhang94919f72018-07-12 21:16:30 +0000232void SetBorderStyle(CPDFSDK_FormFillEnvironment* pFormFillEnv,
233 const WideString& swFieldName,
234 int nControlIndex,
Tom Sepez0cbd0a02021-05-27 19:44:27 +0000235 const ByteString& bsString) {
Tom Sepez08b23fc2021-01-27 22:23:27 +0000236 DCHECK(pFormFillEnv);
Lei Zhang94919f72018-07-12 21:16:30 +0000237
Lei Zhangc207ee22023-04-28 20:11:23 +0000238 BorderStyle nBorderStyle;
Tom Sepez0cbd0a02021-05-27 19:44:27 +0000239 if (bsString == "solid")
Lei Zhang99f44ba2020-06-18 17:41:38 +0000240 nBorderStyle = BorderStyle::kSolid;
Tom Sepez0cbd0a02021-05-27 19:44:27 +0000241 else if (bsString == "beveled")
Lei Zhang99f44ba2020-06-18 17:41:38 +0000242 nBorderStyle = BorderStyle::kBeveled;
Tom Sepez0cbd0a02021-05-27 19:44:27 +0000243 else if (bsString == "dashed")
Lei Zhang99f44ba2020-06-18 17:41:38 +0000244 nBorderStyle = BorderStyle::kDash;
Tom Sepez0cbd0a02021-05-27 19:44:27 +0000245 else if (bsString == "inset")
Lei Zhang99f44ba2020-06-18 17:41:38 +0000246 nBorderStyle = BorderStyle::kInset;
Tom Sepez0cbd0a02021-05-27 19:44:27 +0000247 else if (bsString == "underline")
Lei Zhang99f44ba2020-06-18 17:41:38 +0000248 nBorderStyle = BorderStyle::kUnderline;
Lei Zhang94919f72018-07-12 21:16:30 +0000249 else
250 return;
251
252 std::vector<CPDF_FormField*> FieldArray =
253 GetFormFieldsForName(pFormFillEnv, swFieldName);
Lei Zhang073ecf42018-10-11 16:56:00 +0000254 auto* pForm = pFormFillEnv->GetInteractiveForm();
Lei Zhang94919f72018-07-12 21:16:30 +0000255 for (CPDF_FormField* pFormField : FieldArray) {
256 if (nControlIndex < 0) {
257 bool bSet = false;
258 for (int i = 0, sz = pFormField->CountControls(); i < sz; ++i) {
Lei Zhang073ecf42018-10-11 16:56:00 +0000259 CPDFSDK_Widget* pWidget = pForm->GetWidget(pFormField->GetControl(i));
Lei Zhang7db136a2018-10-10 21:34:17 +0000260 if (pWidget) {
Lei Zhang94919f72018-07-12 21:16:30 +0000261 if (pWidget->GetBorderStyle() != nBorderStyle) {
262 pWidget->SetBorderStyle(nBorderStyle);
263 bSet = true;
264 }
265 }
266 }
267 if (bSet)
Tom Sepez5c7f4422022-04-05 00:22:22 +0000268 UpdateFormField(pFormFillEnv, pFormField, true);
Lei Zhang94919f72018-07-12 21:16:30 +0000269 } else {
270 if (nControlIndex >= pFormField->CountControls())
271 return;
272 if (CPDF_FormControl* pFormControl =
273 pFormField->GetControl(nControlIndex)) {
Lei Zhang073ecf42018-10-11 16:56:00 +0000274 CPDFSDK_Widget* pWidget = pForm->GetWidget(pFormControl);
Lei Zhang7db136a2018-10-10 21:34:17 +0000275 if (pWidget) {
Lei Zhang94919f72018-07-12 21:16:30 +0000276 if (pWidget->GetBorderStyle() != nBorderStyle) {
277 pWidget->SetBorderStyle(nBorderStyle);
Tom Sepeza657b4d2022-04-05 18:44:19 +0000278 UpdateFormControl(pFormFillEnv, pFormControl, true);
Lei Zhang94919f72018-07-12 21:16:30 +0000279 }
280 }
281 }
282 }
283 }
Lei Zhangdfa2ac22018-07-12 19:06:50 +0000284}
285
Lei Zhang94919f72018-07-12 21:16:30 +0000286void SetCurrentValueIndices(CPDFSDK_FormFillEnvironment* pFormFillEnv,
287 const WideString& swFieldName,
288 int nControlIndex,
289 const std::vector<uint32_t>& array) {
Tom Sepez08b23fc2021-01-27 22:23:27 +0000290 DCHECK(pFormFillEnv);
Lei Zhang94919f72018-07-12 21:16:30 +0000291 std::vector<CPDF_FormField*> FieldArray =
292 GetFormFieldsForName(pFormFillEnv, swFieldName);
293
294 for (CPDF_FormField* pFormField : FieldArray) {
295 if (!IsComboBoxOrListBox(pFormField))
296 continue;
297
298 uint32_t dwFieldFlags = pFormField->GetFieldFlags();
Tom Sepezb2e6b4c2018-08-16 20:53:58 +0000299 pFormField->ClearSelection(NotificationOption::kNotify);
Lei Zhang94919f72018-07-12 21:16:30 +0000300 for (size_t i = 0; i < array.size(); ++i) {
Lei Zhanga676aca2019-02-02 00:41:09 +0000301 if (i != 0 && !(dwFieldFlags & pdfium::form_flags::kChoiceMultiSelect))
Lei Zhang94919f72018-07-12 21:16:30 +0000302 break;
303 if (array[i] < static_cast<uint32_t>(pFormField->CountOptions()) &&
304 !pFormField->IsItemSelected(array[i])) {
Tom Sepezd733fb42021-04-15 17:04:33 +0000305 pFormField->SetItemSelection(array[i],
Tom Sepezb2e6b4c2018-08-16 20:53:58 +0000306 NotificationOption::kDoNotNotify);
Lei Zhang94919f72018-07-12 21:16:30 +0000307 }
308 }
Tom Sepez5c7f4422022-04-05 00:22:22 +0000309 UpdateFormField(pFormFillEnv, pFormField, true);
Lei Zhang94919f72018-07-12 21:16:30 +0000310 }
Lei Zhang83f2d702018-07-12 19:07:40 +0000311}
312
Lei Zhang94919f72018-07-12 21:16:30 +0000313void SetDisplay(CPDFSDK_FormFillEnvironment* pFormFillEnv,
314 const WideString& swFieldName,
315 int nControlIndex,
316 int number) {
Lei Zhang073ecf42018-10-11 16:56:00 +0000317 CPDFSDK_InteractiveForm* pForm = pFormFillEnv->GetInteractiveForm();
Lei Zhang94919f72018-07-12 21:16:30 +0000318 std::vector<CPDF_FormField*> FieldArray =
319 GetFormFieldsForName(pFormFillEnv, swFieldName);
320 for (CPDF_FormField* pFormField : FieldArray) {
321 if (nControlIndex < 0) {
322 bool bAnySet = false;
323 for (int i = 0, sz = pFormField->CountControls(); i < sz; ++i) {
324 CPDF_FormControl* pFormControl = pFormField->GetControl(i);
Tom Sepez08b23fc2021-01-27 22:23:27 +0000325 DCHECK(pFormControl);
Lei Zhang94919f72018-07-12 21:16:30 +0000326
Lei Zhang073ecf42018-10-11 16:56:00 +0000327 CPDFSDK_Widget* pWidget = pForm->GetWidget(pFormControl);
Lei Zhang94919f72018-07-12 21:16:30 +0000328 if (SetWidgetDisplayStatus(pWidget, number))
329 bAnySet = true;
330 }
331
332 if (bAnySet)
Tom Sepez5c7f4422022-04-05 00:22:22 +0000333 UpdateFormField(pFormFillEnv, pFormField, false);
Lei Zhang94919f72018-07-12 21:16:30 +0000334 } else {
335 if (nControlIndex >= pFormField->CountControls())
336 return;
337
338 CPDF_FormControl* pFormControl = pFormField->GetControl(nControlIndex);
339 if (!pFormControl)
340 return;
341
Lei Zhang073ecf42018-10-11 16:56:00 +0000342 CPDFSDK_Widget* pWidget = pForm->GetWidget(pFormControl);
Lei Zhang94919f72018-07-12 21:16:30 +0000343 if (SetWidgetDisplayStatus(pWidget, number))
Tom Sepeza657b4d2022-04-05 18:44:19 +0000344 UpdateFormControl(pFormFillEnv, pFormControl, false);
Lei Zhang94919f72018-07-12 21:16:30 +0000345 }
346 }
347}
348
349void SetHidden(CPDFSDK_FormFillEnvironment* pFormFillEnv,
350 const WideString& swFieldName,
351 int nControlIndex,
352 bool b) {
353 int display = b ? 1 /*Hidden*/ : 0 /*Visible*/;
354 SetDisplay(pFormFillEnv, swFieldName, nControlIndex, display);
355}
356
357void SetLineWidth(CPDFSDK_FormFillEnvironment* pFormFillEnv,
358 const WideString& swFieldName,
359 int nControlIndex,
360 int number) {
Lei Zhang073ecf42018-10-11 16:56:00 +0000361 CPDFSDK_InteractiveForm* pForm = pFormFillEnv->GetInteractiveForm();
Lei Zhang94919f72018-07-12 21:16:30 +0000362 std::vector<CPDF_FormField*> FieldArray =
363 GetFormFieldsForName(pFormFillEnv, swFieldName);
364 for (CPDF_FormField* pFormField : FieldArray) {
365 if (nControlIndex < 0) {
366 bool bSet = false;
367 for (int i = 0, sz = pFormField->CountControls(); i < sz; ++i) {
368 CPDF_FormControl* pFormControl = pFormField->GetControl(i);
Tom Sepez08b23fc2021-01-27 22:23:27 +0000369 DCHECK(pFormControl);
Lei Zhang94919f72018-07-12 21:16:30 +0000370
Lei Zhang073ecf42018-10-11 16:56:00 +0000371 if (CPDFSDK_Widget* pWidget = pForm->GetWidget(pFormControl)) {
Lei Zhang94919f72018-07-12 21:16:30 +0000372 if (number != pWidget->GetBorderWidth()) {
373 pWidget->SetBorderWidth(number);
374 bSet = true;
375 }
376 }
377 }
378 if (bSet)
Tom Sepez5c7f4422022-04-05 00:22:22 +0000379 UpdateFormField(pFormFillEnv, pFormField, true);
Lei Zhang94919f72018-07-12 21:16:30 +0000380 } else {
381 if (nControlIndex >= pFormField->CountControls())
382 return;
383 if (CPDF_FormControl* pFormControl =
384 pFormField->GetControl(nControlIndex)) {
Lei Zhang073ecf42018-10-11 16:56:00 +0000385 if (CPDFSDK_Widget* pWidget = pForm->GetWidget(pFormControl)) {
Lei Zhang94919f72018-07-12 21:16:30 +0000386 if (number != pWidget->GetBorderWidth()) {
387 pWidget->SetBorderWidth(number);
Tom Sepeza657b4d2022-04-05 18:44:19 +0000388 UpdateFormControl(pFormFillEnv, pFormControl, true);
Lei Zhang94919f72018-07-12 21:16:30 +0000389 }
390 }
391 }
392 }
393 }
394}
395
396void SetRect(CPDFSDK_FormFillEnvironment* pFormFillEnv,
397 const WideString& swFieldName,
398 int nControlIndex,
399 const CFX_FloatRect& rect) {
Lei Zhang073ecf42018-10-11 16:56:00 +0000400 CPDFSDK_InteractiveForm* pForm = pFormFillEnv->GetInteractiveForm();
Lei Zhang94919f72018-07-12 21:16:30 +0000401 std::vector<CPDF_FormField*> FieldArray =
402 GetFormFieldsForName(pFormFillEnv, swFieldName);
403 for (CPDF_FormField* pFormField : FieldArray) {
404 if (nControlIndex < 0) {
405 bool bSet = false;
406 for (int i = 0, sz = pFormField->CountControls(); i < sz; ++i) {
407 CPDF_FormControl* pFormControl = pFormField->GetControl(i);
Tom Sepez08b23fc2021-01-27 22:23:27 +0000408 DCHECK(pFormControl);
Lei Zhang94919f72018-07-12 21:16:30 +0000409
Lei Zhang073ecf42018-10-11 16:56:00 +0000410 if (CPDFSDK_Widget* pWidget = pForm->GetWidget(pFormControl)) {
Lei Zhang94919f72018-07-12 21:16:30 +0000411 CFX_FloatRect crRect = rect;
412
413 CPDF_Page* pPDFPage = pWidget->GetPDFPage();
414 crRect.Intersect(pPDFPage->GetBBox());
415
416 if (!crRect.IsEmpty()) {
417 CFX_FloatRect rcOld = pWidget->GetRect();
418 if (crRect.left != rcOld.left || crRect.right != rcOld.right ||
419 crRect.top != rcOld.top || crRect.bottom != rcOld.bottom) {
420 pWidget->SetRect(crRect);
421 bSet = true;
422 }
423 }
424 }
425 }
426
427 if (bSet)
Tom Sepez5c7f4422022-04-05 00:22:22 +0000428 UpdateFormField(pFormFillEnv, pFormField, true);
Lei Zhang94919f72018-07-12 21:16:30 +0000429
430 continue;
431 }
432
433 if (nControlIndex >= pFormField->CountControls())
434 return;
435 if (CPDF_FormControl* pFormControl =
436 pFormField->GetControl(nControlIndex)) {
Lei Zhang073ecf42018-10-11 16:56:00 +0000437 if (CPDFSDK_Widget* pWidget = pForm->GetWidget(pFormControl)) {
Lei Zhang94919f72018-07-12 21:16:30 +0000438 CFX_FloatRect crRect = rect;
439 CPDF_Page* pPDFPage = pWidget->GetPDFPage();
440 crRect.Intersect(pPDFPage->GetBBox());
441 if (!crRect.IsEmpty()) {
442 CFX_FloatRect rcOld = pWidget->GetRect();
443 if (crRect.left != rcOld.left || crRect.right != rcOld.right ||
444 crRect.top != rcOld.top || crRect.bottom != rcOld.bottom) {
445 pWidget->SetRect(crRect);
Tom Sepeza657b4d2022-04-05 18:44:19 +0000446 UpdateFormControl(pFormFillEnv, pFormControl, true);
Lei Zhang94919f72018-07-12 21:16:30 +0000447 }
448 }
449 }
450 }
451 }
452}
453
Lei Zhange158a002019-03-29 17:16:03 +0000454void SetFieldValue(CPDFSDK_FormFillEnvironment* pFormFillEnv,
455 const WideString& swFieldName,
456 int nControlIndex,
457 const std::vector<WideString>& strArray) {
Tom Sepez08b23fc2021-01-27 22:23:27 +0000458 DCHECK(pFormFillEnv);
Lei Zhang94919f72018-07-12 21:16:30 +0000459 if (strArray.empty())
460 return;
461
462 std::vector<CPDF_FormField*> FieldArray =
463 GetFormFieldsForName(pFormFillEnv, swFieldName);
464
465 for (CPDF_FormField* pFormField : FieldArray) {
Lei Zhang912235c2021-04-24 04:05:41 +0000466 if (pFormField->GetFullName() != swFieldName)
Lei Zhang94919f72018-07-12 21:16:30 +0000467 continue;
468
469 switch (pFormField->GetFieldType()) {
470 case FormFieldType::kTextField:
471 case FormFieldType::kComboBox:
472 if (pFormField->GetValue() != strArray[0]) {
Tom Sepezb2e6b4c2018-08-16 20:53:58 +0000473 pFormField->SetValue(strArray[0], NotificationOption::kNotify);
Tom Sepez5c7f4422022-04-05 00:22:22 +0000474 UpdateFormField(pFormFillEnv, pFormField, false);
Lei Zhang94919f72018-07-12 21:16:30 +0000475 }
476 break;
477 case FormFieldType::kCheckBox:
478 case FormFieldType::kRadioButton:
479 if (pFormField->GetValue() != strArray[0]) {
Tom Sepezb2e6b4c2018-08-16 20:53:58 +0000480 pFormField->SetValue(strArray[0], NotificationOption::kNotify);
Tom Sepez5c7f4422022-04-05 00:22:22 +0000481 UpdateFormField(pFormFillEnv, pFormField, false);
Lei Zhang94919f72018-07-12 21:16:30 +0000482 }
483 break;
484 case FormFieldType::kListBox: {
485 bool bModified = false;
486 for (const auto& str : strArray) {
487 if (!pFormField->IsItemSelected(pFormField->FindOption(str))) {
488 bModified = true;
489 break;
490 }
491 }
492 if (bModified) {
Tom Sepezb2e6b4c2018-08-16 20:53:58 +0000493 pFormField->ClearSelection(NotificationOption::kNotify);
Lei Zhang94919f72018-07-12 21:16:30 +0000494 for (const auto& str : strArray) {
495 int index = pFormField->FindOption(str);
496 if (!pFormField->IsItemSelected(index))
Tom Sepezd733fb42021-04-15 17:04:33 +0000497 pFormField->SetItemSelection(index, NotificationOption::kNotify);
Lei Zhang94919f72018-07-12 21:16:30 +0000498 }
Tom Sepez5c7f4422022-04-05 00:22:22 +0000499 UpdateFormField(pFormFillEnv, pFormField, false);
Lei Zhang94919f72018-07-12 21:16:30 +0000500 }
501 break;
502 }
503 default:
504 break;
505 }
506 }
Lei Zhang83f2d702018-07-12 19:07:40 +0000507}
508
Lei Zhang359be402022-03-08 22:03:34 +0000509wchar_t GetSelectorFromCaptionForFieldType(const WideString& caption,
510 CPDF_FormField::Type type) {
511 if (!caption.IsEmpty())
512 return caption[0];
513
514 switch (type) {
515 case CPDF_FormField::kRadioButton:
516 return kCircleSelector;
517 default:
518 return kCheckSelector;
519 }
520}
521
tonikitoo7c05a7a2016-08-17 11:08:46 -0700522} // namespace
523
Dan Sinclairc94a7932017-10-26 16:48:57 -0400524const JSPropertySpec CJS_Field::PropertySpecs[] = {
Tom Sepez4d5b8c52017-02-21 15:17:07 -0800525 {"alignment", get_alignment_static, set_alignment_static},
dan sinclaircbe23db2017-10-19 14:29:33 -0400526 {"borderStyle", get_border_style_static, set_border_style_static},
527 {"buttonAlignX", get_button_align_x_static, set_button_align_x_static},
528 {"buttonAlignY", get_button_align_y_static, set_button_align_y_static},
529 {"buttonFitBounds", get_button_fit_bounds_static,
530 set_button_fit_bounds_static},
531 {"buttonPosition", get_button_position_static, set_button_position_static},
532 {"buttonScaleHow", get_button_scale_how_static,
533 set_button_scale_how_static},
534 {"buttonScaleWhen", get_button_scale_when_static,
535 set_button_scale_when_static},
536 {"calcOrderIndex", get_calc_order_index_static,
537 set_calc_order_index_static},
538 {"charLimit", get_char_limit_static, set_char_limit_static},
Tom Sepez4d5b8c52017-02-21 15:17:07 -0800539 {"comb", get_comb_static, set_comb_static},
dan sinclaircbe23db2017-10-19 14:29:33 -0400540 {"commitOnSelChange", get_commit_on_sel_change_static,
541 set_commit_on_sel_change_static},
542 {"currentValueIndices", get_current_value_indices_static,
543 set_current_value_indices_static},
544 {"defaultStyle", get_default_style_static, set_default_style_static},
545 {"defaultValue", get_default_value_static, set_default_value_static},
546 {"doNotScroll", get_do_not_scroll_static, set_do_not_scroll_static},
547 {"doNotSpellCheck", get_do_not_spell_check_static,
548 set_do_not_spell_check_static},
Tom Sepez4d5b8c52017-02-21 15:17:07 -0800549 {"delay", get_delay_static, set_delay_static},
550 {"display", get_display_static, set_display_static},
551 {"doc", get_doc_static, set_doc_static},
552 {"editable", get_editable_static, set_editable_static},
dan sinclaircbe23db2017-10-19 14:29:33 -0400553 {"exportValues", get_export_values_static, set_export_values_static},
Tom Sepez4d5b8c52017-02-21 15:17:07 -0800554 {"hidden", get_hidden_static, set_hidden_static},
dan sinclaircbe23db2017-10-19 14:29:33 -0400555 {"fileSelect", get_file_select_static, set_file_select_static},
556 {"fillColor", get_fill_color_static, set_fill_color_static},
557 {"lineWidth", get_line_width_static, set_line_width_static},
Tom Sepez4d5b8c52017-02-21 15:17:07 -0800558 {"highlight", get_highlight_static, set_highlight_static},
559 {"multiline", get_multiline_static, set_multiline_static},
dan sinclaircbe23db2017-10-19 14:29:33 -0400560 {"multipleSelection", get_multiple_selection_static,
561 set_multiple_selection_static},
Tom Sepez4d5b8c52017-02-21 15:17:07 -0800562 {"name", get_name_static, set_name_static},
dan sinclaircbe23db2017-10-19 14:29:33 -0400563 {"numItems", get_num_items_static, set_num_items_static},
Tom Sepez4d5b8c52017-02-21 15:17:07 -0800564 {"page", get_page_static, set_page_static},
565 {"password", get_password_static, set_password_static},
566 {"print", get_print_static, set_print_static},
dan sinclaircbe23db2017-10-19 14:29:33 -0400567 {"radiosInUnison", get_radios_in_unison_static,
568 set_radios_in_unison_static},
Tom Sepez4d5b8c52017-02-21 15:17:07 -0800569 {"readonly", get_readonly_static, set_readonly_static},
570 {"rect", get_rect_static, set_rect_static},
571 {"required", get_required_static, set_required_static},
dan sinclaircbe23db2017-10-19 14:29:33 -0400572 {"richText", get_rich_text_static, set_rich_text_static},
573 {"richValue", get_rich_value_static, set_rich_value_static},
Tom Sepez4d5b8c52017-02-21 15:17:07 -0800574 {"rotation", get_rotation_static, set_rotation_static},
Tom Sepezb14a2f22018-10-12 23:21:58 +0000575 {"source", get_source_static, set_source_static},
dan sinclaircbe23db2017-10-19 14:29:33 -0400576 {"strokeColor", get_stroke_color_static, set_stroke_color_static},
Tom Sepez4d5b8c52017-02-21 15:17:07 -0800577 {"style", get_style_static, set_style_static},
dan sinclaircbe23db2017-10-19 14:29:33 -0400578 {"submitName", get_submit_name_static, set_submit_name_static},
579 {"textColor", get_text_color_static, set_text_color_static},
580 {"textFont", get_text_font_static, set_text_font_static},
581 {"textSize", get_text_size_static, set_text_size_static},
Tom Sepez4d5b8c52017-02-21 15:17:07 -0800582 {"type", get_type_static, set_type_static},
dan sinclaircbe23db2017-10-19 14:29:33 -0400583 {"userName", get_user_name_static, set_user_name_static},
Tom Sepez4d5b8c52017-02-21 15:17:07 -0800584 {"value", get_value_static, set_value_static},
Tom Sepezb14a2f22018-10-12 23:21:58 +0000585 {"valueAsString", get_value_as_string_static, set_value_as_string_static}};
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700586
Dan Sinclairc94a7932017-10-26 16:48:57 -0400587const JSMethodSpec CJS_Field::MethodSpecs[] = {
Tom Sepez9b99b632017-02-21 15:05:57 -0800588 {"browseForFileToSubmit", browseForFileToSubmit_static},
589 {"buttonGetCaption", buttonGetCaption_static},
590 {"buttonGetIcon", buttonGetIcon_static},
591 {"buttonImportIcon", buttonImportIcon_static},
592 {"buttonSetCaption", buttonSetCaption_static},
593 {"buttonSetIcon", buttonSetIcon_static},
594 {"checkThisBox", checkThisBox_static},
595 {"clearItems", clearItems_static},
596 {"defaultIsChecked", defaultIsChecked_static},
597 {"deleteItemAt", deleteItemAt_static},
598 {"getArray", getArray_static},
599 {"getItemAt", getItemAt_static},
600 {"getLock", getLock_static},
601 {"insertItemAt", insertItemAt_static},
602 {"isBoxChecked", isBoxChecked_static},
603 {"isDefaultChecked", isDefaultChecked_static},
604 {"setAction", setAction_static},
605 {"setFocus", setFocus_static},
606 {"setItems", setItems_static},
607 {"setLock", setLock_static},
608 {"signatureGetModifications", signatureGetModifications_static},
609 {"signatureGetSeedValue", signatureGetSeedValue_static},
610 {"signatureInfo", signatureInfo_static},
611 {"signatureSetSeedValue", signatureSetSeedValue_static},
612 {"signatureSign", signatureSign_static},
Dan Sinclair909fa2d2017-12-12 01:53:28 +0000613 {"signatureValidate", signatureValidate_static}};
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700614
Tom Sepezb4958712020-10-13 20:30:43 +0000615uint32_t CJS_Field::ObjDefnID = 0;
Dan Sinclairf7435522018-02-05 22:27:22 +0000616const char CJS_Field::kName[] = "Field";
Dan Sinclair89d26c82017-10-26 12:21:28 -0400617
Dan Sinclairef299532017-10-26 16:48:30 -0400618// static
Tom Sepezb4958712020-10-13 20:30:43 +0000619uint32_t CJS_Field::GetObjDefnID() {
Dan Sinclairef299532017-10-26 16:48:30 -0400620 return ObjDefnID;
621}
622
623// static
Dan Sinclairbef4d3e2017-10-26 16:49:38 -0400624void CJS_Field::DefineJSObjects(CFXJS_Engine* pEngine) {
Dan Sinclairf7435522018-02-05 22:27:22 +0000625 ObjDefnID = pEngine->DefineObj(CJS_Field::kName, FXJSOBJTYPE_DYNAMIC,
Dan Sinclair998fee32018-02-05 21:43:19 +0000626 JSConstructor<CJS_Field>, JSDestructor);
Tom Sepez8b4ddeb2018-06-11 15:55:17 +0000627 DefineProps(pEngine, ObjDefnID, PropertySpecs);
628 DefineMethods(pEngine, ObjDefnID, MethodSpecs);
Dan Sinclair89d26c82017-10-26 12:21:28 -0400629}
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700630
Tom Sepez36aae4f2018-06-04 19:44:37 +0000631CJS_Field::CJS_Field(v8::Local<v8::Object> pObject, CJS_Runtime* pRuntime)
632 : CJS_Object(pObject, pRuntime) {}
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700633
Dan Sinclairf7435522018-02-05 22:27:22 +0000634CJS_Field::~CJS_Field() = default;
635
Dan Sinclairf7435522018-02-05 22:27:22 +0000636bool CJS_Field::AttachField(CJS_Document* pDocument,
637 const WideString& csFieldName) {
Tom Sepez2cbae732018-06-26 15:11:28 +0000638 m_pJSDoc.Reset(pDocument);
dsinclair82e17672016-10-11 12:38:01 -0700639 m_pFormFillEnv.Reset(pDocument->GetFormFillEnv());
Lei Zhang2468fcd2020-01-31 18:19:59 +0000640 m_bCanSet = m_pFormFillEnv->HasPermissions(
641 pdfium::access_permissions::kFillForm |
642 pdfium::access_permissions::kModifyAnnotation |
643 pdfium::access_permissions::kModifyContent);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700644
Lei Zhang073ecf42018-10-11 16:56:00 +0000645 CPDFSDK_InteractiveForm* pRDForm = m_pFormFillEnv->GetInteractiveForm();
646 CPDF_InteractiveForm* pForm = pRDForm->GetInteractiveForm();
Ryan Harrison275e2602017-09-18 14:23:18 -0400647 WideString swFieldNameTemp = csFieldName;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700648 swFieldNameTemp.Replace(L"..", L".");
649
Lei Zhang073ecf42018-10-11 16:56:00 +0000650 if (pForm->CountFields(swFieldNameTemp) <= 0) {
Lei Zhang2c495302021-10-07 23:13:30 +0000651 absl::optional<FieldNameData> parsed_data = ParseFieldName(swFieldNameTemp);
Lei Zhangd168ee72021-06-07 23:51:14 +0000652 if (!parsed_data.has_value())
tsepez4cf55152016-11-02 14:37:54 -0700653 return false;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700654
Lei Zhangd168ee72021-06-07 23:51:14 +0000655 m_FieldName = parsed_data.value().field_name;
656 m_nFormControlIndex = parsed_data.value().control_index;
tsepez4cf55152016-11-02 14:37:54 -0700657 return true;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700658 }
659
660 m_FieldName = swFieldNameTemp;
661 m_nFormControlIndex = -1;
662
tsepez4cf55152016-11-02 14:37:54 -0700663 return true;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700664}
665
Lei Zhang18915232018-07-12 20:53:40 +0000666std::vector<CPDF_FormField*> CJS_Field::GetFormFields() const {
Lei Zhang94919f72018-07-12 21:16:30 +0000667 return GetFormFieldsForName(m_pFormFillEnv.Get(), m_FieldName);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700668}
669
Lei Zhang4c7ad662018-07-12 20:29:40 +0000670CPDF_FormField* CJS_Field::GetFirstFormField() const {
Lei Zhang18915232018-07-12 20:53:40 +0000671 std::vector<CPDF_FormField*> fields = GetFormFields();
Lei Zhang4c7ad662018-07-12 20:29:40 +0000672 return fields.empty() ? nullptr : fields[0];
673}
674
Dan Sinclairf7435522018-02-05 22:27:22 +0000675CPDF_FormControl* CJS_Field::GetSmartFieldControl(CPDF_FormField* pFormField) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700676 if (!pFormField->CountControls() ||
677 m_nFormControlIndex >= pFormField->CountControls())
thestig1cd352e2016-06-07 17:53:06 -0700678 return nullptr;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700679 if (m_nFormControlIndex < 0)
680 return pFormField->GetControl(0);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700681 return pFormField->GetControl(m_nFormControlIndex);
682}
683
Tom Sepez3a6d0582018-08-17 19:28:52 +0000684CJS_Result CJS_Field::get_alignment(CJS_Runtime* pRuntime) {
Tom Sepez08b23fc2021-01-27 22:23:27 +0000685 DCHECK(m_pFormFillEnv);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700686
Lei Zhang4c7ad662018-07-12 20:29:40 +0000687 CPDF_FormField* pFormField = GetFirstFormField();
688 if (!pFormField)
Tom Sepez3a6d0582018-08-17 19:28:52 +0000689 return CJS_Result::Failure(JSMessage::kBadObjectError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700690
Ryan Harrison9baf31f2018-01-12 18:36:30 +0000691 if (pFormField->GetFieldType() != FormFieldType::kTextField)
Tom Sepez3a6d0582018-08-17 19:28:52 +0000692 return CJS_Result::Failure(JSMessage::kObjectTypeError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700693
dan sinclair646634b2017-10-19 14:30:28 -0400694 CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
695 if (!pFormControl)
Tom Sepez3a6d0582018-08-17 19:28:52 +0000696 return CJS_Result::Failure(JSMessage::kBadObjectError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700697
dan sinclair646634b2017-10-19 14:30:28 -0400698 switch (pFormControl->GetControlAlignment()) {
dan sinclair646634b2017-10-19 14:30:28 -0400699 case 0:
Tom Sepeza5ea7ff2018-10-30 19:24:36 +0000700 return CJS_Result::Success(pRuntime->NewString("left"));
Dan Sinclair8f524d62017-10-25 13:30:31 -0400701 case 1:
Tom Sepeza5ea7ff2018-10-30 19:24:36 +0000702 return CJS_Result::Success(pRuntime->NewString("center"));
dan sinclair646634b2017-10-19 14:30:28 -0400703 case 2:
Tom Sepeza5ea7ff2018-10-30 19:24:36 +0000704 return CJS_Result::Success(pRuntime->NewString("right"));
dan sinclair646634b2017-10-19 14:30:28 -0400705 }
Tom Sepeza5ea7ff2018-10-30 19:24:36 +0000706 return CJS_Result::Success(pRuntime->NewString(""));
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700707}
708
Tom Sepez3a6d0582018-08-17 19:28:52 +0000709CJS_Result CJS_Field::set_alignment(CJS_Runtime* pRuntime,
Dan Sinclairf7435522018-02-05 22:27:22 +0000710 v8::Local<v8::Value> vp) {
Tom Sepez08b23fc2021-01-27 22:23:27 +0000711 DCHECK(m_pFormFillEnv);
Tom Sepez16999822018-06-08 18:23:05 +0000712 if (!m_bCanSet)
Tom Sepez3a6d0582018-08-17 19:28:52 +0000713 return CJS_Result::Failure(JSMessage::kReadOnlyError);
Tom Sepez20736f72018-08-17 16:44:50 +0000714
Tom Sepez3a6d0582018-08-17 19:28:52 +0000715 return CJS_Result::Success();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700716}
717
Tom Sepez3a6d0582018-08-17 19:28:52 +0000718CJS_Result CJS_Field::get_border_style(CJS_Runtime* pRuntime) {
Tom Sepez08b23fc2021-01-27 22:23:27 +0000719 DCHECK(m_pFormFillEnv);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700720
Lei Zhang4c7ad662018-07-12 20:29:40 +0000721 CPDF_FormField* pFormField = GetFirstFormField();
722 if (!pFormField)
Tom Sepez3a6d0582018-08-17 19:28:52 +0000723 return CJS_Result::Failure(JSMessage::kBadObjectError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700724
Lei Zhang073ecf42018-10-11 16:56:00 +0000725 CPDFSDK_Widget* pWidget = m_pFormFillEnv->GetInteractiveForm()->GetWidget(
Lei Zhang7db136a2018-10-10 21:34:17 +0000726 GetSmartFieldControl(pFormField));
dan sinclaircbe23db2017-10-19 14:29:33 -0400727 if (!pWidget)
Tom Sepez3a6d0582018-08-17 19:28:52 +0000728 return CJS_Result::Failure(JSMessage::kBadObjectError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700729
dan sinclaircbe23db2017-10-19 14:29:33 -0400730 switch (pWidget->GetBorderStyle()) {
Lei Zhang99f44ba2020-06-18 17:41:38 +0000731 case BorderStyle::kSolid:
Tom Sepeza5ea7ff2018-10-30 19:24:36 +0000732 return CJS_Result::Success(pRuntime->NewString("solid"));
Lei Zhang99f44ba2020-06-18 17:41:38 +0000733 case BorderStyle::kDash:
Tom Sepeza5ea7ff2018-10-30 19:24:36 +0000734 return CJS_Result::Success(pRuntime->NewString("dashed"));
Lei Zhang99f44ba2020-06-18 17:41:38 +0000735 case BorderStyle::kBeveled:
Tom Sepeza5ea7ff2018-10-30 19:24:36 +0000736 return CJS_Result::Success(pRuntime->NewString("beveled"));
Lei Zhang99f44ba2020-06-18 17:41:38 +0000737 case BorderStyle::kInset:
Tom Sepeza5ea7ff2018-10-30 19:24:36 +0000738 return CJS_Result::Success(pRuntime->NewString("inset"));
Lei Zhang99f44ba2020-06-18 17:41:38 +0000739 case BorderStyle::kUnderline:
Tom Sepeza5ea7ff2018-10-30 19:24:36 +0000740 return CJS_Result::Success(pRuntime->NewString("underline"));
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700741 }
Tom Sepeza5ea7ff2018-10-30 19:24:36 +0000742 return CJS_Result::Success(pRuntime->NewString(""));
dan sinclaircbe23db2017-10-19 14:29:33 -0400743}
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700744
Tom Sepez3a6d0582018-08-17 19:28:52 +0000745CJS_Result CJS_Field::set_border_style(CJS_Runtime* pRuntime,
Dan Sinclairf7435522018-02-05 22:27:22 +0000746 v8::Local<v8::Value> vp) {
Tom Sepez08b23fc2021-01-27 22:23:27 +0000747 DCHECK(m_pFormFillEnv);
dan sinclaircbe23db2017-10-19 14:29:33 -0400748 if (!m_bCanSet)
Tom Sepez3a6d0582018-08-17 19:28:52 +0000749 return CJS_Result::Failure(JSMessage::kReadOnlyError);
dan sinclaircbe23db2017-10-19 14:29:33 -0400750
Tom Sepezc573bc72022-05-19 00:01:39 +0000751 ByteString byte_str = pRuntime->ToByteString(vp);
dan sinclaircbe23db2017-10-19 14:29:33 -0400752 if (m_bDelay) {
Dan Sinclair1b2a18e2017-10-24 13:56:29 -0400753 AddDelay_String(FP_BORDERSTYLE, byte_str);
dan sinclaircbe23db2017-10-19 14:29:33 -0400754 } else {
Lei Zhang94919f72018-07-12 21:16:30 +0000755 SetBorderStyle(m_pFormFillEnv.Get(), m_FieldName, m_nFormControlIndex,
756 byte_str);
dan sinclaircbe23db2017-10-19 14:29:33 -0400757 }
Tom Sepez3a6d0582018-08-17 19:28:52 +0000758 return CJS_Result::Success();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700759}
760
Tom Sepez3a6d0582018-08-17 19:28:52 +0000761CJS_Result CJS_Field::get_button_align_x(CJS_Runtime* pRuntime) {
Tom Sepez08b23fc2021-01-27 22:23:27 +0000762 DCHECK(m_pFormFillEnv);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700763
Lei Zhang4c7ad662018-07-12 20:29:40 +0000764 CPDF_FormField* pFormField = GetFirstFormField();
765 if (!pFormField)
Tom Sepez3a6d0582018-08-17 19:28:52 +0000766 return CJS_Result::Failure(JSMessage::kBadObjectError);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700767
Ryan Harrison9baf31f2018-01-12 18:36:30 +0000768 if (pFormField->GetFieldType() != FormFieldType::kPushButton)
Tom Sepez3a6d0582018-08-17 19:28:52 +0000769 return CJS_Result::Failure(JSMessage::kObjectTypeError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700770
dan sinclaircbe23db2017-10-19 14:29:33 -0400771 CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
772 if (!pFormControl)
Tom Sepez3a6d0582018-08-17 19:28:52 +0000773 return CJS_Result::Failure(JSMessage::kBadObjectError);
dan sinclaircbe23db2017-10-19 14:29:33 -0400774
775 CPDF_IconFit IconFit = pFormControl->GetIconFit();
Lei Zhang65b8db92018-10-10 17:50:31 +0000776 CFX_PointF pos = IconFit.GetIconBottomLeftPosition();
777 return CJS_Result::Success(pRuntime->NewNumber(static_cast<int32_t>(pos.x)));
dan sinclaircbe23db2017-10-19 14:29:33 -0400778}
779
Tom Sepez3a6d0582018-08-17 19:28:52 +0000780CJS_Result CJS_Field::set_button_align_x(CJS_Runtime* pRuntime,
Dan Sinclairf7435522018-02-05 22:27:22 +0000781 v8::Local<v8::Value> vp) {
Tom Sepez08b23fc2021-01-27 22:23:27 +0000782 DCHECK(m_pFormFillEnv);
Tom Sepez16999822018-06-08 18:23:05 +0000783 if (!m_bCanSet)
Tom Sepez3a6d0582018-08-17 19:28:52 +0000784 return CJS_Result::Failure(JSMessage::kReadOnlyError);
785 return CJS_Result::Success();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700786}
787
Tom Sepez3a6d0582018-08-17 19:28:52 +0000788CJS_Result CJS_Field::get_button_align_y(CJS_Runtime* pRuntime) {
Tom Sepez08b23fc2021-01-27 22:23:27 +0000789 DCHECK(m_pFormFillEnv);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700790
Lei Zhang4c7ad662018-07-12 20:29:40 +0000791 CPDF_FormField* pFormField = GetFirstFormField();
792 if (!pFormField)
Tom Sepez3a6d0582018-08-17 19:28:52 +0000793 return CJS_Result::Failure(JSMessage::kBadObjectError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700794
Ryan Harrison9baf31f2018-01-12 18:36:30 +0000795 if (pFormField->GetFieldType() != FormFieldType::kPushButton)
Tom Sepez3a6d0582018-08-17 19:28:52 +0000796 return CJS_Result::Failure(JSMessage::kObjectTypeError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700797
dan sinclaircbe23db2017-10-19 14:29:33 -0400798 CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
799 if (!pFormControl)
Tom Sepez3a6d0582018-08-17 19:28:52 +0000800 return CJS_Result::Failure(JSMessage::kBadObjectError);
dan sinclaircbe23db2017-10-19 14:29:33 -0400801
802 CPDF_IconFit IconFit = pFormControl->GetIconFit();
Lei Zhang65b8db92018-10-10 17:50:31 +0000803 CFX_PointF pos = IconFit.GetIconBottomLeftPosition();
804 return CJS_Result::Success(pRuntime->NewNumber(static_cast<int32_t>(pos.y)));
dan sinclaircbe23db2017-10-19 14:29:33 -0400805}
806
Tom Sepez3a6d0582018-08-17 19:28:52 +0000807CJS_Result CJS_Field::set_button_align_y(CJS_Runtime* pRuntime,
Dan Sinclairf7435522018-02-05 22:27:22 +0000808 v8::Local<v8::Value> vp) {
Tom Sepez08b23fc2021-01-27 22:23:27 +0000809 DCHECK(m_pFormFillEnv);
Tom Sepez16999822018-06-08 18:23:05 +0000810 if (!m_bCanSet)
Tom Sepez3a6d0582018-08-17 19:28:52 +0000811 return CJS_Result::Failure(JSMessage::kReadOnlyError);
812 return CJS_Result::Success();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700813}
814
Tom Sepez3a6d0582018-08-17 19:28:52 +0000815CJS_Result CJS_Field::get_button_fit_bounds(CJS_Runtime* pRuntime) {
Tom Sepez08b23fc2021-01-27 22:23:27 +0000816 DCHECK(m_pFormFillEnv);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700817
Lei Zhang4c7ad662018-07-12 20:29:40 +0000818 CPDF_FormField* pFormField = GetFirstFormField();
819 if (!pFormField)
Tom Sepez3a6d0582018-08-17 19:28:52 +0000820 return CJS_Result::Failure(JSMessage::kBadObjectError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700821
Ryan Harrison9baf31f2018-01-12 18:36:30 +0000822 if (pFormField->GetFieldType() != FormFieldType::kPushButton)
Tom Sepez3a6d0582018-08-17 19:28:52 +0000823 return CJS_Result::Failure(JSMessage::kObjectTypeError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700824
dan sinclair646634b2017-10-19 14:30:28 -0400825 CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
826 if (!pFormControl)
Tom Sepez3a6d0582018-08-17 19:28:52 +0000827 return CJS_Result::Failure(JSMessage::kBadObjectError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700828
Tom Sepez3a6d0582018-08-17 19:28:52 +0000829 return CJS_Result::Success(
Dan Sinclair8f524d62017-10-25 13:30:31 -0400830 pRuntime->NewBoolean(pFormControl->GetIconFit().GetFittingBounds()));
dan sinclaircbe23db2017-10-19 14:29:33 -0400831}
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700832
Tom Sepez3a6d0582018-08-17 19:28:52 +0000833CJS_Result CJS_Field::set_button_fit_bounds(CJS_Runtime* pRuntime,
Dan Sinclairf7435522018-02-05 22:27:22 +0000834 v8::Local<v8::Value> vp) {
Tom Sepez08b23fc2021-01-27 22:23:27 +0000835 DCHECK(m_pFormFillEnv);
Tom Sepez16999822018-06-08 18:23:05 +0000836 if (!m_bCanSet)
Tom Sepez3a6d0582018-08-17 19:28:52 +0000837 return CJS_Result::Failure(JSMessage::kReadOnlyError);
838 return CJS_Result::Success();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700839}
840
Tom Sepez3a6d0582018-08-17 19:28:52 +0000841CJS_Result CJS_Field::get_button_position(CJS_Runtime* pRuntime) {
Tom Sepez08b23fc2021-01-27 22:23:27 +0000842 DCHECK(m_pFormFillEnv);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700843
Lei Zhang4c7ad662018-07-12 20:29:40 +0000844 CPDF_FormField* pFormField = GetFirstFormField();
845 if (!pFormField)
Tom Sepez3a6d0582018-08-17 19:28:52 +0000846 return CJS_Result::Failure(JSMessage::kBadObjectError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700847
Ryan Harrison9baf31f2018-01-12 18:36:30 +0000848 if (pFormField->GetFieldType() != FormFieldType::kPushButton)
Tom Sepez3a6d0582018-08-17 19:28:52 +0000849 return CJS_Result::Failure(JSMessage::kObjectTypeError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700850
dan sinclair646634b2017-10-19 14:30:28 -0400851 CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
852 if (!pFormControl)
Tom Sepez3a6d0582018-08-17 19:28:52 +0000853 return CJS_Result::Failure(JSMessage::kBadObjectError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700854
Tom Sepez3a6d0582018-08-17 19:28:52 +0000855 return CJS_Result::Success(
Tom Sepez20736f72018-08-17 16:44:50 +0000856 pRuntime->NewNumber(pFormControl->GetTextPosition()));
dan sinclaircbe23db2017-10-19 14:29:33 -0400857}
858
Tom Sepez3a6d0582018-08-17 19:28:52 +0000859CJS_Result CJS_Field::set_button_position(CJS_Runtime* pRuntime,
Dan Sinclairf7435522018-02-05 22:27:22 +0000860 v8::Local<v8::Value> vp) {
Tom Sepez08b23fc2021-01-27 22:23:27 +0000861 DCHECK(m_pFormFillEnv);
Tom Sepez16999822018-06-08 18:23:05 +0000862 if (!m_bCanSet)
Tom Sepez3a6d0582018-08-17 19:28:52 +0000863 return CJS_Result::Failure(JSMessage::kBadObjectError);
864 return CJS_Result::Success();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700865}
866
Tom Sepez3a6d0582018-08-17 19:28:52 +0000867CJS_Result CJS_Field::get_button_scale_how(CJS_Runtime* pRuntime) {
Tom Sepez08b23fc2021-01-27 22:23:27 +0000868 DCHECK(m_pFormFillEnv);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700869
Lei Zhang4c7ad662018-07-12 20:29:40 +0000870 CPDF_FormField* pFormField = GetFirstFormField();
871 if (!pFormField)
Tom Sepez3a6d0582018-08-17 19:28:52 +0000872 return CJS_Result::Failure(JSMessage::kBadObjectError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700873
Ryan Harrison9baf31f2018-01-12 18:36:30 +0000874 if (pFormField->GetFieldType() != FormFieldType::kPushButton)
Tom Sepez3a6d0582018-08-17 19:28:52 +0000875 return CJS_Result::Failure(JSMessage::kObjectTypeError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700876
dan sinclair646634b2017-10-19 14:30:28 -0400877 CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
878 if (!pFormControl)
Tom Sepez3a6d0582018-08-17 19:28:52 +0000879 return CJS_Result::Failure(JSMessage::kBadObjectError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700880
Tom Sepez305c59f2022-01-24 22:40:37 +0000881 return CJS_Result::Success(
882 pRuntime->NewBoolean(!pFormControl->GetIconFit().IsProportionalScale()));
dan sinclaircbe23db2017-10-19 14:29:33 -0400883}
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700884
Tom Sepez3a6d0582018-08-17 19:28:52 +0000885CJS_Result CJS_Field::set_button_scale_how(CJS_Runtime* pRuntime,
Dan Sinclairf7435522018-02-05 22:27:22 +0000886 v8::Local<v8::Value> vp) {
Tom Sepez08b23fc2021-01-27 22:23:27 +0000887 DCHECK(m_pFormFillEnv);
Tom Sepez16999822018-06-08 18:23:05 +0000888 if (!m_bCanSet)
Tom Sepez3a6d0582018-08-17 19:28:52 +0000889 return CJS_Result::Failure(JSMessage::kReadOnlyError);
890 return CJS_Result::Success();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700891}
892
Tom Sepez3a6d0582018-08-17 19:28:52 +0000893CJS_Result CJS_Field::get_button_scale_when(CJS_Runtime* pRuntime) {
Tom Sepez08b23fc2021-01-27 22:23:27 +0000894 DCHECK(m_pFormFillEnv);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700895
Lei Zhang4c7ad662018-07-12 20:29:40 +0000896 CPDF_FormField* pFormField = GetFirstFormField();
897 if (!pFormField)
Tom Sepez3a6d0582018-08-17 19:28:52 +0000898 return CJS_Result::Failure(JSMessage::kBadObjectError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700899
Ryan Harrison9baf31f2018-01-12 18:36:30 +0000900 if (pFormField->GetFieldType() != FormFieldType::kPushButton)
Tom Sepez3a6d0582018-08-17 19:28:52 +0000901 return CJS_Result::Failure(JSMessage::kObjectTypeError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700902
dan sinclair646634b2017-10-19 14:30:28 -0400903 CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
904 if (!pFormControl)
Tom Sepez3a6d0582018-08-17 19:28:52 +0000905 return CJS_Result::Failure(JSMessage::kBadObjectError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700906
dan sinclair646634b2017-10-19 14:30:28 -0400907 CPDF_IconFit IconFit = pFormControl->GetIconFit();
Lei Zhang55ae76d2020-06-23 01:12:41 +0000908 CPDF_IconFit::ScaleMethod scale_method = IconFit.GetScaleMethod();
909 switch (scale_method) {
910 case CPDF_IconFit::ScaleMethod::kAlways:
911 case CPDF_IconFit::ScaleMethod::kBigger:
912 case CPDF_IconFit::ScaleMethod::kNever:
913 case CPDF_IconFit::ScaleMethod::kSmaller:
Tom Sepez3a6d0582018-08-17 19:28:52 +0000914 return CJS_Result::Success(
Lei Zhang55ae76d2020-06-23 01:12:41 +0000915 pRuntime->NewNumber(static_cast<int>(scale_method)));
dan sinclair646634b2017-10-19 14:30:28 -0400916 }
dan sinclaircbe23db2017-10-19 14:29:33 -0400917}
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700918
Tom Sepez3a6d0582018-08-17 19:28:52 +0000919CJS_Result CJS_Field::set_button_scale_when(CJS_Runtime* pRuntime,
Dan Sinclairf7435522018-02-05 22:27:22 +0000920 v8::Local<v8::Value> vp) {
Tom Sepez08b23fc2021-01-27 22:23:27 +0000921 DCHECK(m_pFormFillEnv);
Tom Sepez16999822018-06-08 18:23:05 +0000922 if (!m_bCanSet)
Tom Sepez3a6d0582018-08-17 19:28:52 +0000923 return CJS_Result::Failure(JSMessage::kReadOnlyError);
924 return CJS_Result::Success();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700925}
926
Tom Sepez3a6d0582018-08-17 19:28:52 +0000927CJS_Result CJS_Field::get_calc_order_index(CJS_Runtime* pRuntime) {
Tom Sepez08b23fc2021-01-27 22:23:27 +0000928 DCHECK(m_pFormFillEnv);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700929
Lei Zhang4c7ad662018-07-12 20:29:40 +0000930 CPDF_FormField* pFormField = GetFirstFormField();
931 if (!pFormField)
Tom Sepez3a6d0582018-08-17 19:28:52 +0000932 return CJS_Result::Failure(JSMessage::kBadObjectError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700933
Lei Zhang83f2d702018-07-12 19:07:40 +0000934 if (!IsComboBoxOrTextField(pFormField))
Tom Sepez3a6d0582018-08-17 19:28:52 +0000935 return CJS_Result::Failure(JSMessage::kObjectTypeError);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700936
Lei Zhang073ecf42018-10-11 16:56:00 +0000937 CPDFSDK_InteractiveForm* pRDForm = m_pFormFillEnv->GetInteractiveForm();
938 CPDF_InteractiveForm* pForm = pRDForm->GetInteractiveForm();
Tom Sepez9e372dc2021-11-29 22:03:48 +0000939 return CJS_Result::Success(
940 pRuntime->NewNumber(pForm->FindFieldInCalculationOrder(pFormField)));
dan sinclaircbe23db2017-10-19 14:29:33 -0400941}
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700942
Tom Sepez3a6d0582018-08-17 19:28:52 +0000943CJS_Result CJS_Field::set_calc_order_index(CJS_Runtime* pRuntime,
Dan Sinclairf7435522018-02-05 22:27:22 +0000944 v8::Local<v8::Value> vp) {
Tom Sepez08b23fc2021-01-27 22:23:27 +0000945 DCHECK(m_pFormFillEnv);
Tom Sepez16999822018-06-08 18:23:05 +0000946 if (!m_bCanSet)
Tom Sepez3a6d0582018-08-17 19:28:52 +0000947 return CJS_Result::Failure(JSMessage::kReadOnlyError);
948 return CJS_Result::Success();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700949}
950
Tom Sepez3a6d0582018-08-17 19:28:52 +0000951CJS_Result CJS_Field::get_char_limit(CJS_Runtime* pRuntime) {
Tom Sepez08b23fc2021-01-27 22:23:27 +0000952 DCHECK(m_pFormFillEnv);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700953
Lei Zhang4c7ad662018-07-12 20:29:40 +0000954 CPDF_FormField* pFormField = GetFirstFormField();
955 if (!pFormField)
Tom Sepez3a6d0582018-08-17 19:28:52 +0000956 return CJS_Result::Failure(JSMessage::kBadObjectError);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700957
Ryan Harrison9baf31f2018-01-12 18:36:30 +0000958 if (pFormField->GetFieldType() != FormFieldType::kTextField)
Tom Sepez3a6d0582018-08-17 19:28:52 +0000959 return CJS_Result::Failure(JSMessage::kObjectTypeError);
960 return CJS_Result::Success(
Dan Sinclair8f524d62017-10-25 13:30:31 -0400961 pRuntime->NewNumber(static_cast<int32_t>(pFormField->GetMaxLen())));
dan sinclaircbe23db2017-10-19 14:29:33 -0400962}
963
Tom Sepez3a6d0582018-08-17 19:28:52 +0000964CJS_Result CJS_Field::set_char_limit(CJS_Runtime* pRuntime,
Dan Sinclairf7435522018-02-05 22:27:22 +0000965 v8::Local<v8::Value> vp) {
Tom Sepez08b23fc2021-01-27 22:23:27 +0000966 DCHECK(m_pFormFillEnv);
Tom Sepez16999822018-06-08 18:23:05 +0000967 if (!m_bCanSet)
Tom Sepez3a6d0582018-08-17 19:28:52 +0000968 return CJS_Result::Failure(JSMessage::kReadOnlyError);
969 return CJS_Result::Success();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700970}
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700971
Tom Sepez3a6d0582018-08-17 19:28:52 +0000972CJS_Result CJS_Field::get_comb(CJS_Runtime* pRuntime) {
Tom Sepez08b23fc2021-01-27 22:23:27 +0000973 DCHECK(m_pFormFillEnv);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700974
Lei Zhang4c7ad662018-07-12 20:29:40 +0000975 CPDF_FormField* pFormField = GetFirstFormField();
976 if (!pFormField)
Tom Sepez3a6d0582018-08-17 19:28:52 +0000977 return CJS_Result::Failure(JSMessage::kBadObjectError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700978
Ryan Harrison9baf31f2018-01-12 18:36:30 +0000979 if (pFormField->GetFieldType() != FormFieldType::kTextField)
Tom Sepez3a6d0582018-08-17 19:28:52 +0000980 return CJS_Result::Failure(JSMessage::kObjectTypeError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700981
Lei Zhanga676aca2019-02-02 00:41:09 +0000982 return CJS_Result::Success(pRuntime->NewBoolean(
983 !!(pFormField->GetFieldFlags() & pdfium::form_flags::kTextComb)));
dan sinclaircbe23db2017-10-19 14:29:33 -0400984}
985
Tom Sepez3a6d0582018-08-17 19:28:52 +0000986CJS_Result CJS_Field::set_comb(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp) {
Tom Sepez08b23fc2021-01-27 22:23:27 +0000987 DCHECK(m_pFormFillEnv);
Tom Sepez16999822018-06-08 18:23:05 +0000988 if (!m_bCanSet)
Tom Sepez3a6d0582018-08-17 19:28:52 +0000989 return CJS_Result::Failure(JSMessage::kReadOnlyError);
990 return CJS_Result::Success();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700991}
992
Tom Sepez3a6d0582018-08-17 19:28:52 +0000993CJS_Result CJS_Field::get_commit_on_sel_change(CJS_Runtime* pRuntime) {
Tom Sepez08b23fc2021-01-27 22:23:27 +0000994 DCHECK(m_pFormFillEnv);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700995
Lei Zhang4c7ad662018-07-12 20:29:40 +0000996 CPDF_FormField* pFormField = GetFirstFormField();
997 if (!pFormField)
Tom Sepez3a6d0582018-08-17 19:28:52 +0000998 return CJS_Result::Failure(JSMessage::kBadObjectError);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700999
Lei Zhang83f2d702018-07-12 19:07:40 +00001000 if (!IsComboBoxOrListBox(pFormField))
Tom Sepez3a6d0582018-08-17 19:28:52 +00001001 return CJS_Result::Failure(JSMessage::kObjectTypeError);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001002
Lei Zhanga676aca2019-02-02 00:41:09 +00001003 uint32_t dwFieldFlags = pFormField->GetFieldFlags();
Tom Sepez3a6d0582018-08-17 19:28:52 +00001004 return CJS_Result::Success(pRuntime->NewBoolean(
Lei Zhanga676aca2019-02-02 00:41:09 +00001005 !!(dwFieldFlags & pdfium::form_flags::kChoiceCommitOnSelChange)));
dan sinclaircbe23db2017-10-19 14:29:33 -04001006}
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001007
Tom Sepez3a6d0582018-08-17 19:28:52 +00001008CJS_Result CJS_Field::set_commit_on_sel_change(CJS_Runtime* pRuntime,
Dan Sinclairf7435522018-02-05 22:27:22 +00001009 v8::Local<v8::Value> vp) {
Tom Sepez08b23fc2021-01-27 22:23:27 +00001010 DCHECK(m_pFormFillEnv);
Tom Sepez16999822018-06-08 18:23:05 +00001011 if (!m_bCanSet)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001012 return CJS_Result::Failure(JSMessage::kReadOnlyError);
1013 return CJS_Result::Success();
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001014}
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001015
Tom Sepez3a6d0582018-08-17 19:28:52 +00001016CJS_Result CJS_Field::get_current_value_indices(CJS_Runtime* pRuntime) {
Lei Zhang4c7ad662018-07-12 20:29:40 +00001017 CPDF_FormField* pFormField = GetFirstFormField();
1018 if (!pFormField)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001019 return CJS_Result::Failure(JSMessage::kBadObjectError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001020
Lei Zhang83f2d702018-07-12 19:07:40 +00001021 if (!IsComboBoxOrListBox(pFormField))
Tom Sepez3a6d0582018-08-17 19:28:52 +00001022 return CJS_Result::Failure(JSMessage::kObjectTypeError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001023
dan sinclaircbe23db2017-10-19 14:29:33 -04001024 int count = pFormField->CountSelectedItems();
Dan Sinclair8f524d62017-10-25 13:30:31 -04001025 if (count <= 0)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001026 return CJS_Result::Success(pRuntime->NewNumber(-1));
Dan Sinclair8f524d62017-10-25 13:30:31 -04001027 if (count == 1)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001028 return CJS_Result::Success(
Tom Sepez20736f72018-08-17 16:44:50 +00001029 pRuntime->NewNumber(pFormField->GetSelectedIndex(0)));
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001030
Dan Sinclair3a1ba8e2017-10-26 09:28:59 -04001031 v8::Local<v8::Array> SelArray = pRuntime->NewArray();
1032 for (int i = 0; i < count; i++) {
1033 pRuntime->PutArrayElement(
1034 SelArray, i, pRuntime->NewNumber(pFormField->GetSelectedIndex(i)));
dan sinclaircbe23db2017-10-19 14:29:33 -04001035 }
Dan Sinclair3a1ba8e2017-10-26 09:28:59 -04001036 if (SelArray.IsEmpty())
Tom Sepez3a6d0582018-08-17 19:28:52 +00001037 return CJS_Result::Success(pRuntime->NewArray());
1038 return CJS_Result::Success(SelArray);
dan sinclaircbe23db2017-10-19 14:29:33 -04001039}
1040
Tom Sepez3a6d0582018-08-17 19:28:52 +00001041CJS_Result CJS_Field::set_current_value_indices(CJS_Runtime* pRuntime,
Dan Sinclairf7435522018-02-05 22:27:22 +00001042 v8::Local<v8::Value> vp) {
dan sinclaircbe23db2017-10-19 14:29:33 -04001043 if (!m_bCanSet)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001044 return CJS_Result::Failure(JSMessage::kReadOnlyError);
dan sinclaircbe23db2017-10-19 14:29:33 -04001045
1046 std::vector<uint32_t> array;
dan sinclair80435cb2017-10-24 21:40:24 -04001047 if (vp->IsNumber()) {
1048 array.push_back(pRuntime->ToInt32(vp));
Tom Sepezaf6371f2020-11-02 20:13:01 +00001049 } else if (fxv8::IsArray(vp)) {
Dan Sinclair3a1ba8e2017-10-26 09:28:59 -04001050 v8::Local<v8::Array> SelArray = pRuntime->ToArray(vp);
1051 for (size_t i = 0; i < pRuntime->GetArrayLength(SelArray); i++) {
1052 array.push_back(
1053 pRuntime->ToInt32(pRuntime->GetArrayElement(SelArray, i)));
1054 }
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001055 }
1056
dan sinclaircbe23db2017-10-19 14:29:33 -04001057 if (m_bDelay) {
1058 AddDelay_WordArray(FP_CURRENTVALUEINDICES, array);
1059 } else {
Lei Zhang94919f72018-07-12 21:16:30 +00001060 SetCurrentValueIndices(m_pFormFillEnv.Get(), m_FieldName,
1061 m_nFormControlIndex, array);
dan sinclaircbe23db2017-10-19 14:29:33 -04001062 }
Tom Sepez3a6d0582018-08-17 19:28:52 +00001063 return CJS_Result::Success();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001064}
1065
Tom Sepez3a6d0582018-08-17 19:28:52 +00001066CJS_Result CJS_Field::get_default_style(CJS_Runtime* pRuntime) {
1067 return CJS_Result::Failure(JSMessage::kNotSupportedError);
dan sinclaircbe23db2017-10-19 14:29:33 -04001068}
1069
Tom Sepez3a6d0582018-08-17 19:28:52 +00001070CJS_Result CJS_Field::set_default_style(CJS_Runtime* pRuntime,
Dan Sinclairf7435522018-02-05 22:27:22 +00001071 v8::Local<v8::Value> vp) {
Tom Sepez3a6d0582018-08-17 19:28:52 +00001072 return CJS_Result::Failure(JSMessage::kNotSupportedError);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001073}
1074
Tom Sepez3a6d0582018-08-17 19:28:52 +00001075CJS_Result CJS_Field::get_default_value(CJS_Runtime* pRuntime) {
Tom Sepez08b23fc2021-01-27 22:23:27 +00001076 DCHECK(m_pFormFillEnv);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001077
Lei Zhang4c7ad662018-07-12 20:29:40 +00001078 CPDF_FormField* pFormField = GetFirstFormField();
1079 if (!pFormField)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001080 return CJS_Result::Failure(JSMessage::kBadObjectError);
Dan Sinclair8f524d62017-10-25 13:30:31 -04001081
Ryan Harrison9baf31f2018-01-12 18:36:30 +00001082 if (pFormField->GetFieldType() == FormFieldType::kPushButton ||
1083 pFormField->GetFieldType() == FormFieldType::kSignature) {
Tom Sepez3a6d0582018-08-17 19:28:52 +00001084 return CJS_Result::Failure(JSMessage::kObjectTypeError);
Dan Sinclair8f524d62017-10-25 13:30:31 -04001085 }
1086
Tom Sepez3a6d0582018-08-17 19:28:52 +00001087 return CJS_Result::Success(
Tom Sepezb6b01cb2018-06-20 16:10:13 +00001088 pRuntime->NewString(pFormField->GetDefaultValue().AsStringView()));
Dan Sinclair8f524d62017-10-25 13:30:31 -04001089}
1090
Tom Sepez3a6d0582018-08-17 19:28:52 +00001091CJS_Result CJS_Field::set_default_value(CJS_Runtime* pRuntime,
Dan Sinclairf7435522018-02-05 22:27:22 +00001092 v8::Local<v8::Value> vp) {
Tom Sepez08b23fc2021-01-27 22:23:27 +00001093 DCHECK(m_pFormFillEnv);
Tom Sepez16999822018-06-08 18:23:05 +00001094 if (!m_bCanSet)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001095 return CJS_Result::Failure(JSMessage::kReadOnlyError);
1096 return CJS_Result::Success();
Dan Sinclair8f524d62017-10-25 13:30:31 -04001097}
1098
Tom Sepez3a6d0582018-08-17 19:28:52 +00001099CJS_Result CJS_Field::get_do_not_scroll(CJS_Runtime* pRuntime) {
Tom Sepez08b23fc2021-01-27 22:23:27 +00001100 DCHECK(m_pFormFillEnv);
Dan Sinclair8f524d62017-10-25 13:30:31 -04001101
Lei Zhang4c7ad662018-07-12 20:29:40 +00001102 CPDF_FormField* pFormField = GetFirstFormField();
1103 if (!pFormField)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001104 return CJS_Result::Failure(JSMessage::kBadObjectError);
dan sinclaircbe23db2017-10-19 14:29:33 -04001105
Ryan Harrison9baf31f2018-01-12 18:36:30 +00001106 if (pFormField->GetFieldType() != FormFieldType::kTextField)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001107 return CJS_Result::Failure(JSMessage::kObjectTypeError);
dan sinclaircbe23db2017-10-19 14:29:33 -04001108
Tom Sepez3a6d0582018-08-17 19:28:52 +00001109 return CJS_Result::Success(pRuntime->NewBoolean(
Lei Zhanga676aca2019-02-02 00:41:09 +00001110 !!(pFormField->GetFieldFlags() & pdfium::form_flags::kTextDoNotScroll)));
dan sinclaircbe23db2017-10-19 14:29:33 -04001111}
1112
Tom Sepez3a6d0582018-08-17 19:28:52 +00001113CJS_Result CJS_Field::set_do_not_scroll(CJS_Runtime* pRuntime,
Dan Sinclairf7435522018-02-05 22:27:22 +00001114 v8::Local<v8::Value> vp) {
Tom Sepez08b23fc2021-01-27 22:23:27 +00001115 DCHECK(m_pFormFillEnv);
Tom Sepez16999822018-06-08 18:23:05 +00001116 if (!m_bCanSet)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001117 return CJS_Result::Failure(JSMessage::kReadOnlyError);
1118 return CJS_Result::Success();
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001119}
1120
Tom Sepez3a6d0582018-08-17 19:28:52 +00001121CJS_Result CJS_Field::get_do_not_spell_check(CJS_Runtime* pRuntime) {
Tom Sepez08b23fc2021-01-27 22:23:27 +00001122 DCHECK(m_pFormFillEnv);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001123
Lei Zhang4c7ad662018-07-12 20:29:40 +00001124 CPDF_FormField* pFormField = GetFirstFormField();
1125 if (!pFormField)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001126 return CJS_Result::Failure(JSMessage::kBadObjectError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001127
Lei Zhang83f2d702018-07-12 19:07:40 +00001128 if (!IsComboBoxOrTextField(pFormField))
Tom Sepez3a6d0582018-08-17 19:28:52 +00001129 return CJS_Result::Failure(JSMessage::kObjectTypeError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001130
Lei Zhanga676aca2019-02-02 00:41:09 +00001131 uint32_t dwFieldFlags = pFormField->GetFieldFlags();
Tom Sepez3a6d0582018-08-17 19:28:52 +00001132 return CJS_Result::Success(pRuntime->NewBoolean(
Lei Zhanga676aca2019-02-02 00:41:09 +00001133 !!(dwFieldFlags & pdfium::form_flags::kTextDoNotSpellCheck)));
dan sinclaircbe23db2017-10-19 14:29:33 -04001134}
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001135
Tom Sepez3a6d0582018-08-17 19:28:52 +00001136CJS_Result CJS_Field::set_do_not_spell_check(CJS_Runtime* pRuntime,
Dan Sinclairf7435522018-02-05 22:27:22 +00001137 v8::Local<v8::Value> vp) {
Tom Sepez08b23fc2021-01-27 22:23:27 +00001138 DCHECK(m_pFormFillEnv);
Tom Sepez16999822018-06-08 18:23:05 +00001139 if (!m_bCanSet)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001140 return CJS_Result::Failure(JSMessage::kReadOnlyError);
1141 return CJS_Result::Success();
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001142}
1143
Tom Sepez3a6d0582018-08-17 19:28:52 +00001144CJS_Result CJS_Field::get_delay(CJS_Runtime* pRuntime) {
1145 return CJS_Result::Success(pRuntime->NewBoolean(m_bDelay));
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001146}
1147
Tom Sepez3a6d0582018-08-17 19:28:52 +00001148CJS_Result CJS_Field::set_delay(CJS_Runtime* pRuntime,
Dan Sinclairf7435522018-02-05 22:27:22 +00001149 v8::Local<v8::Value> vp) {
dan sinclaircbe23db2017-10-19 14:29:33 -04001150 if (!m_bCanSet)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001151 return CJS_Result::Failure(JSMessage::kReadOnlyError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001152
dan sinclair80435cb2017-10-24 21:40:24 -04001153 SetDelay(pRuntime->ToBoolean(vp));
Tom Sepez3a6d0582018-08-17 19:28:52 +00001154 return CJS_Result::Success();
dan sinclaircbe23db2017-10-19 14:29:33 -04001155}
1156
Tom Sepez3a6d0582018-08-17 19:28:52 +00001157CJS_Result CJS_Field::get_display(CJS_Runtime* pRuntime) {
Lei Zhang4c7ad662018-07-12 20:29:40 +00001158 CPDF_FormField* pFormField = GetFirstFormField();
1159 if (!pFormField)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001160 return CJS_Result::Failure(JSMessage::kBadObjectError);
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001161
Lei Zhang073ecf42018-10-11 16:56:00 +00001162 CPDFSDK_InteractiveForm* pForm = m_pFormFillEnv->GetInteractiveForm();
1163 CPDFSDK_Widget* pWidget = pForm->GetWidget(GetSmartFieldControl(pFormField));
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001164 if (!pWidget)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001165 return CJS_Result::Failure(JSMessage::kBadObjectError);
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001166
1167 uint32_t dwFlag = pWidget->GetFlags();
Lei Zhang85549b42019-02-02 00:40:19 +00001168 if (pdfium::annotation_flags::kInvisible & dwFlag ||
1169 pdfium::annotation_flags::kHidden & dwFlag) {
Tom Sepez3a6d0582018-08-17 19:28:52 +00001170 return CJS_Result::Success(pRuntime->NewNumber(1));
Lei Zhang85549b42019-02-02 00:40:19 +00001171 }
Dan Sinclair8f524d62017-10-25 13:30:31 -04001172
Lei Zhang85549b42019-02-02 00:40:19 +00001173 if (pdfium::annotation_flags::kPrint & dwFlag) {
1174 if (pdfium::annotation_flags::kNoView & dwFlag)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001175 return CJS_Result::Success(pRuntime->NewNumber(3));
1176 return CJS_Result::Success(pRuntime->NewNumber(0));
dan sinclaircbe23db2017-10-19 14:29:33 -04001177 }
Tom Sepez3a6d0582018-08-17 19:28:52 +00001178 return CJS_Result::Success(pRuntime->NewNumber(2));
dan sinclaircbe23db2017-10-19 14:29:33 -04001179}
1180
Tom Sepez3a6d0582018-08-17 19:28:52 +00001181CJS_Result CJS_Field::set_display(CJS_Runtime* pRuntime,
Dan Sinclairf7435522018-02-05 22:27:22 +00001182 v8::Local<v8::Value> vp) {
dan sinclaircbe23db2017-10-19 14:29:33 -04001183 if (!m_bCanSet)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001184 return CJS_Result::Failure(JSMessage::kReadOnlyError);
dan sinclaircbe23db2017-10-19 14:29:33 -04001185
1186 if (m_bDelay) {
dan sinclair80435cb2017-10-24 21:40:24 -04001187 AddDelay_Int(FP_DISPLAY, pRuntime->ToInt32(vp));
dan sinclaircbe23db2017-10-19 14:29:33 -04001188 } else {
Lei Zhang94919f72018-07-12 21:16:30 +00001189 SetDisplay(m_pFormFillEnv.Get(), m_FieldName, m_nFormControlIndex,
1190 pRuntime->ToInt32(vp));
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001191 }
Tom Sepez3a6d0582018-08-17 19:28:52 +00001192 return CJS_Result::Success();
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001193}
1194
Tom Sepez3a6d0582018-08-17 19:28:52 +00001195CJS_Result CJS_Field::get_doc(CJS_Runtime* pRuntime) {
1196 return CJS_Result::Success(m_pJSDoc->ToV8Object());
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001197}
1198
Tom Sepez3a6d0582018-08-17 19:28:52 +00001199CJS_Result CJS_Field::set_doc(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp) {
1200 return CJS_Result::Failure(JSMessage::kNotSupportedError);
dan sinclaircbe23db2017-10-19 14:29:33 -04001201}
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001202
Tom Sepez3a6d0582018-08-17 19:28:52 +00001203CJS_Result CJS_Field::get_editable(CJS_Runtime* pRuntime) {
Lei Zhang4c7ad662018-07-12 20:29:40 +00001204 CPDF_FormField* pFormField = GetFirstFormField();
1205 if (!pFormField)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001206 return CJS_Result::Failure(JSMessage::kBadObjectError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001207
Ryan Harrison9baf31f2018-01-12 18:36:30 +00001208 if (pFormField->GetFieldType() != FormFieldType::kComboBox)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001209 return CJS_Result::Failure(JSMessage::kObjectTypeError);
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001210
Lei Zhanga676aca2019-02-02 00:41:09 +00001211 return CJS_Result::Success(pRuntime->NewBoolean(
1212 !!(pFormField->GetFieldFlags() & pdfium::form_flags::kChoiceEdit)));
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001213}
1214
Tom Sepez3a6d0582018-08-17 19:28:52 +00001215CJS_Result CJS_Field::set_editable(CJS_Runtime* pRuntime,
Dan Sinclairf7435522018-02-05 22:27:22 +00001216 v8::Local<v8::Value> vp) {
Tom Sepez16999822018-06-08 18:23:05 +00001217 if (!m_bCanSet)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001218 return CJS_Result::Failure(JSMessage::kReadOnlyError);
1219 return CJS_Result::Success();
dan sinclaircbe23db2017-10-19 14:29:33 -04001220}
1221
Tom Sepez3a6d0582018-08-17 19:28:52 +00001222CJS_Result CJS_Field::get_export_values(CJS_Runtime* pRuntime) {
Lei Zhang4c7ad662018-07-12 20:29:40 +00001223 CPDF_FormField* pFormField = GetFirstFormField();
1224 if (!pFormField)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001225 return CJS_Result::Failure(JSMessage::kBadObjectError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001226
Lei Zhangdfa2ac22018-07-12 19:06:50 +00001227 if (!IsCheckBoxOrRadioButton(pFormField))
Tom Sepez3a6d0582018-08-17 19:28:52 +00001228 return CJS_Result::Failure(JSMessage::kObjectTypeError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001229
Dan Sinclair3a1ba8e2017-10-26 09:28:59 -04001230 v8::Local<v8::Array> ExportValuesArray = pRuntime->NewArray();
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001231 if (m_nFormControlIndex < 0) {
1232 for (int i = 0, sz = pFormField->CountControls(); i < sz; i++) {
1233 CPDF_FormControl* pFormControl = pFormField->GetControl(i);
Dan Sinclair3a1ba8e2017-10-26 09:28:59 -04001234 pRuntime->PutArrayElement(
1235 ExportValuesArray, i,
Tom Sepezb6b01cb2018-06-20 16:10:13 +00001236 pRuntime->NewString(pFormControl->GetExportValue().AsStringView()));
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001237 }
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001238 } else {
1239 if (m_nFormControlIndex >= pFormField->CountControls())
Tom Sepez3a6d0582018-08-17 19:28:52 +00001240 return CJS_Result::Failure(JSMessage::kValueError);
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001241
1242 CPDF_FormControl* pFormControl =
1243 pFormField->GetControl(m_nFormControlIndex);
1244 if (!pFormControl)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001245 return CJS_Result::Failure(JSMessage::kBadObjectError);
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001246
Dan Sinclair3a1ba8e2017-10-26 09:28:59 -04001247 pRuntime->PutArrayElement(
1248 ExportValuesArray, 0,
Tom Sepezb6b01cb2018-06-20 16:10:13 +00001249 pRuntime->NewString(pFormControl->GetExportValue().AsStringView()));
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001250 }
Tom Sepez3a6d0582018-08-17 19:28:52 +00001251 return CJS_Result::Success(ExportValuesArray);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001252}
1253
Tom Sepez3a6d0582018-08-17 19:28:52 +00001254CJS_Result CJS_Field::set_export_values(CJS_Runtime* pRuntime,
Dan Sinclairf7435522018-02-05 22:27:22 +00001255 v8::Local<v8::Value> vp) {
Lei Zhang4c7ad662018-07-12 20:29:40 +00001256 CPDF_FormField* pFormField = GetFirstFormField();
1257 if (!pFormField)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001258 return CJS_Result::Failure(JSMessage::kBadObjectError);
dan sinclaircbe23db2017-10-19 14:29:33 -04001259
Lei Zhangdfa2ac22018-07-12 19:06:50 +00001260 if (!IsCheckBoxOrRadioButton(pFormField))
Tom Sepez3a6d0582018-08-17 19:28:52 +00001261 return CJS_Result::Failure(JSMessage::kObjectTypeError);
dan sinclaircbe23db2017-10-19 14:29:33 -04001262
Tom Sepez16999822018-06-08 18:23:05 +00001263 if (!m_bCanSet)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001264 return CJS_Result::Failure(JSMessage::kReadOnlyError);
Tom Sepez16999822018-06-08 18:23:05 +00001265
Tom Sepezaf6371f2020-11-02 20:13:01 +00001266 if (!fxv8::IsArray(vp))
Tom Sepez3a6d0582018-08-17 19:28:52 +00001267 return CJS_Result::Failure(JSMessage::kBadObjectError);
Tom Sepez16999822018-06-08 18:23:05 +00001268
Tom Sepez3a6d0582018-08-17 19:28:52 +00001269 return CJS_Result::Success();
dan sinclaircbe23db2017-10-19 14:29:33 -04001270}
1271
Tom Sepez3a6d0582018-08-17 19:28:52 +00001272CJS_Result CJS_Field::get_file_select(CJS_Runtime* pRuntime) {
Lei Zhang4c7ad662018-07-12 20:29:40 +00001273 CPDF_FormField* pFormField = GetFirstFormField();
1274 if (!pFormField)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001275 return CJS_Result::Failure(JSMessage::kBadObjectError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001276
Ryan Harrison9baf31f2018-01-12 18:36:30 +00001277 if (pFormField->GetFieldType() != FormFieldType::kTextField)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001278 return CJS_Result::Failure(JSMessage::kObjectTypeError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001279
Tom Sepez3a6d0582018-08-17 19:28:52 +00001280 return CJS_Result::Success(pRuntime->NewBoolean(
Lei Zhanga676aca2019-02-02 00:41:09 +00001281 !!(pFormField->GetFieldFlags() & pdfium::form_flags::kTextFileSelect)));
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001282}
1283
Tom Sepez3a6d0582018-08-17 19:28:52 +00001284CJS_Result CJS_Field::set_file_select(CJS_Runtime* pRuntime,
Dan Sinclairf7435522018-02-05 22:27:22 +00001285 v8::Local<v8::Value> vp) {
Lei Zhang4c7ad662018-07-12 20:29:40 +00001286 CPDF_FormField* pFormField = GetFirstFormField();
1287 if (!pFormField)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001288 return CJS_Result::Failure(JSMessage::kBadObjectError);
dan sinclaircbe23db2017-10-19 14:29:33 -04001289
Ryan Harrison9baf31f2018-01-12 18:36:30 +00001290 if (pFormField->GetFieldType() != FormFieldType::kTextField)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001291 return CJS_Result::Failure(JSMessage::kObjectTypeError);
Tom Sepez16999822018-06-08 18:23:05 +00001292
1293 if (!m_bCanSet)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001294 return CJS_Result::Failure(JSMessage::kReadOnlyError);
Tom Sepez16999822018-06-08 18:23:05 +00001295
Tom Sepez3a6d0582018-08-17 19:28:52 +00001296 return CJS_Result::Success();
dan sinclaircbe23db2017-10-19 14:29:33 -04001297}
1298
Tom Sepez3a6d0582018-08-17 19:28:52 +00001299CJS_Result CJS_Field::get_fill_color(CJS_Runtime* pRuntime) {
Lei Zhang4c7ad662018-07-12 20:29:40 +00001300 CPDF_FormField* pFormField = GetFirstFormField();
1301 if (!pFormField)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001302 return CJS_Result::Failure(JSMessage::kBadObjectError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001303
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001304 CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
1305 if (!pFormControl)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001306 return CJS_Result::Failure(JSMessage::kBadObjectError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001307
Lei Zhange9826282021-06-08 08:30:48 +00001308 CFX_Color color = GetFormControlColor(pFormControl, pdfium::appearance::kBG);
Dan Sinclairf7435522018-02-05 22:27:22 +00001309 v8::Local<v8::Value> array =
1310 CJS_Color::ConvertPWLColorToArray(pRuntime, color);
Dan Sinclair3a1ba8e2017-10-26 09:28:59 -04001311 if (array.IsEmpty())
Tom Sepez3a6d0582018-08-17 19:28:52 +00001312 return CJS_Result::Success(pRuntime->NewArray());
1313 return CJS_Result::Success(array);
dan sinclaircbe23db2017-10-19 14:29:33 -04001314}
1315
Tom Sepez3a6d0582018-08-17 19:28:52 +00001316CJS_Result CJS_Field::set_fill_color(CJS_Runtime* pRuntime,
Dan Sinclairf7435522018-02-05 22:27:22 +00001317 v8::Local<v8::Value> vp) {
Lei Zhang18915232018-07-12 20:53:40 +00001318 std::vector<CPDF_FormField*> FieldArray = GetFormFields();
dan sinclaircbe23db2017-10-19 14:29:33 -04001319 if (FieldArray.empty())
Tom Sepez3a6d0582018-08-17 19:28:52 +00001320 return CJS_Result::Failure(JSMessage::kBadObjectError);
dan sinclaircbe23db2017-10-19 14:29:33 -04001321 if (!m_bCanSet)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001322 return CJS_Result::Failure(JSMessage::kReadOnlyError);
Tom Sepezaf6371f2020-11-02 20:13:01 +00001323 if (!fxv8::IsArray(vp))
Tom Sepez3a6d0582018-08-17 19:28:52 +00001324 return CJS_Result::Failure(JSMessage::kBadObjectError);
1325 return CJS_Result::Success();
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001326}
1327
Tom Sepez3a6d0582018-08-17 19:28:52 +00001328CJS_Result CJS_Field::get_hidden(CJS_Runtime* pRuntime) {
Lei Zhang4c7ad662018-07-12 20:29:40 +00001329 CPDF_FormField* pFormField = GetFirstFormField();
1330 if (!pFormField)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001331 return CJS_Result::Failure(JSMessage::kBadObjectError);
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001332
Lei Zhang073ecf42018-10-11 16:56:00 +00001333 CPDFSDK_InteractiveForm* pForm = m_pFormFillEnv->GetInteractiveForm();
1334 CPDFSDK_Widget* pWidget = pForm->GetWidget(GetSmartFieldControl(pFormField));
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001335 if (!pWidget)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001336 return CJS_Result::Failure(JSMessage::kBadObjectError);
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001337
1338 uint32_t dwFlags = pWidget->GetFlags();
Lei Zhang85549b42019-02-02 00:40:19 +00001339 return CJS_Result::Success(
1340 pRuntime->NewBoolean(pdfium::annotation_flags::kInvisible & dwFlags ||
1341 pdfium::annotation_flags::kHidden & dwFlags));
dan sinclaircbe23db2017-10-19 14:29:33 -04001342}
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001343
Tom Sepez3a6d0582018-08-17 19:28:52 +00001344CJS_Result CJS_Field::set_hidden(CJS_Runtime* pRuntime,
Dan Sinclairf7435522018-02-05 22:27:22 +00001345 v8::Local<v8::Value> vp) {
dan sinclaircbe23db2017-10-19 14:29:33 -04001346 if (!m_bCanSet)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001347 return CJS_Result::Failure(JSMessage::kReadOnlyError);
dan sinclaircbe23db2017-10-19 14:29:33 -04001348
1349 if (m_bDelay) {
dan sinclair80435cb2017-10-24 21:40:24 -04001350 AddDelay_Bool(FP_HIDDEN, pRuntime->ToBoolean(vp));
dan sinclaircbe23db2017-10-19 14:29:33 -04001351 } else {
Lei Zhang94919f72018-07-12 21:16:30 +00001352 SetHidden(m_pFormFillEnv.Get(), m_FieldName, m_nFormControlIndex,
1353 pRuntime->ToBoolean(vp));
dan sinclaircbe23db2017-10-19 14:29:33 -04001354 }
Tom Sepez3a6d0582018-08-17 19:28:52 +00001355 return CJS_Result::Success();
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001356}
1357
Tom Sepez3a6d0582018-08-17 19:28:52 +00001358CJS_Result CJS_Field::get_highlight(CJS_Runtime* pRuntime) {
Tom Sepez08b23fc2021-01-27 22:23:27 +00001359 DCHECK(m_pFormFillEnv);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001360
Lei Zhang4c7ad662018-07-12 20:29:40 +00001361 CPDF_FormField* pFormField = GetFirstFormField();
1362 if (!pFormField)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001363 return CJS_Result::Failure(JSMessage::kBadObjectError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001364
Ryan Harrison9baf31f2018-01-12 18:36:30 +00001365 if (pFormField->GetFieldType() != FormFieldType::kPushButton)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001366 return CJS_Result::Failure(JSMessage::kObjectTypeError);
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001367
1368 CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
1369 if (!pFormControl)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001370 return CJS_Result::Failure(JSMessage::kBadObjectError);
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001371
1372 int eHM = pFormControl->GetHighlightingMode();
1373 switch (eHM) {
Lei Zhang206e81a2021-06-10 23:37:33 +00001374 case CPDF_FormControl::kNone:
Tom Sepeza5ea7ff2018-10-30 19:24:36 +00001375 return CJS_Result::Success(pRuntime->NewString("none"));
Lei Zhang206e81a2021-06-10 23:37:33 +00001376 case CPDF_FormControl::kPush:
Tom Sepeza5ea7ff2018-10-30 19:24:36 +00001377 return CJS_Result::Success(pRuntime->NewString("push"));
Lei Zhang206e81a2021-06-10 23:37:33 +00001378 case CPDF_FormControl::kInvert:
Tom Sepeza5ea7ff2018-10-30 19:24:36 +00001379 return CJS_Result::Success(pRuntime->NewString("invert"));
Lei Zhang206e81a2021-06-10 23:37:33 +00001380 case CPDF_FormControl::kOutline:
Tom Sepeza5ea7ff2018-10-30 19:24:36 +00001381 return CJS_Result::Success(pRuntime->NewString("outline"));
Lei Zhang206e81a2021-06-10 23:37:33 +00001382 case CPDF_FormControl::kToggle:
Tom Sepeza5ea7ff2018-10-30 19:24:36 +00001383 return CJS_Result::Success(pRuntime->NewString("toggle"));
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001384 }
Tom Sepez3a6d0582018-08-17 19:28:52 +00001385 return CJS_Result::Success();
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001386}
1387
Tom Sepez3a6d0582018-08-17 19:28:52 +00001388CJS_Result CJS_Field::set_highlight(CJS_Runtime* pRuntime,
Dan Sinclairf7435522018-02-05 22:27:22 +00001389 v8::Local<v8::Value> vp) {
Tom Sepez08b23fc2021-01-27 22:23:27 +00001390 DCHECK(m_pFormFillEnv);
Tom Sepez16999822018-06-08 18:23:05 +00001391 if (!m_bCanSet)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001392 return CJS_Result::Failure(JSMessage::kReadOnlyError);
1393 return CJS_Result::Success();
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001394}
1395
Tom Sepez3a6d0582018-08-17 19:28:52 +00001396CJS_Result CJS_Field::get_line_width(CJS_Runtime* pRuntime) {
Lei Zhang4c7ad662018-07-12 20:29:40 +00001397 CPDF_FormField* pFormField = GetFirstFormField();
1398 if (!pFormField)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001399 return CJS_Result::Failure(JSMessage::kBadObjectError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001400
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001401 CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
1402 if (!pFormControl)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001403 return CJS_Result::Failure(JSMessage::kBadObjectError);
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001404
Lei Zhang073ecf42018-10-11 16:56:00 +00001405 CPDFSDK_InteractiveForm* pForm = m_pFormFillEnv->GetInteractiveForm();
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001406 if (!pFormField->CountControls())
Tom Sepez3a6d0582018-08-17 19:28:52 +00001407 return CJS_Result::Failure(JSMessage::kBadObjectError);
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001408
Lei Zhang073ecf42018-10-11 16:56:00 +00001409 CPDFSDK_Widget* pWidget = pForm->GetWidget(pFormField->GetControl(0));
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001410 if (!pWidget)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001411 return CJS_Result::Failure(JSMessage::kBadObjectError);
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001412
Tom Sepez3a6d0582018-08-17 19:28:52 +00001413 return CJS_Result::Success(pRuntime->NewNumber(pWidget->GetBorderWidth()));
dan sinclaircbe23db2017-10-19 14:29:33 -04001414}
1415
Tom Sepez3a6d0582018-08-17 19:28:52 +00001416CJS_Result CJS_Field::set_line_width(CJS_Runtime* pRuntime,
Dan Sinclairf7435522018-02-05 22:27:22 +00001417 v8::Local<v8::Value> vp) {
dan sinclaircbe23db2017-10-19 14:29:33 -04001418 if (!m_bCanSet)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001419 return CJS_Result::Failure(JSMessage::kReadOnlyError);
dan sinclaircbe23db2017-10-19 14:29:33 -04001420
1421 if (m_bDelay) {
dan sinclair80435cb2017-10-24 21:40:24 -04001422 AddDelay_Int(FP_LINEWIDTH, pRuntime->ToInt32(vp));
dan sinclaircbe23db2017-10-19 14:29:33 -04001423 } else {
Lei Zhang94919f72018-07-12 21:16:30 +00001424 SetLineWidth(m_pFormFillEnv.Get(), m_FieldName, m_nFormControlIndex,
1425 pRuntime->ToInt32(vp));
dan sinclaircbe23db2017-10-19 14:29:33 -04001426 }
Tom Sepez3a6d0582018-08-17 19:28:52 +00001427 return CJS_Result::Success();
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001428}
1429
Tom Sepez3a6d0582018-08-17 19:28:52 +00001430CJS_Result CJS_Field::get_multiline(CJS_Runtime* pRuntime) {
Tom Sepez08b23fc2021-01-27 22:23:27 +00001431 DCHECK(m_pFormFillEnv);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001432
Lei Zhang4c7ad662018-07-12 20:29:40 +00001433 CPDF_FormField* pFormField = GetFirstFormField();
1434 if (!pFormField)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001435 return CJS_Result::Failure(JSMessage::kBadObjectError);
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001436
Ryan Harrison9baf31f2018-01-12 18:36:30 +00001437 if (pFormField->GetFieldType() != FormFieldType::kTextField)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001438 return CJS_Result::Failure(JSMessage::kObjectTypeError);
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001439
Tom Sepez3a6d0582018-08-17 19:28:52 +00001440 return CJS_Result::Success(pRuntime->NewBoolean(
Lei Zhanga676aca2019-02-02 00:41:09 +00001441 !!(pFormField->GetFieldFlags() & pdfium::form_flags::kTextMultiline)));
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001442}
1443
Tom Sepez3a6d0582018-08-17 19:28:52 +00001444CJS_Result CJS_Field::set_multiline(CJS_Runtime* pRuntime,
Dan Sinclairf7435522018-02-05 22:27:22 +00001445 v8::Local<v8::Value> vp) {
Tom Sepez08b23fc2021-01-27 22:23:27 +00001446 DCHECK(m_pFormFillEnv);
Tom Sepez16999822018-06-08 18:23:05 +00001447 if (!m_bCanSet)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001448 return CJS_Result::Failure(JSMessage::kReadOnlyError);
1449 return CJS_Result::Success();
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001450}
1451
Tom Sepez3a6d0582018-08-17 19:28:52 +00001452CJS_Result CJS_Field::get_multiple_selection(CJS_Runtime* pRuntime) {
Tom Sepez08b23fc2021-01-27 22:23:27 +00001453 DCHECK(m_pFormFillEnv);
Lei Zhang4c7ad662018-07-12 20:29:40 +00001454 CPDF_FormField* pFormField = GetFirstFormField();
1455 if (!pFormField)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001456 return CJS_Result::Failure(JSMessage::kBadObjectError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001457
Ryan Harrison9baf31f2018-01-12 18:36:30 +00001458 if (pFormField->GetFieldType() != FormFieldType::kListBox)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001459 return CJS_Result::Failure(JSMessage::kObjectTypeError);
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001460
Lei Zhanga676aca2019-02-02 00:41:09 +00001461 uint32_t dwFieldFlags = pFormField->GetFieldFlags();
Tom Sepez3a6d0582018-08-17 19:28:52 +00001462 return CJS_Result::Success(pRuntime->NewBoolean(
Lei Zhanga676aca2019-02-02 00:41:09 +00001463 !!(dwFieldFlags & pdfium::form_flags::kChoiceMultiSelect)));
dan sinclaircbe23db2017-10-19 14:29:33 -04001464}
1465
Tom Sepez3a6d0582018-08-17 19:28:52 +00001466CJS_Result CJS_Field::set_multiple_selection(CJS_Runtime* pRuntime,
Dan Sinclairf7435522018-02-05 22:27:22 +00001467 v8::Local<v8::Value> vp) {
Tom Sepez08b23fc2021-01-27 22:23:27 +00001468 DCHECK(m_pFormFillEnv);
Tom Sepez16999822018-06-08 18:23:05 +00001469 if (!m_bCanSet)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001470 return CJS_Result::Failure(JSMessage::kReadOnlyError);
1471 return CJS_Result::Success();
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001472}
1473
Tom Sepez3a6d0582018-08-17 19:28:52 +00001474CJS_Result CJS_Field::get_name(CJS_Runtime* pRuntime) {
Lei Zhang18915232018-07-12 20:53:40 +00001475 std::vector<CPDF_FormField*> FieldArray = GetFormFields();
Lei Zhangd88a3642015-11-10 09:38:57 -08001476 if (FieldArray.empty())
Tom Sepez3a6d0582018-08-17 19:28:52 +00001477 return CJS_Result::Failure(JSMessage::kBadObjectError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001478
Tom Sepez3a6d0582018-08-17 19:28:52 +00001479 return CJS_Result::Success(pRuntime->NewString(m_FieldName.AsStringView()));
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001480}
1481
Tom Sepez3a6d0582018-08-17 19:28:52 +00001482CJS_Result CJS_Field::set_name(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp) {
1483 return CJS_Result::Failure(JSMessage::kNotSupportedError);
dan sinclaircbe23db2017-10-19 14:29:33 -04001484}
Tom Sepez67fd5df2015-10-08 12:24:19 -07001485
Tom Sepez3a6d0582018-08-17 19:28:52 +00001486CJS_Result CJS_Field::get_num_items(CJS_Runtime* pRuntime) {
Lei Zhang4c7ad662018-07-12 20:29:40 +00001487 CPDF_FormField* pFormField = GetFirstFormField();
1488 if (!pFormField)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001489 return CJS_Result::Failure(JSMessage::kBadObjectError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001490
Lei Zhang83f2d702018-07-12 19:07:40 +00001491 if (!IsComboBoxOrListBox(pFormField))
Tom Sepez3a6d0582018-08-17 19:28:52 +00001492 return CJS_Result::Failure(JSMessage::kObjectTypeError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001493
Tom Sepez3a6d0582018-08-17 19:28:52 +00001494 return CJS_Result::Success(pRuntime->NewNumber(pFormField->CountOptions()));
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001495}
1496
Tom Sepez3a6d0582018-08-17 19:28:52 +00001497CJS_Result CJS_Field::set_num_items(CJS_Runtime* pRuntime,
Dan Sinclairf7435522018-02-05 22:27:22 +00001498 v8::Local<v8::Value> vp) {
Tom Sepez3a6d0582018-08-17 19:28:52 +00001499 return CJS_Result::Failure(JSMessage::kNotSupportedError);
dan sinclaircbe23db2017-10-19 14:29:33 -04001500}
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001501
Tom Sepez3a6d0582018-08-17 19:28:52 +00001502CJS_Result CJS_Field::get_page(CJS_Runtime* pRuntime) {
Lei Zhang4c7ad662018-07-12 20:29:40 +00001503 CPDF_FormField* pFormField = GetFirstFormField();
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001504 if (!pFormField)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001505 return CJS_Result::Failure(JSMessage::kBadObjectError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001506
Tom Sepez8885ece2022-08-09 21:04:50 +00001507 std::vector<ObservedPtr<CPDFSDK_Widget>> widgets;
Lei Zhang073ecf42018-10-11 16:56:00 +00001508 m_pFormFillEnv->GetInteractiveForm()->GetWidgets(pFormField, &widgets);
Dan Sinclair8f524d62017-10-25 13:30:31 -04001509 if (widgets.empty())
Tom Sepez3a6d0582018-08-17 19:28:52 +00001510 return CJS_Result::Success(pRuntime->NewNumber(-1));
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001511
Dan Sinclair3a1ba8e2017-10-26 09:28:59 -04001512 v8::Local<v8::Array> PageArray = pRuntime->NewArray();
tsepez8fa82792017-01-11 09:32:33 -08001513 int i = 0;
Tom Sepez8885ece2022-08-09 21:04:50 +00001514 for (const auto& pWidget : widgets) {
1515 if (!pWidget)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001516 return CJS_Result::Failure(JSMessage::kBadObjectError);
tsepez8fa82792017-01-11 09:32:33 -08001517
Dan Sinclair3a1ba8e2017-10-26 09:28:59 -04001518 pRuntime->PutArrayElement(
1519 PageArray, i,
Lei Zhangc2ad6282020-02-13 20:50:57 +00001520 pRuntime->NewNumber(pWidget->GetPageView()->GetPageIndex()));
tsepez8fa82792017-01-11 09:32:33 -08001521 ++i;
Lei Zhangd88a3642015-11-10 09:38:57 -08001522 }
Tom Sepez3a6d0582018-08-17 19:28:52 +00001523 return CJS_Result::Success(PageArray);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001524}
1525
Tom Sepez3a6d0582018-08-17 19:28:52 +00001526CJS_Result CJS_Field::set_page(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp) {
1527 return CJS_Result::Failure(JSMessage::kReadOnlyError);
dan sinclaircbe23db2017-10-19 14:29:33 -04001528}
1529
Tom Sepez3a6d0582018-08-17 19:28:52 +00001530CJS_Result CJS_Field::get_password(CJS_Runtime* pRuntime) {
Tom Sepez08b23fc2021-01-27 22:23:27 +00001531 DCHECK(m_pFormFillEnv);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001532
Lei Zhang4c7ad662018-07-12 20:29:40 +00001533 CPDF_FormField* pFormField = GetFirstFormField();
1534 if (!pFormField)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001535 return CJS_Result::Failure(JSMessage::kBadObjectError);
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001536
Ryan Harrison9baf31f2018-01-12 18:36:30 +00001537 if (pFormField->GetFieldType() != FormFieldType::kTextField)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001538 return CJS_Result::Failure(JSMessage::kObjectTypeError);
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001539
Tom Sepez3a6d0582018-08-17 19:28:52 +00001540 return CJS_Result::Success(pRuntime->NewBoolean(
Lei Zhanga676aca2019-02-02 00:41:09 +00001541 !!(pFormField->GetFieldFlags() & pdfium::form_flags::kTextPassword)));
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001542}
1543
Tom Sepez3a6d0582018-08-17 19:28:52 +00001544CJS_Result CJS_Field::set_password(CJS_Runtime* pRuntime,
Dan Sinclairf7435522018-02-05 22:27:22 +00001545 v8::Local<v8::Value> vp) {
Tom Sepez08b23fc2021-01-27 22:23:27 +00001546 DCHECK(m_pFormFillEnv);
Tom Sepez16999822018-06-08 18:23:05 +00001547 if (!m_bCanSet)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001548 return CJS_Result::Failure(JSMessage::kReadOnlyError);
1549 return CJS_Result::Success();
dan sinclair646634b2017-10-19 14:30:28 -04001550}
dan sinclaircbe23db2017-10-19 14:29:33 -04001551
Tom Sepez3a6d0582018-08-17 19:28:52 +00001552CJS_Result CJS_Field::get_print(CJS_Runtime* pRuntime) {
Lei Zhang073ecf42018-10-11 16:56:00 +00001553 CPDFSDK_InteractiveForm* pForm = m_pFormFillEnv->GetInteractiveForm();
Lei Zhang4c7ad662018-07-12 20:29:40 +00001554 CPDF_FormField* pFormField = GetFirstFormField();
1555 if (!pFormField)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001556 return CJS_Result::Failure(JSMessage::kBadObjectError);
dan sinclaircbe23db2017-10-19 14:29:33 -04001557
Lei Zhang073ecf42018-10-11 16:56:00 +00001558 CPDFSDK_Widget* pWidget = pForm->GetWidget(GetSmartFieldControl(pFormField));
dan sinclair646634b2017-10-19 14:30:28 -04001559 if (!pWidget)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001560 return CJS_Result::Failure(JSMessage::kBadObjectError);
dan sinclaircbe23db2017-10-19 14:29:33 -04001561
Lei Zhang85549b42019-02-02 00:40:19 +00001562 return CJS_Result::Success(pRuntime->NewBoolean(
1563 !!(pWidget->GetFlags() & pdfium::annotation_flags::kPrint)));
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001564}
1565
Tom Sepez3a6d0582018-08-17 19:28:52 +00001566CJS_Result CJS_Field::set_print(CJS_Runtime* pRuntime,
Dan Sinclairf7435522018-02-05 22:27:22 +00001567 v8::Local<v8::Value> vp) {
Lei Zhang073ecf42018-10-11 16:56:00 +00001568 CPDFSDK_InteractiveForm* pForm = m_pFormFillEnv->GetInteractiveForm();
Lei Zhang18915232018-07-12 20:53:40 +00001569 std::vector<CPDF_FormField*> FieldArray = GetFormFields();
Lei Zhangd88a3642015-11-10 09:38:57 -08001570 if (FieldArray.empty())
Tom Sepez3a6d0582018-08-17 19:28:52 +00001571 return CJS_Result::Failure(JSMessage::kBadObjectError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001572
Dan Sinclair8f524d62017-10-25 13:30:31 -04001573 if (!m_bCanSet)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001574 return CJS_Result::Failure(JSMessage::kReadOnlyError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001575
Dan Sinclair8f524d62017-10-25 13:30:31 -04001576 for (CPDF_FormField* pFormField : FieldArray) {
1577 if (m_nFormControlIndex < 0) {
1578 bool bSet = false;
1579 for (int i = 0, sz = pFormField->CountControls(); i < sz; ++i) {
1580 if (CPDFSDK_Widget* pWidget =
Lei Zhang073ecf42018-10-11 16:56:00 +00001581 pForm->GetWidget(pFormField->GetControl(i))) {
dan sinclaircbe23db2017-10-19 14:29:33 -04001582 uint32_t dwFlags = pWidget->GetFlags();
dan sinclair80435cb2017-10-24 21:40:24 -04001583 if (pRuntime->ToBoolean(vp))
Lei Zhang85549b42019-02-02 00:40:19 +00001584 dwFlags |= pdfium::annotation_flags::kPrint;
dan sinclaircbe23db2017-10-19 14:29:33 -04001585 else
Lei Zhang85549b42019-02-02 00:40:19 +00001586 dwFlags &= ~pdfium::annotation_flags::kPrint;
dan sinclaircbe23db2017-10-19 14:29:33 -04001587
1588 if (dwFlags != pWidget->GetFlags()) {
1589 pWidget->SetFlags(dwFlags);
Dan Sinclair8f524d62017-10-25 13:30:31 -04001590 bSet = true;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001591 }
1592 }
1593 }
Dan Sinclair8f524d62017-10-25 13:30:31 -04001594
1595 if (bSet)
Tom Sepez5c7f4422022-04-05 00:22:22 +00001596 UpdateFormField(m_pFormFillEnv.Get(), pFormField, false);
Dan Sinclair8f524d62017-10-25 13:30:31 -04001597
1598 continue;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001599 }
Dan Sinclair8f524d62017-10-25 13:30:31 -04001600
1601 if (m_nFormControlIndex >= pFormField->CountControls())
Tom Sepez3a6d0582018-08-17 19:28:52 +00001602 return CJS_Result::Failure(JSMessage::kValueError);
Dan Sinclair8f524d62017-10-25 13:30:31 -04001603
1604 if (CPDF_FormControl* pFormControl =
1605 pFormField->GetControl(m_nFormControlIndex)) {
Lei Zhang073ecf42018-10-11 16:56:00 +00001606 if (CPDFSDK_Widget* pWidget = pForm->GetWidget(pFormControl)) {
Dan Sinclair8f524d62017-10-25 13:30:31 -04001607 uint32_t dwFlags = pWidget->GetFlags();
1608 if (pRuntime->ToBoolean(vp))
Lei Zhang85549b42019-02-02 00:40:19 +00001609 dwFlags |= pdfium::annotation_flags::kPrint;
Dan Sinclair8f524d62017-10-25 13:30:31 -04001610 else
Lei Zhang85549b42019-02-02 00:40:19 +00001611 dwFlags &= ~pdfium::annotation_flags::kPrint;
Dan Sinclair8f524d62017-10-25 13:30:31 -04001612
1613 if (dwFlags != pWidget->GetFlags()) {
1614 pWidget->SetFlags(dwFlags);
1615 UpdateFormControl(m_pFormFillEnv.Get(),
Tom Sepeza657b4d2022-04-05 18:44:19 +00001616 pFormField->GetControl(m_nFormControlIndex), false);
Dan Sinclair8f524d62017-10-25 13:30:31 -04001617 }
1618 }
1619 }
1620 }
Tom Sepez3a6d0582018-08-17 19:28:52 +00001621 return CJS_Result::Success();
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001622}
1623
Tom Sepez3a6d0582018-08-17 19:28:52 +00001624CJS_Result CJS_Field::get_radios_in_unison(CJS_Runtime* pRuntime) {
Lei Zhang4c7ad662018-07-12 20:29:40 +00001625 CPDF_FormField* pFormField = GetFirstFormField();
1626 if (!pFormField)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001627 return CJS_Result::Failure(JSMessage::kBadObjectError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001628
Ryan Harrison9baf31f2018-01-12 18:36:30 +00001629 if (pFormField->GetFieldType() != FormFieldType::kRadioButton)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001630 return CJS_Result::Failure(JSMessage::kObjectTypeError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001631
Lei Zhanga676aca2019-02-02 00:41:09 +00001632 uint32_t dwFieldFlags = pFormField->GetFieldFlags();
Tom Sepez3a6d0582018-08-17 19:28:52 +00001633 return CJS_Result::Success(pRuntime->NewBoolean(
Lei Zhanga676aca2019-02-02 00:41:09 +00001634 !!(dwFieldFlags & pdfium::form_flags::kButtonRadiosInUnison)));
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001635}
1636
Tom Sepez3a6d0582018-08-17 19:28:52 +00001637CJS_Result CJS_Field::set_radios_in_unison(CJS_Runtime* pRuntime,
Dan Sinclairf7435522018-02-05 22:27:22 +00001638 v8::Local<v8::Value> vp) {
Lei Zhang18915232018-07-12 20:53:40 +00001639 std::vector<CPDF_FormField*> FieldArray = GetFormFields();
dan sinclaircbe23db2017-10-19 14:29:33 -04001640 if (FieldArray.empty())
Tom Sepez3a6d0582018-08-17 19:28:52 +00001641 return CJS_Result::Failure(JSMessage::kBadObjectError);
Tom Sepez16999822018-06-08 18:23:05 +00001642 if (!m_bCanSet)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001643 return CJS_Result::Failure(JSMessage::kReadOnlyError);
1644 return CJS_Result::Success();
dan sinclaircbe23db2017-10-19 14:29:33 -04001645}
1646
Tom Sepez3a6d0582018-08-17 19:28:52 +00001647CJS_Result CJS_Field::get_readonly(CJS_Runtime* pRuntime) {
Lei Zhang4c7ad662018-07-12 20:29:40 +00001648 CPDF_FormField* pFormField = GetFirstFormField();
1649 if (!pFormField)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001650 return CJS_Result::Failure(JSMessage::kBadObjectError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001651
Tom Sepez3a6d0582018-08-17 19:28:52 +00001652 return CJS_Result::Success(pRuntime->NewBoolean(
Lei Zhanga676aca2019-02-02 00:41:09 +00001653 !!(pFormField->GetFieldFlags() & pdfium::form_flags::kReadOnly)));
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001654}
1655
Tom Sepez3a6d0582018-08-17 19:28:52 +00001656CJS_Result CJS_Field::set_readonly(CJS_Runtime* pRuntime,
Dan Sinclairf7435522018-02-05 22:27:22 +00001657 v8::Local<v8::Value> vp) {
Tom Sepezf15d8302021-06-01 17:43:13 +00001658 CPDF_FormField* pFormField = GetFirstFormField();
1659 if (!pFormField)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001660 return CJS_Result::Failure(JSMessage::kBadObjectError);
Tom Sepezf15d8302021-06-01 17:43:13 +00001661
Tom Sepez16999822018-06-08 18:23:05 +00001662 if (!m_bCanSet)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001663 return CJS_Result::Failure(JSMessage::kReadOnlyError);
Tom Sepezf15d8302021-06-01 17:43:13 +00001664
1665 const bool bReadOnly = pRuntime->ToBoolean(vp);
1666 const uint32_t dwFlags = pFormField->GetFieldFlags();
1667 const uint32_t dwNewFlags = bReadOnly
1668 ? (dwFlags | pdfium::form_flags::kReadOnly)
1669 : (dwFlags & ~pdfium::form_flags::kReadOnly);
1670 if (dwNewFlags != dwFlags)
1671 pFormField->SetFieldFlags(dwNewFlags);
1672
Tom Sepez3a6d0582018-08-17 19:28:52 +00001673 return CJS_Result::Success();
dan sinclaircbe23db2017-10-19 14:29:33 -04001674}
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001675
Tom Sepez3a6d0582018-08-17 19:28:52 +00001676CJS_Result CJS_Field::get_rect(CJS_Runtime* pRuntime) {
Lei Zhang4c7ad662018-07-12 20:29:40 +00001677 CPDF_FormField* pFormField = GetFirstFormField();
1678 if (!pFormField)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001679 return CJS_Result::Failure(JSMessage::kBadObjectError);
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001680
Lei Zhang073ecf42018-10-11 16:56:00 +00001681 CPDFSDK_InteractiveForm* pForm = m_pFormFillEnv->GetInteractiveForm();
1682 CPDFSDK_Widget* pWidget = pForm->GetWidget(GetSmartFieldControl(pFormField));
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001683 if (!pWidget)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001684 return CJS_Result::Failure(JSMessage::kBadObjectError);
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001685
1686 CFX_FloatRect crRect = pWidget->GetRect();
Dan Sinclair3a1ba8e2017-10-26 09:28:59 -04001687 v8::Local<v8::Array> rcArray = pRuntime->NewArray();
1688 pRuntime->PutArrayElement(
1689 rcArray, 0, pRuntime->NewNumber(static_cast<int32_t>(crRect.left)));
1690 pRuntime->PutArrayElement(
1691 rcArray, 1, pRuntime->NewNumber(static_cast<int32_t>(crRect.top)));
1692 pRuntime->PutArrayElement(
1693 rcArray, 2, pRuntime->NewNumber(static_cast<int32_t>(crRect.right)));
1694 pRuntime->PutArrayElement(
1695 rcArray, 3, pRuntime->NewNumber(static_cast<int32_t>(crRect.bottom)));
Dan Sinclair1b2a18e2017-10-24 13:56:29 -04001696
Tom Sepez3a6d0582018-08-17 19:28:52 +00001697 return CJS_Result::Success(rcArray);
dan sinclaircbe23db2017-10-19 14:29:33 -04001698}
1699
Tom Sepez3a6d0582018-08-17 19:28:52 +00001700CJS_Result CJS_Field::set_rect(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp) {
dan sinclaircbe23db2017-10-19 14:29:33 -04001701 if (!m_bCanSet)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001702 return CJS_Result::Failure(JSMessage::kReadOnlyError);
Tom Sepezaf6371f2020-11-02 20:13:01 +00001703 if (!fxv8::IsArray(vp))
Tom Sepez95443cf2019-12-06 22:47:56 +00001704 return CJS_Result::Failure(JSMessage::kValueError);
dan sinclaircbe23db2017-10-19 14:29:33 -04001705
Dan Sinclair3a1ba8e2017-10-26 09:28:59 -04001706 v8::Local<v8::Array> rcArray = pRuntime->ToArray(vp);
1707 if (pRuntime->GetArrayLength(rcArray) < 4)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001708 return CJS_Result::Failure(JSMessage::kValueError);
Dan Sinclair3a1ba8e2017-10-26 09:28:59 -04001709
Tom Sepez141a8fc2021-08-31 19:31:27 +00001710 float f0 = static_cast<float>(
Dan Sinclair3a1ba8e2017-10-26 09:28:59 -04001711 pRuntime->ToInt32(pRuntime->GetArrayElement(rcArray, 0)));
Tom Sepez141a8fc2021-08-31 19:31:27 +00001712 float f1 = static_cast<float>(
Dan Sinclair3a1ba8e2017-10-26 09:28:59 -04001713 pRuntime->ToInt32(pRuntime->GetArrayElement(rcArray, 1)));
Tom Sepez141a8fc2021-08-31 19:31:27 +00001714 float f2 = static_cast<float>(
Dan Sinclair3a1ba8e2017-10-26 09:28:59 -04001715 pRuntime->ToInt32(pRuntime->GetArrayElement(rcArray, 2)));
Tom Sepez141a8fc2021-08-31 19:31:27 +00001716 float f3 = static_cast<float>(
Dan Sinclair3a1ba8e2017-10-26 09:28:59 -04001717 pRuntime->ToInt32(pRuntime->GetArrayElement(rcArray, 3)));
dan sinclaircbe23db2017-10-19 14:29:33 -04001718
Tom Sepez141a8fc2021-08-31 19:31:27 +00001719 CFX_FloatRect crRect(f0, f1, f2, f3);
dan sinclaircbe23db2017-10-19 14:29:33 -04001720 if (m_bDelay) {
1721 AddDelay_Rect(FP_RECT, crRect);
1722 } else {
Lei Zhang94919f72018-07-12 21:16:30 +00001723 SetRect(m_pFormFillEnv.Get(), m_FieldName, m_nFormControlIndex, crRect);
dan sinclaircbe23db2017-10-19 14:29:33 -04001724 }
Tom Sepez3a6d0582018-08-17 19:28:52 +00001725 return CJS_Result::Success();
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001726}
1727
Tom Sepez3a6d0582018-08-17 19:28:52 +00001728CJS_Result CJS_Field::get_required(CJS_Runtime* pRuntime) {
Lei Zhang4c7ad662018-07-12 20:29:40 +00001729 CPDF_FormField* pFormField = GetFirstFormField();
1730 if (!pFormField)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001731 return CJS_Result::Failure(JSMessage::kBadObjectError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001732
Ryan Harrison9baf31f2018-01-12 18:36:30 +00001733 if (pFormField->GetFieldType() == FormFieldType::kPushButton)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001734 return CJS_Result::Failure(JSMessage::kObjectTypeError);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001735
Tom Sepez3a6d0582018-08-17 19:28:52 +00001736 return CJS_Result::Success(pRuntime->NewBoolean(
Lei Zhanga676aca2019-02-02 00:41:09 +00001737 !!(pFormField->GetFieldFlags() & pdfium::form_flags::kRequired)));
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001738}
1739
Tom Sepez3a6d0582018-08-17 19:28:52 +00001740CJS_Result CJS_Field::set_required(CJS_Runtime* pRuntime,
Dan Sinclairf7435522018-02-05 22:27:22 +00001741 v8::Local<v8::Value> vp) {
Lei Zhang18915232018-07-12 20:53:40 +00001742 std::vector<CPDF_FormField*> FieldArray = GetFormFields();
dan sinclaircbe23db2017-10-19 14:29:33 -04001743 if (FieldArray.empty())
Tom Sepez3a6d0582018-08-17 19:28:52 +00001744 return CJS_Result::Failure(JSMessage::kBadObjectError);
Tom Sepez16999822018-06-08 18:23:05 +00001745 if (!m_bCanSet)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001746 return CJS_Result::Failure(JSMessage::kReadOnlyError);
1747 return CJS_Result::Success();
dan sinclaircbe23db2017-10-19 14:29:33 -04001748}
1749
Tom Sepez3a6d0582018-08-17 19:28:52 +00001750CJS_Result CJS_Field::get_rich_text(CJS_Runtime* pRuntime) {
Tom Sepez08b23fc2021-01-27 22:23:27 +00001751 DCHECK(m_pFormFillEnv);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001752
Lei Zhang4c7ad662018-07-12 20:29:40 +00001753 CPDF_FormField* pFormField = GetFirstFormField();
1754 if (!pFormField)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001755 return CJS_Result::Failure(JSMessage::kBadObjectError);
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001756
Ryan Harrison9baf31f2018-01-12 18:36:30 +00001757 if (pFormField->GetFieldType() != FormFieldType::kTextField)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001758 return CJS_Result::Failure(JSMessage::kObjectTypeError);
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001759
Tom Sepez3a6d0582018-08-17 19:28:52 +00001760 return CJS_Result::Success(pRuntime->NewBoolean(
Lei Zhanga676aca2019-02-02 00:41:09 +00001761 !!(pFormField->GetFieldFlags() & pdfium::form_flags::kTextRichText)));
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001762}
1763
Tom Sepez3a6d0582018-08-17 19:28:52 +00001764CJS_Result CJS_Field::set_rich_text(CJS_Runtime* pRuntime,
Dan Sinclairf7435522018-02-05 22:27:22 +00001765 v8::Local<v8::Value> vp) {
Tom Sepez08b23fc2021-01-27 22:23:27 +00001766 DCHECK(m_pFormFillEnv);
Tom Sepez16999822018-06-08 18:23:05 +00001767 if (!m_bCanSet)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001768 return CJS_Result::Failure(JSMessage::kReadOnlyError);
1769 return CJS_Result::Success();
dan sinclaircbe23db2017-10-19 14:29:33 -04001770}
1771
Tom Sepez3a6d0582018-08-17 19:28:52 +00001772CJS_Result CJS_Field::get_rich_value(CJS_Runtime* pRuntime) {
1773 return CJS_Result::Success();
dan sinclaircbe23db2017-10-19 14:29:33 -04001774}
1775
Tom Sepez3a6d0582018-08-17 19:28:52 +00001776CJS_Result CJS_Field::set_rich_value(CJS_Runtime* pRuntime,
Dan Sinclairf7435522018-02-05 22:27:22 +00001777 v8::Local<v8::Value> vp) {
Tom Sepez3a6d0582018-08-17 19:28:52 +00001778 return CJS_Result::Success();
dan sinclaircbe23db2017-10-19 14:29:33 -04001779}
1780
Tom Sepez3a6d0582018-08-17 19:28:52 +00001781CJS_Result CJS_Field::get_rotation(CJS_Runtime* pRuntime) {
Tom Sepez08b23fc2021-01-27 22:23:27 +00001782 DCHECK(m_pFormFillEnv);
dan sinclaircbe23db2017-10-19 14:29:33 -04001783
Lei Zhang4c7ad662018-07-12 20:29:40 +00001784 CPDF_FormField* pFormField = GetFirstFormField();
1785 if (!pFormField)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001786 return CJS_Result::Failure(JSMessage::kBadObjectError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001787
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001788 CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
1789 if (!pFormControl)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001790 return CJS_Result::Failure(JSMessage::kBadObjectError);
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001791
Tom Sepez3a6d0582018-08-17 19:28:52 +00001792 return CJS_Result::Success(pRuntime->NewNumber(pFormControl->GetRotation()));
dan sinclaircbe23db2017-10-19 14:29:33 -04001793}
1794
Tom Sepez3a6d0582018-08-17 19:28:52 +00001795CJS_Result CJS_Field::set_rotation(CJS_Runtime* pRuntime,
Dan Sinclairf7435522018-02-05 22:27:22 +00001796 v8::Local<v8::Value> vp) {
Tom Sepez08b23fc2021-01-27 22:23:27 +00001797 DCHECK(m_pFormFillEnv);
Tom Sepez16999822018-06-08 18:23:05 +00001798 if (!m_bCanSet)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001799 return CJS_Result::Failure(JSMessage::kReadOnlyError);
1800 return CJS_Result::Success();
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001801}
1802
Tom Sepezb14a2f22018-10-12 23:21:58 +00001803CJS_Result CJS_Field::get_source(CJS_Runtime* pRuntime) {
1804 return CJS_Result::Success();
1805}
1806
1807CJS_Result CJS_Field::set_source(CJS_Runtime* pRuntime,
1808 v8::Local<v8::Value> vp) {
1809 return CJS_Result::Success();
1810}
1811
Tom Sepez3a6d0582018-08-17 19:28:52 +00001812CJS_Result CJS_Field::get_stroke_color(CJS_Runtime* pRuntime) {
Lei Zhang4c7ad662018-07-12 20:29:40 +00001813 CPDF_FormField* pFormField = GetFirstFormField();
1814 if (!pFormField)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001815 return CJS_Result::Failure(JSMessage::kBadObjectError);
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001816
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001817 CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
1818 if (!pFormControl)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001819 return CJS_Result::Failure(JSMessage::kBadObjectError);
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001820
Lei Zhange9826282021-06-08 08:30:48 +00001821 CFX_Color color = GetFormControlColor(pFormControl, pdfium::appearance::kBC);
Dan Sinclairf7435522018-02-05 22:27:22 +00001822 v8::Local<v8::Value> array =
1823 CJS_Color::ConvertPWLColorToArray(pRuntime, color);
Dan Sinclair3a1ba8e2017-10-26 09:28:59 -04001824 if (array.IsEmpty())
Tom Sepez3a6d0582018-08-17 19:28:52 +00001825 return CJS_Result::Success(pRuntime->NewArray());
1826 return CJS_Result::Success(array);
dan sinclaircbe23db2017-10-19 14:29:33 -04001827}
1828
Tom Sepez3a6d0582018-08-17 19:28:52 +00001829CJS_Result CJS_Field::set_stroke_color(CJS_Runtime* pRuntime,
Dan Sinclairf7435522018-02-05 22:27:22 +00001830 v8::Local<v8::Value> vp) {
dan sinclaircbe23db2017-10-19 14:29:33 -04001831 if (!m_bCanSet)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001832 return CJS_Result::Failure(JSMessage::kReadOnlyError);
Tom Sepezaf6371f2020-11-02 20:13:01 +00001833 if (!fxv8::IsArray(vp))
Tom Sepez3a6d0582018-08-17 19:28:52 +00001834 return CJS_Result::Failure(JSMessage::kBadObjectError);
1835 return CJS_Result::Success();
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001836}
1837
Tom Sepez3a6d0582018-08-17 19:28:52 +00001838CJS_Result CJS_Field::get_style(CJS_Runtime* pRuntime) {
Tom Sepez08b23fc2021-01-27 22:23:27 +00001839 DCHECK(m_pFormFillEnv);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001840
Lei Zhang4c7ad662018-07-12 20:29:40 +00001841 CPDF_FormField* pFormField = GetFirstFormField();
1842 if (!pFormField)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001843 return CJS_Result::Failure(JSMessage::kBadObjectError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001844
Lei Zhangdfa2ac22018-07-12 19:06:50 +00001845 if (!IsCheckBoxOrRadioButton(pFormField))
Tom Sepez3a6d0582018-08-17 19:28:52 +00001846 return CJS_Result::Failure(JSMessage::kObjectTypeError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001847
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001848 CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
1849 if (!pFormControl)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001850 return CJS_Result::Failure(JSMessage::kBadObjectError);
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001851
Lei Zhang359be402022-03-08 22:03:34 +00001852 wchar_t selector = GetSelectorFromCaptionForFieldType(
1853 pFormControl->GetNormalCaption(), pFormControl->GetType());
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001854
Tom Sepezf6059372018-11-16 19:31:40 +00001855 ByteString csBCaption;
1856 switch (selector) {
Lei Zhang359be402022-03-08 22:03:34 +00001857 case kCircleSelector:
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001858 csBCaption = "circle";
1859 break;
Lei Zhang359be402022-03-08 22:03:34 +00001860 case kCrossSelector:
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001861 csBCaption = "cross";
1862 break;
Lei Zhang359be402022-03-08 22:03:34 +00001863 case kDiamondSelector:
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001864 csBCaption = "diamond";
1865 break;
Lei Zhang359be402022-03-08 22:03:34 +00001866 case kSquareSelector:
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001867 csBCaption = "square";
1868 break;
Lei Zhang359be402022-03-08 22:03:34 +00001869 case kStarSelector:
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001870 csBCaption = "star";
1871 break;
Lei Zhang359be402022-03-08 22:03:34 +00001872 case kCheckSelector:
1873 default:
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001874 csBCaption = "check";
1875 break;
1876 }
Tom Sepezc573bc72022-05-19 00:01:39 +00001877 return CJS_Result::Success(pRuntime->NewString(csBCaption.AsStringView()));
dan sinclaircbe23db2017-10-19 14:29:33 -04001878}
1879
Tom Sepez3a6d0582018-08-17 19:28:52 +00001880CJS_Result CJS_Field::set_style(CJS_Runtime* pRuntime,
Dan Sinclairf7435522018-02-05 22:27:22 +00001881 v8::Local<v8::Value> vp) {
Tom Sepez08b23fc2021-01-27 22:23:27 +00001882 DCHECK(m_pFormFillEnv);
Tom Sepez16999822018-06-08 18:23:05 +00001883 if (!m_bCanSet)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001884 return CJS_Result::Failure(JSMessage::kReadOnlyError);
1885 return CJS_Result::Success();
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001886}
1887
Tom Sepez3a6d0582018-08-17 19:28:52 +00001888CJS_Result CJS_Field::get_submit_name(CJS_Runtime* pRuntime) {
1889 return CJS_Result::Success();
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001890}
1891
Tom Sepez3a6d0582018-08-17 19:28:52 +00001892CJS_Result CJS_Field::set_submit_name(CJS_Runtime* pRuntime,
Dan Sinclairf7435522018-02-05 22:27:22 +00001893 v8::Local<v8::Value> vp) {
Tom Sepez3a6d0582018-08-17 19:28:52 +00001894 return CJS_Result::Success();
dan sinclaircbe23db2017-10-19 14:29:33 -04001895}
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001896
Tom Sepez3a6d0582018-08-17 19:28:52 +00001897CJS_Result CJS_Field::get_text_color(CJS_Runtime* pRuntime) {
Lei Zhang4c7ad662018-07-12 20:29:40 +00001898 CPDF_FormField* pFormField = GetFirstFormField();
1899 if (!pFormField)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001900 return CJS_Result::Failure(JSMessage::kBadObjectError);
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001901
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001902 CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
1903 if (!pFormControl)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001904 return CJS_Result::Failure(JSMessage::kBadObjectError);
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001905
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001906 CPDF_DefaultAppearance FieldAppearance = pFormControl->GetDefaultAppearance();
Lei Zhang2c495302021-10-07 23:13:30 +00001907 absl::optional<CFX_Color::TypeAndARGB> maybe_type_argb_pair =
Tom Sepez33baa9f2021-05-18 19:02:49 +00001908 FieldAppearance.GetColorARGB();
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001909
Dan Sinclair28bb2f22018-04-03 19:52:27 +00001910 CFX_Color crRet;
Tom Sepez33baa9f2021-05-18 19:02:49 +00001911 if (maybe_type_argb_pair.has_value() &&
Lei Zhangbe79d1b2021-06-07 19:21:05 +00001912 maybe_type_argb_pair.value().color_type !=
1913 CFX_Color::Type::kTransparent) {
Dan Sinclair28bb2f22018-04-03 19:52:27 +00001914 int32_t a;
1915 int32_t r;
1916 int32_t g;
1917 int32_t b;
Lei Zhangbe79d1b2021-06-07 19:21:05 +00001918 std::tie(a, r, g, b) = ArgbDecode(maybe_type_argb_pair.value().argb);
Tom Sepez21085b82021-05-18 19:56:49 +00001919 crRet =
1920 CFX_Color(CFX_Color::Type::kRGB, r / 255.0f, g / 255.0f, b / 255.0f);
Dan Sinclair28bb2f22018-04-03 19:52:27 +00001921 }
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001922
Dan Sinclairf7435522018-02-05 22:27:22 +00001923 v8::Local<v8::Value> array =
1924 CJS_Color::ConvertPWLColorToArray(pRuntime, crRet);
Dan Sinclair3a1ba8e2017-10-26 09:28:59 -04001925 if (array.IsEmpty())
Tom Sepez3a6d0582018-08-17 19:28:52 +00001926 return CJS_Result::Success(pRuntime->NewArray());
1927 return CJS_Result::Success(array);
dan sinclaircbe23db2017-10-19 14:29:33 -04001928}
1929
Tom Sepez3a6d0582018-08-17 19:28:52 +00001930CJS_Result CJS_Field::set_text_color(CJS_Runtime* pRuntime,
Dan Sinclairf7435522018-02-05 22:27:22 +00001931 v8::Local<v8::Value> vp) {
dan sinclaircbe23db2017-10-19 14:29:33 -04001932 if (!m_bCanSet)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001933 return CJS_Result::Failure(JSMessage::kReadOnlyError);
Tom Sepezaf6371f2020-11-02 20:13:01 +00001934 if (!fxv8::IsArray(vp))
Tom Sepez3a6d0582018-08-17 19:28:52 +00001935 return CJS_Result::Failure(JSMessage::kBadObjectError);
1936 return CJS_Result::Success();
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001937}
1938
Tom Sepez3a6d0582018-08-17 19:28:52 +00001939CJS_Result CJS_Field::get_text_font(CJS_Runtime* pRuntime) {
Tom Sepez08b23fc2021-01-27 22:23:27 +00001940 DCHECK(m_pFormFillEnv);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001941
Lei Zhang4c7ad662018-07-12 20:29:40 +00001942 CPDF_FormField* pFormField = GetFirstFormField();
1943 if (!pFormField)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001944 return CJS_Result::Failure(JSMessage::kBadObjectError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001945
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001946 CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
1947 if (!pFormControl)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001948 return CJS_Result::Failure(JSMessage::kBadObjectError);
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001949
Ryan Harrison9baf31f2018-01-12 18:36:30 +00001950 FormFieldType fieldType = pFormField->GetFieldType();
1951 if (fieldType != FormFieldType::kPushButton &&
1952 fieldType != FormFieldType::kComboBox &&
1953 fieldType != FormFieldType::kListBox &&
1954 fieldType != FormFieldType::kTextField) {
Tom Sepez3a6d0582018-08-17 19:28:52 +00001955 return CJS_Result::Failure(JSMessage::kObjectTypeError);
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001956 }
Dan Sinclair8f524d62017-10-25 13:30:31 -04001957
Lei Zhang2c495302021-10-07 23:13:30 +00001958 absl::optional<WideString> wsFontName =
1959 pFormControl->GetDefaultControlFontName();
Tom Sepez60da5fa2019-08-01 20:59:53 +00001960 if (!wsFontName.has_value())
Tom Sepez3a6d0582018-08-17 19:28:52 +00001961 return CJS_Result::Failure(JSMessage::kBadObjectError);
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001962
Tom Sepez60da5fa2019-08-01 20:59:53 +00001963 return CJS_Result::Success(
1964 pRuntime->NewString(wsFontName.value().AsStringView()));
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001965}
1966
Tom Sepez3a6d0582018-08-17 19:28:52 +00001967CJS_Result CJS_Field::set_text_font(CJS_Runtime* pRuntime,
Dan Sinclairf7435522018-02-05 22:27:22 +00001968 v8::Local<v8::Value> vp) {
Tom Sepez08b23fc2021-01-27 22:23:27 +00001969 DCHECK(m_pFormFillEnv);
dan sinclaircbe23db2017-10-19 14:29:33 -04001970
dan sinclair646634b2017-10-19 14:30:28 -04001971 if (!m_bCanSet)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001972 return CJS_Result::Failure(JSMessage::kReadOnlyError);
Tom Sepezc573bc72022-05-19 00:01:39 +00001973 if (pRuntime->ToByteString(vp).IsEmpty())
Tom Sepez3a6d0582018-08-17 19:28:52 +00001974 return CJS_Result::Failure(JSMessage::kValueError);
1975 return CJS_Result::Success();
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001976}
1977
Tom Sepez3a6d0582018-08-17 19:28:52 +00001978CJS_Result CJS_Field::get_text_size(CJS_Runtime* pRuntime) {
Tom Sepez08b23fc2021-01-27 22:23:27 +00001979 DCHECK(m_pFormFillEnv);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001980
Lei Zhang4c7ad662018-07-12 20:29:40 +00001981 CPDF_FormField* pFormField = GetFirstFormField();
1982 if (!pFormField)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001983 return CJS_Result::Failure(JSMessage::kBadObjectError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001984
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001985 CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
1986 if (!pFormControl)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001987 return CJS_Result::Failure(JSMessage::kBadObjectError);
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001988
Dan Sinclair05df0752017-03-14 14:43:42 -04001989 float fFontSize;
Tom Sepezc4a2b752017-04-07 13:56:13 -07001990 CPDF_DefaultAppearance FieldAppearance = pFormControl->GetDefaultAppearance();
1991 FieldAppearance.GetFont(&fFontSize);
Tom Sepez3a6d0582018-08-17 19:28:52 +00001992 return CJS_Result::Success(pRuntime->NewNumber(static_cast<int>(fFontSize)));
dan sinclaircbe23db2017-10-19 14:29:33 -04001993}
1994
Tom Sepez3a6d0582018-08-17 19:28:52 +00001995CJS_Result CJS_Field::set_text_size(CJS_Runtime* pRuntime,
Dan Sinclairf7435522018-02-05 22:27:22 +00001996 v8::Local<v8::Value> vp) {
Tom Sepez08b23fc2021-01-27 22:23:27 +00001997 DCHECK(m_pFormFillEnv);
Tom Sepez16999822018-06-08 18:23:05 +00001998 if (!m_bCanSet)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001999 return CJS_Result::Failure(JSMessage::kReadOnlyError);
2000 return CJS_Result::Success();
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002001}
2002
Tom Sepez3a6d0582018-08-17 19:28:52 +00002003CJS_Result CJS_Field::get_type(CJS_Runtime* pRuntime) {
Lei Zhang4c7ad662018-07-12 20:29:40 +00002004 CPDF_FormField* pFormField = GetFirstFormField();
2005 if (!pFormField)
Tom Sepez3a6d0582018-08-17 19:28:52 +00002006 return CJS_Result::Failure(JSMessage::kBadObjectError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002007
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002008 switch (pFormField->GetFieldType()) {
Ryan Harrison9baf31f2018-01-12 18:36:30 +00002009 case FormFieldType::kUnknown:
Tom Sepeza5ea7ff2018-10-30 19:24:36 +00002010 return CJS_Result::Success(pRuntime->NewString("unknown"));
Ryan Harrison9baf31f2018-01-12 18:36:30 +00002011 case FormFieldType::kPushButton:
Tom Sepeza5ea7ff2018-10-30 19:24:36 +00002012 return CJS_Result::Success(pRuntime->NewString("button"));
Ryan Harrison9baf31f2018-01-12 18:36:30 +00002013 case FormFieldType::kCheckBox:
Tom Sepeza5ea7ff2018-10-30 19:24:36 +00002014 return CJS_Result::Success(pRuntime->NewString("checkbox"));
Ryan Harrison9baf31f2018-01-12 18:36:30 +00002015 case FormFieldType::kRadioButton:
Tom Sepeza5ea7ff2018-10-30 19:24:36 +00002016 return CJS_Result::Success(pRuntime->NewString("radiobutton"));
Ryan Harrison9baf31f2018-01-12 18:36:30 +00002017 case FormFieldType::kComboBox:
Tom Sepeza5ea7ff2018-10-30 19:24:36 +00002018 return CJS_Result::Success(pRuntime->NewString("combobox"));
Ryan Harrison9baf31f2018-01-12 18:36:30 +00002019 case FormFieldType::kListBox:
Tom Sepeza5ea7ff2018-10-30 19:24:36 +00002020 return CJS_Result::Success(pRuntime->NewString("listbox"));
Ryan Harrison9baf31f2018-01-12 18:36:30 +00002021 case FormFieldType::kTextField:
Tom Sepeza5ea7ff2018-10-30 19:24:36 +00002022 return CJS_Result::Success(pRuntime->NewString("text"));
Ryan Harrison9baf31f2018-01-12 18:36:30 +00002023 case FormFieldType::kSignature:
Tom Sepeza5ea7ff2018-10-30 19:24:36 +00002024 return CJS_Result::Success(pRuntime->NewString("signature"));
Lei Zhangc207ee22023-04-28 20:11:23 +00002025#ifdef PDF_ENABLE_XFA
Ryan Harrison9baf31f2018-01-12 18:36:30 +00002026 default:
Tom Sepeza5ea7ff2018-10-30 19:24:36 +00002027 return CJS_Result::Success(pRuntime->NewString("unknown"));
Lei Zhangc207ee22023-04-28 20:11:23 +00002028#endif
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002029 }
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002030}
2031
Tom Sepez3a6d0582018-08-17 19:28:52 +00002032CJS_Result CJS_Field::set_type(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp) {
2033 return CJS_Result::Failure(JSMessage::kNotSupportedError);
dan sinclaircbe23db2017-10-19 14:29:33 -04002034}
2035
Tom Sepez3a6d0582018-08-17 19:28:52 +00002036CJS_Result CJS_Field::get_user_name(CJS_Runtime* pRuntime) {
Tom Sepez08b23fc2021-01-27 22:23:27 +00002037 DCHECK(m_pFormFillEnv);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002038
Lei Zhang4c7ad662018-07-12 20:29:40 +00002039 CPDF_FormField* pFormField = GetFirstFormField();
2040 if (!pFormField)
Tom Sepez3a6d0582018-08-17 19:28:52 +00002041 return CJS_Result::Failure(JSMessage::kBadObjectError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002042
Tom Sepez3a6d0582018-08-17 19:28:52 +00002043 return CJS_Result::Success(
Lei Zhang4c7ad662018-07-12 20:29:40 +00002044 pRuntime->NewString(pFormField->GetAlternateName().AsStringView()));
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002045}
2046
Tom Sepez3a6d0582018-08-17 19:28:52 +00002047CJS_Result CJS_Field::set_user_name(CJS_Runtime* pRuntime,
Dan Sinclairf7435522018-02-05 22:27:22 +00002048 v8::Local<v8::Value> vp) {
Tom Sepez08b23fc2021-01-27 22:23:27 +00002049 DCHECK(m_pFormFillEnv);
Tom Sepez16999822018-06-08 18:23:05 +00002050 if (!m_bCanSet)
Tom Sepez3a6d0582018-08-17 19:28:52 +00002051 return CJS_Result::Failure(JSMessage::kReadOnlyError);
2052 return CJS_Result::Success();
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002053}
2054
Tom Sepez3a6d0582018-08-17 19:28:52 +00002055CJS_Result CJS_Field::get_value(CJS_Runtime* pRuntime) {
Lei Zhang4c7ad662018-07-12 20:29:40 +00002056 CPDF_FormField* pFormField = GetFirstFormField();
2057 if (!pFormField)
Tom Sepez3a6d0582018-08-17 19:28:52 +00002058 return CJS_Result::Failure(JSMessage::kBadObjectError);
Dan Sinclair8f524d62017-10-25 13:30:31 -04002059
2060 v8::Local<v8::Value> ret;
Tom Sepezd6ae2af2017-02-16 11:49:55 -08002061 switch (pFormField->GetFieldType()) {
Ryan Harrison9baf31f2018-01-12 18:36:30 +00002062 case FormFieldType::kPushButton:
Tom Sepez3a6d0582018-08-17 19:28:52 +00002063 return CJS_Result::Failure(JSMessage::kObjectTypeError);
Ryan Harrison9baf31f2018-01-12 18:36:30 +00002064 case FormFieldType::kComboBox:
2065 case FormFieldType::kTextField:
Tom Sepezb6b01cb2018-06-20 16:10:13 +00002066 ret = pRuntime->NewString(pFormField->GetValue().AsStringView());
dan sinclaircbe23db2017-10-19 14:29:33 -04002067 break;
Ryan Harrison9baf31f2018-01-12 18:36:30 +00002068 case FormFieldType::kListBox: {
Tom Sepezd6ae2af2017-02-16 11:49:55 -08002069 if (pFormField->CountSelectedItems() > 1) {
Dan Sinclair3a1ba8e2017-10-26 09:28:59 -04002070 v8::Local<v8::Array> ValueArray = pRuntime->NewArray();
dan sinclair80435cb2017-10-24 21:40:24 -04002071 v8::Local<v8::Value> ElementValue;
Tom Sepezd6ae2af2017-02-16 11:49:55 -08002072 int iIndex;
2073 for (int i = 0, sz = pFormField->CountSelectedItems(); i < sz; i++) {
2074 iIndex = pFormField->GetSelectedIndex(i);
Tom Sepezb6b01cb2018-06-20 16:10:13 +00002075 ElementValue = pRuntime->NewString(
2076 pFormField->GetOptionValue(iIndex).AsStringView());
Tom Sepez9284b902021-11-03 23:45:42 +00002077 if (pRuntime->ToWideString(ElementValue).IsEmpty()) {
Tom Sepezb6b01cb2018-06-20 16:10:13 +00002078 ElementValue = pRuntime->NewString(
2079 pFormField->GetOptionLabel(iIndex).AsStringView());
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002080 }
Dan Sinclair3a1ba8e2017-10-26 09:28:59 -04002081 pRuntime->PutArrayElement(ValueArray, i, ElementValue);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002082 }
Dan Sinclair3a1ba8e2017-10-26 09:28:59 -04002083 ret = ValueArray;
Tom Sepezd6ae2af2017-02-16 11:49:55 -08002084 } else {
Tom Sepezb6b01cb2018-06-20 16:10:13 +00002085 ret = pRuntime->NewString(pFormField->GetValue().AsStringView());
Tom Sepezd6ae2af2017-02-16 11:49:55 -08002086 }
dan sinclaircbe23db2017-10-19 14:29:33 -04002087 break;
2088 }
Ryan Harrison9baf31f2018-01-12 18:36:30 +00002089 case FormFieldType::kCheckBox:
2090 case FormFieldType::kRadioButton: {
Tom Sepezd6ae2af2017-02-16 11:49:55 -08002091 bool bFind = false;
2092 for (int i = 0, sz = pFormField->CountControls(); i < sz; i++) {
2093 if (pFormField->GetControl(i)->IsChecked()) {
Dan Sinclair8f524d62017-10-25 13:30:31 -04002094 ret = pRuntime->NewString(
Tom Sepezb6b01cb2018-06-20 16:10:13 +00002095 pFormField->GetControl(i)->GetExportValue().AsStringView());
Tom Sepezd6ae2af2017-02-16 11:49:55 -08002096 bFind = true;
2097 break;
2098 }
2099 }
2100 if (!bFind)
Tom Sepeza5ea7ff2018-10-30 19:24:36 +00002101 ret = pRuntime->NewString("Off");
dan sinclaircbe23db2017-10-19 14:29:33 -04002102
2103 break;
2104 }
Tom Sepezd6ae2af2017-02-16 11:49:55 -08002105 default:
Tom Sepezb6b01cb2018-06-20 16:10:13 +00002106 ret = pRuntime->NewString(pFormField->GetValue().AsStringView());
Tom Sepezd6ae2af2017-02-16 11:49:55 -08002107 break;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002108 }
Tom Sepez3a6d0582018-08-17 19:28:52 +00002109 return CJS_Result::Success(pRuntime->MaybeCoerceToNumber(ret));
dan sinclaircbe23db2017-10-19 14:29:33 -04002110}
2111
Tom Sepez3a6d0582018-08-17 19:28:52 +00002112CJS_Result CJS_Field::set_value(CJS_Runtime* pRuntime,
Dan Sinclairf7435522018-02-05 22:27:22 +00002113 v8::Local<v8::Value> vp) {
dan sinclaircbe23db2017-10-19 14:29:33 -04002114 if (!m_bCanSet)
Tom Sepez3a6d0582018-08-17 19:28:52 +00002115 return CJS_Result::Failure(JSMessage::kReadOnlyError);
dan sinclaircbe23db2017-10-19 14:29:33 -04002116
2117 std::vector<WideString> strArray;
Tom Sepezaf6371f2020-11-02 20:13:01 +00002118 if (fxv8::IsArray(vp)) {
Dan Sinclair3a1ba8e2017-10-26 09:28:59 -04002119 v8::Local<v8::Array> ValueArray = pRuntime->ToArray(vp);
2120 for (size_t i = 0; i < pRuntime->GetArrayLength(ValueArray); i++) {
dan sinclair80435cb2017-10-24 21:40:24 -04002121 strArray.push_back(
Dan Sinclair3a1ba8e2017-10-26 09:28:59 -04002122 pRuntime->ToWideString(pRuntime->GetArrayElement(ValueArray, i)));
dan sinclaircbe23db2017-10-19 14:29:33 -04002123 }
2124 } else {
dan sinclair80435cb2017-10-24 21:40:24 -04002125 strArray.push_back(pRuntime->ToWideString(vp));
dan sinclaircbe23db2017-10-19 14:29:33 -04002126 }
2127
2128 if (m_bDelay) {
2129 AddDelay_WideStringArray(FP_VALUE, strArray);
2130 } else {
Lei Zhange158a002019-03-29 17:16:03 +00002131 SetFieldValue(m_pFormFillEnv.Get(), m_FieldName, m_nFormControlIndex,
2132 strArray);
dan sinclaircbe23db2017-10-19 14:29:33 -04002133 }
Tom Sepez3a6d0582018-08-17 19:28:52 +00002134 return CJS_Result::Success();
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002135}
2136
Tom Sepez3a6d0582018-08-17 19:28:52 +00002137CJS_Result CJS_Field::get_value_as_string(CJS_Runtime* pRuntime) {
Lei Zhang4c7ad662018-07-12 20:29:40 +00002138 CPDF_FormField* pFormField = GetFirstFormField();
2139 if (!pFormField)
Tom Sepez3a6d0582018-08-17 19:28:52 +00002140 return CJS_Result::Failure(JSMessage::kBadObjectError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002141
Ryan Harrison9baf31f2018-01-12 18:36:30 +00002142 if (pFormField->GetFieldType() == FormFieldType::kPushButton)
Tom Sepez3a6d0582018-08-17 19:28:52 +00002143 return CJS_Result::Failure(JSMessage::kObjectTypeError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002144
Ryan Harrison9baf31f2018-01-12 18:36:30 +00002145 if (pFormField->GetFieldType() == FormFieldType::kCheckBox) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002146 if (!pFormField->CountControls())
Tom Sepez3a6d0582018-08-17 19:28:52 +00002147 return CJS_Result::Failure(JSMessage::kBadObjectError);
2148 return CJS_Result::Success(pRuntime->NewString(
Dan Sinclaire4974922017-10-24 09:36:16 -04002149 pFormField->GetControl(0)->IsChecked() ? L"Yes" : L"Off"));
dan sinclaircbe23db2017-10-19 14:29:33 -04002150 }
2151
Ryan Harrison9baf31f2018-01-12 18:36:30 +00002152 if (pFormField->GetFieldType() == FormFieldType::kRadioButton &&
Lei Zhanga676aca2019-02-02 00:41:09 +00002153 !(pFormField->GetFieldFlags() &
2154 pdfium::form_flags::kButtonRadiosInUnison)) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002155 for (int i = 0, sz = pFormField->CountControls(); i < sz; i++) {
2156 if (pFormField->GetControl(i)->IsChecked()) {
Tom Sepez3a6d0582018-08-17 19:28:52 +00002157 return CJS_Result::Success(pRuntime->NewString(
Tom Sepezb6b01cb2018-06-20 16:10:13 +00002158 pFormField->GetControl(i)->GetExportValue().AsStringView()));
Lei Zhangd88a3642015-11-10 09:38:57 -08002159 }
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002160 }
Tom Sepeza5ea7ff2018-10-30 19:24:36 +00002161 return CJS_Result::Success(pRuntime->NewString("Off"));
dan sinclaircbe23db2017-10-19 14:29:33 -04002162 }
2163
Ryan Harrison9baf31f2018-01-12 18:36:30 +00002164 if (pFormField->GetFieldType() == FormFieldType::kListBox &&
dan sinclaircbe23db2017-10-19 14:29:33 -04002165 (pFormField->CountSelectedItems() > 1)) {
Tom Sepeza5ea7ff2018-10-30 19:24:36 +00002166 return CJS_Result::Success(pRuntime->NewString(""));
Lei Zhangd88a3642015-11-10 09:38:57 -08002167 }
Tom Sepez3a6d0582018-08-17 19:28:52 +00002168 return CJS_Result::Success(
Tom Sepez20736f72018-08-17 16:44:50 +00002169 pRuntime->NewString(pFormField->GetValue().AsStringView()));
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002170}
2171
Tom Sepez3a6d0582018-08-17 19:28:52 +00002172CJS_Result CJS_Field::set_value_as_string(CJS_Runtime* pRuntime,
Dan Sinclairf7435522018-02-05 22:27:22 +00002173 v8::Local<v8::Value> vp) {
Tom Sepez3a6d0582018-08-17 19:28:52 +00002174 return CJS_Result::Failure(JSMessage::kNotSupportedError);
dan sinclaircbe23db2017-10-19 14:29:33 -04002175}
2176
Tom Sepez3a6d0582018-08-17 19:28:52 +00002177CJS_Result CJS_Field::browseForFileToSubmit(
dan sinclair80435cb2017-10-24 21:40:24 -04002178 CJS_Runtime* pRuntime,
Dan Sinclair8f524d62017-10-25 13:30:31 -04002179 const std::vector<v8::Local<v8::Value>>& params) {
Lei Zhang4c7ad662018-07-12 20:29:40 +00002180 CPDF_FormField* pFormField = GetFirstFormField();
2181 if (!pFormField)
Tom Sepez3a6d0582018-08-17 19:28:52 +00002182 return CJS_Result::Failure(JSMessage::kBadObjectError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002183
Lei Zhanga676aca2019-02-02 00:41:09 +00002184 if ((pFormField->GetFieldFlags() & pdfium::form_flags::kTextFileSelect) &&
Ryan Harrison9baf31f2018-01-12 18:36:30 +00002185 (pFormField->GetFieldType() == FormFieldType::kTextField)) {
Ryan Harrison275e2602017-09-18 14:23:18 -04002186 WideString wsFileName = m_pFormFillEnv->JS_fieldBrowse();
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002187 if (!wsFileName.IsEmpty()) {
Tom Sepezb2e6b4c2018-08-16 20:53:58 +00002188 pFormField->SetValue(wsFileName, NotificationOption::kDoNotNotify);
Tom Sepez5c7f4422022-04-05 00:22:22 +00002189 UpdateFormField(m_pFormFillEnv.Get(), pFormField, true);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002190 }
Tom Sepez3a6d0582018-08-17 19:28:52 +00002191 return CJS_Result::Success();
Lei Zhangd88a3642015-11-10 09:38:57 -08002192 }
Tom Sepez3a6d0582018-08-17 19:28:52 +00002193 return CJS_Result::Failure(JSMessage::kObjectTypeError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002194}
2195
Tom Sepez3a6d0582018-08-17 19:28:52 +00002196CJS_Result CJS_Field::buttonGetCaption(
Dan Sinclair8f524d62017-10-25 13:30:31 -04002197 CJS_Runtime* pRuntime,
2198 const std::vector<v8::Local<v8::Value>>& params) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002199 int nface = 0;
Tom Sepeza0de6da2021-11-11 01:40:23 +00002200 if (params.size() >= 1)
dan sinclair80435cb2017-10-24 21:40:24 -04002201 nface = pRuntime->ToInt32(params[0]);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002202
Lei Zhang4c7ad662018-07-12 20:29:40 +00002203 CPDF_FormField* pFormField = GetFirstFormField();
2204 if (!pFormField)
Tom Sepez3a6d0582018-08-17 19:28:52 +00002205 return CJS_Result::Failure(JSMessage::kBadObjectError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002206
Ryan Harrison9baf31f2018-01-12 18:36:30 +00002207 if (pFormField->GetFieldType() != FormFieldType::kPushButton)
Tom Sepez3a6d0582018-08-17 19:28:52 +00002208 return CJS_Result::Failure(JSMessage::kObjectTypeError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002209
2210 CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
2211 if (!pFormControl)
Tom Sepez3a6d0582018-08-17 19:28:52 +00002212 return CJS_Result::Failure(JSMessage::kBadObjectError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002213
Dan Sinclair8f524d62017-10-25 13:30:31 -04002214 if (nface == 0) {
Tom Sepez3a6d0582018-08-17 19:28:52 +00002215 return CJS_Result::Success(
Tom Sepezb6b01cb2018-06-20 16:10:13 +00002216 pRuntime->NewString(pFormControl->GetNormalCaption().AsStringView()));
2217 }
2218 if (nface == 1) {
Tom Sepez3a6d0582018-08-17 19:28:52 +00002219 return CJS_Result::Success(
Tom Sepezb6b01cb2018-06-20 16:10:13 +00002220 pRuntime->NewString(pFormControl->GetDownCaption().AsStringView()));
2221 }
2222 if (nface == 2) {
Tom Sepez3a6d0582018-08-17 19:28:52 +00002223 return CJS_Result::Success(
Tom Sepezb6b01cb2018-06-20 16:10:13 +00002224 pRuntime->NewString(pFormControl->GetRolloverCaption().AsStringView()));
Dan Sinclair8f524d62017-10-25 13:30:31 -04002225 }
Tom Sepez3a6d0582018-08-17 19:28:52 +00002226 return CJS_Result::Failure(JSMessage::kValueError);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07002227}
2228
Tom Sepez3a6d0582018-08-17 19:28:52 +00002229CJS_Result CJS_Field::buttonGetIcon(
Dan Sinclair8f524d62017-10-25 13:30:31 -04002230 CJS_Runtime* pRuntime,
2231 const std::vector<v8::Local<v8::Value>>& params) {
Tom Sepez40e0a812017-02-23 13:07:36 -08002232 if (params.size() >= 1) {
dan sinclair80435cb2017-10-24 21:40:24 -04002233 int nFace = pRuntime->ToInt32(params[0]);
Tom Sepez40e0a812017-02-23 13:07:36 -08002234 if (nFace < 0 || nFace > 2)
Tom Sepez3a6d0582018-08-17 19:28:52 +00002235 return CJS_Result::Failure(JSMessage::kValueError);
Tom Sepez40e0a812017-02-23 13:07:36 -08002236 }
Lei Zhanga6d9f0e2015-06-13 00:48:38 -07002237
Lei Zhang4c7ad662018-07-12 20:29:40 +00002238 CPDF_FormField* pFormField = GetFirstFormField();
2239 if (!pFormField)
Tom Sepez3a6d0582018-08-17 19:28:52 +00002240 return CJS_Result::Failure(JSMessage::kBadObjectError);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07002241
Ryan Harrison9baf31f2018-01-12 18:36:30 +00002242 if (pFormField->GetFieldType() != FormFieldType::kPushButton)
Tom Sepez3a6d0582018-08-17 19:28:52 +00002243 return CJS_Result::Failure(JSMessage::kObjectTypeError);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07002244
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002245 CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
2246 if (!pFormControl)
Tom Sepez3a6d0582018-08-17 19:28:52 +00002247 return CJS_Result::Failure(JSMessage::kBadObjectError);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07002248
Tom Sepez55ccb522018-08-14 23:40:10 +00002249 v8::Local<v8::Object> pObj = pRuntime->NewFXJSBoundObject(
2250 CJS_Icon::GetObjDefnID(), FXJSOBJTYPE_DYNAMIC);
Tom Sepezc5a14722017-02-24 15:31:12 -08002251 if (pObj.IsEmpty())
Tom Sepez3a6d0582018-08-17 19:28:52 +00002252 return CJS_Result::Failure(JSMessage::kBadObjectError);
Lei Zhanga6d9f0e2015-06-13 00:48:38 -07002253
Daniel Hosseinianb6a909b2021-10-22 18:21:53 +00002254 auto* pJS_Icon = static_cast<CJS_Icon*>(
2255 CFXJS_Engine::GetObjectPrivate(pRuntime->GetIsolate(), pObj));
Tom Sepez3a6d0582018-08-17 19:28:52 +00002256 return pJS_Icon ? CJS_Result::Success(pJS_Icon->ToV8Object())
2257 : CJS_Result::Failure(JSMessage::kBadObjectError);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07002258}
2259
Tom Sepez3a6d0582018-08-17 19:28:52 +00002260CJS_Result CJS_Field::buttonImportIcon(
Dan Sinclair8f524d62017-10-25 13:30:31 -04002261 CJS_Runtime* pRuntime,
2262 const std::vector<v8::Local<v8::Value>>& params) {
Tom Sepez3a6d0582018-08-17 19:28:52 +00002263 return CJS_Result::Success();
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002264}
2265
Tom Sepez3a6d0582018-08-17 19:28:52 +00002266CJS_Result CJS_Field::buttonSetCaption(
Dan Sinclair8f524d62017-10-25 13:30:31 -04002267 CJS_Runtime* pRuntime,
2268 const std::vector<v8::Local<v8::Value>>& params) {
Tom Sepez3a6d0582018-08-17 19:28:52 +00002269 return CJS_Result::Failure(JSMessage::kNotSupportedError);
tsepez4cf55152016-11-02 14:37:54 -07002270}
2271
Tom Sepez3a6d0582018-08-17 19:28:52 +00002272CJS_Result CJS_Field::buttonSetIcon(
Dan Sinclair8f524d62017-10-25 13:30:31 -04002273 CJS_Runtime* pRuntime,
2274 const std::vector<v8::Local<v8::Value>>& params) {
Tom Sepez3a6d0582018-08-17 19:28:52 +00002275 return CJS_Result::Failure(JSMessage::kNotSupportedError);
tsepez4cf55152016-11-02 14:37:54 -07002276}
2277
Tom Sepez3a6d0582018-08-17 19:28:52 +00002278CJS_Result CJS_Field::checkThisBox(
Dan Sinclair8f524d62017-10-25 13:30:31 -04002279 CJS_Runtime* pRuntime,
2280 const std::vector<v8::Local<v8::Value>>& params) {
Tom Sepeza0de6da2021-11-11 01:40:23 +00002281 const size_t nSize = params.size();
2282 if (nSize == 0)
Tom Sepez3a6d0582018-08-17 19:28:52 +00002283 return CJS_Result::Failure(JSMessage::kParamError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002284
tsepezf3dc8c62016-08-10 06:29:29 -07002285 if (!m_bCanSet)
Tom Sepez3a6d0582018-08-17 19:28:52 +00002286 return CJS_Result::Failure(JSMessage::kReadOnlyError);
tsepezf3dc8c62016-08-10 06:29:29 -07002287
dan sinclair80435cb2017-10-24 21:40:24 -04002288 int nWidget = pRuntime->ToInt32(params[0]);
Wei Li97da9762016-03-11 17:00:48 -08002289 bool bCheckit = true;
Tom Sepeza0de6da2021-11-11 01:40:23 +00002290 if (nSize >= 2)
dan sinclair80435cb2017-10-24 21:40:24 -04002291 bCheckit = pRuntime->ToBoolean(params[1]);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002292
Lei Zhang4c7ad662018-07-12 20:29:40 +00002293 CPDF_FormField* pFormField = GetFirstFormField();
2294 if (!pFormField)
Tom Sepez3a6d0582018-08-17 19:28:52 +00002295 return CJS_Result::Failure(JSMessage::kBadObjectError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002296
Lei Zhangdfa2ac22018-07-12 19:06:50 +00002297 if (!IsCheckBoxOrRadioButton(pFormField))
Tom Sepez3a6d0582018-08-17 19:28:52 +00002298 return CJS_Result::Failure(JSMessage::kObjectTypeError);
Tom Sepezb2e6b4c2018-08-16 20:53:58 +00002299
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002300 if (nWidget < 0 || nWidget >= pFormField->CountControls())
Tom Sepez3a6d0582018-08-17 19:28:52 +00002301 return CJS_Result::Failure(JSMessage::kValueError);
Lei Zhangbc486922018-01-29 15:30:46 +00002302
2303 // TODO(weili): Check whether anything special needed for radio button.
2304 // (When pFormField->GetFieldType() == FormFieldType::kRadioButton.)
Tom Sepezb2e6b4c2018-08-16 20:53:58 +00002305 pFormField->CheckControl(nWidget, bCheckit, NotificationOption::kNotify);
Tom Sepez5c7f4422022-04-05 00:22:22 +00002306 UpdateFormField(m_pFormFillEnv.Get(), pFormField, true);
Tom Sepez3a6d0582018-08-17 19:28:52 +00002307 return CJS_Result::Success();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07002308}
2309
Tom Sepez3a6d0582018-08-17 19:28:52 +00002310CJS_Result CJS_Field::clearItems(
Dan Sinclairf7435522018-02-05 22:27:22 +00002311 CJS_Runtime* pRuntime,
2312 const std::vector<v8::Local<v8::Value>>& params) {
Tom Sepez3a6d0582018-08-17 19:28:52 +00002313 return CJS_Result::Success();
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002314}
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07002315
Tom Sepez3a6d0582018-08-17 19:28:52 +00002316CJS_Result CJS_Field::defaultIsChecked(
Dan Sinclair8f524d62017-10-25 13:30:31 -04002317 CJS_Runtime* pRuntime,
2318 const std::vector<v8::Local<v8::Value>>& params) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002319 if (!m_bCanSet)
Tom Sepez3a6d0582018-08-17 19:28:52 +00002320 return CJS_Result::Failure(JSMessage::kReadOnlyError);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07002321
Tom Sepeza0de6da2021-11-11 01:40:23 +00002322 if (params.empty())
Tom Sepez3a6d0582018-08-17 19:28:52 +00002323 return CJS_Result::Failure(JSMessage::kParamError);
Tom Sepezf4ef3f92015-04-23 11:31:31 -07002324
Lei Zhang4c7ad662018-07-12 20:29:40 +00002325 CPDF_FormField* pFormField = GetFirstFormField();
2326 if (!pFormField)
Tom Sepez3a6d0582018-08-17 19:28:52 +00002327 return CJS_Result::Failure(JSMessage::kBadObjectError);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07002328
Lei Zhang4c7ad662018-07-12 20:29:40 +00002329 int nWidget = pRuntime->ToInt32(params[0]);
tsepezf3dc8c62016-08-10 06:29:29 -07002330 if (nWidget < 0 || nWidget >= pFormField->CountControls())
Tom Sepez3a6d0582018-08-17 19:28:52 +00002331 return CJS_Result::Failure(JSMessage::kValueError);
tsepezf3dc8c62016-08-10 06:29:29 -07002332
Tom Sepez3a6d0582018-08-17 19:28:52 +00002333 return CJS_Result::Success(
Tom Sepez20736f72018-08-17 16:44:50 +00002334 pRuntime->NewBoolean(IsCheckBoxOrRadioButton(pFormField)));
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002335}
2336
Tom Sepez3a6d0582018-08-17 19:28:52 +00002337CJS_Result CJS_Field::deleteItemAt(
Dan Sinclair8f524d62017-10-25 13:30:31 -04002338 CJS_Runtime* pRuntime,
2339 const std::vector<v8::Local<v8::Value>>& params) {
Tom Sepez3a6d0582018-08-17 19:28:52 +00002340 return CJS_Result::Success();
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002341}
2342
Tom Sepez3a6d0582018-08-17 19:28:52 +00002343CJS_Result CJS_Field::getArray(
Dan Sinclairf7435522018-02-05 22:27:22 +00002344 CJS_Runtime* pRuntime,
2345 const std::vector<v8::Local<v8::Value>>& params) {
Lei Zhang18915232018-07-12 20:53:40 +00002346 std::vector<CPDF_FormField*> FieldArray = GetFormFields();
Lei Zhangd88a3642015-11-10 09:38:57 -08002347 if (FieldArray.empty())
Tom Sepez3a6d0582018-08-17 19:28:52 +00002348 return CJS_Result::Failure(JSMessage::kBadObjectError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002349
Ryan Harrison275e2602017-09-18 14:23:18 -04002350 std::vector<std::unique_ptr<WideString>> swSort;
Tom Sepezb9cc7a02016-02-01 13:42:30 -08002351 for (CPDF_FormField* pFormField : FieldArray) {
Tom Sepez31d722d2020-05-15 22:03:46 +00002352 swSort.push_back(std::make_unique<WideString>(pFormField->GetFullName()));
Tom Sepezb9cc7a02016-02-01 13:42:30 -08002353 }
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002354
Ryan Harrison275e2602017-09-18 14:23:18 -04002355 std::sort(swSort.begin(), swSort.end(),
2356 [](const std::unique_ptr<WideString>& p1,
2357 const std::unique_ptr<WideString>& p2) { return *p1 < *p2; });
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002358
Dan Sinclair3a1ba8e2017-10-26 09:28:59 -04002359 v8::Local<v8::Array> FormFieldArray = pRuntime->NewArray();
Tom Sepezb9cc7a02016-02-01 13:42:30 -08002360 int j = 0;
2361 for (const auto& pStr : swSort) {
Tom Sepez55ccb522018-08-14 23:40:10 +00002362 v8::Local<v8::Object> pObj = pRuntime->NewFXJSBoundObject(
2363 CJS_Field::GetObjDefnID(), FXJSOBJTYPE_DYNAMIC);
Tom Sepezc5a14722017-02-24 15:31:12 -08002364 if (pObj.IsEmpty())
Tom Sepez3a6d0582018-08-17 19:28:52 +00002365 return CJS_Result::Failure(JSMessage::kBadObjectError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002366
Daniel Hosseinianb6a909b2021-10-22 18:21:53 +00002367 auto* pJSField = static_cast<CJS_Field*>(
2368 CFXJS_Engine::GetObjectPrivate(pRuntime->GetIsolate(), pObj));
Tom Sepez2cbae732018-06-26 15:11:28 +00002369 pJSField->AttachField(m_pJSDoc.Get(), *pStr);
Dan Sinclair3a1ba8e2017-10-26 09:28:59 -04002370 pRuntime->PutArrayElement(FormFieldArray, j++,
dan sinclair80435cb2017-10-24 21:40:24 -04002371 pJSField
2372 ? v8::Local<v8::Value>(pJSField->ToV8Object())
2373 : v8::Local<v8::Value>());
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002374 }
Tom Sepez3a6d0582018-08-17 19:28:52 +00002375 return CJS_Result::Success(FormFieldArray);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002376}
2377
Tom Sepez3a6d0582018-08-17 19:28:52 +00002378CJS_Result CJS_Field::getItemAt(
Dan Sinclairf7435522018-02-05 22:27:22 +00002379 CJS_Runtime* pRuntime,
2380 const std::vector<v8::Local<v8::Value>>& params) {
Tom Sepeza0de6da2021-11-11 01:40:23 +00002381 const size_t nSize = params.size();
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002382 int nIdx = -1;
Tom Sepeza0de6da2021-11-11 01:40:23 +00002383 if (nSize >= 1)
dan sinclair80435cb2017-10-24 21:40:24 -04002384 nIdx = pRuntime->ToInt32(params[0]);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002385
tsepez4cf55152016-11-02 14:37:54 -07002386 bool bExport = true;
Tom Sepeza0de6da2021-11-11 01:40:23 +00002387 if (nSize >= 2)
dan sinclair80435cb2017-10-24 21:40:24 -04002388 bExport = pRuntime->ToBoolean(params[1]);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002389
Lei Zhang4c7ad662018-07-12 20:29:40 +00002390 CPDF_FormField* pFormField = GetFirstFormField();
2391 if (!pFormField)
Tom Sepez3a6d0582018-08-17 19:28:52 +00002392 return CJS_Result::Failure(JSMessage::kBadObjectError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002393
Lei Zhang83f2d702018-07-12 19:07:40 +00002394 if (!IsComboBoxOrListBox(pFormField))
Tom Sepez3a6d0582018-08-17 19:28:52 +00002395 return CJS_Result::Failure(JSMessage::kObjectTypeError);
Lei Zhang83f2d702018-07-12 19:07:40 +00002396
2397 if (nIdx == -1 || nIdx > pFormField->CountOptions())
2398 nIdx = pFormField->CountOptions() - 1;
2399 if (!bExport) {
Tom Sepez3a6d0582018-08-17 19:28:52 +00002400 return CJS_Result::Success(
Tom Sepezb6b01cb2018-06-20 16:10:13 +00002401 pRuntime->NewString(pFormField->GetOptionLabel(nIdx).AsStringView()));
Lei Zhangd88a3642015-11-10 09:38:57 -08002402 }
Lei Zhang83f2d702018-07-12 19:07:40 +00002403
2404 WideString strval = pFormField->GetOptionValue(nIdx);
2405 if (strval.IsEmpty()) {
Tom Sepez3a6d0582018-08-17 19:28:52 +00002406 return CJS_Result::Success(
Lei Zhang83f2d702018-07-12 19:07:40 +00002407 pRuntime->NewString(pFormField->GetOptionLabel(nIdx).AsStringView()));
2408 }
Tom Sepez3a6d0582018-08-17 19:28:52 +00002409 return CJS_Result::Success(pRuntime->NewString(strval.AsStringView()));
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002410}
2411
Tom Sepez3a6d0582018-08-17 19:28:52 +00002412CJS_Result CJS_Field::getLock(CJS_Runtime* pRuntime,
Dan Sinclairf7435522018-02-05 22:27:22 +00002413 const std::vector<v8::Local<v8::Value>>& params) {
Tom Sepez3a6d0582018-08-17 19:28:52 +00002414 return CJS_Result::Failure(JSMessage::kNotSupportedError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002415}
2416
Tom Sepez3a6d0582018-08-17 19:28:52 +00002417CJS_Result CJS_Field::insertItemAt(
Dan Sinclair8f524d62017-10-25 13:30:31 -04002418 CJS_Runtime* pRuntime,
2419 const std::vector<v8::Local<v8::Value>>& params) {
Tom Sepez3a6d0582018-08-17 19:28:52 +00002420 return CJS_Result::Success();
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002421}
2422
Tom Sepez3a6d0582018-08-17 19:28:52 +00002423CJS_Result CJS_Field::isBoxChecked(
Dan Sinclair8f524d62017-10-25 13:30:31 -04002424 CJS_Runtime* pRuntime,
2425 const std::vector<v8::Local<v8::Value>>& params) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002426 int nIndex = -1;
2427 if (params.size() >= 1)
dan sinclair80435cb2017-10-24 21:40:24 -04002428 nIndex = pRuntime->ToInt32(params[0]);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002429
Lei Zhang4c7ad662018-07-12 20:29:40 +00002430 CPDF_FormField* pFormField = GetFirstFormField();
2431 if (!pFormField)
Tom Sepez3a6d0582018-08-17 19:28:52 +00002432 return CJS_Result::Failure(JSMessage::kBadObjectError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002433
dan sinclair646634b2017-10-19 14:30:28 -04002434 if (nIndex < 0 || nIndex >= pFormField->CountControls())
Tom Sepez3a6d0582018-08-17 19:28:52 +00002435 return CJS_Result::Failure(JSMessage::kValueError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002436
Tom Sepez3a6d0582018-08-17 19:28:52 +00002437 return CJS_Result::Success(
Lei Zhangdfa2ac22018-07-12 19:06:50 +00002438 pRuntime->NewBoolean((IsCheckBoxOrRadioButton(pFormField) &&
2439 pFormField->GetControl(nIndex)->IsChecked() != 0)));
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07002440}
2441
Tom Sepez3a6d0582018-08-17 19:28:52 +00002442CJS_Result CJS_Field::isDefaultChecked(
Dan Sinclair8f524d62017-10-25 13:30:31 -04002443 CJS_Runtime* pRuntime,
2444 const std::vector<v8::Local<v8::Value>>& params) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002445 int nIndex = -1;
2446 if (params.size() >= 1)
dan sinclair80435cb2017-10-24 21:40:24 -04002447 nIndex = pRuntime->ToInt32(params[0]);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07002448
Lei Zhang4c7ad662018-07-12 20:29:40 +00002449 CPDF_FormField* pFormField = GetFirstFormField();
2450 if (!pFormField)
Tom Sepez3a6d0582018-08-17 19:28:52 +00002451 return CJS_Result::Failure(JSMessage::kBadObjectError);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07002452
tsepezf3dc8c62016-08-10 06:29:29 -07002453 if (nIndex < 0 || nIndex >= pFormField->CountControls())
Tom Sepez3a6d0582018-08-17 19:28:52 +00002454 return CJS_Result::Failure(JSMessage::kValueError);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07002455
Tom Sepez3a6d0582018-08-17 19:28:52 +00002456 return CJS_Result::Success(pRuntime->NewBoolean(
Lei Zhangdfa2ac22018-07-12 19:06:50 +00002457 (IsCheckBoxOrRadioButton(pFormField) &&
Dan Sinclair1d8d9ac2017-10-24 11:23:25 -04002458 pFormField->GetControl(nIndex)->IsDefaultChecked() != 0)));
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07002459}
2460
Tom Sepez3a6d0582018-08-17 19:28:52 +00002461CJS_Result CJS_Field::setAction(
Dan Sinclairf7435522018-02-05 22:27:22 +00002462 CJS_Runtime* pRuntime,
2463 const std::vector<v8::Local<v8::Value>>& params) {
Tom Sepez3a6d0582018-08-17 19:28:52 +00002464 return CJS_Result::Success();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07002465}
2466
Tom Sepez3a6d0582018-08-17 19:28:52 +00002467CJS_Result CJS_Field::setFocus(
Dan Sinclairf7435522018-02-05 22:27:22 +00002468 CJS_Runtime* pRuntime,
2469 const std::vector<v8::Local<v8::Value>>& params) {
Lei Zhang4c7ad662018-07-12 20:29:40 +00002470 CPDF_FormField* pFormField = GetFirstFormField();
2471 if (!pFormField)
Tom Sepez3a6d0582018-08-17 19:28:52 +00002472 return CJS_Result::Failure(JSMessage::kBadObjectError);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07002473
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002474 int32_t nCount = pFormField->CountControls();
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002475 if (nCount < 1)
Tom Sepez3a6d0582018-08-17 19:28:52 +00002476 return CJS_Result::Failure(JSMessage::kBadObjectError);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07002477
Lei Zhang073ecf42018-10-11 16:56:00 +00002478 CPDFSDK_InteractiveForm* pForm = m_pFormFillEnv->GetInteractiveForm();
thestig1cd352e2016-06-07 17:53:06 -07002479 CPDFSDK_Widget* pWidget = nullptr;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002480 if (nCount == 1) {
Lei Zhang073ecf42018-10-11 16:56:00 +00002481 pWidget = pForm->GetWidget(pFormField->GetControl(0));
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002482 } else {
Tom Sepez4b718ca2022-08-09 20:22:30 +00002483 IPDF_Page* pPage = m_pFormFillEnv->GetCurrentPage();
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002484 if (!pPage)
Tom Sepez3a6d0582018-08-17 19:28:52 +00002485 return CJS_Result::Failure(JSMessage::kBadObjectError);
Tom Sepezcee8fbd2021-06-04 19:21:40 +00002486 CPDFSDK_PageView* pCurPageView = m_pFormFillEnv->GetOrCreatePageView(pPage);
2487 for (int32_t i = 0; i < nCount; i++) {
2488 if (CPDFSDK_Widget* pTempWidget =
2489 pForm->GetWidget(pFormField->GetControl(i))) {
2490 if (pTempWidget->GetPDFPage() == pCurPageView->GetPDFPage()) {
2491 pWidget = pTempWidget;
2492 break;
Tom Sepez2f2ffec2015-07-23 14:42:09 -07002493 }
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002494 }
Tom Sepez2f2ffec2015-07-23 14:42:09 -07002495 }
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002496 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07002497
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002498 if (pWidget) {
Tom Sepezd8ae8f82019-06-12 17:58:33 +00002499 ObservedPtr<CPDFSDK_Annot> pObserved(pWidget);
Tom Sepez1d737dd2021-09-22 22:46:29 +00002500 m_pFormFillEnv->SetFocusAnnot(pObserved);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002501 }
2502
Tom Sepez3a6d0582018-08-17 19:28:52 +00002503 return CJS_Result::Success();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07002504}
2505
Tom Sepez3a6d0582018-08-17 19:28:52 +00002506CJS_Result CJS_Field::setItems(
Dan Sinclairf7435522018-02-05 22:27:22 +00002507 CJS_Runtime* pRuntime,
2508 const std::vector<v8::Local<v8::Value>>& params) {
Tom Sepez3a6d0582018-08-17 19:28:52 +00002509 return CJS_Result::Success();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07002510}
2511
Tom Sepez3a6d0582018-08-17 19:28:52 +00002512CJS_Result CJS_Field::setLock(CJS_Runtime* pRuntime,
Dan Sinclairf7435522018-02-05 22:27:22 +00002513 const std::vector<v8::Local<v8::Value>>& params) {
Tom Sepez3a6d0582018-08-17 19:28:52 +00002514 return CJS_Result::Failure(JSMessage::kNotSupportedError);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07002515}
2516
Tom Sepez3a6d0582018-08-17 19:28:52 +00002517CJS_Result CJS_Field::signatureGetModifications(
dan sinclair80435cb2017-10-24 21:40:24 -04002518 CJS_Runtime* pRuntime,
Dan Sinclair8f524d62017-10-25 13:30:31 -04002519 const std::vector<v8::Local<v8::Value>>& params) {
Tom Sepez3a6d0582018-08-17 19:28:52 +00002520 return CJS_Result::Failure(JSMessage::kNotSupportedError);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07002521}
2522
Tom Sepez3a6d0582018-08-17 19:28:52 +00002523CJS_Result CJS_Field::signatureGetSeedValue(
dan sinclair80435cb2017-10-24 21:40:24 -04002524 CJS_Runtime* pRuntime,
Dan Sinclair8f524d62017-10-25 13:30:31 -04002525 const std::vector<v8::Local<v8::Value>>& params) {
Tom Sepez3a6d0582018-08-17 19:28:52 +00002526 return CJS_Result::Failure(JSMessage::kNotSupportedError);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07002527}
2528
Tom Sepez3a6d0582018-08-17 19:28:52 +00002529CJS_Result CJS_Field::signatureInfo(
dan sinclair80435cb2017-10-24 21:40:24 -04002530 CJS_Runtime* pRuntime,
Dan Sinclair8f524d62017-10-25 13:30:31 -04002531 const std::vector<v8::Local<v8::Value>>& params) {
Tom Sepez3a6d0582018-08-17 19:28:52 +00002532 return CJS_Result::Failure(JSMessage::kNotSupportedError);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07002533}
2534
Tom Sepez3a6d0582018-08-17 19:28:52 +00002535CJS_Result CJS_Field::signatureSetSeedValue(
Dan Sinclair8f524d62017-10-25 13:30:31 -04002536 CJS_Runtime* pRuntime,
2537 const std::vector<v8::Local<v8::Value>>& params) {
Tom Sepez3a6d0582018-08-17 19:28:52 +00002538 return CJS_Result::Failure(JSMessage::kNotSupportedError);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07002539}
2540
Tom Sepez3a6d0582018-08-17 19:28:52 +00002541CJS_Result CJS_Field::signatureSign(
Dan Sinclair8f524d62017-10-25 13:30:31 -04002542 CJS_Runtime* pRuntime,
2543 const std::vector<v8::Local<v8::Value>>& params) {
Tom Sepez3a6d0582018-08-17 19:28:52 +00002544 return CJS_Result::Failure(JSMessage::kNotSupportedError);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07002545}
2546
Tom Sepez3a6d0582018-08-17 19:28:52 +00002547CJS_Result CJS_Field::signatureValidate(
Dan Sinclair8f524d62017-10-25 13:30:31 -04002548 CJS_Runtime* pRuntime,
2549 const std::vector<v8::Local<v8::Value>>& params) {
Tom Sepez3a6d0582018-08-17 19:28:52 +00002550 return CJS_Result::Failure(JSMessage::kNotSupportedError);
dan sinclaircbe23db2017-10-19 14:29:33 -04002551}
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002552
Tom Sepez0cbd0a02021-05-27 19:44:27 +00002553void CJS_Field::SetDelay(bool bDelay) {
2554 m_bDelay = bDelay;
2555 if (m_bDelay)
2556 return;
2557
2558 if (m_pJSDoc)
2559 m_pJSDoc->DoFieldDelay(m_FieldName, m_nFormControlIndex);
2560}
2561
Dan Sinclairf7435522018-02-05 22:27:22 +00002562void CJS_Field::AddDelay_Int(FIELD_PROP prop, int32_t n) {
Tom Sepez75acda62018-01-29 20:17:36 +00002563 auto pNewData =
Tom Sepez31d722d2020-05-15 22:03:46 +00002564 std::make_unique<CJS_DelayData>(prop, m_nFormControlIndex, m_FieldName);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002565 pNewData->num = n;
Tom Sepez75acda62018-01-29 20:17:36 +00002566 m_pJSDoc->AddDelayData(std::move(pNewData));
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07002567}
2568
Dan Sinclairf7435522018-02-05 22:27:22 +00002569void CJS_Field::AddDelay_Bool(FIELD_PROP prop, bool b) {
Tom Sepez75acda62018-01-29 20:17:36 +00002570 auto pNewData =
Tom Sepez31d722d2020-05-15 22:03:46 +00002571 std::make_unique<CJS_DelayData>(prop, m_nFormControlIndex, m_FieldName);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002572 pNewData->b = b;
Tom Sepez75acda62018-01-29 20:17:36 +00002573 m_pJSDoc->AddDelayData(std::move(pNewData));
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07002574}
2575
Lei Zhang109aa6d2018-09-20 01:21:05 +00002576void CJS_Field::AddDelay_String(FIELD_PROP prop, const ByteString& str) {
Tom Sepez75acda62018-01-29 20:17:36 +00002577 auto pNewData =
Tom Sepez31d722d2020-05-15 22:03:46 +00002578 std::make_unique<CJS_DelayData>(prop, m_nFormControlIndex, m_FieldName);
Lei Zhang109aa6d2018-09-20 01:21:05 +00002579 pNewData->bytestring = str;
Tom Sepez75acda62018-01-29 20:17:36 +00002580 m_pJSDoc->AddDelayData(std::move(pNewData));
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07002581}
2582
Dan Sinclairf7435522018-02-05 22:27:22 +00002583void CJS_Field::AddDelay_Rect(FIELD_PROP prop, const CFX_FloatRect& rect) {
Tom Sepez75acda62018-01-29 20:17:36 +00002584 auto pNewData =
Tom Sepez31d722d2020-05-15 22:03:46 +00002585 std::make_unique<CJS_DelayData>(prop, m_nFormControlIndex, m_FieldName);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002586 pNewData->rect = rect;
Tom Sepez75acda62018-01-29 20:17:36 +00002587 m_pJSDoc->AddDelayData(std::move(pNewData));
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07002588}
2589
Dan Sinclairf7435522018-02-05 22:27:22 +00002590void CJS_Field::AddDelay_WordArray(FIELD_PROP prop,
2591 const std::vector<uint32_t>& array) {
Tom Sepez75acda62018-01-29 20:17:36 +00002592 auto pNewData =
Tom Sepez31d722d2020-05-15 22:03:46 +00002593 std::make_unique<CJS_DelayData>(prop, m_nFormControlIndex, m_FieldName);
tsepez41a53ad2016-03-28 16:59:30 -07002594 pNewData->wordarray = array;
Tom Sepez75acda62018-01-29 20:17:36 +00002595 m_pJSDoc->AddDelayData(std::move(pNewData));
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07002596}
2597
Dan Sinclairf7435522018-02-05 22:27:22 +00002598void CJS_Field::AddDelay_WideStringArray(FIELD_PROP prop,
2599 const std::vector<WideString>& array) {
Tom Sepez75acda62018-01-29 20:17:36 +00002600 auto pNewData =
Tom Sepez31d722d2020-05-15 22:03:46 +00002601 std::make_unique<CJS_DelayData>(prop, m_nFormControlIndex, m_FieldName);
tsepez41a53ad2016-03-28 16:59:30 -07002602 pNewData->widestringarray = array;
Tom Sepez75acda62018-01-29 20:17:36 +00002603 m_pJSDoc->AddDelayData(std::move(pNewData));
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07002604}
2605
Dan Sinclairf7435522018-02-05 22:27:22 +00002606void CJS_Field::DoDelay(CPDFSDK_FormFillEnvironment* pFormFillEnv,
2607 CJS_DelayData* pData) {
Tom Sepez08b23fc2021-01-27 22:23:27 +00002608 DCHECK(pFormFillEnv);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002609 switch (pData->eProp) {
Tom Sepez2f2ffec2015-07-23 14:42:09 -07002610 case FP_BORDERSTYLE:
Lei Zhang94919f72018-07-12 21:16:30 +00002611 SetBorderStyle(pFormFillEnv, pData->sFieldName, pData->nControlIndex,
Lei Zhang109aa6d2018-09-20 01:21:05 +00002612 pData->bytestring);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002613 break;
Tom Sepez2f2ffec2015-07-23 14:42:09 -07002614 case FP_CURRENTVALUEINDICES:
Lei Zhang94919f72018-07-12 21:16:30 +00002615 SetCurrentValueIndices(pFormFillEnv, pData->sFieldName,
2616 pData->nControlIndex, pData->wordarray);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002617 break;
Tom Sepez2f2ffec2015-07-23 14:42:09 -07002618 case FP_DISPLAY:
Lei Zhang94919f72018-07-12 21:16:30 +00002619 SetDisplay(pFormFillEnv, pData->sFieldName, pData->nControlIndex,
2620 pData->num);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002621 break;
Tom Sepez2f2ffec2015-07-23 14:42:09 -07002622 case FP_HIDDEN:
Lei Zhang94919f72018-07-12 21:16:30 +00002623 SetHidden(pFormFillEnv, pData->sFieldName, pData->nControlIndex,
2624 pData->b);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002625 break;
Tom Sepez2f2ffec2015-07-23 14:42:09 -07002626 case FP_LINEWIDTH:
Lei Zhang94919f72018-07-12 21:16:30 +00002627 SetLineWidth(pFormFillEnv, pData->sFieldName, pData->nControlIndex,
2628 pData->num);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002629 break;
Tom Sepez2f2ffec2015-07-23 14:42:09 -07002630 case FP_RECT:
Lei Zhang94919f72018-07-12 21:16:30 +00002631 SetRect(pFormFillEnv, pData->sFieldName, pData->nControlIndex,
2632 pData->rect);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002633 break;
Tom Sepez2f2ffec2015-07-23 14:42:09 -07002634 case FP_VALUE:
Lei Zhange158a002019-03-29 17:16:03 +00002635 SetFieldValue(pFormFillEnv, pData->sFieldName, pData->nControlIndex,
2636 pData->widestringarray);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002637 break;
2638 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07002639}