Index: LayoutTests/imported/web-platform-tests/html/semantics/forms/constraints/support/validator.js |
diff --git a/LayoutTests/imported/web-platform-tests/html/semantics/forms/constraints/support/validator.js b/LayoutTests/imported/web-platform-tests/html/semantics/forms/constraints/support/validator.js |
new file mode 100644 |
index 0000000000000000000000000000000000000000..12a88c1fc6eedc2ec71b1dc773dc779eb70a85d8 |
--- /dev/null |
+++ b/LayoutTests/imported/web-platform-tests/html/semantics/forms/constraints/support/validator.js |
@@ -0,0 +1,369 @@ |
+var validator = { |
+ test_tooLong: function(ctl, data) { |
+ var self = this; |
+ test(function () { |
+ self.pre_check(ctl, "tooLong"); |
+ self.set_conditions(ctl, data.conditions); |
+ if (data.dirty) |
+ self.set_dirty(ctl); |
+ |
+ if (data.expected) |
+ assert_true(ctl.validity.tooLong, "The validity.tooLong should be true."); |
+ else |
+ assert_false(ctl.validity.tooLong, "The validity.tooLong should be false."); |
+ }, data.name); |
+ }, |
+ |
+ test_tooShort: function(ctl, data) { |
+ var self = this; |
+ test(function () { |
+ self.pre_check(ctl, "tooShort"); |
+ self.set_conditions(ctl, data.conditions); |
+ if (data.dirty) |
+ self.set_dirty(ctl); |
+ |
+ if (data.expected) |
+ assert_true(ctl.validity.tooShort, "The validity.tooShort should be true."); |
+ else |
+ assert_false(ctl.validity.tooShort, "The validity.tooShort should be false."); |
+ }, data.name); |
+ }, |
+ |
+ test_patternMismatch: function(ctl, data) { |
+ var self = this; |
+ test(function () { |
+ self.pre_check(ctl, "patternMismatch"); |
+ self.set_conditions(ctl, data.conditions); |
+ |
+ if (data.expected) |
+ assert_true(ctl.validity.patternMismatch, "The validity.patternMismatch should be true."); |
+ else |
+ assert_false(ctl.validity.patternMismatch, "The validity.patternMismatch should be false."); |
+ }, data.name); |
+ }, |
+ |
+ test_valueMissing: function(ctl, data) { |
+ var self = this; |
+ test(function () { |
+ self.pre_check(ctl, "valueMissing"); |
+ self.set_conditions(ctl, data.conditions); |
+ if (data.expected) |
+ assert_true(ctl.validity.valueMissing, "The validity.valueMissing should be true."); |
+ else |
+ assert_false(ctl.validity.valueMissing, "The validity.valueMissing should be false."); |
+ }, data.name); |
+ }, |
+ |
+ test_typeMismatch: function(ctl, data) { |
+ var self = this; |
+ test(function () { |
+ self.pre_check(ctl, "typeMismatch"); |
+ self.set_conditions(ctl, data.conditions); |
+ |
+ if (data.expected) |
+ assert_true(ctl.validity.typeMismatch, "The validity.typeMismatch should be true."); |
+ else |
+ assert_false(ctl.validity.typeMismatch, "The validity.typeMismatch should be false."); |
+ }, data.name); |
+ }, |
+ |
+ test_rangeOverflow: function(ctl, data) { |
+ var self = this; |
+ test(function () { |
+ self.pre_check(ctl, "rangeOverflow"); |
+ self.set_conditions(ctl, data.conditions); |
+ |
+ if (data.expected) |
+ assert_true(ctl.validity.rangeOverflow, "The validity.rangeOverflow should be true."); |
+ else |
+ assert_false(ctl.validity.rangeOverflow, "The validity.rangeOverflow should be false."); |
+ }, data.name); |
+ }, |
+ |
+ test_rangeUnderflow: function(ctl, data) { |
+ var self = this; |
+ test(function () { |
+ self.pre_check(ctl, "rangeUnderflow"); |
+ self.set_conditions(ctl, data.conditions); |
+ if (data.expected) |
+ assert_true(ctl.validity.rangeUnderflow, "The validity.rangeUnderflow should be true."); |
+ else |
+ assert_false(ctl.validity.rangeUnderflow, "The validity.rangeUnderflow should be false."); |
+ }, data.name); |
+ }, |
+ |
+ test_stepMismatch: function(ctl, data) { |
+ var self = this; |
+ test(function () { |
+ self.pre_check(ctl, "stepMismatch"); |
+ self.set_conditions(ctl, data.conditions); |
+ |
+ if (data.expected) |
+ assert_true(ctl.validity.stepMismatch, "The validity.stepMismatch should be true."); |
+ else |
+ assert_false(ctl.validity.stepMismatch, "The validity.stepMismatch should be false."); |
+ }, data.name); |
+ }, |
+ |
+ test_badInput: function(ctl, data) { |
+ var self = this; |
+ test(function () { |
+ self.pre_check(ctl, "badInput"); |
+ self.set_conditions(ctl, data.conditions); |
+ |
+ if (data.expected) |
+ assert_true(ctl.validity.badInput, "The validity.badInput should be true."); |
+ else |
+ assert_false(ctl.validity.badInput, "The validity.badInput should be false."); |
+ }, data.name); |
+ }, |
+ |
+ test_customError: function(ctl, data) { |
+ var self = this; |
+ test(function () { |
+ self.pre_check(ctl, "customError"); |
+ ctl.setCustomValidity(data.conditions.message); |
+ |
+ if (data.expected) { |
+ assert_true(ctl.validity.customError, "The validity.customError attribute should be true."); |
+ assert_equals(ctl.validationMessage, data.conditions.message, |
+ "The validationMessage attribute should be '" + data.conditions.message + "'."); |
+ } else { |
+ assert_false(ctl.validity.customError, "The validity.customError attribute should be false."); |
+ assert_equals(ctl.validationMessage, "", "The validationMessage attribute must be empty."); |
+ } |
+ }, data.name); |
+ }, |
+ |
+ test_isValid: function (ctl, data) { |
+ var self = this; |
+ test(function () { |
+ self.set_conditions(ctl, data.conditions); |
+ if (data.dirty) |
+ self.set_dirty(ctl); |
+ |
+ if (data.expected) |
+ assert_true(ctl.validity.valid, "The validity.valid should be true."); |
+ else |
+ assert_false(ctl.validity.valid, "The validity.valid should be false."); |
+ }, data.name); |
+ }, |
+ |
+ test_willValidate: function(ctl, data) { |
+ var self = this; |
+ test(function () { |
+ self.pre_check(ctl, "willValidate"); |
+ self.set_conditions(ctl, data.conditions); |
+ if (data.ancestor) { |
+ var dl = document.createElement("datalist"); |
+ dl.appendChild(ctl); |
+ } |
+ |
+ if (data.expected) |
+ assert_true(ctl.willValidate, "The willValidate attribute should be true."); |
+ else |
+ assert_false(ctl.willValidate, "The willValidate attribute should be false."); |
+ }, data.name); |
+ }, |
+ |
+ test_checkValidity: function (ctl, data) { |
+ var self = this; |
+ test(function () { |
+ var eventFired = false; |
+ self.pre_check(ctl, "checkValidity"); |
+ self.set_conditions(ctl, data.conditions); |
+ if (data.dirty) |
+ self.set_dirty(ctl); |
+ |
+ on_event(ctl, "invalid", function(e){ |
+ assert_equals(e.type, "invalid", "The invalid event should be fired."); |
+ eventFired = true; |
+ }); |
+ |
+ if (data.expected) { |
+ assert_true(ctl.checkValidity(), "The checkValidity method should be true."); |
+ assert_false(eventFired, "The invalid event should not be fired."); |
+ } else { |
+ assert_false(ctl.checkValidity(), "The checkValidity method should be false."); |
+ assert_true(eventFired, "The invalid event should be fired."); |
+ } |
+ }, data.name); |
+ |
+ test(function () { |
+ var fm = document.createElement("form"); |
+ var ctl2 = ctl.cloneNode(true); |
+ |
+ self.pre_check(ctl, "checkValidity"); |
+ self.set_conditions(ctl2, data.conditions); |
+ fm.appendChild(ctl2); |
+ document.body.appendChild(fm); |
+ if (data.dirty) |
+ self.set_dirty(ctl2); |
+ |
+ var result = fm.checkValidity(); |
+ document.body.removeChild(fm); |
+ |
+ if (data.expected) |
+ assert_true(result, "The checkValidity method of the element's form owner should return true."); |
+ else |
+ assert_false(result, "The checkValidity method of the element's form owner should return false."); |
+ }, data.name + " (in a form)"); |
+ }, |
+ |
+ test_reportValidity: function (ctl, data) { |
+ var self = this; |
+ test(function () { |
+ var eventFired = false; |
+ |
+ self.pre_check(ctl, "reportValidity"); |
+ self.set_conditions(ctl, data.conditions); |
+ if (data.dirty) |
+ self.set_dirty(ctl); |
+ |
+ on_event(ctl, "invalid", function(e){ |
+ assert_equals(e.type, "invalid", "The invalid event should be fired."); |
+ eventFired = true; |
+ }); |
+ |
+ if (data.expected) { |
+ assert_true(ctl.reportValidity(), "The reportValidity method should be true."); |
+ assert_false(eventFired, "The invalid event should not be fired."); |
+ } else { |
+ assert_true(eventFired, "The invalid event should be fired."); |
+ assert_false(ctl.reportValidity(), "The reportValidity method should be false."); |
+ } |
+ }, data.name); |
+ |
+ test(function () { |
+ var fm = document.createElement("form"); |
+ var ctl2 = ctl.cloneNode(true); |
+ |
+ self.pre_check(ctl, "reportValidity"); |
+ self.set_conditions(ctl2, data.conditions); |
+ fm.appendChild(ctl2); |
+ document.body.appendChild(fm); |
+ if (data.dirty) |
+ self.set_dirty(ctl2); |
+ |
+ var result = fm.reportValidity(); |
+ document.body.removeChild(fm); |
+ |
+ if (data.expected) |
+ assert_true(result, "The reportValidity method of the element's form owner should return true."); |
+ else |
+ assert_false(result, "The reportValidity method of the element's form owner should return false."); |
+ }, data.name + " (in a form)"); |
+ }, |
+ |
+ test_support_type: function (ctl, typ, testName) { |
+ test(function () { |
+ assert_equals(ctl.type, typ, "The " + typ + " type should be supported."); |
+ }, testName); |
+ }, |
+ |
+ set_conditions: function (ctl, obj) { |
+ ["required", "pattern", "step", "max", "min", "maxlength", |
+ "value", "multiple", "checked", "selected"].forEach(function(item) { |
+ ctl.removeAttribute(item); |
+ }); |
+ for (var attr in obj) { |
+ if (obj[attr] || obj[attr] === "") |
+ ctl[attr] = obj[attr]; |
+ } |
+ }, |
+ |
+ set_dirty: function(ctl) { |
+ document.disgnMode = "on"; |
+ ctl.focus(); |
+ var old_value = ctl.value; |
+ ctl.value = "a"; |
+ ctl.value = old_value; |
+ ctl.setSelectionRange(ctl.value.length, ctl.value.length); |
+ document.execCommand("Delete"); |
+ document.disgnMode = "off"; |
+ }, |
+ |
+ pre_check: function(ctl, item) { |
+ switch (item) { |
+ case "willValidate": |
+ assert_true(item in ctl, "The " + item + " attribute doesn't exist."); |
+ break; |
+ case "checkValidity": |
+ case "reportValidity": |
+ assert_true(item in ctl, "The " + item + " method doesn't exist."); |
+ break; |
+ case "tooLong": |
+ case "tooShort": |
+ case "patternMismatch": |
+ case "typeMismatch": |
+ case "stepMismatch": |
+ case "rangeOverflow": |
+ case "rangeUnderflow": |
+ case "valueMissing": |
+ case "badInput": |
+ case "valid": |
+ assert_true("validity" in ctl, "The validity attribute doesn't exist."); |
+ assert_true(item in ctl.validity, "The " + item + " attribute doesn't exist."); |
+ break; |
+ case "customError": |
+ assert_true("validity" in ctl, "The validity attribute doesn't exist."); |
+ assert_true("setCustomValidity" in ctl, "The validity attribute doesn't exist."); |
+ assert_true("validationMessage" in ctl, "The validity attribute doesn't exist."); |
+ assert_true(item in ctl.validity, "The " + item + " attribute doesn't exist."); |
+ break; |
+ } |
+ }, |
+ |
+ run_test: function (testee, method) { |
+ var testMethod = "test_" + method; |
+ if (typeof this[testMethod] !== "function") { |
+ return false; |
+ } |
+ |
+ var ele = null, |
+ prefix = ""; |
+ |
+ for (var i = 0; i < testee.length; i++) { |
+ if (testee[i].types.length > 0) { |
+ for (var typ in testee[i].types) { |
+ ele = document.createElement(testee[i].tag); |
+ document.body.appendChild(ele); |
+ try { |
+ ele.type = testee[i].types[typ]; |
+ } catch (e) { |
+ //Do nothing, avoid the runtime error breaking the test |
+ } |
+ |
+ prefix = "[" + testee[i].tag.toUpperCase() + " in " + testee[i].types[typ].toUpperCase() + " status] "; |
+ if (ele.type != testee[i].types[typ]) { |
+ this.test_support_type( |
+ ele, |
+ testee[i].types[typ], |
+ prefix + "The " + testee[i].types[typ] + " type must be supported." |
+ ); |
+ continue; |
+ } |
+ |
+ for (var j = 0; j < testee[i].testData.length; j++) { |
+ testee[i].testData[j].name = testee[i].testData[j].name.replace(/\[.*\]\s/g, prefix); |
+ this[testMethod](ele, testee[i].testData[j]); |
+ } |
+ } |
+ } else { |
+ ele = document.createElement(testee[i].tag); |
+ document.body.appendChild(ele); |
+ prefix = "[" + testee[i].tag + "] "; |
+ |
+ if (testElements[i].tag === "select") { |
+ ele.add(new Option("test1", "")); |
+ ele.add(new Option("test2", 1)); |
+ } |
+ |
+ for (var item in testee[i].testData) { |
+ testee[i].testData[item].name = testee[i].testData[item].name.replace("[target]", prefix); |
+ this[testMethod](ele, testee[i].testData[item]); |
+ } |
+ } |
+ } |
+ } |
+} |