<!DOCTYPE html>
<script src="../../resources/js-test.js"></script>
<script src="resources/shared.js"></script>
<input type="file" id="fileInput" multiple></input>
<script>
// This test cannot be a WPT because it uses the Blink specific APIs to
// automate file drag/drop.
description("Confirm basic Blob/File/FileList functionality.");
fileInput = document.getElementById("fileInput");
if (window.eventSender) {
var fileRect = fileInput.getClientRects()[0];
var targetX = fileRect.left + fileRect.width / 2;
var targetY = fileRect.top + fileRect.height / 2;
eventSender.beginDragWithFiles(['resources/test-data.html', 'resources/test-data.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 == test_content.length";
function testBlob()
{
preamble();
shouldBeTrue("FileReader != null");
evalAndLog("test_content = 'This is a test. This is only a test.'");
evalAndLog("blob = new Blob([test_content])");
validateResult("blob", blobValidation, testFile);
}
var fileValidation = ".name == fileInput.files[0].name";
function testFile()
{
preamble();
evalAndLog("file = fileInput.files[0]");
validateResult("file", fileValidation, testNewFile);
}
var newFileValidation = ".name == newFile.name";
function testNewFile()
{
debug("");
debug("testNewFile():");
evalAndLog("newFile = new File([test_content], 'filename', {type:'text/plain'})");
validateResult("newFile", newFileValidation, testFileList);
}
var fileListValidation = "[1].name == fileInput.files[1].name";
function testFileList()
{
preamble();
evalAndLog("filelist = fileInput.files");
validateResult("filelist",
fileListValidation, testCursor);
}
function testCursor()
{
preamble();
evalAndLog("transaction = db.transaction('storeName', 'readonly', {durability: 'relaxed'})");
transaction.onerror = unexpectedErrorCallback;
transaction.onabort = unexpectedAbortCallback;
evalAndLog("store = transaction.objectStore('storeName')");
evalAndLog("request = store.openCursor()");
var count = 0;
request.onsuccess = continueToTest;
function continueToTest(event)
{
cursor = event.target.result;
switch (count++) {
case 0:
shouldBeTrue("cursor.value" + blobValidation);
break;
case 1:
shouldBeTrue("cursor.value" + fileValidation);
break;
case 2:
shouldBeTrue("cursor.value" + fileListValidation);
break;
case 3:
shouldBeTrue("cursor.value == 'value'");
break;
case 4:
shouldBeTrue("cursor.value" + newFileValidation);
break;
case 5:
shouldBeNull("cursor");
finishJSTest();
return;
default:
testFailed("count was unexpectedly " + count);
}
evalAndLog("cursor.continue();");
}
}
function validateResult(variable, validation, onSuccess)
{
var keyName = variable + "key";
debug("");
debug("validateResult(" + variable + "):");
shouldBeTrue(variable + validation);
evalAndLog("transaction = db.transaction('storeName', 'readwrite', {durability: 'relaxed'})");
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', {durability: 'relaxed'})");
evalAndLog("store = transaction.objectStore('storeName')");
evalAndLog("request = store.get('" + keyName + "')");
request.onsuccess = onSuccess;
transaction.onerror = unexpectedErrorCallback;
transaction.onabort = unexpectedAbortCallback;
}
if (window.eventSender) {
indexedDBTest(prepareDatabase, testBlob);
} else {
alert("Select at least 2 files using the input control above to initiate the test");
document.getElementById("fileInput").onchange = function() { indexedDBTest(prepareDatabase, testBlob); };
}
</script>