<!DOCTYPE html>
<html>
<body>
<script src="../../resources/testharness.js"></script>
<script src="../../resources/testharnessreport.js"></script>
<p>Test that the parameter to setCustomValidity() is not nullable</p>
<script>
function testFormControl(control, name)
{
    test(() => {
        assert_true(control.checkValidity(), "Initial checkValidity()");
        assert_true(control.validity.valid, "Initial ValidityState.valid");
        assert_false(control.validity.customError, "Initial ValidityState.customError");
        assert_equals(control.validationMessage, "", "Initial validationMessage");

        control.setCustomValidity("error");
        assert_false(control.checkValidity(), "checkValidity() after setting custom validity message to 'error'");
        assert_false(control.validity.valid, "ValidityState.valid after setting custom validity message to 'error'");
        assert_true(control.validity.customError, "ValidityState.customError after setting custom validity message to 'error'");
        assert_equals(control.validationMessage, "error", "validationMessage after setting custom validity message to 'error'");

        control.setCustomValidity(null);
        assert_false(control.checkValidity(), "checkValidity() after setting custom validity message to null");
        assert_false(control.validity.valid, "ValidityState.valid after setting custom validity message to null");
        assert_true(control.validity.customError, "ValidityState.customError after setting custom validity message to null");
        assert_equals(control.validationMessage, "null", "validationMessage after setting custom validity message to null");

        control.setCustomValidity(undefined);
        assert_false(control.checkValidity(), "checkValidity() after setting custom validity message to undefined");
        assert_false(control.validity.valid, "ValidityState.valid after setting custom validity message to undefined");
        assert_true(control.validity.customError, "ValidityState.customError after setting custom validity message to undefined");
        assert_equals(control.validationMessage, "undefined", "validationMessage after setting custom validity message to undefined");

        control.setCustomValidity("");
        assert_true(control.checkValidity(), "checkValidity() after setting custom validity message to empty string");
        assert_true(control.validity.valid, "ValidityState.valid after setting custom validity message to empty string");
        assert_false(control.validity.customError, "ValidityState.customError after setting custom validity message to empty string");
        assert_equals(control.validationMessage, "", "validationMessage after setting custom validity message to empty string");
    }, name);
}

function testFormControlBarredFromValidation(control, name)
{
    test(() => {
        assert_true(control.checkValidity(), "Initial checkValidity()");
        assert_true(control.validity.valid, "Initial ValidityState.valid");
        assert_false(control.validity.customError, "Initial ValidityState.customError");
        assert_equals(control.validationMessage, "", "Initial validationMessage");

        control.setCustomValidity("error");
        assert_true(control.checkValidity(), "checkValidity() after setting custom validity message to 'error'");
        // Chrome 110 treats <object> differently here. Firefox 95 doesn't.
        assert_false(control.validity.valid, "ValidityState.valid after setting custom validity message to 'error'");
        assert_true(control.validity.customError, "ValidityState.customError after setting custom validity message to 'error'");
        assert_equals(control.validationMessage, "", "validationMessage after setting custom validity message to 'error'");

        control.setCustomValidity("");
        assert_true(control.checkValidity(), "checkValidity() after setting custom validity message to empty string");
        assert_true(control.validity.valid, "ValidityState.valid after setting custom validity message to empty string");
        assert_false(control.validity.customError, "ValidityState.customError after setting custom validity message to empty string");
        assert_equals(control.validationMessage, "", "validationMessage after setting custom validity message to empty string");
    }, name);
}

testFormControl(document.createElement("button"), "button Element");
testFormControl(document.createElement("input"), "input Element");
testFormControl(document.createElement("select"), "select Element");
testFormControl(document.createElement("textarea"), "textarea Element");

// The following controls are not validated in WebKit (only object seems to be barred from validation in the specification).
testFormControlBarredFromValidation(document.createElement("fieldset"), "fieldset Element");
testFormControlBarredFromValidation(document.createElement("object"), "object Element");
testFormControlBarredFromValidation(document.createElement("output"), "output Element");

</script>
</body>
</html>
