A revised patch, should compile better with CONFIG_ECMASCRIPT. This is also at <http://www.iki.fi/kon/2006/elinks.git#submit-button>.
diff --git a/src/viewer/text/link.c b/src/viewer/text/link.c
index 019743f..70d6627 100644
--- a/src/viewer/text/link.c
+++ b/src/viewer/text/link.c
@@ -860,18 +860,28 @@ get_link_uri(struct session *ses, struct
}
}
-static void
-try_submit_given_form(struct session *ses, struct document_view *doc_view,
- struct form *form, int do_reload)
+static int
+call_onsubmit_and_submit(struct session *ses, struct document_view *doc_view,
+ struct form_control *fc, int do_reload)
{
+ struct uri *uri = NULL;
+ enum cache_mode mode = do_reload ? CACHE_MODE_FORCE_RELOAD : CACHE_MODE_NORMAL;
+
+ assert(fc->form); /* regardless of whether there is a FORM element */
+ if_assert_failed return 0;
+
#ifdef CONFIG_ECMASCRIPT
- if (form->onsubmit) {
+ /* If the form has multiple submit buttons, this does not
+ * explicitly tell the ECMAScript code which of them was
+ * pressed. W3C DOM Level 3 doesn't seem to include such a
+ * feature. */
+ if (fc->form->onsubmit) {
struct string code;
if (init_string(&code)) {
struct view_state *vs = doc_view->vs;
struct ecmascript_interpreter *interpreter;
- unsigned char *ret = form->onsubmit;
+ unsigned char *ret = fc->form->onsubmit;
int res;
if (vs->ecmascript_fragile)
@@ -883,14 +893,24 @@ try_submit_given_form(struct session *se
while ((ret = strstr(ret, "return ")))
while (*ret != ' ') *ret++ = ' ';
- add_to_string(&code, form->onsubmit);
+ add_to_string(&code, fc->form->onsubmit);
res = ecmascript_eval_boolback(interpreter, &code);
done_string(&code);
- if (!res) return;
+ /* If the user presses Enter in a text field,
+ * and document.browse.forms.auto_submit is
+ * true, and the form has an onsubmit script
+ * that returns false, then insert mode should
+ * end, so return 1 here rather than 0. */
+ if (!res) return 1;
}
}
-#endif
- submit_given_form(ses, doc_view, form, do_reload);
+#endif /* CONFIG_ECMASCRIPT */
+
+ uri = get_form_uri(ses, doc_view, fc);
+ if (!uri) return 0;
+ goto_uri_frame(ses, uri, fc->form->target, mode);
+ done_uri(uri);
+ return 1;
}
struct link *
@@ -907,10 +927,11 @@ goto_current_link(struct session *ses, s
if (link_is_form(link)) {
struct form_control *fc = link->data.form_control;
- struct form *form = fc->form;
- try_submit_given_form(ses, doc_view, form, do_reload);
- return link;
+ if (!call_onsubmit_and_submit(ses, doc_view, fc, do_reload))
+ return NULL;
+ else
+ return link;
} else
uri = get_link_uri(ses, doc_view, link);
pgp33Sz6M7sAJ.pgp
Description: PGP signature
_______________________________________________ elinks-dev mailing list [email protected] http://linuxfromscratch.org/mailman/listinfo/elinks-dev
