function stringifyObj(o)
{
s = "";
if (o)
for (index in o) {
s += index + ": " + o[index] + ";";
}
return s;
}
function onError(e)
{
testFailed("Got error: " + stringifyObj(e));
cleanUp();
}
function assert(s)
{
if (!s) {
var e = new Error("Assertion failed. ");
onError(e);
throw e;
}
}
var fileEntryForCleanup; // Set as soon as we have one.
function cleanUp()
{
if (fileEntryForCleanup) {
try {
fileEntryForCleanup.remove(finishJSTest, finishJSTest);
return;
} catch (ex) {
}
}
finishJSTest();
}
// Generic function that gets a File from a FileEntry and calls a custom verification function on it.
function verifyFileContents(fileEntry, verifyFunc, arg0, arg1, onSuccess)
{
fileEntry.file(
function(file) {
verifyFunc(file, arg0, arg1, onSuccess);
},
onError);
}
// Helper function used with verifyFileContents.
function verifyFileLengthHelper(file, length, unused, onSuccess)
{
assert(file.size == length);
onSuccess();
}
// Verifies that the contents of fileEntry have the supplied length.
function verifyFileLength(fileEntry, length, onSuccess)
{
verifyFileContents(fileEntry, verifyFileLengthHelper, length, null, onSuccess);
}
// Helper function used with verifyFileContents.
function verifyByteRangeIsZeroesHelper(file, start, length, onSuccess)
{
var fileReader = new FileReader();
fileReader.onerror = onError;
fileReader.onload =
function() {
var result = fileReader.result;
for (var i = 0; i < length; i++)
assert(result.charCodeAt(i) == 0);
onSuccess();
};
fileReader.readAsBinaryString(file.slice(start, start + length));
}
// Verifies that fileEntry, at offset, is all zeroes for length bytes.
function verifyByteRangeIsZeroes(fileEntry, offset, length, onSuccess)
{
verifyFileContents(fileEntry, verifyByteRangeIsZeroesHelper, offset, length, onSuccess);
}
// Helper function used with verifyFileContents.
function verifyByteRangeAsStringHelper(file, start, data, onSuccess)
{
var fileReader = new FileReader();
fileReader.onerror = onError;
fileReader.onload =
function() {
assert(fileReader.result == data);
onSuccess();
};
fileReader.readAsText(file.slice(start, start + data.length));
}
// Verifies that the contents of fileEntry, at offset, match contents [a string].
function verifyByteRangeAsString(fileEntry, offset, contents, onSuccess)
{
verifyFileContents(fileEntry, verifyByteRangeAsStringHelper, offset, contents, onSuccess);
}
// Creates a file called fileName in fileSystem's root directory, truncates it to zero length just in case, and calls onSuccess, passing it a FileEntry and FileWriter for the new file.
function createEmptyFile(fileSystem, fileName, onSuccess)
{
function getSuccessFunc(fileEntry) {
// Create a fresh FileWriter here, rather than pass in the used one.
// This way we don't accidentally leave our event handlers attached.
return function() {
fileEntry.createWriter(function(fw) {
onSuccess(fileEntry, fw);
}, onError);
}
}
function getFileWriterCallback(fileEntry) {
return function(fileWriter) {
var successFunc = getSuccessFunc(fileEntry);
fileWriter.onError = onError;
fileWriter.onwrite = function() {
fileWriter.onwrite = null;
verifyFileLength(fileEntry, 0, successFunc);
};
fileWriter.truncate(0);
}
}
function onFileEntry(fileEntry) {
fileEntryForCleanup = fileEntry;
var onFileWriter = getFileWriterCallback(fileEntry);
fileEntry.createWriter(onFileWriter, onError);
}
assert(fileSystem);
fileSystem.root.getFile(fileName, {create:true}, onFileEntry, onError);
}
function writeString(fileEntry, fileWriter, offset, data, onSuccess)
{
var blob = new Blob([data]);
fileWriter.seek(offset);
fileWriter.write(blob);
fileWriter.onerror = onError;
if (offset < 0)
offset += fileWriter.length;
assert(offset >= 0);
fileWriter.onwrite = function() {
fileWriter.onwrite = null;
verifyByteRangeAsString(fileEntry, offset, data, onSuccess);
};
}
function setFileContents(fileEntry, fileWriter, contents, onSuccess) {
fileWriter.onerror = onError;
fileWriter.onwrite = function() {
fileWriter.onwrite = null;
writeString(fileEntry, fileWriter, 0, contents, onSuccess);
};
fileWriter.truncate(0);
}
function setupAndRunTest(size, testName, testFunc)
{
if (!webkitRequestFileSystem) {
debug("This test requires FileSystem API support.");
return;
}
debug("starting test");
webkitRequestFileSystem(TEMPORARY, size, function(fs) {
createEmptyFile(fs, testName, testFunc);
}, onError);
}