Source code

Revision control

Copy as Markdown

Other Tools

Test Info:

<!DOCTYPE HTML>
<html>
<!--
-->
<head>
<title>Test for Bug 635499</title>
<script src="/tests/SimpleTest/SimpleTest.js"></script>
<link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
</head>
<body>
<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=635499">Mozilla Bug 635499</a>
<p id="display"></p>
<div id="content" style="display: none">
</div>
<pre id="test">
<script type="application/javascript">
/** Test for Bug 635499 **/
var data = [
{ type: 'hidden', apply: false },
{ type: 'text', apply: false },
{ type: 'search', apply: false },
{ type: 'tel', apply: false },
{ type: 'url', apply: false },
{ type: 'email', apply: false },
{ type: 'password', apply: false },
{ type: 'date', apply: true },
{ type: 'month', apply: true },
{ type: 'week', apply: true },
{ type: 'time', apply: true },
{ type: 'datetime-local', apply: true },
{ type: 'number', apply: true },
{ type: 'range', apply: true },
{ type: 'color', apply: false },
{ type: 'checkbox', apply: false },
{ type: 'radio', apply: false },
{ type: 'file', apply: false },
{ type: 'submit', apply: false },
{ type: 'image', apply: false },
{ type: 'reset', apply: false },
{ type: 'button', apply: false },
];
var input = document.createElement("input");
document.getElementById('content').appendChild(input);
/**
* @aValidity - boolean indicating whether the element is expected to be valid
* (aElement.validity.valid is true) or not. The value passed is ignored and
* overridden with true if aApply is false.
* @aApply - boolean indicating whether the min/max attributes apply to this
* element type.
* @aRangeApply - A boolean that's set to true if the current input type is a
* "[candidate] for constraint validation" and it "[has] range limitations"
* (in other words, one of the pseudo classes :in-range and :out-of-range
* should apply (which, depends on aValidity)).
* Else (neither :in-range or :out-of-range should match) set to false.
*/
function checkValidity(aElement, aValidity, aApply, aRangeApply)
{
aValidity = aApply ? aValidity : true;
is(aElement.validity.valid, aValidity,
"element validity should be " + aValidity);
is(aElement.validity.rangeOverflow, !aValidity,
"element overflow status should be " + !aValidity);
var overflowMsg =
(aElement.type == "date" || aElement.type == "time" ||
aElement.type == "month" || aElement.type == "week" ||
aElement.type == "datetime-local") ?
("Please select a value that is no later than " + aElement.max + ".") :
("Please select a value that is no more than " + aElement.max + ".");
is(aElement.validationMessage,
aValidity ? "" : overflowMsg, "Checking range overflow validation message");
is(aElement.matches(":valid"), aElement.willValidate && aValidity,
(aElement.willValidate && aValidity) ? ":valid should apply" : "valid shouldn't apply");
is(aElement.matches(":invalid"), aElement.willValidate && !aValidity,
(aElement.wil && aValidity) ? ":invalid shouldn't apply" : "valid should apply");
if (!aRangeApply) {
ok(!aElement.matches(":in-range"), ":in-range should not match");
ok(!aElement.matches(":out-of-range"),
":out-of-range should not match");
} else {
is(aElement.matches(":in-range"), aValidity,
":in-range matches status should be " + aValidity);
is(aElement.matches(":out-of-range"), !aValidity,
":out-of-range matches status should be " + !aValidity);
}
}
for (var test of data) {
input.type = test.type;
var apply = test.apply;
// The element should be valid. Range should not apply when @min and @max are
// undefined, except if the input type is 'range' (since that type has a
// default minimum and maximum).
if (input.type == 'range') {
checkValidity(input, true, apply, true);
} else {
checkValidity(input, true, apply, false);
}
checkValidity(input, true, apply, test.type == 'range');
switch (input.type) {
case 'hidden':
case 'text':
case 'search':
case 'password':
case 'url':
case 'tel':
case 'email':
case 'number':
case 'checkbox':
case 'radio':
case 'file':
case 'submit':
case 'reset':
case 'button':
case 'image':
case 'color':
input.max = '-1';
break;
case 'date':
input.max = '2012-06-27';
break;
case 'time':
input.max = '02:20';
break;
case 'range':
// range is special, since setting max to -1 will make it invalid since
// it's default would then be 0, meaning it suffers from overflow.
input.max = '-1';
checkValidity(input, false, apply, apply);
// Now make it something that won't cause an error below:
input.max = '10';
break;
case 'month':
input.max = '2016-12';
break;
case 'week':
input.max = '2016-W39';
break;
case 'datetime-local':
input.max = '2016-12-31T23:59:59';
break;
default:
ok(false, 'please, add a case for this new type (' + input.type + ')');
}
checkValidity(input, true, apply, apply);
switch (input.type) {
case 'text':
case 'hidden':
case 'search':
case 'password':
case 'tel':
case 'radio':
case 'checkbox':
case 'reset':
case 'button':
case 'submit':
case 'image':
input.value = '0';
checkValidity(input, true, apply, apply);
break;
case 'url':
input.value = 'http://mozilla.org';
checkValidity(input, true, apply, apply);
break;
case 'email':
input.value = 'foo@bar.com';
checkValidity(input, true, apply, apply);
break;
case 'file':
var file = new File([''], '635499_file');
SpecialPowers.wrap(input).mozSetFileArray([file]);
checkValidity(input, true, apply, apply);
break;
case 'date':
input.max = '2012-06-27';
input.value = '2012-06-26';
checkValidity(input, true, apply, apply);
input.value = '2012-06-27';
checkValidity(input, true, apply, apply);
input.value = 'foo';
checkValidity(input, true, apply, apply);
input.value = '2012-06-28';
checkValidity(input, false, apply, apply);
input.max = '2012-06-30';
checkValidity(input, true, apply, apply);
input.value = '2012-07-05';
checkValidity(input, false, apply, apply);
input.value = '1000-01-01';
checkValidity(input, true, apply, apply);
input.value = '20120-01-01';
checkValidity(input, false, apply, apply);
input.max = '0050-01-01';
checkValidity(input, false, apply, apply);
input.value = '0049-01-01';
checkValidity(input, true, apply, apply);
input.max = '';
checkValidity(input, true, apply, false);
input.max = 'foo';
checkValidity(input, true, apply, false);
break;
case 'number':
input.max = '2';
input.value = '1';
checkValidity(input, true, apply, apply);
input.value = '2';
checkValidity(input, true, apply, apply);
input.value = 'foo';
checkValidity(input, true, apply, apply);
input.value = '3';
checkValidity(input, false, apply, apply);
input.max = '5';
checkValidity(input, true, apply, apply);
input.value = '42';
checkValidity(input, false, apply, apply);
input.max = '';
checkValidity(input, true, apply, false);
input.max = 'foo';
checkValidity(input, true, apply, false);
// Check that we correctly convert input.max to a double in validationMessage.
if (input.type == 'number') {
input.max = "4.333333333333333333333333333333333331";
input.value = "5";
is(input.validationMessage,
"Please select a value that is no more than 4.33333333333333.",
"validation message");
}
break;
case 'range':
input.max = '2';
input.value = '1';
checkValidity(input, true, apply, apply);
input.value = '2';
checkValidity(input, true, apply, apply);
input.value = 'foo';
checkValidity(input, true, apply, apply);
input.value = '3';
checkValidity(input, true, apply, apply);
is(input.value, input.max, "the value should have been set to max");
input.max = '5';
checkValidity(input, true, apply, apply);
input.value = '42';
checkValidity(input, true, apply, apply);
is(input.value, input.max, "the value should have been set to max");
input.max = '';
checkValidity(input, true, apply, apply);
input.max = 'foo';
checkValidity(input, true, apply, apply);
// Check that we correctly convert input.max to a double in validationMessage.
input.step = 'any';
input.min = 5;
input.max = 0.6666666666666666;
input.value = 1;
is(input.validationMessage,
"Please select a value that is no more than 0.666666666666667.",
"validation message")
break;
case 'time':
// Don't worry about that.
input.step = 'any';
input.max = '10:10';
input.value = '10:09';
checkValidity(input, true, apply, apply);
input.value = '10:10';
checkValidity(input, true, apply, apply);
input.value = '10:10:00';
checkValidity(input, true, apply, apply);
input.value = '10:10:00.000';
checkValidity(input, true, apply, apply);
input.value = 'foo';
checkValidity(input, true, apply, apply);
input.value = '10:11';
checkValidity(input, false, apply, apply);
input.value = '10:10:00.001';
checkValidity(input, false, apply, apply);
input.max = '01:00:00.01';
input.value = '01:00:00.001';
checkValidity(input, true, apply, apply);
input.value = '01:00:00';
checkValidity(input, true, apply, apply);
input.value = '01:00:00.1';
checkValidity(input, false, apply, apply);
input.max = '';
checkValidity(input, true, apply, false);
input.max = 'foo';
checkValidity(input, true, apply, false);
break;
case 'month':
input.value = '2016-06';
checkValidity(input, true, apply, apply);
input.value = '2016-12';
checkValidity(input, true, apply, apply);
input.value = 'foo';
checkValidity(input, true, apply, apply);
input.value = '2017-01';
checkValidity(input, false, apply, apply);
input.max = '2017-07';
checkValidity(input, true, apply, apply);
input.value = '2017-12';
checkValidity(input, false, apply, apply);
input.value = '1000-01';
checkValidity(input, true, apply, apply);
input.value = '20160-01';
checkValidity(input, false, apply, apply);
input.max = '0050-01';
checkValidity(input, false, apply, apply);
input.value = '0049-12';
checkValidity(input, true, apply, apply);
input.max = '';
checkValidity(input, true, apply, false);
input.max = 'foo';
checkValidity(input, true, apply, false);
break;
case 'week':
input.value = '2016-W01';
checkValidity(input, true, apply, apply);
input.value = '2016-W39';
checkValidity(input, true, apply, apply);
input.value = 'foo';
checkValidity(input, true, apply, apply);
input.value = '2017-W01';
checkValidity(input, false, apply, apply);
input.max = '2017-W01';
checkValidity(input, true, apply, apply);
input.value = '2017-W52';
checkValidity(input, false, apply, apply);
input.value = '1000-W01';
checkValidity(input, true, apply, apply);
input.value = '2100-W01';
checkValidity(input, false, apply, apply);
input.max = '0050-W01';
checkValidity(input, false, apply, apply);
input.value = '0049-W52';
checkValidity(input, true, apply, apply);
input.max = '';
checkValidity(input, true, apply, false);
input.max = 'foo';
checkValidity(input, true, apply, false);
break;
case 'datetime-local':
input.value = '2016-01-01T12:00';
checkValidity(input, true, apply, apply);
input.value = '2016-12-31T23:59:59';
checkValidity(input, true, apply, apply);
input.value = 'foo';
checkValidity(input, true, apply, apply);
input.value = '2016-12-31T23:59:59.123';
checkValidity(input, false, apply, apply);
input.value = '2017-01-01T10:00';
checkValidity(input, false, apply, apply);
input.max = '2017-01-01T10:00';
checkValidity(input, true, apply, apply);
input.value = '2017-01-01T10:00:30';
checkValidity(input, false, apply, apply);
input.value = '1000-01-01T12:00';
checkValidity(input, true, apply, apply);
input.value = '2100-01-01T12:00';
checkValidity(input, false, apply, apply);
input.max = '0050-12-31T23:59:59.999';
checkValidity(input, false, apply, apply);
input.value = '0050-12-31T23:59:59';
checkValidity(input, true, apply, apply);
input.max = '';
checkValidity(input, true, apply, false);
input.max = 'foo';
checkValidity(input, true, apply, false);
break;
}
// Cleaning up,
input.removeAttribute('max');
input.value = '';
}
</script>
</pre>
</body>
</html>