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', base => "http://localhost/", verbose => 1);
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=&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="/etc/passwd">
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);
261
ok($f->click->uri->query, "x=1&y=22&z=3");
267
ok($@ =~ /^Input 'y' is readonly/);
269
ok($input->readonly(0));
270
ok(!$input->readonly);
274
ok($f->click->uri->query, "x=1&y=222&z=3");
276
$input = $f->find_input("z");
277
ok($input->type, "hidden");
278
ok($input->readonly);
279
ok(!$input->disabled);
281
$f = HTML::Form->parse(<<EOT, "http://www.example.com");
283
<textarea name="t" type="hidden">
286
<select name=s value=s>
288
<option name=x value=bar type=x>Bar
292
ok($f->value("t"), "\n<foo>\n");
293
ok($f->value("s"), "Foo");
294
ok(join(":", $f->find_input("s")->possible_values), "Foo:bar");
295
ok(join(":", $f->find_input("s")->other_possible_values), "bar");
296
ok($f->value("s", "bar"), "Foo");
297
ok($f->value("s"), "bar");
298
ok(join(":", $f->find_input("s")->other_possible_values), "");
301
$f = HTML::Form->parse(<<EOT, base => "http://www.example.com", strict => 1);
304
<input type=radio name=r0 value=1 disabled>one
306
<input type=radio name=r1 value=1 disabled>one
307
<input type=radio name=r1 value=2>two
308
<input type=radio name=r1 value=3>three
310
<input type=radio name=r2 value=1>one
311
<input type=radio name=r2 value=2 disabled>two
312
<input type=radio name=r2 value=3>three
330
<select name=s3 disabled>
336
<select name=m0 multiple>
340
<select name=m1 multiple="">
346
<select name=m2 multiple>
352
<select name=m3 disabled multiple>
362
ok($f->find_input("r0")->disabled);
363
ok(!eval {$f->value("r0", 1);});
364
ok($@ && $@ =~ /^The value '1' has been disabled for field 'r0'/);
365
ok($f->find_input("r0")->disabled(0));
366
ok(!$f->find_input("r0")->disabled);
367
ok($f->value("r0", 1), undef);
368
ok($f->value("r0"), 1);
370
ok(!$f->find_input("r1")->disabled);
371
ok($f->value("r1", 2), undef);
372
ok($f->value("r1"), 2);
373
ok(!eval {$f->value("r1", 1);});
374
ok($@ && $@ =~ /^The value '1' has been disabled for field 'r1'/);
376
ok($f->value("r2", 1), undef);
377
ok(!eval {$f->value("r2", 2);});
378
ok($@ && $@ =~ /^The value '2' has been disabled for field 'r2'/);
379
ok(!eval {$f->value("r2", "two");});
380
ok($@ && $@ =~ /^The value 'two' has been disabled for field 'r2'/);
381
ok(!$f->find_input("r2")->disabled(1));
382
ok(!eval {$f->value("r2", 1);});
383
ok($@ && $@ =~ /^The value '1' has been disabled for field 'r2'/);
384
ok($f->find_input("r2")->disabled(0));
385
ok(!$f->find_input("r2")->disabled);
386
ok($f->value("r2", 2), 1);
388
ok($f->find_input("s0")->disabled);
389
ok(!$f->find_input("s1")->disabled);
390
ok(!$f->find_input("s2")->disabled);
391
ok($f->find_input("s3")->disabled);
393
ok(!eval {$f->value("s1", 1);});
394
ok($@ && $@ =~ /^The value '1' has been disabled for field 's1'/);
396
ok($f->find_input("m0")->disabled);
397
ok($f->find_input("m1", undef, 1)->disabled);
398
ok(!$f->find_input("m1", undef, 2)->disabled);
399
ok(!$f->find_input("m1", undef, 3)->disabled);
401
ok(!$f->find_input("m2", undef, 1)->disabled);
402
ok($f->find_input("m2", undef, 2)->disabled);
403
ok(!$f->find_input("m2", undef, 3)->disabled);
405
ok($f->find_input("m3", undef, 1)->disabled);
406
ok($f->find_input("m3", undef, 2)->disabled);
407
ok($f->find_input("m3", undef, 3)->disabled);
409
$f->find_input("m3", undef, 2)->disabled(0);
410
ok(!$f->find_input("m3", undef, 2)->disabled);
411
ok($f->find_input("m3", undef, 2)->value(2), undef);
412
ok($f->find_input("m3", undef, 2)->value(undef), 2);
414
$f->find_input("m3", undef, 2)->disabled(1);
415
ok($f->find_input("m3", undef, 2)->disabled);
416
ok(eval{$f->find_input("m3", undef, 2)->value(2)}, undef);
417
ok($@ && $@ =~ /^The value '2' has been disabled/);
418
ok(eval{$f->find_input("m3", undef, 2)->value(undef)}, undef);
419
ok($@ && $@ =~ /^The 'm3' field can't be unchecked/);
421
# multiple select with the same name [RT#18993]
422
$f = HTML::Form->parse(<<EOT, "http://localhost/");
423
<form action="target.html" method="get">
425
<option selected value=hi>hi
426
<option value=mom>mom
430
<option selected value=mom>mom
432
<select name="nobug">
434
<option selected value=mom>mom
437
ok(join("|", $f->form), "bug|hi|bug|mom|nobug|mom");
439
# Try a disabled radiobutton:
440
$f = HTML::Form->parse(<<EOT, "http://localhost/");
442
<input disabled checked type=radio name=f value=a>
443
<input type=hidden name=f value=b>
448
ok($f->click->as_string, <<'EOT');
449
GET http://localhost/?f=b
453
$f = HTML::Form->parse(<<EOT, "http://www.example.com");
454
<!-- from http://www.blooberry.com/indexdot/html/tagpages/k/keygen.htm -->
455
<form METHOD="post" ACTION="http://example.com/secure/keygen/test.cgi" ENCTYPE="application/x-www-form-urlencoded">
456
<keygen NAME="randomkey" CHALLENGE="1234567890">
457
<input TYPE="text" NAME="Field1" VALUE="Default Text">
461
ok($f->find_input("randomkey"));
462
ok($f->find_input("randomkey")->challenge, "1234567890");
463
ok($f->find_input("randomkey")->keytype, "rsa");
464
ok($f->click->as_string, <<EOT);
465
POST http://example.com/secure/keygen/test.cgi
467
Content-Type: application/x-www-form-urlencoded
472
$f->value(randomkey => "foo");
473
ok($f->click->as_string, <<EOT);
474
POST http://example.com/secure/keygen/test.cgi
476
Content-Type: application/x-www-form-urlencoded
478
randomkey=foo&Field1=Default+Text
481
$f = HTML::Form->parse(<<EOT, "http://www.example.com");
482
<form ACTION="http://example.com/">
491
ok($f->find_input("t"));
494
@f = HTML::Form->parse(<<EOT, "http://www.example.com");
495
<form ACTION="http://example.com/">
500
<form ACTION="http://example.com/">
506
ok($f[0]->find_input("s"));
507
ok($f[1]->find_input("t"));
509
$f = HTML::Form->parse(<<EOT, "http://www.example.com");
510
<form ACTION="http://example.com/">
512
<legend>Radio Buttons with Labels</legend>
514
<input type=radio name=r0 value=0 />zero
517
<input type=radio name=r1 value=1>
519
<label for="r2">two</label>
520
<input type=radio name=r2 id=r2 value=2>
523
<input type=radio name=r3 value=3>
527
and <input type=radio name=r4 value=4>
534
ok(join(":", $f->find_input("r0")->value_names), "zero");
535
ok(join(":", $f->find_input("r1")->value_names), "one");
536
ok(join(":", $f->find_input("r2")->value_names), "two");
537
ok(join(":", $f->find_input("r3")->value_names), "nested");
538
ok(join(":", $f->find_input("r4")->value_names), "before and after");
540
$f = HTML::Form->parse(<<EOT, "http://www.example.com");
544
<TD align="left" colspan="2">
545
Keep me informed on the progress of this election
546
<INPUT type="checkbox" id="keep_informed" name="keep_informed" value="yes" checked>
550
<TD align=left colspan=2>
551
<BR><B>The place you are registered to vote:</B>
555
<TD valign="middle" height="2" align="right">
556
<A name="Note1back">County or Parish</A>
559
<INPUT type="text" id="reg_county" size="40" name="reg_county" value="">
561
<TD align="left" width="10">
562
<A href="#Note2" class="c2" tabindex="-1">Note 2</A>
568
ok(join(":", $f->find_input("keep_informed")->value_names), "off:");
570
$f = HTML::Form->parse(<<EOT, "http://www.example.com");
571
<form action="test" method="post">
573
<option value="1">One</option>
574
<option value="2">Two</option>
575
<option disabled="disabled" value="3">Three</option>
577
<input type="submit" name="submit" value="Go">
582
ok(join(":", $f->find_input("test")->possible_values), "1:2");
583
ok(join(":", $f->find_input("test")->other_possible_values), "2");
586
$f = HTML::Form->parse(<<EOT, "http://www.example.com");
588
<select id="myselect">
591
<option>three</option>