<!DOCTYPE html>
<title>Tests that the parameters to document.elementFromPoint() and
document.elementsFromPoint() are mandatory and of type double.</title>
<link rel="help" href="https://drafts.csswg.org/cssom-view/#extensions-to-the-document-interface">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script>
function validate_function_parameter_count(testFunc, funcName) {
    test(function() {
        assert_throws_js(TypeError, function() {
            testFunc();
        }, "Called with no parameter");
        assert_throws_js(TypeError, function() {
            testFunc(0);
        }, "Called with 1 parameter");
    }, funcName + ": Parameters are mandatory.");
}

function validate_function_parameter_type(testFunc, funcName) {
    test(function() {
        assert_throws_js(TypeError, function() {
            testFunc(0, Infinity);
        }, "Passing Infinity as second parameter throws");
        assert_throws_js(TypeError, function() {
            testFunc(Infinity, 0);
        }, "Passing Infinity as first parameter throws");
        assert_throws_js(TypeError, function() {
            testFunc(0, NaN);
        }, "Passing NaN as second parameter throws");
        assert_throws_js(TypeError, function() {
            testFunc(NaN, 0);
        }, "Passing NaN as first parameter throws");
    }, funcName + ": Parameters should be finite floating point values.");
}

validate_function_parameter_count(function(x, y) {
    document.elementFromPoint(x, y);
}, "document.elementFromPoint");

validate_function_parameter_type(function(x, y) {
    document.elementFromPoint(x, y);
}, "document.elementFromPoint");

validate_function_parameter_count(function(x, y) {
    document.elementsFromPoint(x, y);
}, "document.elementsFromPoint");

validate_function_parameter_type(function(x, y) {
    document.elementsFromPoint(x, y);
}, "document.elementsFromPoint");
</script>
