<!DOCTYPE html>
<script src="../../../../resources/js-test.js"></script>
<script src="resources/shared.js"></script>
<input type="file" id="emptyFileInput"></input>
<input type="file" id="emptyFileListInput" multiple></input>
<script>

description("Confirm that IndexedDB can store an empty Blob/File/FileList");

var emptyFileInput = document.getElementById("emptyFileInput");
var emptyFileListInput = document.getElementById("emptyFileListInput");
if (window.eventSender) {
    var fileRect = emptyFileInput.getClientRects()[0];
    var targetX = fileRect.left + fileRect.width / 2;
    var targetY = fileRect.top + fileRect.height / 2;
    eventSender.beginDragWithFiles(['resources/empty.txt']);
    eventSender.mouseMoveTo(targetX, targetY);
    eventSender.mouseUp();
}

function prepareDatabase()
{
    db = event.target.result;
    var trans = event.target.transaction;
    evalAndLog("store = db.createObjectStore('storeName')");
    evalAndLog("store.put('value', 'key')");
    trans.onerror = unexpectedErrorCallback;
    trans.onabort = unexpectedAbortCallback;
}

var blobValidation = ".size == 0";
function testEmptyBlob()
{
    preamble();
    evalAndLog("blob = new Blob([])");
    validateResult("blob", blobValidation, testEmptyDataBlob);
}
function testEmptyDataBlob()
{
    preamble();
    evalAndLog("blob = new Blob(['', '', ''])");
    validateResult("blob", blobValidation, testEmptyNestedBlob);
}
function testEmptyNestedBlob()
{
    preamble();
    evalAndLog("blob = new Blob(['', new Blob([]), ''])");
    validateResult("blob", blobValidation, testEmptyNestedDataBlob);
}
function testEmptyNestedDataBlob()
{
    preamble();
    evalAndLog("blob = new Blob(['', new Blob(['']), ''])");
    validateResult("blob", blobValidation, testEmptyFileInsideBlob);
}
function testEmptyFileInsideBlob()
{
    preamble();
    evalAndLog("file = emptyFileInput.files[0]");
    evalAndLog("blob = new Blob(['', file, ''])");
    validateResult("blob", blobValidation, testEmptyFileInsideNestedBlob);
}
function testEmptyFileInsideNestedBlob()
{
    preamble();
    evalAndLog("file = emptyFileInput.files[0]");
    evalAndLog("blob = new Blob(['', new Blob([file]), ''])");
    validateResult("blob", blobValidation, testEmptyFile);
}

var fileValidation = ".size == 0";
function testEmptyFile()
{
    preamble();
    evalAndLog("file = emptyFileInput.files[0]");
    validateResult("file", fileValidation, testEmptyFileList);
}

var fileListValidation = ".length == 0";
function testEmptyFileList()
{
    preamble();
    evalAndLog("fileList = emptyFileListInput.files");
    validateResult("fileList",
        fileListValidation, finishJSTest);
}

function validateResult(variable, validation, onSuccess)
{
    var keyName = variable + "key";
    debug("");
    debug("validateResult(" + variable + "):");
    shouldBeTrue(variable + validation);
    evalAndLog("transaction = db.transaction('storeName', 'readwrite')");
    evalAndLog("store = transaction.objectStore('storeName')");
    evalAndLog("store.put(" + variable + ", '" + keyName + "')");
    transaction.onerror = unexpectedErrorCallback;
    transaction.onabort = unexpectedAbortCallback;
    var onGetSuccess = function (e) {
      shouldBeTrue("event.target.result" + validation);
      onSuccess();
    }
    transaction.oncomplete = function () {
      doRead(keyName, onGetSuccess);
    }
}

function doRead(keyName, onSuccess)
{
    evalAndLog("transaction = db.transaction('storeName', 'readwrite')");
    evalAndLog("store = transaction.objectStore('storeName')");
    evalAndLog("request = store.get('" + keyName + "')");
    request.onsuccess = onSuccess;
    transaction.onerror = unexpectedErrorCallback;
    transaction.onabort = unexpectedAbortCallback;
}

if (window.eventSender) {
    indexedDBTest(prepareDatabase, testEmptyBlob);
} else {
    alert("Select an empty file using the left input control above to initiate the test");
    document.getElementById("emptyFileInput").onchange = function() { indexedDBTest(prepareDatabase, testEmptyBlob); };
}
</script>
