<!DOCTYPE html>
<html>
<body>
<div>This tests the basic functionality and properties of DataTransferItems for files with drag and drop. This test requires DRT.</div>

<div id="destination" style="min-height:100px; border: solid 1px black">Drop files here if you test this manually</div>

<div id="console"></div>

<script>
var testFiles = [
  { path: 'resources/mozilla.gif',
    type: 'image/gif',
    size: 2593 },
  { path: 'resources/drop-file-svg.svg',
    type: 'image/svg+xml',
    size: 109 },
  { path: 'resources/copy-backslash-euc.html',
    type: 'text/html',
    size: 478 }
];

function log(text)
{
    var console = document.getElementById('console');
    console.appendChild(document.createTextNode(text));
    console.appendChild(document.createElement('br'));
}

function test(expect, actual)
{
    log((expect == actual ? 'PASS' : 'FAIL') + ': "' + expect + '" == "' + actual + '"');
}

function startTest()
{
    var destination = document.getElementById('destination');
    destination.addEventListener('dragover', handleDragOver, false);
    destination.addEventListener('drop', handleDrop, false);

    if (!window.testRunner)
        return;
    testRunner.waitUntilDone();
    testRunner.dumpAsText();

    var files = [];
    for (var i = 0; i < testFiles.length; ++i) {
      log('Dragging file: ' + testFiles[i].path);
      files.push(testFiles[i].path);
    }

    // Perform drag-and-drop with the testFiles.
    eventSender.beginDragWithFiles(files);
    eventSender.leapForward(500);
    eventSender.mouseMoveTo(destination.offsetLeft + 10, destination.offsetTop + destination.offsetHeight / 2);
    eventSender.mouseUp();
}

function handleDragOver(e)
{
    e.stopPropagation();
    e.preventDefault();
}

function handleDrop(e)
{
    e.stopPropagation();
    e.preventDefault();

    log('Verifying contents of DataTransferItems...');
    var items = e.dataTransfer.items;
    var files = [];
    test(testFiles.length, items.length);
    for (var i = 0; i < items.length; ++i) {
        // The items should be in the same order as we added.
        var expected = testFiles[i];

        var file = items[i].getAsFile();
        files.push(file);

        test('file', items[i].kind);
        test(expected.type, items[i].type);
        test(expected.type, file.type);
        test(expected.size, file.size);

        var components = expected.path.split('/');
        var name = components[components.length - 1];
        test(name, file.name);
    }

    testRunner.notifyDone();
}

startTest();

</script>
</body>
</html>
