patch for <button> support for HTML::Form

Stefan Seifert <[email protected]>
Newsgroups gmane.comp.lang.perl.modules.lwp
Message-ID <[email protected]>
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Hi,

attached is a patch -p1 for libwww-perl-5.805 adding support for <button
type="submit"/> elements to HTML::Form. This allows me to correctly test
my forms using Test::WWW::Mechanize.

Included are three new tests for the following cases:
* multiple <button type="submit"> in one form
* <button> without type attribute (should default to submit)
* <button type="button"> (should not act as submit button)

Relevant standard:
http://www.w3.org/TR/html401/interact/forms.html#h-17.5

I hope I matched the coding style well enough and it works as good for
others as it does for me. Otherwise please feel free to criticise.

Regards,
Stefan Seifert
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.2 (GNU/Linux)
Comment: Using GnuPG with SUSE - http://enigmail.mozdev.org

iD8DBQFFQjSQ1QuEJQQMVrgRAqEMAJ9OPAvSlR21sydfQkoFeD7jaROwfwCeO+2D
POC6SjBtOXZrGhkZteguT1Y=
=uPz5
-----END PGP SIGNATURE-----
html-form-button.diff (text/x-patch, 2.5 KB)
diff -Naur libwww-perl-5.805/lib/HTML/Form.pm libwww-perl-5.805-html-form-button/lib/HTML/Form.pm
--- libwww-perl-5.805/lib/HTML/Form.pm	2005-12-07 15:32:27.000000000 +0100
+++ libwww-perl-5.805-html-form-button/lib/HTML/Form.pm	2006-10-27 18:13:01.000000000 +0200
@@ -17,7 +17,7 @@
  hidden   => "TextInput",
  textarea => "TextInput",
 
- button   => "IgnoreInput",
+ button   => "SubmitInput",
  "reset"  => "IgnoreInput",
 
  radio    => "ListInput",
@@ -117,7 +117,7 @@
     my $p = HTML::TokeParser->new(ref($html) ? $html->decoded_content(ref => 1) : \$html);
     eval {
 	# optimization
-	$p->report_tags(qw(form input textarea select optgroup option keygen label));
+	$p->report_tags(qw(form input textarea select optgroup option keygen label button));
     };
 
     my $base_uri = delete $opt{base};
@@ -183,6 +183,10 @@
 		    my $type = delete $attr->{type} || "text";
 		    $f->push_input($type, $attr);
 		}
+		elsif ($tag eq "button") {
+		    my $type = delete $attr->{type} || "submit";
+		    $f->push_input($type, $attr) if $type eq "submit";
+		}
 		elsif ($tag eq "textarea") {
 		    $attr->{textarea_value} = $attr->{value}
 		        if exists $attr->{value};
diff -Naur libwww-perl-5.805/t/html/form.t libwww-perl-5.805-html-form-button/t/html/form.t
--- libwww-perl-5.805/t/html/form.t	2005-12-07 15:28:58.000000000 +0100
+++ libwww-perl-5.805-html-form-button/t/html/form.t	2006-10-27 18:12:50.000000000 +0200
@@ -3,7 +3,7 @@
 use strict;
 use Test qw(plan ok);
 
-plan tests => 122;
+plan tests => 125;
 
 use HTML::Form;
 
@@ -503,3 +503,38 @@
 ok(join(":", $f->find_input("r2")->value_names), "two");
 ok(join(":", $f->find_input("r3")->value_names), "nested");
 ok(join(":", $f->find_input("r4")->value_names), "before and after");
+
+# test handling of the button element
+$f = HTML::Form->parse(<<'EOT', 'http://localhost/');
+<form action="">
+  <button type="submit" name="delete" value="1">Delete</button>
+  <button type="submit" name="save" value="1">Save</button>
+</form>
+EOT
+
+ok($f->click('save')->as_string, <<'EOT');
+GET http://localhost/?save=1
+
+EOT
+
+$f = HTML::Form->parse(<<'EOT', 'http://localhost/');
+<form action="">
+  <button name="save" value="1">Save</button>
+</form>
+EOT
+
+ok($f->click->as_string, <<'EOT');
+GET http://localhost/?save=1
+
+EOT
+
+$f = HTML::Form->parse(<<'EOT', 'http://localhost/');
+<form action="">
+  <button type="button" name="save" value="1">Save</button>
+</form>
+EOT
+
+ok($f->click->as_string, <<'EOT');
+GET http://localhost/
+
+EOT
html-form-button.diff.sig (application/pgp-signature, 65 B) - not displayed
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.