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 
15 class CPDF_FormControl;
16 class CPDFSDK_Widget;
17 class Document;
18 struct CJS_DelayData;
19 
20 enum 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 
30 class 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 
342 class CJS_Field : public CJS_Object {
343  public:
344   static int GetObjDefnID();
345   static void DefineJSObjects(CFXJS_Engine* pEngine);
346 
CJS_Field(v8::Local<v8::Object> pObject)347   explicit CJS_Field(v8::Local<v8::Object> pObject) : CJS_Object(pObject) {}
~CJS_Field()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