1// Copyright 2014 PDFium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6
7#ifndef FXJS_CJS_FIELD_H_
8#define FXJS_CJS_FIELD_H_
9
10#include <string>
11#include <vector>
12
13#include "fxjs/JS_Define.h"
14
15class CPDF_FormControl;
16class CPDFSDK_Widget;
17class Document;
18struct CJS_DelayData;
19
20enum FIELD_PROP {
21  FP_BORDERSTYLE,
22  FP_CURRENTVALUEINDICES,
23  FP_DISPLAY,
24  FP_HIDDEN,
25  FP_LINEWIDTH,
26  FP_RECT,
27  FP_VALUE
28};
29
30class Field : public CJS_EmbedObj {
31 public:
32  static void DoDelay(CPDFSDK_FormFillEnvironment* pFormFillEnv,
33                      CJS_DelayData* pData);
34
35  explicit Field(CJS_Object* pJSObject);
36  ~Field() override;
37
38  CJS_Return get_alignment(CJS_Runtime* pRuntime);
39  CJS_Return set_alignment(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp);
40
41  CJS_Return get_border_style(CJS_Runtime* pRuntime);
42  CJS_Return set_border_style(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp);
43
44  CJS_Return get_button_align_x(CJS_Runtime* pRuntime);
45  CJS_Return set_button_align_x(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp);
46
47  CJS_Return get_button_align_y(CJS_Runtime* pRuntime);
48  CJS_Return set_button_align_y(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp);
49
50  CJS_Return get_button_fit_bounds(CJS_Runtime* pRuntime);
51  CJS_Return set_button_fit_bounds(CJS_Runtime* pRuntime,
52                                   v8::Local<v8::Value> vp);
53
54  CJS_Return get_button_position(CJS_Runtime* pRuntime);
55  CJS_Return set_button_position(CJS_Runtime* pRuntime,
56                                 v8::Local<v8::Value> vp);
57
58  CJS_Return get_button_scale_how(CJS_Runtime* pRuntime);
59  CJS_Return set_button_scale_how(CJS_Runtime* pRuntime,
60                                  v8::Local<v8::Value> vp);
61
62  CJS_Return get_button_scale_when(CJS_Runtime* pRuntime);
63  CJS_Return set_button_scale_when(CJS_Runtime* pRuntime,
64                                   v8::Local<v8::Value> vp);
65
66  CJS_Return get_calc_order_index(CJS_Runtime* pRuntime);
67  CJS_Return set_calc_order_index(CJS_Runtime* pRuntime,
68                                  v8::Local<v8::Value> vp);
69
70  CJS_Return get_char_limit(CJS_Runtime* pRuntime);
71  CJS_Return set_char_limit(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp);
72
73  CJS_Return get_comb(CJS_Runtime* pRuntime);
74  CJS_Return set_comb(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp);
75
76  CJS_Return get_commit_on_sel_change(CJS_Runtime* pRuntime);
77  CJS_Return set_commit_on_sel_change(CJS_Runtime* pRuntime,
78                                      v8::Local<v8::Value> vp);
79
80  CJS_Return get_current_value_indices(CJS_Runtime* pRuntime);
81  CJS_Return set_current_value_indices(CJS_Runtime* pRuntime,
82                                       v8::Local<v8::Value> vp);
83
84  CJS_Return get_default_style(CJS_Runtime* pRuntime);
85  CJS_Return set_default_style(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp);
86
87  CJS_Return get_default_value(CJS_Runtime* pRuntime);
88  CJS_Return set_default_value(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp);
89
90  CJS_Return get_do_not_scroll(CJS_Runtime* pRuntime);
91  CJS_Return set_do_not_scroll(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp);
92
93  CJS_Return get_do_not_spell_check(CJS_Runtime* pRuntime);
94  CJS_Return set_do_not_spell_check(CJS_Runtime* pRuntime,
95                                    v8::Local<v8::Value> vp);
96
97  CJS_Return get_delay(CJS_Runtime* pRuntime);
98  CJS_Return set_delay(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp);
99
100  CJS_Return get_display(CJS_Runtime* pRuntime);
101  CJS_Return set_display(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp);
102
103  CJS_Return get_doc(CJS_Runtime* pRuntime);
104  CJS_Return set_doc(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp);
105
106  CJS_Return get_editable(CJS_Runtime* pRuntime);
107  CJS_Return set_editable(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp);
108
109  CJS_Return get_export_values(CJS_Runtime* pRuntime);
110  CJS_Return set_export_values(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp);
111
112  CJS_Return get_file_select(CJS_Runtime* pRuntime);
113  CJS_Return set_file_select(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp);
114
115  CJS_Return get_fill_color(CJS_Runtime* pRuntime);
116  CJS_Return set_fill_color(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp);
117
118  CJS_Return get_hidden(CJS_Runtime* pRuntime);
119  CJS_Return set_hidden(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp);
120
121  CJS_Return get_highlight(CJS_Runtime* pRuntime);
122  CJS_Return set_highlight(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp);
123
124  CJS_Return get_line_width(CJS_Runtime* pRuntime);
125  CJS_Return set_line_width(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp);
126
127  CJS_Return get_multiline(CJS_Runtime* pRuntime);
128  CJS_Return set_multiline(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp);
129
130  CJS_Return get_multiple_selection(CJS_Runtime* pRuntime);
131  CJS_Return set_multiple_selection(CJS_Runtime* pRuntime,
132                                    v8::Local<v8::Value> vp);
133
134  CJS_Return get_name(CJS_Runtime* pRuntime);
135  CJS_Return set_name(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp);
136
137  CJS_Return get_num_items(CJS_Runtime* pRuntime);
138  CJS_Return set_num_items(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp);
139
140  CJS_Return get_page(CJS_Runtime* pRuntime);
141  CJS_Return set_page(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp);
142
143  CJS_Return get_password(CJS_Runtime* pRuntime);
144  CJS_Return set_password(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp);
145
146  CJS_Return get_print(CJS_Runtime* pRuntime);
147  CJS_Return set_print(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp);
148
149  CJS_Return get_radios_in_unison(CJS_Runtime* pRuntime);
150  CJS_Return set_radios_in_unison(CJS_Runtime* pRuntime,
151                                  v8::Local<v8::Value> vp);
152
153  CJS_Return get_readonly(CJS_Runtime* pRuntime);
154  CJS_Return set_readonly(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp);
155
156  CJS_Return get_rect(CJS_Runtime* pRuntime);
157  CJS_Return set_rect(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp);
158
159  CJS_Return get_required(CJS_Runtime* pRuntime);
160  CJS_Return set_required(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp);
161
162  CJS_Return get_rich_text(CJS_Runtime* pRuntime);
163  CJS_Return set_rich_text(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp);
164
165  CJS_Return get_rich_value(CJS_Runtime* pRuntime);
166  CJS_Return set_rich_value(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp);
167
168  CJS_Return get_rotation(CJS_Runtime* pRuntime);
169  CJS_Return set_rotation(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp);
170
171  CJS_Return get_stroke_color(CJS_Runtime* pRuntime);
172  CJS_Return set_stroke_color(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp);
173
174  CJS_Return get_style(CJS_Runtime* pRuntime);
175  CJS_Return set_style(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp);
176
177  CJS_Return get_submit_name(CJS_Runtime* pRuntime);
178  CJS_Return set_submit_name(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp);
179
180  CJS_Return get_text_color(CJS_Runtime* pRuntime);
181  CJS_Return set_text_color(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp);
182
183  CJS_Return get_text_font(CJS_Runtime* pRuntime);
184  CJS_Return set_text_font(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp);
185
186  CJS_Return get_text_size(CJS_Runtime* pRuntime);
187  CJS_Return set_text_size(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp);
188
189  CJS_Return get_type(CJS_Runtime* pRuntime);
190  CJS_Return set_type(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp);
191
192  CJS_Return get_user_name(CJS_Runtime* pRuntime);
193  CJS_Return set_user_name(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp);
194
195  CJS_Return get_value(CJS_Runtime* pRuntime);
196  CJS_Return set_value(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp);
197
198  CJS_Return get_value_as_string(CJS_Runtime* pRuntime);
199  CJS_Return set_value_as_string(CJS_Runtime* pRuntime,
200                                 v8::Local<v8::Value> vp);
201
202  CJS_Return get_source(CJS_Runtime* pRuntime);
203  CJS_Return set_source(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp);
204
205  CJS_Return browseForFileToSubmit(
206      CJS_Runtime* pRuntime,
207      const std::vector<v8::Local<v8::Value>>& params);
208  CJS_Return buttonGetCaption(CJS_Runtime* pRuntime,
209                              const std::vector<v8::Local<v8::Value>>& params);
210  CJS_Return buttonGetIcon(CJS_Runtime* pRuntime,
211                           const std::vector<v8::Local<v8::Value>>& params);
212  CJS_Return buttonImportIcon(CJS_Runtime* pRuntime,
213                              const std::vector<v8::Local<v8::Value>>& params);
214  CJS_Return buttonSetCaption(CJS_Runtime* pRuntime,
215                              const std::vector<v8::Local<v8::Value>>& params);
216  CJS_Return buttonSetIcon(CJS_Runtime* pRuntime,
217                           const std::vector<v8::Local<v8::Value>>& params);
218  CJS_Return checkThisBox(CJS_Runtime* pRuntime,
219                          const std::vector<v8::Local<v8::Value>>& params);
220  CJS_Return clearItems(CJS_Runtime* pRuntime,
221                        const std::vector<v8::Local<v8::Value>>& params);
222  CJS_Return defaultIsChecked(CJS_Runtime* pRuntime,
223                              const std::vector<v8::Local<v8::Value>>& params);
224  CJS_Return deleteItemAt(CJS_Runtime* pRuntime,
225                          const std::vector<v8::Local<v8::Value>>& params);
226  CJS_Return getArray(CJS_Runtime* pRuntime,
227                      const std::vector<v8::Local<v8::Value>>& params);
228  CJS_Return getItemAt(CJS_Runtime* pRuntime,
229                       const std::vector<v8::Local<v8::Value>>& params);
230  CJS_Return getLock(CJS_Runtime* pRuntime,
231                     const std::vector<v8::Local<v8::Value>>& params);
232  CJS_Return insertItemAt(CJS_Runtime* pRuntime,
233                          const std::vector<v8::Local<v8::Value>>& params);
234  CJS_Return isBoxChecked(CJS_Runtime* pRuntime,
235                          const std::vector<v8::Local<v8::Value>>& params);
236  CJS_Return isDefaultChecked(CJS_Runtime* pRuntime,
237                              const std::vector<v8::Local<v8::Value>>& params);
238  CJS_Return setAction(CJS_Runtime* pRuntime,
239                       const std::vector<v8::Local<v8::Value>>& params);
240  CJS_Return setFocus(CJS_Runtime* pRuntime,
241                      const std::vector<v8::Local<v8::Value>>& params);
242  CJS_Return setItems(CJS_Runtime* pRuntime,
243                      const std::vector<v8::Local<v8::Value>>& params);
244  CJS_Return setLock(CJS_Runtime* pRuntime,
245                     const std::vector<v8::Local<v8::Value>>& params);
246  CJS_Return signatureGetModifications(
247      CJS_Runtime* pRuntime,
248      const std::vector<v8::Local<v8::Value>>& params);
249  CJS_Return signatureGetSeedValue(
250      CJS_Runtime* pRuntime,
251      const std::vector<v8::Local<v8::Value>>& params);
252  CJS_Return signatureInfo(CJS_Runtime* pRuntime,
253                           const std::vector<v8::Local<v8::Value>>& params);
254  CJS_Return signatureSetSeedValue(
255      CJS_Runtime* pRuntime,
256      const std::vector<v8::Local<v8::Value>>& params);
257  CJS_Return signatureSign(CJS_Runtime* pRuntime,
258                           const std::vector<v8::Local<v8::Value>>& params);
259  CJS_Return signatureValidate(CJS_Runtime* pRuntime,
260                               const std::vector<v8::Local<v8::Value>>& params);
261
262  bool AttachField(Document* pDocument, const WideString& csFieldName);
263
264 private:
265  static void SetBorderStyle(CPDFSDK_FormFillEnvironment* pFormFillEnv,
266                             const WideString& swFieldName,
267                             int nControlIndex,
268                             const ByteString& string);
269  static void SetCurrentValueIndices(CPDFSDK_FormFillEnvironment* pFormFillEnv,
270                                     const WideString& swFieldName,
271                                     int nControlIndex,
272                                     const std::vector<uint32_t>& array);
273  static void SetDisplay(CPDFSDK_FormFillEnvironment* pFormFillEnv,
274                         const WideString& swFieldName,
275                         int nControlIndex,
276                         int number);
277  static void SetHidden(CPDFSDK_FormFillEnvironment* pFormFillEnv,
278                        const WideString& swFieldName,
279                        int nControlIndex,
280                        bool b);
281  static void SetLineWidth(CPDFSDK_FormFillEnvironment* pFormFillEnv,
282                           const WideString& swFieldName,
283                           int nControlIndex,
284                           int number);
285  static void SetMultiline(CPDFSDK_FormFillEnvironment* pFormFillEnv,
286                           const WideString& swFieldName,
287                           int nControlIndex,
288                           bool b);
289  static void SetRect(CPDFSDK_FormFillEnvironment* pFormFillEnv,
290                      const WideString& swFieldName,
291                      int nControlIndex,
292                      const CFX_FloatRect& rect);
293  static void SetValue(CPDFSDK_FormFillEnvironment* pFormFillEnv,
294                       const WideString& swFieldName,
295                       int nControlIndex,
296                       const std::vector<WideString>& strArray);
297
298  static void UpdateFormField(CPDFSDK_FormFillEnvironment* pFormFillEnv,
299                              CPDF_FormField* pFormField,
300                              bool bChangeMark,
301                              bool bResetAP,
302                              bool bRefresh);
303  static void UpdateFormControl(CPDFSDK_FormFillEnvironment* pFormFillEnv,
304                                CPDF_FormControl* pFormControl,
305                                bool bChangeMark,
306                                bool bResetAP,
307                                bool bRefresh);
308
309  static CPDFSDK_Widget* GetWidget(CPDFSDK_FormFillEnvironment* pFormFillEnv,
310                                   CPDF_FormControl* pFormControl);
311  static std::vector<CPDF_FormField*> GetFormFields(
312      CPDFSDK_FormFillEnvironment* pFormFillEnv,
313      const WideString& csFieldName);
314
315  void SetDelay(bool bDelay);
316  void ParseFieldName(const std::wstring& strFieldNameParsed,
317                      std::wstring& strFieldName,
318                      int& iControlNo);
319  std::vector<CPDF_FormField*> GetFormFields(
320      const WideString& csFieldName) const;
321  CPDF_FormControl* GetSmartFieldControl(CPDF_FormField* pFormField);
322  bool ValueIsOccur(CPDF_FormField* pFormField, WideString csOptLabel);
323
324  void AddDelay_Int(FIELD_PROP prop, int32_t n);
325  void AddDelay_Bool(FIELD_PROP prop, bool b);
326  void AddDelay_String(FIELD_PROP prop, const ByteString& string);
327  void AddDelay_Rect(FIELD_PROP prop, const CFX_FloatRect& rect);
328  void AddDelay_WordArray(FIELD_PROP prop, const std::vector<uint32_t>& array);
329  void AddDelay_WideStringArray(FIELD_PROP prop,
330                                const std::vector<WideString>& array);
331
332  void DoDelay();
333
334  Document* m_pJSDoc;
335  CPDFSDK_FormFillEnvironment::ObservedPtr m_pFormFillEnv;
336  WideString m_FieldName;
337  int m_nFormControlIndex;
338  bool m_bCanSet;
339  bool m_bDelay;
340};
341
342class CJS_Field : public CJS_Object {
343 public:
344  static int GetObjDefnID();
345  static void DefineJSObjects(CFXJS_Engine* pEngine);
346
347  explicit CJS_Field(v8::Local<v8::Object> pObject) : CJS_Object(pObject) {}
348  ~CJS_Field() override {}
349
350  void InitInstance(IJS_Runtime* pIRuntime) override;
351
352  JS_STATIC_PROP(alignment, alignment, Field);
353  JS_STATIC_PROP(borderStyle, border_style, Field);
354  JS_STATIC_PROP(buttonAlignX, button_align_x, Field);
355  JS_STATIC_PROP(buttonAlignY, button_align_y, Field);
356  JS_STATIC_PROP(buttonFitBounds, button_fit_bounds, Field);
357  JS_STATIC_PROP(buttonPosition, button_position, Field);
358  JS_STATIC_PROP(buttonScaleHow, button_scale_how, Field);
359  JS_STATIC_PROP(ButtonScaleWhen, button_scale_when, Field);
360  JS_STATIC_PROP(calcOrderIndex, calc_order_index, Field);
361  JS_STATIC_PROP(charLimit, char_limit, Field);
362  JS_STATIC_PROP(comb, comb, Field);
363  JS_STATIC_PROP(commitOnSelChange, commit_on_sel_change, Field);
364  JS_STATIC_PROP(currentValueIndices, current_value_indices, Field);
365  JS_STATIC_PROP(defaultStyle, default_style, Field);
366  JS_STATIC_PROP(defaultValue, default_value, Field);
367  JS_STATIC_PROP(doNotScroll, do_not_scroll, Field);
368  JS_STATIC_PROP(doNotSpellCheck, do_not_spell_check, Field);
369  JS_STATIC_PROP(delay, delay, Field);
370  JS_STATIC_PROP(display, display, Field);
371  JS_STATIC_PROP(doc, doc, Field);
372  JS_STATIC_PROP(editable, editable, Field);
373  JS_STATIC_PROP(exportValues, export_values, Field);
374  JS_STATIC_PROP(fileSelect, file_select, Field);
375  JS_STATIC_PROP(fillColor, fill_color, Field);
376  JS_STATIC_PROP(hidden, hidden, Field);
377  JS_STATIC_PROP(highlight, highlight, Field);
378  JS_STATIC_PROP(lineWidth, line_width, Field);
379  JS_STATIC_PROP(multiline, multiline, Field);
380  JS_STATIC_PROP(multipleSelection, multiple_selection, Field);
381  JS_STATIC_PROP(name, name, Field);
382  JS_STATIC_PROP(numItems, num_items, Field);
383  JS_STATIC_PROP(page, page, Field);
384  JS_STATIC_PROP(password, password, Field);
385  JS_STATIC_PROP(print, print, Field);
386  JS_STATIC_PROP(radiosInUnison, radios_in_unison, Field);
387  JS_STATIC_PROP(readonly, readonly, Field);
388  JS_STATIC_PROP(rect, rect, Field);
389  JS_STATIC_PROP(required, required, Field);
390  JS_STATIC_PROP(richText, rich_text, Field);
391  JS_STATIC_PROP(richValue, rich_value, Field);
392  JS_STATIC_PROP(rotation, rotation, Field);
393  JS_STATIC_PROP(strokeColor, stroke_color, Field);
394  JS_STATIC_PROP(style, style, Field);
395  JS_STATIC_PROP(submitName, submit_name, Field);
396  JS_STATIC_PROP(textColor, text_color, Field);
397  JS_STATIC_PROP(textFont, text_font, Field);
398  JS_STATIC_PROP(textSize, text_size, Field);
399  JS_STATIC_PROP(type, type, Field);
400  JS_STATIC_PROP(userName, user_name, Field);
401  JS_STATIC_PROP(value, value, Field);
402  JS_STATIC_PROP(valueAsString, value_as_string, Field);
403  JS_STATIC_PROP(source, source, Field);
404
405  JS_STATIC_METHOD(browseForFileToSubmit, Field);
406  JS_STATIC_METHOD(buttonGetCaption, Field);
407  JS_STATIC_METHOD(buttonGetIcon, Field);
408  JS_STATIC_METHOD(buttonImportIcon, Field);
409  JS_STATIC_METHOD(buttonSetCaption, Field);
410  JS_STATIC_METHOD(buttonSetIcon, Field);
411  JS_STATIC_METHOD(checkThisBox, Field);
412  JS_STATIC_METHOD(clearItems, Field);
413  JS_STATIC_METHOD(defaultIsChecked, Field);
414  JS_STATIC_METHOD(deleteItemAt, Field);
415  JS_STATIC_METHOD(getArray, Field);
416  JS_STATIC_METHOD(getItemAt, Field);
417  JS_STATIC_METHOD(getLock, Field);
418  JS_STATIC_METHOD(insertItemAt, Field);
419  JS_STATIC_METHOD(isBoxChecked, Field);
420  JS_STATIC_METHOD(isDefaultChecked, Field);
421  JS_STATIC_METHOD(setAction, Field);
422  JS_STATIC_METHOD(setFocus, Field);
423  JS_STATIC_METHOD(setItems, Field);
424  JS_STATIC_METHOD(setLock, Field);
425  JS_STATIC_METHOD(signatureGetModifications, Field);
426  JS_STATIC_METHOD(signatureGetSeedValue, Field);
427  JS_STATIC_METHOD(signatureInfo, Field);
428  JS_STATIC_METHOD(signatureSetSeedValue, Field);
429  JS_STATIC_METHOD(signatureSign, Field);
430  JS_STATIC_METHOD(signatureValidate, Field);
431
432 private:
433  static int ObjDefnID;
434  static const JSPropertySpec PropertySpecs[];
435  static const JSMethodSpec MethodSpecs[];
436};
437
438#endif  // FXJS_CJS_FIELD_H_
439