xref: /aosp_15_r20/external/pdfium/fxjs/cjs_field.cpp (revision 3ac0a46f773bac49fa9476ec2b1cf3f8da5ec3a4)
1*3ac0a46fSAndroid Build Coastguard Worker // Copyright 2014 The PDFium Authors
2*3ac0a46fSAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*3ac0a46fSAndroid Build Coastguard Worker // found in the LICENSE file.
4*3ac0a46fSAndroid Build Coastguard Worker 
5*3ac0a46fSAndroid Build Coastguard Worker // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6*3ac0a46fSAndroid Build Coastguard Worker 
7*3ac0a46fSAndroid Build Coastguard Worker #include "fxjs/cjs_field.h"
8*3ac0a46fSAndroid Build Coastguard Worker 
9*3ac0a46fSAndroid Build Coastguard Worker #include <algorithm>
10*3ac0a46fSAndroid Build Coastguard Worker #include <memory>
11*3ac0a46fSAndroid Build Coastguard Worker #include <utility>
12*3ac0a46fSAndroid Build Coastguard Worker 
13*3ac0a46fSAndroid Build Coastguard Worker #include "constants/access_permissions.h"
14*3ac0a46fSAndroid Build Coastguard Worker #include "constants/annotation_flags.h"
15*3ac0a46fSAndroid Build Coastguard Worker #include "constants/form_flags.h"
16*3ac0a46fSAndroid Build Coastguard Worker #include "core/fpdfapi/parser/cpdf_stream.h"
17*3ac0a46fSAndroid Build Coastguard Worker #include "core/fpdfdoc/cpdf_formcontrol.h"
18*3ac0a46fSAndroid Build Coastguard Worker #include "core/fpdfdoc/cpdf_formfield.h"
19*3ac0a46fSAndroid Build Coastguard Worker #include "core/fpdfdoc/cpdf_interactiveform.h"
20*3ac0a46fSAndroid Build Coastguard Worker #include "fpdfsdk/cpdfsdk_formfillenvironment.h"
21*3ac0a46fSAndroid Build Coastguard Worker #include "fpdfsdk/cpdfsdk_interactiveform.h"
22*3ac0a46fSAndroid Build Coastguard Worker #include "fpdfsdk/cpdfsdk_pageview.h"
23*3ac0a46fSAndroid Build Coastguard Worker #include "fpdfsdk/cpdfsdk_widget.h"
24*3ac0a46fSAndroid Build Coastguard Worker #include "fxjs/cjs_color.h"
25*3ac0a46fSAndroid Build Coastguard Worker #include "fxjs/cjs_delaydata.h"
26*3ac0a46fSAndroid Build Coastguard Worker #include "fxjs/cjs_document.h"
27*3ac0a46fSAndroid Build Coastguard Worker #include "fxjs/cjs_icon.h"
28*3ac0a46fSAndroid Build Coastguard Worker #include "fxjs/fxv8.h"
29*3ac0a46fSAndroid Build Coastguard Worker #include "fxjs/js_resources.h"
30*3ac0a46fSAndroid Build Coastguard Worker #include "third_party/abseil-cpp/absl/types/optional.h"
31*3ac0a46fSAndroid Build Coastguard Worker #include "third_party/base/check.h"
32*3ac0a46fSAndroid Build Coastguard Worker #include "third_party/base/notreached.h"
33*3ac0a46fSAndroid Build Coastguard Worker #include "v8/include/v8-container.h"
34*3ac0a46fSAndroid Build Coastguard Worker 
35*3ac0a46fSAndroid Build Coastguard Worker namespace {
36*3ac0a46fSAndroid Build Coastguard Worker 
37*3ac0a46fSAndroid Build Coastguard Worker constexpr wchar_t kCheckSelector = L'4';
38*3ac0a46fSAndroid Build Coastguard Worker constexpr wchar_t kCircleSelector = L'l';
39*3ac0a46fSAndroid Build Coastguard Worker constexpr wchar_t kCrossSelector = L'8';
40*3ac0a46fSAndroid Build Coastguard Worker constexpr wchar_t kDiamondSelector = L'u';
41*3ac0a46fSAndroid Build Coastguard Worker constexpr wchar_t kSquareSelector = L'n';
42*3ac0a46fSAndroid Build Coastguard Worker constexpr wchar_t kStarSelector = L'H';
43*3ac0a46fSAndroid Build Coastguard Worker 
IsCheckBoxOrRadioButton(const CPDF_FormField * pFormField)44*3ac0a46fSAndroid Build Coastguard Worker bool IsCheckBoxOrRadioButton(const CPDF_FormField* pFormField) {
45*3ac0a46fSAndroid Build Coastguard Worker   return pFormField->GetFieldType() == FormFieldType::kCheckBox ||
46*3ac0a46fSAndroid Build Coastguard Worker          pFormField->GetFieldType() == FormFieldType::kRadioButton;
47*3ac0a46fSAndroid Build Coastguard Worker }
48*3ac0a46fSAndroid Build Coastguard Worker 
IsComboBoxOrListBox(const CPDF_FormField * pFormField)49*3ac0a46fSAndroid Build Coastguard Worker bool IsComboBoxOrListBox(const CPDF_FormField* pFormField) {
50*3ac0a46fSAndroid Build Coastguard Worker   return pFormField->GetFieldType() == FormFieldType::kComboBox ||
51*3ac0a46fSAndroid Build Coastguard Worker          pFormField->GetFieldType() == FormFieldType::kListBox;
52*3ac0a46fSAndroid Build Coastguard Worker }
53*3ac0a46fSAndroid Build Coastguard Worker 
IsComboBoxOrTextField(const CPDF_FormField * pFormField)54*3ac0a46fSAndroid Build Coastguard Worker bool IsComboBoxOrTextField(const CPDF_FormField* pFormField) {
55*3ac0a46fSAndroid Build Coastguard Worker   return pFormField->GetFieldType() == FormFieldType::kComboBox ||
56*3ac0a46fSAndroid Build Coastguard Worker          pFormField->GetFieldType() == FormFieldType::kTextField;
57*3ac0a46fSAndroid Build Coastguard Worker }
58*3ac0a46fSAndroid Build Coastguard Worker 
UpdateFormField(CPDFSDK_FormFillEnvironment * pFormFillEnv,CPDF_FormField * pFormField,bool bResetAP)59*3ac0a46fSAndroid Build Coastguard Worker void UpdateFormField(CPDFSDK_FormFillEnvironment* pFormFillEnv,
60*3ac0a46fSAndroid Build Coastguard Worker                      CPDF_FormField* pFormField,
61*3ac0a46fSAndroid Build Coastguard Worker                      bool bResetAP) {
62*3ac0a46fSAndroid Build Coastguard Worker   CPDFSDK_InteractiveForm* pForm = pFormFillEnv->GetInteractiveForm();
63*3ac0a46fSAndroid Build Coastguard Worker   if (bResetAP) {
64*3ac0a46fSAndroid Build Coastguard Worker     std::vector<ObservedPtr<CPDFSDK_Widget>> widgets;
65*3ac0a46fSAndroid Build Coastguard Worker     pForm->GetWidgets(pFormField, &widgets);
66*3ac0a46fSAndroid Build Coastguard Worker 
67*3ac0a46fSAndroid Build Coastguard Worker     if (IsComboBoxOrTextField(pFormField)) {
68*3ac0a46fSAndroid Build Coastguard Worker       for (auto& pWidget : widgets) {
69*3ac0a46fSAndroid Build Coastguard Worker         if (pWidget) {
70*3ac0a46fSAndroid Build Coastguard Worker           absl::optional<WideString> sValue = pWidget->OnFormat();
71*3ac0a46fSAndroid Build Coastguard Worker           if (pWidget) {  // Not redundant, may be clobbered by OnFormat.
72*3ac0a46fSAndroid Build Coastguard Worker             pWidget->ResetAppearance(sValue, CPDFSDK_Widget::kValueUnchanged);
73*3ac0a46fSAndroid Build Coastguard Worker           }
74*3ac0a46fSAndroid Build Coastguard Worker         }
75*3ac0a46fSAndroid Build Coastguard Worker       }
76*3ac0a46fSAndroid Build Coastguard Worker     } else {
77*3ac0a46fSAndroid Build Coastguard Worker       for (auto& pWidget : widgets) {
78*3ac0a46fSAndroid Build Coastguard Worker         if (pWidget) {
79*3ac0a46fSAndroid Build Coastguard Worker           pWidget->ResetAppearance(absl::nullopt,
80*3ac0a46fSAndroid Build Coastguard Worker                                    CPDFSDK_Widget::kValueUnchanged);
81*3ac0a46fSAndroid Build Coastguard Worker         }
82*3ac0a46fSAndroid Build Coastguard Worker       }
83*3ac0a46fSAndroid Build Coastguard Worker     }
84*3ac0a46fSAndroid Build Coastguard Worker   }
85*3ac0a46fSAndroid Build Coastguard Worker 
86*3ac0a46fSAndroid Build Coastguard Worker   // Refresh the widget list. The calls in |bResetAP| may have caused widgets
87*3ac0a46fSAndroid Build Coastguard Worker   // to be removed from the list. We need to call |GetWidgets| again to be
88*3ac0a46fSAndroid Build Coastguard Worker   // sure none of the widgets have been deleted.
89*3ac0a46fSAndroid Build Coastguard Worker   std::vector<ObservedPtr<CPDFSDK_Widget>> widgets;
90*3ac0a46fSAndroid Build Coastguard Worker   pForm->GetWidgets(pFormField, &widgets);
91*3ac0a46fSAndroid Build Coastguard Worker   for (auto& pWidget : widgets) {
92*3ac0a46fSAndroid Build Coastguard Worker     if (pWidget)
93*3ac0a46fSAndroid Build Coastguard Worker       pFormFillEnv->UpdateAllViews(pWidget.Get());
94*3ac0a46fSAndroid Build Coastguard Worker   }
95*3ac0a46fSAndroid Build Coastguard Worker   pFormFillEnv->SetChangeMark();
96*3ac0a46fSAndroid Build Coastguard Worker }
97*3ac0a46fSAndroid Build Coastguard Worker 
UpdateFormControl(CPDFSDK_FormFillEnvironment * pFormFillEnv,CPDF_FormControl * pFormControl,bool bResetAP)98*3ac0a46fSAndroid Build Coastguard Worker void UpdateFormControl(CPDFSDK_FormFillEnvironment* pFormFillEnv,
99*3ac0a46fSAndroid Build Coastguard Worker                        CPDF_FormControl* pFormControl,
100*3ac0a46fSAndroid Build Coastguard Worker                        bool bResetAP) {
101*3ac0a46fSAndroid Build Coastguard Worker   DCHECK(pFormControl);
102*3ac0a46fSAndroid Build Coastguard Worker   CPDFSDK_InteractiveForm* pForm = pFormFillEnv->GetInteractiveForm();
103*3ac0a46fSAndroid Build Coastguard Worker   CPDFSDK_Widget* pWidget = pForm->GetWidget(pFormControl);
104*3ac0a46fSAndroid Build Coastguard Worker   if (pWidget) {
105*3ac0a46fSAndroid Build Coastguard Worker     ObservedPtr<CPDFSDK_Widget> observed_widget(pWidget);
106*3ac0a46fSAndroid Build Coastguard Worker     if (bResetAP) {
107*3ac0a46fSAndroid Build Coastguard Worker       FormFieldType fieldType = pWidget->GetFieldType();
108*3ac0a46fSAndroid Build Coastguard Worker       if (fieldType == FormFieldType::kComboBox ||
109*3ac0a46fSAndroid Build Coastguard Worker           fieldType == FormFieldType::kTextField) {
110*3ac0a46fSAndroid Build Coastguard Worker         absl::optional<WideString> sValue = pWidget->OnFormat();
111*3ac0a46fSAndroid Build Coastguard Worker         if (!observed_widget)
112*3ac0a46fSAndroid Build Coastguard Worker           return;
113*3ac0a46fSAndroid Build Coastguard Worker         pWidget->ResetAppearance(sValue, CPDFSDK_Widget::kValueUnchanged);
114*3ac0a46fSAndroid Build Coastguard Worker       } else {
115*3ac0a46fSAndroid Build Coastguard Worker         pWidget->ResetAppearance(absl::nullopt,
116*3ac0a46fSAndroid Build Coastguard Worker                                  CPDFSDK_Widget::kValueUnchanged);
117*3ac0a46fSAndroid Build Coastguard Worker       }
118*3ac0a46fSAndroid Build Coastguard Worker       if (!observed_widget)
119*3ac0a46fSAndroid Build Coastguard Worker         return;
120*3ac0a46fSAndroid Build Coastguard Worker     }
121*3ac0a46fSAndroid Build Coastguard Worker     pFormFillEnv->UpdateAllViews(pWidget);
122*3ac0a46fSAndroid Build Coastguard Worker   }
123*3ac0a46fSAndroid Build Coastguard Worker   pFormFillEnv->SetChangeMark();
124*3ac0a46fSAndroid Build Coastguard Worker }
125*3ac0a46fSAndroid Build Coastguard Worker 
126*3ac0a46fSAndroid Build Coastguard Worker struct FieldNameData {
FieldNameData__anonb7fd2a390111::FieldNameData127*3ac0a46fSAndroid Build Coastguard Worker   FieldNameData(WideString field_name_in, int control_index_in)
128*3ac0a46fSAndroid Build Coastguard Worker       : field_name(field_name_in), control_index(control_index_in) {}
129*3ac0a46fSAndroid Build Coastguard Worker 
130*3ac0a46fSAndroid Build Coastguard Worker   WideString field_name;
131*3ac0a46fSAndroid Build Coastguard Worker   int control_index;
132*3ac0a46fSAndroid Build Coastguard Worker };
133*3ac0a46fSAndroid Build Coastguard Worker 
ParseFieldName(const WideString & field_name)134*3ac0a46fSAndroid Build Coastguard Worker absl::optional<FieldNameData> ParseFieldName(const WideString& field_name) {
135*3ac0a46fSAndroid Build Coastguard Worker   auto reverse_it = field_name.rbegin();
136*3ac0a46fSAndroid Build Coastguard Worker   while (reverse_it != field_name.rend()) {
137*3ac0a46fSAndroid Build Coastguard Worker     if (*reverse_it == L'.')
138*3ac0a46fSAndroid Build Coastguard Worker       break;
139*3ac0a46fSAndroid Build Coastguard Worker     ++reverse_it;
140*3ac0a46fSAndroid Build Coastguard Worker   }
141*3ac0a46fSAndroid Build Coastguard Worker   if (reverse_it == field_name.rend()) {
142*3ac0a46fSAndroid Build Coastguard Worker     return absl::nullopt;
143*3ac0a46fSAndroid Build Coastguard Worker   }
144*3ac0a46fSAndroid Build Coastguard Worker   WideString suffixal = field_name.Last(reverse_it - field_name.rbegin());
145*3ac0a46fSAndroid Build Coastguard Worker   int control_index = FXSYS_wtoi(suffixal.c_str());
146*3ac0a46fSAndroid Build Coastguard Worker   if (control_index == 0) {
147*3ac0a46fSAndroid Build Coastguard Worker     suffixal.TrimRight(L' ');
148*3ac0a46fSAndroid Build Coastguard Worker     if (suffixal != L"0") {
149*3ac0a46fSAndroid Build Coastguard Worker       return absl::nullopt;
150*3ac0a46fSAndroid Build Coastguard Worker     }
151*3ac0a46fSAndroid Build Coastguard Worker   }
152*3ac0a46fSAndroid Build Coastguard Worker   return FieldNameData(field_name.First(field_name.rend() - reverse_it - 1),
153*3ac0a46fSAndroid Build Coastguard Worker                        control_index);
154*3ac0a46fSAndroid Build Coastguard Worker }
155*3ac0a46fSAndroid Build Coastguard Worker 
GetFormFieldsForName(CPDFSDK_FormFillEnvironment * pFormFillEnv,const WideString & csFieldName)156*3ac0a46fSAndroid Build Coastguard Worker std::vector<CPDF_FormField*> GetFormFieldsForName(
157*3ac0a46fSAndroid Build Coastguard Worker     CPDFSDK_FormFillEnvironment* pFormFillEnv,
158*3ac0a46fSAndroid Build Coastguard Worker     const WideString& csFieldName) {
159*3ac0a46fSAndroid Build Coastguard Worker   std::vector<CPDF_FormField*> fields;
160*3ac0a46fSAndroid Build Coastguard Worker   CPDFSDK_InteractiveForm* pReaderForm = pFormFillEnv->GetInteractiveForm();
161*3ac0a46fSAndroid Build Coastguard Worker   CPDF_InteractiveForm* pForm = pReaderForm->GetInteractiveForm();
162*3ac0a46fSAndroid Build Coastguard Worker   const size_t sz = pForm->CountFields(csFieldName);
163*3ac0a46fSAndroid Build Coastguard Worker   for (size_t i = 0; i < sz; ++i) {
164*3ac0a46fSAndroid Build Coastguard Worker     CPDF_FormField* pFormField = pForm->GetField(i, csFieldName);
165*3ac0a46fSAndroid Build Coastguard Worker     if (pFormField)
166*3ac0a46fSAndroid Build Coastguard Worker       fields.push_back(pFormField);
167*3ac0a46fSAndroid Build Coastguard Worker   }
168*3ac0a46fSAndroid Build Coastguard Worker   return fields;
169*3ac0a46fSAndroid Build Coastguard Worker }
170*3ac0a46fSAndroid Build Coastguard Worker 
GetFormControlColor(CPDF_FormControl * pFormControl,const ByteString & entry)171*3ac0a46fSAndroid Build Coastguard Worker CFX_Color GetFormControlColor(CPDF_FormControl* pFormControl,
172*3ac0a46fSAndroid Build Coastguard Worker                               const ByteString& entry) {
173*3ac0a46fSAndroid Build Coastguard Worker   switch (pFormControl->GetColorARGB(entry).color_type) {
174*3ac0a46fSAndroid Build Coastguard Worker     case CFX_Color::Type::kTransparent:
175*3ac0a46fSAndroid Build Coastguard Worker       return CFX_Color(CFX_Color::Type::kTransparent);
176*3ac0a46fSAndroid Build Coastguard Worker     case CFX_Color::Type::kGray:
177*3ac0a46fSAndroid Build Coastguard Worker       return CFX_Color(CFX_Color::Type::kGray,
178*3ac0a46fSAndroid Build Coastguard Worker                        pFormControl->GetOriginalColorComponent(0, entry));
179*3ac0a46fSAndroid Build Coastguard Worker     case CFX_Color::Type::kRGB:
180*3ac0a46fSAndroid Build Coastguard Worker       return CFX_Color(CFX_Color::Type::kRGB,
181*3ac0a46fSAndroid Build Coastguard Worker                        pFormControl->GetOriginalColorComponent(0, entry),
182*3ac0a46fSAndroid Build Coastguard Worker                        pFormControl->GetOriginalColorComponent(1, entry),
183*3ac0a46fSAndroid Build Coastguard Worker                        pFormControl->GetOriginalColorComponent(2, entry));
184*3ac0a46fSAndroid Build Coastguard Worker     case CFX_Color::Type::kCMYK:
185*3ac0a46fSAndroid Build Coastguard Worker       return CFX_Color(CFX_Color::Type::kCMYK,
186*3ac0a46fSAndroid Build Coastguard Worker                        pFormControl->GetOriginalColorComponent(0, entry),
187*3ac0a46fSAndroid Build Coastguard Worker                        pFormControl->GetOriginalColorComponent(1, entry),
188*3ac0a46fSAndroid Build Coastguard Worker                        pFormControl->GetOriginalColorComponent(2, entry),
189*3ac0a46fSAndroid Build Coastguard Worker                        pFormControl->GetOriginalColorComponent(3, entry));
190*3ac0a46fSAndroid Build Coastguard Worker   }
191*3ac0a46fSAndroid Build Coastguard Worker }
192*3ac0a46fSAndroid Build Coastguard Worker 
SetWidgetDisplayStatus(CPDFSDK_Widget * pWidget,int value)193*3ac0a46fSAndroid Build Coastguard Worker bool SetWidgetDisplayStatus(CPDFSDK_Widget* pWidget, int value) {
194*3ac0a46fSAndroid Build Coastguard Worker   if (!pWidget)
195*3ac0a46fSAndroid Build Coastguard Worker     return false;
196*3ac0a46fSAndroid Build Coastguard Worker 
197*3ac0a46fSAndroid Build Coastguard Worker   uint32_t dwFlag = pWidget->GetFlags();
198*3ac0a46fSAndroid Build Coastguard Worker   switch (value) {
199*3ac0a46fSAndroid Build Coastguard Worker     case 0:
200*3ac0a46fSAndroid Build Coastguard Worker       dwFlag &= ~pdfium::annotation_flags::kInvisible;
201*3ac0a46fSAndroid Build Coastguard Worker       dwFlag &= ~pdfium::annotation_flags::kHidden;
202*3ac0a46fSAndroid Build Coastguard Worker       dwFlag &= ~pdfium::annotation_flags::kNoView;
203*3ac0a46fSAndroid Build Coastguard Worker       dwFlag |= pdfium::annotation_flags::kPrint;
204*3ac0a46fSAndroid Build Coastguard Worker       break;
205*3ac0a46fSAndroid Build Coastguard Worker     case 1:
206*3ac0a46fSAndroid Build Coastguard Worker       dwFlag &= ~pdfium::annotation_flags::kInvisible;
207*3ac0a46fSAndroid Build Coastguard Worker       dwFlag &= ~pdfium::annotation_flags::kNoView;
208*3ac0a46fSAndroid Build Coastguard Worker       dwFlag |= (pdfium::annotation_flags::kHidden |
209*3ac0a46fSAndroid Build Coastguard Worker                  pdfium::annotation_flags::kPrint);
210*3ac0a46fSAndroid Build Coastguard Worker       break;
211*3ac0a46fSAndroid Build Coastguard Worker     case 2:
212*3ac0a46fSAndroid Build Coastguard Worker       dwFlag &= ~pdfium::annotation_flags::kInvisible;
213*3ac0a46fSAndroid Build Coastguard Worker       dwFlag &= ~pdfium::annotation_flags::kPrint;
214*3ac0a46fSAndroid Build Coastguard Worker       dwFlag &= ~pdfium::annotation_flags::kHidden;
215*3ac0a46fSAndroid Build Coastguard Worker       dwFlag &= ~pdfium::annotation_flags::kNoView;
216*3ac0a46fSAndroid Build Coastguard Worker       break;
217*3ac0a46fSAndroid Build Coastguard Worker     case 3:
218*3ac0a46fSAndroid Build Coastguard Worker       dwFlag |= pdfium::annotation_flags::kNoView;
219*3ac0a46fSAndroid Build Coastguard Worker       dwFlag |= pdfium::annotation_flags::kPrint;
220*3ac0a46fSAndroid Build Coastguard Worker       dwFlag &= ~pdfium::annotation_flags::kHidden;
221*3ac0a46fSAndroid Build Coastguard Worker       break;
222*3ac0a46fSAndroid Build Coastguard Worker   }
223*3ac0a46fSAndroid Build Coastguard Worker 
224*3ac0a46fSAndroid Build Coastguard Worker   if (dwFlag != pWidget->GetFlags()) {
225*3ac0a46fSAndroid Build Coastguard Worker     pWidget->SetFlags(dwFlag);
226*3ac0a46fSAndroid Build Coastguard Worker     return true;
227*3ac0a46fSAndroid Build Coastguard Worker   }
228*3ac0a46fSAndroid Build Coastguard Worker 
229*3ac0a46fSAndroid Build Coastguard Worker   return false;
230*3ac0a46fSAndroid Build Coastguard Worker }
231*3ac0a46fSAndroid Build Coastguard Worker 
SetBorderStyle(CPDFSDK_FormFillEnvironment * pFormFillEnv,const WideString & swFieldName,int nControlIndex,const ByteString & bsString)232*3ac0a46fSAndroid Build Coastguard Worker void SetBorderStyle(CPDFSDK_FormFillEnvironment* pFormFillEnv,
233*3ac0a46fSAndroid Build Coastguard Worker                     const WideString& swFieldName,
234*3ac0a46fSAndroid Build Coastguard Worker                     int nControlIndex,
235*3ac0a46fSAndroid Build Coastguard Worker                     const ByteString& bsString) {
236*3ac0a46fSAndroid Build Coastguard Worker   DCHECK(pFormFillEnv);
237*3ac0a46fSAndroid Build Coastguard Worker 
238*3ac0a46fSAndroid Build Coastguard Worker   BorderStyle nBorderStyle;
239*3ac0a46fSAndroid Build Coastguard Worker   if (bsString == "solid")
240*3ac0a46fSAndroid Build Coastguard Worker     nBorderStyle = BorderStyle::kSolid;
241*3ac0a46fSAndroid Build Coastguard Worker   else if (bsString == "beveled")
242*3ac0a46fSAndroid Build Coastguard Worker     nBorderStyle = BorderStyle::kBeveled;
243*3ac0a46fSAndroid Build Coastguard Worker   else if (bsString == "dashed")
244*3ac0a46fSAndroid Build Coastguard Worker     nBorderStyle = BorderStyle::kDash;
245*3ac0a46fSAndroid Build Coastguard Worker   else if (bsString == "inset")
246*3ac0a46fSAndroid Build Coastguard Worker     nBorderStyle = BorderStyle::kInset;
247*3ac0a46fSAndroid Build Coastguard Worker   else if (bsString == "underline")
248*3ac0a46fSAndroid Build Coastguard Worker     nBorderStyle = BorderStyle::kUnderline;
249*3ac0a46fSAndroid Build Coastguard Worker   else
250*3ac0a46fSAndroid Build Coastguard Worker     return;
251*3ac0a46fSAndroid Build Coastguard Worker 
252*3ac0a46fSAndroid Build Coastguard Worker   std::vector<CPDF_FormField*> FieldArray =
253*3ac0a46fSAndroid Build Coastguard Worker       GetFormFieldsForName(pFormFillEnv, swFieldName);
254*3ac0a46fSAndroid Build Coastguard Worker   auto* pForm = pFormFillEnv->GetInteractiveForm();
255*3ac0a46fSAndroid Build Coastguard Worker   for (CPDF_FormField* pFormField : FieldArray) {
256*3ac0a46fSAndroid Build Coastguard Worker     if (nControlIndex < 0) {
257*3ac0a46fSAndroid Build Coastguard Worker       bool bSet = false;
258*3ac0a46fSAndroid Build Coastguard Worker       for (int i = 0, sz = pFormField->CountControls(); i < sz; ++i) {
259*3ac0a46fSAndroid Build Coastguard Worker         CPDFSDK_Widget* pWidget = pForm->GetWidget(pFormField->GetControl(i));
260*3ac0a46fSAndroid Build Coastguard Worker         if (pWidget) {
261*3ac0a46fSAndroid Build Coastguard Worker           if (pWidget->GetBorderStyle() != nBorderStyle) {
262*3ac0a46fSAndroid Build Coastguard Worker             pWidget->SetBorderStyle(nBorderStyle);
263*3ac0a46fSAndroid Build Coastguard Worker             bSet = true;
264*3ac0a46fSAndroid Build Coastguard Worker           }
265*3ac0a46fSAndroid Build Coastguard Worker         }
266*3ac0a46fSAndroid Build Coastguard Worker       }
267*3ac0a46fSAndroid Build Coastguard Worker       if (bSet)
268*3ac0a46fSAndroid Build Coastguard Worker         UpdateFormField(pFormFillEnv, pFormField, true);
269*3ac0a46fSAndroid Build Coastguard Worker     } else {
270*3ac0a46fSAndroid Build Coastguard Worker       if (nControlIndex >= pFormField->CountControls())
271*3ac0a46fSAndroid Build Coastguard Worker         return;
272*3ac0a46fSAndroid Build Coastguard Worker       if (CPDF_FormControl* pFormControl =
273*3ac0a46fSAndroid Build Coastguard Worker               pFormField->GetControl(nControlIndex)) {
274*3ac0a46fSAndroid Build Coastguard Worker         CPDFSDK_Widget* pWidget = pForm->GetWidget(pFormControl);
275*3ac0a46fSAndroid Build Coastguard Worker         if (pWidget) {
276*3ac0a46fSAndroid Build Coastguard Worker           if (pWidget->GetBorderStyle() != nBorderStyle) {
277*3ac0a46fSAndroid Build Coastguard Worker             pWidget->SetBorderStyle(nBorderStyle);
278*3ac0a46fSAndroid Build Coastguard Worker             UpdateFormControl(pFormFillEnv, pFormControl, true);
279*3ac0a46fSAndroid Build Coastguard Worker           }
280*3ac0a46fSAndroid Build Coastguard Worker         }
281*3ac0a46fSAndroid Build Coastguard Worker       }
282*3ac0a46fSAndroid Build Coastguard Worker     }
283*3ac0a46fSAndroid Build Coastguard Worker   }
284*3ac0a46fSAndroid Build Coastguard Worker }
285*3ac0a46fSAndroid Build Coastguard Worker 
SetCurrentValueIndices(CPDFSDK_FormFillEnvironment * pFormFillEnv,const WideString & swFieldName,int nControlIndex,const std::vector<uint32_t> & array)286*3ac0a46fSAndroid Build Coastguard Worker void SetCurrentValueIndices(CPDFSDK_FormFillEnvironment* pFormFillEnv,
287*3ac0a46fSAndroid Build Coastguard Worker                             const WideString& swFieldName,
288*3ac0a46fSAndroid Build Coastguard Worker                             int nControlIndex,
289*3ac0a46fSAndroid Build Coastguard Worker                             const std::vector<uint32_t>& array) {
290*3ac0a46fSAndroid Build Coastguard Worker   DCHECK(pFormFillEnv);
291*3ac0a46fSAndroid Build Coastguard Worker   std::vector<CPDF_FormField*> FieldArray =
292*3ac0a46fSAndroid Build Coastguard Worker       GetFormFieldsForName(pFormFillEnv, swFieldName);
293*3ac0a46fSAndroid Build Coastguard Worker 
294*3ac0a46fSAndroid Build Coastguard Worker   for (CPDF_FormField* pFormField : FieldArray) {
295*3ac0a46fSAndroid Build Coastguard Worker     if (!IsComboBoxOrListBox(pFormField))
296*3ac0a46fSAndroid Build Coastguard Worker       continue;
297*3ac0a46fSAndroid Build Coastguard Worker 
298*3ac0a46fSAndroid Build Coastguard Worker     uint32_t dwFieldFlags = pFormField->GetFieldFlags();
299*3ac0a46fSAndroid Build Coastguard Worker     pFormField->ClearSelection(NotificationOption::kNotify);
300*3ac0a46fSAndroid Build Coastguard Worker     for (size_t i = 0; i < array.size(); ++i) {
301*3ac0a46fSAndroid Build Coastguard Worker       if (i != 0 && !(dwFieldFlags & pdfium::form_flags::kChoiceMultiSelect))
302*3ac0a46fSAndroid Build Coastguard Worker         break;
303*3ac0a46fSAndroid Build Coastguard Worker       if (array[i] < static_cast<uint32_t>(pFormField->CountOptions()) &&
304*3ac0a46fSAndroid Build Coastguard Worker           !pFormField->IsItemSelected(array[i])) {
305*3ac0a46fSAndroid Build Coastguard Worker         pFormField->SetItemSelection(array[i],
306*3ac0a46fSAndroid Build Coastguard Worker                                      NotificationOption::kDoNotNotify);
307*3ac0a46fSAndroid Build Coastguard Worker       }
308*3ac0a46fSAndroid Build Coastguard Worker     }
309*3ac0a46fSAndroid Build Coastguard Worker     UpdateFormField(pFormFillEnv, pFormField, true);
310*3ac0a46fSAndroid Build Coastguard Worker   }
311*3ac0a46fSAndroid Build Coastguard Worker }
312*3ac0a46fSAndroid Build Coastguard Worker 
SetDisplay(CPDFSDK_FormFillEnvironment * pFormFillEnv,const WideString & swFieldName,int nControlIndex,int number)313*3ac0a46fSAndroid Build Coastguard Worker void SetDisplay(CPDFSDK_FormFillEnvironment* pFormFillEnv,
314*3ac0a46fSAndroid Build Coastguard Worker                 const WideString& swFieldName,
315*3ac0a46fSAndroid Build Coastguard Worker                 int nControlIndex,
316*3ac0a46fSAndroid Build Coastguard Worker                 int number) {
317*3ac0a46fSAndroid Build Coastguard Worker   CPDFSDK_InteractiveForm* pForm = pFormFillEnv->GetInteractiveForm();
318*3ac0a46fSAndroid Build Coastguard Worker   std::vector<CPDF_FormField*> FieldArray =
319*3ac0a46fSAndroid Build Coastguard Worker       GetFormFieldsForName(pFormFillEnv, swFieldName);
320*3ac0a46fSAndroid Build Coastguard Worker   for (CPDF_FormField* pFormField : FieldArray) {
321*3ac0a46fSAndroid Build Coastguard Worker     if (nControlIndex < 0) {
322*3ac0a46fSAndroid Build Coastguard Worker       bool bAnySet = false;
323*3ac0a46fSAndroid Build Coastguard Worker       for (int i = 0, sz = pFormField->CountControls(); i < sz; ++i) {
324*3ac0a46fSAndroid Build Coastguard Worker         CPDF_FormControl* pFormControl = pFormField->GetControl(i);
325*3ac0a46fSAndroid Build Coastguard Worker         DCHECK(pFormControl);
326*3ac0a46fSAndroid Build Coastguard Worker 
327*3ac0a46fSAndroid Build Coastguard Worker         CPDFSDK_Widget* pWidget = pForm->GetWidget(pFormControl);
328*3ac0a46fSAndroid Build Coastguard Worker         if (SetWidgetDisplayStatus(pWidget, number))
329*3ac0a46fSAndroid Build Coastguard Worker           bAnySet = true;
330*3ac0a46fSAndroid Build Coastguard Worker       }
331*3ac0a46fSAndroid Build Coastguard Worker 
332*3ac0a46fSAndroid Build Coastguard Worker       if (bAnySet)
333*3ac0a46fSAndroid Build Coastguard Worker         UpdateFormField(pFormFillEnv, pFormField, false);
334*3ac0a46fSAndroid Build Coastguard Worker     } else {
335*3ac0a46fSAndroid Build Coastguard Worker       if (nControlIndex >= pFormField->CountControls())
336*3ac0a46fSAndroid Build Coastguard Worker         return;
337*3ac0a46fSAndroid Build Coastguard Worker 
338*3ac0a46fSAndroid Build Coastguard Worker       CPDF_FormControl* pFormControl = pFormField->GetControl(nControlIndex);
339*3ac0a46fSAndroid Build Coastguard Worker       if (!pFormControl)
340*3ac0a46fSAndroid Build Coastguard Worker         return;
341*3ac0a46fSAndroid Build Coastguard Worker 
342*3ac0a46fSAndroid Build Coastguard Worker       CPDFSDK_Widget* pWidget = pForm->GetWidget(pFormControl);
343*3ac0a46fSAndroid Build Coastguard Worker       if (SetWidgetDisplayStatus(pWidget, number))
344*3ac0a46fSAndroid Build Coastguard Worker         UpdateFormControl(pFormFillEnv, pFormControl, false);
345*3ac0a46fSAndroid Build Coastguard Worker     }
346*3ac0a46fSAndroid Build Coastguard Worker   }
347*3ac0a46fSAndroid Build Coastguard Worker }
348*3ac0a46fSAndroid Build Coastguard Worker 
SetHidden(CPDFSDK_FormFillEnvironment * pFormFillEnv,const WideString & swFieldName,int nControlIndex,bool b)349*3ac0a46fSAndroid Build Coastguard Worker void SetHidden(CPDFSDK_FormFillEnvironment* pFormFillEnv,
350*3ac0a46fSAndroid Build Coastguard Worker                const WideString& swFieldName,
351*3ac0a46fSAndroid Build Coastguard Worker                int nControlIndex,
352*3ac0a46fSAndroid Build Coastguard Worker                bool b) {
353*3ac0a46fSAndroid Build Coastguard Worker   int display = b ? 1 /*Hidden*/ : 0 /*Visible*/;
354*3ac0a46fSAndroid Build Coastguard Worker   SetDisplay(pFormFillEnv, swFieldName, nControlIndex, display);
355*3ac0a46fSAndroid Build Coastguard Worker }
356*3ac0a46fSAndroid Build Coastguard Worker 
SetLineWidth(CPDFSDK_FormFillEnvironment * pFormFillEnv,const WideString & swFieldName,int nControlIndex,int number)357*3ac0a46fSAndroid Build Coastguard Worker void SetLineWidth(CPDFSDK_FormFillEnvironment* pFormFillEnv,
358*3ac0a46fSAndroid Build Coastguard Worker                   const WideString& swFieldName,
359*3ac0a46fSAndroid Build Coastguard Worker                   int nControlIndex,
360*3ac0a46fSAndroid Build Coastguard Worker                   int number) {
361*3ac0a46fSAndroid Build Coastguard Worker   CPDFSDK_InteractiveForm* pForm = pFormFillEnv->GetInteractiveForm();
362*3ac0a46fSAndroid Build Coastguard Worker   std::vector<CPDF_FormField*> FieldArray =
363*3ac0a46fSAndroid Build Coastguard Worker       GetFormFieldsForName(pFormFillEnv, swFieldName);
364*3ac0a46fSAndroid Build Coastguard Worker   for (CPDF_FormField* pFormField : FieldArray) {
365*3ac0a46fSAndroid Build Coastguard Worker     if (nControlIndex < 0) {
366*3ac0a46fSAndroid Build Coastguard Worker       bool bSet = false;
367*3ac0a46fSAndroid Build Coastguard Worker       for (int i = 0, sz = pFormField->CountControls(); i < sz; ++i) {
368*3ac0a46fSAndroid Build Coastguard Worker         CPDF_FormControl* pFormControl = pFormField->GetControl(i);
369*3ac0a46fSAndroid Build Coastguard Worker         DCHECK(pFormControl);
370*3ac0a46fSAndroid Build Coastguard Worker 
371*3ac0a46fSAndroid Build Coastguard Worker         if (CPDFSDK_Widget* pWidget = pForm->GetWidget(pFormControl)) {
372*3ac0a46fSAndroid Build Coastguard Worker           if (number != pWidget->GetBorderWidth()) {
373*3ac0a46fSAndroid Build Coastguard Worker             pWidget->SetBorderWidth(number);
374*3ac0a46fSAndroid Build Coastguard Worker             bSet = true;
375*3ac0a46fSAndroid Build Coastguard Worker           }
376*3ac0a46fSAndroid Build Coastguard Worker         }
377*3ac0a46fSAndroid Build Coastguard Worker       }
378*3ac0a46fSAndroid Build Coastguard Worker       if (bSet)
379*3ac0a46fSAndroid Build Coastguard Worker         UpdateFormField(pFormFillEnv, pFormField, true);
380*3ac0a46fSAndroid Build Coastguard Worker     } else {
381*3ac0a46fSAndroid Build Coastguard Worker       if (nControlIndex >= pFormField->CountControls())
382*3ac0a46fSAndroid Build Coastguard Worker         return;
383*3ac0a46fSAndroid Build Coastguard Worker       if (CPDF_FormControl* pFormControl =
384*3ac0a46fSAndroid Build Coastguard Worker               pFormField->GetControl(nControlIndex)) {
385*3ac0a46fSAndroid Build Coastguard Worker         if (CPDFSDK_Widget* pWidget = pForm->GetWidget(pFormControl)) {
386*3ac0a46fSAndroid Build Coastguard Worker           if (number != pWidget->GetBorderWidth()) {
387*3ac0a46fSAndroid Build Coastguard Worker             pWidget->SetBorderWidth(number);
388*3ac0a46fSAndroid Build Coastguard Worker             UpdateFormControl(pFormFillEnv, pFormControl, true);
389*3ac0a46fSAndroid Build Coastguard Worker           }
390*3ac0a46fSAndroid Build Coastguard Worker         }
391*3ac0a46fSAndroid Build Coastguard Worker       }
392*3ac0a46fSAndroid Build Coastguard Worker     }
393*3ac0a46fSAndroid Build Coastguard Worker   }
394*3ac0a46fSAndroid Build Coastguard Worker }
395*3ac0a46fSAndroid Build Coastguard Worker 
SetRect(CPDFSDK_FormFillEnvironment * pFormFillEnv,const WideString & swFieldName,int nControlIndex,const CFX_FloatRect & rect)396*3ac0a46fSAndroid Build Coastguard Worker void SetRect(CPDFSDK_FormFillEnvironment* pFormFillEnv,
397*3ac0a46fSAndroid Build Coastguard Worker              const WideString& swFieldName,
398*3ac0a46fSAndroid Build Coastguard Worker              int nControlIndex,
399*3ac0a46fSAndroid Build Coastguard Worker              const CFX_FloatRect& rect) {
400*3ac0a46fSAndroid Build Coastguard Worker   CPDFSDK_InteractiveForm* pForm = pFormFillEnv->GetInteractiveForm();
401*3ac0a46fSAndroid Build Coastguard Worker   std::vector<CPDF_FormField*> FieldArray =
402*3ac0a46fSAndroid Build Coastguard Worker       GetFormFieldsForName(pFormFillEnv, swFieldName);
403*3ac0a46fSAndroid Build Coastguard Worker   for (CPDF_FormField* pFormField : FieldArray) {
404*3ac0a46fSAndroid Build Coastguard Worker     if (nControlIndex < 0) {
405*3ac0a46fSAndroid Build Coastguard Worker       bool bSet = false;
406*3ac0a46fSAndroid Build Coastguard Worker       for (int i = 0, sz = pFormField->CountControls(); i < sz; ++i) {
407*3ac0a46fSAndroid Build Coastguard Worker         CPDF_FormControl* pFormControl = pFormField->GetControl(i);
408*3ac0a46fSAndroid Build Coastguard Worker         DCHECK(pFormControl);
409*3ac0a46fSAndroid Build Coastguard Worker 
410*3ac0a46fSAndroid Build Coastguard Worker         if (CPDFSDK_Widget* pWidget = pForm->GetWidget(pFormControl)) {
411*3ac0a46fSAndroid Build Coastguard Worker           CFX_FloatRect crRect = rect;
412*3ac0a46fSAndroid Build Coastguard Worker 
413*3ac0a46fSAndroid Build Coastguard Worker           CPDF_Page* pPDFPage = pWidget->GetPDFPage();
414*3ac0a46fSAndroid Build Coastguard Worker           crRect.Intersect(pPDFPage->GetBBox());
415*3ac0a46fSAndroid Build Coastguard Worker 
416*3ac0a46fSAndroid Build Coastguard Worker           if (!crRect.IsEmpty()) {
417*3ac0a46fSAndroid Build Coastguard Worker             CFX_FloatRect rcOld = pWidget->GetRect();
418*3ac0a46fSAndroid Build Coastguard Worker             if (crRect.left != rcOld.left || crRect.right != rcOld.right ||
419*3ac0a46fSAndroid Build Coastguard Worker                 crRect.top != rcOld.top || crRect.bottom != rcOld.bottom) {
420*3ac0a46fSAndroid Build Coastguard Worker               pWidget->SetRect(crRect);
421*3ac0a46fSAndroid Build Coastguard Worker               bSet = true;
422*3ac0a46fSAndroid Build Coastguard Worker             }
423*3ac0a46fSAndroid Build Coastguard Worker           }
424*3ac0a46fSAndroid Build Coastguard Worker         }
425*3ac0a46fSAndroid Build Coastguard Worker       }
426*3ac0a46fSAndroid Build Coastguard Worker 
427*3ac0a46fSAndroid Build Coastguard Worker       if (bSet)
428*3ac0a46fSAndroid Build Coastguard Worker         UpdateFormField(pFormFillEnv, pFormField, true);
429*3ac0a46fSAndroid Build Coastguard Worker 
430*3ac0a46fSAndroid Build Coastguard Worker       continue;
431*3ac0a46fSAndroid Build Coastguard Worker     }
432*3ac0a46fSAndroid Build Coastguard Worker 
433*3ac0a46fSAndroid Build Coastguard Worker     if (nControlIndex >= pFormField->CountControls())
434*3ac0a46fSAndroid Build Coastguard Worker       return;
435*3ac0a46fSAndroid Build Coastguard Worker     if (CPDF_FormControl* pFormControl =
436*3ac0a46fSAndroid Build Coastguard Worker             pFormField->GetControl(nControlIndex)) {
437*3ac0a46fSAndroid Build Coastguard Worker       if (CPDFSDK_Widget* pWidget = pForm->GetWidget(pFormControl)) {
438*3ac0a46fSAndroid Build Coastguard Worker         CFX_FloatRect crRect = rect;
439*3ac0a46fSAndroid Build Coastguard Worker         CPDF_Page* pPDFPage = pWidget->GetPDFPage();
440*3ac0a46fSAndroid Build Coastguard Worker         crRect.Intersect(pPDFPage->GetBBox());
441*3ac0a46fSAndroid Build Coastguard Worker         if (!crRect.IsEmpty()) {
442*3ac0a46fSAndroid Build Coastguard Worker           CFX_FloatRect rcOld = pWidget->GetRect();
443*3ac0a46fSAndroid Build Coastguard Worker           if (crRect.left != rcOld.left || crRect.right != rcOld.right ||
444*3ac0a46fSAndroid Build Coastguard Worker               crRect.top != rcOld.top || crRect.bottom != rcOld.bottom) {
445*3ac0a46fSAndroid Build Coastguard Worker             pWidget->SetRect(crRect);
446*3ac0a46fSAndroid Build Coastguard Worker             UpdateFormControl(pFormFillEnv, pFormControl, true);
447*3ac0a46fSAndroid Build Coastguard Worker           }
448*3ac0a46fSAndroid Build Coastguard Worker         }
449*3ac0a46fSAndroid Build Coastguard Worker       }
450*3ac0a46fSAndroid Build Coastguard Worker     }
451*3ac0a46fSAndroid Build Coastguard Worker   }
452*3ac0a46fSAndroid Build Coastguard Worker }
453*3ac0a46fSAndroid Build Coastguard Worker 
SetFieldValue(CPDFSDK_FormFillEnvironment * pFormFillEnv,const WideString & swFieldName,int nControlIndex,const std::vector<WideString> & strArray)454*3ac0a46fSAndroid Build Coastguard Worker void SetFieldValue(CPDFSDK_FormFillEnvironment* pFormFillEnv,
455*3ac0a46fSAndroid Build Coastguard Worker                    const WideString& swFieldName,
456*3ac0a46fSAndroid Build Coastguard Worker                    int nControlIndex,
457*3ac0a46fSAndroid Build Coastguard Worker                    const std::vector<WideString>& strArray) {
458*3ac0a46fSAndroid Build Coastguard Worker   DCHECK(pFormFillEnv);
459*3ac0a46fSAndroid Build Coastguard Worker   if (strArray.empty())
460*3ac0a46fSAndroid Build Coastguard Worker     return;
461*3ac0a46fSAndroid Build Coastguard Worker 
462*3ac0a46fSAndroid Build Coastguard Worker   std::vector<CPDF_FormField*> FieldArray =
463*3ac0a46fSAndroid Build Coastguard Worker       GetFormFieldsForName(pFormFillEnv, swFieldName);
464*3ac0a46fSAndroid Build Coastguard Worker 
465*3ac0a46fSAndroid Build Coastguard Worker   for (CPDF_FormField* pFormField : FieldArray) {
466*3ac0a46fSAndroid Build Coastguard Worker     if (pFormField->GetFullName() != swFieldName)
467*3ac0a46fSAndroid Build Coastguard Worker       continue;
468*3ac0a46fSAndroid Build Coastguard Worker 
469*3ac0a46fSAndroid Build Coastguard Worker     switch (pFormField->GetFieldType()) {
470*3ac0a46fSAndroid Build Coastguard Worker       case FormFieldType::kTextField:
471*3ac0a46fSAndroid Build Coastguard Worker       case FormFieldType::kComboBox:
472*3ac0a46fSAndroid Build Coastguard Worker         if (pFormField->GetValue() != strArray[0]) {
473*3ac0a46fSAndroid Build Coastguard Worker           pFormField->SetValue(strArray[0], NotificationOption::kNotify);
474*3ac0a46fSAndroid Build Coastguard Worker           UpdateFormField(pFormFillEnv, pFormField, false);
475*3ac0a46fSAndroid Build Coastguard Worker         }
476*3ac0a46fSAndroid Build Coastguard Worker         break;
477*3ac0a46fSAndroid Build Coastguard Worker       case FormFieldType::kCheckBox:
478*3ac0a46fSAndroid Build Coastguard Worker       case FormFieldType::kRadioButton:
479*3ac0a46fSAndroid Build Coastguard Worker         if (pFormField->GetValue() != strArray[0]) {
480*3ac0a46fSAndroid Build Coastguard Worker           pFormField->SetValue(strArray[0], NotificationOption::kNotify);
481*3ac0a46fSAndroid Build Coastguard Worker           UpdateFormField(pFormFillEnv, pFormField, false);
482*3ac0a46fSAndroid Build Coastguard Worker         }
483*3ac0a46fSAndroid Build Coastguard Worker         break;
484*3ac0a46fSAndroid Build Coastguard Worker       case FormFieldType::kListBox: {
485*3ac0a46fSAndroid Build Coastguard Worker         bool bModified = false;
486*3ac0a46fSAndroid Build Coastguard Worker         for (const auto& str : strArray) {
487*3ac0a46fSAndroid Build Coastguard Worker           if (!pFormField->IsItemSelected(pFormField->FindOption(str))) {
488*3ac0a46fSAndroid Build Coastguard Worker             bModified = true;
489*3ac0a46fSAndroid Build Coastguard Worker             break;
490*3ac0a46fSAndroid Build Coastguard Worker           }
491*3ac0a46fSAndroid Build Coastguard Worker         }
492*3ac0a46fSAndroid Build Coastguard Worker         if (bModified) {
493*3ac0a46fSAndroid Build Coastguard Worker           pFormField->ClearSelection(NotificationOption::kNotify);
494*3ac0a46fSAndroid Build Coastguard Worker           for (const auto& str : strArray) {
495*3ac0a46fSAndroid Build Coastguard Worker             int index = pFormField->FindOption(str);
496*3ac0a46fSAndroid Build Coastguard Worker             if (!pFormField->IsItemSelected(index))
497*3ac0a46fSAndroid Build Coastguard Worker               pFormField->SetItemSelection(index, NotificationOption::kNotify);
498*3ac0a46fSAndroid Build Coastguard Worker           }
499*3ac0a46fSAndroid Build Coastguard Worker           UpdateFormField(pFormFillEnv, pFormField, false);
500*3ac0a46fSAndroid Build Coastguard Worker         }
501*3ac0a46fSAndroid Build Coastguard Worker         break;
502*3ac0a46fSAndroid Build Coastguard Worker       }
503*3ac0a46fSAndroid Build Coastguard Worker       default:
504*3ac0a46fSAndroid Build Coastguard Worker         break;
505*3ac0a46fSAndroid Build Coastguard Worker     }
506*3ac0a46fSAndroid Build Coastguard Worker   }
507*3ac0a46fSAndroid Build Coastguard Worker }
508*3ac0a46fSAndroid Build Coastguard Worker 
GetSelectorFromCaptionForFieldType(const WideString & caption,CPDF_FormField::Type type)509*3ac0a46fSAndroid Build Coastguard Worker wchar_t GetSelectorFromCaptionForFieldType(const WideString& caption,
510*3ac0a46fSAndroid Build Coastguard Worker                                            CPDF_FormField::Type type) {
511*3ac0a46fSAndroid Build Coastguard Worker   if (!caption.IsEmpty())
512*3ac0a46fSAndroid Build Coastguard Worker     return caption[0];
513*3ac0a46fSAndroid Build Coastguard Worker 
514*3ac0a46fSAndroid Build Coastguard Worker   switch (type) {
515*3ac0a46fSAndroid Build Coastguard Worker     case CPDF_FormField::kRadioButton:
516*3ac0a46fSAndroid Build Coastguard Worker       return kCircleSelector;
517*3ac0a46fSAndroid Build Coastguard Worker     default:
518*3ac0a46fSAndroid Build Coastguard Worker       return kCheckSelector;
519*3ac0a46fSAndroid Build Coastguard Worker   }
520*3ac0a46fSAndroid Build Coastguard Worker }
521*3ac0a46fSAndroid Build Coastguard Worker 
522*3ac0a46fSAndroid Build Coastguard Worker }  // namespace
523*3ac0a46fSAndroid Build Coastguard Worker 
524*3ac0a46fSAndroid Build Coastguard Worker const JSPropertySpec CJS_Field::PropertySpecs[] = {
525*3ac0a46fSAndroid Build Coastguard Worker     {"alignment", get_alignment_static, set_alignment_static},
526*3ac0a46fSAndroid Build Coastguard Worker     {"borderStyle", get_border_style_static, set_border_style_static},
527*3ac0a46fSAndroid Build Coastguard Worker     {"buttonAlignX", get_button_align_x_static, set_button_align_x_static},
528*3ac0a46fSAndroid Build Coastguard Worker     {"buttonAlignY", get_button_align_y_static, set_button_align_y_static},
529*3ac0a46fSAndroid Build Coastguard Worker     {"buttonFitBounds", get_button_fit_bounds_static,
530*3ac0a46fSAndroid Build Coastguard Worker      set_button_fit_bounds_static},
531*3ac0a46fSAndroid Build Coastguard Worker     {"buttonPosition", get_button_position_static, set_button_position_static},
532*3ac0a46fSAndroid Build Coastguard Worker     {"buttonScaleHow", get_button_scale_how_static,
533*3ac0a46fSAndroid Build Coastguard Worker      set_button_scale_how_static},
534*3ac0a46fSAndroid Build Coastguard Worker     {"buttonScaleWhen", get_button_scale_when_static,
535*3ac0a46fSAndroid Build Coastguard Worker      set_button_scale_when_static},
536*3ac0a46fSAndroid Build Coastguard Worker     {"calcOrderIndex", get_calc_order_index_static,
537*3ac0a46fSAndroid Build Coastguard Worker      set_calc_order_index_static},
538*3ac0a46fSAndroid Build Coastguard Worker     {"charLimit", get_char_limit_static, set_char_limit_static},
539*3ac0a46fSAndroid Build Coastguard Worker     {"comb", get_comb_static, set_comb_static},
540*3ac0a46fSAndroid Build Coastguard Worker     {"commitOnSelChange", get_commit_on_sel_change_static,
541*3ac0a46fSAndroid Build Coastguard Worker      set_commit_on_sel_change_static},
542*3ac0a46fSAndroid Build Coastguard Worker     {"currentValueIndices", get_current_value_indices_static,
543*3ac0a46fSAndroid Build Coastguard Worker      set_current_value_indices_static},
544*3ac0a46fSAndroid Build Coastguard Worker     {"defaultStyle", get_default_style_static, set_default_style_static},
545*3ac0a46fSAndroid Build Coastguard Worker     {"defaultValue", get_default_value_static, set_default_value_static},
546*3ac0a46fSAndroid Build Coastguard Worker     {"doNotScroll", get_do_not_scroll_static, set_do_not_scroll_static},
547*3ac0a46fSAndroid Build Coastguard Worker     {"doNotSpellCheck", get_do_not_spell_check_static,
548*3ac0a46fSAndroid Build Coastguard Worker      set_do_not_spell_check_static},
549*3ac0a46fSAndroid Build Coastguard Worker     {"delay", get_delay_static, set_delay_static},
550*3ac0a46fSAndroid Build Coastguard Worker     {"display", get_display_static, set_display_static},
551*3ac0a46fSAndroid Build Coastguard Worker     {"doc", get_doc_static, set_doc_static},
552*3ac0a46fSAndroid Build Coastguard Worker     {"editable", get_editable_static, set_editable_static},
553*3ac0a46fSAndroid Build Coastguard Worker     {"exportValues", get_export_values_static, set_export_values_static},
554*3ac0a46fSAndroid Build Coastguard Worker     {"hidden", get_hidden_static, set_hidden_static},
555*3ac0a46fSAndroid Build Coastguard Worker     {"fileSelect", get_file_select_static, set_file_select_static},
556*3ac0a46fSAndroid Build Coastguard Worker     {"fillColor", get_fill_color_static, set_fill_color_static},
557*3ac0a46fSAndroid Build Coastguard Worker     {"lineWidth", get_line_width_static, set_line_width_static},
558*3ac0a46fSAndroid Build Coastguard Worker     {"highlight", get_highlight_static, set_highlight_static},
559*3ac0a46fSAndroid Build Coastguard Worker     {"multiline", get_multiline_static, set_multiline_static},
560*3ac0a46fSAndroid Build Coastguard Worker     {"multipleSelection", get_multiple_selection_static,
561*3ac0a46fSAndroid Build Coastguard Worker      set_multiple_selection_static},
562*3ac0a46fSAndroid Build Coastguard Worker     {"name", get_name_static, set_name_static},
563*3ac0a46fSAndroid Build Coastguard Worker     {"numItems", get_num_items_static, set_num_items_static},
564*3ac0a46fSAndroid Build Coastguard Worker     {"page", get_page_static, set_page_static},
565*3ac0a46fSAndroid Build Coastguard Worker     {"password", get_password_static, set_password_static},
566*3ac0a46fSAndroid Build Coastguard Worker     {"print", get_print_static, set_print_static},
567*3ac0a46fSAndroid Build Coastguard Worker     {"radiosInUnison", get_radios_in_unison_static,
568*3ac0a46fSAndroid Build Coastguard Worker      set_radios_in_unison_static},
569*3ac0a46fSAndroid Build Coastguard Worker     {"readonly", get_readonly_static, set_readonly_static},
570*3ac0a46fSAndroid Build Coastguard Worker     {"rect", get_rect_static, set_rect_static},
571*3ac0a46fSAndroid Build Coastguard Worker     {"required", get_required_static, set_required_static},
572*3ac0a46fSAndroid Build Coastguard Worker     {"richText", get_rich_text_static, set_rich_text_static},
573*3ac0a46fSAndroid Build Coastguard Worker     {"richValue", get_rich_value_static, set_rich_value_static},
574*3ac0a46fSAndroid Build Coastguard Worker     {"rotation", get_rotation_static, set_rotation_static},
575*3ac0a46fSAndroid Build Coastguard Worker     {"source", get_source_static, set_source_static},
576*3ac0a46fSAndroid Build Coastguard Worker     {"strokeColor", get_stroke_color_static, set_stroke_color_static},
577*3ac0a46fSAndroid Build Coastguard Worker     {"style", get_style_static, set_style_static},
578*3ac0a46fSAndroid Build Coastguard Worker     {"submitName", get_submit_name_static, set_submit_name_static},
579*3ac0a46fSAndroid Build Coastguard Worker     {"textColor", get_text_color_static, set_text_color_static},
580*3ac0a46fSAndroid Build Coastguard Worker     {"textFont", get_text_font_static, set_text_font_static},
581*3ac0a46fSAndroid Build Coastguard Worker     {"textSize", get_text_size_static, set_text_size_static},
582*3ac0a46fSAndroid Build Coastguard Worker     {"type", get_type_static, set_type_static},
583*3ac0a46fSAndroid Build Coastguard Worker     {"userName", get_user_name_static, set_user_name_static},
584*3ac0a46fSAndroid Build Coastguard Worker     {"value", get_value_static, set_value_static},
585*3ac0a46fSAndroid Build Coastguard Worker     {"valueAsString", get_value_as_string_static, set_value_as_string_static}};
586*3ac0a46fSAndroid Build Coastguard Worker 
587*3ac0a46fSAndroid Build Coastguard Worker const JSMethodSpec CJS_Field::MethodSpecs[] = {
588*3ac0a46fSAndroid Build Coastguard Worker     {"browseForFileToSubmit", browseForFileToSubmit_static},
589*3ac0a46fSAndroid Build Coastguard Worker     {"buttonGetCaption", buttonGetCaption_static},
590*3ac0a46fSAndroid Build Coastguard Worker     {"buttonGetIcon", buttonGetIcon_static},
591*3ac0a46fSAndroid Build Coastguard Worker     {"buttonImportIcon", buttonImportIcon_static},
592*3ac0a46fSAndroid Build Coastguard Worker     {"buttonSetCaption", buttonSetCaption_static},
593*3ac0a46fSAndroid Build Coastguard Worker     {"buttonSetIcon", buttonSetIcon_static},
594*3ac0a46fSAndroid Build Coastguard Worker     {"checkThisBox", checkThisBox_static},
595*3ac0a46fSAndroid Build Coastguard Worker     {"clearItems", clearItems_static},
596*3ac0a46fSAndroid Build Coastguard Worker     {"defaultIsChecked", defaultIsChecked_static},
597*3ac0a46fSAndroid Build Coastguard Worker     {"deleteItemAt", deleteItemAt_static},
598*3ac0a46fSAndroid Build Coastguard Worker     {"getArray", getArray_static},
599*3ac0a46fSAndroid Build Coastguard Worker     {"getItemAt", getItemAt_static},
600*3ac0a46fSAndroid Build Coastguard Worker     {"getLock", getLock_static},
601*3ac0a46fSAndroid Build Coastguard Worker     {"insertItemAt", insertItemAt_static},
602*3ac0a46fSAndroid Build Coastguard Worker     {"isBoxChecked", isBoxChecked_static},
603*3ac0a46fSAndroid Build Coastguard Worker     {"isDefaultChecked", isDefaultChecked_static},
604*3ac0a46fSAndroid Build Coastguard Worker     {"setAction", setAction_static},
605*3ac0a46fSAndroid Build Coastguard Worker     {"setFocus", setFocus_static},
606*3ac0a46fSAndroid Build Coastguard Worker     {"setItems", setItems_static},
607*3ac0a46fSAndroid Build Coastguard Worker     {"setLock", setLock_static},
608*3ac0a46fSAndroid Build Coastguard Worker     {"signatureGetModifications", signatureGetModifications_static},
609*3ac0a46fSAndroid Build Coastguard Worker     {"signatureGetSeedValue", signatureGetSeedValue_static},
610*3ac0a46fSAndroid Build Coastguard Worker     {"signatureInfo", signatureInfo_static},
611*3ac0a46fSAndroid Build Coastguard Worker     {"signatureSetSeedValue", signatureSetSeedValue_static},
612*3ac0a46fSAndroid Build Coastguard Worker     {"signatureSign", signatureSign_static},
613*3ac0a46fSAndroid Build Coastguard Worker     {"signatureValidate", signatureValidate_static}};
614*3ac0a46fSAndroid Build Coastguard Worker 
615*3ac0a46fSAndroid Build Coastguard Worker uint32_t CJS_Field::ObjDefnID = 0;
616*3ac0a46fSAndroid Build Coastguard Worker const char CJS_Field::kName[] = "Field";
617*3ac0a46fSAndroid Build Coastguard Worker 
618*3ac0a46fSAndroid Build Coastguard Worker // static
GetObjDefnID()619*3ac0a46fSAndroid Build Coastguard Worker uint32_t CJS_Field::GetObjDefnID() {
620*3ac0a46fSAndroid Build Coastguard Worker   return ObjDefnID;
621*3ac0a46fSAndroid Build Coastguard Worker }
622*3ac0a46fSAndroid Build Coastguard Worker 
623*3ac0a46fSAndroid Build Coastguard Worker // static
DefineJSObjects(CFXJS_Engine * pEngine)624*3ac0a46fSAndroid Build Coastguard Worker void CJS_Field::DefineJSObjects(CFXJS_Engine* pEngine) {
625*3ac0a46fSAndroid Build Coastguard Worker   ObjDefnID = pEngine->DefineObj(CJS_Field::kName, FXJSOBJTYPE_DYNAMIC,
626*3ac0a46fSAndroid Build Coastguard Worker                                  JSConstructor<CJS_Field>, JSDestructor);
627*3ac0a46fSAndroid Build Coastguard Worker   DefineProps(pEngine, ObjDefnID, PropertySpecs);
628*3ac0a46fSAndroid Build Coastguard Worker   DefineMethods(pEngine, ObjDefnID, MethodSpecs);
629*3ac0a46fSAndroid Build Coastguard Worker }
630*3ac0a46fSAndroid Build Coastguard Worker 
CJS_Field(v8::Local<v8::Object> pObject,CJS_Runtime * pRuntime)631*3ac0a46fSAndroid Build Coastguard Worker CJS_Field::CJS_Field(v8::Local<v8::Object> pObject, CJS_Runtime* pRuntime)
632*3ac0a46fSAndroid Build Coastguard Worker     : CJS_Object(pObject, pRuntime) {}
633*3ac0a46fSAndroid Build Coastguard Worker 
634*3ac0a46fSAndroid Build Coastguard Worker CJS_Field::~CJS_Field() = default;
635*3ac0a46fSAndroid Build Coastguard Worker 
AttachField(CJS_Document * pDocument,const WideString & csFieldName)636*3ac0a46fSAndroid Build Coastguard Worker bool CJS_Field::AttachField(CJS_Document* pDocument,
637*3ac0a46fSAndroid Build Coastguard Worker                             const WideString& csFieldName) {
638*3ac0a46fSAndroid Build Coastguard Worker   m_pJSDoc.Reset(pDocument);
639*3ac0a46fSAndroid Build Coastguard Worker   m_pFormFillEnv.Reset(pDocument->GetFormFillEnv());
640*3ac0a46fSAndroid Build Coastguard Worker   m_bCanSet = m_pFormFillEnv->HasPermissions(
641*3ac0a46fSAndroid Build Coastguard Worker       pdfium::access_permissions::kFillForm |
642*3ac0a46fSAndroid Build Coastguard Worker       pdfium::access_permissions::kModifyAnnotation |
643*3ac0a46fSAndroid Build Coastguard Worker       pdfium::access_permissions::kModifyContent);
644*3ac0a46fSAndroid Build Coastguard Worker 
645*3ac0a46fSAndroid Build Coastguard Worker   CPDFSDK_InteractiveForm* pRDForm = m_pFormFillEnv->GetInteractiveForm();
646*3ac0a46fSAndroid Build Coastguard Worker   CPDF_InteractiveForm* pForm = pRDForm->GetInteractiveForm();
647*3ac0a46fSAndroid Build Coastguard Worker   WideString swFieldNameTemp = csFieldName;
648*3ac0a46fSAndroid Build Coastguard Worker   swFieldNameTemp.Replace(L"..", L".");
649*3ac0a46fSAndroid Build Coastguard Worker 
650*3ac0a46fSAndroid Build Coastguard Worker   if (pForm->CountFields(swFieldNameTemp) <= 0) {
651*3ac0a46fSAndroid Build Coastguard Worker     absl::optional<FieldNameData> parsed_data = ParseFieldName(swFieldNameTemp);
652*3ac0a46fSAndroid Build Coastguard Worker     if (!parsed_data.has_value())
653*3ac0a46fSAndroid Build Coastguard Worker       return false;
654*3ac0a46fSAndroid Build Coastguard Worker 
655*3ac0a46fSAndroid Build Coastguard Worker     m_FieldName = parsed_data.value().field_name;
656*3ac0a46fSAndroid Build Coastguard Worker     m_nFormControlIndex = parsed_data.value().control_index;
657*3ac0a46fSAndroid Build Coastguard Worker     return true;
658*3ac0a46fSAndroid Build Coastguard Worker   }
659*3ac0a46fSAndroid Build Coastguard Worker 
660*3ac0a46fSAndroid Build Coastguard Worker   m_FieldName = swFieldNameTemp;
661*3ac0a46fSAndroid Build Coastguard Worker   m_nFormControlIndex = -1;
662*3ac0a46fSAndroid Build Coastguard Worker 
663*3ac0a46fSAndroid Build Coastguard Worker   return true;
664*3ac0a46fSAndroid Build Coastguard Worker }
665*3ac0a46fSAndroid Build Coastguard Worker 
GetFormFields() const666*3ac0a46fSAndroid Build Coastguard Worker std::vector<CPDF_FormField*> CJS_Field::GetFormFields() const {
667*3ac0a46fSAndroid Build Coastguard Worker   return GetFormFieldsForName(m_pFormFillEnv.Get(), m_FieldName);
668*3ac0a46fSAndroid Build Coastguard Worker }
669*3ac0a46fSAndroid Build Coastguard Worker 
GetFirstFormField() const670*3ac0a46fSAndroid Build Coastguard Worker CPDF_FormField* CJS_Field::GetFirstFormField() const {
671*3ac0a46fSAndroid Build Coastguard Worker   std::vector<CPDF_FormField*> fields = GetFormFields();
672*3ac0a46fSAndroid Build Coastguard Worker   return fields.empty() ? nullptr : fields[0];
673*3ac0a46fSAndroid Build Coastguard Worker }
674*3ac0a46fSAndroid Build Coastguard Worker 
GetSmartFieldControl(CPDF_FormField * pFormField)675*3ac0a46fSAndroid Build Coastguard Worker CPDF_FormControl* CJS_Field::GetSmartFieldControl(CPDF_FormField* pFormField) {
676*3ac0a46fSAndroid Build Coastguard Worker   if (!pFormField->CountControls() ||
677*3ac0a46fSAndroid Build Coastguard Worker       m_nFormControlIndex >= pFormField->CountControls())
678*3ac0a46fSAndroid Build Coastguard Worker     return nullptr;
679*3ac0a46fSAndroid Build Coastguard Worker   if (m_nFormControlIndex < 0)
680*3ac0a46fSAndroid Build Coastguard Worker     return pFormField->GetControl(0);
681*3ac0a46fSAndroid Build Coastguard Worker   return pFormField->GetControl(m_nFormControlIndex);
682*3ac0a46fSAndroid Build Coastguard Worker }
683*3ac0a46fSAndroid Build Coastguard Worker 
get_alignment(CJS_Runtime * pRuntime)684*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Field::get_alignment(CJS_Runtime* pRuntime) {
685*3ac0a46fSAndroid Build Coastguard Worker   DCHECK(m_pFormFillEnv);
686*3ac0a46fSAndroid Build Coastguard Worker 
687*3ac0a46fSAndroid Build Coastguard Worker   CPDF_FormField* pFormField = GetFirstFormField();
688*3ac0a46fSAndroid Build Coastguard Worker   if (!pFormField)
689*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kBadObjectError);
690*3ac0a46fSAndroid Build Coastguard Worker 
691*3ac0a46fSAndroid Build Coastguard Worker   if (pFormField->GetFieldType() != FormFieldType::kTextField)
692*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kObjectTypeError);
693*3ac0a46fSAndroid Build Coastguard Worker 
694*3ac0a46fSAndroid Build Coastguard Worker   CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
695*3ac0a46fSAndroid Build Coastguard Worker   if (!pFormControl)
696*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kBadObjectError);
697*3ac0a46fSAndroid Build Coastguard Worker 
698*3ac0a46fSAndroid Build Coastguard Worker   switch (pFormControl->GetControlAlignment()) {
699*3ac0a46fSAndroid Build Coastguard Worker     case 0:
700*3ac0a46fSAndroid Build Coastguard Worker       return CJS_Result::Success(pRuntime->NewString("left"));
701*3ac0a46fSAndroid Build Coastguard Worker     case 1:
702*3ac0a46fSAndroid Build Coastguard Worker       return CJS_Result::Success(pRuntime->NewString("center"));
703*3ac0a46fSAndroid Build Coastguard Worker     case 2:
704*3ac0a46fSAndroid Build Coastguard Worker       return CJS_Result::Success(pRuntime->NewString("right"));
705*3ac0a46fSAndroid Build Coastguard Worker   }
706*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success(pRuntime->NewString(""));
707*3ac0a46fSAndroid Build Coastguard Worker }
708*3ac0a46fSAndroid Build Coastguard Worker 
set_alignment(CJS_Runtime * pRuntime,v8::Local<v8::Value> vp)709*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Field::set_alignment(CJS_Runtime* pRuntime,
710*3ac0a46fSAndroid Build Coastguard Worker                                     v8::Local<v8::Value> vp) {
711*3ac0a46fSAndroid Build Coastguard Worker   DCHECK(m_pFormFillEnv);
712*3ac0a46fSAndroid Build Coastguard Worker   if (!m_bCanSet)
713*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kReadOnlyError);
714*3ac0a46fSAndroid Build Coastguard Worker 
715*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success();
716*3ac0a46fSAndroid Build Coastguard Worker }
717*3ac0a46fSAndroid Build Coastguard Worker 
get_border_style(CJS_Runtime * pRuntime)718*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Field::get_border_style(CJS_Runtime* pRuntime) {
719*3ac0a46fSAndroid Build Coastguard Worker   DCHECK(m_pFormFillEnv);
720*3ac0a46fSAndroid Build Coastguard Worker 
721*3ac0a46fSAndroid Build Coastguard Worker   CPDF_FormField* pFormField = GetFirstFormField();
722*3ac0a46fSAndroid Build Coastguard Worker   if (!pFormField)
723*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kBadObjectError);
724*3ac0a46fSAndroid Build Coastguard Worker 
725*3ac0a46fSAndroid Build Coastguard Worker   CPDFSDK_Widget* pWidget = m_pFormFillEnv->GetInteractiveForm()->GetWidget(
726*3ac0a46fSAndroid Build Coastguard Worker       GetSmartFieldControl(pFormField));
727*3ac0a46fSAndroid Build Coastguard Worker   if (!pWidget)
728*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kBadObjectError);
729*3ac0a46fSAndroid Build Coastguard Worker 
730*3ac0a46fSAndroid Build Coastguard Worker   switch (pWidget->GetBorderStyle()) {
731*3ac0a46fSAndroid Build Coastguard Worker     case BorderStyle::kSolid:
732*3ac0a46fSAndroid Build Coastguard Worker       return CJS_Result::Success(pRuntime->NewString("solid"));
733*3ac0a46fSAndroid Build Coastguard Worker     case BorderStyle::kDash:
734*3ac0a46fSAndroid Build Coastguard Worker       return CJS_Result::Success(pRuntime->NewString("dashed"));
735*3ac0a46fSAndroid Build Coastguard Worker     case BorderStyle::kBeveled:
736*3ac0a46fSAndroid Build Coastguard Worker       return CJS_Result::Success(pRuntime->NewString("beveled"));
737*3ac0a46fSAndroid Build Coastguard Worker     case BorderStyle::kInset:
738*3ac0a46fSAndroid Build Coastguard Worker       return CJS_Result::Success(pRuntime->NewString("inset"));
739*3ac0a46fSAndroid Build Coastguard Worker     case BorderStyle::kUnderline:
740*3ac0a46fSAndroid Build Coastguard Worker       return CJS_Result::Success(pRuntime->NewString("underline"));
741*3ac0a46fSAndroid Build Coastguard Worker   }
742*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success(pRuntime->NewString(""));
743*3ac0a46fSAndroid Build Coastguard Worker }
744*3ac0a46fSAndroid Build Coastguard Worker 
set_border_style(CJS_Runtime * pRuntime,v8::Local<v8::Value> vp)745*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Field::set_border_style(CJS_Runtime* pRuntime,
746*3ac0a46fSAndroid Build Coastguard Worker                                        v8::Local<v8::Value> vp) {
747*3ac0a46fSAndroid Build Coastguard Worker   DCHECK(m_pFormFillEnv);
748*3ac0a46fSAndroid Build Coastguard Worker   if (!m_bCanSet)
749*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kReadOnlyError);
750*3ac0a46fSAndroid Build Coastguard Worker 
751*3ac0a46fSAndroid Build Coastguard Worker   ByteString byte_str = pRuntime->ToByteString(vp);
752*3ac0a46fSAndroid Build Coastguard Worker   if (m_bDelay) {
753*3ac0a46fSAndroid Build Coastguard Worker     AddDelay_String(FP_BORDERSTYLE, byte_str);
754*3ac0a46fSAndroid Build Coastguard Worker   } else {
755*3ac0a46fSAndroid Build Coastguard Worker     SetBorderStyle(m_pFormFillEnv.Get(), m_FieldName, m_nFormControlIndex,
756*3ac0a46fSAndroid Build Coastguard Worker                    byte_str);
757*3ac0a46fSAndroid Build Coastguard Worker   }
758*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success();
759*3ac0a46fSAndroid Build Coastguard Worker }
760*3ac0a46fSAndroid Build Coastguard Worker 
get_button_align_x(CJS_Runtime * pRuntime)761*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Field::get_button_align_x(CJS_Runtime* pRuntime) {
762*3ac0a46fSAndroid Build Coastguard Worker   DCHECK(m_pFormFillEnv);
763*3ac0a46fSAndroid Build Coastguard Worker 
764*3ac0a46fSAndroid Build Coastguard Worker   CPDF_FormField* pFormField = GetFirstFormField();
765*3ac0a46fSAndroid Build Coastguard Worker   if (!pFormField)
766*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kBadObjectError);
767*3ac0a46fSAndroid Build Coastguard Worker 
768*3ac0a46fSAndroid Build Coastguard Worker   if (pFormField->GetFieldType() != FormFieldType::kPushButton)
769*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kObjectTypeError);
770*3ac0a46fSAndroid Build Coastguard Worker 
771*3ac0a46fSAndroid Build Coastguard Worker   CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
772*3ac0a46fSAndroid Build Coastguard Worker   if (!pFormControl)
773*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kBadObjectError);
774*3ac0a46fSAndroid Build Coastguard Worker 
775*3ac0a46fSAndroid Build Coastguard Worker   CPDF_IconFit IconFit = pFormControl->GetIconFit();
776*3ac0a46fSAndroid Build Coastguard Worker   CFX_PointF pos = IconFit.GetIconBottomLeftPosition();
777*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success(pRuntime->NewNumber(static_cast<int32_t>(pos.x)));
778*3ac0a46fSAndroid Build Coastguard Worker }
779*3ac0a46fSAndroid Build Coastguard Worker 
set_button_align_x(CJS_Runtime * pRuntime,v8::Local<v8::Value> vp)780*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Field::set_button_align_x(CJS_Runtime* pRuntime,
781*3ac0a46fSAndroid Build Coastguard Worker                                          v8::Local<v8::Value> vp) {
782*3ac0a46fSAndroid Build Coastguard Worker   DCHECK(m_pFormFillEnv);
783*3ac0a46fSAndroid Build Coastguard Worker   if (!m_bCanSet)
784*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kReadOnlyError);
785*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success();
786*3ac0a46fSAndroid Build Coastguard Worker }
787*3ac0a46fSAndroid Build Coastguard Worker 
get_button_align_y(CJS_Runtime * pRuntime)788*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Field::get_button_align_y(CJS_Runtime* pRuntime) {
789*3ac0a46fSAndroid Build Coastguard Worker   DCHECK(m_pFormFillEnv);
790*3ac0a46fSAndroid Build Coastguard Worker 
791*3ac0a46fSAndroid Build Coastguard Worker   CPDF_FormField* pFormField = GetFirstFormField();
792*3ac0a46fSAndroid Build Coastguard Worker   if (!pFormField)
793*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kBadObjectError);
794*3ac0a46fSAndroid Build Coastguard Worker 
795*3ac0a46fSAndroid Build Coastguard Worker   if (pFormField->GetFieldType() != FormFieldType::kPushButton)
796*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kObjectTypeError);
797*3ac0a46fSAndroid Build Coastguard Worker 
798*3ac0a46fSAndroid Build Coastguard Worker   CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
799*3ac0a46fSAndroid Build Coastguard Worker   if (!pFormControl)
800*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kBadObjectError);
801*3ac0a46fSAndroid Build Coastguard Worker 
802*3ac0a46fSAndroid Build Coastguard Worker   CPDF_IconFit IconFit = pFormControl->GetIconFit();
803*3ac0a46fSAndroid Build Coastguard Worker   CFX_PointF pos = IconFit.GetIconBottomLeftPosition();
804*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success(pRuntime->NewNumber(static_cast<int32_t>(pos.y)));
805*3ac0a46fSAndroid Build Coastguard Worker }
806*3ac0a46fSAndroid Build Coastguard Worker 
set_button_align_y(CJS_Runtime * pRuntime,v8::Local<v8::Value> vp)807*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Field::set_button_align_y(CJS_Runtime* pRuntime,
808*3ac0a46fSAndroid Build Coastguard Worker                                          v8::Local<v8::Value> vp) {
809*3ac0a46fSAndroid Build Coastguard Worker   DCHECK(m_pFormFillEnv);
810*3ac0a46fSAndroid Build Coastguard Worker   if (!m_bCanSet)
811*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kReadOnlyError);
812*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success();
813*3ac0a46fSAndroid Build Coastguard Worker }
814*3ac0a46fSAndroid Build Coastguard Worker 
get_button_fit_bounds(CJS_Runtime * pRuntime)815*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Field::get_button_fit_bounds(CJS_Runtime* pRuntime) {
816*3ac0a46fSAndroid Build Coastguard Worker   DCHECK(m_pFormFillEnv);
817*3ac0a46fSAndroid Build Coastguard Worker 
818*3ac0a46fSAndroid Build Coastguard Worker   CPDF_FormField* pFormField = GetFirstFormField();
819*3ac0a46fSAndroid Build Coastguard Worker   if (!pFormField)
820*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kBadObjectError);
821*3ac0a46fSAndroid Build Coastguard Worker 
822*3ac0a46fSAndroid Build Coastguard Worker   if (pFormField->GetFieldType() != FormFieldType::kPushButton)
823*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kObjectTypeError);
824*3ac0a46fSAndroid Build Coastguard Worker 
825*3ac0a46fSAndroid Build Coastguard Worker   CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
826*3ac0a46fSAndroid Build Coastguard Worker   if (!pFormControl)
827*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kBadObjectError);
828*3ac0a46fSAndroid Build Coastguard Worker 
829*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success(
830*3ac0a46fSAndroid Build Coastguard Worker       pRuntime->NewBoolean(pFormControl->GetIconFit().GetFittingBounds()));
831*3ac0a46fSAndroid Build Coastguard Worker }
832*3ac0a46fSAndroid Build Coastguard Worker 
set_button_fit_bounds(CJS_Runtime * pRuntime,v8::Local<v8::Value> vp)833*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Field::set_button_fit_bounds(CJS_Runtime* pRuntime,
834*3ac0a46fSAndroid Build Coastguard Worker                                             v8::Local<v8::Value> vp) {
835*3ac0a46fSAndroid Build Coastguard Worker   DCHECK(m_pFormFillEnv);
836*3ac0a46fSAndroid Build Coastguard Worker   if (!m_bCanSet)
837*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kReadOnlyError);
838*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success();
839*3ac0a46fSAndroid Build Coastguard Worker }
840*3ac0a46fSAndroid Build Coastguard Worker 
get_button_position(CJS_Runtime * pRuntime)841*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Field::get_button_position(CJS_Runtime* pRuntime) {
842*3ac0a46fSAndroid Build Coastguard Worker   DCHECK(m_pFormFillEnv);
843*3ac0a46fSAndroid Build Coastguard Worker 
844*3ac0a46fSAndroid Build Coastguard Worker   CPDF_FormField* pFormField = GetFirstFormField();
845*3ac0a46fSAndroid Build Coastguard Worker   if (!pFormField)
846*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kBadObjectError);
847*3ac0a46fSAndroid Build Coastguard Worker 
848*3ac0a46fSAndroid Build Coastguard Worker   if (pFormField->GetFieldType() != FormFieldType::kPushButton)
849*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kObjectTypeError);
850*3ac0a46fSAndroid Build Coastguard Worker 
851*3ac0a46fSAndroid Build Coastguard Worker   CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
852*3ac0a46fSAndroid Build Coastguard Worker   if (!pFormControl)
853*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kBadObjectError);
854*3ac0a46fSAndroid Build Coastguard Worker 
855*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success(
856*3ac0a46fSAndroid Build Coastguard Worker       pRuntime->NewNumber(pFormControl->GetTextPosition()));
857*3ac0a46fSAndroid Build Coastguard Worker }
858*3ac0a46fSAndroid Build Coastguard Worker 
set_button_position(CJS_Runtime * pRuntime,v8::Local<v8::Value> vp)859*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Field::set_button_position(CJS_Runtime* pRuntime,
860*3ac0a46fSAndroid Build Coastguard Worker                                           v8::Local<v8::Value> vp) {
861*3ac0a46fSAndroid Build Coastguard Worker   DCHECK(m_pFormFillEnv);
862*3ac0a46fSAndroid Build Coastguard Worker   if (!m_bCanSet)
863*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kBadObjectError);
864*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success();
865*3ac0a46fSAndroid Build Coastguard Worker }
866*3ac0a46fSAndroid Build Coastguard Worker 
get_button_scale_how(CJS_Runtime * pRuntime)867*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Field::get_button_scale_how(CJS_Runtime* pRuntime) {
868*3ac0a46fSAndroid Build Coastguard Worker   DCHECK(m_pFormFillEnv);
869*3ac0a46fSAndroid Build Coastguard Worker 
870*3ac0a46fSAndroid Build Coastguard Worker   CPDF_FormField* pFormField = GetFirstFormField();
871*3ac0a46fSAndroid Build Coastguard Worker   if (!pFormField)
872*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kBadObjectError);
873*3ac0a46fSAndroid Build Coastguard Worker 
874*3ac0a46fSAndroid Build Coastguard Worker   if (pFormField->GetFieldType() != FormFieldType::kPushButton)
875*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kObjectTypeError);
876*3ac0a46fSAndroid Build Coastguard Worker 
877*3ac0a46fSAndroid Build Coastguard Worker   CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
878*3ac0a46fSAndroid Build Coastguard Worker   if (!pFormControl)
879*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kBadObjectError);
880*3ac0a46fSAndroid Build Coastguard Worker 
881*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success(
882*3ac0a46fSAndroid Build Coastguard Worker       pRuntime->NewBoolean(!pFormControl->GetIconFit().IsProportionalScale()));
883*3ac0a46fSAndroid Build Coastguard Worker }
884*3ac0a46fSAndroid Build Coastguard Worker 
set_button_scale_how(CJS_Runtime * pRuntime,v8::Local<v8::Value> vp)885*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Field::set_button_scale_how(CJS_Runtime* pRuntime,
886*3ac0a46fSAndroid Build Coastguard Worker                                            v8::Local<v8::Value> vp) {
887*3ac0a46fSAndroid Build Coastguard Worker   DCHECK(m_pFormFillEnv);
888*3ac0a46fSAndroid Build Coastguard Worker   if (!m_bCanSet)
889*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kReadOnlyError);
890*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success();
891*3ac0a46fSAndroid Build Coastguard Worker }
892*3ac0a46fSAndroid Build Coastguard Worker 
get_button_scale_when(CJS_Runtime * pRuntime)893*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Field::get_button_scale_when(CJS_Runtime* pRuntime) {
894*3ac0a46fSAndroid Build Coastguard Worker   DCHECK(m_pFormFillEnv);
895*3ac0a46fSAndroid Build Coastguard Worker 
896*3ac0a46fSAndroid Build Coastguard Worker   CPDF_FormField* pFormField = GetFirstFormField();
897*3ac0a46fSAndroid Build Coastguard Worker   if (!pFormField)
898*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kBadObjectError);
899*3ac0a46fSAndroid Build Coastguard Worker 
900*3ac0a46fSAndroid Build Coastguard Worker   if (pFormField->GetFieldType() != FormFieldType::kPushButton)
901*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kObjectTypeError);
902*3ac0a46fSAndroid Build Coastguard Worker 
903*3ac0a46fSAndroid Build Coastguard Worker   CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
904*3ac0a46fSAndroid Build Coastguard Worker   if (!pFormControl)
905*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kBadObjectError);
906*3ac0a46fSAndroid Build Coastguard Worker 
907*3ac0a46fSAndroid Build Coastguard Worker   CPDF_IconFit IconFit = pFormControl->GetIconFit();
908*3ac0a46fSAndroid Build Coastguard Worker   CPDF_IconFit::ScaleMethod scale_method = IconFit.GetScaleMethod();
909*3ac0a46fSAndroid Build Coastguard Worker   switch (scale_method) {
910*3ac0a46fSAndroid Build Coastguard Worker     case CPDF_IconFit::ScaleMethod::kAlways:
911*3ac0a46fSAndroid Build Coastguard Worker     case CPDF_IconFit::ScaleMethod::kBigger:
912*3ac0a46fSAndroid Build Coastguard Worker     case CPDF_IconFit::ScaleMethod::kNever:
913*3ac0a46fSAndroid Build Coastguard Worker     case CPDF_IconFit::ScaleMethod::kSmaller:
914*3ac0a46fSAndroid Build Coastguard Worker       return CJS_Result::Success(
915*3ac0a46fSAndroid Build Coastguard Worker           pRuntime->NewNumber(static_cast<int>(scale_method)));
916*3ac0a46fSAndroid Build Coastguard Worker   }
917*3ac0a46fSAndroid Build Coastguard Worker }
918*3ac0a46fSAndroid Build Coastguard Worker 
set_button_scale_when(CJS_Runtime * pRuntime,v8::Local<v8::Value> vp)919*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Field::set_button_scale_when(CJS_Runtime* pRuntime,
920*3ac0a46fSAndroid Build Coastguard Worker                                             v8::Local<v8::Value> vp) {
921*3ac0a46fSAndroid Build Coastguard Worker   DCHECK(m_pFormFillEnv);
922*3ac0a46fSAndroid Build Coastguard Worker   if (!m_bCanSet)
923*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kReadOnlyError);
924*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success();
925*3ac0a46fSAndroid Build Coastguard Worker }
926*3ac0a46fSAndroid Build Coastguard Worker 
get_calc_order_index(CJS_Runtime * pRuntime)927*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Field::get_calc_order_index(CJS_Runtime* pRuntime) {
928*3ac0a46fSAndroid Build Coastguard Worker   DCHECK(m_pFormFillEnv);
929*3ac0a46fSAndroid Build Coastguard Worker 
930*3ac0a46fSAndroid Build Coastguard Worker   CPDF_FormField* pFormField = GetFirstFormField();
931*3ac0a46fSAndroid Build Coastguard Worker   if (!pFormField)
932*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kBadObjectError);
933*3ac0a46fSAndroid Build Coastguard Worker 
934*3ac0a46fSAndroid Build Coastguard Worker   if (!IsComboBoxOrTextField(pFormField))
935*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kObjectTypeError);
936*3ac0a46fSAndroid Build Coastguard Worker 
937*3ac0a46fSAndroid Build Coastguard Worker   CPDFSDK_InteractiveForm* pRDForm = m_pFormFillEnv->GetInteractiveForm();
938*3ac0a46fSAndroid Build Coastguard Worker   CPDF_InteractiveForm* pForm = pRDForm->GetInteractiveForm();
939*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success(
940*3ac0a46fSAndroid Build Coastguard Worker       pRuntime->NewNumber(pForm->FindFieldInCalculationOrder(pFormField)));
941*3ac0a46fSAndroid Build Coastguard Worker }
942*3ac0a46fSAndroid Build Coastguard Worker 
set_calc_order_index(CJS_Runtime * pRuntime,v8::Local<v8::Value> vp)943*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Field::set_calc_order_index(CJS_Runtime* pRuntime,
944*3ac0a46fSAndroid Build Coastguard Worker                                            v8::Local<v8::Value> vp) {
945*3ac0a46fSAndroid Build Coastguard Worker   DCHECK(m_pFormFillEnv);
946*3ac0a46fSAndroid Build Coastguard Worker   if (!m_bCanSet)
947*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kReadOnlyError);
948*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success();
949*3ac0a46fSAndroid Build Coastguard Worker }
950*3ac0a46fSAndroid Build Coastguard Worker 
get_char_limit(CJS_Runtime * pRuntime)951*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Field::get_char_limit(CJS_Runtime* pRuntime) {
952*3ac0a46fSAndroid Build Coastguard Worker   DCHECK(m_pFormFillEnv);
953*3ac0a46fSAndroid Build Coastguard Worker 
954*3ac0a46fSAndroid Build Coastguard Worker   CPDF_FormField* pFormField = GetFirstFormField();
955*3ac0a46fSAndroid Build Coastguard Worker   if (!pFormField)
956*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kBadObjectError);
957*3ac0a46fSAndroid Build Coastguard Worker 
958*3ac0a46fSAndroid Build Coastguard Worker   if (pFormField->GetFieldType() != FormFieldType::kTextField)
959*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kObjectTypeError);
960*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success(
961*3ac0a46fSAndroid Build Coastguard Worker       pRuntime->NewNumber(static_cast<int32_t>(pFormField->GetMaxLen())));
962*3ac0a46fSAndroid Build Coastguard Worker }
963*3ac0a46fSAndroid Build Coastguard Worker 
set_char_limit(CJS_Runtime * pRuntime,v8::Local<v8::Value> vp)964*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Field::set_char_limit(CJS_Runtime* pRuntime,
965*3ac0a46fSAndroid Build Coastguard Worker                                      v8::Local<v8::Value> vp) {
966*3ac0a46fSAndroid Build Coastguard Worker   DCHECK(m_pFormFillEnv);
967*3ac0a46fSAndroid Build Coastguard Worker   if (!m_bCanSet)
968*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kReadOnlyError);
969*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success();
970*3ac0a46fSAndroid Build Coastguard Worker }
971*3ac0a46fSAndroid Build Coastguard Worker 
get_comb(CJS_Runtime * pRuntime)972*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Field::get_comb(CJS_Runtime* pRuntime) {
973*3ac0a46fSAndroid Build Coastguard Worker   DCHECK(m_pFormFillEnv);
974*3ac0a46fSAndroid Build Coastguard Worker 
975*3ac0a46fSAndroid Build Coastguard Worker   CPDF_FormField* pFormField = GetFirstFormField();
976*3ac0a46fSAndroid Build Coastguard Worker   if (!pFormField)
977*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kBadObjectError);
978*3ac0a46fSAndroid Build Coastguard Worker 
979*3ac0a46fSAndroid Build Coastguard Worker   if (pFormField->GetFieldType() != FormFieldType::kTextField)
980*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kObjectTypeError);
981*3ac0a46fSAndroid Build Coastguard Worker 
982*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success(pRuntime->NewBoolean(
983*3ac0a46fSAndroid Build Coastguard Worker       !!(pFormField->GetFieldFlags() & pdfium::form_flags::kTextComb)));
984*3ac0a46fSAndroid Build Coastguard Worker }
985*3ac0a46fSAndroid Build Coastguard Worker 
set_comb(CJS_Runtime * pRuntime,v8::Local<v8::Value> vp)986*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Field::set_comb(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp) {
987*3ac0a46fSAndroid Build Coastguard Worker   DCHECK(m_pFormFillEnv);
988*3ac0a46fSAndroid Build Coastguard Worker   if (!m_bCanSet)
989*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kReadOnlyError);
990*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success();
991*3ac0a46fSAndroid Build Coastguard Worker }
992*3ac0a46fSAndroid Build Coastguard Worker 
get_commit_on_sel_change(CJS_Runtime * pRuntime)993*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Field::get_commit_on_sel_change(CJS_Runtime* pRuntime) {
994*3ac0a46fSAndroid Build Coastguard Worker   DCHECK(m_pFormFillEnv);
995*3ac0a46fSAndroid Build Coastguard Worker 
996*3ac0a46fSAndroid Build Coastguard Worker   CPDF_FormField* pFormField = GetFirstFormField();
997*3ac0a46fSAndroid Build Coastguard Worker   if (!pFormField)
998*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kBadObjectError);
999*3ac0a46fSAndroid Build Coastguard Worker 
1000*3ac0a46fSAndroid Build Coastguard Worker   if (!IsComboBoxOrListBox(pFormField))
1001*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kObjectTypeError);
1002*3ac0a46fSAndroid Build Coastguard Worker 
1003*3ac0a46fSAndroid Build Coastguard Worker   uint32_t dwFieldFlags = pFormField->GetFieldFlags();
1004*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success(pRuntime->NewBoolean(
1005*3ac0a46fSAndroid Build Coastguard Worker       !!(dwFieldFlags & pdfium::form_flags::kChoiceCommitOnSelChange)));
1006*3ac0a46fSAndroid Build Coastguard Worker }
1007*3ac0a46fSAndroid Build Coastguard Worker 
set_commit_on_sel_change(CJS_Runtime * pRuntime,v8::Local<v8::Value> vp)1008*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Field::set_commit_on_sel_change(CJS_Runtime* pRuntime,
1009*3ac0a46fSAndroid Build Coastguard Worker                                                v8::Local<v8::Value> vp) {
1010*3ac0a46fSAndroid Build Coastguard Worker   DCHECK(m_pFormFillEnv);
1011*3ac0a46fSAndroid Build Coastguard Worker   if (!m_bCanSet)
1012*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kReadOnlyError);
1013*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success();
1014*3ac0a46fSAndroid Build Coastguard Worker }
1015*3ac0a46fSAndroid Build Coastguard Worker 
get_current_value_indices(CJS_Runtime * pRuntime)1016*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Field::get_current_value_indices(CJS_Runtime* pRuntime) {
1017*3ac0a46fSAndroid Build Coastguard Worker   CPDF_FormField* pFormField = GetFirstFormField();
1018*3ac0a46fSAndroid Build Coastguard Worker   if (!pFormField)
1019*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kBadObjectError);
1020*3ac0a46fSAndroid Build Coastguard Worker 
1021*3ac0a46fSAndroid Build Coastguard Worker   if (!IsComboBoxOrListBox(pFormField))
1022*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kObjectTypeError);
1023*3ac0a46fSAndroid Build Coastguard Worker 
1024*3ac0a46fSAndroid Build Coastguard Worker   int count = pFormField->CountSelectedItems();
1025*3ac0a46fSAndroid Build Coastguard Worker   if (count <= 0)
1026*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Success(pRuntime->NewNumber(-1));
1027*3ac0a46fSAndroid Build Coastguard Worker   if (count == 1)
1028*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Success(
1029*3ac0a46fSAndroid Build Coastguard Worker         pRuntime->NewNumber(pFormField->GetSelectedIndex(0)));
1030*3ac0a46fSAndroid Build Coastguard Worker 
1031*3ac0a46fSAndroid Build Coastguard Worker   v8::Local<v8::Array> SelArray = pRuntime->NewArray();
1032*3ac0a46fSAndroid Build Coastguard Worker   for (int i = 0; i < count; i++) {
1033*3ac0a46fSAndroid Build Coastguard Worker     pRuntime->PutArrayElement(
1034*3ac0a46fSAndroid Build Coastguard Worker         SelArray, i, pRuntime->NewNumber(pFormField->GetSelectedIndex(i)));
1035*3ac0a46fSAndroid Build Coastguard Worker   }
1036*3ac0a46fSAndroid Build Coastguard Worker   if (SelArray.IsEmpty())
1037*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Success(pRuntime->NewArray());
1038*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success(SelArray);
1039*3ac0a46fSAndroid Build Coastguard Worker }
1040*3ac0a46fSAndroid Build Coastguard Worker 
set_current_value_indices(CJS_Runtime * pRuntime,v8::Local<v8::Value> vp)1041*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Field::set_current_value_indices(CJS_Runtime* pRuntime,
1042*3ac0a46fSAndroid Build Coastguard Worker                                                 v8::Local<v8::Value> vp) {
1043*3ac0a46fSAndroid Build Coastguard Worker   if (!m_bCanSet)
1044*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kReadOnlyError);
1045*3ac0a46fSAndroid Build Coastguard Worker 
1046*3ac0a46fSAndroid Build Coastguard Worker   std::vector<uint32_t> array;
1047*3ac0a46fSAndroid Build Coastguard Worker   if (vp->IsNumber()) {
1048*3ac0a46fSAndroid Build Coastguard Worker     array.push_back(pRuntime->ToInt32(vp));
1049*3ac0a46fSAndroid Build Coastguard Worker   } else if (fxv8::IsArray(vp)) {
1050*3ac0a46fSAndroid Build Coastguard Worker     v8::Local<v8::Array> SelArray = pRuntime->ToArray(vp);
1051*3ac0a46fSAndroid Build Coastguard Worker     for (size_t i = 0; i < pRuntime->GetArrayLength(SelArray); i++) {
1052*3ac0a46fSAndroid Build Coastguard Worker       array.push_back(
1053*3ac0a46fSAndroid Build Coastguard Worker           pRuntime->ToInt32(pRuntime->GetArrayElement(SelArray, i)));
1054*3ac0a46fSAndroid Build Coastguard Worker     }
1055*3ac0a46fSAndroid Build Coastguard Worker   }
1056*3ac0a46fSAndroid Build Coastguard Worker 
1057*3ac0a46fSAndroid Build Coastguard Worker   if (m_bDelay) {
1058*3ac0a46fSAndroid Build Coastguard Worker     AddDelay_WordArray(FP_CURRENTVALUEINDICES, array);
1059*3ac0a46fSAndroid Build Coastguard Worker   } else {
1060*3ac0a46fSAndroid Build Coastguard Worker     SetCurrentValueIndices(m_pFormFillEnv.Get(), m_FieldName,
1061*3ac0a46fSAndroid Build Coastguard Worker                            m_nFormControlIndex, array);
1062*3ac0a46fSAndroid Build Coastguard Worker   }
1063*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success();
1064*3ac0a46fSAndroid Build Coastguard Worker }
1065*3ac0a46fSAndroid Build Coastguard Worker 
get_default_style(CJS_Runtime * pRuntime)1066*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Field::get_default_style(CJS_Runtime* pRuntime) {
1067*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Failure(JSMessage::kNotSupportedError);
1068*3ac0a46fSAndroid Build Coastguard Worker }
1069*3ac0a46fSAndroid Build Coastguard Worker 
set_default_style(CJS_Runtime * pRuntime,v8::Local<v8::Value> vp)1070*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Field::set_default_style(CJS_Runtime* pRuntime,
1071*3ac0a46fSAndroid Build Coastguard Worker                                         v8::Local<v8::Value> vp) {
1072*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Failure(JSMessage::kNotSupportedError);
1073*3ac0a46fSAndroid Build Coastguard Worker }
1074*3ac0a46fSAndroid Build Coastguard Worker 
get_default_value(CJS_Runtime * pRuntime)1075*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Field::get_default_value(CJS_Runtime* pRuntime) {
1076*3ac0a46fSAndroid Build Coastguard Worker   DCHECK(m_pFormFillEnv);
1077*3ac0a46fSAndroid Build Coastguard Worker 
1078*3ac0a46fSAndroid Build Coastguard Worker   CPDF_FormField* pFormField = GetFirstFormField();
1079*3ac0a46fSAndroid Build Coastguard Worker   if (!pFormField)
1080*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kBadObjectError);
1081*3ac0a46fSAndroid Build Coastguard Worker 
1082*3ac0a46fSAndroid Build Coastguard Worker   if (pFormField->GetFieldType() == FormFieldType::kPushButton ||
1083*3ac0a46fSAndroid Build Coastguard Worker       pFormField->GetFieldType() == FormFieldType::kSignature) {
1084*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kObjectTypeError);
1085*3ac0a46fSAndroid Build Coastguard Worker   }
1086*3ac0a46fSAndroid Build Coastguard Worker 
1087*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success(
1088*3ac0a46fSAndroid Build Coastguard Worker       pRuntime->NewString(pFormField->GetDefaultValue().AsStringView()));
1089*3ac0a46fSAndroid Build Coastguard Worker }
1090*3ac0a46fSAndroid Build Coastguard Worker 
set_default_value(CJS_Runtime * pRuntime,v8::Local<v8::Value> vp)1091*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Field::set_default_value(CJS_Runtime* pRuntime,
1092*3ac0a46fSAndroid Build Coastguard Worker                                         v8::Local<v8::Value> vp) {
1093*3ac0a46fSAndroid Build Coastguard Worker   DCHECK(m_pFormFillEnv);
1094*3ac0a46fSAndroid Build Coastguard Worker   if (!m_bCanSet)
1095*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kReadOnlyError);
1096*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success();
1097*3ac0a46fSAndroid Build Coastguard Worker }
1098*3ac0a46fSAndroid Build Coastguard Worker 
get_do_not_scroll(CJS_Runtime * pRuntime)1099*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Field::get_do_not_scroll(CJS_Runtime* pRuntime) {
1100*3ac0a46fSAndroid Build Coastguard Worker   DCHECK(m_pFormFillEnv);
1101*3ac0a46fSAndroid Build Coastguard Worker 
1102*3ac0a46fSAndroid Build Coastguard Worker   CPDF_FormField* pFormField = GetFirstFormField();
1103*3ac0a46fSAndroid Build Coastguard Worker   if (!pFormField)
1104*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kBadObjectError);
1105*3ac0a46fSAndroid Build Coastguard Worker 
1106*3ac0a46fSAndroid Build Coastguard Worker   if (pFormField->GetFieldType() != FormFieldType::kTextField)
1107*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kObjectTypeError);
1108*3ac0a46fSAndroid Build Coastguard Worker 
1109*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success(pRuntime->NewBoolean(
1110*3ac0a46fSAndroid Build Coastguard Worker       !!(pFormField->GetFieldFlags() & pdfium::form_flags::kTextDoNotScroll)));
1111*3ac0a46fSAndroid Build Coastguard Worker }
1112*3ac0a46fSAndroid Build Coastguard Worker 
set_do_not_scroll(CJS_Runtime * pRuntime,v8::Local<v8::Value> vp)1113*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Field::set_do_not_scroll(CJS_Runtime* pRuntime,
1114*3ac0a46fSAndroid Build Coastguard Worker                                         v8::Local<v8::Value> vp) {
1115*3ac0a46fSAndroid Build Coastguard Worker   DCHECK(m_pFormFillEnv);
1116*3ac0a46fSAndroid Build Coastguard Worker   if (!m_bCanSet)
1117*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kReadOnlyError);
1118*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success();
1119*3ac0a46fSAndroid Build Coastguard Worker }
1120*3ac0a46fSAndroid Build Coastguard Worker 
get_do_not_spell_check(CJS_Runtime * pRuntime)1121*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Field::get_do_not_spell_check(CJS_Runtime* pRuntime) {
1122*3ac0a46fSAndroid Build Coastguard Worker   DCHECK(m_pFormFillEnv);
1123*3ac0a46fSAndroid Build Coastguard Worker 
1124*3ac0a46fSAndroid Build Coastguard Worker   CPDF_FormField* pFormField = GetFirstFormField();
1125*3ac0a46fSAndroid Build Coastguard Worker   if (!pFormField)
1126*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kBadObjectError);
1127*3ac0a46fSAndroid Build Coastguard Worker 
1128*3ac0a46fSAndroid Build Coastguard Worker   if (!IsComboBoxOrTextField(pFormField))
1129*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kObjectTypeError);
1130*3ac0a46fSAndroid Build Coastguard Worker 
1131*3ac0a46fSAndroid Build Coastguard Worker   uint32_t dwFieldFlags = pFormField->GetFieldFlags();
1132*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success(pRuntime->NewBoolean(
1133*3ac0a46fSAndroid Build Coastguard Worker       !!(dwFieldFlags & pdfium::form_flags::kTextDoNotSpellCheck)));
1134*3ac0a46fSAndroid Build Coastguard Worker }
1135*3ac0a46fSAndroid Build Coastguard Worker 
set_do_not_spell_check(CJS_Runtime * pRuntime,v8::Local<v8::Value> vp)1136*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Field::set_do_not_spell_check(CJS_Runtime* pRuntime,
1137*3ac0a46fSAndroid Build Coastguard Worker                                              v8::Local<v8::Value> vp) {
1138*3ac0a46fSAndroid Build Coastguard Worker   DCHECK(m_pFormFillEnv);
1139*3ac0a46fSAndroid Build Coastguard Worker   if (!m_bCanSet)
1140*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kReadOnlyError);
1141*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success();
1142*3ac0a46fSAndroid Build Coastguard Worker }
1143*3ac0a46fSAndroid Build Coastguard Worker 
get_delay(CJS_Runtime * pRuntime)1144*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Field::get_delay(CJS_Runtime* pRuntime) {
1145*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success(pRuntime->NewBoolean(m_bDelay));
1146*3ac0a46fSAndroid Build Coastguard Worker }
1147*3ac0a46fSAndroid Build Coastguard Worker 
set_delay(CJS_Runtime * pRuntime,v8::Local<v8::Value> vp)1148*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Field::set_delay(CJS_Runtime* pRuntime,
1149*3ac0a46fSAndroid Build Coastguard Worker                                 v8::Local<v8::Value> vp) {
1150*3ac0a46fSAndroid Build Coastguard Worker   if (!m_bCanSet)
1151*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kReadOnlyError);
1152*3ac0a46fSAndroid Build Coastguard Worker 
1153*3ac0a46fSAndroid Build Coastguard Worker   SetDelay(pRuntime->ToBoolean(vp));
1154*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success();
1155*3ac0a46fSAndroid Build Coastguard Worker }
1156*3ac0a46fSAndroid Build Coastguard Worker 
get_display(CJS_Runtime * pRuntime)1157*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Field::get_display(CJS_Runtime* pRuntime) {
1158*3ac0a46fSAndroid Build Coastguard Worker   CPDF_FormField* pFormField = GetFirstFormField();
1159*3ac0a46fSAndroid Build Coastguard Worker   if (!pFormField)
1160*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kBadObjectError);
1161*3ac0a46fSAndroid Build Coastguard Worker 
1162*3ac0a46fSAndroid Build Coastguard Worker   CPDFSDK_InteractiveForm* pForm = m_pFormFillEnv->GetInteractiveForm();
1163*3ac0a46fSAndroid Build Coastguard Worker   CPDFSDK_Widget* pWidget = pForm->GetWidget(GetSmartFieldControl(pFormField));
1164*3ac0a46fSAndroid Build Coastguard Worker   if (!pWidget)
1165*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kBadObjectError);
1166*3ac0a46fSAndroid Build Coastguard Worker 
1167*3ac0a46fSAndroid Build Coastguard Worker   uint32_t dwFlag = pWidget->GetFlags();
1168*3ac0a46fSAndroid Build Coastguard Worker   if (pdfium::annotation_flags::kInvisible & dwFlag ||
1169*3ac0a46fSAndroid Build Coastguard Worker       pdfium::annotation_flags::kHidden & dwFlag) {
1170*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Success(pRuntime->NewNumber(1));
1171*3ac0a46fSAndroid Build Coastguard Worker   }
1172*3ac0a46fSAndroid Build Coastguard Worker 
1173*3ac0a46fSAndroid Build Coastguard Worker   if (pdfium::annotation_flags::kPrint & dwFlag) {
1174*3ac0a46fSAndroid Build Coastguard Worker     if (pdfium::annotation_flags::kNoView & dwFlag)
1175*3ac0a46fSAndroid Build Coastguard Worker       return CJS_Result::Success(pRuntime->NewNumber(3));
1176*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Success(pRuntime->NewNumber(0));
1177*3ac0a46fSAndroid Build Coastguard Worker   }
1178*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success(pRuntime->NewNumber(2));
1179*3ac0a46fSAndroid Build Coastguard Worker }
1180*3ac0a46fSAndroid Build Coastguard Worker 
set_display(CJS_Runtime * pRuntime,v8::Local<v8::Value> vp)1181*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Field::set_display(CJS_Runtime* pRuntime,
1182*3ac0a46fSAndroid Build Coastguard Worker                                   v8::Local<v8::Value> vp) {
1183*3ac0a46fSAndroid Build Coastguard Worker   if (!m_bCanSet)
1184*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kReadOnlyError);
1185*3ac0a46fSAndroid Build Coastguard Worker 
1186*3ac0a46fSAndroid Build Coastguard Worker   if (m_bDelay) {
1187*3ac0a46fSAndroid Build Coastguard Worker     AddDelay_Int(FP_DISPLAY, pRuntime->ToInt32(vp));
1188*3ac0a46fSAndroid Build Coastguard Worker   } else {
1189*3ac0a46fSAndroid Build Coastguard Worker     SetDisplay(m_pFormFillEnv.Get(), m_FieldName, m_nFormControlIndex,
1190*3ac0a46fSAndroid Build Coastguard Worker                pRuntime->ToInt32(vp));
1191*3ac0a46fSAndroid Build Coastguard Worker   }
1192*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success();
1193*3ac0a46fSAndroid Build Coastguard Worker }
1194*3ac0a46fSAndroid Build Coastguard Worker 
get_doc(CJS_Runtime * pRuntime)1195*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Field::get_doc(CJS_Runtime* pRuntime) {
1196*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success(m_pJSDoc->ToV8Object());
1197*3ac0a46fSAndroid Build Coastguard Worker }
1198*3ac0a46fSAndroid Build Coastguard Worker 
set_doc(CJS_Runtime * pRuntime,v8::Local<v8::Value> vp)1199*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Field::set_doc(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp) {
1200*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Failure(JSMessage::kNotSupportedError);
1201*3ac0a46fSAndroid Build Coastguard Worker }
1202*3ac0a46fSAndroid Build Coastguard Worker 
get_editable(CJS_Runtime * pRuntime)1203*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Field::get_editable(CJS_Runtime* pRuntime) {
1204*3ac0a46fSAndroid Build Coastguard Worker   CPDF_FormField* pFormField = GetFirstFormField();
1205*3ac0a46fSAndroid Build Coastguard Worker   if (!pFormField)
1206*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kBadObjectError);
1207*3ac0a46fSAndroid Build Coastguard Worker 
1208*3ac0a46fSAndroid Build Coastguard Worker   if (pFormField->GetFieldType() != FormFieldType::kComboBox)
1209*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kObjectTypeError);
1210*3ac0a46fSAndroid Build Coastguard Worker 
1211*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success(pRuntime->NewBoolean(
1212*3ac0a46fSAndroid Build Coastguard Worker       !!(pFormField->GetFieldFlags() & pdfium::form_flags::kChoiceEdit)));
1213*3ac0a46fSAndroid Build Coastguard Worker }
1214*3ac0a46fSAndroid Build Coastguard Worker 
set_editable(CJS_Runtime * pRuntime,v8::Local<v8::Value> vp)1215*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Field::set_editable(CJS_Runtime* pRuntime,
1216*3ac0a46fSAndroid Build Coastguard Worker                                    v8::Local<v8::Value> vp) {
1217*3ac0a46fSAndroid Build Coastguard Worker   if (!m_bCanSet)
1218*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kReadOnlyError);
1219*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success();
1220*3ac0a46fSAndroid Build Coastguard Worker }
1221*3ac0a46fSAndroid Build Coastguard Worker 
get_export_values(CJS_Runtime * pRuntime)1222*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Field::get_export_values(CJS_Runtime* pRuntime) {
1223*3ac0a46fSAndroid Build Coastguard Worker   CPDF_FormField* pFormField = GetFirstFormField();
1224*3ac0a46fSAndroid Build Coastguard Worker   if (!pFormField)
1225*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kBadObjectError);
1226*3ac0a46fSAndroid Build Coastguard Worker 
1227*3ac0a46fSAndroid Build Coastguard Worker   if (!IsCheckBoxOrRadioButton(pFormField))
1228*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kObjectTypeError);
1229*3ac0a46fSAndroid Build Coastguard Worker 
1230*3ac0a46fSAndroid Build Coastguard Worker   v8::Local<v8::Array> ExportValuesArray = pRuntime->NewArray();
1231*3ac0a46fSAndroid Build Coastguard Worker   if (m_nFormControlIndex < 0) {
1232*3ac0a46fSAndroid Build Coastguard Worker     for (int i = 0, sz = pFormField->CountControls(); i < sz; i++) {
1233*3ac0a46fSAndroid Build Coastguard Worker       CPDF_FormControl* pFormControl = pFormField->GetControl(i);
1234*3ac0a46fSAndroid Build Coastguard Worker       pRuntime->PutArrayElement(
1235*3ac0a46fSAndroid Build Coastguard Worker           ExportValuesArray, i,
1236*3ac0a46fSAndroid Build Coastguard Worker           pRuntime->NewString(pFormControl->GetExportValue().AsStringView()));
1237*3ac0a46fSAndroid Build Coastguard Worker     }
1238*3ac0a46fSAndroid Build Coastguard Worker   } else {
1239*3ac0a46fSAndroid Build Coastguard Worker     if (m_nFormControlIndex >= pFormField->CountControls())
1240*3ac0a46fSAndroid Build Coastguard Worker       return CJS_Result::Failure(JSMessage::kValueError);
1241*3ac0a46fSAndroid Build Coastguard Worker 
1242*3ac0a46fSAndroid Build Coastguard Worker     CPDF_FormControl* pFormControl =
1243*3ac0a46fSAndroid Build Coastguard Worker         pFormField->GetControl(m_nFormControlIndex);
1244*3ac0a46fSAndroid Build Coastguard Worker     if (!pFormControl)
1245*3ac0a46fSAndroid Build Coastguard Worker       return CJS_Result::Failure(JSMessage::kBadObjectError);
1246*3ac0a46fSAndroid Build Coastguard Worker 
1247*3ac0a46fSAndroid Build Coastguard Worker     pRuntime->PutArrayElement(
1248*3ac0a46fSAndroid Build Coastguard Worker         ExportValuesArray, 0,
1249*3ac0a46fSAndroid Build Coastguard Worker         pRuntime->NewString(pFormControl->GetExportValue().AsStringView()));
1250*3ac0a46fSAndroid Build Coastguard Worker   }
1251*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success(ExportValuesArray);
1252*3ac0a46fSAndroid Build Coastguard Worker }
1253*3ac0a46fSAndroid Build Coastguard Worker 
set_export_values(CJS_Runtime * pRuntime,v8::Local<v8::Value> vp)1254*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Field::set_export_values(CJS_Runtime* pRuntime,
1255*3ac0a46fSAndroid Build Coastguard Worker                                         v8::Local<v8::Value> vp) {
1256*3ac0a46fSAndroid Build Coastguard Worker   CPDF_FormField* pFormField = GetFirstFormField();
1257*3ac0a46fSAndroid Build Coastguard Worker   if (!pFormField)
1258*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kBadObjectError);
1259*3ac0a46fSAndroid Build Coastguard Worker 
1260*3ac0a46fSAndroid Build Coastguard Worker   if (!IsCheckBoxOrRadioButton(pFormField))
1261*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kObjectTypeError);
1262*3ac0a46fSAndroid Build Coastguard Worker 
1263*3ac0a46fSAndroid Build Coastguard Worker   if (!m_bCanSet)
1264*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kReadOnlyError);
1265*3ac0a46fSAndroid Build Coastguard Worker 
1266*3ac0a46fSAndroid Build Coastguard Worker   if (!fxv8::IsArray(vp))
1267*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kBadObjectError);
1268*3ac0a46fSAndroid Build Coastguard Worker 
1269*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success();
1270*3ac0a46fSAndroid Build Coastguard Worker }
1271*3ac0a46fSAndroid Build Coastguard Worker 
get_file_select(CJS_Runtime * pRuntime)1272*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Field::get_file_select(CJS_Runtime* pRuntime) {
1273*3ac0a46fSAndroid Build Coastguard Worker   CPDF_FormField* pFormField = GetFirstFormField();
1274*3ac0a46fSAndroid Build Coastguard Worker   if (!pFormField)
1275*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kBadObjectError);
1276*3ac0a46fSAndroid Build Coastguard Worker 
1277*3ac0a46fSAndroid Build Coastguard Worker   if (pFormField->GetFieldType() != FormFieldType::kTextField)
1278*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kObjectTypeError);
1279*3ac0a46fSAndroid Build Coastguard Worker 
1280*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success(pRuntime->NewBoolean(
1281*3ac0a46fSAndroid Build Coastguard Worker       !!(pFormField->GetFieldFlags() & pdfium::form_flags::kTextFileSelect)));
1282*3ac0a46fSAndroid Build Coastguard Worker }
1283*3ac0a46fSAndroid Build Coastguard Worker 
set_file_select(CJS_Runtime * pRuntime,v8::Local<v8::Value> vp)1284*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Field::set_file_select(CJS_Runtime* pRuntime,
1285*3ac0a46fSAndroid Build Coastguard Worker                                       v8::Local<v8::Value> vp) {
1286*3ac0a46fSAndroid Build Coastguard Worker   CPDF_FormField* pFormField = GetFirstFormField();
1287*3ac0a46fSAndroid Build Coastguard Worker   if (!pFormField)
1288*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kBadObjectError);
1289*3ac0a46fSAndroid Build Coastguard Worker 
1290*3ac0a46fSAndroid Build Coastguard Worker   if (pFormField->GetFieldType() != FormFieldType::kTextField)
1291*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kObjectTypeError);
1292*3ac0a46fSAndroid Build Coastguard Worker 
1293*3ac0a46fSAndroid Build Coastguard Worker   if (!m_bCanSet)
1294*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kReadOnlyError);
1295*3ac0a46fSAndroid Build Coastguard Worker 
1296*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success();
1297*3ac0a46fSAndroid Build Coastguard Worker }
1298*3ac0a46fSAndroid Build Coastguard Worker 
get_fill_color(CJS_Runtime * pRuntime)1299*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Field::get_fill_color(CJS_Runtime* pRuntime) {
1300*3ac0a46fSAndroid Build Coastguard Worker   CPDF_FormField* pFormField = GetFirstFormField();
1301*3ac0a46fSAndroid Build Coastguard Worker   if (!pFormField)
1302*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kBadObjectError);
1303*3ac0a46fSAndroid Build Coastguard Worker 
1304*3ac0a46fSAndroid Build Coastguard Worker   CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
1305*3ac0a46fSAndroid Build Coastguard Worker   if (!pFormControl)
1306*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kBadObjectError);
1307*3ac0a46fSAndroid Build Coastguard Worker 
1308*3ac0a46fSAndroid Build Coastguard Worker   CFX_Color color = GetFormControlColor(pFormControl, pdfium::appearance::kBG);
1309*3ac0a46fSAndroid Build Coastguard Worker   v8::Local<v8::Value> array =
1310*3ac0a46fSAndroid Build Coastguard Worker       CJS_Color::ConvertPWLColorToArray(pRuntime, color);
1311*3ac0a46fSAndroid Build Coastguard Worker   if (array.IsEmpty())
1312*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Success(pRuntime->NewArray());
1313*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success(array);
1314*3ac0a46fSAndroid Build Coastguard Worker }
1315*3ac0a46fSAndroid Build Coastguard Worker 
set_fill_color(CJS_Runtime * pRuntime,v8::Local<v8::Value> vp)1316*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Field::set_fill_color(CJS_Runtime* pRuntime,
1317*3ac0a46fSAndroid Build Coastguard Worker                                      v8::Local<v8::Value> vp) {
1318*3ac0a46fSAndroid Build Coastguard Worker   std::vector<CPDF_FormField*> FieldArray = GetFormFields();
1319*3ac0a46fSAndroid Build Coastguard Worker   if (FieldArray.empty())
1320*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kBadObjectError);
1321*3ac0a46fSAndroid Build Coastguard Worker   if (!m_bCanSet)
1322*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kReadOnlyError);
1323*3ac0a46fSAndroid Build Coastguard Worker   if (!fxv8::IsArray(vp))
1324*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kBadObjectError);
1325*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success();
1326*3ac0a46fSAndroid Build Coastguard Worker }
1327*3ac0a46fSAndroid Build Coastguard Worker 
get_hidden(CJS_Runtime * pRuntime)1328*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Field::get_hidden(CJS_Runtime* pRuntime) {
1329*3ac0a46fSAndroid Build Coastguard Worker   CPDF_FormField* pFormField = GetFirstFormField();
1330*3ac0a46fSAndroid Build Coastguard Worker   if (!pFormField)
1331*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kBadObjectError);
1332*3ac0a46fSAndroid Build Coastguard Worker 
1333*3ac0a46fSAndroid Build Coastguard Worker   CPDFSDK_InteractiveForm* pForm = m_pFormFillEnv->GetInteractiveForm();
1334*3ac0a46fSAndroid Build Coastguard Worker   CPDFSDK_Widget* pWidget = pForm->GetWidget(GetSmartFieldControl(pFormField));
1335*3ac0a46fSAndroid Build Coastguard Worker   if (!pWidget)
1336*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kBadObjectError);
1337*3ac0a46fSAndroid Build Coastguard Worker 
1338*3ac0a46fSAndroid Build Coastguard Worker   uint32_t dwFlags = pWidget->GetFlags();
1339*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success(
1340*3ac0a46fSAndroid Build Coastguard Worker       pRuntime->NewBoolean(pdfium::annotation_flags::kInvisible & dwFlags ||
1341*3ac0a46fSAndroid Build Coastguard Worker                            pdfium::annotation_flags::kHidden & dwFlags));
1342*3ac0a46fSAndroid Build Coastguard Worker }
1343*3ac0a46fSAndroid Build Coastguard Worker 
set_hidden(CJS_Runtime * pRuntime,v8::Local<v8::Value> vp)1344*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Field::set_hidden(CJS_Runtime* pRuntime,
1345*3ac0a46fSAndroid Build Coastguard Worker                                  v8::Local<v8::Value> vp) {
1346*3ac0a46fSAndroid Build Coastguard Worker   if (!m_bCanSet)
1347*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kReadOnlyError);
1348*3ac0a46fSAndroid Build Coastguard Worker 
1349*3ac0a46fSAndroid Build Coastguard Worker   if (m_bDelay) {
1350*3ac0a46fSAndroid Build Coastguard Worker     AddDelay_Bool(FP_HIDDEN, pRuntime->ToBoolean(vp));
1351*3ac0a46fSAndroid Build Coastguard Worker   } else {
1352*3ac0a46fSAndroid Build Coastguard Worker     SetHidden(m_pFormFillEnv.Get(), m_FieldName, m_nFormControlIndex,
1353*3ac0a46fSAndroid Build Coastguard Worker               pRuntime->ToBoolean(vp));
1354*3ac0a46fSAndroid Build Coastguard Worker   }
1355*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success();
1356*3ac0a46fSAndroid Build Coastguard Worker }
1357*3ac0a46fSAndroid Build Coastguard Worker 
get_highlight(CJS_Runtime * pRuntime)1358*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Field::get_highlight(CJS_Runtime* pRuntime) {
1359*3ac0a46fSAndroid Build Coastguard Worker   DCHECK(m_pFormFillEnv);
1360*3ac0a46fSAndroid Build Coastguard Worker 
1361*3ac0a46fSAndroid Build Coastguard Worker   CPDF_FormField* pFormField = GetFirstFormField();
1362*3ac0a46fSAndroid Build Coastguard Worker   if (!pFormField)
1363*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kBadObjectError);
1364*3ac0a46fSAndroid Build Coastguard Worker 
1365*3ac0a46fSAndroid Build Coastguard Worker   if (pFormField->GetFieldType() != FormFieldType::kPushButton)
1366*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kObjectTypeError);
1367*3ac0a46fSAndroid Build Coastguard Worker 
1368*3ac0a46fSAndroid Build Coastguard Worker   CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
1369*3ac0a46fSAndroid Build Coastguard Worker   if (!pFormControl)
1370*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kBadObjectError);
1371*3ac0a46fSAndroid Build Coastguard Worker 
1372*3ac0a46fSAndroid Build Coastguard Worker   int eHM = pFormControl->GetHighlightingMode();
1373*3ac0a46fSAndroid Build Coastguard Worker   switch (eHM) {
1374*3ac0a46fSAndroid Build Coastguard Worker     case CPDF_FormControl::kNone:
1375*3ac0a46fSAndroid Build Coastguard Worker       return CJS_Result::Success(pRuntime->NewString("none"));
1376*3ac0a46fSAndroid Build Coastguard Worker     case CPDF_FormControl::kPush:
1377*3ac0a46fSAndroid Build Coastguard Worker       return CJS_Result::Success(pRuntime->NewString("push"));
1378*3ac0a46fSAndroid Build Coastguard Worker     case CPDF_FormControl::kInvert:
1379*3ac0a46fSAndroid Build Coastguard Worker       return CJS_Result::Success(pRuntime->NewString("invert"));
1380*3ac0a46fSAndroid Build Coastguard Worker     case CPDF_FormControl::kOutline:
1381*3ac0a46fSAndroid Build Coastguard Worker       return CJS_Result::Success(pRuntime->NewString("outline"));
1382*3ac0a46fSAndroid Build Coastguard Worker     case CPDF_FormControl::kToggle:
1383*3ac0a46fSAndroid Build Coastguard Worker       return CJS_Result::Success(pRuntime->NewString("toggle"));
1384*3ac0a46fSAndroid Build Coastguard Worker   }
1385*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success();
1386*3ac0a46fSAndroid Build Coastguard Worker }
1387*3ac0a46fSAndroid Build Coastguard Worker 
set_highlight(CJS_Runtime * pRuntime,v8::Local<v8::Value> vp)1388*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Field::set_highlight(CJS_Runtime* pRuntime,
1389*3ac0a46fSAndroid Build Coastguard Worker                                     v8::Local<v8::Value> vp) {
1390*3ac0a46fSAndroid Build Coastguard Worker   DCHECK(m_pFormFillEnv);
1391*3ac0a46fSAndroid Build Coastguard Worker   if (!m_bCanSet)
1392*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kReadOnlyError);
1393*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success();
1394*3ac0a46fSAndroid Build Coastguard Worker }
1395*3ac0a46fSAndroid Build Coastguard Worker 
get_line_width(CJS_Runtime * pRuntime)1396*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Field::get_line_width(CJS_Runtime* pRuntime) {
1397*3ac0a46fSAndroid Build Coastguard Worker   CPDF_FormField* pFormField = GetFirstFormField();
1398*3ac0a46fSAndroid Build Coastguard Worker   if (!pFormField)
1399*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kBadObjectError);
1400*3ac0a46fSAndroid Build Coastguard Worker 
1401*3ac0a46fSAndroid Build Coastguard Worker   CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
1402*3ac0a46fSAndroid Build Coastguard Worker   if (!pFormControl)
1403*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kBadObjectError);
1404*3ac0a46fSAndroid Build Coastguard Worker 
1405*3ac0a46fSAndroid Build Coastguard Worker   CPDFSDK_InteractiveForm* pForm = m_pFormFillEnv->GetInteractiveForm();
1406*3ac0a46fSAndroid Build Coastguard Worker   if (!pFormField->CountControls())
1407*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kBadObjectError);
1408*3ac0a46fSAndroid Build Coastguard Worker 
1409*3ac0a46fSAndroid Build Coastguard Worker   CPDFSDK_Widget* pWidget = pForm->GetWidget(pFormField->GetControl(0));
1410*3ac0a46fSAndroid Build Coastguard Worker   if (!pWidget)
1411*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kBadObjectError);
1412*3ac0a46fSAndroid Build Coastguard Worker 
1413*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success(pRuntime->NewNumber(pWidget->GetBorderWidth()));
1414*3ac0a46fSAndroid Build Coastguard Worker }
1415*3ac0a46fSAndroid Build Coastguard Worker 
set_line_width(CJS_Runtime * pRuntime,v8::Local<v8::Value> vp)1416*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Field::set_line_width(CJS_Runtime* pRuntime,
1417*3ac0a46fSAndroid Build Coastguard Worker                                      v8::Local<v8::Value> vp) {
1418*3ac0a46fSAndroid Build Coastguard Worker   if (!m_bCanSet)
1419*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kReadOnlyError);
1420*3ac0a46fSAndroid Build Coastguard Worker 
1421*3ac0a46fSAndroid Build Coastguard Worker   if (m_bDelay) {
1422*3ac0a46fSAndroid Build Coastguard Worker     AddDelay_Int(FP_LINEWIDTH, pRuntime->ToInt32(vp));
1423*3ac0a46fSAndroid Build Coastguard Worker   } else {
1424*3ac0a46fSAndroid Build Coastguard Worker     SetLineWidth(m_pFormFillEnv.Get(), m_FieldName, m_nFormControlIndex,
1425*3ac0a46fSAndroid Build Coastguard Worker                  pRuntime->ToInt32(vp));
1426*3ac0a46fSAndroid Build Coastguard Worker   }
1427*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success();
1428*3ac0a46fSAndroid Build Coastguard Worker }
1429*3ac0a46fSAndroid Build Coastguard Worker 
get_multiline(CJS_Runtime * pRuntime)1430*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Field::get_multiline(CJS_Runtime* pRuntime) {
1431*3ac0a46fSAndroid Build Coastguard Worker   DCHECK(m_pFormFillEnv);
1432*3ac0a46fSAndroid Build Coastguard Worker 
1433*3ac0a46fSAndroid Build Coastguard Worker   CPDF_FormField* pFormField = GetFirstFormField();
1434*3ac0a46fSAndroid Build Coastguard Worker   if (!pFormField)
1435*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kBadObjectError);
1436*3ac0a46fSAndroid Build Coastguard Worker 
1437*3ac0a46fSAndroid Build Coastguard Worker   if (pFormField->GetFieldType() != FormFieldType::kTextField)
1438*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kObjectTypeError);
1439*3ac0a46fSAndroid Build Coastguard Worker 
1440*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success(pRuntime->NewBoolean(
1441*3ac0a46fSAndroid Build Coastguard Worker       !!(pFormField->GetFieldFlags() & pdfium::form_flags::kTextMultiline)));
1442*3ac0a46fSAndroid Build Coastguard Worker }
1443*3ac0a46fSAndroid Build Coastguard Worker 
set_multiline(CJS_Runtime * pRuntime,v8::Local<v8::Value> vp)1444*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Field::set_multiline(CJS_Runtime* pRuntime,
1445*3ac0a46fSAndroid Build Coastguard Worker                                     v8::Local<v8::Value> vp) {
1446*3ac0a46fSAndroid Build Coastguard Worker   DCHECK(m_pFormFillEnv);
1447*3ac0a46fSAndroid Build Coastguard Worker   if (!m_bCanSet)
1448*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kReadOnlyError);
1449*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success();
1450*3ac0a46fSAndroid Build Coastguard Worker }
1451*3ac0a46fSAndroid Build Coastguard Worker 
get_multiple_selection(CJS_Runtime * pRuntime)1452*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Field::get_multiple_selection(CJS_Runtime* pRuntime) {
1453*3ac0a46fSAndroid Build Coastguard Worker   DCHECK(m_pFormFillEnv);
1454*3ac0a46fSAndroid Build Coastguard Worker   CPDF_FormField* pFormField = GetFirstFormField();
1455*3ac0a46fSAndroid Build Coastguard Worker   if (!pFormField)
1456*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kBadObjectError);
1457*3ac0a46fSAndroid Build Coastguard Worker 
1458*3ac0a46fSAndroid Build Coastguard Worker   if (pFormField->GetFieldType() != FormFieldType::kListBox)
1459*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kObjectTypeError);
1460*3ac0a46fSAndroid Build Coastguard Worker 
1461*3ac0a46fSAndroid Build Coastguard Worker   uint32_t dwFieldFlags = pFormField->GetFieldFlags();
1462*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success(pRuntime->NewBoolean(
1463*3ac0a46fSAndroid Build Coastguard Worker       !!(dwFieldFlags & pdfium::form_flags::kChoiceMultiSelect)));
1464*3ac0a46fSAndroid Build Coastguard Worker }
1465*3ac0a46fSAndroid Build Coastguard Worker 
set_multiple_selection(CJS_Runtime * pRuntime,v8::Local<v8::Value> vp)1466*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Field::set_multiple_selection(CJS_Runtime* pRuntime,
1467*3ac0a46fSAndroid Build Coastguard Worker                                              v8::Local<v8::Value> vp) {
1468*3ac0a46fSAndroid Build Coastguard Worker   DCHECK(m_pFormFillEnv);
1469*3ac0a46fSAndroid Build Coastguard Worker   if (!m_bCanSet)
1470*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kReadOnlyError);
1471*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success();
1472*3ac0a46fSAndroid Build Coastguard Worker }
1473*3ac0a46fSAndroid Build Coastguard Worker 
get_name(CJS_Runtime * pRuntime)1474*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Field::get_name(CJS_Runtime* pRuntime) {
1475*3ac0a46fSAndroid Build Coastguard Worker   std::vector<CPDF_FormField*> FieldArray = GetFormFields();
1476*3ac0a46fSAndroid Build Coastguard Worker   if (FieldArray.empty())
1477*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kBadObjectError);
1478*3ac0a46fSAndroid Build Coastguard Worker 
1479*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success(pRuntime->NewString(m_FieldName.AsStringView()));
1480*3ac0a46fSAndroid Build Coastguard Worker }
1481*3ac0a46fSAndroid Build Coastguard Worker 
set_name(CJS_Runtime * pRuntime,v8::Local<v8::Value> vp)1482*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Field::set_name(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp) {
1483*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Failure(JSMessage::kNotSupportedError);
1484*3ac0a46fSAndroid Build Coastguard Worker }
1485*3ac0a46fSAndroid Build Coastguard Worker 
get_num_items(CJS_Runtime * pRuntime)1486*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Field::get_num_items(CJS_Runtime* pRuntime) {
1487*3ac0a46fSAndroid Build Coastguard Worker   CPDF_FormField* pFormField = GetFirstFormField();
1488*3ac0a46fSAndroid Build Coastguard Worker   if (!pFormField)
1489*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kBadObjectError);
1490*3ac0a46fSAndroid Build Coastguard Worker 
1491*3ac0a46fSAndroid Build Coastguard Worker   if (!IsComboBoxOrListBox(pFormField))
1492*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kObjectTypeError);
1493*3ac0a46fSAndroid Build Coastguard Worker 
1494*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success(pRuntime->NewNumber(pFormField->CountOptions()));
1495*3ac0a46fSAndroid Build Coastguard Worker }
1496*3ac0a46fSAndroid Build Coastguard Worker 
set_num_items(CJS_Runtime * pRuntime,v8::Local<v8::Value> vp)1497*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Field::set_num_items(CJS_Runtime* pRuntime,
1498*3ac0a46fSAndroid Build Coastguard Worker                                     v8::Local<v8::Value> vp) {
1499*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Failure(JSMessage::kNotSupportedError);
1500*3ac0a46fSAndroid Build Coastguard Worker }
1501*3ac0a46fSAndroid Build Coastguard Worker 
get_page(CJS_Runtime * pRuntime)1502*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Field::get_page(CJS_Runtime* pRuntime) {
1503*3ac0a46fSAndroid Build Coastguard Worker   CPDF_FormField* pFormField = GetFirstFormField();
1504*3ac0a46fSAndroid Build Coastguard Worker   if (!pFormField)
1505*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kBadObjectError);
1506*3ac0a46fSAndroid Build Coastguard Worker 
1507*3ac0a46fSAndroid Build Coastguard Worker   std::vector<ObservedPtr<CPDFSDK_Widget>> widgets;
1508*3ac0a46fSAndroid Build Coastguard Worker   m_pFormFillEnv->GetInteractiveForm()->GetWidgets(pFormField, &widgets);
1509*3ac0a46fSAndroid Build Coastguard Worker   if (widgets.empty())
1510*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Success(pRuntime->NewNumber(-1));
1511*3ac0a46fSAndroid Build Coastguard Worker 
1512*3ac0a46fSAndroid Build Coastguard Worker   v8::Local<v8::Array> PageArray = pRuntime->NewArray();
1513*3ac0a46fSAndroid Build Coastguard Worker   int i = 0;
1514*3ac0a46fSAndroid Build Coastguard Worker   for (const auto& pWidget : widgets) {
1515*3ac0a46fSAndroid Build Coastguard Worker     if (!pWidget)
1516*3ac0a46fSAndroid Build Coastguard Worker       return CJS_Result::Failure(JSMessage::kBadObjectError);
1517*3ac0a46fSAndroid Build Coastguard Worker 
1518*3ac0a46fSAndroid Build Coastguard Worker     pRuntime->PutArrayElement(
1519*3ac0a46fSAndroid Build Coastguard Worker         PageArray, i,
1520*3ac0a46fSAndroid Build Coastguard Worker         pRuntime->NewNumber(pWidget->GetPageView()->GetPageIndex()));
1521*3ac0a46fSAndroid Build Coastguard Worker     ++i;
1522*3ac0a46fSAndroid Build Coastguard Worker   }
1523*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success(PageArray);
1524*3ac0a46fSAndroid Build Coastguard Worker }
1525*3ac0a46fSAndroid Build Coastguard Worker 
set_page(CJS_Runtime * pRuntime,v8::Local<v8::Value> vp)1526*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Field::set_page(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp) {
1527*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Failure(JSMessage::kReadOnlyError);
1528*3ac0a46fSAndroid Build Coastguard Worker }
1529*3ac0a46fSAndroid Build Coastguard Worker 
get_password(CJS_Runtime * pRuntime)1530*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Field::get_password(CJS_Runtime* pRuntime) {
1531*3ac0a46fSAndroid Build Coastguard Worker   DCHECK(m_pFormFillEnv);
1532*3ac0a46fSAndroid Build Coastguard Worker 
1533*3ac0a46fSAndroid Build Coastguard Worker   CPDF_FormField* pFormField = GetFirstFormField();
1534*3ac0a46fSAndroid Build Coastguard Worker   if (!pFormField)
1535*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kBadObjectError);
1536*3ac0a46fSAndroid Build Coastguard Worker 
1537*3ac0a46fSAndroid Build Coastguard Worker   if (pFormField->GetFieldType() != FormFieldType::kTextField)
1538*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kObjectTypeError);
1539*3ac0a46fSAndroid Build Coastguard Worker 
1540*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success(pRuntime->NewBoolean(
1541*3ac0a46fSAndroid Build Coastguard Worker       !!(pFormField->GetFieldFlags() & pdfium::form_flags::kTextPassword)));
1542*3ac0a46fSAndroid Build Coastguard Worker }
1543*3ac0a46fSAndroid Build Coastguard Worker 
set_password(CJS_Runtime * pRuntime,v8::Local<v8::Value> vp)1544*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Field::set_password(CJS_Runtime* pRuntime,
1545*3ac0a46fSAndroid Build Coastguard Worker                                    v8::Local<v8::Value> vp) {
1546*3ac0a46fSAndroid Build Coastguard Worker   DCHECK(m_pFormFillEnv);
1547*3ac0a46fSAndroid Build Coastguard Worker   if (!m_bCanSet)
1548*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kReadOnlyError);
1549*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success();
1550*3ac0a46fSAndroid Build Coastguard Worker }
1551*3ac0a46fSAndroid Build Coastguard Worker 
get_print(CJS_Runtime * pRuntime)1552*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Field::get_print(CJS_Runtime* pRuntime) {
1553*3ac0a46fSAndroid Build Coastguard Worker   CPDFSDK_InteractiveForm* pForm = m_pFormFillEnv->GetInteractiveForm();
1554*3ac0a46fSAndroid Build Coastguard Worker   CPDF_FormField* pFormField = GetFirstFormField();
1555*3ac0a46fSAndroid Build Coastguard Worker   if (!pFormField)
1556*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kBadObjectError);
1557*3ac0a46fSAndroid Build Coastguard Worker 
1558*3ac0a46fSAndroid Build Coastguard Worker   CPDFSDK_Widget* pWidget = pForm->GetWidget(GetSmartFieldControl(pFormField));
1559*3ac0a46fSAndroid Build Coastguard Worker   if (!pWidget)
1560*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kBadObjectError);
1561*3ac0a46fSAndroid Build Coastguard Worker 
1562*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success(pRuntime->NewBoolean(
1563*3ac0a46fSAndroid Build Coastguard Worker       !!(pWidget->GetFlags() & pdfium::annotation_flags::kPrint)));
1564*3ac0a46fSAndroid Build Coastguard Worker }
1565*3ac0a46fSAndroid Build Coastguard Worker 
set_print(CJS_Runtime * pRuntime,v8::Local<v8::Value> vp)1566*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Field::set_print(CJS_Runtime* pRuntime,
1567*3ac0a46fSAndroid Build Coastguard Worker                                 v8::Local<v8::Value> vp) {
1568*3ac0a46fSAndroid Build Coastguard Worker   CPDFSDK_InteractiveForm* pForm = m_pFormFillEnv->GetInteractiveForm();
1569*3ac0a46fSAndroid Build Coastguard Worker   std::vector<CPDF_FormField*> FieldArray = GetFormFields();
1570*3ac0a46fSAndroid Build Coastguard Worker   if (FieldArray.empty())
1571*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kBadObjectError);
1572*3ac0a46fSAndroid Build Coastguard Worker 
1573*3ac0a46fSAndroid Build Coastguard Worker   if (!m_bCanSet)
1574*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kReadOnlyError);
1575*3ac0a46fSAndroid Build Coastguard Worker 
1576*3ac0a46fSAndroid Build Coastguard Worker   for (CPDF_FormField* pFormField : FieldArray) {
1577*3ac0a46fSAndroid Build Coastguard Worker     if (m_nFormControlIndex < 0) {
1578*3ac0a46fSAndroid Build Coastguard Worker       bool bSet = false;
1579*3ac0a46fSAndroid Build Coastguard Worker       for (int i = 0, sz = pFormField->CountControls(); i < sz; ++i) {
1580*3ac0a46fSAndroid Build Coastguard Worker         if (CPDFSDK_Widget* pWidget =
1581*3ac0a46fSAndroid Build Coastguard Worker                 pForm->GetWidget(pFormField->GetControl(i))) {
1582*3ac0a46fSAndroid Build Coastguard Worker           uint32_t dwFlags = pWidget->GetFlags();
1583*3ac0a46fSAndroid Build Coastguard Worker           if (pRuntime->ToBoolean(vp))
1584*3ac0a46fSAndroid Build Coastguard Worker             dwFlags |= pdfium::annotation_flags::kPrint;
1585*3ac0a46fSAndroid Build Coastguard Worker           else
1586*3ac0a46fSAndroid Build Coastguard Worker             dwFlags &= ~pdfium::annotation_flags::kPrint;
1587*3ac0a46fSAndroid Build Coastguard Worker 
1588*3ac0a46fSAndroid Build Coastguard Worker           if (dwFlags != pWidget->GetFlags()) {
1589*3ac0a46fSAndroid Build Coastguard Worker             pWidget->SetFlags(dwFlags);
1590*3ac0a46fSAndroid Build Coastguard Worker             bSet = true;
1591*3ac0a46fSAndroid Build Coastguard Worker           }
1592*3ac0a46fSAndroid Build Coastguard Worker         }
1593*3ac0a46fSAndroid Build Coastguard Worker       }
1594*3ac0a46fSAndroid Build Coastguard Worker 
1595*3ac0a46fSAndroid Build Coastguard Worker       if (bSet)
1596*3ac0a46fSAndroid Build Coastguard Worker         UpdateFormField(m_pFormFillEnv.Get(), pFormField, false);
1597*3ac0a46fSAndroid Build Coastguard Worker 
1598*3ac0a46fSAndroid Build Coastguard Worker       continue;
1599*3ac0a46fSAndroid Build Coastguard Worker     }
1600*3ac0a46fSAndroid Build Coastguard Worker 
1601*3ac0a46fSAndroid Build Coastguard Worker     if (m_nFormControlIndex >= pFormField->CountControls())
1602*3ac0a46fSAndroid Build Coastguard Worker       return CJS_Result::Failure(JSMessage::kValueError);
1603*3ac0a46fSAndroid Build Coastguard Worker 
1604*3ac0a46fSAndroid Build Coastguard Worker     if (CPDF_FormControl* pFormControl =
1605*3ac0a46fSAndroid Build Coastguard Worker             pFormField->GetControl(m_nFormControlIndex)) {
1606*3ac0a46fSAndroid Build Coastguard Worker       if (CPDFSDK_Widget* pWidget = pForm->GetWidget(pFormControl)) {
1607*3ac0a46fSAndroid Build Coastguard Worker         uint32_t dwFlags = pWidget->GetFlags();
1608*3ac0a46fSAndroid Build Coastguard Worker         if (pRuntime->ToBoolean(vp))
1609*3ac0a46fSAndroid Build Coastguard Worker           dwFlags |= pdfium::annotation_flags::kPrint;
1610*3ac0a46fSAndroid Build Coastguard Worker         else
1611*3ac0a46fSAndroid Build Coastguard Worker           dwFlags &= ~pdfium::annotation_flags::kPrint;
1612*3ac0a46fSAndroid Build Coastguard Worker 
1613*3ac0a46fSAndroid Build Coastguard Worker         if (dwFlags != pWidget->GetFlags()) {
1614*3ac0a46fSAndroid Build Coastguard Worker           pWidget->SetFlags(dwFlags);
1615*3ac0a46fSAndroid Build Coastguard Worker           UpdateFormControl(m_pFormFillEnv.Get(),
1616*3ac0a46fSAndroid Build Coastguard Worker                             pFormField->GetControl(m_nFormControlIndex), false);
1617*3ac0a46fSAndroid Build Coastguard Worker         }
1618*3ac0a46fSAndroid Build Coastguard Worker       }
1619*3ac0a46fSAndroid Build Coastguard Worker     }
1620*3ac0a46fSAndroid Build Coastguard Worker   }
1621*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success();
1622*3ac0a46fSAndroid Build Coastguard Worker }
1623*3ac0a46fSAndroid Build Coastguard Worker 
get_radios_in_unison(CJS_Runtime * pRuntime)1624*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Field::get_radios_in_unison(CJS_Runtime* pRuntime) {
1625*3ac0a46fSAndroid Build Coastguard Worker   CPDF_FormField* pFormField = GetFirstFormField();
1626*3ac0a46fSAndroid Build Coastguard Worker   if (!pFormField)
1627*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kBadObjectError);
1628*3ac0a46fSAndroid Build Coastguard Worker 
1629*3ac0a46fSAndroid Build Coastguard Worker   if (pFormField->GetFieldType() != FormFieldType::kRadioButton)
1630*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kObjectTypeError);
1631*3ac0a46fSAndroid Build Coastguard Worker 
1632*3ac0a46fSAndroid Build Coastguard Worker   uint32_t dwFieldFlags = pFormField->GetFieldFlags();
1633*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success(pRuntime->NewBoolean(
1634*3ac0a46fSAndroid Build Coastguard Worker       !!(dwFieldFlags & pdfium::form_flags::kButtonRadiosInUnison)));
1635*3ac0a46fSAndroid Build Coastguard Worker }
1636*3ac0a46fSAndroid Build Coastguard Worker 
set_radios_in_unison(CJS_Runtime * pRuntime,v8::Local<v8::Value> vp)1637*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Field::set_radios_in_unison(CJS_Runtime* pRuntime,
1638*3ac0a46fSAndroid Build Coastguard Worker                                            v8::Local<v8::Value> vp) {
1639*3ac0a46fSAndroid Build Coastguard Worker   std::vector<CPDF_FormField*> FieldArray = GetFormFields();
1640*3ac0a46fSAndroid Build Coastguard Worker   if (FieldArray.empty())
1641*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kBadObjectError);
1642*3ac0a46fSAndroid Build Coastguard Worker   if (!m_bCanSet)
1643*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kReadOnlyError);
1644*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success();
1645*3ac0a46fSAndroid Build Coastguard Worker }
1646*3ac0a46fSAndroid Build Coastguard Worker 
get_readonly(CJS_Runtime * pRuntime)1647*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Field::get_readonly(CJS_Runtime* pRuntime) {
1648*3ac0a46fSAndroid Build Coastguard Worker   CPDF_FormField* pFormField = GetFirstFormField();
1649*3ac0a46fSAndroid Build Coastguard Worker   if (!pFormField)
1650*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kBadObjectError);
1651*3ac0a46fSAndroid Build Coastguard Worker 
1652*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success(pRuntime->NewBoolean(
1653*3ac0a46fSAndroid Build Coastguard Worker       !!(pFormField->GetFieldFlags() & pdfium::form_flags::kReadOnly)));
1654*3ac0a46fSAndroid Build Coastguard Worker }
1655*3ac0a46fSAndroid Build Coastguard Worker 
set_readonly(CJS_Runtime * pRuntime,v8::Local<v8::Value> vp)1656*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Field::set_readonly(CJS_Runtime* pRuntime,
1657*3ac0a46fSAndroid Build Coastguard Worker                                    v8::Local<v8::Value> vp) {
1658*3ac0a46fSAndroid Build Coastguard Worker   CPDF_FormField* pFormField = GetFirstFormField();
1659*3ac0a46fSAndroid Build Coastguard Worker   if (!pFormField)
1660*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kBadObjectError);
1661*3ac0a46fSAndroid Build Coastguard Worker 
1662*3ac0a46fSAndroid Build Coastguard Worker   if (!m_bCanSet)
1663*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kReadOnlyError);
1664*3ac0a46fSAndroid Build Coastguard Worker 
1665*3ac0a46fSAndroid Build Coastguard Worker   const bool bReadOnly = pRuntime->ToBoolean(vp);
1666*3ac0a46fSAndroid Build Coastguard Worker   const uint32_t dwFlags = pFormField->GetFieldFlags();
1667*3ac0a46fSAndroid Build Coastguard Worker   const uint32_t dwNewFlags = bReadOnly
1668*3ac0a46fSAndroid Build Coastguard Worker                                   ? (dwFlags | pdfium::form_flags::kReadOnly)
1669*3ac0a46fSAndroid Build Coastguard Worker                                   : (dwFlags & ~pdfium::form_flags::kReadOnly);
1670*3ac0a46fSAndroid Build Coastguard Worker   if (dwNewFlags != dwFlags)
1671*3ac0a46fSAndroid Build Coastguard Worker     pFormField->SetFieldFlags(dwNewFlags);
1672*3ac0a46fSAndroid Build Coastguard Worker 
1673*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success();
1674*3ac0a46fSAndroid Build Coastguard Worker }
1675*3ac0a46fSAndroid Build Coastguard Worker 
get_rect(CJS_Runtime * pRuntime)1676*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Field::get_rect(CJS_Runtime* pRuntime) {
1677*3ac0a46fSAndroid Build Coastguard Worker   CPDF_FormField* pFormField = GetFirstFormField();
1678*3ac0a46fSAndroid Build Coastguard Worker   if (!pFormField)
1679*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kBadObjectError);
1680*3ac0a46fSAndroid Build Coastguard Worker 
1681*3ac0a46fSAndroid Build Coastguard Worker   CPDFSDK_InteractiveForm* pForm = m_pFormFillEnv->GetInteractiveForm();
1682*3ac0a46fSAndroid Build Coastguard Worker   CPDFSDK_Widget* pWidget = pForm->GetWidget(GetSmartFieldControl(pFormField));
1683*3ac0a46fSAndroid Build Coastguard Worker   if (!pWidget)
1684*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kBadObjectError);
1685*3ac0a46fSAndroid Build Coastguard Worker 
1686*3ac0a46fSAndroid Build Coastguard Worker   CFX_FloatRect crRect = pWidget->GetRect();
1687*3ac0a46fSAndroid Build Coastguard Worker   v8::Local<v8::Array> rcArray = pRuntime->NewArray();
1688*3ac0a46fSAndroid Build Coastguard Worker   pRuntime->PutArrayElement(
1689*3ac0a46fSAndroid Build Coastguard Worker       rcArray, 0, pRuntime->NewNumber(static_cast<int32_t>(crRect.left)));
1690*3ac0a46fSAndroid Build Coastguard Worker   pRuntime->PutArrayElement(
1691*3ac0a46fSAndroid Build Coastguard Worker       rcArray, 1, pRuntime->NewNumber(static_cast<int32_t>(crRect.top)));
1692*3ac0a46fSAndroid Build Coastguard Worker   pRuntime->PutArrayElement(
1693*3ac0a46fSAndroid Build Coastguard Worker       rcArray, 2, pRuntime->NewNumber(static_cast<int32_t>(crRect.right)));
1694*3ac0a46fSAndroid Build Coastguard Worker   pRuntime->PutArrayElement(
1695*3ac0a46fSAndroid Build Coastguard Worker       rcArray, 3, pRuntime->NewNumber(static_cast<int32_t>(crRect.bottom)));
1696*3ac0a46fSAndroid Build Coastguard Worker 
1697*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success(rcArray);
1698*3ac0a46fSAndroid Build Coastguard Worker }
1699*3ac0a46fSAndroid Build Coastguard Worker 
set_rect(CJS_Runtime * pRuntime,v8::Local<v8::Value> vp)1700*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Field::set_rect(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp) {
1701*3ac0a46fSAndroid Build Coastguard Worker   if (!m_bCanSet)
1702*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kReadOnlyError);
1703*3ac0a46fSAndroid Build Coastguard Worker   if (!fxv8::IsArray(vp))
1704*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kValueError);
1705*3ac0a46fSAndroid Build Coastguard Worker 
1706*3ac0a46fSAndroid Build Coastguard Worker   v8::Local<v8::Array> rcArray = pRuntime->ToArray(vp);
1707*3ac0a46fSAndroid Build Coastguard Worker   if (pRuntime->GetArrayLength(rcArray) < 4)
1708*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kValueError);
1709*3ac0a46fSAndroid Build Coastguard Worker 
1710*3ac0a46fSAndroid Build Coastguard Worker   float f0 = static_cast<float>(
1711*3ac0a46fSAndroid Build Coastguard Worker       pRuntime->ToInt32(pRuntime->GetArrayElement(rcArray, 0)));
1712*3ac0a46fSAndroid Build Coastguard Worker   float f1 = static_cast<float>(
1713*3ac0a46fSAndroid Build Coastguard Worker       pRuntime->ToInt32(pRuntime->GetArrayElement(rcArray, 1)));
1714*3ac0a46fSAndroid Build Coastguard Worker   float f2 = static_cast<float>(
1715*3ac0a46fSAndroid Build Coastguard Worker       pRuntime->ToInt32(pRuntime->GetArrayElement(rcArray, 2)));
1716*3ac0a46fSAndroid Build Coastguard Worker   float f3 = static_cast<float>(
1717*3ac0a46fSAndroid Build Coastguard Worker       pRuntime->ToInt32(pRuntime->GetArrayElement(rcArray, 3)));
1718*3ac0a46fSAndroid Build Coastguard Worker 
1719*3ac0a46fSAndroid Build Coastguard Worker   CFX_FloatRect crRect(f0, f1, f2, f3);
1720*3ac0a46fSAndroid Build Coastguard Worker   if (m_bDelay) {
1721*3ac0a46fSAndroid Build Coastguard Worker     AddDelay_Rect(FP_RECT, crRect);
1722*3ac0a46fSAndroid Build Coastguard Worker   } else {
1723*3ac0a46fSAndroid Build Coastguard Worker     SetRect(m_pFormFillEnv.Get(), m_FieldName, m_nFormControlIndex, crRect);
1724*3ac0a46fSAndroid Build Coastguard Worker   }
1725*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success();
1726*3ac0a46fSAndroid Build Coastguard Worker }
1727*3ac0a46fSAndroid Build Coastguard Worker 
get_required(CJS_Runtime * pRuntime)1728*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Field::get_required(CJS_Runtime* pRuntime) {
1729*3ac0a46fSAndroid Build Coastguard Worker   CPDF_FormField* pFormField = GetFirstFormField();
1730*3ac0a46fSAndroid Build Coastguard Worker   if (!pFormField)
1731*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kBadObjectError);
1732*3ac0a46fSAndroid Build Coastguard Worker 
1733*3ac0a46fSAndroid Build Coastguard Worker   if (pFormField->GetFieldType() == FormFieldType::kPushButton)
1734*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kObjectTypeError);
1735*3ac0a46fSAndroid Build Coastguard Worker 
1736*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success(pRuntime->NewBoolean(
1737*3ac0a46fSAndroid Build Coastguard Worker       !!(pFormField->GetFieldFlags() & pdfium::form_flags::kRequired)));
1738*3ac0a46fSAndroid Build Coastguard Worker }
1739*3ac0a46fSAndroid Build Coastguard Worker 
set_required(CJS_Runtime * pRuntime,v8::Local<v8::Value> vp)1740*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Field::set_required(CJS_Runtime* pRuntime,
1741*3ac0a46fSAndroid Build Coastguard Worker                                    v8::Local<v8::Value> vp) {
1742*3ac0a46fSAndroid Build Coastguard Worker   std::vector<CPDF_FormField*> FieldArray = GetFormFields();
1743*3ac0a46fSAndroid Build Coastguard Worker   if (FieldArray.empty())
1744*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kBadObjectError);
1745*3ac0a46fSAndroid Build Coastguard Worker   if (!m_bCanSet)
1746*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kReadOnlyError);
1747*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success();
1748*3ac0a46fSAndroid Build Coastguard Worker }
1749*3ac0a46fSAndroid Build Coastguard Worker 
get_rich_text(CJS_Runtime * pRuntime)1750*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Field::get_rich_text(CJS_Runtime* pRuntime) {
1751*3ac0a46fSAndroid Build Coastguard Worker   DCHECK(m_pFormFillEnv);
1752*3ac0a46fSAndroid Build Coastguard Worker 
1753*3ac0a46fSAndroid Build Coastguard Worker   CPDF_FormField* pFormField = GetFirstFormField();
1754*3ac0a46fSAndroid Build Coastguard Worker   if (!pFormField)
1755*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kBadObjectError);
1756*3ac0a46fSAndroid Build Coastguard Worker 
1757*3ac0a46fSAndroid Build Coastguard Worker   if (pFormField->GetFieldType() != FormFieldType::kTextField)
1758*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kObjectTypeError);
1759*3ac0a46fSAndroid Build Coastguard Worker 
1760*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success(pRuntime->NewBoolean(
1761*3ac0a46fSAndroid Build Coastguard Worker       !!(pFormField->GetFieldFlags() & pdfium::form_flags::kTextRichText)));
1762*3ac0a46fSAndroid Build Coastguard Worker }
1763*3ac0a46fSAndroid Build Coastguard Worker 
set_rich_text(CJS_Runtime * pRuntime,v8::Local<v8::Value> vp)1764*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Field::set_rich_text(CJS_Runtime* pRuntime,
1765*3ac0a46fSAndroid Build Coastguard Worker                                     v8::Local<v8::Value> vp) {
1766*3ac0a46fSAndroid Build Coastguard Worker   DCHECK(m_pFormFillEnv);
1767*3ac0a46fSAndroid Build Coastguard Worker   if (!m_bCanSet)
1768*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kReadOnlyError);
1769*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success();
1770*3ac0a46fSAndroid Build Coastguard Worker }
1771*3ac0a46fSAndroid Build Coastguard Worker 
get_rich_value(CJS_Runtime * pRuntime)1772*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Field::get_rich_value(CJS_Runtime* pRuntime) {
1773*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success();
1774*3ac0a46fSAndroid Build Coastguard Worker }
1775*3ac0a46fSAndroid Build Coastguard Worker 
set_rich_value(CJS_Runtime * pRuntime,v8::Local<v8::Value> vp)1776*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Field::set_rich_value(CJS_Runtime* pRuntime,
1777*3ac0a46fSAndroid Build Coastguard Worker                                      v8::Local<v8::Value> vp) {
1778*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success();
1779*3ac0a46fSAndroid Build Coastguard Worker }
1780*3ac0a46fSAndroid Build Coastguard Worker 
get_rotation(CJS_Runtime * pRuntime)1781*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Field::get_rotation(CJS_Runtime* pRuntime) {
1782*3ac0a46fSAndroid Build Coastguard Worker   DCHECK(m_pFormFillEnv);
1783*3ac0a46fSAndroid Build Coastguard Worker 
1784*3ac0a46fSAndroid Build Coastguard Worker   CPDF_FormField* pFormField = GetFirstFormField();
1785*3ac0a46fSAndroid Build Coastguard Worker   if (!pFormField)
1786*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kBadObjectError);
1787*3ac0a46fSAndroid Build Coastguard Worker 
1788*3ac0a46fSAndroid Build Coastguard Worker   CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
1789*3ac0a46fSAndroid Build Coastguard Worker   if (!pFormControl)
1790*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kBadObjectError);
1791*3ac0a46fSAndroid Build Coastguard Worker 
1792*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success(pRuntime->NewNumber(pFormControl->GetRotation()));
1793*3ac0a46fSAndroid Build Coastguard Worker }
1794*3ac0a46fSAndroid Build Coastguard Worker 
set_rotation(CJS_Runtime * pRuntime,v8::Local<v8::Value> vp)1795*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Field::set_rotation(CJS_Runtime* pRuntime,
1796*3ac0a46fSAndroid Build Coastguard Worker                                    v8::Local<v8::Value> vp) {
1797*3ac0a46fSAndroid Build Coastguard Worker   DCHECK(m_pFormFillEnv);
1798*3ac0a46fSAndroid Build Coastguard Worker   if (!m_bCanSet)
1799*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kReadOnlyError);
1800*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success();
1801*3ac0a46fSAndroid Build Coastguard Worker }
1802*3ac0a46fSAndroid Build Coastguard Worker 
get_source(CJS_Runtime * pRuntime)1803*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Field::get_source(CJS_Runtime* pRuntime) {
1804*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success();
1805*3ac0a46fSAndroid Build Coastguard Worker }
1806*3ac0a46fSAndroid Build Coastguard Worker 
set_source(CJS_Runtime * pRuntime,v8::Local<v8::Value> vp)1807*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Field::set_source(CJS_Runtime* pRuntime,
1808*3ac0a46fSAndroid Build Coastguard Worker                                  v8::Local<v8::Value> vp) {
1809*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success();
1810*3ac0a46fSAndroid Build Coastguard Worker }
1811*3ac0a46fSAndroid Build Coastguard Worker 
get_stroke_color(CJS_Runtime * pRuntime)1812*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Field::get_stroke_color(CJS_Runtime* pRuntime) {
1813*3ac0a46fSAndroid Build Coastguard Worker   CPDF_FormField* pFormField = GetFirstFormField();
1814*3ac0a46fSAndroid Build Coastguard Worker   if (!pFormField)
1815*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kBadObjectError);
1816*3ac0a46fSAndroid Build Coastguard Worker 
1817*3ac0a46fSAndroid Build Coastguard Worker   CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
1818*3ac0a46fSAndroid Build Coastguard Worker   if (!pFormControl)
1819*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kBadObjectError);
1820*3ac0a46fSAndroid Build Coastguard Worker 
1821*3ac0a46fSAndroid Build Coastguard Worker   CFX_Color color = GetFormControlColor(pFormControl, pdfium::appearance::kBC);
1822*3ac0a46fSAndroid Build Coastguard Worker   v8::Local<v8::Value> array =
1823*3ac0a46fSAndroid Build Coastguard Worker       CJS_Color::ConvertPWLColorToArray(pRuntime, color);
1824*3ac0a46fSAndroid Build Coastguard Worker   if (array.IsEmpty())
1825*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Success(pRuntime->NewArray());
1826*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success(array);
1827*3ac0a46fSAndroid Build Coastguard Worker }
1828*3ac0a46fSAndroid Build Coastguard Worker 
set_stroke_color(CJS_Runtime * pRuntime,v8::Local<v8::Value> vp)1829*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Field::set_stroke_color(CJS_Runtime* pRuntime,
1830*3ac0a46fSAndroid Build Coastguard Worker                                        v8::Local<v8::Value> vp) {
1831*3ac0a46fSAndroid Build Coastguard Worker   if (!m_bCanSet)
1832*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kReadOnlyError);
1833*3ac0a46fSAndroid Build Coastguard Worker   if (!fxv8::IsArray(vp))
1834*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kBadObjectError);
1835*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success();
1836*3ac0a46fSAndroid Build Coastguard Worker }
1837*3ac0a46fSAndroid Build Coastguard Worker 
get_style(CJS_Runtime * pRuntime)1838*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Field::get_style(CJS_Runtime* pRuntime) {
1839*3ac0a46fSAndroid Build Coastguard Worker   DCHECK(m_pFormFillEnv);
1840*3ac0a46fSAndroid Build Coastguard Worker 
1841*3ac0a46fSAndroid Build Coastguard Worker   CPDF_FormField* pFormField = GetFirstFormField();
1842*3ac0a46fSAndroid Build Coastguard Worker   if (!pFormField)
1843*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kBadObjectError);
1844*3ac0a46fSAndroid Build Coastguard Worker 
1845*3ac0a46fSAndroid Build Coastguard Worker   if (!IsCheckBoxOrRadioButton(pFormField))
1846*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kObjectTypeError);
1847*3ac0a46fSAndroid Build Coastguard Worker 
1848*3ac0a46fSAndroid Build Coastguard Worker   CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
1849*3ac0a46fSAndroid Build Coastguard Worker   if (!pFormControl)
1850*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kBadObjectError);
1851*3ac0a46fSAndroid Build Coastguard Worker 
1852*3ac0a46fSAndroid Build Coastguard Worker   wchar_t selector = GetSelectorFromCaptionForFieldType(
1853*3ac0a46fSAndroid Build Coastguard Worker       pFormControl->GetNormalCaption(), pFormControl->GetType());
1854*3ac0a46fSAndroid Build Coastguard Worker 
1855*3ac0a46fSAndroid Build Coastguard Worker   ByteString csBCaption;
1856*3ac0a46fSAndroid Build Coastguard Worker   switch (selector) {
1857*3ac0a46fSAndroid Build Coastguard Worker     case kCircleSelector:
1858*3ac0a46fSAndroid Build Coastguard Worker       csBCaption = "circle";
1859*3ac0a46fSAndroid Build Coastguard Worker       break;
1860*3ac0a46fSAndroid Build Coastguard Worker     case kCrossSelector:
1861*3ac0a46fSAndroid Build Coastguard Worker       csBCaption = "cross";
1862*3ac0a46fSAndroid Build Coastguard Worker       break;
1863*3ac0a46fSAndroid Build Coastguard Worker     case kDiamondSelector:
1864*3ac0a46fSAndroid Build Coastguard Worker       csBCaption = "diamond";
1865*3ac0a46fSAndroid Build Coastguard Worker       break;
1866*3ac0a46fSAndroid Build Coastguard Worker     case kSquareSelector:
1867*3ac0a46fSAndroid Build Coastguard Worker       csBCaption = "square";
1868*3ac0a46fSAndroid Build Coastguard Worker       break;
1869*3ac0a46fSAndroid Build Coastguard Worker     case kStarSelector:
1870*3ac0a46fSAndroid Build Coastguard Worker       csBCaption = "star";
1871*3ac0a46fSAndroid Build Coastguard Worker       break;
1872*3ac0a46fSAndroid Build Coastguard Worker     case kCheckSelector:
1873*3ac0a46fSAndroid Build Coastguard Worker     default:
1874*3ac0a46fSAndroid Build Coastguard Worker       csBCaption = "check";
1875*3ac0a46fSAndroid Build Coastguard Worker       break;
1876*3ac0a46fSAndroid Build Coastguard Worker   }
1877*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success(pRuntime->NewString(csBCaption.AsStringView()));
1878*3ac0a46fSAndroid Build Coastguard Worker }
1879*3ac0a46fSAndroid Build Coastguard Worker 
set_style(CJS_Runtime * pRuntime,v8::Local<v8::Value> vp)1880*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Field::set_style(CJS_Runtime* pRuntime,
1881*3ac0a46fSAndroid Build Coastguard Worker                                 v8::Local<v8::Value> vp) {
1882*3ac0a46fSAndroid Build Coastguard Worker   DCHECK(m_pFormFillEnv);
1883*3ac0a46fSAndroid Build Coastguard Worker   if (!m_bCanSet)
1884*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kReadOnlyError);
1885*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success();
1886*3ac0a46fSAndroid Build Coastguard Worker }
1887*3ac0a46fSAndroid Build Coastguard Worker 
get_submit_name(CJS_Runtime * pRuntime)1888*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Field::get_submit_name(CJS_Runtime* pRuntime) {
1889*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success();
1890*3ac0a46fSAndroid Build Coastguard Worker }
1891*3ac0a46fSAndroid Build Coastguard Worker 
set_submit_name(CJS_Runtime * pRuntime,v8::Local<v8::Value> vp)1892*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Field::set_submit_name(CJS_Runtime* pRuntime,
1893*3ac0a46fSAndroid Build Coastguard Worker                                       v8::Local<v8::Value> vp) {
1894*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success();
1895*3ac0a46fSAndroid Build Coastguard Worker }
1896*3ac0a46fSAndroid Build Coastguard Worker 
get_text_color(CJS_Runtime * pRuntime)1897*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Field::get_text_color(CJS_Runtime* pRuntime) {
1898*3ac0a46fSAndroid Build Coastguard Worker   CPDF_FormField* pFormField = GetFirstFormField();
1899*3ac0a46fSAndroid Build Coastguard Worker   if (!pFormField)
1900*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kBadObjectError);
1901*3ac0a46fSAndroid Build Coastguard Worker 
1902*3ac0a46fSAndroid Build Coastguard Worker   CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
1903*3ac0a46fSAndroid Build Coastguard Worker   if (!pFormControl)
1904*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kBadObjectError);
1905*3ac0a46fSAndroid Build Coastguard Worker 
1906*3ac0a46fSAndroid Build Coastguard Worker   CPDF_DefaultAppearance FieldAppearance = pFormControl->GetDefaultAppearance();
1907*3ac0a46fSAndroid Build Coastguard Worker   absl::optional<CFX_Color::TypeAndARGB> maybe_type_argb_pair =
1908*3ac0a46fSAndroid Build Coastguard Worker       FieldAppearance.GetColorARGB();
1909*3ac0a46fSAndroid Build Coastguard Worker 
1910*3ac0a46fSAndroid Build Coastguard Worker   CFX_Color crRet;
1911*3ac0a46fSAndroid Build Coastguard Worker   if (maybe_type_argb_pair.has_value() &&
1912*3ac0a46fSAndroid Build Coastguard Worker       maybe_type_argb_pair.value().color_type !=
1913*3ac0a46fSAndroid Build Coastguard Worker           CFX_Color::Type::kTransparent) {
1914*3ac0a46fSAndroid Build Coastguard Worker     int32_t a;
1915*3ac0a46fSAndroid Build Coastguard Worker     int32_t r;
1916*3ac0a46fSAndroid Build Coastguard Worker     int32_t g;
1917*3ac0a46fSAndroid Build Coastguard Worker     int32_t b;
1918*3ac0a46fSAndroid Build Coastguard Worker     std::tie(a, r, g, b) = ArgbDecode(maybe_type_argb_pair.value().argb);
1919*3ac0a46fSAndroid Build Coastguard Worker     crRet =
1920*3ac0a46fSAndroid Build Coastguard Worker         CFX_Color(CFX_Color::Type::kRGB, r / 255.0f, g / 255.0f, b / 255.0f);
1921*3ac0a46fSAndroid Build Coastguard Worker   }
1922*3ac0a46fSAndroid Build Coastguard Worker 
1923*3ac0a46fSAndroid Build Coastguard Worker   v8::Local<v8::Value> array =
1924*3ac0a46fSAndroid Build Coastguard Worker       CJS_Color::ConvertPWLColorToArray(pRuntime, crRet);
1925*3ac0a46fSAndroid Build Coastguard Worker   if (array.IsEmpty())
1926*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Success(pRuntime->NewArray());
1927*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success(array);
1928*3ac0a46fSAndroid Build Coastguard Worker }
1929*3ac0a46fSAndroid Build Coastguard Worker 
set_text_color(CJS_Runtime * pRuntime,v8::Local<v8::Value> vp)1930*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Field::set_text_color(CJS_Runtime* pRuntime,
1931*3ac0a46fSAndroid Build Coastguard Worker                                      v8::Local<v8::Value> vp) {
1932*3ac0a46fSAndroid Build Coastguard Worker   if (!m_bCanSet)
1933*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kReadOnlyError);
1934*3ac0a46fSAndroid Build Coastguard Worker   if (!fxv8::IsArray(vp))
1935*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kBadObjectError);
1936*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success();
1937*3ac0a46fSAndroid Build Coastguard Worker }
1938*3ac0a46fSAndroid Build Coastguard Worker 
get_text_font(CJS_Runtime * pRuntime)1939*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Field::get_text_font(CJS_Runtime* pRuntime) {
1940*3ac0a46fSAndroid Build Coastguard Worker   DCHECK(m_pFormFillEnv);
1941*3ac0a46fSAndroid Build Coastguard Worker 
1942*3ac0a46fSAndroid Build Coastguard Worker   CPDF_FormField* pFormField = GetFirstFormField();
1943*3ac0a46fSAndroid Build Coastguard Worker   if (!pFormField)
1944*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kBadObjectError);
1945*3ac0a46fSAndroid Build Coastguard Worker 
1946*3ac0a46fSAndroid Build Coastguard Worker   CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
1947*3ac0a46fSAndroid Build Coastguard Worker   if (!pFormControl)
1948*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kBadObjectError);
1949*3ac0a46fSAndroid Build Coastguard Worker 
1950*3ac0a46fSAndroid Build Coastguard Worker   FormFieldType fieldType = pFormField->GetFieldType();
1951*3ac0a46fSAndroid Build Coastguard Worker   if (fieldType != FormFieldType::kPushButton &&
1952*3ac0a46fSAndroid Build Coastguard Worker       fieldType != FormFieldType::kComboBox &&
1953*3ac0a46fSAndroid Build Coastguard Worker       fieldType != FormFieldType::kListBox &&
1954*3ac0a46fSAndroid Build Coastguard Worker       fieldType != FormFieldType::kTextField) {
1955*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kObjectTypeError);
1956*3ac0a46fSAndroid Build Coastguard Worker   }
1957*3ac0a46fSAndroid Build Coastguard Worker 
1958*3ac0a46fSAndroid Build Coastguard Worker   absl::optional<WideString> wsFontName =
1959*3ac0a46fSAndroid Build Coastguard Worker       pFormControl->GetDefaultControlFontName();
1960*3ac0a46fSAndroid Build Coastguard Worker   if (!wsFontName.has_value())
1961*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kBadObjectError);
1962*3ac0a46fSAndroid Build Coastguard Worker 
1963*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success(
1964*3ac0a46fSAndroid Build Coastguard Worker       pRuntime->NewString(wsFontName.value().AsStringView()));
1965*3ac0a46fSAndroid Build Coastguard Worker }
1966*3ac0a46fSAndroid Build Coastguard Worker 
set_text_font(CJS_Runtime * pRuntime,v8::Local<v8::Value> vp)1967*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Field::set_text_font(CJS_Runtime* pRuntime,
1968*3ac0a46fSAndroid Build Coastguard Worker                                     v8::Local<v8::Value> vp) {
1969*3ac0a46fSAndroid Build Coastguard Worker   DCHECK(m_pFormFillEnv);
1970*3ac0a46fSAndroid Build Coastguard Worker 
1971*3ac0a46fSAndroid Build Coastguard Worker   if (!m_bCanSet)
1972*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kReadOnlyError);
1973*3ac0a46fSAndroid Build Coastguard Worker   if (pRuntime->ToByteString(vp).IsEmpty())
1974*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kValueError);
1975*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success();
1976*3ac0a46fSAndroid Build Coastguard Worker }
1977*3ac0a46fSAndroid Build Coastguard Worker 
get_text_size(CJS_Runtime * pRuntime)1978*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Field::get_text_size(CJS_Runtime* pRuntime) {
1979*3ac0a46fSAndroid Build Coastguard Worker   DCHECK(m_pFormFillEnv);
1980*3ac0a46fSAndroid Build Coastguard Worker 
1981*3ac0a46fSAndroid Build Coastguard Worker   CPDF_FormField* pFormField = GetFirstFormField();
1982*3ac0a46fSAndroid Build Coastguard Worker   if (!pFormField)
1983*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kBadObjectError);
1984*3ac0a46fSAndroid Build Coastguard Worker 
1985*3ac0a46fSAndroid Build Coastguard Worker   CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
1986*3ac0a46fSAndroid Build Coastguard Worker   if (!pFormControl)
1987*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kBadObjectError);
1988*3ac0a46fSAndroid Build Coastguard Worker 
1989*3ac0a46fSAndroid Build Coastguard Worker   float fFontSize;
1990*3ac0a46fSAndroid Build Coastguard Worker   CPDF_DefaultAppearance FieldAppearance = pFormControl->GetDefaultAppearance();
1991*3ac0a46fSAndroid Build Coastguard Worker   FieldAppearance.GetFont(&fFontSize);
1992*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success(pRuntime->NewNumber(static_cast<int>(fFontSize)));
1993*3ac0a46fSAndroid Build Coastguard Worker }
1994*3ac0a46fSAndroid Build Coastguard Worker 
set_text_size(CJS_Runtime * pRuntime,v8::Local<v8::Value> vp)1995*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Field::set_text_size(CJS_Runtime* pRuntime,
1996*3ac0a46fSAndroid Build Coastguard Worker                                     v8::Local<v8::Value> vp) {
1997*3ac0a46fSAndroid Build Coastguard Worker   DCHECK(m_pFormFillEnv);
1998*3ac0a46fSAndroid Build Coastguard Worker   if (!m_bCanSet)
1999*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kReadOnlyError);
2000*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success();
2001*3ac0a46fSAndroid Build Coastguard Worker }
2002*3ac0a46fSAndroid Build Coastguard Worker 
get_type(CJS_Runtime * pRuntime)2003*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Field::get_type(CJS_Runtime* pRuntime) {
2004*3ac0a46fSAndroid Build Coastguard Worker   CPDF_FormField* pFormField = GetFirstFormField();
2005*3ac0a46fSAndroid Build Coastguard Worker   if (!pFormField)
2006*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kBadObjectError);
2007*3ac0a46fSAndroid Build Coastguard Worker 
2008*3ac0a46fSAndroid Build Coastguard Worker   switch (pFormField->GetFieldType()) {
2009*3ac0a46fSAndroid Build Coastguard Worker     case FormFieldType::kUnknown:
2010*3ac0a46fSAndroid Build Coastguard Worker       return CJS_Result::Success(pRuntime->NewString("unknown"));
2011*3ac0a46fSAndroid Build Coastguard Worker     case FormFieldType::kPushButton:
2012*3ac0a46fSAndroid Build Coastguard Worker       return CJS_Result::Success(pRuntime->NewString("button"));
2013*3ac0a46fSAndroid Build Coastguard Worker     case FormFieldType::kCheckBox:
2014*3ac0a46fSAndroid Build Coastguard Worker       return CJS_Result::Success(pRuntime->NewString("checkbox"));
2015*3ac0a46fSAndroid Build Coastguard Worker     case FormFieldType::kRadioButton:
2016*3ac0a46fSAndroid Build Coastguard Worker       return CJS_Result::Success(pRuntime->NewString("radiobutton"));
2017*3ac0a46fSAndroid Build Coastguard Worker     case FormFieldType::kComboBox:
2018*3ac0a46fSAndroid Build Coastguard Worker       return CJS_Result::Success(pRuntime->NewString("combobox"));
2019*3ac0a46fSAndroid Build Coastguard Worker     case FormFieldType::kListBox:
2020*3ac0a46fSAndroid Build Coastguard Worker       return CJS_Result::Success(pRuntime->NewString("listbox"));
2021*3ac0a46fSAndroid Build Coastguard Worker     case FormFieldType::kTextField:
2022*3ac0a46fSAndroid Build Coastguard Worker       return CJS_Result::Success(pRuntime->NewString("text"));
2023*3ac0a46fSAndroid Build Coastguard Worker     case FormFieldType::kSignature:
2024*3ac0a46fSAndroid Build Coastguard Worker       return CJS_Result::Success(pRuntime->NewString("signature"));
2025*3ac0a46fSAndroid Build Coastguard Worker #ifdef PDF_ENABLE_XFA
2026*3ac0a46fSAndroid Build Coastguard Worker     default:
2027*3ac0a46fSAndroid Build Coastguard Worker       return CJS_Result::Success(pRuntime->NewString("unknown"));
2028*3ac0a46fSAndroid Build Coastguard Worker #endif
2029*3ac0a46fSAndroid Build Coastguard Worker   }
2030*3ac0a46fSAndroid Build Coastguard Worker }
2031*3ac0a46fSAndroid Build Coastguard Worker 
set_type(CJS_Runtime * pRuntime,v8::Local<v8::Value> vp)2032*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Field::set_type(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp) {
2033*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Failure(JSMessage::kNotSupportedError);
2034*3ac0a46fSAndroid Build Coastguard Worker }
2035*3ac0a46fSAndroid Build Coastguard Worker 
get_user_name(CJS_Runtime * pRuntime)2036*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Field::get_user_name(CJS_Runtime* pRuntime) {
2037*3ac0a46fSAndroid Build Coastguard Worker   DCHECK(m_pFormFillEnv);
2038*3ac0a46fSAndroid Build Coastguard Worker 
2039*3ac0a46fSAndroid Build Coastguard Worker   CPDF_FormField* pFormField = GetFirstFormField();
2040*3ac0a46fSAndroid Build Coastguard Worker   if (!pFormField)
2041*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kBadObjectError);
2042*3ac0a46fSAndroid Build Coastguard Worker 
2043*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success(
2044*3ac0a46fSAndroid Build Coastguard Worker       pRuntime->NewString(pFormField->GetAlternateName().AsStringView()));
2045*3ac0a46fSAndroid Build Coastguard Worker }
2046*3ac0a46fSAndroid Build Coastguard Worker 
set_user_name(CJS_Runtime * pRuntime,v8::Local<v8::Value> vp)2047*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Field::set_user_name(CJS_Runtime* pRuntime,
2048*3ac0a46fSAndroid Build Coastguard Worker                                     v8::Local<v8::Value> vp) {
2049*3ac0a46fSAndroid Build Coastguard Worker   DCHECK(m_pFormFillEnv);
2050*3ac0a46fSAndroid Build Coastguard Worker   if (!m_bCanSet)
2051*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kReadOnlyError);
2052*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success();
2053*3ac0a46fSAndroid Build Coastguard Worker }
2054*3ac0a46fSAndroid Build Coastguard Worker 
get_value(CJS_Runtime * pRuntime)2055*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Field::get_value(CJS_Runtime* pRuntime) {
2056*3ac0a46fSAndroid Build Coastguard Worker   CPDF_FormField* pFormField = GetFirstFormField();
2057*3ac0a46fSAndroid Build Coastguard Worker   if (!pFormField)
2058*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kBadObjectError);
2059*3ac0a46fSAndroid Build Coastguard Worker 
2060*3ac0a46fSAndroid Build Coastguard Worker   v8::Local<v8::Value> ret;
2061*3ac0a46fSAndroid Build Coastguard Worker   switch (pFormField->GetFieldType()) {
2062*3ac0a46fSAndroid Build Coastguard Worker     case FormFieldType::kPushButton:
2063*3ac0a46fSAndroid Build Coastguard Worker       return CJS_Result::Failure(JSMessage::kObjectTypeError);
2064*3ac0a46fSAndroid Build Coastguard Worker     case FormFieldType::kComboBox:
2065*3ac0a46fSAndroid Build Coastguard Worker     case FormFieldType::kTextField:
2066*3ac0a46fSAndroid Build Coastguard Worker       ret = pRuntime->NewString(pFormField->GetValue().AsStringView());
2067*3ac0a46fSAndroid Build Coastguard Worker       break;
2068*3ac0a46fSAndroid Build Coastguard Worker     case FormFieldType::kListBox: {
2069*3ac0a46fSAndroid Build Coastguard Worker       if (pFormField->CountSelectedItems() > 1) {
2070*3ac0a46fSAndroid Build Coastguard Worker         v8::Local<v8::Array> ValueArray = pRuntime->NewArray();
2071*3ac0a46fSAndroid Build Coastguard Worker         v8::Local<v8::Value> ElementValue;
2072*3ac0a46fSAndroid Build Coastguard Worker         int iIndex;
2073*3ac0a46fSAndroid Build Coastguard Worker         for (int i = 0, sz = pFormField->CountSelectedItems(); i < sz; i++) {
2074*3ac0a46fSAndroid Build Coastguard Worker           iIndex = pFormField->GetSelectedIndex(i);
2075*3ac0a46fSAndroid Build Coastguard Worker           ElementValue = pRuntime->NewString(
2076*3ac0a46fSAndroid Build Coastguard Worker               pFormField->GetOptionValue(iIndex).AsStringView());
2077*3ac0a46fSAndroid Build Coastguard Worker           if (pRuntime->ToWideString(ElementValue).IsEmpty()) {
2078*3ac0a46fSAndroid Build Coastguard Worker             ElementValue = pRuntime->NewString(
2079*3ac0a46fSAndroid Build Coastguard Worker                 pFormField->GetOptionLabel(iIndex).AsStringView());
2080*3ac0a46fSAndroid Build Coastguard Worker           }
2081*3ac0a46fSAndroid Build Coastguard Worker           pRuntime->PutArrayElement(ValueArray, i, ElementValue);
2082*3ac0a46fSAndroid Build Coastguard Worker         }
2083*3ac0a46fSAndroid Build Coastguard Worker         ret = ValueArray;
2084*3ac0a46fSAndroid Build Coastguard Worker       } else {
2085*3ac0a46fSAndroid Build Coastguard Worker         ret = pRuntime->NewString(pFormField->GetValue().AsStringView());
2086*3ac0a46fSAndroid Build Coastguard Worker       }
2087*3ac0a46fSAndroid Build Coastguard Worker       break;
2088*3ac0a46fSAndroid Build Coastguard Worker     }
2089*3ac0a46fSAndroid Build Coastguard Worker     case FormFieldType::kCheckBox:
2090*3ac0a46fSAndroid Build Coastguard Worker     case FormFieldType::kRadioButton: {
2091*3ac0a46fSAndroid Build Coastguard Worker       bool bFind = false;
2092*3ac0a46fSAndroid Build Coastguard Worker       for (int i = 0, sz = pFormField->CountControls(); i < sz; i++) {
2093*3ac0a46fSAndroid Build Coastguard Worker         if (pFormField->GetControl(i)->IsChecked()) {
2094*3ac0a46fSAndroid Build Coastguard Worker           ret = pRuntime->NewString(
2095*3ac0a46fSAndroid Build Coastguard Worker               pFormField->GetControl(i)->GetExportValue().AsStringView());
2096*3ac0a46fSAndroid Build Coastguard Worker           bFind = true;
2097*3ac0a46fSAndroid Build Coastguard Worker           break;
2098*3ac0a46fSAndroid Build Coastguard Worker         }
2099*3ac0a46fSAndroid Build Coastguard Worker       }
2100*3ac0a46fSAndroid Build Coastguard Worker       if (!bFind)
2101*3ac0a46fSAndroid Build Coastguard Worker         ret = pRuntime->NewString("Off");
2102*3ac0a46fSAndroid Build Coastguard Worker 
2103*3ac0a46fSAndroid Build Coastguard Worker       break;
2104*3ac0a46fSAndroid Build Coastguard Worker     }
2105*3ac0a46fSAndroid Build Coastguard Worker     default:
2106*3ac0a46fSAndroid Build Coastguard Worker       ret = pRuntime->NewString(pFormField->GetValue().AsStringView());
2107*3ac0a46fSAndroid Build Coastguard Worker       break;
2108*3ac0a46fSAndroid Build Coastguard Worker   }
2109*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success(pRuntime->MaybeCoerceToNumber(ret));
2110*3ac0a46fSAndroid Build Coastguard Worker }
2111*3ac0a46fSAndroid Build Coastguard Worker 
set_value(CJS_Runtime * pRuntime,v8::Local<v8::Value> vp)2112*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Field::set_value(CJS_Runtime* pRuntime,
2113*3ac0a46fSAndroid Build Coastguard Worker                                 v8::Local<v8::Value> vp) {
2114*3ac0a46fSAndroid Build Coastguard Worker   if (!m_bCanSet)
2115*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kReadOnlyError);
2116*3ac0a46fSAndroid Build Coastguard Worker 
2117*3ac0a46fSAndroid Build Coastguard Worker   std::vector<WideString> strArray;
2118*3ac0a46fSAndroid Build Coastguard Worker   if (fxv8::IsArray(vp)) {
2119*3ac0a46fSAndroid Build Coastguard Worker     v8::Local<v8::Array> ValueArray = pRuntime->ToArray(vp);
2120*3ac0a46fSAndroid Build Coastguard Worker     for (size_t i = 0; i < pRuntime->GetArrayLength(ValueArray); i++) {
2121*3ac0a46fSAndroid Build Coastguard Worker       strArray.push_back(
2122*3ac0a46fSAndroid Build Coastguard Worker           pRuntime->ToWideString(pRuntime->GetArrayElement(ValueArray, i)));
2123*3ac0a46fSAndroid Build Coastguard Worker     }
2124*3ac0a46fSAndroid Build Coastguard Worker   } else {
2125*3ac0a46fSAndroid Build Coastguard Worker     strArray.push_back(pRuntime->ToWideString(vp));
2126*3ac0a46fSAndroid Build Coastguard Worker   }
2127*3ac0a46fSAndroid Build Coastguard Worker 
2128*3ac0a46fSAndroid Build Coastguard Worker   if (m_bDelay) {
2129*3ac0a46fSAndroid Build Coastguard Worker     AddDelay_WideStringArray(FP_VALUE, strArray);
2130*3ac0a46fSAndroid Build Coastguard Worker   } else {
2131*3ac0a46fSAndroid Build Coastguard Worker     SetFieldValue(m_pFormFillEnv.Get(), m_FieldName, m_nFormControlIndex,
2132*3ac0a46fSAndroid Build Coastguard Worker                   strArray);
2133*3ac0a46fSAndroid Build Coastguard Worker   }
2134*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success();
2135*3ac0a46fSAndroid Build Coastguard Worker }
2136*3ac0a46fSAndroid Build Coastguard Worker 
get_value_as_string(CJS_Runtime * pRuntime)2137*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Field::get_value_as_string(CJS_Runtime* pRuntime) {
2138*3ac0a46fSAndroid Build Coastguard Worker   CPDF_FormField* pFormField = GetFirstFormField();
2139*3ac0a46fSAndroid Build Coastguard Worker   if (!pFormField)
2140*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kBadObjectError);
2141*3ac0a46fSAndroid Build Coastguard Worker 
2142*3ac0a46fSAndroid Build Coastguard Worker   if (pFormField->GetFieldType() == FormFieldType::kPushButton)
2143*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kObjectTypeError);
2144*3ac0a46fSAndroid Build Coastguard Worker 
2145*3ac0a46fSAndroid Build Coastguard Worker   if (pFormField->GetFieldType() == FormFieldType::kCheckBox) {
2146*3ac0a46fSAndroid Build Coastguard Worker     if (!pFormField->CountControls())
2147*3ac0a46fSAndroid Build Coastguard Worker       return CJS_Result::Failure(JSMessage::kBadObjectError);
2148*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Success(pRuntime->NewString(
2149*3ac0a46fSAndroid Build Coastguard Worker         pFormField->GetControl(0)->IsChecked() ? L"Yes" : L"Off"));
2150*3ac0a46fSAndroid Build Coastguard Worker   }
2151*3ac0a46fSAndroid Build Coastguard Worker 
2152*3ac0a46fSAndroid Build Coastguard Worker   if (pFormField->GetFieldType() == FormFieldType::kRadioButton &&
2153*3ac0a46fSAndroid Build Coastguard Worker       !(pFormField->GetFieldFlags() &
2154*3ac0a46fSAndroid Build Coastguard Worker         pdfium::form_flags::kButtonRadiosInUnison)) {
2155*3ac0a46fSAndroid Build Coastguard Worker     for (int i = 0, sz = pFormField->CountControls(); i < sz; i++) {
2156*3ac0a46fSAndroid Build Coastguard Worker       if (pFormField->GetControl(i)->IsChecked()) {
2157*3ac0a46fSAndroid Build Coastguard Worker         return CJS_Result::Success(pRuntime->NewString(
2158*3ac0a46fSAndroid Build Coastguard Worker             pFormField->GetControl(i)->GetExportValue().AsStringView()));
2159*3ac0a46fSAndroid Build Coastguard Worker       }
2160*3ac0a46fSAndroid Build Coastguard Worker     }
2161*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Success(pRuntime->NewString("Off"));
2162*3ac0a46fSAndroid Build Coastguard Worker   }
2163*3ac0a46fSAndroid Build Coastguard Worker 
2164*3ac0a46fSAndroid Build Coastguard Worker   if (pFormField->GetFieldType() == FormFieldType::kListBox &&
2165*3ac0a46fSAndroid Build Coastguard Worker       (pFormField->CountSelectedItems() > 1)) {
2166*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Success(pRuntime->NewString(""));
2167*3ac0a46fSAndroid Build Coastguard Worker   }
2168*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success(
2169*3ac0a46fSAndroid Build Coastguard Worker       pRuntime->NewString(pFormField->GetValue().AsStringView()));
2170*3ac0a46fSAndroid Build Coastguard Worker }
2171*3ac0a46fSAndroid Build Coastguard Worker 
set_value_as_string(CJS_Runtime * pRuntime,v8::Local<v8::Value> vp)2172*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Field::set_value_as_string(CJS_Runtime* pRuntime,
2173*3ac0a46fSAndroid Build Coastguard Worker                                           v8::Local<v8::Value> vp) {
2174*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Failure(JSMessage::kNotSupportedError);
2175*3ac0a46fSAndroid Build Coastguard Worker }
2176*3ac0a46fSAndroid Build Coastguard Worker 
browseForFileToSubmit(CJS_Runtime * pRuntime,const std::vector<v8::Local<v8::Value>> & params)2177*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Field::browseForFileToSubmit(
2178*3ac0a46fSAndroid Build Coastguard Worker     CJS_Runtime* pRuntime,
2179*3ac0a46fSAndroid Build Coastguard Worker     const std::vector<v8::Local<v8::Value>>& params) {
2180*3ac0a46fSAndroid Build Coastguard Worker   CPDF_FormField* pFormField = GetFirstFormField();
2181*3ac0a46fSAndroid Build Coastguard Worker   if (!pFormField)
2182*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kBadObjectError);
2183*3ac0a46fSAndroid Build Coastguard Worker 
2184*3ac0a46fSAndroid Build Coastguard Worker   if ((pFormField->GetFieldFlags() & pdfium::form_flags::kTextFileSelect) &&
2185*3ac0a46fSAndroid Build Coastguard Worker       (pFormField->GetFieldType() == FormFieldType::kTextField)) {
2186*3ac0a46fSAndroid Build Coastguard Worker     WideString wsFileName = m_pFormFillEnv->JS_fieldBrowse();
2187*3ac0a46fSAndroid Build Coastguard Worker     if (!wsFileName.IsEmpty()) {
2188*3ac0a46fSAndroid Build Coastguard Worker       pFormField->SetValue(wsFileName, NotificationOption::kDoNotNotify);
2189*3ac0a46fSAndroid Build Coastguard Worker       UpdateFormField(m_pFormFillEnv.Get(), pFormField, true);
2190*3ac0a46fSAndroid Build Coastguard Worker     }
2191*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Success();
2192*3ac0a46fSAndroid Build Coastguard Worker   }
2193*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Failure(JSMessage::kObjectTypeError);
2194*3ac0a46fSAndroid Build Coastguard Worker }
2195*3ac0a46fSAndroid Build Coastguard Worker 
buttonGetCaption(CJS_Runtime * pRuntime,const std::vector<v8::Local<v8::Value>> & params)2196*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Field::buttonGetCaption(
2197*3ac0a46fSAndroid Build Coastguard Worker     CJS_Runtime* pRuntime,
2198*3ac0a46fSAndroid Build Coastguard Worker     const std::vector<v8::Local<v8::Value>>& params) {
2199*3ac0a46fSAndroid Build Coastguard Worker   int nface = 0;
2200*3ac0a46fSAndroid Build Coastguard Worker   if (params.size() >= 1)
2201*3ac0a46fSAndroid Build Coastguard Worker     nface = pRuntime->ToInt32(params[0]);
2202*3ac0a46fSAndroid Build Coastguard Worker 
2203*3ac0a46fSAndroid Build Coastguard Worker   CPDF_FormField* pFormField = GetFirstFormField();
2204*3ac0a46fSAndroid Build Coastguard Worker   if (!pFormField)
2205*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kBadObjectError);
2206*3ac0a46fSAndroid Build Coastguard Worker 
2207*3ac0a46fSAndroid Build Coastguard Worker   if (pFormField->GetFieldType() != FormFieldType::kPushButton)
2208*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kObjectTypeError);
2209*3ac0a46fSAndroid Build Coastguard Worker 
2210*3ac0a46fSAndroid Build Coastguard Worker   CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
2211*3ac0a46fSAndroid Build Coastguard Worker   if (!pFormControl)
2212*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kBadObjectError);
2213*3ac0a46fSAndroid Build Coastguard Worker 
2214*3ac0a46fSAndroid Build Coastguard Worker   if (nface == 0) {
2215*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Success(
2216*3ac0a46fSAndroid Build Coastguard Worker         pRuntime->NewString(pFormControl->GetNormalCaption().AsStringView()));
2217*3ac0a46fSAndroid Build Coastguard Worker   }
2218*3ac0a46fSAndroid Build Coastguard Worker   if (nface == 1) {
2219*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Success(
2220*3ac0a46fSAndroid Build Coastguard Worker         pRuntime->NewString(pFormControl->GetDownCaption().AsStringView()));
2221*3ac0a46fSAndroid Build Coastguard Worker   }
2222*3ac0a46fSAndroid Build Coastguard Worker   if (nface == 2) {
2223*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Success(
2224*3ac0a46fSAndroid Build Coastguard Worker         pRuntime->NewString(pFormControl->GetRolloverCaption().AsStringView()));
2225*3ac0a46fSAndroid Build Coastguard Worker   }
2226*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Failure(JSMessage::kValueError);
2227*3ac0a46fSAndroid Build Coastguard Worker }
2228*3ac0a46fSAndroid Build Coastguard Worker 
buttonGetIcon(CJS_Runtime * pRuntime,const std::vector<v8::Local<v8::Value>> & params)2229*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Field::buttonGetIcon(
2230*3ac0a46fSAndroid Build Coastguard Worker     CJS_Runtime* pRuntime,
2231*3ac0a46fSAndroid Build Coastguard Worker     const std::vector<v8::Local<v8::Value>>& params) {
2232*3ac0a46fSAndroid Build Coastguard Worker   if (params.size() >= 1) {
2233*3ac0a46fSAndroid Build Coastguard Worker     int nFace = pRuntime->ToInt32(params[0]);
2234*3ac0a46fSAndroid Build Coastguard Worker     if (nFace < 0 || nFace > 2)
2235*3ac0a46fSAndroid Build Coastguard Worker       return CJS_Result::Failure(JSMessage::kValueError);
2236*3ac0a46fSAndroid Build Coastguard Worker   }
2237*3ac0a46fSAndroid Build Coastguard Worker 
2238*3ac0a46fSAndroid Build Coastguard Worker   CPDF_FormField* pFormField = GetFirstFormField();
2239*3ac0a46fSAndroid Build Coastguard Worker   if (!pFormField)
2240*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kBadObjectError);
2241*3ac0a46fSAndroid Build Coastguard Worker 
2242*3ac0a46fSAndroid Build Coastguard Worker   if (pFormField->GetFieldType() != FormFieldType::kPushButton)
2243*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kObjectTypeError);
2244*3ac0a46fSAndroid Build Coastguard Worker 
2245*3ac0a46fSAndroid Build Coastguard Worker   CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
2246*3ac0a46fSAndroid Build Coastguard Worker   if (!pFormControl)
2247*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kBadObjectError);
2248*3ac0a46fSAndroid Build Coastguard Worker 
2249*3ac0a46fSAndroid Build Coastguard Worker   v8::Local<v8::Object> pObj = pRuntime->NewFXJSBoundObject(
2250*3ac0a46fSAndroid Build Coastguard Worker       CJS_Icon::GetObjDefnID(), FXJSOBJTYPE_DYNAMIC);
2251*3ac0a46fSAndroid Build Coastguard Worker   if (pObj.IsEmpty())
2252*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kBadObjectError);
2253*3ac0a46fSAndroid Build Coastguard Worker 
2254*3ac0a46fSAndroid Build Coastguard Worker   auto* pJS_Icon = static_cast<CJS_Icon*>(
2255*3ac0a46fSAndroid Build Coastguard Worker       CFXJS_Engine::GetObjectPrivate(pRuntime->GetIsolate(), pObj));
2256*3ac0a46fSAndroid Build Coastguard Worker   return pJS_Icon ? CJS_Result::Success(pJS_Icon->ToV8Object())
2257*3ac0a46fSAndroid Build Coastguard Worker                   : CJS_Result::Failure(JSMessage::kBadObjectError);
2258*3ac0a46fSAndroid Build Coastguard Worker }
2259*3ac0a46fSAndroid Build Coastguard Worker 
buttonImportIcon(CJS_Runtime * pRuntime,const std::vector<v8::Local<v8::Value>> & params)2260*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Field::buttonImportIcon(
2261*3ac0a46fSAndroid Build Coastguard Worker     CJS_Runtime* pRuntime,
2262*3ac0a46fSAndroid Build Coastguard Worker     const std::vector<v8::Local<v8::Value>>& params) {
2263*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success();
2264*3ac0a46fSAndroid Build Coastguard Worker }
2265*3ac0a46fSAndroid Build Coastguard Worker 
buttonSetCaption(CJS_Runtime * pRuntime,const std::vector<v8::Local<v8::Value>> & params)2266*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Field::buttonSetCaption(
2267*3ac0a46fSAndroid Build Coastguard Worker     CJS_Runtime* pRuntime,
2268*3ac0a46fSAndroid Build Coastguard Worker     const std::vector<v8::Local<v8::Value>>& params) {
2269*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Failure(JSMessage::kNotSupportedError);
2270*3ac0a46fSAndroid Build Coastguard Worker }
2271*3ac0a46fSAndroid Build Coastguard Worker 
buttonSetIcon(CJS_Runtime * pRuntime,const std::vector<v8::Local<v8::Value>> & params)2272*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Field::buttonSetIcon(
2273*3ac0a46fSAndroid Build Coastguard Worker     CJS_Runtime* pRuntime,
2274*3ac0a46fSAndroid Build Coastguard Worker     const std::vector<v8::Local<v8::Value>>& params) {
2275*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Failure(JSMessage::kNotSupportedError);
2276*3ac0a46fSAndroid Build Coastguard Worker }
2277*3ac0a46fSAndroid Build Coastguard Worker 
checkThisBox(CJS_Runtime * pRuntime,const std::vector<v8::Local<v8::Value>> & params)2278*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Field::checkThisBox(
2279*3ac0a46fSAndroid Build Coastguard Worker     CJS_Runtime* pRuntime,
2280*3ac0a46fSAndroid Build Coastguard Worker     const std::vector<v8::Local<v8::Value>>& params) {
2281*3ac0a46fSAndroid Build Coastguard Worker   const size_t nSize = params.size();
2282*3ac0a46fSAndroid Build Coastguard Worker   if (nSize == 0)
2283*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kParamError);
2284*3ac0a46fSAndroid Build Coastguard Worker 
2285*3ac0a46fSAndroid Build Coastguard Worker   if (!m_bCanSet)
2286*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kReadOnlyError);
2287*3ac0a46fSAndroid Build Coastguard Worker 
2288*3ac0a46fSAndroid Build Coastguard Worker   int nWidget = pRuntime->ToInt32(params[0]);
2289*3ac0a46fSAndroid Build Coastguard Worker   bool bCheckit = true;
2290*3ac0a46fSAndroid Build Coastguard Worker   if (nSize >= 2)
2291*3ac0a46fSAndroid Build Coastguard Worker     bCheckit = pRuntime->ToBoolean(params[1]);
2292*3ac0a46fSAndroid Build Coastguard Worker 
2293*3ac0a46fSAndroid Build Coastguard Worker   CPDF_FormField* pFormField = GetFirstFormField();
2294*3ac0a46fSAndroid Build Coastguard Worker   if (!pFormField)
2295*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kBadObjectError);
2296*3ac0a46fSAndroid Build Coastguard Worker 
2297*3ac0a46fSAndroid Build Coastguard Worker   if (!IsCheckBoxOrRadioButton(pFormField))
2298*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kObjectTypeError);
2299*3ac0a46fSAndroid Build Coastguard Worker 
2300*3ac0a46fSAndroid Build Coastguard Worker   if (nWidget < 0 || nWidget >= pFormField->CountControls())
2301*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kValueError);
2302*3ac0a46fSAndroid Build Coastguard Worker 
2303*3ac0a46fSAndroid Build Coastguard Worker   // TODO(weili): Check whether anything special needed for radio button.
2304*3ac0a46fSAndroid Build Coastguard Worker   // (When pFormField->GetFieldType() == FormFieldType::kRadioButton.)
2305*3ac0a46fSAndroid Build Coastguard Worker   pFormField->CheckControl(nWidget, bCheckit, NotificationOption::kNotify);
2306*3ac0a46fSAndroid Build Coastguard Worker   UpdateFormField(m_pFormFillEnv.Get(), pFormField, true);
2307*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success();
2308*3ac0a46fSAndroid Build Coastguard Worker }
2309*3ac0a46fSAndroid Build Coastguard Worker 
clearItems(CJS_Runtime * pRuntime,const std::vector<v8::Local<v8::Value>> & params)2310*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Field::clearItems(
2311*3ac0a46fSAndroid Build Coastguard Worker     CJS_Runtime* pRuntime,
2312*3ac0a46fSAndroid Build Coastguard Worker     const std::vector<v8::Local<v8::Value>>& params) {
2313*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success();
2314*3ac0a46fSAndroid Build Coastguard Worker }
2315*3ac0a46fSAndroid Build Coastguard Worker 
defaultIsChecked(CJS_Runtime * pRuntime,const std::vector<v8::Local<v8::Value>> & params)2316*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Field::defaultIsChecked(
2317*3ac0a46fSAndroid Build Coastguard Worker     CJS_Runtime* pRuntime,
2318*3ac0a46fSAndroid Build Coastguard Worker     const std::vector<v8::Local<v8::Value>>& params) {
2319*3ac0a46fSAndroid Build Coastguard Worker   if (!m_bCanSet)
2320*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kReadOnlyError);
2321*3ac0a46fSAndroid Build Coastguard Worker 
2322*3ac0a46fSAndroid Build Coastguard Worker   if (params.empty())
2323*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kParamError);
2324*3ac0a46fSAndroid Build Coastguard Worker 
2325*3ac0a46fSAndroid Build Coastguard Worker   CPDF_FormField* pFormField = GetFirstFormField();
2326*3ac0a46fSAndroid Build Coastguard Worker   if (!pFormField)
2327*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kBadObjectError);
2328*3ac0a46fSAndroid Build Coastguard Worker 
2329*3ac0a46fSAndroid Build Coastguard Worker   int nWidget = pRuntime->ToInt32(params[0]);
2330*3ac0a46fSAndroid Build Coastguard Worker   if (nWidget < 0 || nWidget >= pFormField->CountControls())
2331*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kValueError);
2332*3ac0a46fSAndroid Build Coastguard Worker 
2333*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success(
2334*3ac0a46fSAndroid Build Coastguard Worker       pRuntime->NewBoolean(IsCheckBoxOrRadioButton(pFormField)));
2335*3ac0a46fSAndroid Build Coastguard Worker }
2336*3ac0a46fSAndroid Build Coastguard Worker 
deleteItemAt(CJS_Runtime * pRuntime,const std::vector<v8::Local<v8::Value>> & params)2337*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Field::deleteItemAt(
2338*3ac0a46fSAndroid Build Coastguard Worker     CJS_Runtime* pRuntime,
2339*3ac0a46fSAndroid Build Coastguard Worker     const std::vector<v8::Local<v8::Value>>& params) {
2340*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success();
2341*3ac0a46fSAndroid Build Coastguard Worker }
2342*3ac0a46fSAndroid Build Coastguard Worker 
getArray(CJS_Runtime * pRuntime,const std::vector<v8::Local<v8::Value>> & params)2343*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Field::getArray(
2344*3ac0a46fSAndroid Build Coastguard Worker     CJS_Runtime* pRuntime,
2345*3ac0a46fSAndroid Build Coastguard Worker     const std::vector<v8::Local<v8::Value>>& params) {
2346*3ac0a46fSAndroid Build Coastguard Worker   std::vector<CPDF_FormField*> FieldArray = GetFormFields();
2347*3ac0a46fSAndroid Build Coastguard Worker   if (FieldArray.empty())
2348*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kBadObjectError);
2349*3ac0a46fSAndroid Build Coastguard Worker 
2350*3ac0a46fSAndroid Build Coastguard Worker   std::vector<std::unique_ptr<WideString>> swSort;
2351*3ac0a46fSAndroid Build Coastguard Worker   for (CPDF_FormField* pFormField : FieldArray) {
2352*3ac0a46fSAndroid Build Coastguard Worker     swSort.push_back(std::make_unique<WideString>(pFormField->GetFullName()));
2353*3ac0a46fSAndroid Build Coastguard Worker   }
2354*3ac0a46fSAndroid Build Coastguard Worker 
2355*3ac0a46fSAndroid Build Coastguard Worker   std::sort(swSort.begin(), swSort.end(),
2356*3ac0a46fSAndroid Build Coastguard Worker             [](const std::unique_ptr<WideString>& p1,
2357*3ac0a46fSAndroid Build Coastguard Worker                const std::unique_ptr<WideString>& p2) { return *p1 < *p2; });
2358*3ac0a46fSAndroid Build Coastguard Worker 
2359*3ac0a46fSAndroid Build Coastguard Worker   v8::Local<v8::Array> FormFieldArray = pRuntime->NewArray();
2360*3ac0a46fSAndroid Build Coastguard Worker   int j = 0;
2361*3ac0a46fSAndroid Build Coastguard Worker   for (const auto& pStr : swSort) {
2362*3ac0a46fSAndroid Build Coastguard Worker     v8::Local<v8::Object> pObj = pRuntime->NewFXJSBoundObject(
2363*3ac0a46fSAndroid Build Coastguard Worker         CJS_Field::GetObjDefnID(), FXJSOBJTYPE_DYNAMIC);
2364*3ac0a46fSAndroid Build Coastguard Worker     if (pObj.IsEmpty())
2365*3ac0a46fSAndroid Build Coastguard Worker       return CJS_Result::Failure(JSMessage::kBadObjectError);
2366*3ac0a46fSAndroid Build Coastguard Worker 
2367*3ac0a46fSAndroid Build Coastguard Worker     auto* pJSField = static_cast<CJS_Field*>(
2368*3ac0a46fSAndroid Build Coastguard Worker         CFXJS_Engine::GetObjectPrivate(pRuntime->GetIsolate(), pObj));
2369*3ac0a46fSAndroid Build Coastguard Worker     pJSField->AttachField(m_pJSDoc.Get(), *pStr);
2370*3ac0a46fSAndroid Build Coastguard Worker     pRuntime->PutArrayElement(FormFieldArray, j++,
2371*3ac0a46fSAndroid Build Coastguard Worker                               pJSField
2372*3ac0a46fSAndroid Build Coastguard Worker                                   ? v8::Local<v8::Value>(pJSField->ToV8Object())
2373*3ac0a46fSAndroid Build Coastguard Worker                                   : v8::Local<v8::Value>());
2374*3ac0a46fSAndroid Build Coastguard Worker   }
2375*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success(FormFieldArray);
2376*3ac0a46fSAndroid Build Coastguard Worker }
2377*3ac0a46fSAndroid Build Coastguard Worker 
getItemAt(CJS_Runtime * pRuntime,const std::vector<v8::Local<v8::Value>> & params)2378*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Field::getItemAt(
2379*3ac0a46fSAndroid Build Coastguard Worker     CJS_Runtime* pRuntime,
2380*3ac0a46fSAndroid Build Coastguard Worker     const std::vector<v8::Local<v8::Value>>& params) {
2381*3ac0a46fSAndroid Build Coastguard Worker   const size_t nSize = params.size();
2382*3ac0a46fSAndroid Build Coastguard Worker   int nIdx = -1;
2383*3ac0a46fSAndroid Build Coastguard Worker   if (nSize >= 1)
2384*3ac0a46fSAndroid Build Coastguard Worker     nIdx = pRuntime->ToInt32(params[0]);
2385*3ac0a46fSAndroid Build Coastguard Worker 
2386*3ac0a46fSAndroid Build Coastguard Worker   bool bExport = true;
2387*3ac0a46fSAndroid Build Coastguard Worker   if (nSize >= 2)
2388*3ac0a46fSAndroid Build Coastguard Worker     bExport = pRuntime->ToBoolean(params[1]);
2389*3ac0a46fSAndroid Build Coastguard Worker 
2390*3ac0a46fSAndroid Build Coastguard Worker   CPDF_FormField* pFormField = GetFirstFormField();
2391*3ac0a46fSAndroid Build Coastguard Worker   if (!pFormField)
2392*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kBadObjectError);
2393*3ac0a46fSAndroid Build Coastguard Worker 
2394*3ac0a46fSAndroid Build Coastguard Worker   if (!IsComboBoxOrListBox(pFormField))
2395*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kObjectTypeError);
2396*3ac0a46fSAndroid Build Coastguard Worker 
2397*3ac0a46fSAndroid Build Coastguard Worker   if (nIdx == -1 || nIdx > pFormField->CountOptions())
2398*3ac0a46fSAndroid Build Coastguard Worker     nIdx = pFormField->CountOptions() - 1;
2399*3ac0a46fSAndroid Build Coastguard Worker   if (!bExport) {
2400*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Success(
2401*3ac0a46fSAndroid Build Coastguard Worker         pRuntime->NewString(pFormField->GetOptionLabel(nIdx).AsStringView()));
2402*3ac0a46fSAndroid Build Coastguard Worker   }
2403*3ac0a46fSAndroid Build Coastguard Worker 
2404*3ac0a46fSAndroid Build Coastguard Worker   WideString strval = pFormField->GetOptionValue(nIdx);
2405*3ac0a46fSAndroid Build Coastguard Worker   if (strval.IsEmpty()) {
2406*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Success(
2407*3ac0a46fSAndroid Build Coastguard Worker         pRuntime->NewString(pFormField->GetOptionLabel(nIdx).AsStringView()));
2408*3ac0a46fSAndroid Build Coastguard Worker   }
2409*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success(pRuntime->NewString(strval.AsStringView()));
2410*3ac0a46fSAndroid Build Coastguard Worker }
2411*3ac0a46fSAndroid Build Coastguard Worker 
getLock(CJS_Runtime * pRuntime,const std::vector<v8::Local<v8::Value>> & params)2412*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Field::getLock(CJS_Runtime* pRuntime,
2413*3ac0a46fSAndroid Build Coastguard Worker                               const std::vector<v8::Local<v8::Value>>& params) {
2414*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Failure(JSMessage::kNotSupportedError);
2415*3ac0a46fSAndroid Build Coastguard Worker }
2416*3ac0a46fSAndroid Build Coastguard Worker 
insertItemAt(CJS_Runtime * pRuntime,const std::vector<v8::Local<v8::Value>> & params)2417*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Field::insertItemAt(
2418*3ac0a46fSAndroid Build Coastguard Worker     CJS_Runtime* pRuntime,
2419*3ac0a46fSAndroid Build Coastguard Worker     const std::vector<v8::Local<v8::Value>>& params) {
2420*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success();
2421*3ac0a46fSAndroid Build Coastguard Worker }
2422*3ac0a46fSAndroid Build Coastguard Worker 
isBoxChecked(CJS_Runtime * pRuntime,const std::vector<v8::Local<v8::Value>> & params)2423*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Field::isBoxChecked(
2424*3ac0a46fSAndroid Build Coastguard Worker     CJS_Runtime* pRuntime,
2425*3ac0a46fSAndroid Build Coastguard Worker     const std::vector<v8::Local<v8::Value>>& params) {
2426*3ac0a46fSAndroid Build Coastguard Worker   int nIndex = -1;
2427*3ac0a46fSAndroid Build Coastguard Worker   if (params.size() >= 1)
2428*3ac0a46fSAndroid Build Coastguard Worker     nIndex = pRuntime->ToInt32(params[0]);
2429*3ac0a46fSAndroid Build Coastguard Worker 
2430*3ac0a46fSAndroid Build Coastguard Worker   CPDF_FormField* pFormField = GetFirstFormField();
2431*3ac0a46fSAndroid Build Coastguard Worker   if (!pFormField)
2432*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kBadObjectError);
2433*3ac0a46fSAndroid Build Coastguard Worker 
2434*3ac0a46fSAndroid Build Coastguard Worker   if (nIndex < 0 || nIndex >= pFormField->CountControls())
2435*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kValueError);
2436*3ac0a46fSAndroid Build Coastguard Worker 
2437*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success(
2438*3ac0a46fSAndroid Build Coastguard Worker       pRuntime->NewBoolean((IsCheckBoxOrRadioButton(pFormField) &&
2439*3ac0a46fSAndroid Build Coastguard Worker                             pFormField->GetControl(nIndex)->IsChecked() != 0)));
2440*3ac0a46fSAndroid Build Coastguard Worker }
2441*3ac0a46fSAndroid Build Coastguard Worker 
isDefaultChecked(CJS_Runtime * pRuntime,const std::vector<v8::Local<v8::Value>> & params)2442*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Field::isDefaultChecked(
2443*3ac0a46fSAndroid Build Coastguard Worker     CJS_Runtime* pRuntime,
2444*3ac0a46fSAndroid Build Coastguard Worker     const std::vector<v8::Local<v8::Value>>& params) {
2445*3ac0a46fSAndroid Build Coastguard Worker   int nIndex = -1;
2446*3ac0a46fSAndroid Build Coastguard Worker   if (params.size() >= 1)
2447*3ac0a46fSAndroid Build Coastguard Worker     nIndex = pRuntime->ToInt32(params[0]);
2448*3ac0a46fSAndroid Build Coastguard Worker 
2449*3ac0a46fSAndroid Build Coastguard Worker   CPDF_FormField* pFormField = GetFirstFormField();
2450*3ac0a46fSAndroid Build Coastguard Worker   if (!pFormField)
2451*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kBadObjectError);
2452*3ac0a46fSAndroid Build Coastguard Worker 
2453*3ac0a46fSAndroid Build Coastguard Worker   if (nIndex < 0 || nIndex >= pFormField->CountControls())
2454*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kValueError);
2455*3ac0a46fSAndroid Build Coastguard Worker 
2456*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success(pRuntime->NewBoolean(
2457*3ac0a46fSAndroid Build Coastguard Worker       (IsCheckBoxOrRadioButton(pFormField) &&
2458*3ac0a46fSAndroid Build Coastguard Worker        pFormField->GetControl(nIndex)->IsDefaultChecked() != 0)));
2459*3ac0a46fSAndroid Build Coastguard Worker }
2460*3ac0a46fSAndroid Build Coastguard Worker 
setAction(CJS_Runtime * pRuntime,const std::vector<v8::Local<v8::Value>> & params)2461*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Field::setAction(
2462*3ac0a46fSAndroid Build Coastguard Worker     CJS_Runtime* pRuntime,
2463*3ac0a46fSAndroid Build Coastguard Worker     const std::vector<v8::Local<v8::Value>>& params) {
2464*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success();
2465*3ac0a46fSAndroid Build Coastguard Worker }
2466*3ac0a46fSAndroid Build Coastguard Worker 
setFocus(CJS_Runtime * pRuntime,const std::vector<v8::Local<v8::Value>> & params)2467*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Field::setFocus(
2468*3ac0a46fSAndroid Build Coastguard Worker     CJS_Runtime* pRuntime,
2469*3ac0a46fSAndroid Build Coastguard Worker     const std::vector<v8::Local<v8::Value>>& params) {
2470*3ac0a46fSAndroid Build Coastguard Worker   CPDF_FormField* pFormField = GetFirstFormField();
2471*3ac0a46fSAndroid Build Coastguard Worker   if (!pFormField)
2472*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kBadObjectError);
2473*3ac0a46fSAndroid Build Coastguard Worker 
2474*3ac0a46fSAndroid Build Coastguard Worker   int32_t nCount = pFormField->CountControls();
2475*3ac0a46fSAndroid Build Coastguard Worker   if (nCount < 1)
2476*3ac0a46fSAndroid Build Coastguard Worker     return CJS_Result::Failure(JSMessage::kBadObjectError);
2477*3ac0a46fSAndroid Build Coastguard Worker 
2478*3ac0a46fSAndroid Build Coastguard Worker   CPDFSDK_InteractiveForm* pForm = m_pFormFillEnv->GetInteractiveForm();
2479*3ac0a46fSAndroid Build Coastguard Worker   CPDFSDK_Widget* pWidget = nullptr;
2480*3ac0a46fSAndroid Build Coastguard Worker   if (nCount == 1) {
2481*3ac0a46fSAndroid Build Coastguard Worker     pWidget = pForm->GetWidget(pFormField->GetControl(0));
2482*3ac0a46fSAndroid Build Coastguard Worker   } else {
2483*3ac0a46fSAndroid Build Coastguard Worker     IPDF_Page* pPage = m_pFormFillEnv->GetCurrentPage();
2484*3ac0a46fSAndroid Build Coastguard Worker     if (!pPage)
2485*3ac0a46fSAndroid Build Coastguard Worker       return CJS_Result::Failure(JSMessage::kBadObjectError);
2486*3ac0a46fSAndroid Build Coastguard Worker     CPDFSDK_PageView* pCurPageView = m_pFormFillEnv->GetOrCreatePageView(pPage);
2487*3ac0a46fSAndroid Build Coastguard Worker     for (int32_t i = 0; i < nCount; i++) {
2488*3ac0a46fSAndroid Build Coastguard Worker       if (CPDFSDK_Widget* pTempWidget =
2489*3ac0a46fSAndroid Build Coastguard Worker               pForm->GetWidget(pFormField->GetControl(i))) {
2490*3ac0a46fSAndroid Build Coastguard Worker         if (pTempWidget->GetPDFPage() == pCurPageView->GetPDFPage()) {
2491*3ac0a46fSAndroid Build Coastguard Worker           pWidget = pTempWidget;
2492*3ac0a46fSAndroid Build Coastguard Worker           break;
2493*3ac0a46fSAndroid Build Coastguard Worker         }
2494*3ac0a46fSAndroid Build Coastguard Worker       }
2495*3ac0a46fSAndroid Build Coastguard Worker     }
2496*3ac0a46fSAndroid Build Coastguard Worker   }
2497*3ac0a46fSAndroid Build Coastguard Worker 
2498*3ac0a46fSAndroid Build Coastguard Worker   if (pWidget) {
2499*3ac0a46fSAndroid Build Coastguard Worker     ObservedPtr<CPDFSDK_Annot> pObserved(pWidget);
2500*3ac0a46fSAndroid Build Coastguard Worker     m_pFormFillEnv->SetFocusAnnot(pObserved);
2501*3ac0a46fSAndroid Build Coastguard Worker   }
2502*3ac0a46fSAndroid Build Coastguard Worker 
2503*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success();
2504*3ac0a46fSAndroid Build Coastguard Worker }
2505*3ac0a46fSAndroid Build Coastguard Worker 
setItems(CJS_Runtime * pRuntime,const std::vector<v8::Local<v8::Value>> & params)2506*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Field::setItems(
2507*3ac0a46fSAndroid Build Coastguard Worker     CJS_Runtime* pRuntime,
2508*3ac0a46fSAndroid Build Coastguard Worker     const std::vector<v8::Local<v8::Value>>& params) {
2509*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Success();
2510*3ac0a46fSAndroid Build Coastguard Worker }
2511*3ac0a46fSAndroid Build Coastguard Worker 
setLock(CJS_Runtime * pRuntime,const std::vector<v8::Local<v8::Value>> & params)2512*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Field::setLock(CJS_Runtime* pRuntime,
2513*3ac0a46fSAndroid Build Coastguard Worker                               const std::vector<v8::Local<v8::Value>>& params) {
2514*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Failure(JSMessage::kNotSupportedError);
2515*3ac0a46fSAndroid Build Coastguard Worker }
2516*3ac0a46fSAndroid Build Coastguard Worker 
signatureGetModifications(CJS_Runtime * pRuntime,const std::vector<v8::Local<v8::Value>> & params)2517*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Field::signatureGetModifications(
2518*3ac0a46fSAndroid Build Coastguard Worker     CJS_Runtime* pRuntime,
2519*3ac0a46fSAndroid Build Coastguard Worker     const std::vector<v8::Local<v8::Value>>& params) {
2520*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Failure(JSMessage::kNotSupportedError);
2521*3ac0a46fSAndroid Build Coastguard Worker }
2522*3ac0a46fSAndroid Build Coastguard Worker 
signatureGetSeedValue(CJS_Runtime * pRuntime,const std::vector<v8::Local<v8::Value>> & params)2523*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Field::signatureGetSeedValue(
2524*3ac0a46fSAndroid Build Coastguard Worker     CJS_Runtime* pRuntime,
2525*3ac0a46fSAndroid Build Coastguard Worker     const std::vector<v8::Local<v8::Value>>& params) {
2526*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Failure(JSMessage::kNotSupportedError);
2527*3ac0a46fSAndroid Build Coastguard Worker }
2528*3ac0a46fSAndroid Build Coastguard Worker 
signatureInfo(CJS_Runtime * pRuntime,const std::vector<v8::Local<v8::Value>> & params)2529*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Field::signatureInfo(
2530*3ac0a46fSAndroid Build Coastguard Worker     CJS_Runtime* pRuntime,
2531*3ac0a46fSAndroid Build Coastguard Worker     const std::vector<v8::Local<v8::Value>>& params) {
2532*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Failure(JSMessage::kNotSupportedError);
2533*3ac0a46fSAndroid Build Coastguard Worker }
2534*3ac0a46fSAndroid Build Coastguard Worker 
signatureSetSeedValue(CJS_Runtime * pRuntime,const std::vector<v8::Local<v8::Value>> & params)2535*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Field::signatureSetSeedValue(
2536*3ac0a46fSAndroid Build Coastguard Worker     CJS_Runtime* pRuntime,
2537*3ac0a46fSAndroid Build Coastguard Worker     const std::vector<v8::Local<v8::Value>>& params) {
2538*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Failure(JSMessage::kNotSupportedError);
2539*3ac0a46fSAndroid Build Coastguard Worker }
2540*3ac0a46fSAndroid Build Coastguard Worker 
signatureSign(CJS_Runtime * pRuntime,const std::vector<v8::Local<v8::Value>> & params)2541*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Field::signatureSign(
2542*3ac0a46fSAndroid Build Coastguard Worker     CJS_Runtime* pRuntime,
2543*3ac0a46fSAndroid Build Coastguard Worker     const std::vector<v8::Local<v8::Value>>& params) {
2544*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Failure(JSMessage::kNotSupportedError);
2545*3ac0a46fSAndroid Build Coastguard Worker }
2546*3ac0a46fSAndroid Build Coastguard Worker 
signatureValidate(CJS_Runtime * pRuntime,const std::vector<v8::Local<v8::Value>> & params)2547*3ac0a46fSAndroid Build Coastguard Worker CJS_Result CJS_Field::signatureValidate(
2548*3ac0a46fSAndroid Build Coastguard Worker     CJS_Runtime* pRuntime,
2549*3ac0a46fSAndroid Build Coastguard Worker     const std::vector<v8::Local<v8::Value>>& params) {
2550*3ac0a46fSAndroid Build Coastguard Worker   return CJS_Result::Failure(JSMessage::kNotSupportedError);
2551*3ac0a46fSAndroid Build Coastguard Worker }
2552*3ac0a46fSAndroid Build Coastguard Worker 
SetDelay(bool bDelay)2553*3ac0a46fSAndroid Build Coastguard Worker void CJS_Field::SetDelay(bool bDelay) {
2554*3ac0a46fSAndroid Build Coastguard Worker   m_bDelay = bDelay;
2555*3ac0a46fSAndroid Build Coastguard Worker   if (m_bDelay)
2556*3ac0a46fSAndroid Build Coastguard Worker     return;
2557*3ac0a46fSAndroid Build Coastguard Worker 
2558*3ac0a46fSAndroid Build Coastguard Worker   if (m_pJSDoc)
2559*3ac0a46fSAndroid Build Coastguard Worker     m_pJSDoc->DoFieldDelay(m_FieldName, m_nFormControlIndex);
2560*3ac0a46fSAndroid Build Coastguard Worker }
2561*3ac0a46fSAndroid Build Coastguard Worker 
AddDelay_Int(FIELD_PROP prop,int32_t n)2562*3ac0a46fSAndroid Build Coastguard Worker void CJS_Field::AddDelay_Int(FIELD_PROP prop, int32_t n) {
2563*3ac0a46fSAndroid Build Coastguard Worker   auto pNewData =
2564*3ac0a46fSAndroid Build Coastguard Worker       std::make_unique<CJS_DelayData>(prop, m_nFormControlIndex, m_FieldName);
2565*3ac0a46fSAndroid Build Coastguard Worker   pNewData->num = n;
2566*3ac0a46fSAndroid Build Coastguard Worker   m_pJSDoc->AddDelayData(std::move(pNewData));
2567*3ac0a46fSAndroid Build Coastguard Worker }
2568*3ac0a46fSAndroid Build Coastguard Worker 
AddDelay_Bool(FIELD_PROP prop,bool b)2569*3ac0a46fSAndroid Build Coastguard Worker void CJS_Field::AddDelay_Bool(FIELD_PROP prop, bool b) {
2570*3ac0a46fSAndroid Build Coastguard Worker   auto pNewData =
2571*3ac0a46fSAndroid Build Coastguard Worker       std::make_unique<CJS_DelayData>(prop, m_nFormControlIndex, m_FieldName);
2572*3ac0a46fSAndroid Build Coastguard Worker   pNewData->b = b;
2573*3ac0a46fSAndroid Build Coastguard Worker   m_pJSDoc->AddDelayData(std::move(pNewData));
2574*3ac0a46fSAndroid Build Coastguard Worker }
2575*3ac0a46fSAndroid Build Coastguard Worker 
AddDelay_String(FIELD_PROP prop,const ByteString & str)2576*3ac0a46fSAndroid Build Coastguard Worker void CJS_Field::AddDelay_String(FIELD_PROP prop, const ByteString& str) {
2577*3ac0a46fSAndroid Build Coastguard Worker   auto pNewData =
2578*3ac0a46fSAndroid Build Coastguard Worker       std::make_unique<CJS_DelayData>(prop, m_nFormControlIndex, m_FieldName);
2579*3ac0a46fSAndroid Build Coastguard Worker   pNewData->bytestring = str;
2580*3ac0a46fSAndroid Build Coastguard Worker   m_pJSDoc->AddDelayData(std::move(pNewData));
2581*3ac0a46fSAndroid Build Coastguard Worker }
2582*3ac0a46fSAndroid Build Coastguard Worker 
AddDelay_Rect(FIELD_PROP prop,const CFX_FloatRect & rect)2583*3ac0a46fSAndroid Build Coastguard Worker void CJS_Field::AddDelay_Rect(FIELD_PROP prop, const CFX_FloatRect& rect) {
2584*3ac0a46fSAndroid Build Coastguard Worker   auto pNewData =
2585*3ac0a46fSAndroid Build Coastguard Worker       std::make_unique<CJS_DelayData>(prop, m_nFormControlIndex, m_FieldName);
2586*3ac0a46fSAndroid Build Coastguard Worker   pNewData->rect = rect;
2587*3ac0a46fSAndroid Build Coastguard Worker   m_pJSDoc->AddDelayData(std::move(pNewData));
2588*3ac0a46fSAndroid Build Coastguard Worker }
2589*3ac0a46fSAndroid Build Coastguard Worker 
AddDelay_WordArray(FIELD_PROP prop,const std::vector<uint32_t> & array)2590*3ac0a46fSAndroid Build Coastguard Worker void CJS_Field::AddDelay_WordArray(FIELD_PROP prop,
2591*3ac0a46fSAndroid Build Coastguard Worker                                    const std::vector<uint32_t>& array) {
2592*3ac0a46fSAndroid Build Coastguard Worker   auto pNewData =
2593*3ac0a46fSAndroid Build Coastguard Worker       std::make_unique<CJS_DelayData>(prop, m_nFormControlIndex, m_FieldName);
2594*3ac0a46fSAndroid Build Coastguard Worker   pNewData->wordarray = array;
2595*3ac0a46fSAndroid Build Coastguard Worker   m_pJSDoc->AddDelayData(std::move(pNewData));
2596*3ac0a46fSAndroid Build Coastguard Worker }
2597*3ac0a46fSAndroid Build Coastguard Worker 
AddDelay_WideStringArray(FIELD_PROP prop,const std::vector<WideString> & array)2598*3ac0a46fSAndroid Build Coastguard Worker void CJS_Field::AddDelay_WideStringArray(FIELD_PROP prop,
2599*3ac0a46fSAndroid Build Coastguard Worker                                          const std::vector<WideString>& array) {
2600*3ac0a46fSAndroid Build Coastguard Worker   auto pNewData =
2601*3ac0a46fSAndroid Build Coastguard Worker       std::make_unique<CJS_DelayData>(prop, m_nFormControlIndex, m_FieldName);
2602*3ac0a46fSAndroid Build Coastguard Worker   pNewData->widestringarray = array;
2603*3ac0a46fSAndroid Build Coastguard Worker   m_pJSDoc->AddDelayData(std::move(pNewData));
2604*3ac0a46fSAndroid Build Coastguard Worker }
2605*3ac0a46fSAndroid Build Coastguard Worker 
DoDelay(CPDFSDK_FormFillEnvironment * pFormFillEnv,CJS_DelayData * pData)2606*3ac0a46fSAndroid Build Coastguard Worker void CJS_Field::DoDelay(CPDFSDK_FormFillEnvironment* pFormFillEnv,
2607*3ac0a46fSAndroid Build Coastguard Worker                         CJS_DelayData* pData) {
2608*3ac0a46fSAndroid Build Coastguard Worker   DCHECK(pFormFillEnv);
2609*3ac0a46fSAndroid Build Coastguard Worker   switch (pData->eProp) {
2610*3ac0a46fSAndroid Build Coastguard Worker     case FP_BORDERSTYLE:
2611*3ac0a46fSAndroid Build Coastguard Worker       SetBorderStyle(pFormFillEnv, pData->sFieldName, pData->nControlIndex,
2612*3ac0a46fSAndroid Build Coastguard Worker                      pData->bytestring);
2613*3ac0a46fSAndroid Build Coastguard Worker       break;
2614*3ac0a46fSAndroid Build Coastguard Worker     case FP_CURRENTVALUEINDICES:
2615*3ac0a46fSAndroid Build Coastguard Worker       SetCurrentValueIndices(pFormFillEnv, pData->sFieldName,
2616*3ac0a46fSAndroid Build Coastguard Worker                              pData->nControlIndex, pData->wordarray);
2617*3ac0a46fSAndroid Build Coastguard Worker       break;
2618*3ac0a46fSAndroid Build Coastguard Worker     case FP_DISPLAY:
2619*3ac0a46fSAndroid Build Coastguard Worker       SetDisplay(pFormFillEnv, pData->sFieldName, pData->nControlIndex,
2620*3ac0a46fSAndroid Build Coastguard Worker                  pData->num);
2621*3ac0a46fSAndroid Build Coastguard Worker       break;
2622*3ac0a46fSAndroid Build Coastguard Worker     case FP_HIDDEN:
2623*3ac0a46fSAndroid Build Coastguard Worker       SetHidden(pFormFillEnv, pData->sFieldName, pData->nControlIndex,
2624*3ac0a46fSAndroid Build Coastguard Worker                 pData->b);
2625*3ac0a46fSAndroid Build Coastguard Worker       break;
2626*3ac0a46fSAndroid Build Coastguard Worker     case FP_LINEWIDTH:
2627*3ac0a46fSAndroid Build Coastguard Worker       SetLineWidth(pFormFillEnv, pData->sFieldName, pData->nControlIndex,
2628*3ac0a46fSAndroid Build Coastguard Worker                    pData->num);
2629*3ac0a46fSAndroid Build Coastguard Worker       break;
2630*3ac0a46fSAndroid Build Coastguard Worker     case FP_RECT:
2631*3ac0a46fSAndroid Build Coastguard Worker       SetRect(pFormFillEnv, pData->sFieldName, pData->nControlIndex,
2632*3ac0a46fSAndroid Build Coastguard Worker               pData->rect);
2633*3ac0a46fSAndroid Build Coastguard Worker       break;
2634*3ac0a46fSAndroid Build Coastguard Worker     case FP_VALUE:
2635*3ac0a46fSAndroid Build Coastguard Worker       SetFieldValue(pFormFillEnv, pData->sFieldName, pData->nControlIndex,
2636*3ac0a46fSAndroid Build Coastguard Worker                     pData->widestringarray);
2637*3ac0a46fSAndroid Build Coastguard Worker       break;
2638*3ac0a46fSAndroid Build Coastguard Worker   }
2639*3ac0a46fSAndroid Build Coastguard Worker }
2640