<!DOCTYPE html>
<html>
<head>
<script src="../../../../resources/js-test-pre.js"></script>
<script src="../../../../resources/ui-helper.js"></script>
</head>
<body>
<p id="description"></p>
<div id="console"></div>
<script src="resources/send-form-data-common.js"></script>
<script>
description("Test that filename passed to FormData.append() takes precedence over filename in File, even if empty.");

self.jsTestIsAsync = true;

function onChange(event)
{
    var formData = new FormData;
    formData.append("file", event.target.files[0], "");
    var xhr = new XMLHttpRequest();
    xhr.open("POST", "http://127.0.0.1:8000/xmlhttprequest/resources/multipart-post-echo-filenames.php", true);
    xhr.onload = function() {
        filename = xhr.responseText;
        shouldBe("filename", "''");
        formDataTestingCleanup();
        finishJSTest();
    }

    xhr.send(formData);
}

function runTest()
{
    debug("Sending FormData containing one file with custom empty filename:");

    var input = document.getElementsByTagName("input")[0];
    input.onchange = onChange;
    if (window.testRunner) {
        testRunner.setOpenPanelFiles(['../resources/file-for-drag-to-send.txt']);

        var centerX = input.offsetLeft + input.offsetWidth / 2;
        var centerY = input.offsetTop + input.offsetHeight / 2;
        UIHelper.activateAt(centerX, centerY);
    }
}

if (window.testRunner)
    runTest();
else {
    debug("To run this test manually, please drag a file onto file input above");
    document.getElementsByTagName("input")[0].onchange = onChange;
}

var successfullyParsed = true;
</script>
<script src="../../../../resources/js-test-post.js"></script>
</body>
</html>

