| 2674 |
my ($self, $item, $element_state) = @_; |
my ($self, $item, $element_state) = @_; |
| 2675 |
|
|
| 2676 |
## TODO: Flag to enable/disable IDL checking? |
## TODO: Flag to enable/disable IDL checking? |
| 2677 |
my $class = $item->{node}->get_attribute ('class'); |
my $class = $item->{node}->get_attribute_ns (undef, 'class'); |
| 2678 |
if ($class =~ /\bidl(?>-code)?\b/) { ## TODO: use classList.has |
if ($class =~ /\bidl(?>-code)?\b/) { ## TODO: use classList.has |
| 2679 |
## NOTE: pre.idl: WHATWG, XHR, Selectors API, CSSOM specs |
## NOTE: pre.idl: WHATWG, XHR, Selectors API, CSSOM specs |
| 2680 |
## NOTE: pre.code > code.idl-code: WebIDL spec |
## NOTE: pre.code > code.idl-code: WebIDL spec |
| 4546 |
})->(@_); |
})->(@_); |
| 4547 |
|
|
| 4548 |
if ($has_name) { |
if ($has_name) { |
| 4549 |
my $id = $item->{node}->get_attribute ('id'); |
my $id = $item->{node}->get_attribute_ns (undef, 'id'); |
| 4550 |
if (defined $id and $has_name->[0] ne $id) { |
if (defined $id and $has_name->[0] ne $id) { |
| 4551 |
$self->{onerror}->(node => $item->{node}->get_attribute_node ('id'), |
$self->{onerror}->(node => $item->{node}->get_attribute_node ('id'), |
| 4552 |
type => 'id ne name', |
type => 'id ne name', |
| 5422 |
check_attrs => sub { |
check_attrs => sub { |
| 5423 |
my ($self, $item, $element_state) = @_; |
my ($self, $item, $element_state) = @_; |
| 5424 |
|
|
| 5425 |
my $state = $item->{node}->get_attribute ('type'); |
my $state = $item->{node}->get_attribute_ns (undef, 'type'); |
| 5426 |
$state = 'text' unless defined $state; |
$state = 'text' unless defined $state; |
| 5427 |
$state =~ tr/A-Z/a-z/; ## ASCII case-insensitive |
$state =~ tr/A-Z/a-z/; ## ASCII case-insensitive |
| 5428 |
|
|
| 5533 |
{ |
{ |
| 5534 |
value => sub { |
value => sub { |
| 5535 |
my ($self, $attr, $item, $element_state) = @_; |
my ($self, $attr, $item, $element_state) = @_; |
| 5536 |
my $name = $item->{node}->get_attribute ('name'); |
my $name = $item->{node}->get_attribute_ns (undef, 'name'); |
| 5537 |
if (defined $name and $name eq '_charset_') { ## case-sensitive |
if (defined $name and $name eq '_charset_') { ## case-sensitive |
| 5538 |
$self->{onerror}->(node => $attr, |
$self->{onerror}->(node => $attr, |
| 5539 |
type => '_charset_ value', |
type => '_charset_ value', |
| 5546 |
} elsif ($state eq 'password') { |
} elsif ($state eq 'password') { |
| 5547 |
$checker = |
$checker = |
| 5548 |
{ |
{ |
| 5549 |
## TODO: autocomplete |
autocomplete => $GetHTMLEnumeratedAttrChecker->({ |
| 5550 |
|
on => 1, off => 1, |
| 5551 |
|
}), |
| 5552 |
## TODO: maxlength |
## TODO: maxlength |
| 5553 |
## TODO: pattern |
## TODO: pattern |
| 5554 |
## TODO: readonly |
readonly => $GetHTMLBooleanAttrChecker->('readonly'), |
| 5555 |
## TODO: required |
## TODO: required |
| 5556 |
## TODO: size |
size => $GetHTMLNonNegativeIntegerAttrChecker->(sub { 1 }), |
| 5557 |
value => sub { |
value => sub { |
| 5558 |
## NOTE: No restriction. |
## NOTE: No restriction. |
| 5559 |
## TODO: Warn if it contains CR or LF? |
## TODO: Warn if it contains CR or LF? |
| 5562 |
} elsif ($state eq 'datetime') { |
} elsif ($state eq 'datetime') { |
| 5563 |
$checker = |
$checker = |
| 5564 |
{ |
{ |
| 5565 |
## TODO: autocomplete |
autocomplete => $GetHTMLEnumeratedAttrChecker->({ |
| 5566 |
|
on => 1, off => 1, |
| 5567 |
|
}), |
| 5568 |
## TODO: list |
## TODO: list |
| 5569 |
## TODO: max |
## TODO: max |
| 5570 |
## TODO: min |
## TODO: min |
| 5571 |
## TODO: readonly |
readonly => $GetHTMLBooleanAttrChecker->('readonly'), |
| 5572 |
## TODO: required |
## TODO: required |
| 5573 |
## TODO: step |
## TODO: step |
| 5574 |
value => sub { |
value => sub { |
| 5579 |
} elsif ($state eq 'date') { |
} elsif ($state eq 'date') { |
| 5580 |
$checker = |
$checker = |
| 5581 |
{ |
{ |
| 5582 |
## TODO: autocomplete |
autocomplete => $GetHTMLEnumeratedAttrChecker->({ |
| 5583 |
|
on => 1, off => 1, |
| 5584 |
|
}), |
| 5585 |
## TODO: list |
## TODO: list |
| 5586 |
## TODO: max |
## TODO: max |
| 5587 |
## TODO: min |
## TODO: min |
| 5588 |
## TODO: readonly |
readonly => $GetHTMLBooleanAttrChecker->('readonly'), |
| 5589 |
## TODO: required |
## TODO: required |
| 5590 |
## TODO: step |
## TODO: step |
| 5591 |
value => sub { |
value => sub { |
| 5596 |
} elsif ($state eq 'month') { |
} elsif ($state eq 'month') { |
| 5597 |
$checker = |
$checker = |
| 5598 |
{ |
{ |
| 5599 |
## TODO: autocomplete |
autocomplete => $GetHTMLEnumeratedAttrChecker->({ |
| 5600 |
|
on => 1, off => 1, |
| 5601 |
|
}), |
| 5602 |
## TODO: list |
## TODO: list |
| 5603 |
## TODO: max |
## TODO: max |
| 5604 |
## TODO: min |
## TODO: min |
| 5605 |
## TODO: readonly |
readonly => $GetHTMLBooleanAttrChecker->('readonly'), |
| 5606 |
## TODO: required |
## TODO: required |
| 5607 |
## TODO: step |
## TODO: step |
| 5608 |
value => sub { |
value => sub { |
| 5613 |
} elsif ($state eq 'week') { |
} elsif ($state eq 'week') { |
| 5614 |
$checker = |
$checker = |
| 5615 |
{ |
{ |
| 5616 |
## TODO: autocomplete |
autocomplete => $GetHTMLEnumeratedAttrChecker->({ |
| 5617 |
|
on => 1, off => 1, |
| 5618 |
|
}), |
| 5619 |
## TODO: list |
## TODO: list |
| 5620 |
## TODO: max |
## TODO: max |
| 5621 |
## TODO: min |
## TODO: min |
| 5622 |
## TODO: readonly |
readonly => $GetHTMLBooleanAttrChecker->('readonly'), |
| 5623 |
## TODO: required |
## TODO: required |
| 5624 |
## TODO: step |
## TODO: step |
| 5625 |
value => sub { |
value => sub { |
| 5630 |
} elsif ($state eq 'time') { |
} elsif ($state eq 'time') { |
| 5631 |
$checker = |
$checker = |
| 5632 |
{ |
{ |
| 5633 |
## TODO: autocomplete |
autocomplete => $GetHTMLEnumeratedAttrChecker->({ |
| 5634 |
|
on => 1, off => 1, |
| 5635 |
|
}), |
| 5636 |
## TODO: list |
## TODO: list |
| 5637 |
## TODO: max |
## TODO: max |
| 5638 |
## TODO: min |
## TODO: min |
| 5639 |
## TODO: readonly |
readonly => $GetHTMLBooleanAttrChecker->('readonly'), |
| 5640 |
## TODO: required |
## TODO: required |
| 5641 |
## TODO: step |
## TODO: step |
| 5642 |
value => sub { |
value => sub { |
| 5647 |
} elsif ($state eq 'datetime-local') { |
} elsif ($state eq 'datetime-local') { |
| 5648 |
$checker = |
$checker = |
| 5649 |
{ |
{ |
| 5650 |
## TODO: autocomplete |
autocomplete => $GetHTMLEnumeratedAttrChecker->({ |
| 5651 |
|
on => 1, off => 1, |
| 5652 |
|
}), |
| 5653 |
## TODO: list |
## TODO: list |
| 5654 |
## TODO: max |
## TODO: max |
| 5655 |
## TODO: min |
## TODO: min |
| 5656 |
## TODO: readonly |
readonly => $GetHTMLBooleanAttrChecker->('readonly'), |
| 5657 |
## TODO: required |
## TODO: required |
| 5658 |
## TODO: step |
## TODO: step |
| 5659 |
value => sub { |
value => sub { |
| 5664 |
} elsif ($state eq 'number') { |
} elsif ($state eq 'number') { |
| 5665 |
$checker = |
$checker = |
| 5666 |
{ |
{ |
| 5667 |
## TODO: autocomplete |
autocomplete => $GetHTMLEnumeratedAttrChecker->({ |
| 5668 |
|
on => 1, off => 1, |
| 5669 |
|
}), |
| 5670 |
## TODO: list |
## TODO: list |
| 5671 |
max => $GetHTMLFloatingPointNumberAttrChecker->(sub { 1 }), |
max => $GetHTMLFloatingPointNumberAttrChecker->(sub { 1 }), |
| 5672 |
min => $GetHTMLFloatingPointNumberAttrChecker->(sub { 1 }), |
min => $GetHTMLFloatingPointNumberAttrChecker->(sub { 1 }), |
| 5673 |
## TODO: min & max tests |
## TODO: min & max tests |
| 5674 |
## TODO: readonly |
readonly => $GetHTMLBooleanAttrChecker->('readonly'), |
| 5675 |
## TODO: required |
## TODO: required |
| 5676 |
## TODO: step |
## TODO: step |
| 5677 |
value => sub { |
value => sub { |
| 5682 |
} elsif ($state eq 'range') { |
} elsif ($state eq 'range') { |
| 5683 |
$checker = |
$checker = |
| 5684 |
{ |
{ |
| 5685 |
## TODO: autocomplete |
autocomplete => $GetHTMLEnumeratedAttrChecker->({ |
| 5686 |
|
on => 1, off => 1, |
| 5687 |
|
}), |
| 5688 |
## TODO: list |
## TODO: list |
| 5689 |
max => $GetHTMLFloatingPointNumberAttrChecker->(sub { 1 }), |
max => $GetHTMLFloatingPointNumberAttrChecker->(sub { 1 }), |
| 5690 |
min => $GetHTMLFloatingPointNumberAttrChecker->(sub { 1 }), |
min => $GetHTMLFloatingPointNumberAttrChecker->(sub { 1 }), |
| 5769 |
align => $GetHTMLEnumeratedAttrChecker->({ |
align => $GetHTMLEnumeratedAttrChecker->({ |
| 5770 |
top => 1, middle => 1, bottom => 1, left => 1, right => 1, |
top => 1, middle => 1, bottom => 1, left => 1, right => 1, |
| 5771 |
}), |
}), |
|
## NOTE: HTML4 has a "should" for accessibility, which |
|
|
## cannot be tested here. |
|
|
autocomplete => $GetHTMLEnumeratedAttrChecker->({on => 1, off => 1}), |
|
| 5772 |
checked => $GetHTMLBooleanAttrChecker->('checked'), |
checked => $GetHTMLBooleanAttrChecker->('checked'), |
| 5773 |
enctype => $HTMLIMTAttrChecker, |
enctype => $HTMLIMTAttrChecker, |
| 5774 |
## TODO: inputmode [WF2] |
## TODO: inputmode [WF2] |
| 5775 |
ismap => $GetHTMLBooleanAttrChecker->('ismap'), |
ismap => $GetHTMLBooleanAttrChecker->('ismap'), |
|
## TODO: list [WF2] |
|
|
## TODO: max [WF2] |
|
| 5776 |
maxlength => $GetHTMLNonNegativeIntegerAttrChecker->(sub { 1 }), |
maxlength => $GetHTMLNonNegativeIntegerAttrChecker->(sub { 1 }), |
| 5777 |
method => $GetHTMLEnumeratedAttrChecker->({ |
method => $GetHTMLEnumeratedAttrChecker->({ |
| 5778 |
get => 1, post => 1, put => 1, delete => 1, |
get => 1, post => 1, put => 1, delete => 1, |
| 5779 |
}), |
}), |
|
## TODO: min [WF2] |
|
| 5780 |
onformchange => $HTMLEventHandlerAttrChecker, |
onformchange => $HTMLEventHandlerAttrChecker, |
| 5781 |
onforminput => $HTMLEventHandlerAttrChecker, |
onforminput => $HTMLEventHandlerAttrChecker, |
| 5782 |
oninput => $HTMLEventHandlerAttrChecker, |
oninput => $HTMLEventHandlerAttrChecker, |
| 5783 |
oninvalid => $HTMLEventHandlerAttrChecker, |
oninvalid => $HTMLEventHandlerAttrChecker, |
|
## TODO: pattern |
|
|
readonly => $GetHTMLBooleanAttrChecker->('readonly'), |
|
| 5784 |
replace => $GetHTMLEnumeratedAttrChecker->({document => 1, values => 1}), |
replace => $GetHTMLEnumeratedAttrChecker->({document => 1, values => 1}), |
| 5785 |
required => $GetHTMLBooleanAttrChecker->('required'), |
required => $GetHTMLBooleanAttrChecker->('required'), |
|
size => $GetHTMLNonNegativeIntegerAttrChecker->(sub { 1 }), |
|
|
## TODO: step [WF2] |
|
| 5786 |
target => $HTMLTargetAttrChecker, |
target => $HTMLTargetAttrChecker, |
| 5787 |
usemap => $HTMLUsemapAttrChecker, |
usemap => $HTMLUsemapAttrChecker, |
|
value => sub {}, ## NOTE: CDATA [M12N] ## TODO: "optional |
|
|
## except when the type attribute has |
|
|
## the value "radio" or "checkbox"" |
|
|
## [HTML4] TODO: constraints [WF2] TODO: |
|
|
## "authors should ensure that in each |
|
|
## set of radio buttons that one is |
|
|
## initially "on"." [HTML4] [WF2] |
|
| 5788 |
|
|
| 5789 |
## TODO: autocomplete |
|
| 5790 |
|
autocomplete => $GetHTMLEnumeratedAttrChecker->({ |
| 5791 |
|
on => 1, off => 1, |
| 5792 |
|
}), |
| 5793 |
## TODO: list |
## TODO: list |
| 5794 |
## TODO: maxlength |
## TODO: maxlength |
| 5795 |
## TODO: pattern |
## TODO: pattern |
| 5796 |
## TODO: readonly |
readonly => $GetHTMLBooleanAttrChecker->('readonly'), |
| 5797 |
## TODO: required |
## TODO: required |
| 5798 |
## TODO: size |
size => $GetHTMLNonNegativeIntegerAttrChecker->(sub { 1 }), |
| 5799 |
value => sub { |
value => sub { |
| 5800 |
## NOTE: No restriction. |
## NOTE: No restriction. |
| 5801 |
## TODO: Warn if it contains CR or LF? |
## TODO: Warn if it contains CR or LF? |