11 $SIG{__WARN__} = sub { push(@warn, $_[0]) };
13 my @f = HTML::Form->parse("", "http://localhost/");
16 @f = HTML::Form->parse(<<'EOT', "http://localhost/");
17 <form action="abc" name="foo">
26 ok($f->value("name"), "");
27 ok($f->dump, "GET http://localhost/abc [foo]\n name= (text)\n");
30 ok($req->method, "GET");
31 ok($req->uri, "http://localhost/abc?name=");
33 $f->value(name => "Gisle Aas");
35 ok($req->method, "GET");
36 ok($req->uri, "http://localhost/abc?name=Gisle+Aas");
38 ok($f->attr("name"), "foo");
39 ok($f->attr("method"), undef);
42 ok($f->method, "GET");
43 ok($f->action, "http://localhost/");
44 ok($f->enctype, "application/x-www-form-urlencoded");
45 ok($f->dump, "GET http://localhost/\n");
47 # try some more advanced inputs
48 $f = HTML::Form->parse(<<'EOT', "http://localhost/");
50 <input name=i type="image" src="foo.gif">
51 <input name=c type="checkbox" checked>
52 <input name=r type="radio" value="a">
53 <input name=r type="radio" value="b" checked>
54 <input name=t type="text">
55 <input name=p type="PASSWORD">
56 <input name=h type="hidden" value=xyzzy>
57 <input name=s type="submit" value="Doit!">
58 <input name=r type="reset">
59 <input name=b type="button">
60 <input name=f type="file" value="foo.txt">
61 <input name=x type="xyzzy">
69 <option value="bar" selected>Bar
72 <select name=m multiple>
73 <option selected value="a">Foo
74 <option selected value="b">Bar
80 #print $f->click->as_string;
82 ok($f->click->as_string, <<'EOT');
83 POST http://localhost/
85 Content-Type: application/x-www-form-urlencoded
87 i.x=1&i.y=1&c=on&r=b&t=&p=&h=xyzzy&f=foo.txt&x=&a=%0Aabc%0A+++&s=bar&m=a&m=b
91 ok($warn[0] =~ /^Unknown input type 'xyzzy'/);
94 $f = HTML::Form->parse(<<'EOT', "http://localhost/");
96 <input type=submit value="Upload it!" name=n disabled>
97 <input type=image alt="Foo">
98 <input type=text name=t value="1">
103 ok($f->click->as_string, <<'EOT');
104 GET http://localhost/?x=1&y=1&t=1
109 $f = HTML::Form->parse(<<'EOT', "http://localhost/");
110 <form method=post enctype="MULTIPART/FORM-DATA">
111 <input name=f type=file value=>
112 <input type=submit value="Upload it!">
117 #print $f->click->as_string;
119 ok($f->click->as_string, <<'EOT');
120 POST http://localhost/
122 Content-Type: multipart/form-data; boundary=none
126 my $filename = sprintf "foo-%08d.txt", $$;
129 open(FILE, ">$filename") || die;
131 print FILE "This is some text\n";
134 $f->value(f => $filename);
136 #print $f->click->as_string;
138 ok($f->click->as_string, <<"EOT");
139 POST http://localhost/
141 Content-Type: multipart/form-data; boundary=xYzZY
144 Content-Disposition: form-data; name="f"; filename="$filename"\r
145 Content-Type: text/plain\r
152 unlink($filename) || warn "Can't unlink '$filename': $!";
156 # Try to parse form HTTP::Response directly
160 require HTTP::Response;
161 @ISA = ('HTTP::Response');
163 sub base { "http://www.example.com" }
165 my $response = MyResponse->new(200, 'OK');
166 $response->content("<form><input type=text value=42 name=x></form>");
168 $f = HTML::Form->parse($response);
170 ok($f->click->as_string, <<"EOT");
171 GET http://www.example.com?x=42
175 $f = HTML::Form->parse(<<EOT, "http://www.example.com");
177 <input type=checkbox name=x> I like it!
181 $f->find_input("x")->check;
183 ok($f->click->as_string, <<"EOT");
184 GET http://www.example.com?x=on
188 $f->value("x", "off");
189 ok($f->click->as_string, <<"EOT");
190 GET http://www.example.com
194 $f->value("x", "I like it!");
195 ok($f->click->as_string, <<"EOT");
196 GET http://www.example.com?x=on
200 $f->value("x", "I LIKE IT!");
201 ok($f->click->as_string, <<"EOT");
202 GET http://www.example.com?x=on
206 $f = HTML::Form->parse(<<EOT, "http://www.example.com");
213 <select name=y multiple>
219 $f->value("x", "one");
221 ok($f->click->as_string, <<"EOT");
222 GET http://www.example.com?x=1
226 $f->value("x", "TWO");
227 ok($f->click->as_string, <<"EOT");
228 GET http://www.example.com?x=2
232 ok(join(":", $f->find_input("x")->value_names), "one:two:3");
233 ok(join(":", map $_->name, $f->find_input(undef, "option")), "x:y");
235 $f = HTML::Form->parse(<<EOT, "http://www.example.com");
237 <input name=x value=1 disabled>
238 <input name=y value=2 READONLY type=TEXT>
239 <input name=z value=3 type=hidden>
243 ok($f->value("x"), 1);
244 ok($f->value("y"), 2);
245 ok($f->value("z"), 3);
246 ok($f->click->uri->query, "y=2&z=3");
248 my $input = $f->find_input("x");
249 ok($input->type, "text");
250 ok(!$input->readonly);
251 ok($input->disabled);
252 ok($input->disabled(0));
253 ok(!$input->disabled);
254 ok($f->click->uri->query, "x=1&y=2&z=3");
256 $input = $f->find_input("y");
257 ok($input->type, "text");
258 ok($input->readonly);
259 ok(!$input->disabled);
262 ok($f->click->uri->query, "x=1&y=22&z=3");
264 ok($warn[0] =~ /^Input 'y' is readonly/);
267 ok($input->readonly(0));
268 ok(!$input->readonly);
273 ok($f->click->uri->query, "x=1&y=222&z=3");
275 $input = $f->find_input("z");
276 ok($input->type, "hidden");
277 ok($input->readonly);
278 ok(!$input->disabled);
280 $f = HTML::Form->parse(<<EOT, "http://www.example.com");
282 <textarea name="t" type="hidden">
285 <select name=s value=s>
287 <option name=x value=bar type=x>Bar
291 ok($f->value("t"), "\n<foo>\n");
292 ok($f->value("s"), "Foo");
293 ok(join(":", $f->find_input("s")->possible_values), "Foo:bar");
294 ok(join(":", $f->find_input("s")->other_possible_values), "bar");
295 ok($f->value("s", "bar"), "Foo");
296 ok($f->value("s"), "bar");
297 ok(join(":", $f->find_input("s")->other_possible_values), "");
300 $f = HTML::Form->parse(<<EOT, "http://www.example.com");
303 <input type=radio name=r0 value=1 disabled>one
305 <input type=radio name=r1 value=1 disabled>one
306 <input type=radio name=r1 value=2>two
307 <input type=radio name=r1 value=3>three
309 <input type=radio name=r2 value=1>one
310 <input type=radio name=r2 value=2 disabled>two
311 <input type=radio name=r2 value=3>three
329 <select name=s3 disabled>
335 <select name=m0 multiple>
339 <select name=m1 multiple="">
345 <select name=m2 multiple>
351 <select name=m3 disabled multiple>
361 ok($f->find_input("r0")->disabled);
362 ok(!eval {$f->value("r0", 1);});
363 ok($@ && $@ =~ /^The value '1' has been disabled for field 'r0'/);
364 ok($f->find_input("r0")->disabled(0));
365 ok(!$f->find_input("r0")->disabled);
366 ok($f->value("r0", 1), undef);
367 ok($f->value("r0"), 1);
369 ok(!$f->find_input("r1")->disabled);
370 ok($f->value("r1", 2), undef);
371 ok($f->value("r1"), 2);
372 ok(!eval {$f->value("r1", 1);});
373 ok($@ && $@ =~ /^The value '1' has been disabled for field 'r1'/);
375 ok($f->value("r2", 1), undef);
376 ok(!eval {$f->value("r2", 2);});
377 ok($@ && $@ =~ /^The value '2' has been disabled for field 'r2'/);
378 ok(!eval {$f->value("r2", "two");});
379 ok($@ && $@ =~ /^The value 'two' has been disabled for field 'r2'/);
380 ok(!$f->find_input("r2")->disabled(1));
381 ok(!eval {$f->value("r2", 1);});
382 ok($@ && $@ =~ /^The value '1' has been disabled for field 'r2'/);
383 ok($f->find_input("r2")->disabled(0));
384 ok(!$f->find_input("r2")->disabled);
385 ok($f->value("r2", 2), 1);
387 ok($f->find_input("s0")->disabled);
388 ok(!$f->find_input("s1")->disabled);
389 ok(!$f->find_input("s2")->disabled);
390 ok($f->find_input("s3")->disabled);
392 ok(!eval {$f->value("s1", 1);});
393 ok($@ && $@ =~ /^The value '1' has been disabled for field 's1'/);
395 ok($f->find_input("m0")->disabled);
396 ok($f->find_input("m1", undef, 1)->disabled);
397 ok(!$f->find_input("m1", undef, 2)->disabled);
398 ok(!$f->find_input("m1", undef, 3)->disabled);
400 ok(!$f->find_input("m2", undef, 1)->disabled);
401 ok($f->find_input("m2", undef, 2)->disabled);
402 ok(!$f->find_input("m2", undef, 3)->disabled);
404 ok($f->find_input("m3", undef, 1)->disabled);
405 ok($f->find_input("m3", undef, 2)->disabled);
406 ok($f->find_input("m3", undef, 3)->disabled);
408 $f->find_input("m3", undef, 2)->disabled(0);
409 ok(!$f->find_input("m3", undef, 2)->disabled);
410 ok($f->find_input("m3", undef, 2)->value(2), undef);
411 ok($f->find_input("m3", undef, 2)->value(undef), 2);
413 $f->find_input("m3", undef, 2)->disabled(1);
414 ok($f->find_input("m3", undef, 2)->disabled);
415 ok(eval{$f->find_input("m3", undef, 2)->value(2)}, undef);
416 ok($@ && $@ =~ /^The value '2' has been disabled/);
417 ok(eval{$f->find_input("m3", undef, 2)->value(undef)}, undef);
418 ok($@ && $@ =~ /^The 'm3' field can't be unchecked/);
420 # multiple select with the same name [RT#18993]
421 $f = HTML::Form->parse(<<EOT, "http://localhost/");
422 <form action="target.html" method="get">
424 <option selected value=hi>hi
425 <option value=mom>mom
429 <option selected value=mom>mom
431 <select name="nobug">
433 <option selected value=mom>mom
436 ok(join("|", $f->form), "bug|hi|bug|mom|nobug|mom");
438 # Try a disabled radiobutton:
439 $f = HTML::Form->parse(<<EOT, "http://localhost/");
441 <input disabled checked type=radio name=f value=a>
442 <input type=hidden name=f value=b>
447 ok($f->click->as_string, <<'EOT');
448 GET http://localhost/?f=b
452 $f = HTML::Form->parse(<<EOT, "http://www.example.com");
453 <!-- from http://www.blooberry.com/indexdot/html/tagpages/k/keygen.htm -->
454 <form METHOD="post" ACTION="http://example.com/secure/keygen/test.cgi" ENCTYPE="application/x-www-form-urlencoded">
455 <keygen NAME="randomkey" CHALLENGE="1234567890">
456 <input TYPE="text" NAME="Field1" VALUE="Default Text">
460 ok($f->find_input("randomkey"));
461 ok($f->find_input("randomkey")->challenge, "1234567890");
462 ok($f->find_input("randomkey")->keytype, "rsa");
463 ok($f->click->as_string, <<EOT);
464 POST http://example.com/secure/keygen/test.cgi
466 Content-Type: application/x-www-form-urlencoded
471 $f->value(randomkey => "foo");
472 ok($f->click->as_string, <<EOT);
473 POST http://example.com/secure/keygen/test.cgi
475 Content-Type: application/x-www-form-urlencoded
477 randomkey=foo&Field1=Default+Text
480 $f = HTML::Form->parse(<<EOT, "http://www.example.com");
481 <form ACTION="http://example.com/">
490 ok($f->find_input("t"));
493 @f = HTML::Form->parse(<<EOT, "http://www.example.com");
494 <form ACTION="http://example.com/">
499 <form ACTION="http://example.com/">
505 ok($f[0]->find_input("s"));
506 ok($f[1]->find_input("t"));
508 $f = HTML::Form->parse(<<EOT, "http://www.example.com");
509 <form ACTION="http://example.com/">
511 <legend>Radio Buttons with Labels</legend>
513 <input type=radio name=r0 value=0 />zero
516 <input type=radio name=r1 value=1>
518 <label for="r2">two</label>
519 <input type=radio name=r2 id=r2 value=2>
522 <input type=radio name=r3 value=3>
526 and <input type=radio name=r4 value=4>
533 ok(join(":", $f->find_input("r0")->value_names), "zero");
534 ok(join(":", $f->find_input("r1")->value_names), "one");
535 ok(join(":", $f->find_input("r2")->value_names), "two");
536 ok(join(":", $f->find_input("r3")->value_names), "nested");
537 ok(join(":", $f->find_input("r4")->value_names), "before and after");