IsolatedFileSystem.js [plain text]
WebInspector.IsolatedFileSystem = function(manager, path, name, rootURL)
{
this._manager = manager;
this._path = path;
this._name = name;
this._rootURL = rootURL;
}
WebInspector.IsolatedFileSystem.errorMessage = function(error)
{
var msg;
switch (error.code) {
case FileError.QUOTA_EXCEEDED_ERR:
msg = "QUOTA_EXCEEDED_ERR";
break;
case FileError.NOT_FOUND_ERR:
msg = "NOT_FOUND_ERR";
break;
case FileError.SECURITY_ERR:
msg = "SECURITY_ERR";
break;
case FileError.INVALID_MODIFICATION_ERR:
msg = "INVALID_MODIFICATION_ERR";
break;
case FileError.INVALID_STATE_ERR:
msg = "INVALID_STATE_ERR";
break;
default:
msg = "Unknown Error";
break;
};
return "File system error: " + msg;
}
WebInspector.IsolatedFileSystem.prototype = {
path: function()
{
return this._path;
},
name: function()
{
return this._name;
},
rootURL: function()
{
return this._rootURL;
},
_requestFileSystem: function(callback)
{
this._manager.requestDOMFileSystem(this._path, callback);
},
requestFilesRecursive: function(path, callback)
{
this._requestFileSystem(fileSystemLoaded.bind(this));
var domFileSystem;
function fileSystemLoaded(fs)
{
domFileSystem = fs;
this._requestEntries(domFileSystem, path, innerCallback.bind(this));
}
function innerCallback(entries)
{
for (var i = 0; i < entries.length; ++i) {
var entry = entries[i];
if (!entry.isDirectory)
callback(entry.fullPath);
else
this._requestEntries(domFileSystem, entry.fullPath, innerCallback.bind(this));
}
}
},
requestFileContent: function(path, callback)
{
this._requestFileSystem(fileSystemLoaded.bind(this));
function fileSystemLoaded(domFileSystem)
{
domFileSystem.root.getFile(path, null, fileEntryLoaded, errorHandler);
}
function fileEntryLoaded(entry)
{
entry.file(fileLoaded, errorHandler);
}
function fileLoaded(file)
{
var reader = new FileReader();
reader.onloadend = readerLoadEnd;
reader.readAsText(file);
}
function readerLoadEnd()
{
callback( (this.result));
}
function errorHandler(error)
{
if (error.code === FileError.NOT_FOUND_ERR) {
callback(null);
return;
}
var errorMessage = WebInspector.IsolatedFileSystem.errorMessage(error);
console.error(errorMessage + " when getting content for file '" + (this._path + "/" + path) + "'");
callback(null);
}
},
setFileContent: function(path, content, callback)
{
this._requestFileSystem(fileSystemLoaded);
function fileSystemLoaded(domFileSystem)
{
domFileSystem.root.getFile(path, { create: true }, fileEntryLoaded, errorHandler);
}
function fileEntryLoaded(entry)
{
entry.createWriter(fileWriterCreated, errorHandler);
}
function fileWriterCreated(fileWriter)
{
fileWriter.onerror = errorHandler;
fileWriter.onwriteend = fileTruncated;
fileWriter.truncate(0);
function fileTruncated()
{
fileWriter.onwriteend = writerEnd;
var blob = new Blob([content], { type: "text/plain" });
fileWriter.write(blob);
}
}
function writerEnd()
{
callback();
}
function errorHandler(error)
{
var errorMessage = WebInspector.IsolatedFileSystem.errorMessage(error);
console.error(errorMessage + " when setting content for file '" + (this._path + "/" + path) + "'");
callback();
}
},
_readDirectory: function(dirEntry, callback)
{
var dirReader = dirEntry.createReader();
var entries = [];
function innerCallback(results)
{
if (!results.length)
callback(entries.sort());
else {
entries = entries.concat(toArray(results));
dirReader.readEntries(innerCallback, errorHandler);
}
}
function toArray(list)
{
return Array.prototype.slice.call(list || [], 0);
}
dirReader.readEntries(innerCallback, errorHandler);
function errorHandler(error)
{
var errorMessage = WebInspector.IsolatedFileSystem.errorMessage(error);
console.error(errorMessage + " when reading directory '" + dirEntry.fullPath + "'");
callback([]);
}
},
_requestEntries: function(domFileSystem, path, callback)
{
domFileSystem.root.getDirectory(path, null, innerCallback.bind(this), errorHandler);
function innerCallback(dirEntry)
{
this._readDirectory(dirEntry, callback)
}
function errorHandler(error)
{
var errorMessage = WebInspector.IsolatedFileSystem.errorMessage(error);
console.error(errorMessage + " when requesting entry '" + path + "'");
callback([]);
}
}
}