blob: fe762ffb3d12dfee311b60898c4799c2623d2155 [file] [log] [blame]
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001// Copyright 2014 PDFium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
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"
Lei Zhangbc75f622018-10-15 18:12:40 +000016#include "core/fpdfdoc/cpdf_formcontrol.h"
Dan Sinclair51230322017-10-30 15:36:02 +000017#include "core/fpdfdoc/cpdf_formfield.h"
Lei Zhangc3450652018-10-11 16:54:42 +000018#include "core/fpdfdoc/cpdf_interactiveform.h"
Tom Sepez8e94c182019-06-11 23:57:25 +000019#include "fpdfsdk/cpdfsdk_helpers.h"
Lei Zhangc3450652018-10-11 16:54:42 +000020#include "fpdfsdk/cpdfsdk_interactiveform.h"
dsinclair114e46a2016-09-29 17:18:21 -070021#include "fpdfsdk/cpdfsdk_pageview.h"
22#include "fpdfsdk/cpdfsdk_widget.h"
Dan Sinclaire0345a42017-10-30 20:20:42 +000023#include "fxjs/cjs_color.h"
24#include "fxjs/cjs_delaydata.h"
25#include "fxjs/cjs_document.h"
26#include "fxjs/cjs_icon.h"
27#include "fxjs/js_resources.h"
Lei Zhang30632072020-10-02 01:57:54 +000028#include "third_party/base/notreached.h"
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070029
tonikitoo7c05a7a2016-08-17 11:08:46 -070030namespace {
31
Lei Zhang94919f72018-07-12 21:16:30 +000032bool IsCheckBoxOrRadioButton(const CPDF_FormField* pFormField) {
33 return pFormField->GetFieldType() == FormFieldType::kCheckBox ||
34 pFormField->GetFieldType() == FormFieldType::kRadioButton;
35}
36
37bool IsComboBoxOrListBox(const CPDF_FormField* pFormField) {
38 return pFormField->GetFieldType() == FormFieldType::kComboBox ||
39 pFormField->GetFieldType() == FormFieldType::kListBox;
40}
41
42bool IsComboBoxOrTextField(const CPDF_FormField* pFormField) {
43 return pFormField->GetFieldType() == FormFieldType::kComboBox ||
44 pFormField->GetFieldType() == FormFieldType::kTextField;
45}
46
47void UpdateFormField(CPDFSDK_FormFillEnvironment* pFormFillEnv,
48 CPDF_FormField* pFormField,
49 bool bChangeMark,
50 bool bResetAP,
51 bool bRefresh) {
Lei Zhang073ecf42018-10-11 16:56:00 +000052 CPDFSDK_InteractiveForm* pForm = pFormFillEnv->GetInteractiveForm();
Lei Zhang94919f72018-07-12 21:16:30 +000053
54 if (bResetAP) {
Tom Sepezd8ae8f82019-06-12 17:58:33 +000055 std::vector<ObservedPtr<CPDFSDK_Annot>> widgets;
Lei Zhang073ecf42018-10-11 16:56:00 +000056 pForm->GetWidgets(pFormField, &widgets);
Lei Zhang94919f72018-07-12 21:16:30 +000057
58 if (IsComboBoxOrTextField(pFormField)) {
59 for (auto& pObserved : widgets) {
60 if (pObserved) {
Lei Zhang4f261ff2018-10-10 18:44:45 +000061 Optional<WideString> sValue =
62 ToCPDFSDKWidget(pObserved.Get())->OnFormat();
Lei Zhang94919f72018-07-12 21:16:30 +000063 if (pObserved) { // Not redundant, may be clobbered by OnFormat.
Lei Zhang4f261ff2018-10-10 18:44:45 +000064 ToCPDFSDKWidget(pObserved.Get())->ResetAppearance(sValue, false);
Lei Zhang94919f72018-07-12 21:16:30 +000065 }
66 }
67 }
68 } else {
69 for (auto& pObserved : widgets) {
Tom Sepez4ef943b2018-07-26 19:06:06 +000070 if (pObserved)
Lei Zhang4f261ff2018-10-10 18:44:45 +000071 ToCPDFSDKWidget(pObserved.Get())->ResetAppearance({}, false);
Lei Zhang94919f72018-07-12 21:16:30 +000072 }
73 }
74 }
75
76 if (bRefresh) {
77 // Refresh the widget list. The calls in |bResetAP| may have caused widgets
78 // to be removed from the list. We need to call |GetWidgets| again to be
79 // sure none of the widgets have been deleted.
Tom Sepezd8ae8f82019-06-12 17:58:33 +000080 std::vector<ObservedPtr<CPDFSDK_Annot>> widgets;
Lei Zhang073ecf42018-10-11 16:56:00 +000081 pForm->GetWidgets(pFormField, &widgets);
Lei Zhang94919f72018-07-12 21:16:30 +000082
83 // TODO(dsinclair): Determine if all widgets share the same
Lei Zhang073ecf42018-10-11 16:56:00 +000084 // CPDFSDK_InteractiveForm. If that's the case, we can move the code to
Lei Zhang94919f72018-07-12 21:16:30 +000085 // |GetFormFillEnv| out of the loop.
86 for (auto& pObserved : widgets) {
87 if (pObserved) {
Tom Sepez4ef943b2018-07-26 19:06:06 +000088 CPDFSDK_Widget* pWidget = ToCPDFSDKWidget(pObserved.Get());
Lei Zhang073ecf42018-10-11 16:56:00 +000089 pWidget->GetInteractiveForm()->GetFormFillEnv()->UpdateAllViews(
90 nullptr, pWidget);
Lei Zhang94919f72018-07-12 21:16:30 +000091 }
92 }
93 }
94
95 if (bChangeMark)
96 pFormFillEnv->SetChangeMark();
97}
98
99void UpdateFormControl(CPDFSDK_FormFillEnvironment* pFormFillEnv,
100 CPDF_FormControl* pFormControl,
101 bool bChangeMark,
102 bool bResetAP,
103 bool bRefresh) {
104 ASSERT(pFormControl);
105
Lei Zhang073ecf42018-10-11 16:56:00 +0000106 CPDFSDK_InteractiveForm* pForm = pFormFillEnv->GetInteractiveForm();
Lei Zhang94919f72018-07-12 21:16:30 +0000107 CPDFSDK_Widget* pWidget = pForm->GetWidget(pFormControl);
108
109 if (pWidget) {
Tom Sepezd8ae8f82019-06-12 17:58:33 +0000110 ObservedPtr<CPDFSDK_Widget> observed_widget(pWidget);
Lei Zhang94919f72018-07-12 21:16:30 +0000111 if (bResetAP) {
112 FormFieldType fieldType = pWidget->GetFieldType();
113 if (fieldType == FormFieldType::kComboBox ||
114 fieldType == FormFieldType::kTextField) {
Lei Zhang4f261ff2018-10-10 18:44:45 +0000115 Optional<WideString> sValue = pWidget->OnFormat();
Lei Zhang94919f72018-07-12 21:16:30 +0000116 if (!observed_widget)
117 return;
Lei Zhang4f261ff2018-10-10 18:44:45 +0000118 pWidget->ResetAppearance(sValue, false);
Lei Zhang94919f72018-07-12 21:16:30 +0000119 } else {
Lei Zhang4f261ff2018-10-10 18:44:45 +0000120 pWidget->ResetAppearance({}, false);
Lei Zhang94919f72018-07-12 21:16:30 +0000121 }
122 if (!observed_widget)
123 return;
124 }
125
126 if (bRefresh) {
Lei Zhang073ecf42018-10-11 16:56:00 +0000127 CPDFSDK_InteractiveForm* pWidgetForm = pWidget->GetInteractiveForm();
128 pWidgetForm->GetFormFillEnv()->UpdateAllViews(nullptr, pWidget);
Lei Zhang94919f72018-07-12 21:16:30 +0000129 }
130 }
131
132 if (bChangeMark)
133 pFormFillEnv->SetChangeMark();
134}
135
Lei Zhang4bd03e82019-12-11 19:08:41 +0000136// note: iControlNo = -1, means not a widget.
137void ParseFieldName(const WideString& strFieldNameParsed,
138 WideString& strFieldName,
139 int& iControlNo) {
140 auto reverse_it = strFieldNameParsed.rbegin();
141 while (reverse_it != strFieldNameParsed.rend()) {
142 if (*reverse_it == L'.')
143 break;
144 ++reverse_it;
145 }
146 if (reverse_it == strFieldNameParsed.rend()) {
147 strFieldName = strFieldNameParsed;
148 iControlNo = -1;
149 return;
150 }
151 WideString suffixal =
Daniel Hosseiniana9a704e2020-01-28 19:52:32 +0000152 strFieldNameParsed.Last(reverse_it - strFieldNameParsed.rbegin());
Lei Zhang4bd03e82019-12-11 19:08:41 +0000153 iControlNo = FXSYS_wtoi(suffixal.c_str());
154 if (iControlNo == 0) {
155 suffixal.TrimRight(L' ');
156 if (suffixal != L"0") {
157 strFieldName = strFieldNameParsed;
158 iControlNo = -1;
159 return;
160 }
161 }
162 strFieldName =
Daniel Hosseiniana9a704e2020-01-28 19:52:32 +0000163 strFieldNameParsed.First(strFieldNameParsed.rend() - reverse_it - 1);
Lei Zhang4bd03e82019-12-11 19:08:41 +0000164}
165
Lei Zhang94919f72018-07-12 21:16:30 +0000166std::vector<CPDF_FormField*> GetFormFieldsForName(
167 CPDFSDK_FormFillEnvironment* pFormFillEnv,
168 const WideString& csFieldName) {
169 std::vector<CPDF_FormField*> fields;
Lei Zhang073ecf42018-10-11 16:56:00 +0000170 CPDFSDK_InteractiveForm* pReaderForm = pFormFillEnv->GetInteractiveForm();
171 CPDF_InteractiveForm* pForm = pReaderForm->GetInteractiveForm();
172 for (int i = 0, sz = pForm->CountFields(csFieldName); i < sz; ++i) {
173 if (CPDF_FormField* pFormField = pForm->GetField(i, csFieldName))
Lei Zhang94919f72018-07-12 21:16:30 +0000174 fields.push_back(pFormField);
175 }
176 return fields;
177}
178
tonikitoo7c05a7a2016-08-17 11:08:46 -0700179bool SetWidgetDisplayStatus(CPDFSDK_Widget* pWidget, int value) {
180 if (!pWidget)
181 return false;
182
183 uint32_t dwFlag = pWidget->GetFlags();
184 switch (value) {
185 case 0:
Lei Zhang85549b42019-02-02 00:40:19 +0000186 dwFlag &= ~pdfium::annotation_flags::kInvisible;
187 dwFlag &= ~pdfium::annotation_flags::kHidden;
188 dwFlag &= ~pdfium::annotation_flags::kNoView;
189 dwFlag |= pdfium::annotation_flags::kPrint;
tonikitoo7c05a7a2016-08-17 11:08:46 -0700190 break;
191 case 1:
Lei Zhang85549b42019-02-02 00:40:19 +0000192 dwFlag &= ~pdfium::annotation_flags::kInvisible;
193 dwFlag &= ~pdfium::annotation_flags::kNoView;
194 dwFlag |= (pdfium::annotation_flags::kHidden |
195 pdfium::annotation_flags::kPrint);
tonikitoo7c05a7a2016-08-17 11:08:46 -0700196 break;
197 case 2:
Lei Zhang85549b42019-02-02 00:40:19 +0000198 dwFlag &= ~pdfium::annotation_flags::kInvisible;
199 dwFlag &= ~pdfium::annotation_flags::kPrint;
200 dwFlag &= ~pdfium::annotation_flags::kHidden;
201 dwFlag &= ~pdfium::annotation_flags::kNoView;
tonikitoo7c05a7a2016-08-17 11:08:46 -0700202 break;
203 case 3:
Lei Zhang85549b42019-02-02 00:40:19 +0000204 dwFlag |= pdfium::annotation_flags::kNoView;
205 dwFlag |= pdfium::annotation_flags::kPrint;
206 dwFlag &= ~pdfium::annotation_flags::kHidden;
tonikitoo7c05a7a2016-08-17 11:08:46 -0700207 break;
208 }
209
210 if (dwFlag != pWidget->GetFlags()) {
211 pWidget->SetFlags(dwFlag);
212 return true;
213 }
214
215 return false;
216}
217
Lei Zhang94919f72018-07-12 21:16:30 +0000218void SetBorderStyle(CPDFSDK_FormFillEnvironment* pFormFillEnv,
219 const WideString& swFieldName,
220 int nControlIndex,
221 const ByteString& string) {
222 ASSERT(pFormFillEnv);
223
Lei Zhang99f44ba2020-06-18 17:41:38 +0000224 BorderStyle nBorderStyle = BorderStyle::kSolid;
Lei Zhang94919f72018-07-12 21:16:30 +0000225 if (string == "solid")
Lei Zhang99f44ba2020-06-18 17:41:38 +0000226 nBorderStyle = BorderStyle::kSolid;
Lei Zhang94919f72018-07-12 21:16:30 +0000227 else if (string == "beveled")
Lei Zhang99f44ba2020-06-18 17:41:38 +0000228 nBorderStyle = BorderStyle::kBeveled;
Lei Zhang94919f72018-07-12 21:16:30 +0000229 else if (string == "dashed")
Lei Zhang99f44ba2020-06-18 17:41:38 +0000230 nBorderStyle = BorderStyle::kDash;
Lei Zhang94919f72018-07-12 21:16:30 +0000231 else if (string == "inset")
Lei Zhang99f44ba2020-06-18 17:41:38 +0000232 nBorderStyle = BorderStyle::kInset;
Lei Zhang94919f72018-07-12 21:16:30 +0000233 else if (string == "underline")
Lei Zhang99f44ba2020-06-18 17:41:38 +0000234 nBorderStyle = BorderStyle::kUnderline;
Lei Zhang94919f72018-07-12 21:16:30 +0000235 else
236 return;
237
238 std::vector<CPDF_FormField*> FieldArray =
239 GetFormFieldsForName(pFormFillEnv, swFieldName);
Lei Zhang073ecf42018-10-11 16:56:00 +0000240 auto* pForm = pFormFillEnv->GetInteractiveForm();
Lei Zhang94919f72018-07-12 21:16:30 +0000241 for (CPDF_FormField* pFormField : FieldArray) {
242 if (nControlIndex < 0) {
243 bool bSet = false;
244 for (int i = 0, sz = pFormField->CountControls(); i < sz; ++i) {
Lei Zhang073ecf42018-10-11 16:56:00 +0000245 CPDFSDK_Widget* pWidget = pForm->GetWidget(pFormField->GetControl(i));
Lei Zhang7db136a2018-10-10 21:34:17 +0000246 if (pWidget) {
Lei Zhang94919f72018-07-12 21:16:30 +0000247 if (pWidget->GetBorderStyle() != nBorderStyle) {
248 pWidget->SetBorderStyle(nBorderStyle);
249 bSet = true;
250 }
251 }
252 }
253 if (bSet)
254 UpdateFormField(pFormFillEnv, pFormField, true, true, true);
255 } else {
256 if (nControlIndex >= pFormField->CountControls())
257 return;
258 if (CPDF_FormControl* pFormControl =
259 pFormField->GetControl(nControlIndex)) {
Lei Zhang073ecf42018-10-11 16:56:00 +0000260 CPDFSDK_Widget* pWidget = pForm->GetWidget(pFormControl);
Lei Zhang7db136a2018-10-10 21:34:17 +0000261 if (pWidget) {
Lei Zhang94919f72018-07-12 21:16:30 +0000262 if (pWidget->GetBorderStyle() != nBorderStyle) {
263 pWidget->SetBorderStyle(nBorderStyle);
264 UpdateFormControl(pFormFillEnv, pFormControl, true, true, true);
265 }
266 }
267 }
268 }
269 }
Lei Zhangdfa2ac22018-07-12 19:06:50 +0000270}
271
Lei Zhang94919f72018-07-12 21:16:30 +0000272void SetCurrentValueIndices(CPDFSDK_FormFillEnvironment* pFormFillEnv,
273 const WideString& swFieldName,
274 int nControlIndex,
275 const std::vector<uint32_t>& array) {
276 ASSERT(pFormFillEnv);
277 std::vector<CPDF_FormField*> FieldArray =
278 GetFormFieldsForName(pFormFillEnv, swFieldName);
279
280 for (CPDF_FormField* pFormField : FieldArray) {
281 if (!IsComboBoxOrListBox(pFormField))
282 continue;
283
284 uint32_t dwFieldFlags = pFormField->GetFieldFlags();
Tom Sepezb2e6b4c2018-08-16 20:53:58 +0000285 pFormField->ClearSelection(NotificationOption::kNotify);
Lei Zhang94919f72018-07-12 21:16:30 +0000286 for (size_t i = 0; i < array.size(); ++i) {
Lei Zhanga676aca2019-02-02 00:41:09 +0000287 if (i != 0 && !(dwFieldFlags & pdfium::form_flags::kChoiceMultiSelect))
Lei Zhang94919f72018-07-12 21:16:30 +0000288 break;
289 if (array[i] < static_cast<uint32_t>(pFormField->CountOptions()) &&
290 !pFormField->IsItemSelected(array[i])) {
Tom Sepezb2e6b4c2018-08-16 20:53:58 +0000291 pFormField->SetItemSelection(array[i], true,
292 NotificationOption::kDoNotNotify);
Lei Zhang94919f72018-07-12 21:16:30 +0000293 }
294 }
295 UpdateFormField(pFormFillEnv, pFormField, true, true, true);
296 }
Lei Zhang83f2d702018-07-12 19:07:40 +0000297}
298
Lei Zhang94919f72018-07-12 21:16:30 +0000299void SetDisplay(CPDFSDK_FormFillEnvironment* pFormFillEnv,
300 const WideString& swFieldName,
301 int nControlIndex,
302 int number) {
Lei Zhang073ecf42018-10-11 16:56:00 +0000303 CPDFSDK_InteractiveForm* pForm = pFormFillEnv->GetInteractiveForm();
Lei Zhang94919f72018-07-12 21:16:30 +0000304 std::vector<CPDF_FormField*> FieldArray =
305 GetFormFieldsForName(pFormFillEnv, swFieldName);
306 for (CPDF_FormField* pFormField : FieldArray) {
307 if (nControlIndex < 0) {
308 bool bAnySet = false;
309 for (int i = 0, sz = pFormField->CountControls(); i < sz; ++i) {
310 CPDF_FormControl* pFormControl = pFormField->GetControl(i);
311 ASSERT(pFormControl);
312
Lei Zhang073ecf42018-10-11 16:56:00 +0000313 CPDFSDK_Widget* pWidget = pForm->GetWidget(pFormControl);
Lei Zhang94919f72018-07-12 21:16:30 +0000314 if (SetWidgetDisplayStatus(pWidget, number))
315 bAnySet = true;
316 }
317
318 if (bAnySet)
319 UpdateFormField(pFormFillEnv, pFormField, true, false, true);
320 } else {
321 if (nControlIndex >= pFormField->CountControls())
322 return;
323
324 CPDF_FormControl* pFormControl = pFormField->GetControl(nControlIndex);
325 if (!pFormControl)
326 return;
327
Lei Zhang073ecf42018-10-11 16:56:00 +0000328 CPDFSDK_Widget* pWidget = pForm->GetWidget(pFormControl);
Lei Zhang94919f72018-07-12 21:16:30 +0000329 if (SetWidgetDisplayStatus(pWidget, number))
330 UpdateFormControl(pFormFillEnv, pFormControl, true, false, true);
331 }
332 }
333}
334
335void SetHidden(CPDFSDK_FormFillEnvironment* pFormFillEnv,
336 const WideString& swFieldName,
337 int nControlIndex,
338 bool b) {
339 int display = b ? 1 /*Hidden*/ : 0 /*Visible*/;
340 SetDisplay(pFormFillEnv, swFieldName, nControlIndex, display);
341}
342
343void SetLineWidth(CPDFSDK_FormFillEnvironment* pFormFillEnv,
344 const WideString& swFieldName,
345 int nControlIndex,
346 int number) {
Lei Zhang073ecf42018-10-11 16:56:00 +0000347 CPDFSDK_InteractiveForm* pForm = pFormFillEnv->GetInteractiveForm();
Lei Zhang94919f72018-07-12 21:16:30 +0000348 std::vector<CPDF_FormField*> FieldArray =
349 GetFormFieldsForName(pFormFillEnv, swFieldName);
350 for (CPDF_FormField* pFormField : FieldArray) {
351 if (nControlIndex < 0) {
352 bool bSet = false;
353 for (int i = 0, sz = pFormField->CountControls(); i < sz; ++i) {
354 CPDF_FormControl* pFormControl = pFormField->GetControl(i);
355 ASSERT(pFormControl);
356
Lei Zhang073ecf42018-10-11 16:56:00 +0000357 if (CPDFSDK_Widget* pWidget = pForm->GetWidget(pFormControl)) {
Lei Zhang94919f72018-07-12 21:16:30 +0000358 if (number != pWidget->GetBorderWidth()) {
359 pWidget->SetBorderWidth(number);
360 bSet = true;
361 }
362 }
363 }
364 if (bSet)
365 UpdateFormField(pFormFillEnv, pFormField, true, true, true);
366 } else {
367 if (nControlIndex >= pFormField->CountControls())
368 return;
369 if (CPDF_FormControl* pFormControl =
370 pFormField->GetControl(nControlIndex)) {
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 UpdateFormControl(pFormFillEnv, pFormControl, true, true, true);
375 }
376 }
377 }
378 }
379 }
380}
381
382void SetRect(CPDFSDK_FormFillEnvironment* pFormFillEnv,
383 const WideString& swFieldName,
384 int nControlIndex,
385 const CFX_FloatRect& rect) {
Lei Zhang073ecf42018-10-11 16:56:00 +0000386 CPDFSDK_InteractiveForm* pForm = pFormFillEnv->GetInteractiveForm();
Lei Zhang94919f72018-07-12 21:16:30 +0000387 std::vector<CPDF_FormField*> FieldArray =
388 GetFormFieldsForName(pFormFillEnv, swFieldName);
389 for (CPDF_FormField* pFormField : FieldArray) {
390 if (nControlIndex < 0) {
391 bool bSet = false;
392 for (int i = 0, sz = pFormField->CountControls(); i < sz; ++i) {
393 CPDF_FormControl* pFormControl = pFormField->GetControl(i);
394 ASSERT(pFormControl);
395
Lei Zhang073ecf42018-10-11 16:56:00 +0000396 if (CPDFSDK_Widget* pWidget = pForm->GetWidget(pFormControl)) {
Lei Zhang94919f72018-07-12 21:16:30 +0000397 CFX_FloatRect crRect = rect;
398
399 CPDF_Page* pPDFPage = pWidget->GetPDFPage();
400 crRect.Intersect(pPDFPage->GetBBox());
401
402 if (!crRect.IsEmpty()) {
403 CFX_FloatRect rcOld = pWidget->GetRect();
404 if (crRect.left != rcOld.left || crRect.right != rcOld.right ||
405 crRect.top != rcOld.top || crRect.bottom != rcOld.bottom) {
406 pWidget->SetRect(crRect);
407 bSet = true;
408 }
409 }
410 }
411 }
412
413 if (bSet)
414 UpdateFormField(pFormFillEnv, pFormField, true, true, true);
415
416 continue;
417 }
418
419 if (nControlIndex >= pFormField->CountControls())
420 return;
421 if (CPDF_FormControl* pFormControl =
422 pFormField->GetControl(nControlIndex)) {
Lei Zhang073ecf42018-10-11 16:56:00 +0000423 if (CPDFSDK_Widget* pWidget = pForm->GetWidget(pFormControl)) {
Lei Zhang94919f72018-07-12 21:16:30 +0000424 CFX_FloatRect crRect = rect;
425 CPDF_Page* pPDFPage = pWidget->GetPDFPage();
426 crRect.Intersect(pPDFPage->GetBBox());
427 if (!crRect.IsEmpty()) {
428 CFX_FloatRect rcOld = pWidget->GetRect();
429 if (crRect.left != rcOld.left || crRect.right != rcOld.right ||
430 crRect.top != rcOld.top || crRect.bottom != rcOld.bottom) {
431 pWidget->SetRect(crRect);
432 UpdateFormControl(pFormFillEnv, pFormControl, true, true, true);
433 }
434 }
435 }
436 }
437 }
438}
439
Lei Zhange158a002019-03-29 17:16:03 +0000440void SetFieldValue(CPDFSDK_FormFillEnvironment* pFormFillEnv,
441 const WideString& swFieldName,
442 int nControlIndex,
443 const std::vector<WideString>& strArray) {
Lei Zhang94919f72018-07-12 21:16:30 +0000444 ASSERT(pFormFillEnv);
445 if (strArray.empty())
446 return;
447
448 std::vector<CPDF_FormField*> FieldArray =
449 GetFormFieldsForName(pFormFillEnv, swFieldName);
450
451 for (CPDF_FormField* pFormField : FieldArray) {
452 if (pFormField->GetFullName().Compare(swFieldName) != 0)
453 continue;
454
455 switch (pFormField->GetFieldType()) {
456 case FormFieldType::kTextField:
457 case FormFieldType::kComboBox:
458 if (pFormField->GetValue() != strArray[0]) {
Tom Sepezb2e6b4c2018-08-16 20:53:58 +0000459 pFormField->SetValue(strArray[0], NotificationOption::kNotify);
Lei Zhang94919f72018-07-12 21:16:30 +0000460 UpdateFormField(pFormFillEnv, pFormField, true, false, true);
461 }
462 break;
463 case FormFieldType::kCheckBox:
464 case FormFieldType::kRadioButton:
465 if (pFormField->GetValue() != strArray[0]) {
Tom Sepezb2e6b4c2018-08-16 20:53:58 +0000466 pFormField->SetValue(strArray[0], NotificationOption::kNotify);
Lei Zhang94919f72018-07-12 21:16:30 +0000467 UpdateFormField(pFormFillEnv, pFormField, true, false, true);
468 }
469 break;
470 case FormFieldType::kListBox: {
471 bool bModified = false;
472 for (const auto& str : strArray) {
473 if (!pFormField->IsItemSelected(pFormField->FindOption(str))) {
474 bModified = true;
475 break;
476 }
477 }
478 if (bModified) {
Tom Sepezb2e6b4c2018-08-16 20:53:58 +0000479 pFormField->ClearSelection(NotificationOption::kNotify);
Lei Zhang94919f72018-07-12 21:16:30 +0000480 for (const auto& str : strArray) {
481 int index = pFormField->FindOption(str);
482 if (!pFormField->IsItemSelected(index))
Tom Sepezb2e6b4c2018-08-16 20:53:58 +0000483 pFormField->SetItemSelection(index, true,
484 NotificationOption::kNotify);
Lei Zhang94919f72018-07-12 21:16:30 +0000485 }
486 UpdateFormField(pFormFillEnv, pFormField, true, false, true);
487 }
488 break;
489 }
490 default:
491 break;
492 }
493 }
Lei Zhang83f2d702018-07-12 19:07:40 +0000494}
495
tonikitoo7c05a7a2016-08-17 11:08:46 -0700496} // namespace
497
Dan Sinclairc94a7932017-10-26 16:48:57 -0400498const JSPropertySpec CJS_Field::PropertySpecs[] = {
Tom Sepez4d5b8c52017-02-21 15:17:07 -0800499 {"alignment", get_alignment_static, set_alignment_static},
dan sinclaircbe23db2017-10-19 14:29:33 -0400500 {"borderStyle", get_border_style_static, set_border_style_static},
501 {"buttonAlignX", get_button_align_x_static, set_button_align_x_static},
502 {"buttonAlignY", get_button_align_y_static, set_button_align_y_static},
503 {"buttonFitBounds", get_button_fit_bounds_static,
504 set_button_fit_bounds_static},
505 {"buttonPosition", get_button_position_static, set_button_position_static},
506 {"buttonScaleHow", get_button_scale_how_static,
507 set_button_scale_how_static},
508 {"buttonScaleWhen", get_button_scale_when_static,
509 set_button_scale_when_static},
510 {"calcOrderIndex", get_calc_order_index_static,
511 set_calc_order_index_static},
512 {"charLimit", get_char_limit_static, set_char_limit_static},
Tom Sepez4d5b8c52017-02-21 15:17:07 -0800513 {"comb", get_comb_static, set_comb_static},
dan sinclaircbe23db2017-10-19 14:29:33 -0400514 {"commitOnSelChange", get_commit_on_sel_change_static,
515 set_commit_on_sel_change_static},
516 {"currentValueIndices", get_current_value_indices_static,
517 set_current_value_indices_static},
518 {"defaultStyle", get_default_style_static, set_default_style_static},
519 {"defaultValue", get_default_value_static, set_default_value_static},
520 {"doNotScroll", get_do_not_scroll_static, set_do_not_scroll_static},
521 {"doNotSpellCheck", get_do_not_spell_check_static,
522 set_do_not_spell_check_static},
Tom Sepez4d5b8c52017-02-21 15:17:07 -0800523 {"delay", get_delay_static, set_delay_static},
524 {"display", get_display_static, set_display_static},
525 {"doc", get_doc_static, set_doc_static},
526 {"editable", get_editable_static, set_editable_static},
dan sinclaircbe23db2017-10-19 14:29:33 -0400527 {"exportValues", get_export_values_static, set_export_values_static},
Tom Sepez4d5b8c52017-02-21 15:17:07 -0800528 {"hidden", get_hidden_static, set_hidden_static},
dan sinclaircbe23db2017-10-19 14:29:33 -0400529 {"fileSelect", get_file_select_static, set_file_select_static},
530 {"fillColor", get_fill_color_static, set_fill_color_static},
531 {"lineWidth", get_line_width_static, set_line_width_static},
Tom Sepez4d5b8c52017-02-21 15:17:07 -0800532 {"highlight", get_highlight_static, set_highlight_static},
533 {"multiline", get_multiline_static, set_multiline_static},
dan sinclaircbe23db2017-10-19 14:29:33 -0400534 {"multipleSelection", get_multiple_selection_static,
535 set_multiple_selection_static},
Tom Sepez4d5b8c52017-02-21 15:17:07 -0800536 {"name", get_name_static, set_name_static},
dan sinclaircbe23db2017-10-19 14:29:33 -0400537 {"numItems", get_num_items_static, set_num_items_static},
Tom Sepez4d5b8c52017-02-21 15:17:07 -0800538 {"page", get_page_static, set_page_static},
539 {"password", get_password_static, set_password_static},
540 {"print", get_print_static, set_print_static},
dan sinclaircbe23db2017-10-19 14:29:33 -0400541 {"radiosInUnison", get_radios_in_unison_static,
542 set_radios_in_unison_static},
Tom Sepez4d5b8c52017-02-21 15:17:07 -0800543 {"readonly", get_readonly_static, set_readonly_static},
544 {"rect", get_rect_static, set_rect_static},
545 {"required", get_required_static, set_required_static},
dan sinclaircbe23db2017-10-19 14:29:33 -0400546 {"richText", get_rich_text_static, set_rich_text_static},
547 {"richValue", get_rich_value_static, set_rich_value_static},
Tom Sepez4d5b8c52017-02-21 15:17:07 -0800548 {"rotation", get_rotation_static, set_rotation_static},
Tom Sepezb14a2f22018-10-12 23:21:58 +0000549 {"source", get_source_static, set_source_static},
dan sinclaircbe23db2017-10-19 14:29:33 -0400550 {"strokeColor", get_stroke_color_static, set_stroke_color_static},
Tom Sepez4d5b8c52017-02-21 15:17:07 -0800551 {"style", get_style_static, set_style_static},
dan sinclaircbe23db2017-10-19 14:29:33 -0400552 {"submitName", get_submit_name_static, set_submit_name_static},
553 {"textColor", get_text_color_static, set_text_color_static},
554 {"textFont", get_text_font_static, set_text_font_static},
555 {"textSize", get_text_size_static, set_text_size_static},
Tom Sepez4d5b8c52017-02-21 15:17:07 -0800556 {"type", get_type_static, set_type_static},
dan sinclaircbe23db2017-10-19 14:29:33 -0400557 {"userName", get_user_name_static, set_user_name_static},
Tom Sepez4d5b8c52017-02-21 15:17:07 -0800558 {"value", get_value_static, set_value_static},
Tom Sepezb14a2f22018-10-12 23:21:58 +0000559 {"valueAsString", get_value_as_string_static, set_value_as_string_static}};
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700560
Dan Sinclairc94a7932017-10-26 16:48:57 -0400561const JSMethodSpec CJS_Field::MethodSpecs[] = {
Tom Sepez9b99b632017-02-21 15:05:57 -0800562 {"browseForFileToSubmit", browseForFileToSubmit_static},
563 {"buttonGetCaption", buttonGetCaption_static},
564 {"buttonGetIcon", buttonGetIcon_static},
565 {"buttonImportIcon", buttonImportIcon_static},
566 {"buttonSetCaption", buttonSetCaption_static},
567 {"buttonSetIcon", buttonSetIcon_static},
568 {"checkThisBox", checkThisBox_static},
569 {"clearItems", clearItems_static},
570 {"defaultIsChecked", defaultIsChecked_static},
571 {"deleteItemAt", deleteItemAt_static},
572 {"getArray", getArray_static},
573 {"getItemAt", getItemAt_static},
574 {"getLock", getLock_static},
575 {"insertItemAt", insertItemAt_static},
576 {"isBoxChecked", isBoxChecked_static},
577 {"isDefaultChecked", isDefaultChecked_static},
578 {"setAction", setAction_static},
579 {"setFocus", setFocus_static},
580 {"setItems", setItems_static},
581 {"setLock", setLock_static},
582 {"signatureGetModifications", signatureGetModifications_static},
583 {"signatureGetSeedValue", signatureGetSeedValue_static},
584 {"signatureInfo", signatureInfo_static},
585 {"signatureSetSeedValue", signatureSetSeedValue_static},
586 {"signatureSign", signatureSign_static},
Dan Sinclair909fa2d2017-12-12 01:53:28 +0000587 {"signatureValidate", signatureValidate_static}};
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700588
Tom Sepezb4958712020-10-13 20:30:43 +0000589uint32_t CJS_Field::ObjDefnID = 0;
Dan Sinclairf7435522018-02-05 22:27:22 +0000590const char CJS_Field::kName[] = "Field";
Dan Sinclair89d26c82017-10-26 12:21:28 -0400591
Dan Sinclairef299532017-10-26 16:48:30 -0400592// static
Tom Sepezb4958712020-10-13 20:30:43 +0000593uint32_t CJS_Field::GetObjDefnID() {
Dan Sinclairef299532017-10-26 16:48:30 -0400594 return ObjDefnID;
595}
596
597// static
Dan Sinclairbef4d3e2017-10-26 16:49:38 -0400598void CJS_Field::DefineJSObjects(CFXJS_Engine* pEngine) {
Dan Sinclairf7435522018-02-05 22:27:22 +0000599 ObjDefnID = pEngine->DefineObj(CJS_Field::kName, FXJSOBJTYPE_DYNAMIC,
Dan Sinclair998fee32018-02-05 21:43:19 +0000600 JSConstructor<CJS_Field>, JSDestructor);
Tom Sepez8b4ddeb2018-06-11 15:55:17 +0000601 DefineProps(pEngine, ObjDefnID, PropertySpecs);
602 DefineMethods(pEngine, ObjDefnID, MethodSpecs);
Dan Sinclair89d26c82017-10-26 12:21:28 -0400603}
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700604
Tom Sepez36aae4f2018-06-04 19:44:37 +0000605CJS_Field::CJS_Field(v8::Local<v8::Object> pObject, CJS_Runtime* pRuntime)
606 : CJS_Object(pObject, pRuntime) {}
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700607
Dan Sinclairf7435522018-02-05 22:27:22 +0000608CJS_Field::~CJS_Field() = default;
609
Dan Sinclairf7435522018-02-05 22:27:22 +0000610bool CJS_Field::AttachField(CJS_Document* pDocument,
611 const WideString& csFieldName) {
Tom Sepez2cbae732018-06-26 15:11:28 +0000612 m_pJSDoc.Reset(pDocument);
dsinclair82e17672016-10-11 12:38:01 -0700613 m_pFormFillEnv.Reset(pDocument->GetFormFillEnv());
Lei Zhang2468fcd2020-01-31 18:19:59 +0000614 m_bCanSet = m_pFormFillEnv->HasPermissions(
615 pdfium::access_permissions::kFillForm |
616 pdfium::access_permissions::kModifyAnnotation |
617 pdfium::access_permissions::kModifyContent);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700618
Lei Zhang073ecf42018-10-11 16:56:00 +0000619 CPDFSDK_InteractiveForm* pRDForm = m_pFormFillEnv->GetInteractiveForm();
620 CPDF_InteractiveForm* pForm = pRDForm->GetInteractiveForm();
Ryan Harrison275e2602017-09-18 14:23:18 -0400621 WideString swFieldNameTemp = csFieldName;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700622 swFieldNameTemp.Replace(L"..", L".");
623
Lei Zhang073ecf42018-10-11 16:56:00 +0000624 if (pForm->CountFields(swFieldNameTemp) <= 0) {
Lei Zhang2bf66612019-12-11 19:02:31 +0000625 WideString strFieldName;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700626 int iControlNo = -1;
Lei Zhang2bf66612019-12-11 19:02:31 +0000627 ParseFieldName(swFieldNameTemp, strFieldName, iControlNo);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700628 if (iControlNo == -1)
tsepez4cf55152016-11-02 14:37:54 -0700629 return false;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700630
Lei Zhang2bf66612019-12-11 19:02:31 +0000631 m_FieldName = strFieldName;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700632 m_nFormControlIndex = iControlNo;
tsepez4cf55152016-11-02 14:37:54 -0700633 return true;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700634 }
635
636 m_FieldName = swFieldNameTemp;
637 m_nFormControlIndex = -1;
638
tsepez4cf55152016-11-02 14:37:54 -0700639 return true;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700640}
641
Lei Zhang18915232018-07-12 20:53:40 +0000642std::vector<CPDF_FormField*> CJS_Field::GetFormFields() const {
Lei Zhang94919f72018-07-12 21:16:30 +0000643 return GetFormFieldsForName(m_pFormFillEnv.Get(), m_FieldName);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700644}
645
Lei Zhang4c7ad662018-07-12 20:29:40 +0000646CPDF_FormField* CJS_Field::GetFirstFormField() const {
Lei Zhang18915232018-07-12 20:53:40 +0000647 std::vector<CPDF_FormField*> fields = GetFormFields();
Lei Zhang4c7ad662018-07-12 20:29:40 +0000648 return fields.empty() ? nullptr : fields[0];
649}
650
Dan Sinclairf7435522018-02-05 22:27:22 +0000651CPDF_FormControl* CJS_Field::GetSmartFieldControl(CPDF_FormField* pFormField) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700652 if (!pFormField->CountControls() ||
653 m_nFormControlIndex >= pFormField->CountControls())
thestig1cd352e2016-06-07 17:53:06 -0700654 return nullptr;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700655 if (m_nFormControlIndex < 0)
656 return pFormField->GetControl(0);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700657 return pFormField->GetControl(m_nFormControlIndex);
658}
659
Tom Sepez3a6d0582018-08-17 19:28:52 +0000660CJS_Result CJS_Field::get_alignment(CJS_Runtime* pRuntime) {
dsinclair3a7741a2016-10-11 10:39:49 -0700661 ASSERT(m_pFormFillEnv);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700662
Lei Zhang4c7ad662018-07-12 20:29:40 +0000663 CPDF_FormField* pFormField = GetFirstFormField();
664 if (!pFormField)
Tom Sepez3a6d0582018-08-17 19:28:52 +0000665 return CJS_Result::Failure(JSMessage::kBadObjectError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700666
Ryan Harrison9baf31f2018-01-12 18:36:30 +0000667 if (pFormField->GetFieldType() != FormFieldType::kTextField)
Tom Sepez3a6d0582018-08-17 19:28:52 +0000668 return CJS_Result::Failure(JSMessage::kObjectTypeError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700669
dan sinclair646634b2017-10-19 14:30:28 -0400670 CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
671 if (!pFormControl)
Tom Sepez3a6d0582018-08-17 19:28:52 +0000672 return CJS_Result::Failure(JSMessage::kBadObjectError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700673
dan sinclair646634b2017-10-19 14:30:28 -0400674 switch (pFormControl->GetControlAlignment()) {
dan sinclair646634b2017-10-19 14:30:28 -0400675 case 0:
Tom Sepeza5ea7ff2018-10-30 19:24:36 +0000676 return CJS_Result::Success(pRuntime->NewString("left"));
Dan Sinclair8f524d62017-10-25 13:30:31 -0400677 case 1:
Tom Sepeza5ea7ff2018-10-30 19:24:36 +0000678 return CJS_Result::Success(pRuntime->NewString("center"));
dan sinclair646634b2017-10-19 14:30:28 -0400679 case 2:
Tom Sepeza5ea7ff2018-10-30 19:24:36 +0000680 return CJS_Result::Success(pRuntime->NewString("right"));
dan sinclair646634b2017-10-19 14:30:28 -0400681 }
Tom Sepeza5ea7ff2018-10-30 19:24:36 +0000682 return CJS_Result::Success(pRuntime->NewString(""));
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700683}
684
Tom Sepez3a6d0582018-08-17 19:28:52 +0000685CJS_Result CJS_Field::set_alignment(CJS_Runtime* pRuntime,
Dan Sinclairf7435522018-02-05 22:27:22 +0000686 v8::Local<v8::Value> vp) {
dan sinclaircbe23db2017-10-19 14:29:33 -0400687 ASSERT(m_pFormFillEnv);
Tom Sepez16999822018-06-08 18:23:05 +0000688 if (!m_bCanSet)
Tom Sepez3a6d0582018-08-17 19:28:52 +0000689 return CJS_Result::Failure(JSMessage::kReadOnlyError);
Tom Sepez20736f72018-08-17 16:44:50 +0000690
Tom Sepez3a6d0582018-08-17 19:28:52 +0000691 return CJS_Result::Success();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700692}
693
Tom Sepez3a6d0582018-08-17 19:28:52 +0000694CJS_Result CJS_Field::get_border_style(CJS_Runtime* pRuntime) {
dsinclair3a7741a2016-10-11 10:39:49 -0700695 ASSERT(m_pFormFillEnv);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700696
Lei Zhang4c7ad662018-07-12 20:29:40 +0000697 CPDF_FormField* pFormField = GetFirstFormField();
698 if (!pFormField)
Tom Sepez3a6d0582018-08-17 19:28:52 +0000699 return CJS_Result::Failure(JSMessage::kBadObjectError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700700
Lei Zhang073ecf42018-10-11 16:56:00 +0000701 CPDFSDK_Widget* pWidget = m_pFormFillEnv->GetInteractiveForm()->GetWidget(
Lei Zhang7db136a2018-10-10 21:34:17 +0000702 GetSmartFieldControl(pFormField));
dan sinclaircbe23db2017-10-19 14:29:33 -0400703 if (!pWidget)
Tom Sepez3a6d0582018-08-17 19:28:52 +0000704 return CJS_Result::Failure(JSMessage::kBadObjectError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700705
dan sinclaircbe23db2017-10-19 14:29:33 -0400706 switch (pWidget->GetBorderStyle()) {
Lei Zhang99f44ba2020-06-18 17:41:38 +0000707 case BorderStyle::kSolid:
Tom Sepeza5ea7ff2018-10-30 19:24:36 +0000708 return CJS_Result::Success(pRuntime->NewString("solid"));
Lei Zhang99f44ba2020-06-18 17:41:38 +0000709 case BorderStyle::kDash:
Tom Sepeza5ea7ff2018-10-30 19:24:36 +0000710 return CJS_Result::Success(pRuntime->NewString("dashed"));
Lei Zhang99f44ba2020-06-18 17:41:38 +0000711 case BorderStyle::kBeveled:
Tom Sepeza5ea7ff2018-10-30 19:24:36 +0000712 return CJS_Result::Success(pRuntime->NewString("beveled"));
Lei Zhang99f44ba2020-06-18 17:41:38 +0000713 case BorderStyle::kInset:
Tom Sepeza5ea7ff2018-10-30 19:24:36 +0000714 return CJS_Result::Success(pRuntime->NewString("inset"));
Lei Zhang99f44ba2020-06-18 17:41:38 +0000715 case BorderStyle::kUnderline:
Tom Sepeza5ea7ff2018-10-30 19:24:36 +0000716 return CJS_Result::Success(pRuntime->NewString("underline"));
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700717 }
Tom Sepeza5ea7ff2018-10-30 19:24:36 +0000718 return CJS_Result::Success(pRuntime->NewString(""));
dan sinclaircbe23db2017-10-19 14:29:33 -0400719}
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700720
Tom Sepez3a6d0582018-08-17 19:28:52 +0000721CJS_Result CJS_Field::set_border_style(CJS_Runtime* pRuntime,
Dan Sinclairf7435522018-02-05 22:27:22 +0000722 v8::Local<v8::Value> vp) {
dan sinclaircbe23db2017-10-19 14:29:33 -0400723 ASSERT(m_pFormFillEnv);
dan sinclaircbe23db2017-10-19 14:29:33 -0400724 if (!m_bCanSet)
Tom Sepez3a6d0582018-08-17 19:28:52 +0000725 return CJS_Result::Failure(JSMessage::kReadOnlyError);
dan sinclaircbe23db2017-10-19 14:29:33 -0400726
Tom Sepez34dab072018-08-08 17:49:02 +0000727 ByteString byte_str = pRuntime->ToWideString(vp).ToDefANSI();
dan sinclaircbe23db2017-10-19 14:29:33 -0400728 if (m_bDelay) {
Dan Sinclair1b2a18e2017-10-24 13:56:29 -0400729 AddDelay_String(FP_BORDERSTYLE, byte_str);
dan sinclaircbe23db2017-10-19 14:29:33 -0400730 } else {
Lei Zhang94919f72018-07-12 21:16:30 +0000731 SetBorderStyle(m_pFormFillEnv.Get(), m_FieldName, m_nFormControlIndex,
732 byte_str);
dan sinclaircbe23db2017-10-19 14:29:33 -0400733 }
Tom Sepez3a6d0582018-08-17 19:28:52 +0000734 return CJS_Result::Success();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700735}
736
Tom Sepez3a6d0582018-08-17 19:28:52 +0000737CJS_Result CJS_Field::get_button_align_x(CJS_Runtime* pRuntime) {
dsinclair3a7741a2016-10-11 10:39:49 -0700738 ASSERT(m_pFormFillEnv);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700739
Lei Zhang4c7ad662018-07-12 20:29:40 +0000740 CPDF_FormField* pFormField = GetFirstFormField();
741 if (!pFormField)
Tom Sepez3a6d0582018-08-17 19:28:52 +0000742 return CJS_Result::Failure(JSMessage::kBadObjectError);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700743
Ryan Harrison9baf31f2018-01-12 18:36:30 +0000744 if (pFormField->GetFieldType() != FormFieldType::kPushButton)
Tom Sepez3a6d0582018-08-17 19:28:52 +0000745 return CJS_Result::Failure(JSMessage::kObjectTypeError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700746
dan sinclaircbe23db2017-10-19 14:29:33 -0400747 CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
748 if (!pFormControl)
Tom Sepez3a6d0582018-08-17 19:28:52 +0000749 return CJS_Result::Failure(JSMessage::kBadObjectError);
dan sinclaircbe23db2017-10-19 14:29:33 -0400750
751 CPDF_IconFit IconFit = pFormControl->GetIconFit();
Lei Zhang65b8db92018-10-10 17:50:31 +0000752 CFX_PointF pos = IconFit.GetIconBottomLeftPosition();
753 return CJS_Result::Success(pRuntime->NewNumber(static_cast<int32_t>(pos.x)));
dan sinclaircbe23db2017-10-19 14:29:33 -0400754}
755
Tom Sepez3a6d0582018-08-17 19:28:52 +0000756CJS_Result CJS_Field::set_button_align_x(CJS_Runtime* pRuntime,
Dan Sinclairf7435522018-02-05 22:27:22 +0000757 v8::Local<v8::Value> vp) {
dan sinclaircbe23db2017-10-19 14:29:33 -0400758 ASSERT(m_pFormFillEnv);
Tom Sepez16999822018-06-08 18:23:05 +0000759 if (!m_bCanSet)
Tom Sepez3a6d0582018-08-17 19:28:52 +0000760 return CJS_Result::Failure(JSMessage::kReadOnlyError);
761 return CJS_Result::Success();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700762}
763
Tom Sepez3a6d0582018-08-17 19:28:52 +0000764CJS_Result CJS_Field::get_button_align_y(CJS_Runtime* pRuntime) {
dsinclair3a7741a2016-10-11 10:39:49 -0700765 ASSERT(m_pFormFillEnv);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700766
Lei Zhang4c7ad662018-07-12 20:29:40 +0000767 CPDF_FormField* pFormField = GetFirstFormField();
768 if (!pFormField)
Tom Sepez3a6d0582018-08-17 19:28:52 +0000769 return CJS_Result::Failure(JSMessage::kBadObjectError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700770
Ryan Harrison9baf31f2018-01-12 18:36:30 +0000771 if (pFormField->GetFieldType() != FormFieldType::kPushButton)
Tom Sepez3a6d0582018-08-17 19:28:52 +0000772 return CJS_Result::Failure(JSMessage::kObjectTypeError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700773
dan sinclaircbe23db2017-10-19 14:29:33 -0400774 CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
775 if (!pFormControl)
Tom Sepez3a6d0582018-08-17 19:28:52 +0000776 return CJS_Result::Failure(JSMessage::kBadObjectError);
dan sinclaircbe23db2017-10-19 14:29:33 -0400777
778 CPDF_IconFit IconFit = pFormControl->GetIconFit();
Lei Zhang65b8db92018-10-10 17:50:31 +0000779 CFX_PointF pos = IconFit.GetIconBottomLeftPosition();
780 return CJS_Result::Success(pRuntime->NewNumber(static_cast<int32_t>(pos.y)));
dan sinclaircbe23db2017-10-19 14:29:33 -0400781}
782
Tom Sepez3a6d0582018-08-17 19:28:52 +0000783CJS_Result CJS_Field::set_button_align_y(CJS_Runtime* pRuntime,
Dan Sinclairf7435522018-02-05 22:27:22 +0000784 v8::Local<v8::Value> vp) {
dan sinclaircbe23db2017-10-19 14:29:33 -0400785 ASSERT(m_pFormFillEnv);
Tom Sepez16999822018-06-08 18:23:05 +0000786 if (!m_bCanSet)
Tom Sepez3a6d0582018-08-17 19:28:52 +0000787 return CJS_Result::Failure(JSMessage::kReadOnlyError);
788 return CJS_Result::Success();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700789}
790
Tom Sepez3a6d0582018-08-17 19:28:52 +0000791CJS_Result CJS_Field::get_button_fit_bounds(CJS_Runtime* pRuntime) {
dsinclair3a7741a2016-10-11 10:39:49 -0700792 ASSERT(m_pFormFillEnv);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700793
Lei Zhang4c7ad662018-07-12 20:29:40 +0000794 CPDF_FormField* pFormField = GetFirstFormField();
795 if (!pFormField)
Tom Sepez3a6d0582018-08-17 19:28:52 +0000796 return CJS_Result::Failure(JSMessage::kBadObjectError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700797
Ryan Harrison9baf31f2018-01-12 18:36:30 +0000798 if (pFormField->GetFieldType() != FormFieldType::kPushButton)
Tom Sepez3a6d0582018-08-17 19:28:52 +0000799 return CJS_Result::Failure(JSMessage::kObjectTypeError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700800
dan sinclair646634b2017-10-19 14:30:28 -0400801 CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
802 if (!pFormControl)
Tom Sepez3a6d0582018-08-17 19:28:52 +0000803 return CJS_Result::Failure(JSMessage::kBadObjectError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700804
Tom Sepez3a6d0582018-08-17 19:28:52 +0000805 return CJS_Result::Success(
Dan Sinclair8f524d62017-10-25 13:30:31 -0400806 pRuntime->NewBoolean(pFormControl->GetIconFit().GetFittingBounds()));
dan sinclaircbe23db2017-10-19 14:29:33 -0400807}
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700808
Tom Sepez3a6d0582018-08-17 19:28:52 +0000809CJS_Result CJS_Field::set_button_fit_bounds(CJS_Runtime* pRuntime,
Dan Sinclairf7435522018-02-05 22:27:22 +0000810 v8::Local<v8::Value> vp) {
dan sinclaircbe23db2017-10-19 14:29:33 -0400811 ASSERT(m_pFormFillEnv);
Tom Sepez16999822018-06-08 18:23:05 +0000812 if (!m_bCanSet)
Tom Sepez3a6d0582018-08-17 19:28:52 +0000813 return CJS_Result::Failure(JSMessage::kReadOnlyError);
814 return CJS_Result::Success();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700815}
816
Tom Sepez3a6d0582018-08-17 19:28:52 +0000817CJS_Result CJS_Field::get_button_position(CJS_Runtime* pRuntime) {
dsinclair3a7741a2016-10-11 10:39:49 -0700818 ASSERT(m_pFormFillEnv);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700819
Lei Zhang4c7ad662018-07-12 20:29:40 +0000820 CPDF_FormField* pFormField = GetFirstFormField();
821 if (!pFormField)
Tom Sepez3a6d0582018-08-17 19:28:52 +0000822 return CJS_Result::Failure(JSMessage::kBadObjectError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700823
Ryan Harrison9baf31f2018-01-12 18:36:30 +0000824 if (pFormField->GetFieldType() != FormFieldType::kPushButton)
Tom Sepez3a6d0582018-08-17 19:28:52 +0000825 return CJS_Result::Failure(JSMessage::kObjectTypeError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700826
dan sinclair646634b2017-10-19 14:30:28 -0400827 CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
828 if (!pFormControl)
Tom Sepez3a6d0582018-08-17 19:28:52 +0000829 return CJS_Result::Failure(JSMessage::kBadObjectError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700830
Tom Sepez3a6d0582018-08-17 19:28:52 +0000831 return CJS_Result::Success(
Tom Sepez20736f72018-08-17 16:44:50 +0000832 pRuntime->NewNumber(pFormControl->GetTextPosition()));
dan sinclaircbe23db2017-10-19 14:29:33 -0400833}
834
Tom Sepez3a6d0582018-08-17 19:28:52 +0000835CJS_Result CJS_Field::set_button_position(CJS_Runtime* pRuntime,
Dan Sinclairf7435522018-02-05 22:27:22 +0000836 v8::Local<v8::Value> vp) {
dan sinclaircbe23db2017-10-19 14:29:33 -0400837 ASSERT(m_pFormFillEnv);
Tom Sepez16999822018-06-08 18:23:05 +0000838 if (!m_bCanSet)
Tom Sepez3a6d0582018-08-17 19:28:52 +0000839 return CJS_Result::Failure(JSMessage::kBadObjectError);
840 return CJS_Result::Success();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700841}
842
Tom Sepez3a6d0582018-08-17 19:28:52 +0000843CJS_Result CJS_Field::get_button_scale_how(CJS_Runtime* pRuntime) {
dsinclair3a7741a2016-10-11 10:39:49 -0700844 ASSERT(m_pFormFillEnv);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700845
Lei Zhang4c7ad662018-07-12 20:29:40 +0000846 CPDF_FormField* pFormField = GetFirstFormField();
847 if (!pFormField)
Tom Sepez3a6d0582018-08-17 19:28:52 +0000848 return CJS_Result::Failure(JSMessage::kBadObjectError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700849
Ryan Harrison9baf31f2018-01-12 18:36:30 +0000850 if (pFormField->GetFieldType() != FormFieldType::kPushButton)
Tom Sepez3a6d0582018-08-17 19:28:52 +0000851 return CJS_Result::Failure(JSMessage::kObjectTypeError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700852
dan sinclair646634b2017-10-19 14:30:28 -0400853 CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
854 if (!pFormControl)
Tom Sepez3a6d0582018-08-17 19:28:52 +0000855 return CJS_Result::Failure(JSMessage::kBadObjectError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700856
Tom Sepez3a6d0582018-08-17 19:28:52 +0000857 return CJS_Result::Success(pRuntime->NewBoolean(
Dan Sinclaire4974922017-10-24 09:36:16 -0400858 pFormControl->GetIconFit().IsProportionalScale() ? 0 : 1));
dan sinclaircbe23db2017-10-19 14:29:33 -0400859}
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700860
Tom Sepez3a6d0582018-08-17 19:28:52 +0000861CJS_Result CJS_Field::set_button_scale_how(CJS_Runtime* pRuntime,
Dan Sinclairf7435522018-02-05 22:27:22 +0000862 v8::Local<v8::Value> vp) {
dan sinclaircbe23db2017-10-19 14:29:33 -0400863 ASSERT(m_pFormFillEnv);
Tom Sepez16999822018-06-08 18:23:05 +0000864 if (!m_bCanSet)
Tom Sepez3a6d0582018-08-17 19:28:52 +0000865 return CJS_Result::Failure(JSMessage::kReadOnlyError);
866 return CJS_Result::Success();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700867}
868
Tom Sepez3a6d0582018-08-17 19:28:52 +0000869CJS_Result CJS_Field::get_button_scale_when(CJS_Runtime* pRuntime) {
dsinclair3a7741a2016-10-11 10:39:49 -0700870 ASSERT(m_pFormFillEnv);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700871
Lei Zhang4c7ad662018-07-12 20:29:40 +0000872 CPDF_FormField* pFormField = GetFirstFormField();
873 if (!pFormField)
Tom Sepez3a6d0582018-08-17 19:28:52 +0000874 return CJS_Result::Failure(JSMessage::kBadObjectError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700875
Ryan Harrison9baf31f2018-01-12 18:36:30 +0000876 if (pFormField->GetFieldType() != FormFieldType::kPushButton)
Tom Sepez3a6d0582018-08-17 19:28:52 +0000877 return CJS_Result::Failure(JSMessage::kObjectTypeError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700878
dan sinclair646634b2017-10-19 14:30:28 -0400879 CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
880 if (!pFormControl)
Tom Sepez3a6d0582018-08-17 19:28:52 +0000881 return CJS_Result::Failure(JSMessage::kBadObjectError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700882
dan sinclair646634b2017-10-19 14:30:28 -0400883 CPDF_IconFit IconFit = pFormControl->GetIconFit();
Lei Zhang55ae76d2020-06-23 01:12:41 +0000884 CPDF_IconFit::ScaleMethod scale_method = IconFit.GetScaleMethod();
885 switch (scale_method) {
886 case CPDF_IconFit::ScaleMethod::kAlways:
887 case CPDF_IconFit::ScaleMethod::kBigger:
888 case CPDF_IconFit::ScaleMethod::kNever:
889 case CPDF_IconFit::ScaleMethod::kSmaller:
Tom Sepez3a6d0582018-08-17 19:28:52 +0000890 return CJS_Result::Success(
Lei Zhang55ae76d2020-06-23 01:12:41 +0000891 pRuntime->NewNumber(static_cast<int>(scale_method)));
dan sinclair646634b2017-10-19 14:30:28 -0400892 }
Lei Zhang55ae76d2020-06-23 01:12:41 +0000893
894 // Note this is deliberately not the default case for the switch statement
895 // above, so missing cases trigger compile time errors.
896 NOTREACHED();
Tom Sepez3a6d0582018-08-17 19:28:52 +0000897 return CJS_Result::Success();
dan sinclaircbe23db2017-10-19 14:29:33 -0400898}
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700899
Tom Sepez3a6d0582018-08-17 19:28:52 +0000900CJS_Result CJS_Field::set_button_scale_when(CJS_Runtime* pRuntime,
Dan Sinclairf7435522018-02-05 22:27:22 +0000901 v8::Local<v8::Value> vp) {
dan sinclaircbe23db2017-10-19 14:29:33 -0400902 ASSERT(m_pFormFillEnv);
Tom Sepez16999822018-06-08 18:23:05 +0000903 if (!m_bCanSet)
Tom Sepez3a6d0582018-08-17 19:28:52 +0000904 return CJS_Result::Failure(JSMessage::kReadOnlyError);
905 return CJS_Result::Success();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700906}
907
Tom Sepez3a6d0582018-08-17 19:28:52 +0000908CJS_Result CJS_Field::get_calc_order_index(CJS_Runtime* pRuntime) {
dsinclair3a7741a2016-10-11 10:39:49 -0700909 ASSERT(m_pFormFillEnv);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700910
Lei Zhang4c7ad662018-07-12 20:29:40 +0000911 CPDF_FormField* pFormField = GetFirstFormField();
912 if (!pFormField)
Tom Sepez3a6d0582018-08-17 19:28:52 +0000913 return CJS_Result::Failure(JSMessage::kBadObjectError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700914
Lei Zhang83f2d702018-07-12 19:07:40 +0000915 if (!IsComboBoxOrTextField(pFormField))
Tom Sepez3a6d0582018-08-17 19:28:52 +0000916 return CJS_Result::Failure(JSMessage::kObjectTypeError);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700917
Lei Zhang073ecf42018-10-11 16:56:00 +0000918 CPDFSDK_InteractiveForm* pRDForm = m_pFormFillEnv->GetInteractiveForm();
919 CPDF_InteractiveForm* pForm = pRDForm->GetInteractiveForm();
920 return CJS_Result::Success(pRuntime->NewNumber(
921 static_cast<int32_t>(pForm->FindFieldInCalculationOrder(pFormField))));
dan sinclaircbe23db2017-10-19 14:29:33 -0400922}
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700923
Tom Sepez3a6d0582018-08-17 19:28:52 +0000924CJS_Result CJS_Field::set_calc_order_index(CJS_Runtime* pRuntime,
Dan Sinclairf7435522018-02-05 22:27:22 +0000925 v8::Local<v8::Value> vp) {
dan sinclaircbe23db2017-10-19 14:29:33 -0400926 ASSERT(m_pFormFillEnv);
Tom Sepez16999822018-06-08 18:23:05 +0000927 if (!m_bCanSet)
Tom Sepez3a6d0582018-08-17 19:28:52 +0000928 return CJS_Result::Failure(JSMessage::kReadOnlyError);
929 return CJS_Result::Success();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700930}
931
Tom Sepez3a6d0582018-08-17 19:28:52 +0000932CJS_Result CJS_Field::get_char_limit(CJS_Runtime* pRuntime) {
dsinclair3a7741a2016-10-11 10:39:49 -0700933 ASSERT(m_pFormFillEnv);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700934
Lei Zhang4c7ad662018-07-12 20:29:40 +0000935 CPDF_FormField* pFormField = GetFirstFormField();
936 if (!pFormField)
Tom Sepez3a6d0582018-08-17 19:28:52 +0000937 return CJS_Result::Failure(JSMessage::kBadObjectError);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700938
Ryan Harrison9baf31f2018-01-12 18:36:30 +0000939 if (pFormField->GetFieldType() != FormFieldType::kTextField)
Tom Sepez3a6d0582018-08-17 19:28:52 +0000940 return CJS_Result::Failure(JSMessage::kObjectTypeError);
941 return CJS_Result::Success(
Dan Sinclair8f524d62017-10-25 13:30:31 -0400942 pRuntime->NewNumber(static_cast<int32_t>(pFormField->GetMaxLen())));
dan sinclaircbe23db2017-10-19 14:29:33 -0400943}
944
Tom Sepez3a6d0582018-08-17 19:28:52 +0000945CJS_Result CJS_Field::set_char_limit(CJS_Runtime* pRuntime,
Dan Sinclairf7435522018-02-05 22:27:22 +0000946 v8::Local<v8::Value> vp) {
dan sinclaircbe23db2017-10-19 14:29:33 -0400947 ASSERT(m_pFormFillEnv);
Tom Sepez16999822018-06-08 18:23:05 +0000948 if (!m_bCanSet)
Tom Sepez3a6d0582018-08-17 19:28:52 +0000949 return CJS_Result::Failure(JSMessage::kReadOnlyError);
950 return CJS_Result::Success();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700951}
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700952
Tom Sepez3a6d0582018-08-17 19:28:52 +0000953CJS_Result CJS_Field::get_comb(CJS_Runtime* pRuntime) {
dsinclair3a7741a2016-10-11 10:39:49 -0700954 ASSERT(m_pFormFillEnv);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700955
Lei Zhang4c7ad662018-07-12 20:29:40 +0000956 CPDF_FormField* pFormField = GetFirstFormField();
957 if (!pFormField)
Tom Sepez3a6d0582018-08-17 19:28:52 +0000958 return CJS_Result::Failure(JSMessage::kBadObjectError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700959
Ryan Harrison9baf31f2018-01-12 18:36:30 +0000960 if (pFormField->GetFieldType() != FormFieldType::kTextField)
Tom Sepez3a6d0582018-08-17 19:28:52 +0000961 return CJS_Result::Failure(JSMessage::kObjectTypeError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700962
Lei Zhanga676aca2019-02-02 00:41:09 +0000963 return CJS_Result::Success(pRuntime->NewBoolean(
964 !!(pFormField->GetFieldFlags() & pdfium::form_flags::kTextComb)));
dan sinclaircbe23db2017-10-19 14:29:33 -0400965}
966
Tom Sepez3a6d0582018-08-17 19:28:52 +0000967CJS_Result CJS_Field::set_comb(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp) {
dan sinclaircbe23db2017-10-19 14:29:33 -0400968 ASSERT(m_pFormFillEnv);
Tom Sepez16999822018-06-08 18:23:05 +0000969 if (!m_bCanSet)
Tom Sepez3a6d0582018-08-17 19:28:52 +0000970 return CJS_Result::Failure(JSMessage::kReadOnlyError);
971 return CJS_Result::Success();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700972}
973
Tom Sepez3a6d0582018-08-17 19:28:52 +0000974CJS_Result CJS_Field::get_commit_on_sel_change(CJS_Runtime* pRuntime) {
dsinclair3a7741a2016-10-11 10:39:49 -0700975 ASSERT(m_pFormFillEnv);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700976
Lei Zhang4c7ad662018-07-12 20:29:40 +0000977 CPDF_FormField* pFormField = GetFirstFormField();
978 if (!pFormField)
Tom Sepez3a6d0582018-08-17 19:28:52 +0000979 return CJS_Result::Failure(JSMessage::kBadObjectError);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700980
Lei Zhang83f2d702018-07-12 19:07:40 +0000981 if (!IsComboBoxOrListBox(pFormField))
Tom Sepez3a6d0582018-08-17 19:28:52 +0000982 return CJS_Result::Failure(JSMessage::kObjectTypeError);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700983
Lei Zhanga676aca2019-02-02 00:41:09 +0000984 uint32_t dwFieldFlags = pFormField->GetFieldFlags();
Tom Sepez3a6d0582018-08-17 19:28:52 +0000985 return CJS_Result::Success(pRuntime->NewBoolean(
Lei Zhanga676aca2019-02-02 00:41:09 +0000986 !!(dwFieldFlags & pdfium::form_flags::kChoiceCommitOnSelChange)));
dan sinclaircbe23db2017-10-19 14:29:33 -0400987}
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700988
Tom Sepez3a6d0582018-08-17 19:28:52 +0000989CJS_Result CJS_Field::set_commit_on_sel_change(CJS_Runtime* pRuntime,
Dan Sinclairf7435522018-02-05 22:27:22 +0000990 v8::Local<v8::Value> vp) {
dan sinclaircbe23db2017-10-19 14:29:33 -0400991 ASSERT(m_pFormFillEnv);
Tom Sepez16999822018-06-08 18:23:05 +0000992 if (!m_bCanSet)
Tom Sepez3a6d0582018-08-17 19:28:52 +0000993 return CJS_Result::Failure(JSMessage::kReadOnlyError);
994 return CJS_Result::Success();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700995}
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700996
Tom Sepez3a6d0582018-08-17 19:28:52 +0000997CJS_Result CJS_Field::get_current_value_indices(CJS_Runtime* pRuntime) {
Lei Zhang4c7ad662018-07-12 20:29:40 +0000998 CPDF_FormField* pFormField = GetFirstFormField();
999 if (!pFormField)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001000 return CJS_Result::Failure(JSMessage::kBadObjectError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001001
Lei Zhang83f2d702018-07-12 19:07:40 +00001002 if (!IsComboBoxOrListBox(pFormField))
Tom Sepez3a6d0582018-08-17 19:28:52 +00001003 return CJS_Result::Failure(JSMessage::kObjectTypeError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001004
dan sinclaircbe23db2017-10-19 14:29:33 -04001005 int count = pFormField->CountSelectedItems();
Dan Sinclair8f524d62017-10-25 13:30:31 -04001006 if (count <= 0)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001007 return CJS_Result::Success(pRuntime->NewNumber(-1));
Dan Sinclair8f524d62017-10-25 13:30:31 -04001008 if (count == 1)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001009 return CJS_Result::Success(
Tom Sepez20736f72018-08-17 16:44:50 +00001010 pRuntime->NewNumber(pFormField->GetSelectedIndex(0)));
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001011
Dan Sinclair3a1ba8e2017-10-26 09:28:59 -04001012 v8::Local<v8::Array> SelArray = pRuntime->NewArray();
1013 for (int i = 0; i < count; i++) {
1014 pRuntime->PutArrayElement(
1015 SelArray, i, pRuntime->NewNumber(pFormField->GetSelectedIndex(i)));
dan sinclaircbe23db2017-10-19 14:29:33 -04001016 }
Dan Sinclair3a1ba8e2017-10-26 09:28:59 -04001017 if (SelArray.IsEmpty())
Tom Sepez3a6d0582018-08-17 19:28:52 +00001018 return CJS_Result::Success(pRuntime->NewArray());
1019 return CJS_Result::Success(SelArray);
dan sinclaircbe23db2017-10-19 14:29:33 -04001020}
1021
Tom Sepez3a6d0582018-08-17 19:28:52 +00001022CJS_Result CJS_Field::set_current_value_indices(CJS_Runtime* pRuntime,
Dan Sinclairf7435522018-02-05 22:27:22 +00001023 v8::Local<v8::Value> vp) {
dan sinclaircbe23db2017-10-19 14:29:33 -04001024 if (!m_bCanSet)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001025 return CJS_Result::Failure(JSMessage::kReadOnlyError);
dan sinclaircbe23db2017-10-19 14:29:33 -04001026
1027 std::vector<uint32_t> array;
dan sinclair80435cb2017-10-24 21:40:24 -04001028 if (vp->IsNumber()) {
1029 array.push_back(pRuntime->ToInt32(vp));
1030 } else if (!vp.IsEmpty() && vp->IsArray()) {
Dan Sinclair3a1ba8e2017-10-26 09:28:59 -04001031 v8::Local<v8::Array> SelArray = pRuntime->ToArray(vp);
1032 for (size_t i = 0; i < pRuntime->GetArrayLength(SelArray); i++) {
1033 array.push_back(
1034 pRuntime->ToInt32(pRuntime->GetArrayElement(SelArray, i)));
1035 }
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001036 }
1037
dan sinclaircbe23db2017-10-19 14:29:33 -04001038 if (m_bDelay) {
1039 AddDelay_WordArray(FP_CURRENTVALUEINDICES, array);
1040 } else {
Lei Zhang94919f72018-07-12 21:16:30 +00001041 SetCurrentValueIndices(m_pFormFillEnv.Get(), m_FieldName,
1042 m_nFormControlIndex, array);
dan sinclaircbe23db2017-10-19 14:29:33 -04001043 }
Tom Sepez3a6d0582018-08-17 19:28:52 +00001044 return CJS_Result::Success();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001045}
1046
Tom Sepez3a6d0582018-08-17 19:28:52 +00001047CJS_Result CJS_Field::get_default_style(CJS_Runtime* pRuntime) {
1048 return CJS_Result::Failure(JSMessage::kNotSupportedError);
dan sinclaircbe23db2017-10-19 14:29:33 -04001049}
1050
Tom Sepez3a6d0582018-08-17 19:28:52 +00001051CJS_Result CJS_Field::set_default_style(CJS_Runtime* pRuntime,
Dan Sinclairf7435522018-02-05 22:27:22 +00001052 v8::Local<v8::Value> vp) {
Tom Sepez3a6d0582018-08-17 19:28:52 +00001053 return CJS_Result::Failure(JSMessage::kNotSupportedError);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001054}
1055
Tom Sepez3a6d0582018-08-17 19:28:52 +00001056CJS_Result CJS_Field::get_default_value(CJS_Runtime* pRuntime) {
dsinclair3a7741a2016-10-11 10:39:49 -07001057 ASSERT(m_pFormFillEnv);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001058
Lei Zhang4c7ad662018-07-12 20:29:40 +00001059 CPDF_FormField* pFormField = GetFirstFormField();
1060 if (!pFormField)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001061 return CJS_Result::Failure(JSMessage::kBadObjectError);
Dan Sinclair8f524d62017-10-25 13:30:31 -04001062
Ryan Harrison9baf31f2018-01-12 18:36:30 +00001063 if (pFormField->GetFieldType() == FormFieldType::kPushButton ||
1064 pFormField->GetFieldType() == FormFieldType::kSignature) {
Tom Sepez3a6d0582018-08-17 19:28:52 +00001065 return CJS_Result::Failure(JSMessage::kObjectTypeError);
Dan Sinclair8f524d62017-10-25 13:30:31 -04001066 }
1067
Tom Sepez3a6d0582018-08-17 19:28:52 +00001068 return CJS_Result::Success(
Tom Sepezb6b01cb2018-06-20 16:10:13 +00001069 pRuntime->NewString(pFormField->GetDefaultValue().AsStringView()));
Dan Sinclair8f524d62017-10-25 13:30:31 -04001070}
1071
Tom Sepez3a6d0582018-08-17 19:28:52 +00001072CJS_Result CJS_Field::set_default_value(CJS_Runtime* pRuntime,
Dan Sinclairf7435522018-02-05 22:27:22 +00001073 v8::Local<v8::Value> vp) {
Dan Sinclair8f524d62017-10-25 13:30:31 -04001074 ASSERT(m_pFormFillEnv);
Tom Sepez16999822018-06-08 18:23:05 +00001075 if (!m_bCanSet)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001076 return CJS_Result::Failure(JSMessage::kReadOnlyError);
1077 return CJS_Result::Success();
Dan Sinclair8f524d62017-10-25 13:30:31 -04001078}
1079
Tom Sepez3a6d0582018-08-17 19:28:52 +00001080CJS_Result CJS_Field::get_do_not_scroll(CJS_Runtime* pRuntime) {
Dan Sinclair8f524d62017-10-25 13:30:31 -04001081 ASSERT(m_pFormFillEnv);
1082
Lei Zhang4c7ad662018-07-12 20:29:40 +00001083 CPDF_FormField* pFormField = GetFirstFormField();
1084 if (!pFormField)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001085 return CJS_Result::Failure(JSMessage::kBadObjectError);
dan sinclaircbe23db2017-10-19 14:29:33 -04001086
Ryan Harrison9baf31f2018-01-12 18:36:30 +00001087 if (pFormField->GetFieldType() != FormFieldType::kTextField)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001088 return CJS_Result::Failure(JSMessage::kObjectTypeError);
dan sinclaircbe23db2017-10-19 14:29:33 -04001089
Tom Sepez3a6d0582018-08-17 19:28:52 +00001090 return CJS_Result::Success(pRuntime->NewBoolean(
Lei Zhanga676aca2019-02-02 00:41:09 +00001091 !!(pFormField->GetFieldFlags() & pdfium::form_flags::kTextDoNotScroll)));
dan sinclaircbe23db2017-10-19 14:29:33 -04001092}
1093
Tom Sepez3a6d0582018-08-17 19:28:52 +00001094CJS_Result CJS_Field::set_do_not_scroll(CJS_Runtime* pRuntime,
Dan Sinclairf7435522018-02-05 22:27:22 +00001095 v8::Local<v8::Value> vp) {
dan sinclaircbe23db2017-10-19 14:29:33 -04001096 ASSERT(m_pFormFillEnv);
Tom Sepez16999822018-06-08 18:23:05 +00001097 if (!m_bCanSet)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001098 return CJS_Result::Failure(JSMessage::kReadOnlyError);
1099 return CJS_Result::Success();
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001100}
1101
Tom Sepez3a6d0582018-08-17 19:28:52 +00001102CJS_Result CJS_Field::get_do_not_spell_check(CJS_Runtime* pRuntime) {
dsinclair3a7741a2016-10-11 10:39:49 -07001103 ASSERT(m_pFormFillEnv);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001104
Lei Zhang4c7ad662018-07-12 20:29:40 +00001105 CPDF_FormField* pFormField = GetFirstFormField();
1106 if (!pFormField)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001107 return CJS_Result::Failure(JSMessage::kBadObjectError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001108
Lei Zhang83f2d702018-07-12 19:07:40 +00001109 if (!IsComboBoxOrTextField(pFormField))
Tom Sepez3a6d0582018-08-17 19:28:52 +00001110 return CJS_Result::Failure(JSMessage::kObjectTypeError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001111
Lei Zhanga676aca2019-02-02 00:41:09 +00001112 uint32_t dwFieldFlags = pFormField->GetFieldFlags();
Tom Sepez3a6d0582018-08-17 19:28:52 +00001113 return CJS_Result::Success(pRuntime->NewBoolean(
Lei Zhanga676aca2019-02-02 00:41:09 +00001114 !!(dwFieldFlags & pdfium::form_flags::kTextDoNotSpellCheck)));
dan sinclaircbe23db2017-10-19 14:29:33 -04001115}
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001116
Tom Sepez3a6d0582018-08-17 19:28:52 +00001117CJS_Result CJS_Field::set_do_not_spell_check(CJS_Runtime* pRuntime,
Dan Sinclairf7435522018-02-05 22:27:22 +00001118 v8::Local<v8::Value> vp) {
dan sinclaircbe23db2017-10-19 14:29:33 -04001119 ASSERT(m_pFormFillEnv);
Tom Sepez16999822018-06-08 18:23:05 +00001120 if (!m_bCanSet)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001121 return CJS_Result::Failure(JSMessage::kReadOnlyError);
1122 return CJS_Result::Success();
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001123}
1124
Dan Sinclairf7435522018-02-05 22:27:22 +00001125void CJS_Field::SetDelay(bool bDelay) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001126 m_bDelay = bDelay;
1127
dan sinclaircbe23db2017-10-19 14:29:33 -04001128 if (m_bDelay)
1129 return;
dan sinclaircbe23db2017-10-19 14:29:33 -04001130 if (m_pJSDoc)
1131 m_pJSDoc->DoFieldDelay(m_FieldName, m_nFormControlIndex);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001132}
1133
Tom Sepez3a6d0582018-08-17 19:28:52 +00001134CJS_Result CJS_Field::get_delay(CJS_Runtime* pRuntime) {
1135 return CJS_Result::Success(pRuntime->NewBoolean(m_bDelay));
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001136}
1137
Tom Sepez3a6d0582018-08-17 19:28:52 +00001138CJS_Result CJS_Field::set_delay(CJS_Runtime* pRuntime,
Dan Sinclairf7435522018-02-05 22:27:22 +00001139 v8::Local<v8::Value> vp) {
dan sinclaircbe23db2017-10-19 14:29:33 -04001140 if (!m_bCanSet)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001141 return CJS_Result::Failure(JSMessage::kReadOnlyError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001142
dan sinclair80435cb2017-10-24 21:40:24 -04001143 SetDelay(pRuntime->ToBoolean(vp));
Tom Sepez3a6d0582018-08-17 19:28:52 +00001144 return CJS_Result::Success();
dan sinclaircbe23db2017-10-19 14:29:33 -04001145}
1146
Tom Sepez3a6d0582018-08-17 19:28:52 +00001147CJS_Result CJS_Field::get_display(CJS_Runtime* pRuntime) {
Lei Zhang4c7ad662018-07-12 20:29:40 +00001148 CPDF_FormField* pFormField = GetFirstFormField();
1149 if (!pFormField)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001150 return CJS_Result::Failure(JSMessage::kBadObjectError);
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001151
Lei Zhang073ecf42018-10-11 16:56:00 +00001152 CPDFSDK_InteractiveForm* pForm = m_pFormFillEnv->GetInteractiveForm();
1153 CPDFSDK_Widget* pWidget = pForm->GetWidget(GetSmartFieldControl(pFormField));
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001154 if (!pWidget)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001155 return CJS_Result::Failure(JSMessage::kBadObjectError);
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001156
1157 uint32_t dwFlag = pWidget->GetFlags();
Lei Zhang85549b42019-02-02 00:40:19 +00001158 if (pdfium::annotation_flags::kInvisible & dwFlag ||
1159 pdfium::annotation_flags::kHidden & dwFlag) {
Tom Sepez3a6d0582018-08-17 19:28:52 +00001160 return CJS_Result::Success(pRuntime->NewNumber(1));
Lei Zhang85549b42019-02-02 00:40:19 +00001161 }
Dan Sinclair8f524d62017-10-25 13:30:31 -04001162
Lei Zhang85549b42019-02-02 00:40:19 +00001163 if (pdfium::annotation_flags::kPrint & dwFlag) {
1164 if (pdfium::annotation_flags::kNoView & dwFlag)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001165 return CJS_Result::Success(pRuntime->NewNumber(3));
1166 return CJS_Result::Success(pRuntime->NewNumber(0));
dan sinclaircbe23db2017-10-19 14:29:33 -04001167 }
Tom Sepez3a6d0582018-08-17 19:28:52 +00001168 return CJS_Result::Success(pRuntime->NewNumber(2));
dan sinclaircbe23db2017-10-19 14:29:33 -04001169}
1170
Tom Sepez3a6d0582018-08-17 19:28:52 +00001171CJS_Result CJS_Field::set_display(CJS_Runtime* pRuntime,
Dan Sinclairf7435522018-02-05 22:27:22 +00001172 v8::Local<v8::Value> vp) {
dan sinclaircbe23db2017-10-19 14:29:33 -04001173 if (!m_bCanSet)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001174 return CJS_Result::Failure(JSMessage::kReadOnlyError);
dan sinclaircbe23db2017-10-19 14:29:33 -04001175
1176 if (m_bDelay) {
dan sinclair80435cb2017-10-24 21:40:24 -04001177 AddDelay_Int(FP_DISPLAY, pRuntime->ToInt32(vp));
dan sinclaircbe23db2017-10-19 14:29:33 -04001178 } else {
Lei Zhang94919f72018-07-12 21:16:30 +00001179 SetDisplay(m_pFormFillEnv.Get(), m_FieldName, m_nFormControlIndex,
1180 pRuntime->ToInt32(vp));
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001181 }
Tom Sepez3a6d0582018-08-17 19:28:52 +00001182 return CJS_Result::Success();
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001183}
1184
Tom Sepez3a6d0582018-08-17 19:28:52 +00001185CJS_Result CJS_Field::get_doc(CJS_Runtime* pRuntime) {
1186 return CJS_Result::Success(m_pJSDoc->ToV8Object());
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001187}
1188
Tom Sepez3a6d0582018-08-17 19:28:52 +00001189CJS_Result CJS_Field::set_doc(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp) {
1190 return CJS_Result::Failure(JSMessage::kNotSupportedError);
dan sinclaircbe23db2017-10-19 14:29:33 -04001191}
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001192
Tom Sepez3a6d0582018-08-17 19:28:52 +00001193CJS_Result CJS_Field::get_editable(CJS_Runtime* pRuntime) {
Lei Zhang4c7ad662018-07-12 20:29:40 +00001194 CPDF_FormField* pFormField = GetFirstFormField();
1195 if (!pFormField)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001196 return CJS_Result::Failure(JSMessage::kBadObjectError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001197
Ryan Harrison9baf31f2018-01-12 18:36:30 +00001198 if (pFormField->GetFieldType() != FormFieldType::kComboBox)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001199 return CJS_Result::Failure(JSMessage::kObjectTypeError);
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001200
Lei Zhanga676aca2019-02-02 00:41:09 +00001201 return CJS_Result::Success(pRuntime->NewBoolean(
1202 !!(pFormField->GetFieldFlags() & pdfium::form_flags::kChoiceEdit)));
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001203}
1204
Tom Sepez3a6d0582018-08-17 19:28:52 +00001205CJS_Result CJS_Field::set_editable(CJS_Runtime* pRuntime,
Dan Sinclairf7435522018-02-05 22:27:22 +00001206 v8::Local<v8::Value> vp) {
Tom Sepez16999822018-06-08 18:23:05 +00001207 if (!m_bCanSet)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001208 return CJS_Result::Failure(JSMessage::kReadOnlyError);
1209 return CJS_Result::Success();
dan sinclaircbe23db2017-10-19 14:29:33 -04001210}
1211
Tom Sepez3a6d0582018-08-17 19:28:52 +00001212CJS_Result CJS_Field::get_export_values(CJS_Runtime* pRuntime) {
Lei Zhang4c7ad662018-07-12 20:29:40 +00001213 CPDF_FormField* pFormField = GetFirstFormField();
1214 if (!pFormField)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001215 return CJS_Result::Failure(JSMessage::kBadObjectError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001216
Lei Zhangdfa2ac22018-07-12 19:06:50 +00001217 if (!IsCheckBoxOrRadioButton(pFormField))
Tom Sepez3a6d0582018-08-17 19:28:52 +00001218 return CJS_Result::Failure(JSMessage::kObjectTypeError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001219
Dan Sinclair3a1ba8e2017-10-26 09:28:59 -04001220 v8::Local<v8::Array> ExportValuesArray = pRuntime->NewArray();
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001221 if (m_nFormControlIndex < 0) {
1222 for (int i = 0, sz = pFormField->CountControls(); i < sz; i++) {
1223 CPDF_FormControl* pFormControl = pFormField->GetControl(i);
Dan Sinclair3a1ba8e2017-10-26 09:28:59 -04001224 pRuntime->PutArrayElement(
1225 ExportValuesArray, i,
Tom Sepezb6b01cb2018-06-20 16:10:13 +00001226 pRuntime->NewString(pFormControl->GetExportValue().AsStringView()));
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001227 }
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001228 } else {
1229 if (m_nFormControlIndex >= pFormField->CountControls())
Tom Sepez3a6d0582018-08-17 19:28:52 +00001230 return CJS_Result::Failure(JSMessage::kValueError);
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001231
1232 CPDF_FormControl* pFormControl =
1233 pFormField->GetControl(m_nFormControlIndex);
1234 if (!pFormControl)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001235 return CJS_Result::Failure(JSMessage::kBadObjectError);
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001236
Dan Sinclair3a1ba8e2017-10-26 09:28:59 -04001237 pRuntime->PutArrayElement(
1238 ExportValuesArray, 0,
Tom Sepezb6b01cb2018-06-20 16:10:13 +00001239 pRuntime->NewString(pFormControl->GetExportValue().AsStringView()));
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001240 }
Tom Sepez3a6d0582018-08-17 19:28:52 +00001241 return CJS_Result::Success(ExportValuesArray);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001242}
1243
Tom Sepez3a6d0582018-08-17 19:28:52 +00001244CJS_Result CJS_Field::set_export_values(CJS_Runtime* pRuntime,
Dan Sinclairf7435522018-02-05 22:27:22 +00001245 v8::Local<v8::Value> vp) {
Lei Zhang4c7ad662018-07-12 20:29:40 +00001246 CPDF_FormField* pFormField = GetFirstFormField();
1247 if (!pFormField)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001248 return CJS_Result::Failure(JSMessage::kBadObjectError);
dan sinclaircbe23db2017-10-19 14:29:33 -04001249
Lei Zhangdfa2ac22018-07-12 19:06:50 +00001250 if (!IsCheckBoxOrRadioButton(pFormField))
Tom Sepez3a6d0582018-08-17 19:28:52 +00001251 return CJS_Result::Failure(JSMessage::kObjectTypeError);
dan sinclaircbe23db2017-10-19 14:29:33 -04001252
Tom Sepez16999822018-06-08 18:23:05 +00001253 if (!m_bCanSet)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001254 return CJS_Result::Failure(JSMessage::kReadOnlyError);
Tom Sepez16999822018-06-08 18:23:05 +00001255
1256 if (vp.IsEmpty() || !vp->IsArray())
Tom Sepez3a6d0582018-08-17 19:28:52 +00001257 return CJS_Result::Failure(JSMessage::kBadObjectError);
Tom Sepez16999822018-06-08 18:23:05 +00001258
Tom Sepez3a6d0582018-08-17 19:28:52 +00001259 return CJS_Result::Success();
dan sinclaircbe23db2017-10-19 14:29:33 -04001260}
1261
Tom Sepez3a6d0582018-08-17 19:28:52 +00001262CJS_Result CJS_Field::get_file_select(CJS_Runtime* pRuntime) {
Lei Zhang4c7ad662018-07-12 20:29:40 +00001263 CPDF_FormField* pFormField = GetFirstFormField();
1264 if (!pFormField)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001265 return CJS_Result::Failure(JSMessage::kBadObjectError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001266
Ryan Harrison9baf31f2018-01-12 18:36:30 +00001267 if (pFormField->GetFieldType() != FormFieldType::kTextField)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001268 return CJS_Result::Failure(JSMessage::kObjectTypeError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001269
Tom Sepez3a6d0582018-08-17 19:28:52 +00001270 return CJS_Result::Success(pRuntime->NewBoolean(
Lei Zhanga676aca2019-02-02 00:41:09 +00001271 !!(pFormField->GetFieldFlags() & pdfium::form_flags::kTextFileSelect)));
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001272}
1273
Tom Sepez3a6d0582018-08-17 19:28:52 +00001274CJS_Result CJS_Field::set_file_select(CJS_Runtime* pRuntime,
Dan Sinclairf7435522018-02-05 22:27:22 +00001275 v8::Local<v8::Value> vp) {
Lei Zhang4c7ad662018-07-12 20:29:40 +00001276 CPDF_FormField* pFormField = GetFirstFormField();
1277 if (!pFormField)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001278 return CJS_Result::Failure(JSMessage::kBadObjectError);
dan sinclaircbe23db2017-10-19 14:29:33 -04001279
Ryan Harrison9baf31f2018-01-12 18:36:30 +00001280 if (pFormField->GetFieldType() != FormFieldType::kTextField)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001281 return CJS_Result::Failure(JSMessage::kObjectTypeError);
Tom Sepez16999822018-06-08 18:23:05 +00001282
1283 if (!m_bCanSet)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001284 return CJS_Result::Failure(JSMessage::kReadOnlyError);
Tom Sepez16999822018-06-08 18:23:05 +00001285
Tom Sepez3a6d0582018-08-17 19:28:52 +00001286 return CJS_Result::Success();
dan sinclaircbe23db2017-10-19 14:29:33 -04001287}
1288
Tom Sepez3a6d0582018-08-17 19:28:52 +00001289CJS_Result CJS_Field::get_fill_color(CJS_Runtime* pRuntime) {
Lei Zhang4c7ad662018-07-12 20:29:40 +00001290 CPDF_FormField* pFormField = GetFirstFormField();
1291 if (!pFormField)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001292 return CJS_Result::Failure(JSMessage::kBadObjectError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001293
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001294 CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
1295 if (!pFormControl)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001296 return CJS_Result::Failure(JSMessage::kBadObjectError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001297
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001298 int iColorType;
1299 pFormControl->GetBackgroundColor(iColorType);
1300
Dan Sinclair7f55a542017-07-13 14:17:10 -04001301 CFX_Color color;
Dan Sinclair8e7f9322017-10-16 11:35:42 -04001302 if (iColorType == CFX_Color::kTransparent) {
1303 color = CFX_Color(CFX_Color::kTransparent);
1304 } else if (iColorType == CFX_Color::kGray) {
1305 color = CFX_Color(CFX_Color::kGray,
1306 pFormControl->GetOriginalBackgroundColor(0));
1307 } else if (iColorType == CFX_Color::kRGB) {
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001308 color =
Dan Sinclair8e7f9322017-10-16 11:35:42 -04001309 CFX_Color(CFX_Color::kRGB, pFormControl->GetOriginalBackgroundColor(0),
Dan Sinclair7f55a542017-07-13 14:17:10 -04001310 pFormControl->GetOriginalBackgroundColor(1),
1311 pFormControl->GetOriginalBackgroundColor(2));
Dan Sinclair8e7f9322017-10-16 11:35:42 -04001312 } else if (iColorType == CFX_Color::kCMYK) {
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001313 color =
Dan Sinclair8e7f9322017-10-16 11:35:42 -04001314 CFX_Color(CFX_Color::kCMYK, pFormControl->GetOriginalBackgroundColor(0),
Dan Sinclair7f55a542017-07-13 14:17:10 -04001315 pFormControl->GetOriginalBackgroundColor(1),
1316 pFormControl->GetOriginalBackgroundColor(2),
1317 pFormControl->GetOriginalBackgroundColor(3));
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001318 } else {
Tom Sepez3a6d0582018-08-17 19:28:52 +00001319 return CJS_Result::Failure(JSMessage::kValueError);
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001320 }
dan sinclaircbe23db2017-10-19 14:29:33 -04001321
Dan Sinclairf7435522018-02-05 22:27:22 +00001322 v8::Local<v8::Value> array =
1323 CJS_Color::ConvertPWLColorToArray(pRuntime, color);
Dan Sinclair3a1ba8e2017-10-26 09:28:59 -04001324 if (array.IsEmpty())
Tom Sepez3a6d0582018-08-17 19:28:52 +00001325 return CJS_Result::Success(pRuntime->NewArray());
1326 return CJS_Result::Success(array);
dan sinclaircbe23db2017-10-19 14:29:33 -04001327}
1328
Tom Sepez3a6d0582018-08-17 19:28:52 +00001329CJS_Result CJS_Field::set_fill_color(CJS_Runtime* pRuntime,
Dan Sinclairf7435522018-02-05 22:27:22 +00001330 v8::Local<v8::Value> vp) {
Lei Zhang18915232018-07-12 20:53:40 +00001331 std::vector<CPDF_FormField*> FieldArray = GetFormFields();
dan sinclaircbe23db2017-10-19 14:29:33 -04001332 if (FieldArray.empty())
Tom Sepez3a6d0582018-08-17 19:28:52 +00001333 return CJS_Result::Failure(JSMessage::kBadObjectError);
dan sinclaircbe23db2017-10-19 14:29:33 -04001334 if (!m_bCanSet)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001335 return CJS_Result::Failure(JSMessage::kReadOnlyError);
dan sinclair80435cb2017-10-24 21:40:24 -04001336 if (vp.IsEmpty() || !vp->IsArray())
Tom Sepez3a6d0582018-08-17 19:28:52 +00001337 return CJS_Result::Failure(JSMessage::kBadObjectError);
1338 return CJS_Result::Success();
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001339}
1340
Tom Sepez3a6d0582018-08-17 19:28:52 +00001341CJS_Result CJS_Field::get_hidden(CJS_Runtime* pRuntime) {
Lei Zhang4c7ad662018-07-12 20:29:40 +00001342 CPDF_FormField* pFormField = GetFirstFormField();
1343 if (!pFormField)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001344 return CJS_Result::Failure(JSMessage::kBadObjectError);
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001345
Lei Zhang073ecf42018-10-11 16:56:00 +00001346 CPDFSDK_InteractiveForm* pForm = m_pFormFillEnv->GetInteractiveForm();
1347 CPDFSDK_Widget* pWidget = pForm->GetWidget(GetSmartFieldControl(pFormField));
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001348 if (!pWidget)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001349 return CJS_Result::Failure(JSMessage::kBadObjectError);
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001350
1351 uint32_t dwFlags = pWidget->GetFlags();
Lei Zhang85549b42019-02-02 00:40:19 +00001352 return CJS_Result::Success(
1353 pRuntime->NewBoolean(pdfium::annotation_flags::kInvisible & dwFlags ||
1354 pdfium::annotation_flags::kHidden & dwFlags));
dan sinclaircbe23db2017-10-19 14:29:33 -04001355}
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001356
Tom Sepez3a6d0582018-08-17 19:28:52 +00001357CJS_Result CJS_Field::set_hidden(CJS_Runtime* pRuntime,
Dan Sinclairf7435522018-02-05 22:27:22 +00001358 v8::Local<v8::Value> vp) {
dan sinclaircbe23db2017-10-19 14:29:33 -04001359 if (!m_bCanSet)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001360 return CJS_Result::Failure(JSMessage::kReadOnlyError);
dan sinclaircbe23db2017-10-19 14:29:33 -04001361
1362 if (m_bDelay) {
dan sinclair80435cb2017-10-24 21:40:24 -04001363 AddDelay_Bool(FP_HIDDEN, pRuntime->ToBoolean(vp));
dan sinclaircbe23db2017-10-19 14:29:33 -04001364 } else {
Lei Zhang94919f72018-07-12 21:16:30 +00001365 SetHidden(m_pFormFillEnv.Get(), m_FieldName, m_nFormControlIndex,
1366 pRuntime->ToBoolean(vp));
dan sinclaircbe23db2017-10-19 14:29:33 -04001367 }
Tom Sepez3a6d0582018-08-17 19:28:52 +00001368 return CJS_Result::Success();
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001369}
1370
Tom Sepez3a6d0582018-08-17 19:28:52 +00001371CJS_Result CJS_Field::get_highlight(CJS_Runtime* pRuntime) {
dsinclair3a7741a2016-10-11 10:39:49 -07001372 ASSERT(m_pFormFillEnv);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001373
Lei Zhang4c7ad662018-07-12 20:29:40 +00001374 CPDF_FormField* pFormField = GetFirstFormField();
1375 if (!pFormField)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001376 return CJS_Result::Failure(JSMessage::kBadObjectError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001377
Ryan Harrison9baf31f2018-01-12 18:36:30 +00001378 if (pFormField->GetFieldType() != FormFieldType::kPushButton)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001379 return CJS_Result::Failure(JSMessage::kObjectTypeError);
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001380
1381 CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
1382 if (!pFormControl)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001383 return CJS_Result::Failure(JSMessage::kBadObjectError);
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001384
1385 int eHM = pFormControl->GetHighlightingMode();
1386 switch (eHM) {
1387 case CPDF_FormControl::None:
Tom Sepeza5ea7ff2018-10-30 19:24:36 +00001388 return CJS_Result::Success(pRuntime->NewString("none"));
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001389 case CPDF_FormControl::Push:
Tom Sepeza5ea7ff2018-10-30 19:24:36 +00001390 return CJS_Result::Success(pRuntime->NewString("push"));
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001391 case CPDF_FormControl::Invert:
Tom Sepeza5ea7ff2018-10-30 19:24:36 +00001392 return CJS_Result::Success(pRuntime->NewString("invert"));
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001393 case CPDF_FormControl::Outline:
Tom Sepeza5ea7ff2018-10-30 19:24:36 +00001394 return CJS_Result::Success(pRuntime->NewString("outline"));
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001395 case CPDF_FormControl::Toggle:
Tom Sepeza5ea7ff2018-10-30 19:24:36 +00001396 return CJS_Result::Success(pRuntime->NewString("toggle"));
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001397 }
Tom Sepez3a6d0582018-08-17 19:28:52 +00001398 return CJS_Result::Success();
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001399}
1400
Tom Sepez3a6d0582018-08-17 19:28:52 +00001401CJS_Result CJS_Field::set_highlight(CJS_Runtime* pRuntime,
Dan Sinclairf7435522018-02-05 22:27:22 +00001402 v8::Local<v8::Value> vp) {
dan sinclaircbe23db2017-10-19 14:29:33 -04001403 ASSERT(m_pFormFillEnv);
Tom Sepez16999822018-06-08 18:23:05 +00001404 if (!m_bCanSet)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001405 return CJS_Result::Failure(JSMessage::kReadOnlyError);
1406 return CJS_Result::Success();
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001407}
1408
Tom Sepez3a6d0582018-08-17 19:28:52 +00001409CJS_Result CJS_Field::get_line_width(CJS_Runtime* pRuntime) {
Lei Zhang4c7ad662018-07-12 20:29:40 +00001410 CPDF_FormField* pFormField = GetFirstFormField();
1411 if (!pFormField)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001412 return CJS_Result::Failure(JSMessage::kBadObjectError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001413
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001414 CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
1415 if (!pFormControl)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001416 return CJS_Result::Failure(JSMessage::kBadObjectError);
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001417
Lei Zhang073ecf42018-10-11 16:56:00 +00001418 CPDFSDK_InteractiveForm* pForm = m_pFormFillEnv->GetInteractiveForm();
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001419 if (!pFormField->CountControls())
Tom Sepez3a6d0582018-08-17 19:28:52 +00001420 return CJS_Result::Failure(JSMessage::kBadObjectError);
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001421
Lei Zhang073ecf42018-10-11 16:56:00 +00001422 CPDFSDK_Widget* pWidget = pForm->GetWidget(pFormField->GetControl(0));
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001423 if (!pWidget)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001424 return CJS_Result::Failure(JSMessage::kBadObjectError);
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001425
Tom Sepez3a6d0582018-08-17 19:28:52 +00001426 return CJS_Result::Success(pRuntime->NewNumber(pWidget->GetBorderWidth()));
dan sinclaircbe23db2017-10-19 14:29:33 -04001427}
1428
Tom Sepez3a6d0582018-08-17 19:28:52 +00001429CJS_Result CJS_Field::set_line_width(CJS_Runtime* pRuntime,
Dan Sinclairf7435522018-02-05 22:27:22 +00001430 v8::Local<v8::Value> vp) {
dan sinclaircbe23db2017-10-19 14:29:33 -04001431 if (!m_bCanSet)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001432 return CJS_Result::Failure(JSMessage::kReadOnlyError);
dan sinclaircbe23db2017-10-19 14:29:33 -04001433
1434 if (m_bDelay) {
dan sinclair80435cb2017-10-24 21:40:24 -04001435 AddDelay_Int(FP_LINEWIDTH, pRuntime->ToInt32(vp));
dan sinclaircbe23db2017-10-19 14:29:33 -04001436 } else {
Lei Zhang94919f72018-07-12 21:16:30 +00001437 SetLineWidth(m_pFormFillEnv.Get(), m_FieldName, m_nFormControlIndex,
1438 pRuntime->ToInt32(vp));
dan sinclaircbe23db2017-10-19 14:29:33 -04001439 }
Tom Sepez3a6d0582018-08-17 19:28:52 +00001440 return CJS_Result::Success();
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001441}
1442
Tom Sepez3a6d0582018-08-17 19:28:52 +00001443CJS_Result CJS_Field::get_multiline(CJS_Runtime* pRuntime) {
dsinclair3a7741a2016-10-11 10:39:49 -07001444 ASSERT(m_pFormFillEnv);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001445
Lei Zhang4c7ad662018-07-12 20:29:40 +00001446 CPDF_FormField* pFormField = GetFirstFormField();
1447 if (!pFormField)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001448 return CJS_Result::Failure(JSMessage::kBadObjectError);
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001449
Ryan Harrison9baf31f2018-01-12 18:36:30 +00001450 if (pFormField->GetFieldType() != FormFieldType::kTextField)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001451 return CJS_Result::Failure(JSMessage::kObjectTypeError);
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001452
Tom Sepez3a6d0582018-08-17 19:28:52 +00001453 return CJS_Result::Success(pRuntime->NewBoolean(
Lei Zhanga676aca2019-02-02 00:41:09 +00001454 !!(pFormField->GetFieldFlags() & pdfium::form_flags::kTextMultiline)));
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001455}
1456
Tom Sepez3a6d0582018-08-17 19:28:52 +00001457CJS_Result CJS_Field::set_multiline(CJS_Runtime* pRuntime,
Dan Sinclairf7435522018-02-05 22:27:22 +00001458 v8::Local<v8::Value> vp) {
dan sinclaircbe23db2017-10-19 14:29:33 -04001459 ASSERT(m_pFormFillEnv);
Tom Sepez16999822018-06-08 18:23:05 +00001460 if (!m_bCanSet)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001461 return CJS_Result::Failure(JSMessage::kReadOnlyError);
1462 return CJS_Result::Success();
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001463}
1464
Tom Sepez3a6d0582018-08-17 19:28:52 +00001465CJS_Result CJS_Field::get_multiple_selection(CJS_Runtime* pRuntime) {
dsinclair3a7741a2016-10-11 10:39:49 -07001466 ASSERT(m_pFormFillEnv);
Lei Zhang4c7ad662018-07-12 20:29:40 +00001467 CPDF_FormField* pFormField = GetFirstFormField();
1468 if (!pFormField)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001469 return CJS_Result::Failure(JSMessage::kBadObjectError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001470
Ryan Harrison9baf31f2018-01-12 18:36:30 +00001471 if (pFormField->GetFieldType() != FormFieldType::kListBox)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001472 return CJS_Result::Failure(JSMessage::kObjectTypeError);
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001473
Lei Zhanga676aca2019-02-02 00:41:09 +00001474 uint32_t dwFieldFlags = pFormField->GetFieldFlags();
Tom Sepez3a6d0582018-08-17 19:28:52 +00001475 return CJS_Result::Success(pRuntime->NewBoolean(
Lei Zhanga676aca2019-02-02 00:41:09 +00001476 !!(dwFieldFlags & pdfium::form_flags::kChoiceMultiSelect)));
dan sinclaircbe23db2017-10-19 14:29:33 -04001477}
1478
Tom Sepez3a6d0582018-08-17 19:28:52 +00001479CJS_Result CJS_Field::set_multiple_selection(CJS_Runtime* pRuntime,
Dan Sinclairf7435522018-02-05 22:27:22 +00001480 v8::Local<v8::Value> vp) {
dan sinclaircbe23db2017-10-19 14:29:33 -04001481 ASSERT(m_pFormFillEnv);
Tom Sepez16999822018-06-08 18:23:05 +00001482 if (!m_bCanSet)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001483 return CJS_Result::Failure(JSMessage::kReadOnlyError);
1484 return CJS_Result::Success();
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001485}
1486
Tom Sepez3a6d0582018-08-17 19:28:52 +00001487CJS_Result CJS_Field::get_name(CJS_Runtime* pRuntime) {
Lei Zhang18915232018-07-12 20:53:40 +00001488 std::vector<CPDF_FormField*> FieldArray = GetFormFields();
Lei Zhangd88a3642015-11-10 09:38:57 -08001489 if (FieldArray.empty())
Tom Sepez3a6d0582018-08-17 19:28:52 +00001490 return CJS_Result::Failure(JSMessage::kBadObjectError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001491
Tom Sepez3a6d0582018-08-17 19:28:52 +00001492 return CJS_Result::Success(pRuntime->NewString(m_FieldName.AsStringView()));
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001493}
1494
Tom Sepez3a6d0582018-08-17 19:28:52 +00001495CJS_Result CJS_Field::set_name(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp) {
1496 return CJS_Result::Failure(JSMessage::kNotSupportedError);
dan sinclaircbe23db2017-10-19 14:29:33 -04001497}
Tom Sepez67fd5df2015-10-08 12:24:19 -07001498
Tom Sepez3a6d0582018-08-17 19:28:52 +00001499CJS_Result CJS_Field::get_num_items(CJS_Runtime* pRuntime) {
Lei Zhang4c7ad662018-07-12 20:29:40 +00001500 CPDF_FormField* pFormField = GetFirstFormField();
1501 if (!pFormField)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001502 return CJS_Result::Failure(JSMessage::kBadObjectError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001503
Lei Zhang83f2d702018-07-12 19:07:40 +00001504 if (!IsComboBoxOrListBox(pFormField))
Tom Sepez3a6d0582018-08-17 19:28:52 +00001505 return CJS_Result::Failure(JSMessage::kObjectTypeError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001506
Tom Sepez3a6d0582018-08-17 19:28:52 +00001507 return CJS_Result::Success(pRuntime->NewNumber(pFormField->CountOptions()));
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001508}
1509
Tom Sepez3a6d0582018-08-17 19:28:52 +00001510CJS_Result CJS_Field::set_num_items(CJS_Runtime* pRuntime,
Dan Sinclairf7435522018-02-05 22:27:22 +00001511 v8::Local<v8::Value> vp) {
Tom Sepez3a6d0582018-08-17 19:28:52 +00001512 return CJS_Result::Failure(JSMessage::kNotSupportedError);
dan sinclaircbe23db2017-10-19 14:29:33 -04001513}
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001514
Tom Sepez3a6d0582018-08-17 19:28:52 +00001515CJS_Result CJS_Field::get_page(CJS_Runtime* pRuntime) {
Lei Zhang4c7ad662018-07-12 20:29:40 +00001516 CPDF_FormField* pFormField = GetFirstFormField();
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001517 if (!pFormField)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001518 return CJS_Result::Failure(JSMessage::kBadObjectError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001519
Tom Sepezd8ae8f82019-06-12 17:58:33 +00001520 std::vector<ObservedPtr<CPDFSDK_Annot>> widgets;
Lei Zhang073ecf42018-10-11 16:56:00 +00001521 m_pFormFillEnv->GetInteractiveForm()->GetWidgets(pFormField, &widgets);
Dan Sinclair8f524d62017-10-25 13:30:31 -04001522 if (widgets.empty())
Tom Sepez3a6d0582018-08-17 19:28:52 +00001523 return CJS_Result::Success(pRuntime->NewNumber(-1));
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001524
Dan Sinclair3a1ba8e2017-10-26 09:28:59 -04001525 v8::Local<v8::Array> PageArray = pRuntime->NewArray();
tsepez8fa82792017-01-11 09:32:33 -08001526 int i = 0;
1527 for (const auto& pObserved : widgets) {
Dan Sinclair8f524d62017-10-25 13:30:31 -04001528 if (!pObserved)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001529 return CJS_Result::Failure(JSMessage::kBadObjectError);
tsepez8fa82792017-01-11 09:32:33 -08001530
Tom Sepez4ef943b2018-07-26 19:06:06 +00001531 auto* pWidget = ToCPDFSDKWidget(pObserved.Get());
Dan Sinclair3a1ba8e2017-10-26 09:28:59 -04001532 pRuntime->PutArrayElement(
1533 PageArray, i,
Lei Zhangc2ad6282020-02-13 20:50:57 +00001534 pRuntime->NewNumber(pWidget->GetPageView()->GetPageIndex()));
tsepez8fa82792017-01-11 09:32:33 -08001535 ++i;
Lei Zhangd88a3642015-11-10 09:38:57 -08001536 }
Tom Sepez3a6d0582018-08-17 19:28:52 +00001537 return CJS_Result::Success(PageArray);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001538}
1539
Tom Sepez3a6d0582018-08-17 19:28:52 +00001540CJS_Result CJS_Field::set_page(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp) {
1541 return CJS_Result::Failure(JSMessage::kReadOnlyError);
dan sinclaircbe23db2017-10-19 14:29:33 -04001542}
1543
Tom Sepez3a6d0582018-08-17 19:28:52 +00001544CJS_Result CJS_Field::get_password(CJS_Runtime* pRuntime) {
dsinclair3a7741a2016-10-11 10:39:49 -07001545 ASSERT(m_pFormFillEnv);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001546
Lei Zhang4c7ad662018-07-12 20:29:40 +00001547 CPDF_FormField* pFormField = GetFirstFormField();
1548 if (!pFormField)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001549 return CJS_Result::Failure(JSMessage::kBadObjectError);
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001550
Ryan Harrison9baf31f2018-01-12 18:36:30 +00001551 if (pFormField->GetFieldType() != FormFieldType::kTextField)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001552 return CJS_Result::Failure(JSMessage::kObjectTypeError);
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001553
Tom Sepez3a6d0582018-08-17 19:28:52 +00001554 return CJS_Result::Success(pRuntime->NewBoolean(
Lei Zhanga676aca2019-02-02 00:41:09 +00001555 !!(pFormField->GetFieldFlags() & pdfium::form_flags::kTextPassword)));
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001556}
1557
Tom Sepez3a6d0582018-08-17 19:28:52 +00001558CJS_Result CJS_Field::set_password(CJS_Runtime* pRuntime,
Dan Sinclairf7435522018-02-05 22:27:22 +00001559 v8::Local<v8::Value> vp) {
dan sinclaircbe23db2017-10-19 14:29:33 -04001560 ASSERT(m_pFormFillEnv);
Tom Sepez16999822018-06-08 18:23:05 +00001561 if (!m_bCanSet)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001562 return CJS_Result::Failure(JSMessage::kReadOnlyError);
1563 return CJS_Result::Success();
dan sinclair646634b2017-10-19 14:30:28 -04001564}
dan sinclaircbe23db2017-10-19 14:29:33 -04001565
Tom Sepez3a6d0582018-08-17 19:28:52 +00001566CJS_Result CJS_Field::get_print(CJS_Runtime* pRuntime) {
Lei Zhang073ecf42018-10-11 16:56:00 +00001567 CPDFSDK_InteractiveForm* pForm = m_pFormFillEnv->GetInteractiveForm();
Lei Zhang4c7ad662018-07-12 20:29:40 +00001568 CPDF_FormField* pFormField = GetFirstFormField();
1569 if (!pFormField)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001570 return CJS_Result::Failure(JSMessage::kBadObjectError);
dan sinclaircbe23db2017-10-19 14:29:33 -04001571
Lei Zhang073ecf42018-10-11 16:56:00 +00001572 CPDFSDK_Widget* pWidget = pForm->GetWidget(GetSmartFieldControl(pFormField));
dan sinclair646634b2017-10-19 14:30:28 -04001573 if (!pWidget)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001574 return CJS_Result::Failure(JSMessage::kBadObjectError);
dan sinclaircbe23db2017-10-19 14:29:33 -04001575
Lei Zhang85549b42019-02-02 00:40:19 +00001576 return CJS_Result::Success(pRuntime->NewBoolean(
1577 !!(pWidget->GetFlags() & pdfium::annotation_flags::kPrint)));
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001578}
1579
Tom Sepez3a6d0582018-08-17 19:28:52 +00001580CJS_Result CJS_Field::set_print(CJS_Runtime* pRuntime,
Dan Sinclairf7435522018-02-05 22:27:22 +00001581 v8::Local<v8::Value> vp) {
Lei Zhang073ecf42018-10-11 16:56:00 +00001582 CPDFSDK_InteractiveForm* pForm = m_pFormFillEnv->GetInteractiveForm();
Lei Zhang18915232018-07-12 20:53:40 +00001583 std::vector<CPDF_FormField*> FieldArray = GetFormFields();
Lei Zhangd88a3642015-11-10 09:38:57 -08001584 if (FieldArray.empty())
Tom Sepez3a6d0582018-08-17 19:28:52 +00001585 return CJS_Result::Failure(JSMessage::kBadObjectError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001586
Dan Sinclair8f524d62017-10-25 13:30:31 -04001587 if (!m_bCanSet)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001588 return CJS_Result::Failure(JSMessage::kReadOnlyError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001589
Dan Sinclair8f524d62017-10-25 13:30:31 -04001590 for (CPDF_FormField* pFormField : FieldArray) {
1591 if (m_nFormControlIndex < 0) {
1592 bool bSet = false;
1593 for (int i = 0, sz = pFormField->CountControls(); i < sz; ++i) {
1594 if (CPDFSDK_Widget* pWidget =
Lei Zhang073ecf42018-10-11 16:56:00 +00001595 pForm->GetWidget(pFormField->GetControl(i))) {
dan sinclaircbe23db2017-10-19 14:29:33 -04001596 uint32_t dwFlags = pWidget->GetFlags();
dan sinclair80435cb2017-10-24 21:40:24 -04001597 if (pRuntime->ToBoolean(vp))
Lei Zhang85549b42019-02-02 00:40:19 +00001598 dwFlags |= pdfium::annotation_flags::kPrint;
dan sinclaircbe23db2017-10-19 14:29:33 -04001599 else
Lei Zhang85549b42019-02-02 00:40:19 +00001600 dwFlags &= ~pdfium::annotation_flags::kPrint;
dan sinclaircbe23db2017-10-19 14:29:33 -04001601
1602 if (dwFlags != pWidget->GetFlags()) {
1603 pWidget->SetFlags(dwFlags);
Dan Sinclair8f524d62017-10-25 13:30:31 -04001604 bSet = true;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001605 }
1606 }
1607 }
Dan Sinclair8f524d62017-10-25 13:30:31 -04001608
1609 if (bSet)
1610 UpdateFormField(m_pFormFillEnv.Get(), pFormField, true, false, true);
1611
1612 continue;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001613 }
Dan Sinclair8f524d62017-10-25 13:30:31 -04001614
1615 if (m_nFormControlIndex >= pFormField->CountControls())
Tom Sepez3a6d0582018-08-17 19:28:52 +00001616 return CJS_Result::Failure(JSMessage::kValueError);
Dan Sinclair8f524d62017-10-25 13:30:31 -04001617
1618 if (CPDF_FormControl* pFormControl =
1619 pFormField->GetControl(m_nFormControlIndex)) {
Lei Zhang073ecf42018-10-11 16:56:00 +00001620 if (CPDFSDK_Widget* pWidget = pForm->GetWidget(pFormControl)) {
Dan Sinclair8f524d62017-10-25 13:30:31 -04001621 uint32_t dwFlags = pWidget->GetFlags();
1622 if (pRuntime->ToBoolean(vp))
Lei Zhang85549b42019-02-02 00:40:19 +00001623 dwFlags |= pdfium::annotation_flags::kPrint;
Dan Sinclair8f524d62017-10-25 13:30:31 -04001624 else
Lei Zhang85549b42019-02-02 00:40:19 +00001625 dwFlags &= ~pdfium::annotation_flags::kPrint;
Dan Sinclair8f524d62017-10-25 13:30:31 -04001626
1627 if (dwFlags != pWidget->GetFlags()) {
1628 pWidget->SetFlags(dwFlags);
1629 UpdateFormControl(m_pFormFillEnv.Get(),
1630 pFormField->GetControl(m_nFormControlIndex), true,
1631 false, true);
1632 }
1633 }
1634 }
1635 }
Tom Sepez3a6d0582018-08-17 19:28:52 +00001636 return CJS_Result::Success();
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001637}
1638
Tom Sepez3a6d0582018-08-17 19:28:52 +00001639CJS_Result CJS_Field::get_radios_in_unison(CJS_Runtime* pRuntime) {
Lei Zhang4c7ad662018-07-12 20:29:40 +00001640 CPDF_FormField* pFormField = GetFirstFormField();
1641 if (!pFormField)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001642 return CJS_Result::Failure(JSMessage::kBadObjectError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001643
Ryan Harrison9baf31f2018-01-12 18:36:30 +00001644 if (pFormField->GetFieldType() != FormFieldType::kRadioButton)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001645 return CJS_Result::Failure(JSMessage::kObjectTypeError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001646
Lei Zhanga676aca2019-02-02 00:41:09 +00001647 uint32_t dwFieldFlags = pFormField->GetFieldFlags();
Tom Sepez3a6d0582018-08-17 19:28:52 +00001648 return CJS_Result::Success(pRuntime->NewBoolean(
Lei Zhanga676aca2019-02-02 00:41:09 +00001649 !!(dwFieldFlags & pdfium::form_flags::kButtonRadiosInUnison)));
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001650}
1651
Tom Sepez3a6d0582018-08-17 19:28:52 +00001652CJS_Result CJS_Field::set_radios_in_unison(CJS_Runtime* pRuntime,
Dan Sinclairf7435522018-02-05 22:27:22 +00001653 v8::Local<v8::Value> vp) {
Lei Zhang18915232018-07-12 20:53:40 +00001654 std::vector<CPDF_FormField*> FieldArray = GetFormFields();
dan sinclaircbe23db2017-10-19 14:29:33 -04001655 if (FieldArray.empty())
Tom Sepez3a6d0582018-08-17 19:28:52 +00001656 return CJS_Result::Failure(JSMessage::kBadObjectError);
Tom Sepez16999822018-06-08 18:23:05 +00001657 if (!m_bCanSet)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001658 return CJS_Result::Failure(JSMessage::kReadOnlyError);
1659 return CJS_Result::Success();
dan sinclaircbe23db2017-10-19 14:29:33 -04001660}
1661
Tom Sepez3a6d0582018-08-17 19:28:52 +00001662CJS_Result CJS_Field::get_readonly(CJS_Runtime* pRuntime) {
Lei Zhang4c7ad662018-07-12 20:29:40 +00001663 CPDF_FormField* pFormField = GetFirstFormField();
1664 if (!pFormField)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001665 return CJS_Result::Failure(JSMessage::kBadObjectError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001666
Tom Sepez3a6d0582018-08-17 19:28:52 +00001667 return CJS_Result::Success(pRuntime->NewBoolean(
Lei Zhanga676aca2019-02-02 00:41:09 +00001668 !!(pFormField->GetFieldFlags() & pdfium::form_flags::kReadOnly)));
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001669}
1670
Tom Sepez3a6d0582018-08-17 19:28:52 +00001671CJS_Result CJS_Field::set_readonly(CJS_Runtime* pRuntime,
Dan Sinclairf7435522018-02-05 22:27:22 +00001672 v8::Local<v8::Value> vp) {
Lei Zhang18915232018-07-12 20:53:40 +00001673 std::vector<CPDF_FormField*> FieldArray = GetFormFields();
dan sinclaircbe23db2017-10-19 14:29:33 -04001674 if (FieldArray.empty())
Tom Sepez3a6d0582018-08-17 19:28:52 +00001675 return CJS_Result::Failure(JSMessage::kBadObjectError);
Tom Sepez16999822018-06-08 18:23:05 +00001676 if (!m_bCanSet)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001677 return CJS_Result::Failure(JSMessage::kReadOnlyError);
1678 return CJS_Result::Success();
dan sinclaircbe23db2017-10-19 14:29:33 -04001679}
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001680
Tom Sepez3a6d0582018-08-17 19:28:52 +00001681CJS_Result CJS_Field::get_rect(CJS_Runtime* pRuntime) {
Lei Zhang4c7ad662018-07-12 20:29:40 +00001682 CPDF_FormField* pFormField = GetFirstFormField();
1683 if (!pFormField)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001684 return CJS_Result::Failure(JSMessage::kBadObjectError);
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001685
Lei Zhang073ecf42018-10-11 16:56:00 +00001686 CPDFSDK_InteractiveForm* pForm = m_pFormFillEnv->GetInteractiveForm();
1687 CPDFSDK_Widget* pWidget = pForm->GetWidget(GetSmartFieldControl(pFormField));
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001688 if (!pWidget)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001689 return CJS_Result::Failure(JSMessage::kBadObjectError);
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001690
1691 CFX_FloatRect crRect = pWidget->GetRect();
Dan Sinclair3a1ba8e2017-10-26 09:28:59 -04001692 v8::Local<v8::Array> rcArray = pRuntime->NewArray();
1693 pRuntime->PutArrayElement(
1694 rcArray, 0, pRuntime->NewNumber(static_cast<int32_t>(crRect.left)));
1695 pRuntime->PutArrayElement(
1696 rcArray, 1, pRuntime->NewNumber(static_cast<int32_t>(crRect.top)));
1697 pRuntime->PutArrayElement(
1698 rcArray, 2, pRuntime->NewNumber(static_cast<int32_t>(crRect.right)));
1699 pRuntime->PutArrayElement(
1700 rcArray, 3, pRuntime->NewNumber(static_cast<int32_t>(crRect.bottom)));
Dan Sinclair1b2a18e2017-10-24 13:56:29 -04001701
Tom Sepez3a6d0582018-08-17 19:28:52 +00001702 return CJS_Result::Success(rcArray);
dan sinclaircbe23db2017-10-19 14:29:33 -04001703}
1704
Tom Sepez3a6d0582018-08-17 19:28:52 +00001705CJS_Result CJS_Field::set_rect(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp) {
dan sinclaircbe23db2017-10-19 14:29:33 -04001706 if (!m_bCanSet)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001707 return CJS_Result::Failure(JSMessage::kReadOnlyError);
dan sinclair80435cb2017-10-24 21:40:24 -04001708 if (vp.IsEmpty() || !vp->IsArray())
Tom Sepez95443cf2019-12-06 22:47:56 +00001709 return CJS_Result::Failure(JSMessage::kValueError);
dan sinclaircbe23db2017-10-19 14:29:33 -04001710
Dan Sinclair3a1ba8e2017-10-26 09:28:59 -04001711 v8::Local<v8::Array> rcArray = pRuntime->ToArray(vp);
1712 if (pRuntime->GetArrayLength(rcArray) < 4)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001713 return CJS_Result::Failure(JSMessage::kValueError);
Dan Sinclair3a1ba8e2017-10-26 09:28:59 -04001714
dan sinclaircbe23db2017-10-19 14:29:33 -04001715 float pArray[4];
Dan Sinclair3a1ba8e2017-10-26 09:28:59 -04001716 pArray[0] = static_cast<float>(
1717 pRuntime->ToInt32(pRuntime->GetArrayElement(rcArray, 0)));
1718 pArray[1] = static_cast<float>(
1719 pRuntime->ToInt32(pRuntime->GetArrayElement(rcArray, 1)));
1720 pArray[2] = static_cast<float>(
1721 pRuntime->ToInt32(pRuntime->GetArrayElement(rcArray, 2)));
1722 pArray[3] = static_cast<float>(
1723 pRuntime->ToInt32(pRuntime->GetArrayElement(rcArray, 3)));
dan sinclaircbe23db2017-10-19 14:29:33 -04001724
1725 CFX_FloatRect crRect(pArray);
1726 if (m_bDelay) {
1727 AddDelay_Rect(FP_RECT, crRect);
1728 } else {
Lei Zhang94919f72018-07-12 21:16:30 +00001729 SetRect(m_pFormFillEnv.Get(), m_FieldName, m_nFormControlIndex, crRect);
dan sinclaircbe23db2017-10-19 14:29:33 -04001730 }
Tom Sepez3a6d0582018-08-17 19:28:52 +00001731 return CJS_Result::Success();
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001732}
1733
Tom Sepez3a6d0582018-08-17 19:28:52 +00001734CJS_Result CJS_Field::get_required(CJS_Runtime* pRuntime) {
Lei Zhang4c7ad662018-07-12 20:29:40 +00001735 CPDF_FormField* pFormField = GetFirstFormField();
1736 if (!pFormField)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001737 return CJS_Result::Failure(JSMessage::kBadObjectError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001738
Ryan Harrison9baf31f2018-01-12 18:36:30 +00001739 if (pFormField->GetFieldType() == FormFieldType::kPushButton)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001740 return CJS_Result::Failure(JSMessage::kObjectTypeError);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001741
Tom Sepez3a6d0582018-08-17 19:28:52 +00001742 return CJS_Result::Success(pRuntime->NewBoolean(
Lei Zhanga676aca2019-02-02 00:41:09 +00001743 !!(pFormField->GetFieldFlags() & pdfium::form_flags::kRequired)));
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001744}
1745
Tom Sepez3a6d0582018-08-17 19:28:52 +00001746CJS_Result CJS_Field::set_required(CJS_Runtime* pRuntime,
Dan Sinclairf7435522018-02-05 22:27:22 +00001747 v8::Local<v8::Value> vp) {
Lei Zhang18915232018-07-12 20:53:40 +00001748 std::vector<CPDF_FormField*> FieldArray = GetFormFields();
dan sinclaircbe23db2017-10-19 14:29:33 -04001749 if (FieldArray.empty())
Tom Sepez3a6d0582018-08-17 19:28:52 +00001750 return CJS_Result::Failure(JSMessage::kBadObjectError);
Tom Sepez16999822018-06-08 18:23:05 +00001751 if (!m_bCanSet)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001752 return CJS_Result::Failure(JSMessage::kReadOnlyError);
1753 return CJS_Result::Success();
dan sinclaircbe23db2017-10-19 14:29:33 -04001754}
1755
Tom Sepez3a6d0582018-08-17 19:28:52 +00001756CJS_Result CJS_Field::get_rich_text(CJS_Runtime* pRuntime) {
dsinclair3a7741a2016-10-11 10:39:49 -07001757 ASSERT(m_pFormFillEnv);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001758
Lei Zhang4c7ad662018-07-12 20:29:40 +00001759 CPDF_FormField* pFormField = GetFirstFormField();
1760 if (!pFormField)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001761 return CJS_Result::Failure(JSMessage::kBadObjectError);
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001762
Ryan Harrison9baf31f2018-01-12 18:36:30 +00001763 if (pFormField->GetFieldType() != FormFieldType::kTextField)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001764 return CJS_Result::Failure(JSMessage::kObjectTypeError);
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001765
Tom Sepez3a6d0582018-08-17 19:28:52 +00001766 return CJS_Result::Success(pRuntime->NewBoolean(
Lei Zhanga676aca2019-02-02 00:41:09 +00001767 !!(pFormField->GetFieldFlags() & pdfium::form_flags::kTextRichText)));
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001768}
1769
Tom Sepez3a6d0582018-08-17 19:28:52 +00001770CJS_Result CJS_Field::set_rich_text(CJS_Runtime* pRuntime,
Dan Sinclairf7435522018-02-05 22:27:22 +00001771 v8::Local<v8::Value> vp) {
dsinclair3a7741a2016-10-11 10:39:49 -07001772 ASSERT(m_pFormFillEnv);
Tom Sepez16999822018-06-08 18:23:05 +00001773 if (!m_bCanSet)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001774 return CJS_Result::Failure(JSMessage::kReadOnlyError);
1775 return CJS_Result::Success();
dan sinclaircbe23db2017-10-19 14:29:33 -04001776}
1777
Tom Sepez3a6d0582018-08-17 19:28:52 +00001778CJS_Result CJS_Field::get_rich_value(CJS_Runtime* pRuntime) {
1779 return CJS_Result::Success();
dan sinclaircbe23db2017-10-19 14:29:33 -04001780}
1781
Tom Sepez3a6d0582018-08-17 19:28:52 +00001782CJS_Result CJS_Field::set_rich_value(CJS_Runtime* pRuntime,
Dan Sinclairf7435522018-02-05 22:27:22 +00001783 v8::Local<v8::Value> vp) {
Tom Sepez3a6d0582018-08-17 19:28:52 +00001784 return CJS_Result::Success();
dan sinclaircbe23db2017-10-19 14:29:33 -04001785}
1786
Tom Sepez3a6d0582018-08-17 19:28:52 +00001787CJS_Result CJS_Field::get_rotation(CJS_Runtime* pRuntime) {
dan sinclaircbe23db2017-10-19 14:29:33 -04001788 ASSERT(m_pFormFillEnv);
1789
Lei Zhang4c7ad662018-07-12 20:29:40 +00001790 CPDF_FormField* pFormField = GetFirstFormField();
1791 if (!pFormField)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001792 return CJS_Result::Failure(JSMessage::kBadObjectError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001793
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001794 CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
1795 if (!pFormControl)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001796 return CJS_Result::Failure(JSMessage::kBadObjectError);
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001797
Tom Sepez3a6d0582018-08-17 19:28:52 +00001798 return CJS_Result::Success(pRuntime->NewNumber(pFormControl->GetRotation()));
dan sinclaircbe23db2017-10-19 14:29:33 -04001799}
1800
Tom Sepez3a6d0582018-08-17 19:28:52 +00001801CJS_Result CJS_Field::set_rotation(CJS_Runtime* pRuntime,
Dan Sinclairf7435522018-02-05 22:27:22 +00001802 v8::Local<v8::Value> vp) {
dan sinclaircbe23db2017-10-19 14:29:33 -04001803 ASSERT(m_pFormFillEnv);
Tom Sepez16999822018-06-08 18:23:05 +00001804 if (!m_bCanSet)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001805 return CJS_Result::Failure(JSMessage::kReadOnlyError);
1806 return CJS_Result::Success();
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001807}
1808
Tom Sepezb14a2f22018-10-12 23:21:58 +00001809CJS_Result CJS_Field::get_source(CJS_Runtime* pRuntime) {
1810 return CJS_Result::Success();
1811}
1812
1813CJS_Result CJS_Field::set_source(CJS_Runtime* pRuntime,
1814 v8::Local<v8::Value> vp) {
1815 return CJS_Result::Success();
1816}
1817
Tom Sepez3a6d0582018-08-17 19:28:52 +00001818CJS_Result CJS_Field::get_stroke_color(CJS_Runtime* pRuntime) {
Lei Zhang4c7ad662018-07-12 20:29:40 +00001819 CPDF_FormField* pFormField = GetFirstFormField();
1820 if (!pFormField)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001821 return CJS_Result::Failure(JSMessage::kBadObjectError);
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001822
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001823 CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
1824 if (!pFormControl)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001825 return CJS_Result::Failure(JSMessage::kBadObjectError);
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001826
1827 int iColorType;
1828 pFormControl->GetBorderColor(iColorType);
1829
Dan Sinclair7f55a542017-07-13 14:17:10 -04001830 CFX_Color color;
Dan Sinclair8e7f9322017-10-16 11:35:42 -04001831 if (iColorType == CFX_Color::kTransparent) {
1832 color = CFX_Color(CFX_Color::kTransparent);
1833 } else if (iColorType == CFX_Color::kGray) {
1834 color =
1835 CFX_Color(CFX_Color::kGray, pFormControl->GetOriginalBorderColor(0));
1836 } else if (iColorType == CFX_Color::kRGB) {
1837 color = CFX_Color(CFX_Color::kRGB, pFormControl->GetOriginalBorderColor(0),
Dan Sinclair7f55a542017-07-13 14:17:10 -04001838 pFormControl->GetOriginalBorderColor(1),
1839 pFormControl->GetOriginalBorderColor(2));
Dan Sinclair8e7f9322017-10-16 11:35:42 -04001840 } else if (iColorType == CFX_Color::kCMYK) {
1841 color = CFX_Color(CFX_Color::kCMYK, pFormControl->GetOriginalBorderColor(0),
Dan Sinclair7f55a542017-07-13 14:17:10 -04001842 pFormControl->GetOriginalBorderColor(1),
1843 pFormControl->GetOriginalBorderColor(2),
1844 pFormControl->GetOriginalBorderColor(3));
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001845 } else {
Tom Sepez3a6d0582018-08-17 19:28:52 +00001846 return CJS_Result::Failure(JSMessage::kObjectTypeError);
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001847 }
1848
Dan Sinclairf7435522018-02-05 22:27:22 +00001849 v8::Local<v8::Value> array =
1850 CJS_Color::ConvertPWLColorToArray(pRuntime, color);
Dan Sinclair3a1ba8e2017-10-26 09:28:59 -04001851 if (array.IsEmpty())
Tom Sepez3a6d0582018-08-17 19:28:52 +00001852 return CJS_Result::Success(pRuntime->NewArray());
1853 return CJS_Result::Success(array);
dan sinclaircbe23db2017-10-19 14:29:33 -04001854}
1855
Tom Sepez3a6d0582018-08-17 19:28:52 +00001856CJS_Result CJS_Field::set_stroke_color(CJS_Runtime* pRuntime,
Dan Sinclairf7435522018-02-05 22:27:22 +00001857 v8::Local<v8::Value> vp) {
dan sinclaircbe23db2017-10-19 14:29:33 -04001858 if (!m_bCanSet)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001859 return CJS_Result::Failure(JSMessage::kReadOnlyError);
dan sinclair80435cb2017-10-24 21:40:24 -04001860 if (vp.IsEmpty() || !vp->IsArray())
Tom Sepez3a6d0582018-08-17 19:28:52 +00001861 return CJS_Result::Failure(JSMessage::kBadObjectError);
1862 return CJS_Result::Success();
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001863}
1864
Tom Sepez3a6d0582018-08-17 19:28:52 +00001865CJS_Result CJS_Field::get_style(CJS_Runtime* pRuntime) {
dsinclair3a7741a2016-10-11 10:39:49 -07001866 ASSERT(m_pFormFillEnv);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001867
Lei Zhang4c7ad662018-07-12 20:29:40 +00001868 CPDF_FormField* pFormField = GetFirstFormField();
1869 if (!pFormField)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001870 return CJS_Result::Failure(JSMessage::kBadObjectError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001871
Lei Zhangdfa2ac22018-07-12 19:06:50 +00001872 if (!IsCheckBoxOrRadioButton(pFormField))
Tom Sepez3a6d0582018-08-17 19:28:52 +00001873 return CJS_Result::Failure(JSMessage::kObjectTypeError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001874
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001875 CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
1876 if (!pFormControl)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001877 return CJS_Result::Failure(JSMessage::kBadObjectError);
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001878
Ryan Harrison275e2602017-09-18 14:23:18 -04001879 WideString csWCaption = pFormControl->GetNormalCaption();
Tom Sepezf6059372018-11-16 19:31:40 +00001880 wchar_t selector = !csWCaption.IsEmpty() ? csWCaption[0] : L'4';
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001881
Tom Sepezf6059372018-11-16 19:31:40 +00001882 ByteString csBCaption;
1883 switch (selector) {
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001884 case L'l':
1885 csBCaption = "circle";
1886 break;
1887 case L'8':
1888 csBCaption = "cross";
1889 break;
1890 case L'u':
1891 csBCaption = "diamond";
1892 break;
1893 case L'n':
1894 csBCaption = "square";
1895 break;
1896 case L'H':
1897 csBCaption = "star";
1898 break;
1899 default: // L'4'
1900 csBCaption = "check";
1901 break;
1902 }
Tom Sepez3a6d0582018-08-17 19:28:52 +00001903 return CJS_Result::Success(pRuntime->NewString(
Tom Sepez40317142018-11-27 00:18:33 +00001904 WideString::FromDefANSI(csBCaption.AsStringView()).AsStringView()));
dan sinclaircbe23db2017-10-19 14:29:33 -04001905}
1906
Tom Sepez3a6d0582018-08-17 19:28:52 +00001907CJS_Result CJS_Field::set_style(CJS_Runtime* pRuntime,
Dan Sinclairf7435522018-02-05 22:27:22 +00001908 v8::Local<v8::Value> vp) {
dan sinclaircbe23db2017-10-19 14:29:33 -04001909 ASSERT(m_pFormFillEnv);
Tom Sepez16999822018-06-08 18:23:05 +00001910 if (!m_bCanSet)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001911 return CJS_Result::Failure(JSMessage::kReadOnlyError);
1912 return CJS_Result::Success();
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001913}
1914
Tom Sepez3a6d0582018-08-17 19:28:52 +00001915CJS_Result CJS_Field::get_submit_name(CJS_Runtime* pRuntime) {
1916 return CJS_Result::Success();
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001917}
1918
Tom Sepez3a6d0582018-08-17 19:28:52 +00001919CJS_Result CJS_Field::set_submit_name(CJS_Runtime* pRuntime,
Dan Sinclairf7435522018-02-05 22:27:22 +00001920 v8::Local<v8::Value> vp) {
Tom Sepez3a6d0582018-08-17 19:28:52 +00001921 return CJS_Result::Success();
dan sinclaircbe23db2017-10-19 14:29:33 -04001922}
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001923
Tom Sepez3a6d0582018-08-17 19:28:52 +00001924CJS_Result CJS_Field::get_text_color(CJS_Runtime* pRuntime) {
Lei Zhang4c7ad662018-07-12 20:29:40 +00001925 CPDF_FormField* pFormField = GetFirstFormField();
1926 if (!pFormField)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001927 return CJS_Result::Failure(JSMessage::kBadObjectError);
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001928
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001929 CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
1930 if (!pFormControl)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001931 return CJS_Result::Failure(JSMessage::kBadObjectError);
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001932
Dan Sinclair28bb2f22018-04-03 19:52:27 +00001933 Optional<CFX_Color::Type> iColorType;
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001934 FX_ARGB color;
1935 CPDF_DefaultAppearance FieldAppearance = pFormControl->GetDefaultAppearance();
Dan Sinclaira17a0e22018-03-28 21:10:35 +00001936 std::tie(iColorType, color) = FieldAppearance.GetColor();
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001937
Dan Sinclair28bb2f22018-04-03 19:52:27 +00001938 CFX_Color crRet;
1939 if (!iColorType || *iColorType == CFX_Color::kTransparent) {
Dan Sinclair8e7f9322017-10-16 11:35:42 -04001940 crRet = CFX_Color(CFX_Color::kTransparent);
Dan Sinclair28bb2f22018-04-03 19:52:27 +00001941 } else {
1942 int32_t a;
1943 int32_t r;
1944 int32_t g;
1945 int32_t b;
1946 std::tie(a, r, g, b) = ArgbDecode(color);
1947 crRet = CFX_Color(CFX_Color::kRGB, r / 255.0f, g / 255.0f, b / 255.0f);
1948 }
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001949
Dan Sinclairf7435522018-02-05 22:27:22 +00001950 v8::Local<v8::Value> array =
1951 CJS_Color::ConvertPWLColorToArray(pRuntime, crRet);
Dan Sinclair3a1ba8e2017-10-26 09:28:59 -04001952 if (array.IsEmpty())
Tom Sepez3a6d0582018-08-17 19:28:52 +00001953 return CJS_Result::Success(pRuntime->NewArray());
1954 return CJS_Result::Success(array);
dan sinclaircbe23db2017-10-19 14:29:33 -04001955}
1956
Tom Sepez3a6d0582018-08-17 19:28:52 +00001957CJS_Result CJS_Field::set_text_color(CJS_Runtime* pRuntime,
Dan Sinclairf7435522018-02-05 22:27:22 +00001958 v8::Local<v8::Value> vp) {
dan sinclaircbe23db2017-10-19 14:29:33 -04001959 if (!m_bCanSet)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001960 return CJS_Result::Failure(JSMessage::kReadOnlyError);
dan sinclair80435cb2017-10-24 21:40:24 -04001961 if (vp.IsEmpty() || !vp->IsArray())
Tom Sepez3a6d0582018-08-17 19:28:52 +00001962 return CJS_Result::Failure(JSMessage::kBadObjectError);
1963 return CJS_Result::Success();
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001964}
1965
Tom Sepez3a6d0582018-08-17 19:28:52 +00001966CJS_Result CJS_Field::get_text_font(CJS_Runtime* pRuntime) {
dsinclair3a7741a2016-10-11 10:39:49 -07001967 ASSERT(m_pFormFillEnv);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001968
Lei Zhang4c7ad662018-07-12 20:29:40 +00001969 CPDF_FormField* pFormField = GetFirstFormField();
1970 if (!pFormField)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001971 return CJS_Result::Failure(JSMessage::kBadObjectError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001972
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001973 CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
1974 if (!pFormControl)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001975 return CJS_Result::Failure(JSMessage::kBadObjectError);
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001976
Ryan Harrison9baf31f2018-01-12 18:36:30 +00001977 FormFieldType fieldType = pFormField->GetFieldType();
1978 if (fieldType != FormFieldType::kPushButton &&
1979 fieldType != FormFieldType::kComboBox &&
1980 fieldType != FormFieldType::kListBox &&
1981 fieldType != FormFieldType::kTextField) {
Tom Sepez3a6d0582018-08-17 19:28:52 +00001982 return CJS_Result::Failure(JSMessage::kObjectTypeError);
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001983 }
Dan Sinclair8f524d62017-10-25 13:30:31 -04001984
Tom Sepez60da5fa2019-08-01 20:59:53 +00001985 Optional<WideString> wsFontName = pFormControl->GetDefaultControlFontName();
1986 if (!wsFontName.has_value())
Tom Sepez3a6d0582018-08-17 19:28:52 +00001987 return CJS_Result::Failure(JSMessage::kBadObjectError);
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001988
Tom Sepez60da5fa2019-08-01 20:59:53 +00001989 return CJS_Result::Success(
1990 pRuntime->NewString(wsFontName.value().AsStringView()));
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001991}
1992
Tom Sepez3a6d0582018-08-17 19:28:52 +00001993CJS_Result CJS_Field::set_text_font(CJS_Runtime* pRuntime,
Dan Sinclairf7435522018-02-05 22:27:22 +00001994 v8::Local<v8::Value> vp) {
dan sinclaircbe23db2017-10-19 14:29:33 -04001995 ASSERT(m_pFormFillEnv);
1996
dan sinclair646634b2017-10-19 14:30:28 -04001997 if (!m_bCanSet)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001998 return CJS_Result::Failure(JSMessage::kReadOnlyError);
Tom Sepez34dab072018-08-08 17:49:02 +00001999 if (pRuntime->ToWideString(vp).ToDefANSI().IsEmpty())
Tom Sepez3a6d0582018-08-17 19:28:52 +00002000 return CJS_Result::Failure(JSMessage::kValueError);
2001 return CJS_Result::Success();
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002002}
2003
Tom Sepez3a6d0582018-08-17 19:28:52 +00002004CJS_Result CJS_Field::get_text_size(CJS_Runtime* pRuntime) {
dsinclair3a7741a2016-10-11 10:39:49 -07002005 ASSERT(m_pFormFillEnv);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002006
Lei Zhang4c7ad662018-07-12 20:29:40 +00002007 CPDF_FormField* pFormField = GetFirstFormField();
2008 if (!pFormField)
Tom Sepez3a6d0582018-08-17 19:28:52 +00002009 return CJS_Result::Failure(JSMessage::kBadObjectError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002010
Tom Sepezd6ae2af2017-02-16 11:49:55 -08002011 CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
2012 if (!pFormControl)
Tom Sepez3a6d0582018-08-17 19:28:52 +00002013 return CJS_Result::Failure(JSMessage::kBadObjectError);
Tom Sepezd6ae2af2017-02-16 11:49:55 -08002014
Dan Sinclair05df0752017-03-14 14:43:42 -04002015 float fFontSize;
Tom Sepezc4a2b752017-04-07 13:56:13 -07002016 CPDF_DefaultAppearance FieldAppearance = pFormControl->GetDefaultAppearance();
2017 FieldAppearance.GetFont(&fFontSize);
Tom Sepez3a6d0582018-08-17 19:28:52 +00002018 return CJS_Result::Success(pRuntime->NewNumber(static_cast<int>(fFontSize)));
dan sinclaircbe23db2017-10-19 14:29:33 -04002019}
2020
Tom Sepez3a6d0582018-08-17 19:28:52 +00002021CJS_Result CJS_Field::set_text_size(CJS_Runtime* pRuntime,
Dan Sinclairf7435522018-02-05 22:27:22 +00002022 v8::Local<v8::Value> vp) {
dan sinclaircbe23db2017-10-19 14:29:33 -04002023 ASSERT(m_pFormFillEnv);
Tom Sepez16999822018-06-08 18:23:05 +00002024 if (!m_bCanSet)
Tom Sepez3a6d0582018-08-17 19:28:52 +00002025 return CJS_Result::Failure(JSMessage::kReadOnlyError);
2026 return CJS_Result::Success();
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002027}
2028
Tom Sepez3a6d0582018-08-17 19:28:52 +00002029CJS_Result CJS_Field::get_type(CJS_Runtime* pRuntime) {
Lei Zhang4c7ad662018-07-12 20:29:40 +00002030 CPDF_FormField* pFormField = GetFirstFormField();
2031 if (!pFormField)
Tom Sepez3a6d0582018-08-17 19:28:52 +00002032 return CJS_Result::Failure(JSMessage::kBadObjectError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002033
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002034 switch (pFormField->GetFieldType()) {
Ryan Harrison9baf31f2018-01-12 18:36:30 +00002035 case FormFieldType::kUnknown:
Tom Sepeza5ea7ff2018-10-30 19:24:36 +00002036 return CJS_Result::Success(pRuntime->NewString("unknown"));
Ryan Harrison9baf31f2018-01-12 18:36:30 +00002037 case FormFieldType::kPushButton:
Tom Sepeza5ea7ff2018-10-30 19:24:36 +00002038 return CJS_Result::Success(pRuntime->NewString("button"));
Ryan Harrison9baf31f2018-01-12 18:36:30 +00002039 case FormFieldType::kCheckBox:
Tom Sepeza5ea7ff2018-10-30 19:24:36 +00002040 return CJS_Result::Success(pRuntime->NewString("checkbox"));
Ryan Harrison9baf31f2018-01-12 18:36:30 +00002041 case FormFieldType::kRadioButton:
Tom Sepeza5ea7ff2018-10-30 19:24:36 +00002042 return CJS_Result::Success(pRuntime->NewString("radiobutton"));
Ryan Harrison9baf31f2018-01-12 18:36:30 +00002043 case FormFieldType::kComboBox:
Tom Sepeza5ea7ff2018-10-30 19:24:36 +00002044 return CJS_Result::Success(pRuntime->NewString("combobox"));
Ryan Harrison9baf31f2018-01-12 18:36:30 +00002045 case FormFieldType::kListBox:
Tom Sepeza5ea7ff2018-10-30 19:24:36 +00002046 return CJS_Result::Success(pRuntime->NewString("listbox"));
Ryan Harrison9baf31f2018-01-12 18:36:30 +00002047 case FormFieldType::kTextField:
Tom Sepeza5ea7ff2018-10-30 19:24:36 +00002048 return CJS_Result::Success(pRuntime->NewString("text"));
Ryan Harrison9baf31f2018-01-12 18:36:30 +00002049 case FormFieldType::kSignature:
Tom Sepeza5ea7ff2018-10-30 19:24:36 +00002050 return CJS_Result::Success(pRuntime->NewString("signature"));
Ryan Harrison9baf31f2018-01-12 18:36:30 +00002051 default:
Tom Sepeza5ea7ff2018-10-30 19:24:36 +00002052 return CJS_Result::Success(pRuntime->NewString("unknown"));
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002053 }
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002054}
2055
Tom Sepez3a6d0582018-08-17 19:28:52 +00002056CJS_Result CJS_Field::set_type(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp) {
2057 return CJS_Result::Failure(JSMessage::kNotSupportedError);
dan sinclaircbe23db2017-10-19 14:29:33 -04002058}
2059
Tom Sepez3a6d0582018-08-17 19:28:52 +00002060CJS_Result CJS_Field::get_user_name(CJS_Runtime* pRuntime) {
dsinclair3a7741a2016-10-11 10:39:49 -07002061 ASSERT(m_pFormFillEnv);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002062
Lei Zhang4c7ad662018-07-12 20:29:40 +00002063 CPDF_FormField* pFormField = GetFirstFormField();
2064 if (!pFormField)
Tom Sepez3a6d0582018-08-17 19:28:52 +00002065 return CJS_Result::Failure(JSMessage::kBadObjectError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002066
Tom Sepez3a6d0582018-08-17 19:28:52 +00002067 return CJS_Result::Success(
Lei Zhang4c7ad662018-07-12 20:29:40 +00002068 pRuntime->NewString(pFormField->GetAlternateName().AsStringView()));
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002069}
2070
Tom Sepez3a6d0582018-08-17 19:28:52 +00002071CJS_Result CJS_Field::set_user_name(CJS_Runtime* pRuntime,
Dan Sinclairf7435522018-02-05 22:27:22 +00002072 v8::Local<v8::Value> vp) {
dan sinclaircbe23db2017-10-19 14:29:33 -04002073 ASSERT(m_pFormFillEnv);
Tom Sepez16999822018-06-08 18:23:05 +00002074 if (!m_bCanSet)
Tom Sepez3a6d0582018-08-17 19:28:52 +00002075 return CJS_Result::Failure(JSMessage::kReadOnlyError);
2076 return CJS_Result::Success();
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002077}
2078
Tom Sepez3a6d0582018-08-17 19:28:52 +00002079CJS_Result CJS_Field::get_value(CJS_Runtime* pRuntime) {
Lei Zhang4c7ad662018-07-12 20:29:40 +00002080 CPDF_FormField* pFormField = GetFirstFormField();
2081 if (!pFormField)
Tom Sepez3a6d0582018-08-17 19:28:52 +00002082 return CJS_Result::Failure(JSMessage::kBadObjectError);
Dan Sinclair8f524d62017-10-25 13:30:31 -04002083
2084 v8::Local<v8::Value> ret;
Tom Sepezd6ae2af2017-02-16 11:49:55 -08002085 switch (pFormField->GetFieldType()) {
Ryan Harrison9baf31f2018-01-12 18:36:30 +00002086 case FormFieldType::kPushButton:
Tom Sepez3a6d0582018-08-17 19:28:52 +00002087 return CJS_Result::Failure(JSMessage::kObjectTypeError);
Ryan Harrison9baf31f2018-01-12 18:36:30 +00002088 case FormFieldType::kComboBox:
2089 case FormFieldType::kTextField:
Tom Sepezb6b01cb2018-06-20 16:10:13 +00002090 ret = pRuntime->NewString(pFormField->GetValue().AsStringView());
dan sinclaircbe23db2017-10-19 14:29:33 -04002091 break;
Ryan Harrison9baf31f2018-01-12 18:36:30 +00002092 case FormFieldType::kListBox: {
Tom Sepezd6ae2af2017-02-16 11:49:55 -08002093 if (pFormField->CountSelectedItems() > 1) {
Dan Sinclair3a1ba8e2017-10-26 09:28:59 -04002094 v8::Local<v8::Array> ValueArray = pRuntime->NewArray();
dan sinclair80435cb2017-10-24 21:40:24 -04002095 v8::Local<v8::Value> ElementValue;
Tom Sepezd6ae2af2017-02-16 11:49:55 -08002096 int iIndex;
2097 for (int i = 0, sz = pFormField->CountSelectedItems(); i < sz; i++) {
2098 iIndex = pFormField->GetSelectedIndex(i);
Tom Sepezb6b01cb2018-06-20 16:10:13 +00002099 ElementValue = pRuntime->NewString(
2100 pFormField->GetOptionValue(iIndex).AsStringView());
dan sinclair80435cb2017-10-24 21:40:24 -04002101 if (wcslen(pRuntime->ToWideString(ElementValue).c_str()) == 0) {
Tom Sepezb6b01cb2018-06-20 16:10:13 +00002102 ElementValue = pRuntime->NewString(
2103 pFormField->GetOptionLabel(iIndex).AsStringView());
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002104 }
Dan Sinclair3a1ba8e2017-10-26 09:28:59 -04002105 pRuntime->PutArrayElement(ValueArray, i, ElementValue);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002106 }
Dan Sinclair3a1ba8e2017-10-26 09:28:59 -04002107 ret = ValueArray;
Tom Sepezd6ae2af2017-02-16 11:49:55 -08002108 } else {
Tom Sepezb6b01cb2018-06-20 16:10:13 +00002109 ret = pRuntime->NewString(pFormField->GetValue().AsStringView());
Tom Sepezd6ae2af2017-02-16 11:49:55 -08002110 }
dan sinclaircbe23db2017-10-19 14:29:33 -04002111 break;
2112 }
Ryan Harrison9baf31f2018-01-12 18:36:30 +00002113 case FormFieldType::kCheckBox:
2114 case FormFieldType::kRadioButton: {
Tom Sepezd6ae2af2017-02-16 11:49:55 -08002115 bool bFind = false;
2116 for (int i = 0, sz = pFormField->CountControls(); i < sz; i++) {
2117 if (pFormField->GetControl(i)->IsChecked()) {
Dan Sinclair8f524d62017-10-25 13:30:31 -04002118 ret = pRuntime->NewString(
Tom Sepezb6b01cb2018-06-20 16:10:13 +00002119 pFormField->GetControl(i)->GetExportValue().AsStringView());
Tom Sepezd6ae2af2017-02-16 11:49:55 -08002120 bFind = true;
2121 break;
2122 }
2123 }
2124 if (!bFind)
Tom Sepeza5ea7ff2018-10-30 19:24:36 +00002125 ret = pRuntime->NewString("Off");
dan sinclaircbe23db2017-10-19 14:29:33 -04002126
2127 break;
2128 }
Tom Sepezd6ae2af2017-02-16 11:49:55 -08002129 default:
Tom Sepezb6b01cb2018-06-20 16:10:13 +00002130 ret = pRuntime->NewString(pFormField->GetValue().AsStringView());
Tom Sepezd6ae2af2017-02-16 11:49:55 -08002131 break;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002132 }
Tom Sepez3a6d0582018-08-17 19:28:52 +00002133 return CJS_Result::Success(pRuntime->MaybeCoerceToNumber(ret));
dan sinclaircbe23db2017-10-19 14:29:33 -04002134}
2135
Tom Sepez3a6d0582018-08-17 19:28:52 +00002136CJS_Result CJS_Field::set_value(CJS_Runtime* pRuntime,
Dan Sinclairf7435522018-02-05 22:27:22 +00002137 v8::Local<v8::Value> vp) {
dan sinclaircbe23db2017-10-19 14:29:33 -04002138 if (!m_bCanSet)
Tom Sepez3a6d0582018-08-17 19:28:52 +00002139 return CJS_Result::Failure(JSMessage::kReadOnlyError);
dan sinclaircbe23db2017-10-19 14:29:33 -04002140
2141 std::vector<WideString> strArray;
dan sinclair80435cb2017-10-24 21:40:24 -04002142 if (!vp.IsEmpty() && vp->IsArray()) {
Dan Sinclair3a1ba8e2017-10-26 09:28:59 -04002143 v8::Local<v8::Array> ValueArray = pRuntime->ToArray(vp);
2144 for (size_t i = 0; i < pRuntime->GetArrayLength(ValueArray); i++) {
dan sinclair80435cb2017-10-24 21:40:24 -04002145 strArray.push_back(
Dan Sinclair3a1ba8e2017-10-26 09:28:59 -04002146 pRuntime->ToWideString(pRuntime->GetArrayElement(ValueArray, i)));
dan sinclaircbe23db2017-10-19 14:29:33 -04002147 }
2148 } else {
dan sinclair80435cb2017-10-24 21:40:24 -04002149 strArray.push_back(pRuntime->ToWideString(vp));
dan sinclaircbe23db2017-10-19 14:29:33 -04002150 }
2151
2152 if (m_bDelay) {
2153 AddDelay_WideStringArray(FP_VALUE, strArray);
2154 } else {
Lei Zhange158a002019-03-29 17:16:03 +00002155 SetFieldValue(m_pFormFillEnv.Get(), m_FieldName, m_nFormControlIndex,
2156 strArray);
dan sinclaircbe23db2017-10-19 14:29:33 -04002157 }
Tom Sepez3a6d0582018-08-17 19:28:52 +00002158 return CJS_Result::Success();
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002159}
2160
Tom Sepez3a6d0582018-08-17 19:28:52 +00002161CJS_Result CJS_Field::get_value_as_string(CJS_Runtime* pRuntime) {
Lei Zhang4c7ad662018-07-12 20:29:40 +00002162 CPDF_FormField* pFormField = GetFirstFormField();
2163 if (!pFormField)
Tom Sepez3a6d0582018-08-17 19:28:52 +00002164 return CJS_Result::Failure(JSMessage::kBadObjectError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002165
Ryan Harrison9baf31f2018-01-12 18:36:30 +00002166 if (pFormField->GetFieldType() == FormFieldType::kPushButton)
Tom Sepez3a6d0582018-08-17 19:28:52 +00002167 return CJS_Result::Failure(JSMessage::kObjectTypeError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002168
Ryan Harrison9baf31f2018-01-12 18:36:30 +00002169 if (pFormField->GetFieldType() == FormFieldType::kCheckBox) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002170 if (!pFormField->CountControls())
Tom Sepez3a6d0582018-08-17 19:28:52 +00002171 return CJS_Result::Failure(JSMessage::kBadObjectError);
2172 return CJS_Result::Success(pRuntime->NewString(
Dan Sinclaire4974922017-10-24 09:36:16 -04002173 pFormField->GetControl(0)->IsChecked() ? L"Yes" : L"Off"));
dan sinclaircbe23db2017-10-19 14:29:33 -04002174 }
2175
Ryan Harrison9baf31f2018-01-12 18:36:30 +00002176 if (pFormField->GetFieldType() == FormFieldType::kRadioButton &&
Lei Zhanga676aca2019-02-02 00:41:09 +00002177 !(pFormField->GetFieldFlags() &
2178 pdfium::form_flags::kButtonRadiosInUnison)) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002179 for (int i = 0, sz = pFormField->CountControls(); i < sz; i++) {
2180 if (pFormField->GetControl(i)->IsChecked()) {
Tom Sepez3a6d0582018-08-17 19:28:52 +00002181 return CJS_Result::Success(pRuntime->NewString(
Tom Sepezb6b01cb2018-06-20 16:10:13 +00002182 pFormField->GetControl(i)->GetExportValue().AsStringView()));
Lei Zhangd88a3642015-11-10 09:38:57 -08002183 }
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002184 }
Tom Sepeza5ea7ff2018-10-30 19:24:36 +00002185 return CJS_Result::Success(pRuntime->NewString("Off"));
dan sinclaircbe23db2017-10-19 14:29:33 -04002186 }
2187
Ryan Harrison9baf31f2018-01-12 18:36:30 +00002188 if (pFormField->GetFieldType() == FormFieldType::kListBox &&
dan sinclaircbe23db2017-10-19 14:29:33 -04002189 (pFormField->CountSelectedItems() > 1)) {
Tom Sepeza5ea7ff2018-10-30 19:24:36 +00002190 return CJS_Result::Success(pRuntime->NewString(""));
Lei Zhangd88a3642015-11-10 09:38:57 -08002191 }
Tom Sepez3a6d0582018-08-17 19:28:52 +00002192 return CJS_Result::Success(
Tom Sepez20736f72018-08-17 16:44:50 +00002193 pRuntime->NewString(pFormField->GetValue().AsStringView()));
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002194}
2195
Tom Sepez3a6d0582018-08-17 19:28:52 +00002196CJS_Result CJS_Field::set_value_as_string(CJS_Runtime* pRuntime,
Dan Sinclairf7435522018-02-05 22:27:22 +00002197 v8::Local<v8::Value> vp) {
Tom Sepez3a6d0582018-08-17 19:28:52 +00002198 return CJS_Result::Failure(JSMessage::kNotSupportedError);
dan sinclaircbe23db2017-10-19 14:29:33 -04002199}
2200
Tom Sepez3a6d0582018-08-17 19:28:52 +00002201CJS_Result CJS_Field::browseForFileToSubmit(
dan sinclair80435cb2017-10-24 21:40:24 -04002202 CJS_Runtime* pRuntime,
Dan Sinclair8f524d62017-10-25 13:30:31 -04002203 const std::vector<v8::Local<v8::Value>>& params) {
Lei Zhang4c7ad662018-07-12 20:29:40 +00002204 CPDF_FormField* pFormField = GetFirstFormField();
2205 if (!pFormField)
Tom Sepez3a6d0582018-08-17 19:28:52 +00002206 return CJS_Result::Failure(JSMessage::kBadObjectError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002207
Lei Zhanga676aca2019-02-02 00:41:09 +00002208 if ((pFormField->GetFieldFlags() & pdfium::form_flags::kTextFileSelect) &&
Ryan Harrison9baf31f2018-01-12 18:36:30 +00002209 (pFormField->GetFieldType() == FormFieldType::kTextField)) {
Ryan Harrison275e2602017-09-18 14:23:18 -04002210 WideString wsFileName = m_pFormFillEnv->JS_fieldBrowse();
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002211 if (!wsFileName.IsEmpty()) {
Tom Sepezb2e6b4c2018-08-16 20:53:58 +00002212 pFormField->SetValue(wsFileName, NotificationOption::kDoNotNotify);
tsepez4cf55152016-11-02 14:37:54 -07002213 UpdateFormField(m_pFormFillEnv.Get(), pFormField, true, true, true);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002214 }
Tom Sepez3a6d0582018-08-17 19:28:52 +00002215 return CJS_Result::Success();
Lei Zhangd88a3642015-11-10 09:38:57 -08002216 }
Tom Sepez3a6d0582018-08-17 19:28:52 +00002217 return CJS_Result::Failure(JSMessage::kObjectTypeError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002218}
2219
Tom Sepez3a6d0582018-08-17 19:28:52 +00002220CJS_Result CJS_Field::buttonGetCaption(
Dan Sinclair8f524d62017-10-25 13:30:31 -04002221 CJS_Runtime* pRuntime,
2222 const std::vector<v8::Local<v8::Value>>& params) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002223 int nface = 0;
2224 int iSize = params.size();
2225 if (iSize >= 1)
dan sinclair80435cb2017-10-24 21:40:24 -04002226 nface = pRuntime->ToInt32(params[0]);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002227
Lei Zhang4c7ad662018-07-12 20:29:40 +00002228 CPDF_FormField* pFormField = GetFirstFormField();
2229 if (!pFormField)
Tom Sepez3a6d0582018-08-17 19:28:52 +00002230 return CJS_Result::Failure(JSMessage::kBadObjectError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002231
Ryan Harrison9baf31f2018-01-12 18:36:30 +00002232 if (pFormField->GetFieldType() != FormFieldType::kPushButton)
Tom Sepez3a6d0582018-08-17 19:28:52 +00002233 return CJS_Result::Failure(JSMessage::kObjectTypeError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002234
2235 CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
2236 if (!pFormControl)
Tom Sepez3a6d0582018-08-17 19:28:52 +00002237 return CJS_Result::Failure(JSMessage::kBadObjectError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002238
Dan Sinclair8f524d62017-10-25 13:30:31 -04002239 if (nface == 0) {
Tom Sepez3a6d0582018-08-17 19:28:52 +00002240 return CJS_Result::Success(
Tom Sepezb6b01cb2018-06-20 16:10:13 +00002241 pRuntime->NewString(pFormControl->GetNormalCaption().AsStringView()));
2242 }
2243 if (nface == 1) {
Tom Sepez3a6d0582018-08-17 19:28:52 +00002244 return CJS_Result::Success(
Tom Sepezb6b01cb2018-06-20 16:10:13 +00002245 pRuntime->NewString(pFormControl->GetDownCaption().AsStringView()));
2246 }
2247 if (nface == 2) {
Tom Sepez3a6d0582018-08-17 19:28:52 +00002248 return CJS_Result::Success(
Tom Sepezb6b01cb2018-06-20 16:10:13 +00002249 pRuntime->NewString(pFormControl->GetRolloverCaption().AsStringView()));
Dan Sinclair8f524d62017-10-25 13:30:31 -04002250 }
Tom Sepez3a6d0582018-08-17 19:28:52 +00002251 return CJS_Result::Failure(JSMessage::kValueError);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07002252}
2253
Tom Sepez3a6d0582018-08-17 19:28:52 +00002254CJS_Result CJS_Field::buttonGetIcon(
Dan Sinclair8f524d62017-10-25 13:30:31 -04002255 CJS_Runtime* pRuntime,
2256 const std::vector<v8::Local<v8::Value>>& params) {
Tom Sepez40e0a812017-02-23 13:07:36 -08002257 if (params.size() >= 1) {
dan sinclair80435cb2017-10-24 21:40:24 -04002258 int nFace = pRuntime->ToInt32(params[0]);
Tom Sepez40e0a812017-02-23 13:07:36 -08002259 if (nFace < 0 || nFace > 2)
Tom Sepez3a6d0582018-08-17 19:28:52 +00002260 return CJS_Result::Failure(JSMessage::kValueError);
Tom Sepez40e0a812017-02-23 13:07:36 -08002261 }
Lei Zhanga6d9f0e2015-06-13 00:48:38 -07002262
Lei Zhang4c7ad662018-07-12 20:29:40 +00002263 CPDF_FormField* pFormField = GetFirstFormField();
2264 if (!pFormField)
Tom Sepez3a6d0582018-08-17 19:28:52 +00002265 return CJS_Result::Failure(JSMessage::kBadObjectError);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07002266
Ryan Harrison9baf31f2018-01-12 18:36:30 +00002267 if (pFormField->GetFieldType() != FormFieldType::kPushButton)
Tom Sepez3a6d0582018-08-17 19:28:52 +00002268 return CJS_Result::Failure(JSMessage::kObjectTypeError);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07002269
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002270 CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
2271 if (!pFormControl)
Tom Sepez3a6d0582018-08-17 19:28:52 +00002272 return CJS_Result::Failure(JSMessage::kBadObjectError);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07002273
Tom Sepez55ccb522018-08-14 23:40:10 +00002274 v8::Local<v8::Object> pObj = pRuntime->NewFXJSBoundObject(
2275 CJS_Icon::GetObjDefnID(), FXJSOBJTYPE_DYNAMIC);
Tom Sepezc5a14722017-02-24 15:31:12 -08002276 if (pObj.IsEmpty())
Tom Sepez3a6d0582018-08-17 19:28:52 +00002277 return CJS_Result::Failure(JSMessage::kBadObjectError);
Lei Zhanga6d9f0e2015-06-13 00:48:38 -07002278
Tom Sepezddaa40f2018-06-06 18:30:15 +00002279 auto* pJS_Icon = static_cast<CJS_Icon*>(CFXJS_Engine::GetObjectPrivate(pObj));
Tom Sepez3a6d0582018-08-17 19:28:52 +00002280 return pJS_Icon ? CJS_Result::Success(pJS_Icon->ToV8Object())
2281 : CJS_Result::Failure(JSMessage::kBadObjectError);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07002282}
2283
Tom Sepez3a6d0582018-08-17 19:28:52 +00002284CJS_Result CJS_Field::buttonImportIcon(
Dan Sinclair8f524d62017-10-25 13:30:31 -04002285 CJS_Runtime* pRuntime,
2286 const std::vector<v8::Local<v8::Value>>& params) {
Tom Sepez3a6d0582018-08-17 19:28:52 +00002287 return CJS_Result::Success();
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002288}
2289
Tom Sepez3a6d0582018-08-17 19:28:52 +00002290CJS_Result CJS_Field::buttonSetCaption(
Dan Sinclair8f524d62017-10-25 13:30:31 -04002291 CJS_Runtime* pRuntime,
2292 const std::vector<v8::Local<v8::Value>>& params) {
Tom Sepez3a6d0582018-08-17 19:28:52 +00002293 return CJS_Result::Failure(JSMessage::kNotSupportedError);
tsepez4cf55152016-11-02 14:37:54 -07002294}
2295
Tom Sepez3a6d0582018-08-17 19:28:52 +00002296CJS_Result CJS_Field::buttonSetIcon(
Dan Sinclair8f524d62017-10-25 13:30:31 -04002297 CJS_Runtime* pRuntime,
2298 const std::vector<v8::Local<v8::Value>>& params) {
Tom Sepez3a6d0582018-08-17 19:28:52 +00002299 return CJS_Result::Failure(JSMessage::kNotSupportedError);
tsepez4cf55152016-11-02 14:37:54 -07002300}
2301
Tom Sepez3a6d0582018-08-17 19:28:52 +00002302CJS_Result CJS_Field::checkThisBox(
Dan Sinclair8f524d62017-10-25 13:30:31 -04002303 CJS_Runtime* pRuntime,
2304 const std::vector<v8::Local<v8::Value>>& params) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002305 int iSize = params.size();
2306 if (iSize < 1)
Tom Sepez3a6d0582018-08-17 19:28:52 +00002307 return CJS_Result::Failure(JSMessage::kParamError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002308
tsepezf3dc8c62016-08-10 06:29:29 -07002309 if (!m_bCanSet)
Tom Sepez3a6d0582018-08-17 19:28:52 +00002310 return CJS_Result::Failure(JSMessage::kReadOnlyError);
tsepezf3dc8c62016-08-10 06:29:29 -07002311
dan sinclair80435cb2017-10-24 21:40:24 -04002312 int nWidget = pRuntime->ToInt32(params[0]);
Wei Li97da9762016-03-11 17:00:48 -08002313 bool bCheckit = true;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002314 if (iSize >= 2)
dan sinclair80435cb2017-10-24 21:40:24 -04002315 bCheckit = pRuntime->ToBoolean(params[1]);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002316
Lei Zhang4c7ad662018-07-12 20:29:40 +00002317 CPDF_FormField* pFormField = GetFirstFormField();
2318 if (!pFormField)
Tom Sepez3a6d0582018-08-17 19:28:52 +00002319 return CJS_Result::Failure(JSMessage::kBadObjectError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002320
Lei Zhangdfa2ac22018-07-12 19:06:50 +00002321 if (!IsCheckBoxOrRadioButton(pFormField))
Tom Sepez3a6d0582018-08-17 19:28:52 +00002322 return CJS_Result::Failure(JSMessage::kObjectTypeError);
Tom Sepezb2e6b4c2018-08-16 20:53:58 +00002323
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002324 if (nWidget < 0 || nWidget >= pFormField->CountControls())
Tom Sepez3a6d0582018-08-17 19:28:52 +00002325 return CJS_Result::Failure(JSMessage::kValueError);
Lei Zhangbc486922018-01-29 15:30:46 +00002326
2327 // TODO(weili): Check whether anything special needed for radio button.
2328 // (When pFormField->GetFieldType() == FormFieldType::kRadioButton.)
Tom Sepezb2e6b4c2018-08-16 20:53:58 +00002329 pFormField->CheckControl(nWidget, bCheckit, NotificationOption::kNotify);
tsepez4cf55152016-11-02 14:37:54 -07002330 UpdateFormField(m_pFormFillEnv.Get(), pFormField, true, true, true);
Tom Sepez3a6d0582018-08-17 19:28:52 +00002331 return CJS_Result::Success();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07002332}
2333
Tom Sepez3a6d0582018-08-17 19:28:52 +00002334CJS_Result CJS_Field::clearItems(
Dan Sinclairf7435522018-02-05 22:27:22 +00002335 CJS_Runtime* pRuntime,
2336 const std::vector<v8::Local<v8::Value>>& params) {
Tom Sepez3a6d0582018-08-17 19:28:52 +00002337 return CJS_Result::Success();
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002338}
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07002339
Tom Sepez3a6d0582018-08-17 19:28:52 +00002340CJS_Result CJS_Field::defaultIsChecked(
Dan Sinclair8f524d62017-10-25 13:30:31 -04002341 CJS_Runtime* pRuntime,
2342 const std::vector<v8::Local<v8::Value>>& params) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002343 if (!m_bCanSet)
Tom Sepez3a6d0582018-08-17 19:28:52 +00002344 return CJS_Result::Failure(JSMessage::kReadOnlyError);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07002345
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002346 int iSize = params.size();
2347 if (iSize < 1)
Tom Sepez3a6d0582018-08-17 19:28:52 +00002348 return CJS_Result::Failure(JSMessage::kParamError);
Tom Sepezf4ef3f92015-04-23 11:31:31 -07002349
Lei Zhang4c7ad662018-07-12 20:29:40 +00002350 CPDF_FormField* pFormField = GetFirstFormField();
2351 if (!pFormField)
Tom Sepez3a6d0582018-08-17 19:28:52 +00002352 return CJS_Result::Failure(JSMessage::kBadObjectError);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07002353
Lei Zhang4c7ad662018-07-12 20:29:40 +00002354 int nWidget = pRuntime->ToInt32(params[0]);
tsepezf3dc8c62016-08-10 06:29:29 -07002355 if (nWidget < 0 || nWidget >= pFormField->CountControls())
Tom Sepez3a6d0582018-08-17 19:28:52 +00002356 return CJS_Result::Failure(JSMessage::kValueError);
tsepezf3dc8c62016-08-10 06:29:29 -07002357
Tom Sepez3a6d0582018-08-17 19:28:52 +00002358 return CJS_Result::Success(
Tom Sepez20736f72018-08-17 16:44:50 +00002359 pRuntime->NewBoolean(IsCheckBoxOrRadioButton(pFormField)));
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002360}
2361
Tom Sepez3a6d0582018-08-17 19:28:52 +00002362CJS_Result CJS_Field::deleteItemAt(
Dan Sinclair8f524d62017-10-25 13:30:31 -04002363 CJS_Runtime* pRuntime,
2364 const std::vector<v8::Local<v8::Value>>& params) {
Tom Sepez3a6d0582018-08-17 19:28:52 +00002365 return CJS_Result::Success();
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002366}
2367
Tom Sepez3a6d0582018-08-17 19:28:52 +00002368CJS_Result CJS_Field::getArray(
Dan Sinclairf7435522018-02-05 22:27:22 +00002369 CJS_Runtime* pRuntime,
2370 const std::vector<v8::Local<v8::Value>>& params) {
Lei Zhang18915232018-07-12 20:53:40 +00002371 std::vector<CPDF_FormField*> FieldArray = GetFormFields();
Lei Zhangd88a3642015-11-10 09:38:57 -08002372 if (FieldArray.empty())
Tom Sepez3a6d0582018-08-17 19:28:52 +00002373 return CJS_Result::Failure(JSMessage::kBadObjectError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002374
Ryan Harrison275e2602017-09-18 14:23:18 -04002375 std::vector<std::unique_ptr<WideString>> swSort;
Tom Sepezb9cc7a02016-02-01 13:42:30 -08002376 for (CPDF_FormField* pFormField : FieldArray) {
Tom Sepez31d722d2020-05-15 22:03:46 +00002377 swSort.push_back(std::make_unique<WideString>(pFormField->GetFullName()));
Tom Sepezb9cc7a02016-02-01 13:42:30 -08002378 }
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002379
Ryan Harrison275e2602017-09-18 14:23:18 -04002380 std::sort(swSort.begin(), swSort.end(),
2381 [](const std::unique_ptr<WideString>& p1,
2382 const std::unique_ptr<WideString>& p2) { return *p1 < *p2; });
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002383
Dan Sinclair3a1ba8e2017-10-26 09:28:59 -04002384 v8::Local<v8::Array> FormFieldArray = pRuntime->NewArray();
Tom Sepezb9cc7a02016-02-01 13:42:30 -08002385 int j = 0;
2386 for (const auto& pStr : swSort) {
Tom Sepez55ccb522018-08-14 23:40:10 +00002387 v8::Local<v8::Object> pObj = pRuntime->NewFXJSBoundObject(
2388 CJS_Field::GetObjDefnID(), FXJSOBJTYPE_DYNAMIC);
Tom Sepezc5a14722017-02-24 15:31:12 -08002389 if (pObj.IsEmpty())
Tom Sepez3a6d0582018-08-17 19:28:52 +00002390 return CJS_Result::Failure(JSMessage::kBadObjectError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002391
Tom Sepezddaa40f2018-06-06 18:30:15 +00002392 auto* pJSField =
2393 static_cast<CJS_Field*>(CFXJS_Engine::GetObjectPrivate(pObj));
Tom Sepez2cbae732018-06-26 15:11:28 +00002394 pJSField->AttachField(m_pJSDoc.Get(), *pStr);
Dan Sinclair3a1ba8e2017-10-26 09:28:59 -04002395 pRuntime->PutArrayElement(FormFieldArray, j++,
dan sinclair80435cb2017-10-24 21:40:24 -04002396 pJSField
2397 ? v8::Local<v8::Value>(pJSField->ToV8Object())
2398 : v8::Local<v8::Value>());
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002399 }
Tom Sepez3a6d0582018-08-17 19:28:52 +00002400 return CJS_Result::Success(FormFieldArray);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002401}
2402
Tom Sepez3a6d0582018-08-17 19:28:52 +00002403CJS_Result CJS_Field::getItemAt(
Dan Sinclairf7435522018-02-05 22:27:22 +00002404 CJS_Runtime* pRuntime,
2405 const std::vector<v8::Local<v8::Value>>& params) {
tsepezf3dc8c62016-08-10 06:29:29 -07002406 int iSize = params.size();
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002407 int nIdx = -1;
2408 if (iSize >= 1)
dan sinclair80435cb2017-10-24 21:40:24 -04002409 nIdx = pRuntime->ToInt32(params[0]);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002410
tsepez4cf55152016-11-02 14:37:54 -07002411 bool bExport = true;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002412 if (iSize >= 2)
dan sinclair80435cb2017-10-24 21:40:24 -04002413 bExport = pRuntime->ToBoolean(params[1]);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002414
Lei Zhang4c7ad662018-07-12 20:29:40 +00002415 CPDF_FormField* pFormField = GetFirstFormField();
2416 if (!pFormField)
Tom Sepez3a6d0582018-08-17 19:28:52 +00002417 return CJS_Result::Failure(JSMessage::kBadObjectError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002418
Lei Zhang83f2d702018-07-12 19:07:40 +00002419 if (!IsComboBoxOrListBox(pFormField))
Tom Sepez3a6d0582018-08-17 19:28:52 +00002420 return CJS_Result::Failure(JSMessage::kObjectTypeError);
Lei Zhang83f2d702018-07-12 19:07:40 +00002421
2422 if (nIdx == -1 || nIdx > pFormField->CountOptions())
2423 nIdx = pFormField->CountOptions() - 1;
2424 if (!bExport) {
Tom Sepez3a6d0582018-08-17 19:28:52 +00002425 return CJS_Result::Success(
Tom Sepezb6b01cb2018-06-20 16:10:13 +00002426 pRuntime->NewString(pFormField->GetOptionLabel(nIdx).AsStringView()));
Lei Zhangd88a3642015-11-10 09:38:57 -08002427 }
Lei Zhang83f2d702018-07-12 19:07:40 +00002428
2429 WideString strval = pFormField->GetOptionValue(nIdx);
2430 if (strval.IsEmpty()) {
Tom Sepez3a6d0582018-08-17 19:28:52 +00002431 return CJS_Result::Success(
Lei Zhang83f2d702018-07-12 19:07:40 +00002432 pRuntime->NewString(pFormField->GetOptionLabel(nIdx).AsStringView()));
2433 }
Tom Sepez3a6d0582018-08-17 19:28:52 +00002434 return CJS_Result::Success(pRuntime->NewString(strval.AsStringView()));
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002435}
2436
Tom Sepez3a6d0582018-08-17 19:28:52 +00002437CJS_Result CJS_Field::getLock(CJS_Runtime* pRuntime,
Dan Sinclairf7435522018-02-05 22:27:22 +00002438 const std::vector<v8::Local<v8::Value>>& params) {
Tom Sepez3a6d0582018-08-17 19:28:52 +00002439 return CJS_Result::Failure(JSMessage::kNotSupportedError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002440}
2441
Tom Sepez3a6d0582018-08-17 19:28:52 +00002442CJS_Result CJS_Field::insertItemAt(
Dan Sinclair8f524d62017-10-25 13:30:31 -04002443 CJS_Runtime* pRuntime,
2444 const std::vector<v8::Local<v8::Value>>& params) {
Tom Sepez3a6d0582018-08-17 19:28:52 +00002445 return CJS_Result::Success();
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002446}
2447
Tom Sepez3a6d0582018-08-17 19:28:52 +00002448CJS_Result CJS_Field::isBoxChecked(
Dan Sinclair8f524d62017-10-25 13:30:31 -04002449 CJS_Runtime* pRuntime,
2450 const std::vector<v8::Local<v8::Value>>& params) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002451 int nIndex = -1;
2452 if (params.size() >= 1)
dan sinclair80435cb2017-10-24 21:40:24 -04002453 nIndex = pRuntime->ToInt32(params[0]);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002454
Lei Zhang4c7ad662018-07-12 20:29:40 +00002455 CPDF_FormField* pFormField = GetFirstFormField();
2456 if (!pFormField)
Tom Sepez3a6d0582018-08-17 19:28:52 +00002457 return CJS_Result::Failure(JSMessage::kBadObjectError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002458
dan sinclair646634b2017-10-19 14:30:28 -04002459 if (nIndex < 0 || nIndex >= pFormField->CountControls())
Tom Sepez3a6d0582018-08-17 19:28:52 +00002460 return CJS_Result::Failure(JSMessage::kValueError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002461
Tom Sepez3a6d0582018-08-17 19:28:52 +00002462 return CJS_Result::Success(
Lei Zhangdfa2ac22018-07-12 19:06:50 +00002463 pRuntime->NewBoolean((IsCheckBoxOrRadioButton(pFormField) &&
2464 pFormField->GetControl(nIndex)->IsChecked() != 0)));
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07002465}
2466
Tom Sepez3a6d0582018-08-17 19:28:52 +00002467CJS_Result CJS_Field::isDefaultChecked(
Dan Sinclair8f524d62017-10-25 13:30:31 -04002468 CJS_Runtime* pRuntime,
2469 const std::vector<v8::Local<v8::Value>>& params) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002470 int nIndex = -1;
2471 if (params.size() >= 1)
dan sinclair80435cb2017-10-24 21:40:24 -04002472 nIndex = pRuntime->ToInt32(params[0]);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07002473
Lei Zhang4c7ad662018-07-12 20:29:40 +00002474 CPDF_FormField* pFormField = GetFirstFormField();
2475 if (!pFormField)
Tom Sepez3a6d0582018-08-17 19:28:52 +00002476 return CJS_Result::Failure(JSMessage::kBadObjectError);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07002477
tsepezf3dc8c62016-08-10 06:29:29 -07002478 if (nIndex < 0 || nIndex >= pFormField->CountControls())
Tom Sepez3a6d0582018-08-17 19:28:52 +00002479 return CJS_Result::Failure(JSMessage::kValueError);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07002480
Tom Sepez3a6d0582018-08-17 19:28:52 +00002481 return CJS_Result::Success(pRuntime->NewBoolean(
Lei Zhangdfa2ac22018-07-12 19:06:50 +00002482 (IsCheckBoxOrRadioButton(pFormField) &&
Dan Sinclair1d8d9ac2017-10-24 11:23:25 -04002483 pFormField->GetControl(nIndex)->IsDefaultChecked() != 0)));
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07002484}
2485
Tom Sepez3a6d0582018-08-17 19:28:52 +00002486CJS_Result CJS_Field::setAction(
Dan Sinclairf7435522018-02-05 22:27:22 +00002487 CJS_Runtime* pRuntime,
2488 const std::vector<v8::Local<v8::Value>>& params) {
Tom Sepez3a6d0582018-08-17 19:28:52 +00002489 return CJS_Result::Success();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07002490}
2491
Tom Sepez3a6d0582018-08-17 19:28:52 +00002492CJS_Result CJS_Field::setFocus(
Dan Sinclairf7435522018-02-05 22:27:22 +00002493 CJS_Runtime* pRuntime,
2494 const std::vector<v8::Local<v8::Value>>& params) {
Lei Zhang4c7ad662018-07-12 20:29:40 +00002495 CPDF_FormField* pFormField = GetFirstFormField();
2496 if (!pFormField)
Tom Sepez3a6d0582018-08-17 19:28:52 +00002497 return CJS_Result::Failure(JSMessage::kBadObjectError);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07002498
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002499 int32_t nCount = pFormField->CountControls();
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002500 if (nCount < 1)
Tom Sepez3a6d0582018-08-17 19:28:52 +00002501 return CJS_Result::Failure(JSMessage::kBadObjectError);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07002502
Lei Zhang073ecf42018-10-11 16:56:00 +00002503 CPDFSDK_InteractiveForm* pForm = m_pFormFillEnv->GetInteractiveForm();
thestig1cd352e2016-06-07 17:53:06 -07002504 CPDFSDK_Widget* pWidget = nullptr;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002505 if (nCount == 1) {
Lei Zhang073ecf42018-10-11 16:56:00 +00002506 pWidget = pForm->GetWidget(pFormField->GetControl(0));
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002507 } else {
Tom Sepez101535f2018-06-12 13:36:05 +00002508 IPDF_Page* pPage = IPDFPageFromFPDFPage(m_pFormFillEnv->GetCurrentPage());
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002509 if (!pPage)
Tom Sepez3a6d0582018-08-17 19:28:52 +00002510 return CJS_Result::Failure(JSMessage::kBadObjectError);
dsinclair461eeaf2016-07-27 07:40:05 -07002511 if (CPDFSDK_PageView* pCurPageView =
dsinclair7cbe68e2016-10-12 11:56:23 -07002512 m_pFormFillEnv->GetPageView(pPage, true)) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002513 for (int32_t i = 0; i < nCount; i++) {
2514 if (CPDFSDK_Widget* pTempWidget =
Lei Zhang073ecf42018-10-11 16:56:00 +00002515 pForm->GetWidget(pFormField->GetControl(i))) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002516 if (pTempWidget->GetPDFPage() == pCurPageView->GetPDFPage()) {
2517 pWidget = pTempWidget;
2518 break;
2519 }
Tom Sepez2f2ffec2015-07-23 14:42:09 -07002520 }
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002521 }
Tom Sepez2f2ffec2015-07-23 14:42:09 -07002522 }
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002523 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07002524
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002525 if (pWidget) {
Tom Sepezd8ae8f82019-06-12 17:58:33 +00002526 ObservedPtr<CPDFSDK_Annot> pObserved(pWidget);
dsinclair7cbe68e2016-10-12 11:56:23 -07002527 m_pFormFillEnv->SetFocusAnnot(&pObserved);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002528 }
2529
Tom Sepez3a6d0582018-08-17 19:28:52 +00002530 return CJS_Result::Success();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07002531}
2532
Tom Sepez3a6d0582018-08-17 19:28:52 +00002533CJS_Result CJS_Field::setItems(
Dan Sinclairf7435522018-02-05 22:27:22 +00002534 CJS_Runtime* pRuntime,
2535 const std::vector<v8::Local<v8::Value>>& params) {
Tom Sepez3a6d0582018-08-17 19:28:52 +00002536 return CJS_Result::Success();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07002537}
2538
Tom Sepez3a6d0582018-08-17 19:28:52 +00002539CJS_Result CJS_Field::setLock(CJS_Runtime* pRuntime,
Dan Sinclairf7435522018-02-05 22:27:22 +00002540 const std::vector<v8::Local<v8::Value>>& params) {
Tom Sepez3a6d0582018-08-17 19:28:52 +00002541 return CJS_Result::Failure(JSMessage::kNotSupportedError);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07002542}
2543
Tom Sepez3a6d0582018-08-17 19:28:52 +00002544CJS_Result CJS_Field::signatureGetModifications(
dan sinclair80435cb2017-10-24 21:40:24 -04002545 CJS_Runtime* pRuntime,
Dan Sinclair8f524d62017-10-25 13:30:31 -04002546 const std::vector<v8::Local<v8::Value>>& params) {
Tom Sepez3a6d0582018-08-17 19:28:52 +00002547 return CJS_Result::Failure(JSMessage::kNotSupportedError);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07002548}
2549
Tom Sepez3a6d0582018-08-17 19:28:52 +00002550CJS_Result CJS_Field::signatureGetSeedValue(
dan sinclair80435cb2017-10-24 21:40:24 -04002551 CJS_Runtime* pRuntime,
Dan Sinclair8f524d62017-10-25 13:30:31 -04002552 const std::vector<v8::Local<v8::Value>>& params) {
Tom Sepez3a6d0582018-08-17 19:28:52 +00002553 return CJS_Result::Failure(JSMessage::kNotSupportedError);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07002554}
2555
Tom Sepez3a6d0582018-08-17 19:28:52 +00002556CJS_Result CJS_Field::signatureInfo(
dan sinclair80435cb2017-10-24 21:40:24 -04002557 CJS_Runtime* pRuntime,
Dan Sinclair8f524d62017-10-25 13:30:31 -04002558 const std::vector<v8::Local<v8::Value>>& params) {
Tom Sepez3a6d0582018-08-17 19:28:52 +00002559 return CJS_Result::Failure(JSMessage::kNotSupportedError);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07002560}
2561
Tom Sepez3a6d0582018-08-17 19:28:52 +00002562CJS_Result CJS_Field::signatureSetSeedValue(
Dan Sinclair8f524d62017-10-25 13:30:31 -04002563 CJS_Runtime* pRuntime,
2564 const std::vector<v8::Local<v8::Value>>& params) {
Tom Sepez3a6d0582018-08-17 19:28:52 +00002565 return CJS_Result::Failure(JSMessage::kNotSupportedError);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07002566}
2567
Tom Sepez3a6d0582018-08-17 19:28:52 +00002568CJS_Result CJS_Field::signatureSign(
Dan Sinclair8f524d62017-10-25 13:30:31 -04002569 CJS_Runtime* pRuntime,
2570 const std::vector<v8::Local<v8::Value>>& params) {
Tom Sepez3a6d0582018-08-17 19:28:52 +00002571 return CJS_Result::Failure(JSMessage::kNotSupportedError);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07002572}
2573
Tom Sepez3a6d0582018-08-17 19:28:52 +00002574CJS_Result CJS_Field::signatureValidate(
Dan Sinclair8f524d62017-10-25 13:30:31 -04002575 CJS_Runtime* pRuntime,
2576 const std::vector<v8::Local<v8::Value>>& params) {
Tom Sepez3a6d0582018-08-17 19:28:52 +00002577 return CJS_Result::Failure(JSMessage::kNotSupportedError);
dan sinclaircbe23db2017-10-19 14:29:33 -04002578}
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002579
Dan Sinclairf7435522018-02-05 22:27:22 +00002580void CJS_Field::AddDelay_Int(FIELD_PROP prop, int32_t n) {
Tom Sepez75acda62018-01-29 20:17:36 +00002581 auto pNewData =
Tom Sepez31d722d2020-05-15 22:03:46 +00002582 std::make_unique<CJS_DelayData>(prop, m_nFormControlIndex, m_FieldName);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002583 pNewData->num = n;
Tom Sepez75acda62018-01-29 20:17:36 +00002584 m_pJSDoc->AddDelayData(std::move(pNewData));
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07002585}
2586
Dan Sinclairf7435522018-02-05 22:27:22 +00002587void CJS_Field::AddDelay_Bool(FIELD_PROP prop, bool b) {
Tom Sepez75acda62018-01-29 20:17:36 +00002588 auto pNewData =
Tom Sepez31d722d2020-05-15 22:03:46 +00002589 std::make_unique<CJS_DelayData>(prop, m_nFormControlIndex, m_FieldName);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002590 pNewData->b = b;
Tom Sepez75acda62018-01-29 20:17:36 +00002591 m_pJSDoc->AddDelayData(std::move(pNewData));
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07002592}
2593
Lei Zhang109aa6d2018-09-20 01:21:05 +00002594void CJS_Field::AddDelay_String(FIELD_PROP prop, const ByteString& str) {
Tom Sepez75acda62018-01-29 20:17:36 +00002595 auto pNewData =
Tom Sepez31d722d2020-05-15 22:03:46 +00002596 std::make_unique<CJS_DelayData>(prop, m_nFormControlIndex, m_FieldName);
Lei Zhang109aa6d2018-09-20 01:21:05 +00002597 pNewData->bytestring = str;
Tom Sepez75acda62018-01-29 20:17:36 +00002598 m_pJSDoc->AddDelayData(std::move(pNewData));
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07002599}
2600
Dan Sinclairf7435522018-02-05 22:27:22 +00002601void CJS_Field::AddDelay_Rect(FIELD_PROP prop, const CFX_FloatRect& rect) {
Tom Sepez75acda62018-01-29 20:17:36 +00002602 auto pNewData =
Tom Sepez31d722d2020-05-15 22:03:46 +00002603 std::make_unique<CJS_DelayData>(prop, m_nFormControlIndex, m_FieldName);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002604 pNewData->rect = rect;
Tom Sepez75acda62018-01-29 20:17:36 +00002605 m_pJSDoc->AddDelayData(std::move(pNewData));
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07002606}
2607
Dan Sinclairf7435522018-02-05 22:27:22 +00002608void CJS_Field::AddDelay_WordArray(FIELD_PROP prop,
2609 const std::vector<uint32_t>& array) {
Tom Sepez75acda62018-01-29 20:17:36 +00002610 auto pNewData =
Tom Sepez31d722d2020-05-15 22:03:46 +00002611 std::make_unique<CJS_DelayData>(prop, m_nFormControlIndex, m_FieldName);
tsepez41a53ad2016-03-28 16:59:30 -07002612 pNewData->wordarray = array;
Tom Sepez75acda62018-01-29 20:17:36 +00002613 m_pJSDoc->AddDelayData(std::move(pNewData));
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07002614}
2615
Dan Sinclairf7435522018-02-05 22:27:22 +00002616void CJS_Field::AddDelay_WideStringArray(FIELD_PROP prop,
2617 const std::vector<WideString>& array) {
Tom Sepez75acda62018-01-29 20:17:36 +00002618 auto pNewData =
Tom Sepez31d722d2020-05-15 22:03:46 +00002619 std::make_unique<CJS_DelayData>(prop, m_nFormControlIndex, m_FieldName);
tsepez41a53ad2016-03-28 16:59:30 -07002620 pNewData->widestringarray = array;
Tom Sepez75acda62018-01-29 20:17:36 +00002621 m_pJSDoc->AddDelayData(std::move(pNewData));
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07002622}
2623
Dan Sinclairf7435522018-02-05 22:27:22 +00002624void CJS_Field::DoDelay(CPDFSDK_FormFillEnvironment* pFormFillEnv,
2625 CJS_DelayData* pData) {
dsinclair3a7741a2016-10-11 10:39:49 -07002626 ASSERT(pFormFillEnv);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002627 switch (pData->eProp) {
Tom Sepez2f2ffec2015-07-23 14:42:09 -07002628 case FP_BORDERSTYLE:
Lei Zhang94919f72018-07-12 21:16:30 +00002629 SetBorderStyle(pFormFillEnv, pData->sFieldName, pData->nControlIndex,
Lei Zhang109aa6d2018-09-20 01:21:05 +00002630 pData->bytestring);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002631 break;
Tom Sepez2f2ffec2015-07-23 14:42:09 -07002632 case FP_CURRENTVALUEINDICES:
Lei Zhang94919f72018-07-12 21:16:30 +00002633 SetCurrentValueIndices(pFormFillEnv, pData->sFieldName,
2634 pData->nControlIndex, pData->wordarray);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002635 break;
Tom Sepez2f2ffec2015-07-23 14:42:09 -07002636 case FP_DISPLAY:
Lei Zhang94919f72018-07-12 21:16:30 +00002637 SetDisplay(pFormFillEnv, pData->sFieldName, pData->nControlIndex,
2638 pData->num);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002639 break;
Tom Sepez2f2ffec2015-07-23 14:42:09 -07002640 case FP_HIDDEN:
Lei Zhang94919f72018-07-12 21:16:30 +00002641 SetHidden(pFormFillEnv, pData->sFieldName, pData->nControlIndex,
2642 pData->b);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002643 break;
Tom Sepez2f2ffec2015-07-23 14:42:09 -07002644 case FP_LINEWIDTH:
Lei Zhang94919f72018-07-12 21:16:30 +00002645 SetLineWidth(pFormFillEnv, pData->sFieldName, pData->nControlIndex,
2646 pData->num);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002647 break;
Tom Sepez2f2ffec2015-07-23 14:42:09 -07002648 case FP_RECT:
Lei Zhang94919f72018-07-12 21:16:30 +00002649 SetRect(pFormFillEnv, pData->sFieldName, pData->nControlIndex,
2650 pData->rect);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002651 break;
Tom Sepez2f2ffec2015-07-23 14:42:09 -07002652 case FP_VALUE:
Lei Zhange158a002019-03-29 17:16:03 +00002653 SetFieldValue(pFormFillEnv, pData->sFieldName, pData->nControlIndex,
2654 pData->widestringarray);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002655 break;
dan sinclair646634b2017-10-19 14:30:28 -04002656 default:
2657 NOTREACHED();
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002658 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07002659}