<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
<html>
<head>
<script src="../../../../resources/js-test-pre.js"></script>
</head>
<body>
<p id="description"></p>
<div id="console"></div>
<script src="resources/setup-file-input-element-for-drag.js"></script>
<script src="resources/temp-file-utils.js"></script>
<script>
description("Test for slicing a dragged file and sending it via XMLHttpRequest.");

var tempFileContent = "1234567890";
var tempFileName = "send-slice-dragged-file.tmp";
var subfile;

function uploadFile(file, filePath, start, length, expectedException)
{
    var xhr = new XMLHttpRequest();
    xhr.open("POST", "http://127.0.0.1:8000/resources/post-and-verify.cgi?path=" + filePath + "&start=" + start + "&length=" + length, false);

    var passed;
    var message;
    try {
        xhr.send(file);
        if (expectedException) {
            passed = false;
            message = "Unexpected response data received: " + xhr.responseText + ". Expecting exception thrown";
        } else {
            if (xhr.responseText == "OK") {
                passed = true;
                message = "Expected response data received: " + xhr.responseText;
            } else {
                passed = false;
                message = "Unexpected response data received: " + xhr.responseText;
            }
        }
    } catch (ex) {
        if (expectedException) {
            passed = true;
            message = "Expected exception thrown: " + ex;
        } else {
            passed = false;
            message = "Unexpected exception thrown: " + ex;
        }
    }

    if (passed)
        testPassed(message);
    else
        testFailed(message);
}

function computeExpectedLength(fileLength, start, length)
{
    var expectedLength = length;
    if (start + length > fileLength) {
        if (start >= fileLength)
            expectedLength = 0;
        else
            expectedLength = fileLength - start;
    }
    return expectedLength;
}

function onStableFileDrop(file, filePath, fileLength, start, length, contentType)
{
    // Slice the file.
    subfile = file.slice(start, start + length, contentType);
    shouldEvaluateTo("subfile.size", computeExpectedLength(fileLength, start, length));
    shouldBe("subfile.type", (contentType != undefined && contentType != null) ? '"' + contentType + '"' : '""');

    // Upload the sliced file.
    uploadFile(subfile, filePath, start, length, false);
}

function dragAndSliceStableFile(filePath, fileLength, start, length, contentType)
{
    setFileInputDropCallback(function(file) { onStableFileDrop(file, "../local/fileapi/" + filePath, fileLength, start, length, contentType); });
    eventSender.beginDragWithFiles([filePath]);
    moveMouseToCenterOfElement(fileInput);
    eventSender.mouseUp();
}

function onUnstableFileDrop(file, filePath, fileLength, start, length, contentType)
{
    // Slice the file.
    subfile = file.slice(start, start + length, contentType);
    shouldEvaluateTo("subfile.size", computeExpectedLength(fileLength, start, length));
    shouldBe("subfile.type", (contentType != undefined && contentType != null) ? '"' + contentType + '"' : '""');
  
    // Upload the sliced file.
    uploadFile(subfile, filePath, start, length, false);

    // Touch the underlying temp file.
    touchTempFile(tempFileName);
    
    // Upload the sliced file. We should receive an exception since the file has been changed.
    uploadFile(subfile, filePath, start, length, true);

    // Remove the temp file.
    removeTempFile(tempFileName);
}

function dragAndSliceUnstableFile(start, length, contentType)
{
    var tempFilePath = createTempFile(tempFileName, tempFileContent);
    if (tempFilePath.length == 0)
        return;

    setFileInputDropCallback(function(file) { onUnstableFileDrop(file, tempFilePath, tempFileContent.length, start, length, contentType); });
    eventSender.beginDragWithFiles([tempFilePath]);
    moveMouseToCenterOfElement(fileInput);
    eventSender.mouseUp();
}

function runTest()
{
    debug("Test slicing and sending an empty file.");
    dragAndSliceStableFile("../resources/empty.txt", 0, 0, 10);

    debug("Test slicing and sending a small file.");
    dragAndSliceStableFile("../resources/file-for-drag-to-send.txt", 10, 2, 4, null);
    dragAndSliceStableFile("../resources/file-for-drag-to-send.txt", 10, 2, 20, "type/foo");
    dragAndSliceStableFile("../resources/file-for-drag-to-send.txt", 10, 15, 20, "type/bar");

    // This is to test a file that exceeds the read buffer limit (2K in Mac).
    debug("Test slicing and sending a big file.");
    dragAndSliceStableFile("../resources/abe.png", 12242, 10, 40);
    dragAndSliceStableFile("../resources/abe.png", 12242, 10, 3000);
    dragAndSliceStableFile("../resources/abe.png", 12242, 3000, 15000);

    debug("Test slicing and sending a file that has been changed right before sending.");
    dragAndSliceUnstableFile(3, 5);
}

if (window.eventSender) {
    runTest();
    // Clean up after ourselves
    removeFileInputElement();
} else {
    testFailed("This test is not interactive, please run using DumpRenderTree");
}

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