[patch] tell the selected submit button to the server

Kalle Olavi Niemitalo <[email protected]>
Newsgroups gmane.comp.web.links
Message-ID <[email protected]>
Commit 9cc9db4e24e54499e3736d14563ee2721012d724 broke submit
buttons on HTML forms, so that the server no longer knows which
button was actually pressed.  The attached patch fixes this. 

<kahmalo> In the current version 347970988d244afa226ceee6807bca9fbf3caeb3 plus
	  my incomplete accelerator-checking changes, editing a Wikipedia page
	  always seems to submit the "Show changes" button even if I select
	  "Save page" or "Show preview".				[19:18]
<pasky> and without your incomplete accelerator-checking changes? ;)	[19:19]
<kahmalo> I don't know, I didn't compile that tree.
<kahmalo> No such problem with 0.10.2, so not a server-side bug.	[19:21]
<kahmalo> But anyway my tree worked too until I merged from elinks.cz today.
									[19:23]
<kahmalo> And after that I've only edited po/perl/Locale/PO.pm which cannot
	  cause such a bug.						[19:24]
<pasky> ok, lemme try with stock git					[19:26]
<kahmalo> It fails too.							[19:33]
<pasky> pasky@machine[0:0]~/c.progs/elinks/elinks-elbuild$ src/elinks
	-no-connect							[19:40]
<pasky> /home/pasky/.elinks//elinks.conf:209: parse error
<pasky> /home/pasky/.elinks//elinks.conf:213: parse error
<pasky> ERROR: Unbound variable: goto-url-hooks
<pasky> hmm
<pasky> no luck for me?
<kahmalo> I'll track down the commit at which it begins to fail		[19:41]
<pasky> kahmalo: git bisect might be helpful				[19:44]
<kahmalo> pasky: thanks							[19:47]
<kahmalo> 9cc9db4e24e54499e3736d14563ee2721012d724 is first bad commit	[20:19]
<kahmalo> diff-tree 9cc9db4e24e54499e3736d14563ee2721012d724 (from
	  6e4c80a29ef5a35c35e4de6773aa74d9c9f6df9f)
<kahmalo> Author:  <witekfl@laptop.(none)>
<kahmalo> Date:   Sat Jan 28 11:17:22 2006 +0100
<kahmalo> 
<kahmalo>     Handling onsubmit
...
<kahmalo> The bug with forms seems to be that try_submit_given_form (in
	  src/viewer/text/link.c) is the only function that runs "onsubmit"
	  scripts, and it does not care which of the submit buttons was
	  pressed; it calls submit_given_form which submits based on the first
	  item of the form.						[20:57]
<kahmalo> or last, I don't know how the list works.
<kahmalo> try_submit_given_form could get the control via
	  get_current_link(doc_view) but I suppose it'd be cleaner to provide
	  that as a parameter.						[20:58]

_______________________________________________
elinks-dev mailing list
[email protected]
http://linuxfromscratch.org/mailman/listinfo/elinks-dev
elinks.submit-button.diff (text/x-patch, 2.1 KB)
diff --git a/src/viewer/text/link.c b/src/viewer/text/link.c
index b1e6865..b3d73c6 100644
--- a/src/viewer/text/link.c
+++ b/src/viewer/text/link.c
@@ -860,12 +860,22 @@ 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_or_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)) {
@@ -886,11 +896,21 @@ try_submit_given_form(struct session *se
 			add_to_string(&code, 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_or_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)

iD8DBQBD5mEeHm9IGt60eMgRAk7BAJ40nXZpciGNvzVZbxTHxd7I0x/IngCgl5eQ
6owhIVHM299oRGcBCxiW+aI=
=hnZt
-----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.