is(aElement.validity.valid, aValidity, "element validity should be " + aValidity);
is(aElement.validity.stepMismatch, !aValidity, "element step mismatch status should be " + !aValidity);
if (aValidity) {
is(aElement.validationMessage, "", "There should be no validation message.");
} else {
if (aElement.validity.rangeUnderflow) { var underflowMsg =
(aElement.type == "date" || aElement.type == "time") ?
("Please select a value that is no earlier than " + aElement.min + ".") :
("Please select a value that is no less than " + aElement.min + ".");
is(aElement.validationMessage, underflowMsg, "Checking range underflow validation message.");
} else if (aData.low == aData.high) {
is(aElement.validationMessage, "Please select a valid value. " + "The nearest valid value is " + aData.low + ".", "There should be a validation message.");
} else {
is(aElement.validationMessage, "Please select a valid value. " + "The two nearest valid values are " + aData.low + " and " + aData.high + ".", "There should be a validation message.");
}
}
// The element should be valid, there should be no step mismatch.
checkValidity(input, true, apply);
// Checks to do for all types that support step:
// - check for @step=0,
// - check for @step behind removed,
// - check for @step being 'any' with different case variations.
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':
case 'color': input.value = '0';
checkValidity(input, true, apply);
break;
case 'url': input.value = 'http://mozilla.org';
checkValidity(input, true, apply);
break;
case 'email': input.value = 'foo@bar.com';
checkValidity(input, true, apply);
break;
case 'file': var file = new File([''], '635499_file');
break;
case 'date':
// For date, the step is calulated on the timestamp since 1970-01-01
// which mean that for all dates prior to the epoch, this timestamp is < 0
// and the behavior might differ, therefore we have to test for these cases.
// When step is invalid, every date is valid input.step = 0; input.value = '2012-07-05';
checkValidity(input, true, apply);
// When min is set to a valid date, there is a step base. input.min = '2008-02-28'; input.step = '2'; input.value = '2008-03-01';
checkValidity(input, true, apply);
// When step is missing, the allowed step value is 1. input.removeAttribute('step'); input.value = '1.5';
checkValidity(input, false, apply, { low: 1, high: 2 });
// When min is set to NaN, there is no step base (step base=0 actually). input.min = 'foo'; input.step = '1'; input.value = '1';
checkValidity(input, true, apply);
// If there is a value defined but no min, the step base is the value. input = getFreshElement(test.type); input.setAttribute('value', '1'); input.step = 2;
checkValidity(input, true, apply);
// Check that when the higher value is higher than max, we don't show it. input = getFreshElement(test.type); input.step = '2'; input.min = '1'; input.max = '10.9'; input.value = '10';
is(input.validationMessage, "Please select a valid value. " + "The nearest valid value is 9.", "The validation message should not include the higher value.");
break;
case 'range':
// Range is special in that it clamps to valid values, so it is much
// rarer for it to be invalid.
// When step=0, the allowed value step is 1. input.step = '0'; input.value = '1.2';
is(input.value, '1', "check that the value changes to the nearest valid step, choosing the higher step if both are equally close");
checkValidity(input, true, apply);
input.value = '1';
is(input.value, '1', "check that the value coincides with a step");
checkValidity(input, true, apply);
input.value = '0';
is(input.value, '0', "check that the value coincides with a step");
checkValidity(input, true, apply);
// When step is NaN, the allowed step value is 1. input.step = 'foo'; input.value = '1';
is(input.value, '1', "check that the value coincides with a step");
checkValidity(input, true, apply);
input.value = '1.5';
is(input.value, '2', "check that the value changes to the nearest valid step, choosing the higher step if both are equally close");
checkValidity(input, true, apply);
// When step is negative, the allowed step value is 1. input.step = '-0.1';
is(input.value, '2', "check that the value still coincides with a step");
checkValidity(input, true, apply);
input.value = '1';
is(input.value, '1', "check that the value coincides with a step");
checkValidity(input, true, apply);
// When step is missing, the allowed step value is 1. input.removeAttribute('step'); input.value = '1.5';
is(input.value, '2', "check that the value changes to the nearest valid step, choosing the higher step if both are equally close");
checkValidity(input, true, apply);
input.value = '1';
is(input.value, '1', "check that the value coincides with a step");
checkValidity(input, true, apply);
// When step is 'any', all values are fine wrt to step. input.step = 'any';
checkValidity(input, true, apply);
input.step = 'aNy'; input.value = '97';
is(input.value, '97', "check that the value for step=aNy is unchanged");
checkValidity(input, true, apply);
input.step = 'AnY'; input.value = '0.1';
is(input.value, '0.1', "check that a positive fractional value with step=AnY is unchanged");
checkValidity(input, true, apply);
input.step = 'ANY'; input.min = -100; input.value = '-13.37';
is(input.value, '-13.37', "check that a negative fractional value with step=ANY is unchanged");
checkValidity(input, true, apply);
// When min is set to a valid float, there is a step base. input.min = '1'; // the step base input.step = '2'; input.value = '3';
is(input.value, '3', "check that the value coincides with a step");
checkValidity(input, true, apply);
input.value = '2';
is(input.value, '3', "check that the value changes to the nearest valid step, choosing the higher step if both are equally close");
checkValidity(input, true, apply);
input.value = '1.99';
is(input.value, '1', "check that the value changes to the nearest valid step, choosing the higher step if both are equally close");
checkValidity(input, true, apply);
input.removeAttribute('step'); // step = 1 input.min = '0.5'; // step base input.value = '5.5';
is(input.value, '5.5', "check that the value coincides with a step");
checkValidity(input, true, apply);
input.value = '1';
is(input.value, '1.5', "check that the value changes to the nearest valid step, choosing the higher step if both are equally close");
checkValidity(input, true, apply);
input.min = '-0.1'; // step base input.step = '1'; input.value = '0.9';
is(input.value, '0.9', "the value should be a valid step");
checkValidity(input, true, apply);
input.value = '0.1';
is(input.value, '-0.1', "check that the value changes to the nearest valid step, choosing the higher step if both are equally close");
checkValidity(input, true, apply);
// When min is set to NaN, the step base is the value. input.min = 'foo'; input.step = '1'; input.value = '1';
is(input.value, '1', "check that the value coincides with a step");
checkValidity(input, true, apply);
input.value = '0.5';
is(input.value, '1', "check that the value changes to the nearest valid step, choosing the higher step if both are equally close");
checkValidity(input, true, apply);
input.min = ''; input.value = '1';
is(input.value, '1', "check that the value coincides with a step");
checkValidity(input, true, apply);
input.value = '0.5';
is(input.value, '1', "check that the value changes to the nearest valid step, choosing the higher step if both are equally close");
checkValidity(input, true, apply);
input.removeAttribute('min');
// Test when the value isn't a number input.value = '';
is(input.value, '50', "value be should default to the value midway between the minimum (0) and the maximum (100)");
checkValidity(input, true, apply);
// Regular situations. input.step = '2'; input.value = '1.5';
is(input.value, '2', "check that the value changes to the nearest valid step, choosing the higher step if both are equally close");
checkValidity(input, true, apply);
input.value = '42.0';
is(input.value, '42.0', "check that the value coincides with a step");
checkValidity(input, true, apply);
input.step = '0.1'; input.value = '-0.1';
is(input.value, '0', "check that the value changes to the nearest valid step, choosing the higher step if both are equally close");
checkValidity(input, true, apply);
input.step = '2'; input.removeAttribute('min'); input.max = '10'; input.value = '-9';
is(input.value, '0', "check the value is clamped to the minimum's default of zero");
checkValidity(input, true, apply);
// If @value is defined but not @min, the step base is @value. input = getFreshElement(test.type); input.setAttribute('value', '1'); input.step = 2;
is(input.value, '1', "check that the value changes to the nearest valid step, choosing the higher step if both are equally close");
checkValidity(input, true, apply);
input.value = 3;
is(input.value, '3', "check that the value coincides with a step");
checkValidity(input, true, apply);
input.value = 2;
is(input.value, '3', "check that the value changes to the nearest valid step, choosing the higher step if both are equally close");
checkValidity(input, true, apply);
// Should also work with defaultValue. input = getFreshElement(test.type); input.defaultValue = 1; input.step = 2;
is(input.value, '1', "check that the value coincides with a step");
checkValidity(input, true, apply);
input.value = 3;
is(input.value, '3', "check that the value coincides with a step");
checkValidity(input, true, apply);
input.value = 2;
is(input.value, '3', "check that the value changes to the nearest valid step, choosing the higher step if both are equally close");
checkValidity(input, true, apply);
// Check contrived error case where there are no valid steps in range:
// No @min, so the step base is the default minimum, zero, the valid
// range is 0-1, -1 gets clamped to zero. input = getFreshElement(test.type); input.step = '3'; input.max = '1'; input.defaultValue = '-1';
is(input.value, '0', "the value should have been clamped to the default minimum, zero");
checkValidity(input, false, apply, {low: -1, high: -1});
// Check that when the closest of the two steps that the value is between
// is greater than the maximum we sanitize to the lower step. input = getFreshElement(test.type); input.step = '2'; input.min = '1'; input.max = '10.9'; input.value = '10.8'; // closest step in 11, but 11 > maximum
is(input.value, '9', "check that the value coincides with a step");
// The way that step base is defined, the converse (the value not being
// on a step, and the nearest step being a value that would be underflow)
// is not possible, so nothing to test there.
is(input.validationMessage, "", "The validation message should be empty.");
break;
case 'time':
// Tests invalid step values. That defaults to step = 1 minute (60). var values = [ '0', '-1', 'foo', 'any', 'ANY', 'aNy' ];
for (var value of values) { input.step = value; input.value = '19:06:00';
checkValidity(input, true, apply); input.value = '19:06:51';
if (value.toLowerCase() != 'any') {
checkValidity(input, false, apply, {low: '19:06', high: '19:07'});
} else {
checkValidity(input, true, apply);
}
}
// No step means that we use the default step value. input.removeAttribute('step'); input.value = '19:06:00';
checkValidity(input, true, apply); input.value = '19:06:51';
checkValidity(input, false, apply, {low: '19:06', high: '19:07'});
var type = test.type;
for (var test of tests) { varinput = getFreshElement(type); input.step = test.step; input.setAttribute('value', test.value);
if (test.min !== undefined) { input.min = test.min;
}
if (test.todo) {
todo(input.validity.valid, test.result, "This test should fail for the moment because of precission issues");
continue;
}
// When min is set to a valid month, there is a step base. input.min = '2000-01'; input.step = '2'; input.value = '2000-03';
checkValidity(input, true, apply);
// When min is set to a valid week, there is a step base. input.min = '2000-W01'; input.step = '2'; input.value = '2000-W03';
checkValidity(input, true, apply);
break;
case 'datetime-local':
// When step is invalid, every datetime is valid input.step = 0; input.value = '2017-02-06T12:00';
checkValidity(input, true, apply);
// When min is set to a valid datetime, there is a step base. input.min = '2017-01-01T00:00:00'; input.step = '2'; input.value = '2017-01-01T00:00:02';
checkValidity(input, true, apply);
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.