<!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.py", 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>

