chromium/third_party/blink/web_tests/fast/filesystem/resources/file-writer-utils.js

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);
}