Re: [patch] tell the selected submit button to the server

Kalle Olavi Niemitalo <[email protected]>
Newsgroups gmane.comp.web.links
Message-ID <[email protected]>
A revised patch, should compile better with CONFIG_ECMASCRIPT.
This is also at <http://www.iki.fi/kon/2006/elinks.git#submit-button>.

_______________________________________________
elinks-dev mailing list
[email protected]
http://linuxfromscratch.org/mailman/listinfo/elinks-dev
elinks.submit-button.diff (text/x-patch, 2.5 KB)
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);
signature.asc (application/pgp-signature, 188 B)
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.2 (GNU/Linux)

iD8DBQBD58+6Hm9IGt60eMgRAr4YAJ9CTrM+svTJS9j+xEjPvvreNeGVfQCeP9uX
JhpWvYCrL6o/LfKIJyKHVcY=
=89tT
-----END PGP SIGNATURE-----
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.