Update set_validate_field_value to accept javascript changed values.
authorRobin Watts <[email protected]>
Mon, 26 Jul 2021 12:02:44 +0000 (13:02 +0100)
committerRobin Watts <[email protected]>
Mon, 26 Jul 2021 15:44:34 +0000 (16:44 +0100)
toupper-64-8.pdf demonstrates that the 'validation' javascript
event can change the final value that is supposed to be stored
into the document.

Support that here.

include/mupdf/pdf/form.h
include/mupdf/pdf/javascript.h
source/pdf/pdf-form.c
source/pdf/pdf-js.c

index ad9b91f722a639a1bffb444c3736ec17d269a330..afbf528fb8c216b4806eb78278e4e575b4789955 100644 (file)
@@ -321,7 +321,7 @@ typedef struct
 } pdf_keystroke_event;
 
 int pdf_field_event_keystroke(fz_context *ctx, pdf_document *doc, pdf_obj *field, pdf_keystroke_event *evt);
-int pdf_field_event_validate(fz_context *ctx, pdf_document *doc, pdf_obj *field, const char *value);
+int pdf_field_event_validate(fz_context *ctx, pdf_document *doc, pdf_obj *field, const char *value, char **newvalue);
 void pdf_field_event_calculate(fz_context *ctx, pdf_document *doc, pdf_obj *field);
 char *pdf_field_event_format(fz_context *ctx, pdf_document *doc, pdf_obj *field);
 
index d9720f635aba89c74bdf29b2ee5343392e10ba27..5835af0efcb005a8b15798aec76122ee0aa713b2 100644 (file)
@@ -8,6 +8,7 @@ void pdf_drop_js(fz_context *ctx, pdf_js *js);
 
 void pdf_js_event_init(pdf_js *js, pdf_obj *target, const char *value, int willCommit);
 int pdf_js_event_result(pdf_js *js);
+int pdf_js_event_result_validate(pdf_js *js, char **newvalue);
 char *pdf_js_event_value(pdf_js *js);
 void pdf_js_event_init_keystroke(pdf_js *js, pdf_obj *target, pdf_keystroke_event *evt);
 int pdf_js_event_result_keystroke(pdf_js *js, pdf_keystroke_event *evt);
index 3fbba43ce72bff69805f8fdd0dbbf573f3d490f7..b7339bdb68dd079d5a2f75a5b5b0335905e07493 100644 (file)
@@ -638,13 +638,17 @@ enum pdf_widget_type pdf_widget_type(fz_context *ctx, pdf_widget *widget)
 
 static int set_validated_field_value(fz_context *ctx, pdf_document *doc, pdf_obj *field, const char *text, int ignore_trigger_events)
 {
+       char *newtext = NULL;
+
        if (!ignore_trigger_events)
        {
-               if (!pdf_field_event_validate(ctx, doc, field, text))
+               if (!pdf_field_event_validate(ctx, doc, field, text, &newtext))
                        return 0;
        }
 
-       update_field_value(ctx, doc, field, text);
+       update_field_value(ctx, doc, field, newtext ? newtext : text);
+
+       fz_free(ctx, newtext);
 
        return 1;
 }
@@ -2197,9 +2201,11 @@ char *pdf_field_event_format(fz_context *ctx, pdf_document *doc, pdf_obj *field)
        return NULL;
 }
 
-int pdf_field_event_validate(fz_context *ctx, pdf_document *doc, pdf_obj *field, const char *value)
+int pdf_field_event_validate(fz_context *ctx, pdf_document *doc, pdf_obj *field, const char *value, char **newvalue)
 {
        pdf_js *js = doc->js;
+
+       *newvalue = NULL;
        if (js)
        {
                pdf_obj *action = pdf_dict_getp_inheritable(ctx, field, "AA/V/JS");
@@ -2207,7 +2213,7 @@ int pdf_field_event_validate(fz_context *ctx, pdf_document *doc, pdf_obj *field,
                {
                        pdf_js_event_init(js, field, value, 1);
                        pdf_execute_js_action(ctx, doc, field, "AA/V/JS", action);
-                       return pdf_js_event_result(js);
+                       return pdf_js_event_result_validate(js, newvalue);
                }
        }
        return 1;
index 8f21162a4e0f7bccf4fd20c859253dce9bc4199c..4196c5cb4540c0bc78c33c740378619f1773f7ce 100644 (file)
@@ -880,6 +880,27 @@ int pdf_js_event_result(pdf_js *js)
        return rc;
 }
 
+int pdf_js_event_result_validate(pdf_js *js, char **newtext)
+{
+       int rc = 1;
+       *newtext = NULL;
+       if (js)
+       {
+               js_getglobal(js->imp, "event");
+               js_getproperty(js->imp, -1, "rc");
+               rc = js_tryboolean(js->imp, -1, 1);
+               js_pop(js->imp, 1);
+               if (rc)
+               {
+                       js_getproperty(js->imp, -1, "value");
+                       *newtext = fz_strdup(js->ctx, js_trystring(js->imp, -1, ""));
+                       js_pop(js->imp, 1);
+               }
+               js_pop(js->imp, 1);
+       }
+       return rc;
+}
+
 void pdf_js_event_init_keystroke(pdf_js *js, pdf_obj *target, pdf_keystroke_event *evt)
 {
        if (js)
@@ -1006,5 +1027,6 @@ int pdf_js_event_result_keystroke(pdf_js *js, pdf_keystroke_event *evt) { return
 int pdf_js_event_result(pdf_js *js) { return 1; }
 char *pdf_js_event_value(pdf_js *js) { return ""; }
 void pdf_js_execute(pdf_js *js, const char *name, const char *source) { }
+int pdf_js_event_result_validate(pdf_js *js, char **newvalue) { *newvalue=NULL; return 1; }
 
 #endif /* FZ_ENABLE_JS */