<!doctype html>
<html lang=en>
<meta charset=utf-8>
<title>FormData: has</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
    <link rel="help" href="https://xhr.spec.whatwg.org/#dom-formdata-get" />
    <link rel="help" href="https://xhr.spec.whatwg.org/#dom-formdata-getall" />
<div id="log"></div>
<form id="form">
    <input type="hidden" name="key" value="value1">
    <input type="hidden" name="key" value="value2">
</form>
<form id="empty-form" />
<script>
    test(function() {
        assert_equals(create_formdata(['key', 'value1'], ['key', 'value2']).has('key'), true);
    }, 'testFormDataHas');
    test(function() {
        assert_equals(new FormData(document.getElementById('form')).has('key'), true);
    }, 'testFormDataHasFromForm');
    test(function() {
        assert_equals(new FormData(document.getElementById('form')).has('nil'), false);
    }, 'testFormDataHasFromFormNull');
    test(function() {
        assert_equals(new FormData(document.getElementById('empty-form')).has('key'), false);
    }, 'testFormDataHasFromEmptyForm');
    test(function() {
        assert_equals(create_formdata(['key', 'value1'], ['key', 'value2']).has('nil'), false);
    }, 'testFormDataHasEmpty1');
    test(function() {
        assert_equals(create_formdata().has('key'), false);
    }, 'testFormDataHasEmpty2');

    function create_formdata() {
        var fd = new FormData();
        for (var i = 0; i < arguments.length; i++) {
            fd.append.apply(fd, arguments[i]);
        };
        return fd;
    }
</script>
