Confirm basic Blob/File/FileList functionality.

On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".


dbname = "blob-basics-metadata.html"
indexedDB.deleteDatabase(dbname)
indexedDB.open(dbname)
store = db.createObjectStore('storeName')
store.put('value', 'key')

testBlob():
PASS FileReader != null is true
test_content = 'This is a test. This is only a test.'
blob = new Blob([test_content])

validateResult(blob):
PASS blob.size == test_content.length is true
transaction = db.transaction('storeName', 'readwrite')
store = transaction.objectStore('storeName')
store.put(blob, 'blobkey')
transaction = db.transaction('storeName', 'readwrite')
store = transaction.objectStore('storeName')
request = store.get('blobkey')
PASS event.target.result.size == test_content.length is true

testFile():
file = fileInput.files[0]

validateResult(file):
PASS file.name == fileInput.files[0].name is true
transaction = db.transaction('storeName', 'readwrite')
store = transaction.objectStore('storeName')
store.put(file, 'filekey')
transaction = db.transaction('storeName', 'readwrite')
store = transaction.objectStore('storeName')
request = store.get('filekey')
PASS event.target.result.name == fileInput.files[0].name is true

testNewFile():
newFile = new File([test_content], 'filename', {type:'text/plain'})

validateResult(newFile):
PASS newFile.name == newFile.name is true
transaction = db.transaction('storeName', 'readwrite')
store = transaction.objectStore('storeName')
store.put(newFile, 'newFilekey')
transaction = db.transaction('storeName', 'readwrite')
store = transaction.objectStore('storeName')
request = store.get('newFilekey')
PASS event.target.result.name == newFile.name is true

testFileList():
filelist = fileInput.files

validateResult(filelist):
PASS filelist[1].name == fileInput.files[1].name is true
transaction = db.transaction('storeName', 'readwrite')
store = transaction.objectStore('storeName')
store.put(filelist, 'filelistkey')
transaction = db.transaction('storeName', 'readwrite')
store = transaction.objectStore('storeName')
request = store.get('filelistkey')
PASS event.target.result[1].name == fileInput.files[1].name is true

testCursor():
transaction = db.transaction('storeName', 'readonly')
store = transaction.objectStore('storeName')
request = store.openCursor()
PASS cursor.value.size == test_content.length is true
cursor.continue();
PASS cursor.value.name == fileInput.files[0].name is true
cursor.continue();
PASS cursor.value[1].name == fileInput.files[1].name is true
cursor.continue();
PASS cursor.value == 'value' is true
cursor.continue();
PASS cursor.value.name == newFile.name is true
cursor.continue();
PASS cursor is null
PASS successfullyParsed is true

TEST COMPLETE

