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