blob: ca8c62451c62e10c0896cfb41efdb12c9c88dddc [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
dsinclairbc5e6d22016-10-04 11:08:49 -070013#include "core/fpdfapi/font/cpdf_font.h"
Dan Sinclair51230322017-10-30 15:36:02 +000014#include "core/fpdfdoc/cpdf_formfield.h"
Lei Zhangc3450652018-10-11 16:54:42 +000015#include "core/fpdfdoc/cpdf_interactiveform.h"
16#include "fpdfsdk/cpdfsdk_interactiveform.h"
dsinclair114e46a2016-09-29 17:18:21 -070017#include "fpdfsdk/cpdfsdk_pageview.h"
18#include "fpdfsdk/cpdfsdk_widget.h"
Dan Sinclaire0345a42017-10-30 20:20:42 +000019#include "fxjs/cjs_color.h"
20#include "fxjs/cjs_delaydata.h"
21#include "fxjs/cjs_document.h"
22#include "fxjs/cjs_icon.h"
23#include "fxjs/js_resources.h"
Lei Zhang99f5bbb2018-10-09 21:31:28 +000024#include "third_party/base/ptr_util.h"
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -070025
tonikitoo7c05a7a2016-08-17 11:08:46 -070026namespace {
27
Lei Zhang94919f72018-07-12 21:16:30 +000028bool IsCheckBoxOrRadioButton(const CPDF_FormField* pFormField) {
29 return pFormField->GetFieldType() == FormFieldType::kCheckBox ||
30 pFormField->GetFieldType() == FormFieldType::kRadioButton;
31}
32
33bool IsComboBoxOrListBox(const CPDF_FormField* pFormField) {
34 return pFormField->GetFieldType() == FormFieldType::kComboBox ||
35 pFormField->GetFieldType() == FormFieldType::kListBox;
36}
37
38bool IsComboBoxOrTextField(const CPDF_FormField* pFormField) {
39 return pFormField->GetFieldType() == FormFieldType::kComboBox ||
40 pFormField->GetFieldType() == FormFieldType::kTextField;
41}
42
43void UpdateFormField(CPDFSDK_FormFillEnvironment* pFormFillEnv,
44 CPDF_FormField* pFormField,
45 bool bChangeMark,
46 bool bResetAP,
47 bool bRefresh) {
Lei Zhang073ecf42018-10-11 16:56:00 +000048 CPDFSDK_InteractiveForm* pForm = pFormFillEnv->GetInteractiveForm();
Lei Zhang94919f72018-07-12 21:16:30 +000049
50 if (bResetAP) {
51 std::vector<CPDFSDK_Annot::ObservedPtr> widgets;
Lei Zhang073ecf42018-10-11 16:56:00 +000052 pForm->GetWidgets(pFormField, &widgets);
Lei Zhang94919f72018-07-12 21:16:30 +000053
54 if (IsComboBoxOrTextField(pFormField)) {
55 for (auto& pObserved : widgets) {
56 if (pObserved) {
Lei Zhang4f261ff2018-10-10 18:44:45 +000057 Optional<WideString> sValue =
58 ToCPDFSDKWidget(pObserved.Get())->OnFormat();
Lei Zhang94919f72018-07-12 21:16:30 +000059 if (pObserved) { // Not redundant, may be clobbered by OnFormat.
Lei Zhang4f261ff2018-10-10 18:44:45 +000060 ToCPDFSDKWidget(pObserved.Get())->ResetAppearance(sValue, false);
Lei Zhang94919f72018-07-12 21:16:30 +000061 }
62 }
63 }
64 } else {
65 for (auto& pObserved : widgets) {
Tom Sepez4ef943b2018-07-26 19:06:06 +000066 if (pObserved)
Lei Zhang4f261ff2018-10-10 18:44:45 +000067 ToCPDFSDKWidget(pObserved.Get())->ResetAppearance({}, false);
Lei Zhang94919f72018-07-12 21:16:30 +000068 }
69 }
70 }
71
72 if (bRefresh) {
73 // Refresh the widget list. The calls in |bResetAP| may have caused widgets
74 // to be removed from the list. We need to call |GetWidgets| again to be
75 // sure none of the widgets have been deleted.
76 std::vector<CPDFSDK_Annot::ObservedPtr> widgets;
Lei Zhang073ecf42018-10-11 16:56:00 +000077 pForm->GetWidgets(pFormField, &widgets);
Lei Zhang94919f72018-07-12 21:16:30 +000078
79 // TODO(dsinclair): Determine if all widgets share the same
Lei Zhang073ecf42018-10-11 16:56:00 +000080 // CPDFSDK_InteractiveForm. If that's the case, we can move the code to
Lei Zhang94919f72018-07-12 21:16:30 +000081 // |GetFormFillEnv| out of the loop.
82 for (auto& pObserved : widgets) {
83 if (pObserved) {
Tom Sepez4ef943b2018-07-26 19:06:06 +000084 CPDFSDK_Widget* pWidget = ToCPDFSDKWidget(pObserved.Get());
Lei Zhang073ecf42018-10-11 16:56:00 +000085 pWidget->GetInteractiveForm()->GetFormFillEnv()->UpdateAllViews(
86 nullptr, pWidget);
Lei Zhang94919f72018-07-12 21:16:30 +000087 }
88 }
89 }
90
91 if (bChangeMark)
92 pFormFillEnv->SetChangeMark();
93}
94
95void UpdateFormControl(CPDFSDK_FormFillEnvironment* pFormFillEnv,
96 CPDF_FormControl* pFormControl,
97 bool bChangeMark,
98 bool bResetAP,
99 bool bRefresh) {
100 ASSERT(pFormControl);
101
Lei Zhang073ecf42018-10-11 16:56:00 +0000102 CPDFSDK_InteractiveForm* pForm = pFormFillEnv->GetInteractiveForm();
Lei Zhang94919f72018-07-12 21:16:30 +0000103 CPDFSDK_Widget* pWidget = pForm->GetWidget(pFormControl);
104
105 if (pWidget) {
106 CPDFSDK_Widget::ObservedPtr observed_widget(pWidget);
107 if (bResetAP) {
108 FormFieldType fieldType = pWidget->GetFieldType();
109 if (fieldType == FormFieldType::kComboBox ||
110 fieldType == FormFieldType::kTextField) {
Lei Zhang4f261ff2018-10-10 18:44:45 +0000111 Optional<WideString> sValue = pWidget->OnFormat();
Lei Zhang94919f72018-07-12 21:16:30 +0000112 if (!observed_widget)
113 return;
Lei Zhang4f261ff2018-10-10 18:44:45 +0000114 pWidget->ResetAppearance(sValue, false);
Lei Zhang94919f72018-07-12 21:16:30 +0000115 } else {
Lei Zhang4f261ff2018-10-10 18:44:45 +0000116 pWidget->ResetAppearance({}, false);
Lei Zhang94919f72018-07-12 21:16:30 +0000117 }
118 if (!observed_widget)
119 return;
120 }
121
122 if (bRefresh) {
Lei Zhang073ecf42018-10-11 16:56:00 +0000123 CPDFSDK_InteractiveForm* pWidgetForm = pWidget->GetInteractiveForm();
124 pWidgetForm->GetFormFillEnv()->UpdateAllViews(nullptr, pWidget);
Lei Zhang94919f72018-07-12 21:16:30 +0000125 }
126 }
127
128 if (bChangeMark)
129 pFormFillEnv->SetChangeMark();
130}
131
132std::vector<CPDF_FormField*> GetFormFieldsForName(
133 CPDFSDK_FormFillEnvironment* pFormFillEnv,
134 const WideString& csFieldName) {
135 std::vector<CPDF_FormField*> fields;
Lei Zhang073ecf42018-10-11 16:56:00 +0000136 CPDFSDK_InteractiveForm* pReaderForm = pFormFillEnv->GetInteractiveForm();
137 CPDF_InteractiveForm* pForm = pReaderForm->GetInteractiveForm();
138 for (int i = 0, sz = pForm->CountFields(csFieldName); i < sz; ++i) {
139 if (CPDF_FormField* pFormField = pForm->GetField(i, csFieldName))
Lei Zhang94919f72018-07-12 21:16:30 +0000140 fields.push_back(pFormField);
141 }
142 return fields;
143}
144
tonikitoo7c05a7a2016-08-17 11:08:46 -0700145bool SetWidgetDisplayStatus(CPDFSDK_Widget* pWidget, int value) {
146 if (!pWidget)
147 return false;
148
149 uint32_t dwFlag = pWidget->GetFlags();
150 switch (value) {
151 case 0:
152 dwFlag &= ~ANNOTFLAG_INVISIBLE;
153 dwFlag &= ~ANNOTFLAG_HIDDEN;
154 dwFlag &= ~ANNOTFLAG_NOVIEW;
155 dwFlag |= ANNOTFLAG_PRINT;
156 break;
157 case 1:
158 dwFlag &= ~ANNOTFLAG_INVISIBLE;
159 dwFlag &= ~ANNOTFLAG_NOVIEW;
160 dwFlag |= (ANNOTFLAG_HIDDEN | ANNOTFLAG_PRINT);
161 break;
162 case 2:
163 dwFlag &= ~ANNOTFLAG_INVISIBLE;
164 dwFlag &= ~ANNOTFLAG_PRINT;
165 dwFlag &= ~ANNOTFLAG_HIDDEN;
166 dwFlag &= ~ANNOTFLAG_NOVIEW;
167 break;
168 case 3:
169 dwFlag |= ANNOTFLAG_NOVIEW;
170 dwFlag |= ANNOTFLAG_PRINT;
171 dwFlag &= ~ANNOTFLAG_HIDDEN;
172 break;
173 }
174
175 if (dwFlag != pWidget->GetFlags()) {
176 pWidget->SetFlags(dwFlag);
177 return true;
178 }
179
180 return false;
181}
182
Lei Zhang94919f72018-07-12 21:16:30 +0000183void SetBorderStyle(CPDFSDK_FormFillEnvironment* pFormFillEnv,
184 const WideString& swFieldName,
185 int nControlIndex,
186 const ByteString& string) {
187 ASSERT(pFormFillEnv);
188
189 BorderStyle nBorderStyle = BorderStyle::SOLID;
190 if (string == "solid")
191 nBorderStyle = BorderStyle::SOLID;
192 else if (string == "beveled")
193 nBorderStyle = BorderStyle::BEVELED;
194 else if (string == "dashed")
195 nBorderStyle = BorderStyle::DASH;
196 else if (string == "inset")
197 nBorderStyle = BorderStyle::INSET;
198 else if (string == "underline")
199 nBorderStyle = BorderStyle::UNDERLINE;
200 else
201 return;
202
203 std::vector<CPDF_FormField*> FieldArray =
204 GetFormFieldsForName(pFormFillEnv, swFieldName);
Lei Zhang073ecf42018-10-11 16:56:00 +0000205 auto* pForm = pFormFillEnv->GetInteractiveForm();
Lei Zhang94919f72018-07-12 21:16:30 +0000206 for (CPDF_FormField* pFormField : FieldArray) {
207 if (nControlIndex < 0) {
208 bool bSet = false;
209 for (int i = 0, sz = pFormField->CountControls(); i < sz; ++i) {
Lei Zhang073ecf42018-10-11 16:56:00 +0000210 CPDFSDK_Widget* pWidget = pForm->GetWidget(pFormField->GetControl(i));
Lei Zhang7db136a2018-10-10 21:34:17 +0000211 if (pWidget) {
Lei Zhang94919f72018-07-12 21:16:30 +0000212 if (pWidget->GetBorderStyle() != nBorderStyle) {
213 pWidget->SetBorderStyle(nBorderStyle);
214 bSet = true;
215 }
216 }
217 }
218 if (bSet)
219 UpdateFormField(pFormFillEnv, pFormField, true, true, true);
220 } else {
221 if (nControlIndex >= pFormField->CountControls())
222 return;
223 if (CPDF_FormControl* pFormControl =
224 pFormField->GetControl(nControlIndex)) {
Lei Zhang073ecf42018-10-11 16:56:00 +0000225 CPDFSDK_Widget* pWidget = pForm->GetWidget(pFormControl);
Lei Zhang7db136a2018-10-10 21:34:17 +0000226 if (pWidget) {
Lei Zhang94919f72018-07-12 21:16:30 +0000227 if (pWidget->GetBorderStyle() != nBorderStyle) {
228 pWidget->SetBorderStyle(nBorderStyle);
229 UpdateFormControl(pFormFillEnv, pFormControl, true, true, true);
230 }
231 }
232 }
233 }
234 }
Lei Zhangdfa2ac22018-07-12 19:06:50 +0000235}
236
Lei Zhang94919f72018-07-12 21:16:30 +0000237void SetCurrentValueIndices(CPDFSDK_FormFillEnvironment* pFormFillEnv,
238 const WideString& swFieldName,
239 int nControlIndex,
240 const std::vector<uint32_t>& array) {
241 ASSERT(pFormFillEnv);
242 std::vector<CPDF_FormField*> FieldArray =
243 GetFormFieldsForName(pFormFillEnv, swFieldName);
244
245 for (CPDF_FormField* pFormField : FieldArray) {
246 if (!IsComboBoxOrListBox(pFormField))
247 continue;
248
249 uint32_t dwFieldFlags = pFormField->GetFieldFlags();
Tom Sepezb2e6b4c2018-08-16 20:53:58 +0000250 pFormField->ClearSelection(NotificationOption::kNotify);
Lei Zhang94919f72018-07-12 21:16:30 +0000251 for (size_t i = 0; i < array.size(); ++i) {
252 if (i != 0 && !(dwFieldFlags & (1 << 21)))
253 break;
254 if (array[i] < static_cast<uint32_t>(pFormField->CountOptions()) &&
255 !pFormField->IsItemSelected(array[i])) {
Tom Sepezb2e6b4c2018-08-16 20:53:58 +0000256 pFormField->SetItemSelection(array[i], true,
257 NotificationOption::kDoNotNotify);
Lei Zhang94919f72018-07-12 21:16:30 +0000258 }
259 }
260 UpdateFormField(pFormFillEnv, pFormField, true, true, true);
261 }
Lei Zhang83f2d702018-07-12 19:07:40 +0000262}
263
Lei Zhang94919f72018-07-12 21:16:30 +0000264void SetDisplay(CPDFSDK_FormFillEnvironment* pFormFillEnv,
265 const WideString& swFieldName,
266 int nControlIndex,
267 int number) {
Lei Zhang073ecf42018-10-11 16:56:00 +0000268 CPDFSDK_InteractiveForm* pForm = pFormFillEnv->GetInteractiveForm();
Lei Zhang94919f72018-07-12 21:16:30 +0000269 std::vector<CPDF_FormField*> FieldArray =
270 GetFormFieldsForName(pFormFillEnv, swFieldName);
271 for (CPDF_FormField* pFormField : FieldArray) {
272 if (nControlIndex < 0) {
273 bool bAnySet = false;
274 for (int i = 0, sz = pFormField->CountControls(); i < sz; ++i) {
275 CPDF_FormControl* pFormControl = pFormField->GetControl(i);
276 ASSERT(pFormControl);
277
Lei Zhang073ecf42018-10-11 16:56:00 +0000278 CPDFSDK_Widget* pWidget = pForm->GetWidget(pFormControl);
Lei Zhang94919f72018-07-12 21:16:30 +0000279 if (SetWidgetDisplayStatus(pWidget, number))
280 bAnySet = true;
281 }
282
283 if (bAnySet)
284 UpdateFormField(pFormFillEnv, pFormField, true, false, true);
285 } else {
286 if (nControlIndex >= pFormField->CountControls())
287 return;
288
289 CPDF_FormControl* pFormControl = pFormField->GetControl(nControlIndex);
290 if (!pFormControl)
291 return;
292
Lei Zhang073ecf42018-10-11 16:56:00 +0000293 CPDFSDK_Widget* pWidget = pForm->GetWidget(pFormControl);
Lei Zhang94919f72018-07-12 21:16:30 +0000294 if (SetWidgetDisplayStatus(pWidget, number))
295 UpdateFormControl(pFormFillEnv, pFormControl, true, false, true);
296 }
297 }
298}
299
300void SetHidden(CPDFSDK_FormFillEnvironment* pFormFillEnv,
301 const WideString& swFieldName,
302 int nControlIndex,
303 bool b) {
304 int display = b ? 1 /*Hidden*/ : 0 /*Visible*/;
305 SetDisplay(pFormFillEnv, swFieldName, nControlIndex, display);
306}
307
308void SetLineWidth(CPDFSDK_FormFillEnvironment* pFormFillEnv,
309 const WideString& swFieldName,
310 int nControlIndex,
311 int number) {
Lei Zhang073ecf42018-10-11 16:56:00 +0000312 CPDFSDK_InteractiveForm* pForm = pFormFillEnv->GetInteractiveForm();
Lei Zhang94919f72018-07-12 21:16:30 +0000313 std::vector<CPDF_FormField*> FieldArray =
314 GetFormFieldsForName(pFormFillEnv, swFieldName);
315 for (CPDF_FormField* pFormField : FieldArray) {
316 if (nControlIndex < 0) {
317 bool bSet = false;
318 for (int i = 0, sz = pFormField->CountControls(); i < sz; ++i) {
319 CPDF_FormControl* pFormControl = pFormField->GetControl(i);
320 ASSERT(pFormControl);
321
Lei Zhang073ecf42018-10-11 16:56:00 +0000322 if (CPDFSDK_Widget* pWidget = pForm->GetWidget(pFormControl)) {
Lei Zhang94919f72018-07-12 21:16:30 +0000323 if (number != pWidget->GetBorderWidth()) {
324 pWidget->SetBorderWidth(number);
325 bSet = true;
326 }
327 }
328 }
329 if (bSet)
330 UpdateFormField(pFormFillEnv, pFormField, true, true, true);
331 } else {
332 if (nControlIndex >= pFormField->CountControls())
333 return;
334 if (CPDF_FormControl* pFormControl =
335 pFormField->GetControl(nControlIndex)) {
Lei Zhang073ecf42018-10-11 16:56:00 +0000336 if (CPDFSDK_Widget* pWidget = pForm->GetWidget(pFormControl)) {
Lei Zhang94919f72018-07-12 21:16:30 +0000337 if (number != pWidget->GetBorderWidth()) {
338 pWidget->SetBorderWidth(number);
339 UpdateFormControl(pFormFillEnv, pFormControl, true, true, true);
340 }
341 }
342 }
343 }
344 }
345}
346
347void SetRect(CPDFSDK_FormFillEnvironment* pFormFillEnv,
348 const WideString& swFieldName,
349 int nControlIndex,
350 const CFX_FloatRect& rect) {
Lei Zhang073ecf42018-10-11 16:56:00 +0000351 CPDFSDK_InteractiveForm* pForm = pFormFillEnv->GetInteractiveForm();
Lei Zhang94919f72018-07-12 21:16:30 +0000352 std::vector<CPDF_FormField*> FieldArray =
353 GetFormFieldsForName(pFormFillEnv, swFieldName);
354 for (CPDF_FormField* pFormField : FieldArray) {
355 if (nControlIndex < 0) {
356 bool bSet = false;
357 for (int i = 0, sz = pFormField->CountControls(); i < sz; ++i) {
358 CPDF_FormControl* pFormControl = pFormField->GetControl(i);
359 ASSERT(pFormControl);
360
Lei Zhang073ecf42018-10-11 16:56:00 +0000361 if (CPDFSDK_Widget* pWidget = pForm->GetWidget(pFormControl)) {
Lei Zhang94919f72018-07-12 21:16:30 +0000362 CFX_FloatRect crRect = rect;
363
364 CPDF_Page* pPDFPage = pWidget->GetPDFPage();
365 crRect.Intersect(pPDFPage->GetBBox());
366
367 if (!crRect.IsEmpty()) {
368 CFX_FloatRect rcOld = pWidget->GetRect();
369 if (crRect.left != rcOld.left || crRect.right != rcOld.right ||
370 crRect.top != rcOld.top || crRect.bottom != rcOld.bottom) {
371 pWidget->SetRect(crRect);
372 bSet = true;
373 }
374 }
375 }
376 }
377
378 if (bSet)
379 UpdateFormField(pFormFillEnv, pFormField, true, true, true);
380
381 continue;
382 }
383
384 if (nControlIndex >= pFormField->CountControls())
385 return;
386 if (CPDF_FormControl* pFormControl =
387 pFormField->GetControl(nControlIndex)) {
Lei Zhang073ecf42018-10-11 16:56:00 +0000388 if (CPDFSDK_Widget* pWidget = pForm->GetWidget(pFormControl)) {
Lei Zhang94919f72018-07-12 21:16:30 +0000389 CFX_FloatRect crRect = rect;
390 CPDF_Page* pPDFPage = pWidget->GetPDFPage();
391 crRect.Intersect(pPDFPage->GetBBox());
392 if (!crRect.IsEmpty()) {
393 CFX_FloatRect rcOld = pWidget->GetRect();
394 if (crRect.left != rcOld.left || crRect.right != rcOld.right ||
395 crRect.top != rcOld.top || crRect.bottom != rcOld.bottom) {
396 pWidget->SetRect(crRect);
397 UpdateFormControl(pFormFillEnv, pFormControl, true, true, true);
398 }
399 }
400 }
401 }
402 }
403}
404
405void SetValue(CPDFSDK_FormFillEnvironment* pFormFillEnv,
406 const WideString& swFieldName,
407 int nControlIndex,
408 const std::vector<WideString>& strArray) {
409 ASSERT(pFormFillEnv);
410 if (strArray.empty())
411 return;
412
413 std::vector<CPDF_FormField*> FieldArray =
414 GetFormFieldsForName(pFormFillEnv, swFieldName);
415
416 for (CPDF_FormField* pFormField : FieldArray) {
417 if (pFormField->GetFullName().Compare(swFieldName) != 0)
418 continue;
419
420 switch (pFormField->GetFieldType()) {
421 case FormFieldType::kTextField:
422 case FormFieldType::kComboBox:
423 if (pFormField->GetValue() != strArray[0]) {
Tom Sepezb2e6b4c2018-08-16 20:53:58 +0000424 pFormField->SetValue(strArray[0], NotificationOption::kNotify);
Lei Zhang94919f72018-07-12 21:16:30 +0000425 UpdateFormField(pFormFillEnv, pFormField, true, false, true);
426 }
427 break;
428 case FormFieldType::kCheckBox:
429 case FormFieldType::kRadioButton:
430 if (pFormField->GetValue() != strArray[0]) {
Tom Sepezb2e6b4c2018-08-16 20:53:58 +0000431 pFormField->SetValue(strArray[0], NotificationOption::kNotify);
Lei Zhang94919f72018-07-12 21:16:30 +0000432 UpdateFormField(pFormFillEnv, pFormField, true, false, true);
433 }
434 break;
435 case FormFieldType::kListBox: {
436 bool bModified = false;
437 for (const auto& str : strArray) {
438 if (!pFormField->IsItemSelected(pFormField->FindOption(str))) {
439 bModified = true;
440 break;
441 }
442 }
443 if (bModified) {
Tom Sepezb2e6b4c2018-08-16 20:53:58 +0000444 pFormField->ClearSelection(NotificationOption::kNotify);
Lei Zhang94919f72018-07-12 21:16:30 +0000445 for (const auto& str : strArray) {
446 int index = pFormField->FindOption(str);
447 if (!pFormField->IsItemSelected(index))
Tom Sepezb2e6b4c2018-08-16 20:53:58 +0000448 pFormField->SetItemSelection(index, true,
449 NotificationOption::kNotify);
Lei Zhang94919f72018-07-12 21:16:30 +0000450 }
451 UpdateFormField(pFormFillEnv, pFormField, true, false, true);
452 }
453 break;
454 }
455 default:
456 break;
457 }
458 }
Lei Zhang83f2d702018-07-12 19:07:40 +0000459}
460
tonikitoo7c05a7a2016-08-17 11:08:46 -0700461} // namespace
462
Dan Sinclairc94a7932017-10-26 16:48:57 -0400463const JSPropertySpec CJS_Field::PropertySpecs[] = {
Tom Sepez4d5b8c52017-02-21 15:17:07 -0800464 {"alignment", get_alignment_static, set_alignment_static},
dan sinclaircbe23db2017-10-19 14:29:33 -0400465 {"borderStyle", get_border_style_static, set_border_style_static},
466 {"buttonAlignX", get_button_align_x_static, set_button_align_x_static},
467 {"buttonAlignY", get_button_align_y_static, set_button_align_y_static},
468 {"buttonFitBounds", get_button_fit_bounds_static,
469 set_button_fit_bounds_static},
470 {"buttonPosition", get_button_position_static, set_button_position_static},
471 {"buttonScaleHow", get_button_scale_how_static,
472 set_button_scale_how_static},
473 {"buttonScaleWhen", get_button_scale_when_static,
474 set_button_scale_when_static},
475 {"calcOrderIndex", get_calc_order_index_static,
476 set_calc_order_index_static},
477 {"charLimit", get_char_limit_static, set_char_limit_static},
Tom Sepez4d5b8c52017-02-21 15:17:07 -0800478 {"comb", get_comb_static, set_comb_static},
dan sinclaircbe23db2017-10-19 14:29:33 -0400479 {"commitOnSelChange", get_commit_on_sel_change_static,
480 set_commit_on_sel_change_static},
481 {"currentValueIndices", get_current_value_indices_static,
482 set_current_value_indices_static},
483 {"defaultStyle", get_default_style_static, set_default_style_static},
484 {"defaultValue", get_default_value_static, set_default_value_static},
485 {"doNotScroll", get_do_not_scroll_static, set_do_not_scroll_static},
486 {"doNotSpellCheck", get_do_not_spell_check_static,
487 set_do_not_spell_check_static},
Tom Sepez4d5b8c52017-02-21 15:17:07 -0800488 {"delay", get_delay_static, set_delay_static},
489 {"display", get_display_static, set_display_static},
490 {"doc", get_doc_static, set_doc_static},
491 {"editable", get_editable_static, set_editable_static},
dan sinclaircbe23db2017-10-19 14:29:33 -0400492 {"exportValues", get_export_values_static, set_export_values_static},
Tom Sepez4d5b8c52017-02-21 15:17:07 -0800493 {"hidden", get_hidden_static, set_hidden_static},
dan sinclaircbe23db2017-10-19 14:29:33 -0400494 {"fileSelect", get_file_select_static, set_file_select_static},
495 {"fillColor", get_fill_color_static, set_fill_color_static},
496 {"lineWidth", get_line_width_static, set_line_width_static},
Tom Sepez4d5b8c52017-02-21 15:17:07 -0800497 {"highlight", get_highlight_static, set_highlight_static},
498 {"multiline", get_multiline_static, set_multiline_static},
dan sinclaircbe23db2017-10-19 14:29:33 -0400499 {"multipleSelection", get_multiple_selection_static,
500 set_multiple_selection_static},
Tom Sepez4d5b8c52017-02-21 15:17:07 -0800501 {"name", get_name_static, set_name_static},
dan sinclaircbe23db2017-10-19 14:29:33 -0400502 {"numItems", get_num_items_static, set_num_items_static},
Tom Sepez4d5b8c52017-02-21 15:17:07 -0800503 {"page", get_page_static, set_page_static},
504 {"password", get_password_static, set_password_static},
505 {"print", get_print_static, set_print_static},
dan sinclaircbe23db2017-10-19 14:29:33 -0400506 {"radiosInUnison", get_radios_in_unison_static,
507 set_radios_in_unison_static},
Tom Sepez4d5b8c52017-02-21 15:17:07 -0800508 {"readonly", get_readonly_static, set_readonly_static},
509 {"rect", get_rect_static, set_rect_static},
510 {"required", get_required_static, set_required_static},
dan sinclaircbe23db2017-10-19 14:29:33 -0400511 {"richText", get_rich_text_static, set_rich_text_static},
512 {"richValue", get_rich_value_static, set_rich_value_static},
Tom Sepez4d5b8c52017-02-21 15:17:07 -0800513 {"rotation", get_rotation_static, set_rotation_static},
dan sinclaircbe23db2017-10-19 14:29:33 -0400514 {"strokeColor", get_stroke_color_static, set_stroke_color_static},
Tom Sepez4d5b8c52017-02-21 15:17:07 -0800515 {"style", get_style_static, set_style_static},
dan sinclaircbe23db2017-10-19 14:29:33 -0400516 {"submitName", get_submit_name_static, set_submit_name_static},
517 {"textColor", get_text_color_static, set_text_color_static},
518 {"textFont", get_text_font_static, set_text_font_static},
519 {"textSize", get_text_size_static, set_text_size_static},
Tom Sepez4d5b8c52017-02-21 15:17:07 -0800520 {"type", get_type_static, set_type_static},
dan sinclaircbe23db2017-10-19 14:29:33 -0400521 {"userName", get_user_name_static, set_user_name_static},
Tom Sepez4d5b8c52017-02-21 15:17:07 -0800522 {"value", get_value_static, set_value_static},
dan sinclaircbe23db2017-10-19 14:29:33 -0400523 {"valueAsString", get_value_as_string_static, set_value_as_string_static},
Dan Sinclair909fa2d2017-12-12 01:53:28 +0000524 {"source", get_source_static, set_source_static}};
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700525
Dan Sinclairc94a7932017-10-26 16:48:57 -0400526const JSMethodSpec CJS_Field::MethodSpecs[] = {
Tom Sepez9b99b632017-02-21 15:05:57 -0800527 {"browseForFileToSubmit", browseForFileToSubmit_static},
528 {"buttonGetCaption", buttonGetCaption_static},
529 {"buttonGetIcon", buttonGetIcon_static},
530 {"buttonImportIcon", buttonImportIcon_static},
531 {"buttonSetCaption", buttonSetCaption_static},
532 {"buttonSetIcon", buttonSetIcon_static},
533 {"checkThisBox", checkThisBox_static},
534 {"clearItems", clearItems_static},
535 {"defaultIsChecked", defaultIsChecked_static},
536 {"deleteItemAt", deleteItemAt_static},
537 {"getArray", getArray_static},
538 {"getItemAt", getItemAt_static},
539 {"getLock", getLock_static},
540 {"insertItemAt", insertItemAt_static},
541 {"isBoxChecked", isBoxChecked_static},
542 {"isDefaultChecked", isDefaultChecked_static},
543 {"setAction", setAction_static},
544 {"setFocus", setFocus_static},
545 {"setItems", setItems_static},
546 {"setLock", setLock_static},
547 {"signatureGetModifications", signatureGetModifications_static},
548 {"signatureGetSeedValue", signatureGetSeedValue_static},
549 {"signatureInfo", signatureInfo_static},
550 {"signatureSetSeedValue", signatureSetSeedValue_static},
551 {"signatureSign", signatureSign_static},
Dan Sinclair909fa2d2017-12-12 01:53:28 +0000552 {"signatureValidate", signatureValidate_static}};
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700553
Dan Sinclairef299532017-10-26 16:48:30 -0400554int CJS_Field::ObjDefnID = -1;
Dan Sinclairf7435522018-02-05 22:27:22 +0000555const char CJS_Field::kName[] = "Field";
Dan Sinclair89d26c82017-10-26 12:21:28 -0400556
Dan Sinclairef299532017-10-26 16:48:30 -0400557// static
558int CJS_Field::GetObjDefnID() {
559 return ObjDefnID;
560}
561
562// static
Dan Sinclairbef4d3e2017-10-26 16:49:38 -0400563void CJS_Field::DefineJSObjects(CFXJS_Engine* pEngine) {
Dan Sinclairf7435522018-02-05 22:27:22 +0000564 ObjDefnID = pEngine->DefineObj(CJS_Field::kName, FXJSOBJTYPE_DYNAMIC,
Dan Sinclair998fee32018-02-05 21:43:19 +0000565 JSConstructor<CJS_Field>, JSDestructor);
Tom Sepez8b4ddeb2018-06-11 15:55:17 +0000566 DefineProps(pEngine, ObjDefnID, PropertySpecs);
567 DefineMethods(pEngine, ObjDefnID, MethodSpecs);
Dan Sinclair89d26c82017-10-26 12:21:28 -0400568}
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700569
Tom Sepez36aae4f2018-06-04 19:44:37 +0000570CJS_Field::CJS_Field(v8::Local<v8::Object> pObject, CJS_Runtime* pRuntime)
571 : CJS_Object(pObject, pRuntime) {}
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700572
Dan Sinclairf7435522018-02-05 22:27:22 +0000573CJS_Field::~CJS_Field() = default;
574
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700575// note: iControlNo = -1, means not a widget.
Dan Sinclairf7435522018-02-05 22:27:22 +0000576void CJS_Field::ParseFieldName(const std::wstring& strFieldNameParsed,
577 std::wstring& strFieldName,
578 int& iControlNo) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700579 int iStart = strFieldNameParsed.find_last_of(L'.');
580 if (iStart == -1) {
581 strFieldName = strFieldNameParsed;
582 iControlNo = -1;
583 return;
584 }
585 std::wstring suffixal = strFieldNameParsed.substr(iStart + 1);
586 iControlNo = FXSYS_wtoi(suffixal.c_str());
587 if (iControlNo == 0) {
weilidb444d22016-06-02 15:48:15 -0700588 int iSpaceStart;
589 while ((iSpaceStart = suffixal.find_last_of(L" ")) != -1) {
590 suffixal.erase(iSpaceStart, 1);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700591 }
592
593 if (suffixal.compare(L"0") != 0) {
594 strFieldName = strFieldNameParsed;
595 iControlNo = -1;
596 return;
597 }
598 }
599 strFieldName = strFieldNameParsed.substr(0, iStart);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700600}
601
Dan Sinclairf7435522018-02-05 22:27:22 +0000602bool CJS_Field::AttachField(CJS_Document* pDocument,
603 const WideString& csFieldName) {
Tom Sepez2cbae732018-06-26 15:11:28 +0000604 m_pJSDoc.Reset(pDocument);
dsinclair82e17672016-10-11 12:38:01 -0700605 m_pFormFillEnv.Reset(pDocument->GetFormFillEnv());
dsinclair7cbe68e2016-10-12 11:56:23 -0700606 m_bCanSet = m_pFormFillEnv->GetPermissions(FPDFPERM_FILL_FORM) ||
607 m_pFormFillEnv->GetPermissions(FPDFPERM_ANNOT_FORM) ||
608 m_pFormFillEnv->GetPermissions(FPDFPERM_MODIFY);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700609
Lei Zhang073ecf42018-10-11 16:56:00 +0000610 CPDFSDK_InteractiveForm* pRDForm = m_pFormFillEnv->GetInteractiveForm();
611 CPDF_InteractiveForm* pForm = pRDForm->GetInteractiveForm();
Ryan Harrison275e2602017-09-18 14:23:18 -0400612 WideString swFieldNameTemp = csFieldName;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700613 swFieldNameTemp.Replace(L"..", L".");
614
Lei Zhang073ecf42018-10-11 16:56:00 +0000615 if (pForm->CountFields(swFieldNameTemp) <= 0) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700616 std::wstring strFieldName;
617 int iControlNo = -1;
618 ParseFieldName(swFieldNameTemp.c_str(), strFieldName, iControlNo);
619 if (iControlNo == -1)
tsepez4cf55152016-11-02 14:37:54 -0700620 return false;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700621
622 m_FieldName = strFieldName.c_str();
623 m_nFormControlIndex = iControlNo;
tsepez4cf55152016-11-02 14:37:54 -0700624 return true;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700625 }
626
627 m_FieldName = swFieldNameTemp;
628 m_nFormControlIndex = -1;
629
tsepez4cf55152016-11-02 14:37:54 -0700630 return true;
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700631}
632
Lei Zhang18915232018-07-12 20:53:40 +0000633std::vector<CPDF_FormField*> CJS_Field::GetFormFields() const {
Lei Zhang94919f72018-07-12 21:16:30 +0000634 return GetFormFieldsForName(m_pFormFillEnv.Get(), m_FieldName);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700635}
636
Lei Zhang4c7ad662018-07-12 20:29:40 +0000637CPDF_FormField* CJS_Field::GetFirstFormField() const {
Lei Zhang18915232018-07-12 20:53:40 +0000638 std::vector<CPDF_FormField*> fields = GetFormFields();
Lei Zhang4c7ad662018-07-12 20:29:40 +0000639 return fields.empty() ? nullptr : fields[0];
640}
641
Dan Sinclairf7435522018-02-05 22:27:22 +0000642bool CJS_Field::ValueIsOccur(CPDF_FormField* pFormField,
Lei Zhang18915232018-07-12 20:53:40 +0000643 WideString csOptLabel) const {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700644 for (int i = 0, sz = pFormField->CountOptions(); i < sz; i++) {
645 if (csOptLabel.Compare(pFormField->GetOptionLabel(i)) == 0)
tsepez4cf55152016-11-02 14:37:54 -0700646 return true;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700647 }
648
tsepez4cf55152016-11-02 14:37:54 -0700649 return false;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700650}
651
Dan Sinclairf7435522018-02-05 22:27:22 +0000652CPDF_FormControl* CJS_Field::GetSmartFieldControl(CPDF_FormField* pFormField) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700653 if (!pFormField->CountControls() ||
654 m_nFormControlIndex >= pFormField->CountControls())
thestig1cd352e2016-06-07 17:53:06 -0700655 return nullptr;
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700656 if (m_nFormControlIndex < 0)
657 return pFormField->GetControl(0);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700658 return pFormField->GetControl(m_nFormControlIndex);
659}
660
Tom Sepez3a6d0582018-08-17 19:28:52 +0000661CJS_Result CJS_Field::get_alignment(CJS_Runtime* pRuntime) {
dsinclair3a7741a2016-10-11 10:39:49 -0700662 ASSERT(m_pFormFillEnv);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700663
Lei Zhang4c7ad662018-07-12 20:29:40 +0000664 CPDF_FormField* pFormField = GetFirstFormField();
665 if (!pFormField)
Tom Sepez3a6d0582018-08-17 19:28:52 +0000666 return CJS_Result::Failure(JSMessage::kBadObjectError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700667
Ryan Harrison9baf31f2018-01-12 18:36:30 +0000668 if (pFormField->GetFieldType() != FormFieldType::kTextField)
Tom Sepez3a6d0582018-08-17 19:28:52 +0000669 return CJS_Result::Failure(JSMessage::kObjectTypeError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700670
dan sinclair646634b2017-10-19 14:30:28 -0400671 CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
672 if (!pFormControl)
Tom Sepez3a6d0582018-08-17 19:28:52 +0000673 return CJS_Result::Failure(JSMessage::kBadObjectError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700674
dan sinclair646634b2017-10-19 14:30:28 -0400675 switch (pFormControl->GetControlAlignment()) {
dan sinclair646634b2017-10-19 14:30:28 -0400676 case 0:
Tom Sepez3a6d0582018-08-17 19:28:52 +0000677 return CJS_Result::Success(pRuntime->NewString(L"left"));
Dan Sinclair8f524d62017-10-25 13:30:31 -0400678 case 1:
Tom Sepez3a6d0582018-08-17 19:28:52 +0000679 return CJS_Result::Success(pRuntime->NewString(L"center"));
dan sinclair646634b2017-10-19 14:30:28 -0400680 case 2:
Tom Sepez3a6d0582018-08-17 19:28:52 +0000681 return CJS_Result::Success(pRuntime->NewString(L"right"));
dan sinclair646634b2017-10-19 14:30:28 -0400682 }
Tom Sepez3a6d0582018-08-17 19:28:52 +0000683 return CJS_Result::Success(pRuntime->NewString(L""));
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700684}
685
Tom Sepez3a6d0582018-08-17 19:28:52 +0000686CJS_Result CJS_Field::set_alignment(CJS_Runtime* pRuntime,
Dan Sinclairf7435522018-02-05 22:27:22 +0000687 v8::Local<v8::Value> vp) {
dan sinclaircbe23db2017-10-19 14:29:33 -0400688 ASSERT(m_pFormFillEnv);
Tom Sepez16999822018-06-08 18:23:05 +0000689 if (!m_bCanSet)
Tom Sepez3a6d0582018-08-17 19:28:52 +0000690 return CJS_Result::Failure(JSMessage::kReadOnlyError);
Tom Sepez20736f72018-08-17 16:44:50 +0000691
Tom Sepez3a6d0582018-08-17 19:28:52 +0000692 return CJS_Result::Success();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700693}
694
Tom Sepez3a6d0582018-08-17 19:28:52 +0000695CJS_Result CJS_Field::get_border_style(CJS_Runtime* pRuntime) {
dsinclair3a7741a2016-10-11 10:39:49 -0700696 ASSERT(m_pFormFillEnv);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700697
Lei Zhang4c7ad662018-07-12 20:29:40 +0000698 CPDF_FormField* pFormField = GetFirstFormField();
699 if (!pFormField)
Tom Sepez3a6d0582018-08-17 19:28:52 +0000700 return CJS_Result::Failure(JSMessage::kBadObjectError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700701
Lei Zhang073ecf42018-10-11 16:56:00 +0000702 CPDFSDK_Widget* pWidget = m_pFormFillEnv->GetInteractiveForm()->GetWidget(
Lei Zhang7db136a2018-10-10 21:34:17 +0000703 GetSmartFieldControl(pFormField));
dan sinclaircbe23db2017-10-19 14:29:33 -0400704 if (!pWidget)
Tom Sepez3a6d0582018-08-17 19:28:52 +0000705 return CJS_Result::Failure(JSMessage::kBadObjectError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700706
dan sinclaircbe23db2017-10-19 14:29:33 -0400707 switch (pWidget->GetBorderStyle()) {
708 case BorderStyle::SOLID:
Tom Sepez3a6d0582018-08-17 19:28:52 +0000709 return CJS_Result::Success(pRuntime->NewString(L"solid"));
dan sinclaircbe23db2017-10-19 14:29:33 -0400710 case BorderStyle::DASH:
Tom Sepez3a6d0582018-08-17 19:28:52 +0000711 return CJS_Result::Success(pRuntime->NewString(L"dashed"));
dan sinclaircbe23db2017-10-19 14:29:33 -0400712 case BorderStyle::BEVELED:
Tom Sepez3a6d0582018-08-17 19:28:52 +0000713 return CJS_Result::Success(pRuntime->NewString(L"beveled"));
dan sinclaircbe23db2017-10-19 14:29:33 -0400714 case BorderStyle::INSET:
Tom Sepez3a6d0582018-08-17 19:28:52 +0000715 return CJS_Result::Success(pRuntime->NewString(L"inset"));
dan sinclaircbe23db2017-10-19 14:29:33 -0400716 case BorderStyle::UNDERLINE:
Tom Sepez3a6d0582018-08-17 19:28:52 +0000717 return CJS_Result::Success(pRuntime->NewString(L"underline"));
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700718 }
Tom Sepez3a6d0582018-08-17 19:28:52 +0000719 return CJS_Result::Success(pRuntime->NewString(L""));
dan sinclaircbe23db2017-10-19 14:29:33 -0400720}
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700721
Tom Sepez3a6d0582018-08-17 19:28:52 +0000722CJS_Result CJS_Field::set_border_style(CJS_Runtime* pRuntime,
Dan Sinclairf7435522018-02-05 22:27:22 +0000723 v8::Local<v8::Value> vp) {
dan sinclaircbe23db2017-10-19 14:29:33 -0400724 ASSERT(m_pFormFillEnv);
dan sinclaircbe23db2017-10-19 14:29:33 -0400725 if (!m_bCanSet)
Tom Sepez3a6d0582018-08-17 19:28:52 +0000726 return CJS_Result::Failure(JSMessage::kReadOnlyError);
dan sinclaircbe23db2017-10-19 14:29:33 -0400727
Tom Sepez34dab072018-08-08 17:49:02 +0000728 ByteString byte_str = pRuntime->ToWideString(vp).ToDefANSI();
dan sinclaircbe23db2017-10-19 14:29:33 -0400729 if (m_bDelay) {
Dan Sinclair1b2a18e2017-10-24 13:56:29 -0400730 AddDelay_String(FP_BORDERSTYLE, byte_str);
dan sinclaircbe23db2017-10-19 14:29:33 -0400731 } else {
Lei Zhang94919f72018-07-12 21:16:30 +0000732 SetBorderStyle(m_pFormFillEnv.Get(), m_FieldName, m_nFormControlIndex,
733 byte_str);
dan sinclaircbe23db2017-10-19 14:29:33 -0400734 }
Tom Sepez3a6d0582018-08-17 19:28:52 +0000735 return CJS_Result::Success();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700736}
737
Tom Sepez3a6d0582018-08-17 19:28:52 +0000738CJS_Result CJS_Field::get_button_align_x(CJS_Runtime* pRuntime) {
dsinclair3a7741a2016-10-11 10:39:49 -0700739 ASSERT(m_pFormFillEnv);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700740
Lei Zhang4c7ad662018-07-12 20:29:40 +0000741 CPDF_FormField* pFormField = GetFirstFormField();
742 if (!pFormField)
Tom Sepez3a6d0582018-08-17 19:28:52 +0000743 return CJS_Result::Failure(JSMessage::kBadObjectError);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700744
Ryan Harrison9baf31f2018-01-12 18:36:30 +0000745 if (pFormField->GetFieldType() != FormFieldType::kPushButton)
Tom Sepez3a6d0582018-08-17 19:28:52 +0000746 return CJS_Result::Failure(JSMessage::kObjectTypeError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700747
dan sinclaircbe23db2017-10-19 14:29:33 -0400748 CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
749 if (!pFormControl)
Tom Sepez3a6d0582018-08-17 19:28:52 +0000750 return CJS_Result::Failure(JSMessage::kBadObjectError);
dan sinclaircbe23db2017-10-19 14:29:33 -0400751
752 CPDF_IconFit IconFit = pFormControl->GetIconFit();
Lei Zhang65b8db92018-10-10 17:50:31 +0000753 CFX_PointF pos = IconFit.GetIconBottomLeftPosition();
754 return CJS_Result::Success(pRuntime->NewNumber(static_cast<int32_t>(pos.x)));
dan sinclaircbe23db2017-10-19 14:29:33 -0400755}
756
Tom Sepez3a6d0582018-08-17 19:28:52 +0000757CJS_Result CJS_Field::set_button_align_x(CJS_Runtime* pRuntime,
Dan Sinclairf7435522018-02-05 22:27:22 +0000758 v8::Local<v8::Value> vp) {
dan sinclaircbe23db2017-10-19 14:29:33 -0400759 ASSERT(m_pFormFillEnv);
Tom Sepez16999822018-06-08 18:23:05 +0000760 if (!m_bCanSet)
Tom Sepez3a6d0582018-08-17 19:28:52 +0000761 return CJS_Result::Failure(JSMessage::kReadOnlyError);
762 return CJS_Result::Success();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700763}
764
Tom Sepez3a6d0582018-08-17 19:28:52 +0000765CJS_Result CJS_Field::get_button_align_y(CJS_Runtime* pRuntime) {
dsinclair3a7741a2016-10-11 10:39:49 -0700766 ASSERT(m_pFormFillEnv);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700767
Lei Zhang4c7ad662018-07-12 20:29:40 +0000768 CPDF_FormField* pFormField = GetFirstFormField();
769 if (!pFormField)
Tom Sepez3a6d0582018-08-17 19:28:52 +0000770 return CJS_Result::Failure(JSMessage::kBadObjectError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700771
Ryan Harrison9baf31f2018-01-12 18:36:30 +0000772 if (pFormField->GetFieldType() != FormFieldType::kPushButton)
Tom Sepez3a6d0582018-08-17 19:28:52 +0000773 return CJS_Result::Failure(JSMessage::kObjectTypeError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700774
dan sinclaircbe23db2017-10-19 14:29:33 -0400775 CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
776 if (!pFormControl)
Tom Sepez3a6d0582018-08-17 19:28:52 +0000777 return CJS_Result::Failure(JSMessage::kBadObjectError);
dan sinclaircbe23db2017-10-19 14:29:33 -0400778
779 CPDF_IconFit IconFit = pFormControl->GetIconFit();
Lei Zhang65b8db92018-10-10 17:50:31 +0000780 CFX_PointF pos = IconFit.GetIconBottomLeftPosition();
781 return CJS_Result::Success(pRuntime->NewNumber(static_cast<int32_t>(pos.y)));
dan sinclaircbe23db2017-10-19 14:29:33 -0400782}
783
Tom Sepez3a6d0582018-08-17 19:28:52 +0000784CJS_Result CJS_Field::set_button_align_y(CJS_Runtime* pRuntime,
Dan Sinclairf7435522018-02-05 22:27:22 +0000785 v8::Local<v8::Value> vp) {
dan sinclaircbe23db2017-10-19 14:29:33 -0400786 ASSERT(m_pFormFillEnv);
Tom Sepez16999822018-06-08 18:23:05 +0000787 if (!m_bCanSet)
Tom Sepez3a6d0582018-08-17 19:28:52 +0000788 return CJS_Result::Failure(JSMessage::kReadOnlyError);
789 return CJS_Result::Success();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700790}
791
Tom Sepez3a6d0582018-08-17 19:28:52 +0000792CJS_Result CJS_Field::get_button_fit_bounds(CJS_Runtime* pRuntime) {
dsinclair3a7741a2016-10-11 10:39:49 -0700793 ASSERT(m_pFormFillEnv);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700794
Lei Zhang4c7ad662018-07-12 20:29:40 +0000795 CPDF_FormField* pFormField = GetFirstFormField();
796 if (!pFormField)
Tom Sepez3a6d0582018-08-17 19:28:52 +0000797 return CJS_Result::Failure(JSMessage::kBadObjectError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700798
Ryan Harrison9baf31f2018-01-12 18:36:30 +0000799 if (pFormField->GetFieldType() != FormFieldType::kPushButton)
Tom Sepez3a6d0582018-08-17 19:28:52 +0000800 return CJS_Result::Failure(JSMessage::kObjectTypeError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700801
dan sinclair646634b2017-10-19 14:30:28 -0400802 CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
803 if (!pFormControl)
Tom Sepez3a6d0582018-08-17 19:28:52 +0000804 return CJS_Result::Failure(JSMessage::kBadObjectError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700805
Tom Sepez3a6d0582018-08-17 19:28:52 +0000806 return CJS_Result::Success(
Dan Sinclair8f524d62017-10-25 13:30:31 -0400807 pRuntime->NewBoolean(pFormControl->GetIconFit().GetFittingBounds()));
dan sinclaircbe23db2017-10-19 14:29:33 -0400808}
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700809
Tom Sepez3a6d0582018-08-17 19:28:52 +0000810CJS_Result CJS_Field::set_button_fit_bounds(CJS_Runtime* pRuntime,
Dan Sinclairf7435522018-02-05 22:27:22 +0000811 v8::Local<v8::Value> vp) {
dan sinclaircbe23db2017-10-19 14:29:33 -0400812 ASSERT(m_pFormFillEnv);
Tom Sepez16999822018-06-08 18:23:05 +0000813 if (!m_bCanSet)
Tom Sepez3a6d0582018-08-17 19:28:52 +0000814 return CJS_Result::Failure(JSMessage::kReadOnlyError);
815 return CJS_Result::Success();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700816}
817
Tom Sepez3a6d0582018-08-17 19:28:52 +0000818CJS_Result CJS_Field::get_button_position(CJS_Runtime* pRuntime) {
dsinclair3a7741a2016-10-11 10:39:49 -0700819 ASSERT(m_pFormFillEnv);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700820
Lei Zhang4c7ad662018-07-12 20:29:40 +0000821 CPDF_FormField* pFormField = GetFirstFormField();
822 if (!pFormField)
Tom Sepez3a6d0582018-08-17 19:28:52 +0000823 return CJS_Result::Failure(JSMessage::kBadObjectError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700824
Ryan Harrison9baf31f2018-01-12 18:36:30 +0000825 if (pFormField->GetFieldType() != FormFieldType::kPushButton)
Tom Sepez3a6d0582018-08-17 19:28:52 +0000826 return CJS_Result::Failure(JSMessage::kObjectTypeError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700827
dan sinclair646634b2017-10-19 14:30:28 -0400828 CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
829 if (!pFormControl)
Tom Sepez3a6d0582018-08-17 19:28:52 +0000830 return CJS_Result::Failure(JSMessage::kBadObjectError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700831
Tom Sepez3a6d0582018-08-17 19:28:52 +0000832 return CJS_Result::Success(
Tom Sepez20736f72018-08-17 16:44:50 +0000833 pRuntime->NewNumber(pFormControl->GetTextPosition()));
dan sinclaircbe23db2017-10-19 14:29:33 -0400834}
835
Tom Sepez3a6d0582018-08-17 19:28:52 +0000836CJS_Result CJS_Field::set_button_position(CJS_Runtime* pRuntime,
Dan Sinclairf7435522018-02-05 22:27:22 +0000837 v8::Local<v8::Value> vp) {
dan sinclaircbe23db2017-10-19 14:29:33 -0400838 ASSERT(m_pFormFillEnv);
Tom Sepez16999822018-06-08 18:23:05 +0000839 if (!m_bCanSet)
Tom Sepez3a6d0582018-08-17 19:28:52 +0000840 return CJS_Result::Failure(JSMessage::kBadObjectError);
841 return CJS_Result::Success();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700842}
843
Tom Sepez3a6d0582018-08-17 19:28:52 +0000844CJS_Result CJS_Field::get_button_scale_how(CJS_Runtime* pRuntime) {
dsinclair3a7741a2016-10-11 10:39:49 -0700845 ASSERT(m_pFormFillEnv);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700846
Lei Zhang4c7ad662018-07-12 20:29:40 +0000847 CPDF_FormField* pFormField = GetFirstFormField();
848 if (!pFormField)
Tom Sepez3a6d0582018-08-17 19:28:52 +0000849 return CJS_Result::Failure(JSMessage::kBadObjectError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700850
Ryan Harrison9baf31f2018-01-12 18:36:30 +0000851 if (pFormField->GetFieldType() != FormFieldType::kPushButton)
Tom Sepez3a6d0582018-08-17 19:28:52 +0000852 return CJS_Result::Failure(JSMessage::kObjectTypeError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700853
dan sinclair646634b2017-10-19 14:30:28 -0400854 CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
855 if (!pFormControl)
Tom Sepez3a6d0582018-08-17 19:28:52 +0000856 return CJS_Result::Failure(JSMessage::kBadObjectError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700857
Tom Sepez3a6d0582018-08-17 19:28:52 +0000858 return CJS_Result::Success(pRuntime->NewBoolean(
Dan Sinclaire4974922017-10-24 09:36:16 -0400859 pFormControl->GetIconFit().IsProportionalScale() ? 0 : 1));
dan sinclaircbe23db2017-10-19 14:29:33 -0400860}
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700861
Tom Sepez3a6d0582018-08-17 19:28:52 +0000862CJS_Result CJS_Field::set_button_scale_how(CJS_Runtime* pRuntime,
Dan Sinclairf7435522018-02-05 22:27:22 +0000863 v8::Local<v8::Value> vp) {
dan sinclaircbe23db2017-10-19 14:29:33 -0400864 ASSERT(m_pFormFillEnv);
Tom Sepez16999822018-06-08 18:23:05 +0000865 if (!m_bCanSet)
Tom Sepez3a6d0582018-08-17 19:28:52 +0000866 return CJS_Result::Failure(JSMessage::kReadOnlyError);
867 return CJS_Result::Success();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700868}
869
Tom Sepez3a6d0582018-08-17 19:28:52 +0000870CJS_Result CJS_Field::get_button_scale_when(CJS_Runtime* pRuntime) {
dsinclair3a7741a2016-10-11 10:39:49 -0700871 ASSERT(m_pFormFillEnv);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700872
Lei Zhang4c7ad662018-07-12 20:29:40 +0000873 CPDF_FormField* pFormField = GetFirstFormField();
874 if (!pFormField)
Tom Sepez3a6d0582018-08-17 19:28:52 +0000875 return CJS_Result::Failure(JSMessage::kBadObjectError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700876
Ryan Harrison9baf31f2018-01-12 18:36:30 +0000877 if (pFormField->GetFieldType() != FormFieldType::kPushButton)
Tom Sepez3a6d0582018-08-17 19:28:52 +0000878 return CJS_Result::Failure(JSMessage::kObjectTypeError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700879
dan sinclair646634b2017-10-19 14:30:28 -0400880 CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
881 if (!pFormControl)
Tom Sepez3a6d0582018-08-17 19:28:52 +0000882 return CJS_Result::Failure(JSMessage::kBadObjectError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700883
dan sinclair646634b2017-10-19 14:30:28 -0400884 CPDF_IconFit IconFit = pFormControl->GetIconFit();
885 int ScaleM = IconFit.GetScaleMethod();
886 switch (ScaleM) {
887 case CPDF_IconFit::Always:
Tom Sepez3a6d0582018-08-17 19:28:52 +0000888 return CJS_Result::Success(
Dan Sinclair8f524d62017-10-25 13:30:31 -0400889 pRuntime->NewNumber(static_cast<int32_t>(CPDF_IconFit::Always)));
dan sinclair646634b2017-10-19 14:30:28 -0400890 case CPDF_IconFit::Bigger:
Tom Sepez3a6d0582018-08-17 19:28:52 +0000891 return CJS_Result::Success(
Dan Sinclair8f524d62017-10-25 13:30:31 -0400892 pRuntime->NewNumber(static_cast<int32_t>(CPDF_IconFit::Bigger)));
dan sinclair646634b2017-10-19 14:30:28 -0400893 case CPDF_IconFit::Never:
Tom Sepez3a6d0582018-08-17 19:28:52 +0000894 return CJS_Result::Success(
Dan Sinclair8f524d62017-10-25 13:30:31 -0400895 pRuntime->NewNumber(static_cast<int32_t>(CPDF_IconFit::Never)));
dan sinclair646634b2017-10-19 14:30:28 -0400896 case CPDF_IconFit::Smaller:
Tom Sepez3a6d0582018-08-17 19:28:52 +0000897 return CJS_Result::Success(
Dan Sinclair8f524d62017-10-25 13:30:31 -0400898 pRuntime->NewNumber(static_cast<int32_t>(CPDF_IconFit::Smaller)));
dan sinclair646634b2017-10-19 14:30:28 -0400899 }
Tom Sepez3a6d0582018-08-17 19:28:52 +0000900 return CJS_Result::Success();
dan sinclaircbe23db2017-10-19 14:29:33 -0400901}
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700902
Tom Sepez3a6d0582018-08-17 19:28:52 +0000903CJS_Result CJS_Field::set_button_scale_when(CJS_Runtime* pRuntime,
Dan Sinclairf7435522018-02-05 22:27:22 +0000904 v8::Local<v8::Value> vp) {
dan sinclaircbe23db2017-10-19 14:29:33 -0400905 ASSERT(m_pFormFillEnv);
Tom Sepez16999822018-06-08 18:23:05 +0000906 if (!m_bCanSet)
Tom Sepez3a6d0582018-08-17 19:28:52 +0000907 return CJS_Result::Failure(JSMessage::kReadOnlyError);
908 return CJS_Result::Success();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700909}
910
Tom Sepez3a6d0582018-08-17 19:28:52 +0000911CJS_Result CJS_Field::get_calc_order_index(CJS_Runtime* pRuntime) {
dsinclair3a7741a2016-10-11 10:39:49 -0700912 ASSERT(m_pFormFillEnv);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700913
Lei Zhang4c7ad662018-07-12 20:29:40 +0000914 CPDF_FormField* pFormField = GetFirstFormField();
915 if (!pFormField)
Tom Sepez3a6d0582018-08-17 19:28:52 +0000916 return CJS_Result::Failure(JSMessage::kBadObjectError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700917
Lei Zhang83f2d702018-07-12 19:07:40 +0000918 if (!IsComboBoxOrTextField(pFormField))
Tom Sepez3a6d0582018-08-17 19:28:52 +0000919 return CJS_Result::Failure(JSMessage::kObjectTypeError);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700920
Lei Zhang073ecf42018-10-11 16:56:00 +0000921 CPDFSDK_InteractiveForm* pRDForm = m_pFormFillEnv->GetInteractiveForm();
922 CPDF_InteractiveForm* pForm = pRDForm->GetInteractiveForm();
923 return CJS_Result::Success(pRuntime->NewNumber(
924 static_cast<int32_t>(pForm->FindFieldInCalculationOrder(pFormField))));
dan sinclaircbe23db2017-10-19 14:29:33 -0400925}
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700926
Tom Sepez3a6d0582018-08-17 19:28:52 +0000927CJS_Result CJS_Field::set_calc_order_index(CJS_Runtime* pRuntime,
Dan Sinclairf7435522018-02-05 22:27:22 +0000928 v8::Local<v8::Value> vp) {
dan sinclaircbe23db2017-10-19 14:29:33 -0400929 ASSERT(m_pFormFillEnv);
Tom Sepez16999822018-06-08 18:23:05 +0000930 if (!m_bCanSet)
Tom Sepez3a6d0582018-08-17 19:28:52 +0000931 return CJS_Result::Failure(JSMessage::kReadOnlyError);
932 return CJS_Result::Success();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700933}
934
Tom Sepez3a6d0582018-08-17 19:28:52 +0000935CJS_Result CJS_Field::get_char_limit(CJS_Runtime* pRuntime) {
dsinclair3a7741a2016-10-11 10:39:49 -0700936 ASSERT(m_pFormFillEnv);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700937
Lei Zhang4c7ad662018-07-12 20:29:40 +0000938 CPDF_FormField* pFormField = GetFirstFormField();
939 if (!pFormField)
Tom Sepez3a6d0582018-08-17 19:28:52 +0000940 return CJS_Result::Failure(JSMessage::kBadObjectError);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700941
Ryan Harrison9baf31f2018-01-12 18:36:30 +0000942 if (pFormField->GetFieldType() != FormFieldType::kTextField)
Tom Sepez3a6d0582018-08-17 19:28:52 +0000943 return CJS_Result::Failure(JSMessage::kObjectTypeError);
944 return CJS_Result::Success(
Dan Sinclair8f524d62017-10-25 13:30:31 -0400945 pRuntime->NewNumber(static_cast<int32_t>(pFormField->GetMaxLen())));
dan sinclaircbe23db2017-10-19 14:29:33 -0400946}
947
Tom Sepez3a6d0582018-08-17 19:28:52 +0000948CJS_Result CJS_Field::set_char_limit(CJS_Runtime* pRuntime,
Dan Sinclairf7435522018-02-05 22:27:22 +0000949 v8::Local<v8::Value> vp) {
dan sinclaircbe23db2017-10-19 14:29:33 -0400950 ASSERT(m_pFormFillEnv);
Tom Sepez16999822018-06-08 18:23:05 +0000951 if (!m_bCanSet)
Tom Sepez3a6d0582018-08-17 19:28:52 +0000952 return CJS_Result::Failure(JSMessage::kReadOnlyError);
953 return CJS_Result::Success();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700954}
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700955
Tom Sepez3a6d0582018-08-17 19:28:52 +0000956CJS_Result CJS_Field::get_comb(CJS_Runtime* pRuntime) {
dsinclair3a7741a2016-10-11 10:39:49 -0700957 ASSERT(m_pFormFillEnv);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700958
Lei Zhang4c7ad662018-07-12 20:29:40 +0000959 CPDF_FormField* pFormField = GetFirstFormField();
960 if (!pFormField)
Tom Sepez3a6d0582018-08-17 19:28:52 +0000961 return CJS_Result::Failure(JSMessage::kBadObjectError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700962
Ryan Harrison9baf31f2018-01-12 18:36:30 +0000963 if (pFormField->GetFieldType() != FormFieldType::kTextField)
Tom Sepez3a6d0582018-08-17 19:28:52 +0000964 return CJS_Result::Failure(JSMessage::kObjectTypeError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700965
Tom Sepez3a6d0582018-08-17 19:28:52 +0000966 return CJS_Result::Success(
Dan Sinclaire4974922017-10-24 09:36:16 -0400967 pRuntime->NewBoolean(!!(pFormField->GetFieldFlags() & FIELDFLAG_COMB)));
dan sinclaircbe23db2017-10-19 14:29:33 -0400968}
969
Tom Sepez3a6d0582018-08-17 19:28:52 +0000970CJS_Result CJS_Field::set_comb(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp) {
dan sinclaircbe23db2017-10-19 14:29:33 -0400971 ASSERT(m_pFormFillEnv);
Tom Sepez16999822018-06-08 18:23:05 +0000972 if (!m_bCanSet)
Tom Sepez3a6d0582018-08-17 19:28:52 +0000973 return CJS_Result::Failure(JSMessage::kReadOnlyError);
974 return CJS_Result::Success();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700975}
976
Tom Sepez3a6d0582018-08-17 19:28:52 +0000977CJS_Result CJS_Field::get_commit_on_sel_change(CJS_Runtime* pRuntime) {
dsinclair3a7741a2016-10-11 10:39:49 -0700978 ASSERT(m_pFormFillEnv);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700979
Lei Zhang4c7ad662018-07-12 20:29:40 +0000980 CPDF_FormField* pFormField = GetFirstFormField();
981 if (!pFormField)
Tom Sepez3a6d0582018-08-17 19:28:52 +0000982 return CJS_Result::Failure(JSMessage::kBadObjectError);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700983
Lei Zhang83f2d702018-07-12 19:07:40 +0000984 if (!IsComboBoxOrListBox(pFormField))
Tom Sepez3a6d0582018-08-17 19:28:52 +0000985 return CJS_Result::Failure(JSMessage::kObjectTypeError);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700986
Tom Sepez3a6d0582018-08-17 19:28:52 +0000987 return CJS_Result::Success(pRuntime->NewBoolean(
Dan Sinclaire4974922017-10-24 09:36:16 -0400988 !!(pFormField->GetFieldFlags() & FIELDFLAG_COMMITONSELCHANGE)));
dan sinclaircbe23db2017-10-19 14:29:33 -0400989}
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700990
Tom Sepez3a6d0582018-08-17 19:28:52 +0000991CJS_Result CJS_Field::set_commit_on_sel_change(CJS_Runtime* pRuntime,
Dan Sinclairf7435522018-02-05 22:27:22 +0000992 v8::Local<v8::Value> vp) {
dan sinclaircbe23db2017-10-19 14:29:33 -0400993 ASSERT(m_pFormFillEnv);
Tom Sepez16999822018-06-08 18:23:05 +0000994 if (!m_bCanSet)
Tom Sepez3a6d0582018-08-17 19:28:52 +0000995 return CJS_Result::Failure(JSMessage::kReadOnlyError);
996 return CJS_Result::Success();
Nico Weber9d8ec5a2015-08-04 13:00:21 -0700997}
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -0700998
Tom Sepez3a6d0582018-08-17 19:28:52 +0000999CJS_Result CJS_Field::get_current_value_indices(CJS_Runtime* pRuntime) {
Lei Zhang4c7ad662018-07-12 20:29:40 +00001000 CPDF_FormField* pFormField = GetFirstFormField();
1001 if (!pFormField)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001002 return CJS_Result::Failure(JSMessage::kBadObjectError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001003
Lei Zhang83f2d702018-07-12 19:07:40 +00001004 if (!IsComboBoxOrListBox(pFormField))
Tom Sepez3a6d0582018-08-17 19:28:52 +00001005 return CJS_Result::Failure(JSMessage::kObjectTypeError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001006
dan sinclaircbe23db2017-10-19 14:29:33 -04001007 int count = pFormField->CountSelectedItems();
Dan Sinclair8f524d62017-10-25 13:30:31 -04001008 if (count <= 0)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001009 return CJS_Result::Success(pRuntime->NewNumber(-1));
Dan Sinclair8f524d62017-10-25 13:30:31 -04001010 if (count == 1)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001011 return CJS_Result::Success(
Tom Sepez20736f72018-08-17 16:44:50 +00001012 pRuntime->NewNumber(pFormField->GetSelectedIndex(0)));
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001013
Dan Sinclair3a1ba8e2017-10-26 09:28:59 -04001014 v8::Local<v8::Array> SelArray = pRuntime->NewArray();
1015 for (int i = 0; i < count; i++) {
1016 pRuntime->PutArrayElement(
1017 SelArray, i, pRuntime->NewNumber(pFormField->GetSelectedIndex(i)));
dan sinclaircbe23db2017-10-19 14:29:33 -04001018 }
Dan Sinclair3a1ba8e2017-10-26 09:28:59 -04001019 if (SelArray.IsEmpty())
Tom Sepez3a6d0582018-08-17 19:28:52 +00001020 return CJS_Result::Success(pRuntime->NewArray());
1021 return CJS_Result::Success(SelArray);
dan sinclaircbe23db2017-10-19 14:29:33 -04001022}
1023
Tom Sepez3a6d0582018-08-17 19:28:52 +00001024CJS_Result CJS_Field::set_current_value_indices(CJS_Runtime* pRuntime,
Dan Sinclairf7435522018-02-05 22:27:22 +00001025 v8::Local<v8::Value> vp) {
dan sinclaircbe23db2017-10-19 14:29:33 -04001026 if (!m_bCanSet)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001027 return CJS_Result::Failure(JSMessage::kReadOnlyError);
dan sinclaircbe23db2017-10-19 14:29:33 -04001028
1029 std::vector<uint32_t> array;
dan sinclair80435cb2017-10-24 21:40:24 -04001030 if (vp->IsNumber()) {
1031 array.push_back(pRuntime->ToInt32(vp));
1032 } else if (!vp.IsEmpty() && vp->IsArray()) {
Dan Sinclair3a1ba8e2017-10-26 09:28:59 -04001033 v8::Local<v8::Array> SelArray = pRuntime->ToArray(vp);
1034 for (size_t i = 0; i < pRuntime->GetArrayLength(SelArray); i++) {
1035 array.push_back(
1036 pRuntime->ToInt32(pRuntime->GetArrayElement(SelArray, i)));
1037 }
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001038 }
1039
dan sinclaircbe23db2017-10-19 14:29:33 -04001040 if (m_bDelay) {
1041 AddDelay_WordArray(FP_CURRENTVALUEINDICES, array);
1042 } else {
Lei Zhang94919f72018-07-12 21:16:30 +00001043 SetCurrentValueIndices(m_pFormFillEnv.Get(), m_FieldName,
1044 m_nFormControlIndex, array);
dan sinclaircbe23db2017-10-19 14:29:33 -04001045 }
Tom Sepez3a6d0582018-08-17 19:28:52 +00001046 return CJS_Result::Success();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001047}
1048
Tom Sepez3a6d0582018-08-17 19:28:52 +00001049CJS_Result CJS_Field::get_default_style(CJS_Runtime* pRuntime) {
1050 return CJS_Result::Failure(JSMessage::kNotSupportedError);
dan sinclaircbe23db2017-10-19 14:29:33 -04001051}
1052
Tom Sepez3a6d0582018-08-17 19:28:52 +00001053CJS_Result CJS_Field::set_default_style(CJS_Runtime* pRuntime,
Dan Sinclairf7435522018-02-05 22:27:22 +00001054 v8::Local<v8::Value> vp) {
Tom Sepez3a6d0582018-08-17 19:28:52 +00001055 return CJS_Result::Failure(JSMessage::kNotSupportedError);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001056}
1057
Tom Sepez3a6d0582018-08-17 19:28:52 +00001058CJS_Result CJS_Field::get_default_value(CJS_Runtime* pRuntime) {
dsinclair3a7741a2016-10-11 10:39:49 -07001059 ASSERT(m_pFormFillEnv);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07001060
Lei Zhang4c7ad662018-07-12 20:29:40 +00001061 CPDF_FormField* pFormField = GetFirstFormField();
1062 if (!pFormField)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001063 return CJS_Result::Failure(JSMessage::kBadObjectError);
Dan Sinclair8f524d62017-10-25 13:30:31 -04001064
Ryan Harrison9baf31f2018-01-12 18:36:30 +00001065 if (pFormField->GetFieldType() == FormFieldType::kPushButton ||
1066 pFormField->GetFieldType() == FormFieldType::kSignature) {
Tom Sepez3a6d0582018-08-17 19:28:52 +00001067 return CJS_Result::Failure(JSMessage::kObjectTypeError);
Dan Sinclair8f524d62017-10-25 13:30:31 -04001068 }
1069
Tom Sepez3a6d0582018-08-17 19:28:52 +00001070 return CJS_Result::Success(
Tom Sepezb6b01cb2018-06-20 16:10:13 +00001071 pRuntime->NewString(pFormField->GetDefaultValue().AsStringView()));
Dan Sinclair8f524d62017-10-25 13:30:31 -04001072}
1073
Tom Sepez3a6d0582018-08-17 19:28:52 +00001074CJS_Result CJS_Field::set_default_value(CJS_Runtime* pRuntime,
Dan Sinclairf7435522018-02-05 22:27:22 +00001075 v8::Local<v8::Value> vp) {
Dan Sinclair8f524d62017-10-25 13:30:31 -04001076 ASSERT(m_pFormFillEnv);
Tom Sepez16999822018-06-08 18:23:05 +00001077 if (!m_bCanSet)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001078 return CJS_Result::Failure(JSMessage::kReadOnlyError);
1079 return CJS_Result::Success();
Dan Sinclair8f524d62017-10-25 13:30:31 -04001080}
1081
Tom Sepez3a6d0582018-08-17 19:28:52 +00001082CJS_Result CJS_Field::get_do_not_scroll(CJS_Runtime* pRuntime) {
Dan Sinclair8f524d62017-10-25 13:30:31 -04001083 ASSERT(m_pFormFillEnv);
1084
Lei Zhang4c7ad662018-07-12 20:29:40 +00001085 CPDF_FormField* pFormField = GetFirstFormField();
1086 if (!pFormField)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001087 return CJS_Result::Failure(JSMessage::kBadObjectError);
dan sinclaircbe23db2017-10-19 14:29:33 -04001088
Ryan Harrison9baf31f2018-01-12 18:36:30 +00001089 if (pFormField->GetFieldType() != FormFieldType::kTextField)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001090 return CJS_Result::Failure(JSMessage::kObjectTypeError);
dan sinclaircbe23db2017-10-19 14:29:33 -04001091
Tom Sepez3a6d0582018-08-17 19:28:52 +00001092 return CJS_Result::Success(pRuntime->NewBoolean(
Dan Sinclaire4974922017-10-24 09:36:16 -04001093 !!(pFormField->GetFieldFlags() & FIELDFLAG_DONOTSCROLL)));
dan sinclaircbe23db2017-10-19 14:29:33 -04001094}
1095
Tom Sepez3a6d0582018-08-17 19:28:52 +00001096CJS_Result CJS_Field::set_do_not_scroll(CJS_Runtime* pRuntime,
Dan Sinclairf7435522018-02-05 22:27:22 +00001097 v8::Local<v8::Value> vp) {
dan sinclaircbe23db2017-10-19 14:29:33 -04001098 ASSERT(m_pFormFillEnv);
Tom Sepez16999822018-06-08 18:23:05 +00001099 if (!m_bCanSet)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001100 return CJS_Result::Failure(JSMessage::kReadOnlyError);
1101 return CJS_Result::Success();
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001102}
1103
Tom Sepez3a6d0582018-08-17 19:28:52 +00001104CJS_Result CJS_Field::get_do_not_spell_check(CJS_Runtime* pRuntime) {
dsinclair3a7741a2016-10-11 10:39:49 -07001105 ASSERT(m_pFormFillEnv);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001106
Lei Zhang4c7ad662018-07-12 20:29:40 +00001107 CPDF_FormField* pFormField = GetFirstFormField();
1108 if (!pFormField)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001109 return CJS_Result::Failure(JSMessage::kBadObjectError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001110
Lei Zhang83f2d702018-07-12 19:07:40 +00001111 if (!IsComboBoxOrTextField(pFormField))
Tom Sepez3a6d0582018-08-17 19:28:52 +00001112 return CJS_Result::Failure(JSMessage::kObjectTypeError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001113
Tom Sepez3a6d0582018-08-17 19:28:52 +00001114 return CJS_Result::Success(pRuntime->NewBoolean(
Dan Sinclaire4974922017-10-24 09:36:16 -04001115 !!(pFormField->GetFieldFlags() & FIELDFLAG_DONOTSPELLCHECK)));
dan sinclaircbe23db2017-10-19 14:29:33 -04001116}
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001117
Tom Sepez3a6d0582018-08-17 19:28:52 +00001118CJS_Result CJS_Field::set_do_not_spell_check(CJS_Runtime* pRuntime,
Dan Sinclairf7435522018-02-05 22:27:22 +00001119 v8::Local<v8::Value> vp) {
dan sinclaircbe23db2017-10-19 14:29:33 -04001120 ASSERT(m_pFormFillEnv);
Tom Sepez16999822018-06-08 18:23:05 +00001121 if (!m_bCanSet)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001122 return CJS_Result::Failure(JSMessage::kReadOnlyError);
1123 return CJS_Result::Success();
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001124}
1125
Dan Sinclairf7435522018-02-05 22:27:22 +00001126void CJS_Field::SetDelay(bool bDelay) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001127 m_bDelay = bDelay;
1128
dan sinclaircbe23db2017-10-19 14:29:33 -04001129 if (m_bDelay)
1130 return;
dan sinclaircbe23db2017-10-19 14:29:33 -04001131 if (m_pJSDoc)
1132 m_pJSDoc->DoFieldDelay(m_FieldName, m_nFormControlIndex);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001133}
1134
Tom Sepez3a6d0582018-08-17 19:28:52 +00001135CJS_Result CJS_Field::get_delay(CJS_Runtime* pRuntime) {
1136 return CJS_Result::Success(pRuntime->NewBoolean(m_bDelay));
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001137}
1138
Tom Sepez3a6d0582018-08-17 19:28:52 +00001139CJS_Result CJS_Field::set_delay(CJS_Runtime* pRuntime,
Dan Sinclairf7435522018-02-05 22:27:22 +00001140 v8::Local<v8::Value> vp) {
dan sinclaircbe23db2017-10-19 14:29:33 -04001141 if (!m_bCanSet)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001142 return CJS_Result::Failure(JSMessage::kReadOnlyError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001143
dan sinclair80435cb2017-10-24 21:40:24 -04001144 SetDelay(pRuntime->ToBoolean(vp));
Tom Sepez3a6d0582018-08-17 19:28:52 +00001145 return CJS_Result::Success();
dan sinclaircbe23db2017-10-19 14:29:33 -04001146}
1147
Tom Sepez3a6d0582018-08-17 19:28:52 +00001148CJS_Result CJS_Field::get_display(CJS_Runtime* pRuntime) {
Lei Zhang4c7ad662018-07-12 20:29:40 +00001149 CPDF_FormField* pFormField = GetFirstFormField();
1150 if (!pFormField)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001151 return CJS_Result::Failure(JSMessage::kBadObjectError);
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001152
Lei Zhang073ecf42018-10-11 16:56:00 +00001153 CPDFSDK_InteractiveForm* pForm = m_pFormFillEnv->GetInteractiveForm();
1154 CPDFSDK_Widget* pWidget = pForm->GetWidget(GetSmartFieldControl(pFormField));
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001155 if (!pWidget)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001156 return CJS_Result::Failure(JSMessage::kBadObjectError);
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001157
1158 uint32_t dwFlag = pWidget->GetFlags();
Dan Sinclair8f524d62017-10-25 13:30:31 -04001159 if (ANNOTFLAG_INVISIBLE & dwFlag || ANNOTFLAG_HIDDEN & dwFlag)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001160 return CJS_Result::Success(pRuntime->NewNumber(1));
Dan Sinclair8f524d62017-10-25 13:30:31 -04001161
dan sinclaircbe23db2017-10-19 14:29:33 -04001162 if (ANNOTFLAG_PRINT & dwFlag) {
1163 if (ANNOTFLAG_NOVIEW & dwFlag)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001164 return CJS_Result::Success(pRuntime->NewNumber(3));
1165 return CJS_Result::Success(pRuntime->NewNumber(0));
dan sinclaircbe23db2017-10-19 14:29:33 -04001166 }
Tom Sepez3a6d0582018-08-17 19:28:52 +00001167 return CJS_Result::Success(pRuntime->NewNumber(2));
dan sinclaircbe23db2017-10-19 14:29:33 -04001168}
1169
Tom Sepez3a6d0582018-08-17 19:28:52 +00001170CJS_Result CJS_Field::set_display(CJS_Runtime* pRuntime,
Dan Sinclairf7435522018-02-05 22:27:22 +00001171 v8::Local<v8::Value> vp) {
dan sinclaircbe23db2017-10-19 14:29:33 -04001172 if (!m_bCanSet)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001173 return CJS_Result::Failure(JSMessage::kReadOnlyError);
dan sinclaircbe23db2017-10-19 14:29:33 -04001174
1175 if (m_bDelay) {
dan sinclair80435cb2017-10-24 21:40:24 -04001176 AddDelay_Int(FP_DISPLAY, pRuntime->ToInt32(vp));
dan sinclaircbe23db2017-10-19 14:29:33 -04001177 } else {
Lei Zhang94919f72018-07-12 21:16:30 +00001178 SetDisplay(m_pFormFillEnv.Get(), m_FieldName, m_nFormControlIndex,
1179 pRuntime->ToInt32(vp));
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001180 }
Tom Sepez3a6d0582018-08-17 19:28:52 +00001181 return CJS_Result::Success();
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001182}
1183
Tom Sepez3a6d0582018-08-17 19:28:52 +00001184CJS_Result CJS_Field::get_doc(CJS_Runtime* pRuntime) {
1185 return CJS_Result::Success(m_pJSDoc->ToV8Object());
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001186}
1187
Tom Sepez3a6d0582018-08-17 19:28:52 +00001188CJS_Result CJS_Field::set_doc(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp) {
1189 return CJS_Result::Failure(JSMessage::kNotSupportedError);
dan sinclaircbe23db2017-10-19 14:29:33 -04001190}
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001191
Tom Sepez3a6d0582018-08-17 19:28:52 +00001192CJS_Result CJS_Field::get_editable(CJS_Runtime* pRuntime) {
Lei Zhang4c7ad662018-07-12 20:29:40 +00001193 CPDF_FormField* pFormField = GetFirstFormField();
1194 if (!pFormField)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001195 return CJS_Result::Failure(JSMessage::kBadObjectError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001196
Ryan Harrison9baf31f2018-01-12 18:36:30 +00001197 if (pFormField->GetFieldType() != FormFieldType::kComboBox)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001198 return CJS_Result::Failure(JSMessage::kObjectTypeError);
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001199
Tom Sepez3a6d0582018-08-17 19:28:52 +00001200 return CJS_Result::Success(
Dan Sinclaire4974922017-10-24 09:36:16 -04001201 pRuntime->NewBoolean(!!(pFormField->GetFieldFlags() & FIELDFLAG_EDIT)));
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001202}
1203
Tom Sepez3a6d0582018-08-17 19:28:52 +00001204CJS_Result CJS_Field::set_editable(CJS_Runtime* pRuntime,
Dan Sinclairf7435522018-02-05 22:27:22 +00001205 v8::Local<v8::Value> vp) {
Tom Sepez16999822018-06-08 18:23:05 +00001206 if (!m_bCanSet)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001207 return CJS_Result::Failure(JSMessage::kReadOnlyError);
1208 return CJS_Result::Success();
dan sinclaircbe23db2017-10-19 14:29:33 -04001209}
1210
Tom Sepez3a6d0582018-08-17 19:28:52 +00001211CJS_Result CJS_Field::get_export_values(CJS_Runtime* pRuntime) {
Lei Zhang4c7ad662018-07-12 20:29:40 +00001212 CPDF_FormField* pFormField = GetFirstFormField();
1213 if (!pFormField)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001214 return CJS_Result::Failure(JSMessage::kBadObjectError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001215
Lei Zhangdfa2ac22018-07-12 19:06:50 +00001216 if (!IsCheckBoxOrRadioButton(pFormField))
Tom Sepez3a6d0582018-08-17 19:28:52 +00001217 return CJS_Result::Failure(JSMessage::kObjectTypeError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001218
Dan Sinclair3a1ba8e2017-10-26 09:28:59 -04001219 v8::Local<v8::Array> ExportValuesArray = pRuntime->NewArray();
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001220 if (m_nFormControlIndex < 0) {
1221 for (int i = 0, sz = pFormField->CountControls(); i < sz; i++) {
1222 CPDF_FormControl* pFormControl = pFormField->GetControl(i);
Dan Sinclair3a1ba8e2017-10-26 09:28:59 -04001223 pRuntime->PutArrayElement(
1224 ExportValuesArray, i,
Tom Sepezb6b01cb2018-06-20 16:10:13 +00001225 pRuntime->NewString(pFormControl->GetExportValue().AsStringView()));
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001226 }
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001227 } else {
1228 if (m_nFormControlIndex >= pFormField->CountControls())
Tom Sepez3a6d0582018-08-17 19:28:52 +00001229 return CJS_Result::Failure(JSMessage::kValueError);
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001230
1231 CPDF_FormControl* pFormControl =
1232 pFormField->GetControl(m_nFormControlIndex);
1233 if (!pFormControl)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001234 return CJS_Result::Failure(JSMessage::kBadObjectError);
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001235
Dan Sinclair3a1ba8e2017-10-26 09:28:59 -04001236 pRuntime->PutArrayElement(
1237 ExportValuesArray, 0,
Tom Sepezb6b01cb2018-06-20 16:10:13 +00001238 pRuntime->NewString(pFormControl->GetExportValue().AsStringView()));
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001239 }
Tom Sepez3a6d0582018-08-17 19:28:52 +00001240 return CJS_Result::Success(ExportValuesArray);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001241}
1242
Tom Sepez3a6d0582018-08-17 19:28:52 +00001243CJS_Result CJS_Field::set_export_values(CJS_Runtime* pRuntime,
Dan Sinclairf7435522018-02-05 22:27:22 +00001244 v8::Local<v8::Value> vp) {
Lei Zhang4c7ad662018-07-12 20:29:40 +00001245 CPDF_FormField* pFormField = GetFirstFormField();
1246 if (!pFormField)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001247 return CJS_Result::Failure(JSMessage::kBadObjectError);
dan sinclaircbe23db2017-10-19 14:29:33 -04001248
Lei Zhangdfa2ac22018-07-12 19:06:50 +00001249 if (!IsCheckBoxOrRadioButton(pFormField))
Tom Sepez3a6d0582018-08-17 19:28:52 +00001250 return CJS_Result::Failure(JSMessage::kObjectTypeError);
dan sinclaircbe23db2017-10-19 14:29:33 -04001251
Tom Sepez16999822018-06-08 18:23:05 +00001252 if (!m_bCanSet)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001253 return CJS_Result::Failure(JSMessage::kReadOnlyError);
Tom Sepez16999822018-06-08 18:23:05 +00001254
1255 if (vp.IsEmpty() || !vp->IsArray())
Tom Sepez3a6d0582018-08-17 19:28:52 +00001256 return CJS_Result::Failure(JSMessage::kBadObjectError);
Tom Sepez16999822018-06-08 18:23:05 +00001257
Tom Sepez3a6d0582018-08-17 19:28:52 +00001258 return CJS_Result::Success();
dan sinclaircbe23db2017-10-19 14:29:33 -04001259}
1260
Tom Sepez3a6d0582018-08-17 19:28:52 +00001261CJS_Result CJS_Field::get_file_select(CJS_Runtime* pRuntime) {
Lei Zhang4c7ad662018-07-12 20:29:40 +00001262 CPDF_FormField* pFormField = GetFirstFormField();
1263 if (!pFormField)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001264 return CJS_Result::Failure(JSMessage::kBadObjectError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001265
Ryan Harrison9baf31f2018-01-12 18:36:30 +00001266 if (pFormField->GetFieldType() != FormFieldType::kTextField)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001267 return CJS_Result::Failure(JSMessage::kObjectTypeError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001268
Tom Sepez3a6d0582018-08-17 19:28:52 +00001269 return CJS_Result::Success(pRuntime->NewBoolean(
Dan Sinclaire4974922017-10-24 09:36:16 -04001270 !!(pFormField->GetFieldFlags() & FIELDFLAG_FILESELECT)));
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001271}
1272
Tom Sepez3a6d0582018-08-17 19:28:52 +00001273CJS_Result CJS_Field::set_file_select(CJS_Runtime* pRuntime,
Dan Sinclairf7435522018-02-05 22:27:22 +00001274 v8::Local<v8::Value> vp) {
Lei Zhang4c7ad662018-07-12 20:29:40 +00001275 CPDF_FormField* pFormField = GetFirstFormField();
1276 if (!pFormField)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001277 return CJS_Result::Failure(JSMessage::kBadObjectError);
dan sinclaircbe23db2017-10-19 14:29:33 -04001278
Ryan Harrison9baf31f2018-01-12 18:36:30 +00001279 if (pFormField->GetFieldType() != FormFieldType::kTextField)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001280 return CJS_Result::Failure(JSMessage::kObjectTypeError);
Tom Sepez16999822018-06-08 18:23:05 +00001281
1282 if (!m_bCanSet)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001283 return CJS_Result::Failure(JSMessage::kReadOnlyError);
Tom Sepez16999822018-06-08 18:23:05 +00001284
Tom Sepez3a6d0582018-08-17 19:28:52 +00001285 return CJS_Result::Success();
dan sinclaircbe23db2017-10-19 14:29:33 -04001286}
1287
Tom Sepez3a6d0582018-08-17 19:28:52 +00001288CJS_Result CJS_Field::get_fill_color(CJS_Runtime* pRuntime) {
Lei Zhang4c7ad662018-07-12 20:29:40 +00001289 CPDF_FormField* pFormField = GetFirstFormField();
1290 if (!pFormField)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001291 return CJS_Result::Failure(JSMessage::kBadObjectError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001292
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001293 CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
1294 if (!pFormControl)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001295 return CJS_Result::Failure(JSMessage::kBadObjectError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001296
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001297 int iColorType;
1298 pFormControl->GetBackgroundColor(iColorType);
1299
Dan Sinclair7f55a542017-07-13 14:17:10 -04001300 CFX_Color color;
Dan Sinclair8e7f9322017-10-16 11:35:42 -04001301 if (iColorType == CFX_Color::kTransparent) {
1302 color = CFX_Color(CFX_Color::kTransparent);
1303 } else if (iColorType == CFX_Color::kGray) {
1304 color = CFX_Color(CFX_Color::kGray,
1305 pFormControl->GetOriginalBackgroundColor(0));
1306 } else if (iColorType == CFX_Color::kRGB) {
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001307 color =
Dan Sinclair8e7f9322017-10-16 11:35:42 -04001308 CFX_Color(CFX_Color::kRGB, pFormControl->GetOriginalBackgroundColor(0),
Dan Sinclair7f55a542017-07-13 14:17:10 -04001309 pFormControl->GetOriginalBackgroundColor(1),
1310 pFormControl->GetOriginalBackgroundColor(2));
Dan Sinclair8e7f9322017-10-16 11:35:42 -04001311 } else if (iColorType == CFX_Color::kCMYK) {
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001312 color =
Dan Sinclair8e7f9322017-10-16 11:35:42 -04001313 CFX_Color(CFX_Color::kCMYK, pFormControl->GetOriginalBackgroundColor(0),
Dan Sinclair7f55a542017-07-13 14:17:10 -04001314 pFormControl->GetOriginalBackgroundColor(1),
1315 pFormControl->GetOriginalBackgroundColor(2),
1316 pFormControl->GetOriginalBackgroundColor(3));
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001317 } else {
Tom Sepez3a6d0582018-08-17 19:28:52 +00001318 return CJS_Result::Failure(JSMessage::kValueError);
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001319 }
dan sinclaircbe23db2017-10-19 14:29:33 -04001320
Dan Sinclairf7435522018-02-05 22:27:22 +00001321 v8::Local<v8::Value> array =
1322 CJS_Color::ConvertPWLColorToArray(pRuntime, color);
Dan Sinclair3a1ba8e2017-10-26 09:28:59 -04001323 if (array.IsEmpty())
Tom Sepez3a6d0582018-08-17 19:28:52 +00001324 return CJS_Result::Success(pRuntime->NewArray());
1325 return CJS_Result::Success(array);
dan sinclaircbe23db2017-10-19 14:29:33 -04001326}
1327
Tom Sepez3a6d0582018-08-17 19:28:52 +00001328CJS_Result CJS_Field::set_fill_color(CJS_Runtime* pRuntime,
Dan Sinclairf7435522018-02-05 22:27:22 +00001329 v8::Local<v8::Value> vp) {
Lei Zhang18915232018-07-12 20:53:40 +00001330 std::vector<CPDF_FormField*> FieldArray = GetFormFields();
dan sinclaircbe23db2017-10-19 14:29:33 -04001331 if (FieldArray.empty())
Tom Sepez3a6d0582018-08-17 19:28:52 +00001332 return CJS_Result::Failure(JSMessage::kBadObjectError);
dan sinclaircbe23db2017-10-19 14:29:33 -04001333 if (!m_bCanSet)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001334 return CJS_Result::Failure(JSMessage::kReadOnlyError);
dan sinclair80435cb2017-10-24 21:40:24 -04001335 if (vp.IsEmpty() || !vp->IsArray())
Tom Sepez3a6d0582018-08-17 19:28:52 +00001336 return CJS_Result::Failure(JSMessage::kBadObjectError);
1337 return CJS_Result::Success();
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001338}
1339
Tom Sepez3a6d0582018-08-17 19:28:52 +00001340CJS_Result CJS_Field::get_hidden(CJS_Runtime* pRuntime) {
Lei Zhang4c7ad662018-07-12 20:29:40 +00001341 CPDF_FormField* pFormField = GetFirstFormField();
1342 if (!pFormField)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001343 return CJS_Result::Failure(JSMessage::kBadObjectError);
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001344
Lei Zhang073ecf42018-10-11 16:56:00 +00001345 CPDFSDK_InteractiveForm* pForm = m_pFormFillEnv->GetInteractiveForm();
1346 CPDFSDK_Widget* pWidget = pForm->GetWidget(GetSmartFieldControl(pFormField));
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001347 if (!pWidget)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001348 return CJS_Result::Failure(JSMessage::kBadObjectError);
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001349
1350 uint32_t dwFlags = pWidget->GetFlags();
Tom Sepez3a6d0582018-08-17 19:28:52 +00001351 return CJS_Result::Success(pRuntime->NewBoolean(
Tom Sepez20736f72018-08-17 16:44:50 +00001352 ANNOTFLAG_INVISIBLE & dwFlags || ANNOTFLAG_HIDDEN & dwFlags));
dan sinclaircbe23db2017-10-19 14:29:33 -04001353}
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001354
Tom Sepez3a6d0582018-08-17 19:28:52 +00001355CJS_Result CJS_Field::set_hidden(CJS_Runtime* pRuntime,
Dan Sinclairf7435522018-02-05 22:27:22 +00001356 v8::Local<v8::Value> vp) {
dan sinclaircbe23db2017-10-19 14:29:33 -04001357 if (!m_bCanSet)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001358 return CJS_Result::Failure(JSMessage::kReadOnlyError);
dan sinclaircbe23db2017-10-19 14:29:33 -04001359
1360 if (m_bDelay) {
dan sinclair80435cb2017-10-24 21:40:24 -04001361 AddDelay_Bool(FP_HIDDEN, pRuntime->ToBoolean(vp));
dan sinclaircbe23db2017-10-19 14:29:33 -04001362 } else {
Lei Zhang94919f72018-07-12 21:16:30 +00001363 SetHidden(m_pFormFillEnv.Get(), m_FieldName, m_nFormControlIndex,
1364 pRuntime->ToBoolean(vp));
dan sinclaircbe23db2017-10-19 14:29:33 -04001365 }
Tom Sepez3a6d0582018-08-17 19:28:52 +00001366 return CJS_Result::Success();
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001367}
1368
Tom Sepez3a6d0582018-08-17 19:28:52 +00001369CJS_Result CJS_Field::get_highlight(CJS_Runtime* pRuntime) {
dsinclair3a7741a2016-10-11 10:39:49 -07001370 ASSERT(m_pFormFillEnv);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001371
Lei Zhang4c7ad662018-07-12 20:29:40 +00001372 CPDF_FormField* pFormField = GetFirstFormField();
1373 if (!pFormField)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001374 return CJS_Result::Failure(JSMessage::kBadObjectError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001375
Ryan Harrison9baf31f2018-01-12 18:36:30 +00001376 if (pFormField->GetFieldType() != FormFieldType::kPushButton)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001377 return CJS_Result::Failure(JSMessage::kObjectTypeError);
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001378
1379 CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
1380 if (!pFormControl)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001381 return CJS_Result::Failure(JSMessage::kBadObjectError);
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001382
1383 int eHM = pFormControl->GetHighlightingMode();
1384 switch (eHM) {
1385 case CPDF_FormControl::None:
Tom Sepez3a6d0582018-08-17 19:28:52 +00001386 return CJS_Result::Success(pRuntime->NewString(L"none"));
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001387 case CPDF_FormControl::Push:
Tom Sepez3a6d0582018-08-17 19:28:52 +00001388 return CJS_Result::Success(pRuntime->NewString(L"push"));
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001389 case CPDF_FormControl::Invert:
Tom Sepez3a6d0582018-08-17 19:28:52 +00001390 return CJS_Result::Success(pRuntime->NewString(L"invert"));
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001391 case CPDF_FormControl::Outline:
Tom Sepez3a6d0582018-08-17 19:28:52 +00001392 return CJS_Result::Success(pRuntime->NewString(L"outline"));
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001393 case CPDF_FormControl::Toggle:
Tom Sepez3a6d0582018-08-17 19:28:52 +00001394 return CJS_Result::Success(pRuntime->NewString(L"toggle"));
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001395 }
Tom Sepez3a6d0582018-08-17 19:28:52 +00001396 return CJS_Result::Success();
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001397}
1398
Tom Sepez3a6d0582018-08-17 19:28:52 +00001399CJS_Result CJS_Field::set_highlight(CJS_Runtime* pRuntime,
Dan Sinclairf7435522018-02-05 22:27:22 +00001400 v8::Local<v8::Value> vp) {
dan sinclaircbe23db2017-10-19 14:29:33 -04001401 ASSERT(m_pFormFillEnv);
Tom Sepez16999822018-06-08 18:23:05 +00001402 if (!m_bCanSet)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001403 return CJS_Result::Failure(JSMessage::kReadOnlyError);
1404 return CJS_Result::Success();
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001405}
1406
Tom Sepez3a6d0582018-08-17 19:28:52 +00001407CJS_Result CJS_Field::get_line_width(CJS_Runtime* pRuntime) {
Lei Zhang4c7ad662018-07-12 20:29:40 +00001408 CPDF_FormField* pFormField = GetFirstFormField();
1409 if (!pFormField)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001410 return CJS_Result::Failure(JSMessage::kBadObjectError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001411
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001412 CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
1413 if (!pFormControl)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001414 return CJS_Result::Failure(JSMessage::kBadObjectError);
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001415
Lei Zhang073ecf42018-10-11 16:56:00 +00001416 CPDFSDK_InteractiveForm* pForm = m_pFormFillEnv->GetInteractiveForm();
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001417 if (!pFormField->CountControls())
Tom Sepez3a6d0582018-08-17 19:28:52 +00001418 return CJS_Result::Failure(JSMessage::kBadObjectError);
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001419
Lei Zhang073ecf42018-10-11 16:56:00 +00001420 CPDFSDK_Widget* pWidget = pForm->GetWidget(pFormField->GetControl(0));
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001421 if (!pWidget)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001422 return CJS_Result::Failure(JSMessage::kBadObjectError);
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001423
Tom Sepez3a6d0582018-08-17 19:28:52 +00001424 return CJS_Result::Success(pRuntime->NewNumber(pWidget->GetBorderWidth()));
dan sinclaircbe23db2017-10-19 14:29:33 -04001425}
1426
Tom Sepez3a6d0582018-08-17 19:28:52 +00001427CJS_Result CJS_Field::set_line_width(CJS_Runtime* pRuntime,
Dan Sinclairf7435522018-02-05 22:27:22 +00001428 v8::Local<v8::Value> vp) {
dan sinclaircbe23db2017-10-19 14:29:33 -04001429 if (!m_bCanSet)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001430 return CJS_Result::Failure(JSMessage::kReadOnlyError);
dan sinclaircbe23db2017-10-19 14:29:33 -04001431
1432 if (m_bDelay) {
dan sinclair80435cb2017-10-24 21:40:24 -04001433 AddDelay_Int(FP_LINEWIDTH, pRuntime->ToInt32(vp));
dan sinclaircbe23db2017-10-19 14:29:33 -04001434 } else {
Lei Zhang94919f72018-07-12 21:16:30 +00001435 SetLineWidth(m_pFormFillEnv.Get(), m_FieldName, m_nFormControlIndex,
1436 pRuntime->ToInt32(vp));
dan sinclaircbe23db2017-10-19 14:29:33 -04001437 }
Tom Sepez3a6d0582018-08-17 19:28:52 +00001438 return CJS_Result::Success();
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001439}
1440
Tom Sepez3a6d0582018-08-17 19:28:52 +00001441CJS_Result CJS_Field::get_multiline(CJS_Runtime* pRuntime) {
dsinclair3a7741a2016-10-11 10:39:49 -07001442 ASSERT(m_pFormFillEnv);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001443
Lei Zhang4c7ad662018-07-12 20:29:40 +00001444 CPDF_FormField* pFormField = GetFirstFormField();
1445 if (!pFormField)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001446 return CJS_Result::Failure(JSMessage::kBadObjectError);
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001447
Ryan Harrison9baf31f2018-01-12 18:36:30 +00001448 if (pFormField->GetFieldType() != FormFieldType::kTextField)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001449 return CJS_Result::Failure(JSMessage::kObjectTypeError);
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001450
Tom Sepez3a6d0582018-08-17 19:28:52 +00001451 return CJS_Result::Success(pRuntime->NewBoolean(
Dan Sinclaire4974922017-10-24 09:36:16 -04001452 !!(pFormField->GetFieldFlags() & FIELDFLAG_MULTILINE)));
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001453}
1454
Tom Sepez3a6d0582018-08-17 19:28:52 +00001455CJS_Result CJS_Field::set_multiline(CJS_Runtime* pRuntime,
Dan Sinclairf7435522018-02-05 22:27:22 +00001456 v8::Local<v8::Value> vp) {
dan sinclaircbe23db2017-10-19 14:29:33 -04001457 ASSERT(m_pFormFillEnv);
Tom Sepez16999822018-06-08 18:23:05 +00001458 if (!m_bCanSet)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001459 return CJS_Result::Failure(JSMessage::kReadOnlyError);
1460 return CJS_Result::Success();
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001461}
1462
Tom Sepez3a6d0582018-08-17 19:28:52 +00001463CJS_Result CJS_Field::get_multiple_selection(CJS_Runtime* pRuntime) {
dsinclair3a7741a2016-10-11 10:39:49 -07001464 ASSERT(m_pFormFillEnv);
Lei Zhang4c7ad662018-07-12 20:29:40 +00001465 CPDF_FormField* pFormField = GetFirstFormField();
1466 if (!pFormField)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001467 return CJS_Result::Failure(JSMessage::kBadObjectError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001468
Ryan Harrison9baf31f2018-01-12 18:36:30 +00001469 if (pFormField->GetFieldType() != FormFieldType::kListBox)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001470 return CJS_Result::Failure(JSMessage::kObjectTypeError);
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001471
Tom Sepez3a6d0582018-08-17 19:28:52 +00001472 return CJS_Result::Success(pRuntime->NewBoolean(
Dan Sinclaire4974922017-10-24 09:36:16 -04001473 !!(pFormField->GetFieldFlags() & FIELDFLAG_MULTISELECT)));
dan sinclaircbe23db2017-10-19 14:29:33 -04001474}
1475
Tom Sepez3a6d0582018-08-17 19:28:52 +00001476CJS_Result CJS_Field::set_multiple_selection(CJS_Runtime* pRuntime,
Dan Sinclairf7435522018-02-05 22:27:22 +00001477 v8::Local<v8::Value> vp) {
dan sinclaircbe23db2017-10-19 14:29:33 -04001478 ASSERT(m_pFormFillEnv);
Tom Sepez16999822018-06-08 18:23:05 +00001479 if (!m_bCanSet)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001480 return CJS_Result::Failure(JSMessage::kReadOnlyError);
1481 return CJS_Result::Success();
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001482}
1483
Tom Sepez3a6d0582018-08-17 19:28:52 +00001484CJS_Result CJS_Field::get_name(CJS_Runtime* pRuntime) {
Lei Zhang18915232018-07-12 20:53:40 +00001485 std::vector<CPDF_FormField*> FieldArray = GetFormFields();
Lei Zhangd88a3642015-11-10 09:38:57 -08001486 if (FieldArray.empty())
Tom Sepez3a6d0582018-08-17 19:28:52 +00001487 return CJS_Result::Failure(JSMessage::kBadObjectError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001488
Tom Sepez3a6d0582018-08-17 19:28:52 +00001489 return CJS_Result::Success(pRuntime->NewString(m_FieldName.AsStringView()));
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001490}
1491
Tom Sepez3a6d0582018-08-17 19:28:52 +00001492CJS_Result CJS_Field::set_name(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp) {
1493 return CJS_Result::Failure(JSMessage::kNotSupportedError);
dan sinclaircbe23db2017-10-19 14:29:33 -04001494}
Tom Sepez67fd5df2015-10-08 12:24:19 -07001495
Tom Sepez3a6d0582018-08-17 19:28:52 +00001496CJS_Result CJS_Field::get_num_items(CJS_Runtime* pRuntime) {
Lei Zhang4c7ad662018-07-12 20:29:40 +00001497 CPDF_FormField* pFormField = GetFirstFormField();
1498 if (!pFormField)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001499 return CJS_Result::Failure(JSMessage::kBadObjectError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001500
Lei Zhang83f2d702018-07-12 19:07:40 +00001501 if (!IsComboBoxOrListBox(pFormField))
Tom Sepez3a6d0582018-08-17 19:28:52 +00001502 return CJS_Result::Failure(JSMessage::kObjectTypeError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001503
Tom Sepez3a6d0582018-08-17 19:28:52 +00001504 return CJS_Result::Success(pRuntime->NewNumber(pFormField->CountOptions()));
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001505}
1506
Tom Sepez3a6d0582018-08-17 19:28:52 +00001507CJS_Result CJS_Field::set_num_items(CJS_Runtime* pRuntime,
Dan Sinclairf7435522018-02-05 22:27:22 +00001508 v8::Local<v8::Value> vp) {
Tom Sepez3a6d0582018-08-17 19:28:52 +00001509 return CJS_Result::Failure(JSMessage::kNotSupportedError);
dan sinclaircbe23db2017-10-19 14:29:33 -04001510}
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001511
Tom Sepez3a6d0582018-08-17 19:28:52 +00001512CJS_Result CJS_Field::get_page(CJS_Runtime* pRuntime) {
Lei Zhang4c7ad662018-07-12 20:29:40 +00001513 CPDF_FormField* pFormField = GetFirstFormField();
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001514 if (!pFormField)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001515 return CJS_Result::Failure(JSMessage::kBadObjectError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001516
tsepez8fa82792017-01-11 09:32:33 -08001517 std::vector<CPDFSDK_Annot::ObservedPtr> widgets;
Lei Zhang073ecf42018-10-11 16:56:00 +00001518 m_pFormFillEnv->GetInteractiveForm()->GetWidgets(pFormField, &widgets);
Dan Sinclair8f524d62017-10-25 13:30:31 -04001519 if (widgets.empty())
Tom Sepez3a6d0582018-08-17 19:28:52 +00001520 return CJS_Result::Success(pRuntime->NewNumber(-1));
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001521
Dan Sinclair3a1ba8e2017-10-26 09:28:59 -04001522 v8::Local<v8::Array> PageArray = pRuntime->NewArray();
tsepez8fa82792017-01-11 09:32:33 -08001523 int i = 0;
1524 for (const auto& pObserved : widgets) {
Dan Sinclair8f524d62017-10-25 13:30:31 -04001525 if (!pObserved)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001526 return CJS_Result::Failure(JSMessage::kBadObjectError);
tsepez8fa82792017-01-11 09:32:33 -08001527
Tom Sepez4ef943b2018-07-26 19:06:06 +00001528 auto* pWidget = ToCPDFSDKWidget(pObserved.Get());
tsepez8fa82792017-01-11 09:32:33 -08001529 CPDFSDK_PageView* pPageView = pWidget->GetPageView();
Lei Zhangd88a3642015-11-10 09:38:57 -08001530 if (!pPageView)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001531 return CJS_Result::Failure(JSMessage::kBadObjectError);
Lei Zhangd88a3642015-11-10 09:38:57 -08001532
Dan Sinclair3a1ba8e2017-10-26 09:28:59 -04001533 pRuntime->PutArrayElement(
1534 PageArray, i,
dan sinclair80435cb2017-10-24 21:40:24 -04001535 pRuntime->NewNumber(static_cast<int32_t>(pPageView->GetPageIndex())));
tsepez8fa82792017-01-11 09:32:33 -08001536 ++i;
Lei Zhangd88a3642015-11-10 09:38:57 -08001537 }
Tom Sepez3a6d0582018-08-17 19:28:52 +00001538 return CJS_Result::Success(PageArray);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001539}
1540
Tom Sepez3a6d0582018-08-17 19:28:52 +00001541CJS_Result CJS_Field::set_page(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp) {
1542 return CJS_Result::Failure(JSMessage::kReadOnlyError);
dan sinclaircbe23db2017-10-19 14:29:33 -04001543}
1544
Tom Sepez3a6d0582018-08-17 19:28:52 +00001545CJS_Result CJS_Field::get_password(CJS_Runtime* pRuntime) {
dsinclair3a7741a2016-10-11 10:39:49 -07001546 ASSERT(m_pFormFillEnv);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001547
Lei Zhang4c7ad662018-07-12 20:29:40 +00001548 CPDF_FormField* pFormField = GetFirstFormField();
1549 if (!pFormField)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001550 return CJS_Result::Failure(JSMessage::kBadObjectError);
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001551
Ryan Harrison9baf31f2018-01-12 18:36:30 +00001552 if (pFormField->GetFieldType() != FormFieldType::kTextField)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001553 return CJS_Result::Failure(JSMessage::kObjectTypeError);
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001554
Tom Sepez3a6d0582018-08-17 19:28:52 +00001555 return CJS_Result::Success(pRuntime->NewBoolean(
Dan Sinclaire4974922017-10-24 09:36:16 -04001556 !!(pFormField->GetFieldFlags() & FIELDFLAG_PASSWORD)));
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001557}
1558
Tom Sepez3a6d0582018-08-17 19:28:52 +00001559CJS_Result CJS_Field::set_password(CJS_Runtime* pRuntime,
Dan Sinclairf7435522018-02-05 22:27:22 +00001560 v8::Local<v8::Value> vp) {
dan sinclaircbe23db2017-10-19 14:29:33 -04001561 ASSERT(m_pFormFillEnv);
Tom Sepez16999822018-06-08 18:23:05 +00001562 if (!m_bCanSet)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001563 return CJS_Result::Failure(JSMessage::kReadOnlyError);
1564 return CJS_Result::Success();
dan sinclair646634b2017-10-19 14:30:28 -04001565}
dan sinclaircbe23db2017-10-19 14:29:33 -04001566
Tom Sepez3a6d0582018-08-17 19:28:52 +00001567CJS_Result CJS_Field::get_print(CJS_Runtime* pRuntime) {
Lei Zhang073ecf42018-10-11 16:56:00 +00001568 CPDFSDK_InteractiveForm* pForm = m_pFormFillEnv->GetInteractiveForm();
Lei Zhang4c7ad662018-07-12 20:29:40 +00001569 CPDF_FormField* pFormField = GetFirstFormField();
1570 if (!pFormField)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001571 return CJS_Result::Failure(JSMessage::kBadObjectError);
dan sinclaircbe23db2017-10-19 14:29:33 -04001572
Lei Zhang073ecf42018-10-11 16:56:00 +00001573 CPDFSDK_Widget* pWidget = pForm->GetWidget(GetSmartFieldControl(pFormField));
dan sinclair646634b2017-10-19 14:30:28 -04001574 if (!pWidget)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001575 return CJS_Result::Failure(JSMessage::kBadObjectError);
dan sinclaircbe23db2017-10-19 14:29:33 -04001576
Tom Sepez3a6d0582018-08-17 19:28:52 +00001577 return CJS_Result::Success(
Dan Sinclair8f524d62017-10-25 13:30:31 -04001578 pRuntime->NewBoolean(!!(pWidget->GetFlags() & ANNOTFLAG_PRINT)));
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001579}
1580
Tom Sepez3a6d0582018-08-17 19:28:52 +00001581CJS_Result CJS_Field::set_print(CJS_Runtime* pRuntime,
Dan Sinclairf7435522018-02-05 22:27:22 +00001582 v8::Local<v8::Value> vp) {
Lei Zhang073ecf42018-10-11 16:56:00 +00001583 CPDFSDK_InteractiveForm* pForm = m_pFormFillEnv->GetInteractiveForm();
Lei Zhang18915232018-07-12 20:53:40 +00001584 std::vector<CPDF_FormField*> FieldArray = GetFormFields();
Lei Zhangd88a3642015-11-10 09:38:57 -08001585 if (FieldArray.empty())
Tom Sepez3a6d0582018-08-17 19:28:52 +00001586 return CJS_Result::Failure(JSMessage::kBadObjectError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001587
Dan Sinclair8f524d62017-10-25 13:30:31 -04001588 if (!m_bCanSet)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001589 return CJS_Result::Failure(JSMessage::kReadOnlyError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001590
Dan Sinclair8f524d62017-10-25 13:30:31 -04001591 for (CPDF_FormField* pFormField : FieldArray) {
1592 if (m_nFormControlIndex < 0) {
1593 bool bSet = false;
1594 for (int i = 0, sz = pFormField->CountControls(); i < sz; ++i) {
1595 if (CPDFSDK_Widget* pWidget =
Lei Zhang073ecf42018-10-11 16:56:00 +00001596 pForm->GetWidget(pFormField->GetControl(i))) {
dan sinclaircbe23db2017-10-19 14:29:33 -04001597 uint32_t dwFlags = pWidget->GetFlags();
dan sinclair80435cb2017-10-24 21:40:24 -04001598 if (pRuntime->ToBoolean(vp))
dan sinclaircbe23db2017-10-19 14:29:33 -04001599 dwFlags |= ANNOTFLAG_PRINT;
1600 else
1601 dwFlags &= ~ANNOTFLAG_PRINT;
1602
1603 if (dwFlags != pWidget->GetFlags()) {
1604 pWidget->SetFlags(dwFlags);
Dan Sinclair8f524d62017-10-25 13:30:31 -04001605 bSet = true;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001606 }
1607 }
1608 }
Dan Sinclair8f524d62017-10-25 13:30:31 -04001609
1610 if (bSet)
1611 UpdateFormField(m_pFormFillEnv.Get(), pFormField, true, false, true);
1612
1613 continue;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001614 }
Dan Sinclair8f524d62017-10-25 13:30:31 -04001615
1616 if (m_nFormControlIndex >= pFormField->CountControls())
Tom Sepez3a6d0582018-08-17 19:28:52 +00001617 return CJS_Result::Failure(JSMessage::kValueError);
Dan Sinclair8f524d62017-10-25 13:30:31 -04001618
1619 if (CPDF_FormControl* pFormControl =
1620 pFormField->GetControl(m_nFormControlIndex)) {
Lei Zhang073ecf42018-10-11 16:56:00 +00001621 if (CPDFSDK_Widget* pWidget = pForm->GetWidget(pFormControl)) {
Dan Sinclair8f524d62017-10-25 13:30:31 -04001622 uint32_t dwFlags = pWidget->GetFlags();
1623 if (pRuntime->ToBoolean(vp))
1624 dwFlags |= ANNOTFLAG_PRINT;
1625 else
1626 dwFlags &= ~ANNOTFLAG_PRINT;
1627
1628 if (dwFlags != pWidget->GetFlags()) {
1629 pWidget->SetFlags(dwFlags);
1630 UpdateFormControl(m_pFormFillEnv.Get(),
1631 pFormField->GetControl(m_nFormControlIndex), true,
1632 false, true);
1633 }
1634 }
1635 }
1636 }
Tom Sepez3a6d0582018-08-17 19:28:52 +00001637 return CJS_Result::Success();
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001638}
1639
Tom Sepez3a6d0582018-08-17 19:28:52 +00001640CJS_Result CJS_Field::get_radios_in_unison(CJS_Runtime* pRuntime) {
Lei Zhang4c7ad662018-07-12 20:29:40 +00001641 CPDF_FormField* pFormField = GetFirstFormField();
1642 if (!pFormField)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001643 return CJS_Result::Failure(JSMessage::kBadObjectError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001644
Ryan Harrison9baf31f2018-01-12 18:36:30 +00001645 if (pFormField->GetFieldType() != FormFieldType::kRadioButton)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001646 return CJS_Result::Failure(JSMessage::kObjectTypeError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001647
Tom Sepez3a6d0582018-08-17 19:28:52 +00001648 return CJS_Result::Success(pRuntime->NewBoolean(
Dan Sinclaire4974922017-10-24 09:36:16 -04001649 !!(pFormField->GetFieldFlags() & FIELDFLAG_RADIOSINUNISON)));
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 Zhang4c7ad662018-07-12 20:29:40 +00001668 !!(pFormField->GetFieldFlags() & FIELDFLAG_READONLY)));
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 Sepez3a6d0582018-08-17 19:28:52 +00001709 return CJS_Result::Failure(JSMessage::kBadObjectError);
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(
Dan Sinclaire4974922017-10-24 09:36:16 -04001743 !!(pFormField->GetFieldFlags() & FIELDFLAG_REQUIRED)));
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(
Dan Sinclaire4974922017-10-24 09:36:16 -04001767 !!(pFormField->GetFieldFlags() & FIELDFLAG_RICHTEXT)));
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 Sepez3a6d0582018-08-17 19:28:52 +00001809CJS_Result CJS_Field::get_stroke_color(CJS_Runtime* pRuntime) {
Lei Zhang4c7ad662018-07-12 20:29:40 +00001810 CPDF_FormField* pFormField = GetFirstFormField();
1811 if (!pFormField)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001812 return CJS_Result::Failure(JSMessage::kBadObjectError);
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001813
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001814 CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
1815 if (!pFormControl)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001816 return CJS_Result::Failure(JSMessage::kBadObjectError);
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001817
1818 int iColorType;
1819 pFormControl->GetBorderColor(iColorType);
1820
Dan Sinclair7f55a542017-07-13 14:17:10 -04001821 CFX_Color color;
Dan Sinclair8e7f9322017-10-16 11:35:42 -04001822 if (iColorType == CFX_Color::kTransparent) {
1823 color = CFX_Color(CFX_Color::kTransparent);
1824 } else if (iColorType == CFX_Color::kGray) {
1825 color =
1826 CFX_Color(CFX_Color::kGray, pFormControl->GetOriginalBorderColor(0));
1827 } else if (iColorType == CFX_Color::kRGB) {
1828 color = CFX_Color(CFX_Color::kRGB, pFormControl->GetOriginalBorderColor(0),
Dan Sinclair7f55a542017-07-13 14:17:10 -04001829 pFormControl->GetOriginalBorderColor(1),
1830 pFormControl->GetOriginalBorderColor(2));
Dan Sinclair8e7f9322017-10-16 11:35:42 -04001831 } else if (iColorType == CFX_Color::kCMYK) {
1832 color = CFX_Color(CFX_Color::kCMYK, pFormControl->GetOriginalBorderColor(0),
Dan Sinclair7f55a542017-07-13 14:17:10 -04001833 pFormControl->GetOriginalBorderColor(1),
1834 pFormControl->GetOriginalBorderColor(2),
1835 pFormControl->GetOriginalBorderColor(3));
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001836 } else {
Tom Sepez3a6d0582018-08-17 19:28:52 +00001837 return CJS_Result::Failure(JSMessage::kObjectTypeError);
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001838 }
1839
Dan Sinclairf7435522018-02-05 22:27:22 +00001840 v8::Local<v8::Value> array =
1841 CJS_Color::ConvertPWLColorToArray(pRuntime, color);
Dan Sinclair3a1ba8e2017-10-26 09:28:59 -04001842 if (array.IsEmpty())
Tom Sepez3a6d0582018-08-17 19:28:52 +00001843 return CJS_Result::Success(pRuntime->NewArray());
1844 return CJS_Result::Success(array);
dan sinclaircbe23db2017-10-19 14:29:33 -04001845}
1846
Tom Sepez3a6d0582018-08-17 19:28:52 +00001847CJS_Result CJS_Field::set_stroke_color(CJS_Runtime* pRuntime,
Dan Sinclairf7435522018-02-05 22:27:22 +00001848 v8::Local<v8::Value> vp) {
dan sinclaircbe23db2017-10-19 14:29:33 -04001849 if (!m_bCanSet)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001850 return CJS_Result::Failure(JSMessage::kReadOnlyError);
dan sinclair80435cb2017-10-24 21:40:24 -04001851 if (vp.IsEmpty() || !vp->IsArray())
Tom Sepez3a6d0582018-08-17 19:28:52 +00001852 return CJS_Result::Failure(JSMessage::kBadObjectError);
1853 return CJS_Result::Success();
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001854}
1855
Tom Sepez3a6d0582018-08-17 19:28:52 +00001856CJS_Result CJS_Field::get_style(CJS_Runtime* pRuntime) {
dsinclair3a7741a2016-10-11 10:39:49 -07001857 ASSERT(m_pFormFillEnv);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001858
Lei Zhang4c7ad662018-07-12 20:29:40 +00001859 CPDF_FormField* pFormField = GetFirstFormField();
1860 if (!pFormField)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001861 return CJS_Result::Failure(JSMessage::kBadObjectError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001862
Lei Zhangdfa2ac22018-07-12 19:06:50 +00001863 if (!IsCheckBoxOrRadioButton(pFormField))
Tom Sepez3a6d0582018-08-17 19:28:52 +00001864 return CJS_Result::Failure(JSMessage::kObjectTypeError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001865
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001866 CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
1867 if (!pFormControl)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001868 return CJS_Result::Failure(JSMessage::kBadObjectError);
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001869
Ryan Harrison275e2602017-09-18 14:23:18 -04001870 WideString csWCaption = pFormControl->GetNormalCaption();
1871 ByteString csBCaption;
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001872
1873 switch (csWCaption[0]) {
1874 case L'l':
1875 csBCaption = "circle";
1876 break;
1877 case L'8':
1878 csBCaption = "cross";
1879 break;
1880 case L'u':
1881 csBCaption = "diamond";
1882 break;
1883 case L'n':
1884 csBCaption = "square";
1885 break;
1886 case L'H':
1887 csBCaption = "star";
1888 break;
1889 default: // L'4'
1890 csBCaption = "check";
1891 break;
1892 }
Tom Sepez3a6d0582018-08-17 19:28:52 +00001893 return CJS_Result::Success(pRuntime->NewString(
Tom Sepezb6b01cb2018-06-20 16:10:13 +00001894 WideString::FromLocal(csBCaption.AsStringView()).AsStringView()));
dan sinclaircbe23db2017-10-19 14:29:33 -04001895}
1896
Tom Sepez3a6d0582018-08-17 19:28:52 +00001897CJS_Result CJS_Field::set_style(CJS_Runtime* pRuntime,
Dan Sinclairf7435522018-02-05 22:27:22 +00001898 v8::Local<v8::Value> vp) {
dan sinclaircbe23db2017-10-19 14:29:33 -04001899 ASSERT(m_pFormFillEnv);
Tom Sepez16999822018-06-08 18:23:05 +00001900 if (!m_bCanSet)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001901 return CJS_Result::Failure(JSMessage::kReadOnlyError);
1902 return CJS_Result::Success();
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001903}
1904
Tom Sepez3a6d0582018-08-17 19:28:52 +00001905CJS_Result CJS_Field::get_submit_name(CJS_Runtime* pRuntime) {
1906 return CJS_Result::Success();
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001907}
1908
Tom Sepez3a6d0582018-08-17 19:28:52 +00001909CJS_Result CJS_Field::set_submit_name(CJS_Runtime* pRuntime,
Dan Sinclairf7435522018-02-05 22:27:22 +00001910 v8::Local<v8::Value> vp) {
Tom Sepez3a6d0582018-08-17 19:28:52 +00001911 return CJS_Result::Success();
dan sinclaircbe23db2017-10-19 14:29:33 -04001912}
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001913
Tom Sepez3a6d0582018-08-17 19:28:52 +00001914CJS_Result CJS_Field::get_text_color(CJS_Runtime* pRuntime) {
Lei Zhang4c7ad662018-07-12 20:29:40 +00001915 CPDF_FormField* pFormField = GetFirstFormField();
1916 if (!pFormField)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001917 return CJS_Result::Failure(JSMessage::kBadObjectError);
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001918
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001919 CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
1920 if (!pFormControl)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001921 return CJS_Result::Failure(JSMessage::kBadObjectError);
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001922
Dan Sinclair28bb2f22018-04-03 19:52:27 +00001923 Optional<CFX_Color::Type> iColorType;
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001924 FX_ARGB color;
1925 CPDF_DefaultAppearance FieldAppearance = pFormControl->GetDefaultAppearance();
Dan Sinclaira17a0e22018-03-28 21:10:35 +00001926 std::tie(iColorType, color) = FieldAppearance.GetColor();
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001927
Dan Sinclair28bb2f22018-04-03 19:52:27 +00001928 CFX_Color crRet;
1929 if (!iColorType || *iColorType == CFX_Color::kTransparent) {
Dan Sinclair8e7f9322017-10-16 11:35:42 -04001930 crRet = CFX_Color(CFX_Color::kTransparent);
Dan Sinclair28bb2f22018-04-03 19:52:27 +00001931 } else {
1932 int32_t a;
1933 int32_t r;
1934 int32_t g;
1935 int32_t b;
1936 std::tie(a, r, g, b) = ArgbDecode(color);
1937 crRet = CFX_Color(CFX_Color::kRGB, r / 255.0f, g / 255.0f, b / 255.0f);
1938 }
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001939
Dan Sinclairf7435522018-02-05 22:27:22 +00001940 v8::Local<v8::Value> array =
1941 CJS_Color::ConvertPWLColorToArray(pRuntime, crRet);
Dan Sinclair3a1ba8e2017-10-26 09:28:59 -04001942 if (array.IsEmpty())
Tom Sepez3a6d0582018-08-17 19:28:52 +00001943 return CJS_Result::Success(pRuntime->NewArray());
1944 return CJS_Result::Success(array);
dan sinclaircbe23db2017-10-19 14:29:33 -04001945}
1946
Tom Sepez3a6d0582018-08-17 19:28:52 +00001947CJS_Result CJS_Field::set_text_color(CJS_Runtime* pRuntime,
Dan Sinclairf7435522018-02-05 22:27:22 +00001948 v8::Local<v8::Value> vp) {
dan sinclaircbe23db2017-10-19 14:29:33 -04001949 if (!m_bCanSet)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001950 return CJS_Result::Failure(JSMessage::kReadOnlyError);
dan sinclair80435cb2017-10-24 21:40:24 -04001951 if (vp.IsEmpty() || !vp->IsArray())
Tom Sepez3a6d0582018-08-17 19:28:52 +00001952 return CJS_Result::Failure(JSMessage::kBadObjectError);
1953 return CJS_Result::Success();
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001954}
1955
Tom Sepez3a6d0582018-08-17 19:28:52 +00001956CJS_Result CJS_Field::get_text_font(CJS_Runtime* pRuntime) {
dsinclair3a7741a2016-10-11 10:39:49 -07001957 ASSERT(m_pFormFillEnv);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001958
Lei Zhang4c7ad662018-07-12 20:29:40 +00001959 CPDF_FormField* pFormField = GetFirstFormField();
1960 if (!pFormField)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001961 return CJS_Result::Failure(JSMessage::kBadObjectError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001962
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001963 CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
1964 if (!pFormControl)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001965 return CJS_Result::Failure(JSMessage::kBadObjectError);
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001966
Ryan Harrison9baf31f2018-01-12 18:36:30 +00001967 FormFieldType fieldType = pFormField->GetFieldType();
1968 if (fieldType != FormFieldType::kPushButton &&
1969 fieldType != FormFieldType::kComboBox &&
1970 fieldType != FormFieldType::kListBox &&
1971 fieldType != FormFieldType::kTextField) {
Tom Sepez3a6d0582018-08-17 19:28:52 +00001972 return CJS_Result::Failure(JSMessage::kObjectTypeError);
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001973 }
Dan Sinclair8f524d62017-10-25 13:30:31 -04001974
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001975 CPDF_Font* pFont = pFormControl->GetDefaultControlFont();
1976 if (!pFont)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001977 return CJS_Result::Failure(JSMessage::kBadObjectError);
Tom Sepezd6ae2af2017-02-16 11:49:55 -08001978
Tom Sepez3a6d0582018-08-17 19:28:52 +00001979 return CJS_Result::Success(pRuntime->NewString(
Tom Sepezb6b01cb2018-06-20 16:10:13 +00001980 WideString::FromLocal(pFont->GetBaseFont().AsStringView())
1981 .AsStringView()));
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001982}
1983
Tom Sepez3a6d0582018-08-17 19:28:52 +00001984CJS_Result CJS_Field::set_text_font(CJS_Runtime* pRuntime,
Dan Sinclairf7435522018-02-05 22:27:22 +00001985 v8::Local<v8::Value> vp) {
dan sinclaircbe23db2017-10-19 14:29:33 -04001986 ASSERT(m_pFormFillEnv);
1987
dan sinclair646634b2017-10-19 14:30:28 -04001988 if (!m_bCanSet)
Tom Sepez3a6d0582018-08-17 19:28:52 +00001989 return CJS_Result::Failure(JSMessage::kReadOnlyError);
Tom Sepez34dab072018-08-08 17:49:02 +00001990 if (pRuntime->ToWideString(vp).ToDefANSI().IsEmpty())
Tom Sepez3a6d0582018-08-17 19:28:52 +00001991 return CJS_Result::Failure(JSMessage::kValueError);
1992 return CJS_Result::Success();
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001993}
1994
Tom Sepez3a6d0582018-08-17 19:28:52 +00001995CJS_Result CJS_Field::get_text_size(CJS_Runtime* pRuntime) {
dsinclair3a7741a2016-10-11 10:39:49 -07001996 ASSERT(m_pFormFillEnv);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07001997
Lei Zhang4c7ad662018-07-12 20:29:40 +00001998 CPDF_FormField* pFormField = GetFirstFormField();
1999 if (!pFormField)
Tom Sepez3a6d0582018-08-17 19:28:52 +00002000 return CJS_Result::Failure(JSMessage::kBadObjectError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002001
Tom Sepezd6ae2af2017-02-16 11:49:55 -08002002 CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
2003 if (!pFormControl)
Tom Sepez3a6d0582018-08-17 19:28:52 +00002004 return CJS_Result::Failure(JSMessage::kBadObjectError);
Tom Sepezd6ae2af2017-02-16 11:49:55 -08002005
Dan Sinclair05df0752017-03-14 14:43:42 -04002006 float fFontSize;
Tom Sepezc4a2b752017-04-07 13:56:13 -07002007 CPDF_DefaultAppearance FieldAppearance = pFormControl->GetDefaultAppearance();
2008 FieldAppearance.GetFont(&fFontSize);
Tom Sepez3a6d0582018-08-17 19:28:52 +00002009 return CJS_Result::Success(pRuntime->NewNumber(static_cast<int>(fFontSize)));
dan sinclaircbe23db2017-10-19 14:29:33 -04002010}
2011
Tom Sepez3a6d0582018-08-17 19:28:52 +00002012CJS_Result CJS_Field::set_text_size(CJS_Runtime* pRuntime,
Dan Sinclairf7435522018-02-05 22:27:22 +00002013 v8::Local<v8::Value> vp) {
dan sinclaircbe23db2017-10-19 14:29:33 -04002014 ASSERT(m_pFormFillEnv);
Tom Sepez16999822018-06-08 18:23:05 +00002015 if (!m_bCanSet)
Tom Sepez3a6d0582018-08-17 19:28:52 +00002016 return CJS_Result::Failure(JSMessage::kReadOnlyError);
2017 return CJS_Result::Success();
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002018}
2019
Tom Sepez3a6d0582018-08-17 19:28:52 +00002020CJS_Result CJS_Field::get_type(CJS_Runtime* pRuntime) {
Lei Zhang4c7ad662018-07-12 20:29:40 +00002021 CPDF_FormField* pFormField = GetFirstFormField();
2022 if (!pFormField)
Tom Sepez3a6d0582018-08-17 19:28:52 +00002023 return CJS_Result::Failure(JSMessage::kBadObjectError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002024
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002025 switch (pFormField->GetFieldType()) {
Ryan Harrison9baf31f2018-01-12 18:36:30 +00002026 case FormFieldType::kUnknown:
Tom Sepez3a6d0582018-08-17 19:28:52 +00002027 return CJS_Result::Success(pRuntime->NewString(L"unknown"));
Ryan Harrison9baf31f2018-01-12 18:36:30 +00002028 case FormFieldType::kPushButton:
Tom Sepez3a6d0582018-08-17 19:28:52 +00002029 return CJS_Result::Success(pRuntime->NewString(L"button"));
Ryan Harrison9baf31f2018-01-12 18:36:30 +00002030 case FormFieldType::kCheckBox:
Tom Sepez3a6d0582018-08-17 19:28:52 +00002031 return CJS_Result::Success(pRuntime->NewString(L"checkbox"));
Ryan Harrison9baf31f2018-01-12 18:36:30 +00002032 case FormFieldType::kRadioButton:
Tom Sepez3a6d0582018-08-17 19:28:52 +00002033 return CJS_Result::Success(pRuntime->NewString(L"radiobutton"));
Ryan Harrison9baf31f2018-01-12 18:36:30 +00002034 case FormFieldType::kComboBox:
Tom Sepez3a6d0582018-08-17 19:28:52 +00002035 return CJS_Result::Success(pRuntime->NewString(L"combobox"));
Ryan Harrison9baf31f2018-01-12 18:36:30 +00002036 case FormFieldType::kListBox:
Tom Sepez3a6d0582018-08-17 19:28:52 +00002037 return CJS_Result::Success(pRuntime->NewString(L"listbox"));
Ryan Harrison9baf31f2018-01-12 18:36:30 +00002038 case FormFieldType::kTextField:
Tom Sepez3a6d0582018-08-17 19:28:52 +00002039 return CJS_Result::Success(pRuntime->NewString(L"text"));
Ryan Harrison9baf31f2018-01-12 18:36:30 +00002040 case FormFieldType::kSignature:
Tom Sepez3a6d0582018-08-17 19:28:52 +00002041 return CJS_Result::Success(pRuntime->NewString(L"signature"));
Ryan Harrison9baf31f2018-01-12 18:36:30 +00002042 default:
Tom Sepez3a6d0582018-08-17 19:28:52 +00002043 return CJS_Result::Success(pRuntime->NewString(L"unknown"));
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002044 }
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002045}
2046
Tom Sepez3a6d0582018-08-17 19:28:52 +00002047CJS_Result CJS_Field::set_type(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp) {
2048 return CJS_Result::Failure(JSMessage::kNotSupportedError);
dan sinclaircbe23db2017-10-19 14:29:33 -04002049}
2050
Tom Sepez3a6d0582018-08-17 19:28:52 +00002051CJS_Result CJS_Field::get_user_name(CJS_Runtime* pRuntime) {
dsinclair3a7741a2016-10-11 10:39:49 -07002052 ASSERT(m_pFormFillEnv);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002053
Lei Zhang4c7ad662018-07-12 20:29:40 +00002054 CPDF_FormField* pFormField = GetFirstFormField();
2055 if (!pFormField)
Tom Sepez3a6d0582018-08-17 19:28:52 +00002056 return CJS_Result::Failure(JSMessage::kBadObjectError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002057
Tom Sepez3a6d0582018-08-17 19:28:52 +00002058 return CJS_Result::Success(
Lei Zhang4c7ad662018-07-12 20:29:40 +00002059 pRuntime->NewString(pFormField->GetAlternateName().AsStringView()));
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002060}
2061
Tom Sepez3a6d0582018-08-17 19:28:52 +00002062CJS_Result CJS_Field::set_user_name(CJS_Runtime* pRuntime,
Dan Sinclairf7435522018-02-05 22:27:22 +00002063 v8::Local<v8::Value> vp) {
dan sinclaircbe23db2017-10-19 14:29:33 -04002064 ASSERT(m_pFormFillEnv);
Tom Sepez16999822018-06-08 18:23:05 +00002065 if (!m_bCanSet)
Tom Sepez3a6d0582018-08-17 19:28:52 +00002066 return CJS_Result::Failure(JSMessage::kReadOnlyError);
2067 return CJS_Result::Success();
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002068}
2069
Tom Sepez3a6d0582018-08-17 19:28:52 +00002070CJS_Result CJS_Field::get_value(CJS_Runtime* pRuntime) {
Lei Zhang4c7ad662018-07-12 20:29:40 +00002071 CPDF_FormField* pFormField = GetFirstFormField();
2072 if (!pFormField)
Tom Sepez3a6d0582018-08-17 19:28:52 +00002073 return CJS_Result::Failure(JSMessage::kBadObjectError);
Dan Sinclair8f524d62017-10-25 13:30:31 -04002074
2075 v8::Local<v8::Value> ret;
Tom Sepezd6ae2af2017-02-16 11:49:55 -08002076 switch (pFormField->GetFieldType()) {
Ryan Harrison9baf31f2018-01-12 18:36:30 +00002077 case FormFieldType::kPushButton:
Tom Sepez3a6d0582018-08-17 19:28:52 +00002078 return CJS_Result::Failure(JSMessage::kObjectTypeError);
Ryan Harrison9baf31f2018-01-12 18:36:30 +00002079 case FormFieldType::kComboBox:
2080 case FormFieldType::kTextField:
Tom Sepezb6b01cb2018-06-20 16:10:13 +00002081 ret = pRuntime->NewString(pFormField->GetValue().AsStringView());
dan sinclaircbe23db2017-10-19 14:29:33 -04002082 break;
Ryan Harrison9baf31f2018-01-12 18:36:30 +00002083 case FormFieldType::kListBox: {
Tom Sepezd6ae2af2017-02-16 11:49:55 -08002084 if (pFormField->CountSelectedItems() > 1) {
Dan Sinclair3a1ba8e2017-10-26 09:28:59 -04002085 v8::Local<v8::Array> ValueArray = pRuntime->NewArray();
dan sinclair80435cb2017-10-24 21:40:24 -04002086 v8::Local<v8::Value> ElementValue;
Tom Sepezd6ae2af2017-02-16 11:49:55 -08002087 int iIndex;
2088 for (int i = 0, sz = pFormField->CountSelectedItems(); i < sz; i++) {
2089 iIndex = pFormField->GetSelectedIndex(i);
Tom Sepezb6b01cb2018-06-20 16:10:13 +00002090 ElementValue = pRuntime->NewString(
2091 pFormField->GetOptionValue(iIndex).AsStringView());
dan sinclair80435cb2017-10-24 21:40:24 -04002092 if (wcslen(pRuntime->ToWideString(ElementValue).c_str()) == 0) {
Tom Sepezb6b01cb2018-06-20 16:10:13 +00002093 ElementValue = pRuntime->NewString(
2094 pFormField->GetOptionLabel(iIndex).AsStringView());
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002095 }
Dan Sinclair3a1ba8e2017-10-26 09:28:59 -04002096 pRuntime->PutArrayElement(ValueArray, i, ElementValue);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002097 }
Dan Sinclair3a1ba8e2017-10-26 09:28:59 -04002098 ret = ValueArray;
Tom Sepezd6ae2af2017-02-16 11:49:55 -08002099 } else {
Tom Sepezb6b01cb2018-06-20 16:10:13 +00002100 ret = pRuntime->NewString(pFormField->GetValue().AsStringView());
Tom Sepezd6ae2af2017-02-16 11:49:55 -08002101 }
dan sinclaircbe23db2017-10-19 14:29:33 -04002102 break;
2103 }
Ryan Harrison9baf31f2018-01-12 18:36:30 +00002104 case FormFieldType::kCheckBox:
2105 case FormFieldType::kRadioButton: {
Tom Sepezd6ae2af2017-02-16 11:49:55 -08002106 bool bFind = false;
2107 for (int i = 0, sz = pFormField->CountControls(); i < sz; i++) {
2108 if (pFormField->GetControl(i)->IsChecked()) {
Dan Sinclair8f524d62017-10-25 13:30:31 -04002109 ret = pRuntime->NewString(
Tom Sepezb6b01cb2018-06-20 16:10:13 +00002110 pFormField->GetControl(i)->GetExportValue().AsStringView());
Tom Sepezd6ae2af2017-02-16 11:49:55 -08002111 bFind = true;
2112 break;
2113 }
2114 }
2115 if (!bFind)
Dan Sinclair8f524d62017-10-25 13:30:31 -04002116 ret = pRuntime->NewString(L"Off");
dan sinclaircbe23db2017-10-19 14:29:33 -04002117
2118 break;
2119 }
Tom Sepezd6ae2af2017-02-16 11:49:55 -08002120 default:
Tom Sepezb6b01cb2018-06-20 16:10:13 +00002121 ret = pRuntime->NewString(pFormField->GetValue().AsStringView());
Tom Sepezd6ae2af2017-02-16 11:49:55 -08002122 break;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002123 }
Tom Sepez3a6d0582018-08-17 19:28:52 +00002124 return CJS_Result::Success(pRuntime->MaybeCoerceToNumber(ret));
dan sinclaircbe23db2017-10-19 14:29:33 -04002125}
2126
Tom Sepez3a6d0582018-08-17 19:28:52 +00002127CJS_Result CJS_Field::set_value(CJS_Runtime* pRuntime,
Dan Sinclairf7435522018-02-05 22:27:22 +00002128 v8::Local<v8::Value> vp) {
dan sinclaircbe23db2017-10-19 14:29:33 -04002129 if (!m_bCanSet)
Tom Sepez3a6d0582018-08-17 19:28:52 +00002130 return CJS_Result::Failure(JSMessage::kReadOnlyError);
dan sinclaircbe23db2017-10-19 14:29:33 -04002131
2132 std::vector<WideString> strArray;
dan sinclair80435cb2017-10-24 21:40:24 -04002133 if (!vp.IsEmpty() && vp->IsArray()) {
Dan Sinclair3a1ba8e2017-10-26 09:28:59 -04002134 v8::Local<v8::Array> ValueArray = pRuntime->ToArray(vp);
2135 for (size_t i = 0; i < pRuntime->GetArrayLength(ValueArray); i++) {
dan sinclair80435cb2017-10-24 21:40:24 -04002136 strArray.push_back(
Dan Sinclair3a1ba8e2017-10-26 09:28:59 -04002137 pRuntime->ToWideString(pRuntime->GetArrayElement(ValueArray, i)));
dan sinclaircbe23db2017-10-19 14:29:33 -04002138 }
2139 } else {
dan sinclair80435cb2017-10-24 21:40:24 -04002140 strArray.push_back(pRuntime->ToWideString(vp));
dan sinclaircbe23db2017-10-19 14:29:33 -04002141 }
2142
2143 if (m_bDelay) {
2144 AddDelay_WideStringArray(FP_VALUE, strArray);
2145 } else {
Lei Zhang94919f72018-07-12 21:16:30 +00002146 SetValue(m_pFormFillEnv.Get(), m_FieldName, m_nFormControlIndex, strArray);
dan sinclaircbe23db2017-10-19 14:29:33 -04002147 }
Tom Sepez3a6d0582018-08-17 19:28:52 +00002148 return CJS_Result::Success();
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002149}
2150
Tom Sepez3a6d0582018-08-17 19:28:52 +00002151CJS_Result CJS_Field::get_value_as_string(CJS_Runtime* pRuntime) {
Lei Zhang4c7ad662018-07-12 20:29:40 +00002152 CPDF_FormField* pFormField = GetFirstFormField();
2153 if (!pFormField)
Tom Sepez3a6d0582018-08-17 19:28:52 +00002154 return CJS_Result::Failure(JSMessage::kBadObjectError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002155
Ryan Harrison9baf31f2018-01-12 18:36:30 +00002156 if (pFormField->GetFieldType() == FormFieldType::kPushButton)
Tom Sepez3a6d0582018-08-17 19:28:52 +00002157 return CJS_Result::Failure(JSMessage::kObjectTypeError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002158
Ryan Harrison9baf31f2018-01-12 18:36:30 +00002159 if (pFormField->GetFieldType() == FormFieldType::kCheckBox) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002160 if (!pFormField->CountControls())
Tom Sepez3a6d0582018-08-17 19:28:52 +00002161 return CJS_Result::Failure(JSMessage::kBadObjectError);
2162 return CJS_Result::Success(pRuntime->NewString(
Dan Sinclaire4974922017-10-24 09:36:16 -04002163 pFormField->GetControl(0)->IsChecked() ? L"Yes" : L"Off"));
dan sinclaircbe23db2017-10-19 14:29:33 -04002164 }
2165
Ryan Harrison9baf31f2018-01-12 18:36:30 +00002166 if (pFormField->GetFieldType() == FormFieldType::kRadioButton &&
dan sinclaircbe23db2017-10-19 14:29:33 -04002167 !(pFormField->GetFieldFlags() & FIELDFLAG_RADIOSINUNISON)) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002168 for (int i = 0, sz = pFormField->CountControls(); i < sz; i++) {
2169 if (pFormField->GetControl(i)->IsChecked()) {
Tom Sepez3a6d0582018-08-17 19:28:52 +00002170 return CJS_Result::Success(pRuntime->NewString(
Tom Sepezb6b01cb2018-06-20 16:10:13 +00002171 pFormField->GetControl(i)->GetExportValue().AsStringView()));
Lei Zhangd88a3642015-11-10 09:38:57 -08002172 }
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002173 }
Tom Sepez3a6d0582018-08-17 19:28:52 +00002174 return CJS_Result::Success(pRuntime->NewString(L"Off"));
dan sinclaircbe23db2017-10-19 14:29:33 -04002175 }
2176
Ryan Harrison9baf31f2018-01-12 18:36:30 +00002177 if (pFormField->GetFieldType() == FormFieldType::kListBox &&
dan sinclaircbe23db2017-10-19 14:29:33 -04002178 (pFormField->CountSelectedItems() > 1)) {
Tom Sepez3a6d0582018-08-17 19:28:52 +00002179 return CJS_Result::Success(pRuntime->NewString(L""));
Lei Zhangd88a3642015-11-10 09:38:57 -08002180 }
Tom Sepez3a6d0582018-08-17 19:28:52 +00002181 return CJS_Result::Success(
Tom Sepez20736f72018-08-17 16:44:50 +00002182 pRuntime->NewString(pFormField->GetValue().AsStringView()));
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002183}
2184
Tom Sepez3a6d0582018-08-17 19:28:52 +00002185CJS_Result CJS_Field::set_value_as_string(CJS_Runtime* pRuntime,
Dan Sinclairf7435522018-02-05 22:27:22 +00002186 v8::Local<v8::Value> vp) {
Tom Sepez3a6d0582018-08-17 19:28:52 +00002187 return CJS_Result::Failure(JSMessage::kNotSupportedError);
dan sinclaircbe23db2017-10-19 14:29:33 -04002188}
2189
Tom Sepez3a6d0582018-08-17 19:28:52 +00002190CJS_Result CJS_Field::browseForFileToSubmit(
dan sinclair80435cb2017-10-24 21:40:24 -04002191 CJS_Runtime* pRuntime,
Dan Sinclair8f524d62017-10-25 13:30:31 -04002192 const std::vector<v8::Local<v8::Value>>& params) {
Lei Zhang4c7ad662018-07-12 20:29:40 +00002193 CPDF_FormField* pFormField = GetFirstFormField();
2194 if (!pFormField)
Tom Sepez3a6d0582018-08-17 19:28:52 +00002195 return CJS_Result::Failure(JSMessage::kBadObjectError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002196
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002197 if ((pFormField->GetFieldFlags() & FIELDFLAG_FILESELECT) &&
Ryan Harrison9baf31f2018-01-12 18:36:30 +00002198 (pFormField->GetFieldType() == FormFieldType::kTextField)) {
Ryan Harrison275e2602017-09-18 14:23:18 -04002199 WideString wsFileName = m_pFormFillEnv->JS_fieldBrowse();
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002200 if (!wsFileName.IsEmpty()) {
Tom Sepezb2e6b4c2018-08-16 20:53:58 +00002201 pFormField->SetValue(wsFileName, NotificationOption::kDoNotNotify);
tsepez4cf55152016-11-02 14:37:54 -07002202 UpdateFormField(m_pFormFillEnv.Get(), pFormField, true, true, true);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002203 }
Tom Sepez3a6d0582018-08-17 19:28:52 +00002204 return CJS_Result::Success();
Lei Zhangd88a3642015-11-10 09:38:57 -08002205 }
Tom Sepez3a6d0582018-08-17 19:28:52 +00002206 return CJS_Result::Failure(JSMessage::kObjectTypeError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002207}
2208
Tom Sepez3a6d0582018-08-17 19:28:52 +00002209CJS_Result CJS_Field::buttonGetCaption(
Dan Sinclair8f524d62017-10-25 13:30:31 -04002210 CJS_Runtime* pRuntime,
2211 const std::vector<v8::Local<v8::Value>>& params) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002212 int nface = 0;
2213 int iSize = params.size();
2214 if (iSize >= 1)
dan sinclair80435cb2017-10-24 21:40:24 -04002215 nface = pRuntime->ToInt32(params[0]);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002216
Lei Zhang4c7ad662018-07-12 20:29:40 +00002217 CPDF_FormField* pFormField = GetFirstFormField();
2218 if (!pFormField)
Tom Sepez3a6d0582018-08-17 19:28:52 +00002219 return CJS_Result::Failure(JSMessage::kBadObjectError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002220
Ryan Harrison9baf31f2018-01-12 18:36:30 +00002221 if (pFormField->GetFieldType() != FormFieldType::kPushButton)
Tom Sepez3a6d0582018-08-17 19:28:52 +00002222 return CJS_Result::Failure(JSMessage::kObjectTypeError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002223
2224 CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
2225 if (!pFormControl)
Tom Sepez3a6d0582018-08-17 19:28:52 +00002226 return CJS_Result::Failure(JSMessage::kBadObjectError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002227
Dan Sinclair8f524d62017-10-25 13:30:31 -04002228 if (nface == 0) {
Tom Sepez3a6d0582018-08-17 19:28:52 +00002229 return CJS_Result::Success(
Tom Sepezb6b01cb2018-06-20 16:10:13 +00002230 pRuntime->NewString(pFormControl->GetNormalCaption().AsStringView()));
2231 }
2232 if (nface == 1) {
Tom Sepez3a6d0582018-08-17 19:28:52 +00002233 return CJS_Result::Success(
Tom Sepezb6b01cb2018-06-20 16:10:13 +00002234 pRuntime->NewString(pFormControl->GetDownCaption().AsStringView()));
2235 }
2236 if (nface == 2) {
Tom Sepez3a6d0582018-08-17 19:28:52 +00002237 return CJS_Result::Success(
Tom Sepezb6b01cb2018-06-20 16:10:13 +00002238 pRuntime->NewString(pFormControl->GetRolloverCaption().AsStringView()));
Dan Sinclair8f524d62017-10-25 13:30:31 -04002239 }
Tom Sepez3a6d0582018-08-17 19:28:52 +00002240 return CJS_Result::Failure(JSMessage::kValueError);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07002241}
2242
Tom Sepez3a6d0582018-08-17 19:28:52 +00002243CJS_Result CJS_Field::buttonGetIcon(
Dan Sinclair8f524d62017-10-25 13:30:31 -04002244 CJS_Runtime* pRuntime,
2245 const std::vector<v8::Local<v8::Value>>& params) {
Tom Sepez40e0a812017-02-23 13:07:36 -08002246 if (params.size() >= 1) {
dan sinclair80435cb2017-10-24 21:40:24 -04002247 int nFace = pRuntime->ToInt32(params[0]);
Tom Sepez40e0a812017-02-23 13:07:36 -08002248 if (nFace < 0 || nFace > 2)
Tom Sepez3a6d0582018-08-17 19:28:52 +00002249 return CJS_Result::Failure(JSMessage::kValueError);
Tom Sepez40e0a812017-02-23 13:07:36 -08002250 }
Lei Zhanga6d9f0e2015-06-13 00:48:38 -07002251
Lei Zhang4c7ad662018-07-12 20:29:40 +00002252 CPDF_FormField* pFormField = GetFirstFormField();
2253 if (!pFormField)
Tom Sepez3a6d0582018-08-17 19:28:52 +00002254 return CJS_Result::Failure(JSMessage::kBadObjectError);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07002255
Ryan Harrison9baf31f2018-01-12 18:36:30 +00002256 if (pFormField->GetFieldType() != FormFieldType::kPushButton)
Tom Sepez3a6d0582018-08-17 19:28:52 +00002257 return CJS_Result::Failure(JSMessage::kObjectTypeError);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07002258
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002259 CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
2260 if (!pFormControl)
Tom Sepez3a6d0582018-08-17 19:28:52 +00002261 return CJS_Result::Failure(JSMessage::kBadObjectError);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07002262
Tom Sepez55ccb522018-08-14 23:40:10 +00002263 v8::Local<v8::Object> pObj = pRuntime->NewFXJSBoundObject(
2264 CJS_Icon::GetObjDefnID(), FXJSOBJTYPE_DYNAMIC);
Tom Sepezc5a14722017-02-24 15:31:12 -08002265 if (pObj.IsEmpty())
Tom Sepez3a6d0582018-08-17 19:28:52 +00002266 return CJS_Result::Failure(JSMessage::kBadObjectError);
Lei Zhanga6d9f0e2015-06-13 00:48:38 -07002267
Tom Sepezddaa40f2018-06-06 18:30:15 +00002268 auto* pJS_Icon = static_cast<CJS_Icon*>(CFXJS_Engine::GetObjectPrivate(pObj));
Tom Sepez3a6d0582018-08-17 19:28:52 +00002269 return pJS_Icon ? CJS_Result::Success(pJS_Icon->ToV8Object())
2270 : CJS_Result::Failure(JSMessage::kBadObjectError);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07002271}
2272
Tom Sepez3a6d0582018-08-17 19:28:52 +00002273CJS_Result CJS_Field::buttonImportIcon(
Dan Sinclair8f524d62017-10-25 13:30:31 -04002274 CJS_Runtime* pRuntime,
2275 const std::vector<v8::Local<v8::Value>>& params) {
Tom Sepez3a6d0582018-08-17 19:28:52 +00002276 return CJS_Result::Success();
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002277}
2278
Tom Sepez3a6d0582018-08-17 19:28:52 +00002279CJS_Result CJS_Field::buttonSetCaption(
Dan Sinclair8f524d62017-10-25 13:30:31 -04002280 CJS_Runtime* pRuntime,
2281 const std::vector<v8::Local<v8::Value>>& params) {
Tom Sepez3a6d0582018-08-17 19:28:52 +00002282 return CJS_Result::Failure(JSMessage::kNotSupportedError);
tsepez4cf55152016-11-02 14:37:54 -07002283}
2284
Tom Sepez3a6d0582018-08-17 19:28:52 +00002285CJS_Result CJS_Field::buttonSetIcon(
Dan Sinclair8f524d62017-10-25 13:30:31 -04002286 CJS_Runtime* pRuntime,
2287 const std::vector<v8::Local<v8::Value>>& params) {
Tom Sepez3a6d0582018-08-17 19:28:52 +00002288 return CJS_Result::Failure(JSMessage::kNotSupportedError);
tsepez4cf55152016-11-02 14:37:54 -07002289}
2290
Tom Sepez3a6d0582018-08-17 19:28:52 +00002291CJS_Result CJS_Field::checkThisBox(
Dan Sinclair8f524d62017-10-25 13:30:31 -04002292 CJS_Runtime* pRuntime,
2293 const std::vector<v8::Local<v8::Value>>& params) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002294 int iSize = params.size();
2295 if (iSize < 1)
Tom Sepez3a6d0582018-08-17 19:28:52 +00002296 return CJS_Result::Failure(JSMessage::kParamError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002297
tsepezf3dc8c62016-08-10 06:29:29 -07002298 if (!m_bCanSet)
Tom Sepez3a6d0582018-08-17 19:28:52 +00002299 return CJS_Result::Failure(JSMessage::kReadOnlyError);
tsepezf3dc8c62016-08-10 06:29:29 -07002300
dan sinclair80435cb2017-10-24 21:40:24 -04002301 int nWidget = pRuntime->ToInt32(params[0]);
Wei Li97da9762016-03-11 17:00:48 -08002302 bool bCheckit = true;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002303 if (iSize >= 2)
dan sinclair80435cb2017-10-24 21:40:24 -04002304 bCheckit = pRuntime->ToBoolean(params[1]);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002305
Lei Zhang4c7ad662018-07-12 20:29:40 +00002306 CPDF_FormField* pFormField = GetFirstFormField();
2307 if (!pFormField)
Tom Sepez3a6d0582018-08-17 19:28:52 +00002308 return CJS_Result::Failure(JSMessage::kBadObjectError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002309
Lei Zhangdfa2ac22018-07-12 19:06:50 +00002310 if (!IsCheckBoxOrRadioButton(pFormField))
Tom Sepez3a6d0582018-08-17 19:28:52 +00002311 return CJS_Result::Failure(JSMessage::kObjectTypeError);
Tom Sepezb2e6b4c2018-08-16 20:53:58 +00002312
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002313 if (nWidget < 0 || nWidget >= pFormField->CountControls())
Tom Sepez3a6d0582018-08-17 19:28:52 +00002314 return CJS_Result::Failure(JSMessage::kValueError);
Lei Zhangbc486922018-01-29 15:30:46 +00002315
2316 // TODO(weili): Check whether anything special needed for radio button.
2317 // (When pFormField->GetFieldType() == FormFieldType::kRadioButton.)
Tom Sepezb2e6b4c2018-08-16 20:53:58 +00002318 pFormField->CheckControl(nWidget, bCheckit, NotificationOption::kNotify);
tsepez4cf55152016-11-02 14:37:54 -07002319 UpdateFormField(m_pFormFillEnv.Get(), pFormField, true, true, true);
Tom Sepez3a6d0582018-08-17 19:28:52 +00002320 return CJS_Result::Success();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07002321}
2322
Tom Sepez3a6d0582018-08-17 19:28:52 +00002323CJS_Result CJS_Field::clearItems(
Dan Sinclairf7435522018-02-05 22:27:22 +00002324 CJS_Runtime* pRuntime,
2325 const std::vector<v8::Local<v8::Value>>& params) {
Tom Sepez3a6d0582018-08-17 19:28:52 +00002326 return CJS_Result::Success();
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002327}
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07002328
Tom Sepez3a6d0582018-08-17 19:28:52 +00002329CJS_Result CJS_Field::defaultIsChecked(
Dan Sinclair8f524d62017-10-25 13:30:31 -04002330 CJS_Runtime* pRuntime,
2331 const std::vector<v8::Local<v8::Value>>& params) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002332 if (!m_bCanSet)
Tom Sepez3a6d0582018-08-17 19:28:52 +00002333 return CJS_Result::Failure(JSMessage::kReadOnlyError);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07002334
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002335 int iSize = params.size();
2336 if (iSize < 1)
Tom Sepez3a6d0582018-08-17 19:28:52 +00002337 return CJS_Result::Failure(JSMessage::kParamError);
Tom Sepezf4ef3f92015-04-23 11:31:31 -07002338
Lei Zhang4c7ad662018-07-12 20:29:40 +00002339 CPDF_FormField* pFormField = GetFirstFormField();
2340 if (!pFormField)
Tom Sepez3a6d0582018-08-17 19:28:52 +00002341 return CJS_Result::Failure(JSMessage::kBadObjectError);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07002342
Lei Zhang4c7ad662018-07-12 20:29:40 +00002343 int nWidget = pRuntime->ToInt32(params[0]);
tsepezf3dc8c62016-08-10 06:29:29 -07002344 if (nWidget < 0 || nWidget >= pFormField->CountControls())
Tom Sepez3a6d0582018-08-17 19:28:52 +00002345 return CJS_Result::Failure(JSMessage::kValueError);
tsepezf3dc8c62016-08-10 06:29:29 -07002346
Tom Sepez3a6d0582018-08-17 19:28:52 +00002347 return CJS_Result::Success(
Tom Sepez20736f72018-08-17 16:44:50 +00002348 pRuntime->NewBoolean(IsCheckBoxOrRadioButton(pFormField)));
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002349}
2350
Tom Sepez3a6d0582018-08-17 19:28:52 +00002351CJS_Result CJS_Field::deleteItemAt(
Dan Sinclair8f524d62017-10-25 13:30:31 -04002352 CJS_Runtime* pRuntime,
2353 const std::vector<v8::Local<v8::Value>>& params) {
Tom Sepez3a6d0582018-08-17 19:28:52 +00002354 return CJS_Result::Success();
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002355}
2356
Tom Sepez3a6d0582018-08-17 19:28:52 +00002357CJS_Result CJS_Field::getArray(
Dan Sinclairf7435522018-02-05 22:27:22 +00002358 CJS_Runtime* pRuntime,
2359 const std::vector<v8::Local<v8::Value>>& params) {
Lei Zhang18915232018-07-12 20:53:40 +00002360 std::vector<CPDF_FormField*> FieldArray = GetFormFields();
Lei Zhangd88a3642015-11-10 09:38:57 -08002361 if (FieldArray.empty())
Tom Sepez3a6d0582018-08-17 19:28:52 +00002362 return CJS_Result::Failure(JSMessage::kBadObjectError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002363
Ryan Harrison275e2602017-09-18 14:23:18 -04002364 std::vector<std::unique_ptr<WideString>> swSort;
Tom Sepezb9cc7a02016-02-01 13:42:30 -08002365 for (CPDF_FormField* pFormField : FieldArray) {
Lei Zhang4c7ad662018-07-12 20:29:40 +00002366 swSort.push_back(pdfium::MakeUnique<WideString>(pFormField->GetFullName()));
Tom Sepezb9cc7a02016-02-01 13:42:30 -08002367 }
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002368
Ryan Harrison275e2602017-09-18 14:23:18 -04002369 std::sort(swSort.begin(), swSort.end(),
2370 [](const std::unique_ptr<WideString>& p1,
2371 const std::unique_ptr<WideString>& p2) { return *p1 < *p2; });
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002372
Dan Sinclair3a1ba8e2017-10-26 09:28:59 -04002373 v8::Local<v8::Array> FormFieldArray = pRuntime->NewArray();
Tom Sepezb9cc7a02016-02-01 13:42:30 -08002374 int j = 0;
2375 for (const auto& pStr : swSort) {
Tom Sepez55ccb522018-08-14 23:40:10 +00002376 v8::Local<v8::Object> pObj = pRuntime->NewFXJSBoundObject(
2377 CJS_Field::GetObjDefnID(), FXJSOBJTYPE_DYNAMIC);
Tom Sepezc5a14722017-02-24 15:31:12 -08002378 if (pObj.IsEmpty())
Tom Sepez3a6d0582018-08-17 19:28:52 +00002379 return CJS_Result::Failure(JSMessage::kBadObjectError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002380
Tom Sepezddaa40f2018-06-06 18:30:15 +00002381 auto* pJSField =
2382 static_cast<CJS_Field*>(CFXJS_Engine::GetObjectPrivate(pObj));
Tom Sepez2cbae732018-06-26 15:11:28 +00002383 pJSField->AttachField(m_pJSDoc.Get(), *pStr);
Dan Sinclair3a1ba8e2017-10-26 09:28:59 -04002384 pRuntime->PutArrayElement(FormFieldArray, j++,
dan sinclair80435cb2017-10-24 21:40:24 -04002385 pJSField
2386 ? v8::Local<v8::Value>(pJSField->ToV8Object())
2387 : v8::Local<v8::Value>());
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002388 }
Tom Sepez3a6d0582018-08-17 19:28:52 +00002389 return CJS_Result::Success(FormFieldArray);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002390}
2391
Tom Sepez3a6d0582018-08-17 19:28:52 +00002392CJS_Result CJS_Field::getItemAt(
Dan Sinclairf7435522018-02-05 22:27:22 +00002393 CJS_Runtime* pRuntime,
2394 const std::vector<v8::Local<v8::Value>>& params) {
tsepezf3dc8c62016-08-10 06:29:29 -07002395 int iSize = params.size();
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002396 int nIdx = -1;
2397 if (iSize >= 1)
dan sinclair80435cb2017-10-24 21:40:24 -04002398 nIdx = pRuntime->ToInt32(params[0]);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002399
tsepez4cf55152016-11-02 14:37:54 -07002400 bool bExport = true;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002401 if (iSize >= 2)
dan sinclair80435cb2017-10-24 21:40:24 -04002402 bExport = pRuntime->ToBoolean(params[1]);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002403
Lei Zhang4c7ad662018-07-12 20:29:40 +00002404 CPDF_FormField* pFormField = GetFirstFormField();
2405 if (!pFormField)
Tom Sepez3a6d0582018-08-17 19:28:52 +00002406 return CJS_Result::Failure(JSMessage::kBadObjectError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002407
Lei Zhang83f2d702018-07-12 19:07:40 +00002408 if (!IsComboBoxOrListBox(pFormField))
Tom Sepez3a6d0582018-08-17 19:28:52 +00002409 return CJS_Result::Failure(JSMessage::kObjectTypeError);
Lei Zhang83f2d702018-07-12 19:07:40 +00002410
2411 if (nIdx == -1 || nIdx > pFormField->CountOptions())
2412 nIdx = pFormField->CountOptions() - 1;
2413 if (!bExport) {
Tom Sepez3a6d0582018-08-17 19:28:52 +00002414 return CJS_Result::Success(
Tom Sepezb6b01cb2018-06-20 16:10:13 +00002415 pRuntime->NewString(pFormField->GetOptionLabel(nIdx).AsStringView()));
Lei Zhangd88a3642015-11-10 09:38:57 -08002416 }
Lei Zhang83f2d702018-07-12 19:07:40 +00002417
2418 WideString strval = pFormField->GetOptionValue(nIdx);
2419 if (strval.IsEmpty()) {
Tom Sepez3a6d0582018-08-17 19:28:52 +00002420 return CJS_Result::Success(
Lei Zhang83f2d702018-07-12 19:07:40 +00002421 pRuntime->NewString(pFormField->GetOptionLabel(nIdx).AsStringView()));
2422 }
Tom Sepez3a6d0582018-08-17 19:28:52 +00002423 return CJS_Result::Success(pRuntime->NewString(strval.AsStringView()));
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002424}
2425
Tom Sepez3a6d0582018-08-17 19:28:52 +00002426CJS_Result CJS_Field::getLock(CJS_Runtime* pRuntime,
Dan Sinclairf7435522018-02-05 22:27:22 +00002427 const std::vector<v8::Local<v8::Value>>& params) {
Tom Sepez3a6d0582018-08-17 19:28:52 +00002428 return CJS_Result::Failure(JSMessage::kNotSupportedError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002429}
2430
Tom Sepez3a6d0582018-08-17 19:28:52 +00002431CJS_Result CJS_Field::insertItemAt(
Dan Sinclair8f524d62017-10-25 13:30:31 -04002432 CJS_Runtime* pRuntime,
2433 const std::vector<v8::Local<v8::Value>>& params) {
Tom Sepez3a6d0582018-08-17 19:28:52 +00002434 return CJS_Result::Success();
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002435}
2436
Tom Sepez3a6d0582018-08-17 19:28:52 +00002437CJS_Result CJS_Field::isBoxChecked(
Dan Sinclair8f524d62017-10-25 13:30:31 -04002438 CJS_Runtime* pRuntime,
2439 const std::vector<v8::Local<v8::Value>>& params) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002440 int nIndex = -1;
2441 if (params.size() >= 1)
dan sinclair80435cb2017-10-24 21:40:24 -04002442 nIndex = pRuntime->ToInt32(params[0]);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002443
Lei Zhang4c7ad662018-07-12 20:29:40 +00002444 CPDF_FormField* pFormField = GetFirstFormField();
2445 if (!pFormField)
Tom Sepez3a6d0582018-08-17 19:28:52 +00002446 return CJS_Result::Failure(JSMessage::kBadObjectError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002447
dan sinclair646634b2017-10-19 14:30:28 -04002448 if (nIndex < 0 || nIndex >= pFormField->CountControls())
Tom Sepez3a6d0582018-08-17 19:28:52 +00002449 return CJS_Result::Failure(JSMessage::kValueError);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002450
Tom Sepez3a6d0582018-08-17 19:28:52 +00002451 return CJS_Result::Success(
Lei Zhangdfa2ac22018-07-12 19:06:50 +00002452 pRuntime->NewBoolean((IsCheckBoxOrRadioButton(pFormField) &&
2453 pFormField->GetControl(nIndex)->IsChecked() != 0)));
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07002454}
2455
Tom Sepez3a6d0582018-08-17 19:28:52 +00002456CJS_Result CJS_Field::isDefaultChecked(
Dan Sinclair8f524d62017-10-25 13:30:31 -04002457 CJS_Runtime* pRuntime,
2458 const std::vector<v8::Local<v8::Value>>& params) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002459 int nIndex = -1;
2460 if (params.size() >= 1)
dan sinclair80435cb2017-10-24 21:40:24 -04002461 nIndex = pRuntime->ToInt32(params[0]);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07002462
Lei Zhang4c7ad662018-07-12 20:29:40 +00002463 CPDF_FormField* pFormField = GetFirstFormField();
2464 if (!pFormField)
Tom Sepez3a6d0582018-08-17 19:28:52 +00002465 return CJS_Result::Failure(JSMessage::kBadObjectError);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07002466
tsepezf3dc8c62016-08-10 06:29:29 -07002467 if (nIndex < 0 || nIndex >= pFormField->CountControls())
Tom Sepez3a6d0582018-08-17 19:28:52 +00002468 return CJS_Result::Failure(JSMessage::kValueError);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07002469
Tom Sepez3a6d0582018-08-17 19:28:52 +00002470 return CJS_Result::Success(pRuntime->NewBoolean(
Lei Zhangdfa2ac22018-07-12 19:06:50 +00002471 (IsCheckBoxOrRadioButton(pFormField) &&
Dan Sinclair1d8d9ac2017-10-24 11:23:25 -04002472 pFormField->GetControl(nIndex)->IsDefaultChecked() != 0)));
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07002473}
2474
Tom Sepez3a6d0582018-08-17 19:28:52 +00002475CJS_Result CJS_Field::setAction(
Dan Sinclairf7435522018-02-05 22:27:22 +00002476 CJS_Runtime* pRuntime,
2477 const std::vector<v8::Local<v8::Value>>& params) {
Tom Sepez3a6d0582018-08-17 19:28:52 +00002478 return CJS_Result::Success();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07002479}
2480
Tom Sepez3a6d0582018-08-17 19:28:52 +00002481CJS_Result CJS_Field::setFocus(
Dan Sinclairf7435522018-02-05 22:27:22 +00002482 CJS_Runtime* pRuntime,
2483 const std::vector<v8::Local<v8::Value>>& params) {
Lei Zhang4c7ad662018-07-12 20:29:40 +00002484 CPDF_FormField* pFormField = GetFirstFormField();
2485 if (!pFormField)
Tom Sepez3a6d0582018-08-17 19:28:52 +00002486 return CJS_Result::Failure(JSMessage::kBadObjectError);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07002487
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002488 int32_t nCount = pFormField->CountControls();
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002489 if (nCount < 1)
Tom Sepez3a6d0582018-08-17 19:28:52 +00002490 return CJS_Result::Failure(JSMessage::kBadObjectError);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07002491
Lei Zhang073ecf42018-10-11 16:56:00 +00002492 CPDFSDK_InteractiveForm* pForm = m_pFormFillEnv->GetInteractiveForm();
thestig1cd352e2016-06-07 17:53:06 -07002493 CPDFSDK_Widget* pWidget = nullptr;
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002494 if (nCount == 1) {
Lei Zhang073ecf42018-10-11 16:56:00 +00002495 pWidget = pForm->GetWidget(pFormField->GetControl(0));
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002496 } else {
Tom Sepez101535f2018-06-12 13:36:05 +00002497 IPDF_Page* pPage = IPDFPageFromFPDFPage(m_pFormFillEnv->GetCurrentPage());
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002498 if (!pPage)
Tom Sepez3a6d0582018-08-17 19:28:52 +00002499 return CJS_Result::Failure(JSMessage::kBadObjectError);
dsinclair461eeaf2016-07-27 07:40:05 -07002500 if (CPDFSDK_PageView* pCurPageView =
dsinclair7cbe68e2016-10-12 11:56:23 -07002501 m_pFormFillEnv->GetPageView(pPage, true)) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002502 for (int32_t i = 0; i < nCount; i++) {
2503 if (CPDFSDK_Widget* pTempWidget =
Lei Zhang073ecf42018-10-11 16:56:00 +00002504 pForm->GetWidget(pFormField->GetControl(i))) {
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002505 if (pTempWidget->GetPDFPage() == pCurPageView->GetPDFPage()) {
2506 pWidget = pTempWidget;
2507 break;
2508 }
Tom Sepez2f2ffec2015-07-23 14:42:09 -07002509 }
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002510 }
Tom Sepez2f2ffec2015-07-23 14:42:09 -07002511 }
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002512 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07002513
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002514 if (pWidget) {
tsepezf8074ce2016-09-27 14:29:57 -07002515 CPDFSDK_Annot::ObservedPtr pObserved(pWidget);
dsinclair7cbe68e2016-10-12 11:56:23 -07002516 m_pFormFillEnv->SetFocusAnnot(&pObserved);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002517 }
2518
Tom Sepez3a6d0582018-08-17 19:28:52 +00002519 return CJS_Result::Success();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07002520}
2521
Tom Sepez3a6d0582018-08-17 19:28:52 +00002522CJS_Result CJS_Field::setItems(
Dan Sinclairf7435522018-02-05 22:27:22 +00002523 CJS_Runtime* pRuntime,
2524 const std::vector<v8::Local<v8::Value>>& params) {
Tom Sepez3a6d0582018-08-17 19:28:52 +00002525 return CJS_Result::Success();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07002526}
2527
Tom Sepez3a6d0582018-08-17 19:28:52 +00002528CJS_Result CJS_Field::setLock(CJS_Runtime* pRuntime,
Dan Sinclairf7435522018-02-05 22:27:22 +00002529 const std::vector<v8::Local<v8::Value>>& params) {
Tom Sepez3a6d0582018-08-17 19:28:52 +00002530 return CJS_Result::Failure(JSMessage::kNotSupportedError);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07002531}
2532
Tom Sepez3a6d0582018-08-17 19:28:52 +00002533CJS_Result CJS_Field::signatureGetModifications(
dan sinclair80435cb2017-10-24 21:40:24 -04002534 CJS_Runtime* pRuntime,
Dan Sinclair8f524d62017-10-25 13:30:31 -04002535 const std::vector<v8::Local<v8::Value>>& params) {
Tom Sepez3a6d0582018-08-17 19:28:52 +00002536 return CJS_Result::Failure(JSMessage::kNotSupportedError);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07002537}
2538
Tom Sepez3a6d0582018-08-17 19:28:52 +00002539CJS_Result CJS_Field::signatureGetSeedValue(
dan sinclair80435cb2017-10-24 21:40:24 -04002540 CJS_Runtime* pRuntime,
Dan Sinclair8f524d62017-10-25 13:30:31 -04002541 const std::vector<v8::Local<v8::Value>>& params) {
Tom Sepez3a6d0582018-08-17 19:28:52 +00002542 return CJS_Result::Failure(JSMessage::kNotSupportedError);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07002543}
2544
Tom Sepez3a6d0582018-08-17 19:28:52 +00002545CJS_Result CJS_Field::signatureInfo(
dan sinclair80435cb2017-10-24 21:40:24 -04002546 CJS_Runtime* pRuntime,
Dan Sinclair8f524d62017-10-25 13:30:31 -04002547 const std::vector<v8::Local<v8::Value>>& params) {
Tom Sepez3a6d0582018-08-17 19:28:52 +00002548 return CJS_Result::Failure(JSMessage::kNotSupportedError);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07002549}
2550
Tom Sepez3a6d0582018-08-17 19:28:52 +00002551CJS_Result CJS_Field::signatureSetSeedValue(
Dan Sinclair8f524d62017-10-25 13:30:31 -04002552 CJS_Runtime* pRuntime,
2553 const std::vector<v8::Local<v8::Value>>& params) {
Tom Sepez3a6d0582018-08-17 19:28:52 +00002554 return CJS_Result::Failure(JSMessage::kNotSupportedError);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07002555}
2556
Tom Sepez3a6d0582018-08-17 19:28:52 +00002557CJS_Result CJS_Field::signatureSign(
Dan Sinclair8f524d62017-10-25 13:30:31 -04002558 CJS_Runtime* pRuntime,
2559 const std::vector<v8::Local<v8::Value>>& params) {
Tom Sepez3a6d0582018-08-17 19:28:52 +00002560 return CJS_Result::Failure(JSMessage::kNotSupportedError);
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07002561}
2562
Tom Sepez3a6d0582018-08-17 19:28:52 +00002563CJS_Result CJS_Field::signatureValidate(
Dan Sinclair8f524d62017-10-25 13:30:31 -04002564 CJS_Runtime* pRuntime,
2565 const std::vector<v8::Local<v8::Value>>& params) {
Tom Sepez3a6d0582018-08-17 19:28:52 +00002566 return CJS_Result::Failure(JSMessage::kNotSupportedError);
dan sinclaircbe23db2017-10-19 14:29:33 -04002567}
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002568
Tom Sepez3a6d0582018-08-17 19:28:52 +00002569CJS_Result CJS_Field::get_source(CJS_Runtime* pRuntime) {
2570 return CJS_Result::Success();
Dan Sinclair8f524d62017-10-25 13:30:31 -04002571}
2572
Tom Sepez3a6d0582018-08-17 19:28:52 +00002573CJS_Result CJS_Field::set_source(CJS_Runtime* pRuntime,
Dan Sinclairf7435522018-02-05 22:27:22 +00002574 v8::Local<v8::Value> vp) {
Tom Sepez3a6d0582018-08-17 19:28:52 +00002575 return CJS_Result::Success();
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07002576}
2577
Dan Sinclairf7435522018-02-05 22:27:22 +00002578void CJS_Field::AddDelay_Int(FIELD_PROP prop, int32_t n) {
Tom Sepez75acda62018-01-29 20:17:36 +00002579 auto pNewData =
2580 pdfium::MakeUnique<CJS_DelayData>(prop, m_nFormControlIndex, m_FieldName);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002581 pNewData->num = n;
Tom Sepez75acda62018-01-29 20:17:36 +00002582 m_pJSDoc->AddDelayData(std::move(pNewData));
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07002583}
2584
Dan Sinclairf7435522018-02-05 22:27:22 +00002585void CJS_Field::AddDelay_Bool(FIELD_PROP prop, bool b) {
Tom Sepez75acda62018-01-29 20:17:36 +00002586 auto pNewData =
2587 pdfium::MakeUnique<CJS_DelayData>(prop, m_nFormControlIndex, m_FieldName);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002588 pNewData->b = b;
Tom Sepez75acda62018-01-29 20:17:36 +00002589 m_pJSDoc->AddDelayData(std::move(pNewData));
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07002590}
2591
Lei Zhang109aa6d2018-09-20 01:21:05 +00002592void CJS_Field::AddDelay_String(FIELD_PROP prop, const ByteString& str) {
Tom Sepez75acda62018-01-29 20:17:36 +00002593 auto pNewData =
2594 pdfium::MakeUnique<CJS_DelayData>(prop, m_nFormControlIndex, m_FieldName);
Lei Zhang109aa6d2018-09-20 01:21:05 +00002595 pNewData->bytestring = str;
Tom Sepez75acda62018-01-29 20:17:36 +00002596 m_pJSDoc->AddDelayData(std::move(pNewData));
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07002597}
2598
Dan Sinclairf7435522018-02-05 22:27:22 +00002599void CJS_Field::AddDelay_Rect(FIELD_PROP prop, const CFX_FloatRect& rect) {
Tom Sepez75acda62018-01-29 20:17:36 +00002600 auto pNewData =
2601 pdfium::MakeUnique<CJS_DelayData>(prop, m_nFormControlIndex, m_FieldName);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002602 pNewData->rect = rect;
Tom Sepez75acda62018-01-29 20:17:36 +00002603 m_pJSDoc->AddDelayData(std::move(pNewData));
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07002604}
2605
Dan Sinclairf7435522018-02-05 22:27:22 +00002606void CJS_Field::AddDelay_WordArray(FIELD_PROP prop,
2607 const std::vector<uint32_t>& array) {
Tom Sepez75acda62018-01-29 20:17:36 +00002608 auto pNewData =
2609 pdfium::MakeUnique<CJS_DelayData>(prop, m_nFormControlIndex, m_FieldName);
tsepez41a53ad2016-03-28 16:59:30 -07002610 pNewData->wordarray = array;
Tom Sepez75acda62018-01-29 20:17:36 +00002611 m_pJSDoc->AddDelayData(std::move(pNewData));
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07002612}
2613
Dan Sinclairf7435522018-02-05 22:27:22 +00002614void CJS_Field::AddDelay_WideStringArray(FIELD_PROP prop,
2615 const std::vector<WideString>& array) {
Tom Sepez75acda62018-01-29 20:17:36 +00002616 auto pNewData =
2617 pdfium::MakeUnique<CJS_DelayData>(prop, m_nFormControlIndex, m_FieldName);
tsepez41a53ad2016-03-28 16:59:30 -07002618 pNewData->widestringarray = array;
Tom Sepez75acda62018-01-29 20:17:36 +00002619 m_pJSDoc->AddDelayData(std::move(pNewData));
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07002620}
2621
Dan Sinclairf7435522018-02-05 22:27:22 +00002622void CJS_Field::DoDelay(CPDFSDK_FormFillEnvironment* pFormFillEnv,
2623 CJS_DelayData* pData) {
dsinclair3a7741a2016-10-11 10:39:49 -07002624 ASSERT(pFormFillEnv);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002625 switch (pData->eProp) {
Tom Sepez2f2ffec2015-07-23 14:42:09 -07002626 case FP_BORDERSTYLE:
Lei Zhang94919f72018-07-12 21:16:30 +00002627 SetBorderStyle(pFormFillEnv, pData->sFieldName, pData->nControlIndex,
Lei Zhang109aa6d2018-09-20 01:21:05 +00002628 pData->bytestring);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002629 break;
Tom Sepez2f2ffec2015-07-23 14:42:09 -07002630 case FP_CURRENTVALUEINDICES:
Lei Zhang94919f72018-07-12 21:16:30 +00002631 SetCurrentValueIndices(pFormFillEnv, pData->sFieldName,
2632 pData->nControlIndex, pData->wordarray);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002633 break;
Tom Sepez2f2ffec2015-07-23 14:42:09 -07002634 case FP_DISPLAY:
Lei Zhang94919f72018-07-12 21:16:30 +00002635 SetDisplay(pFormFillEnv, pData->sFieldName, pData->nControlIndex,
2636 pData->num);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002637 break;
Tom Sepez2f2ffec2015-07-23 14:42:09 -07002638 case FP_HIDDEN:
Lei Zhang94919f72018-07-12 21:16:30 +00002639 SetHidden(pFormFillEnv, pData->sFieldName, pData->nControlIndex,
2640 pData->b);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002641 break;
Tom Sepez2f2ffec2015-07-23 14:42:09 -07002642 case FP_LINEWIDTH:
Lei Zhang94919f72018-07-12 21:16:30 +00002643 SetLineWidth(pFormFillEnv, pData->sFieldName, pData->nControlIndex,
2644 pData->num);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002645 break;
Tom Sepez2f2ffec2015-07-23 14:42:09 -07002646 case FP_RECT:
Lei Zhang94919f72018-07-12 21:16:30 +00002647 SetRect(pFormFillEnv, pData->sFieldName, pData->nControlIndex,
2648 pData->rect);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002649 break;
Tom Sepez2f2ffec2015-07-23 14:42:09 -07002650 case FP_VALUE:
Lei Zhang94919f72018-07-12 21:16:30 +00002651 SetValue(pFormFillEnv, pData->sFieldName, pData->nControlIndex,
2652 pData->widestringarray);
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002653 break;
dan sinclair646634b2017-10-19 14:30:28 -04002654 default:
2655 NOTREACHED();
Nico Weber9d8ec5a2015-08-04 13:00:21 -07002656 }
John Abd-El-Malek3f3b45c2014-05-23 17:28:10 -07002657}