// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
var harness = {
/**
* Kick off the test harness.
*
* Called by harness.html after the dom has been parsed.
*/
init: function() {
console.log('Initializing harness...');
util.installFileErrorToString();
var self = this;
function onFilesystem(filesystem) {
console.log('Filesystem found.');
self.filesystem = filesystem;
};
window.webkitRequestFileSystem(window.PERSISTENT, 16 * 1024 * 1024,
onFilesystem,
util.flog('Error initializing filesystem'));
var paramstr = decodeURIComponent(document.location.search.substr(1));
this.params = paramstr ? JSON.parse(paramstr) : {};
var input = document.getElementById('default-path');
input.value = this.params.defaultPath || '';
input.addEventListener('keyup', this.onInputKeyUp.bind(this));
var iframe = document.getElementById('dialog');
iframe.setAttribute('src', 'main.html' + document.location.search);
},
onInputKeyUp: function(event) {
if (event.keyCode != 13)
return;
this.changePath();
},
changePath: function() {
var input = document.getElementById('default-path');
this.changeParam('defaultPath', input.value);
},
changeParam: function(name, value) {
this.params[name] = value;
document.location.href = '?' + JSON.stringify(this.params);
},
/**
* 'Reset Fileystem' button click handler.
*/
onClearClick: function() {
utils.forEachDirEntry(this.filesystem.root, function(dirEntry) {
if (!dirEntry)
return console.log('Filesystem reset.');
console.log('Remove: ' + dirEntry.name);
if (dirEntry.isDirectory) {
dirEntry.removeRecursively();
} else {
dirEntry.remove();
}
});
},
/**
* Change handler for the 'input type=file' element.
*/
onFilesChange: function(event) {
this.importFiles([].slice.call(event.target.files));
},
/**
* The fileManager object under test.
*
* This is a getter rather than a normal property because the fileManager
* is initialized asynchronously, and we won't be sure when it'll be
* done. Since harness.fileManager is intended to be used for debugging
* from the JS console, we don't really need to be sure it's ready at any
* particular time.
*/
get fileManager() {
return document.getElementById('dialog').contentWindow.fileManager;
},
/**
* Import a list of File objects into harness.filesystem.
*/
importFiles: function(files) {
var currentSrc = null;
var currentDest = null;
var importCount = 0;
var self = this;
function onWriterCreated(writer) {
writer.onerror = util.flog('Error writing: ' + currentDest.fullPath);
writer.onwriteend = function() {
console.log('Wrote: ' + currentDest.fullPath);
//console.log(writer);
//console.log(currentDest);
++importCount;
processNextFile();
};
writer.write(currentSrc);
}
function onFileFound(fileEntry) {
currentDest = fileEntry;
currentDest.createWriter(onWriterCreated,
util.flog('Error creating writer for: ' +
currentDest.fullPath));
}
function processNextFile() {
if (files.length == 0) {
console.log('Import complete: ' + importCount + ' file(s)');
return;
}
currentSrc = files.shift();
var destPath = currentSrc.name.replace(/\^\^/g, '/');
self.getOrCreateFile(destPath, onFileFound,
util.flog('Error finding path: ' + destPath));
}
console.log('Start import: ' + files.length + ' file(s)');
processNextFile();
},
/**
* Locate the file referred to by path, creating directories or the file
* itself if necessary.
*/
getOrCreateFile: function(path, successCallback, errorCallback) {
var dirname = null;
var basename = null;
function onDirFound(dirEntry) {
dirEntry.getFile(basename, { create: true },
successCallback, errorCallback);
}
var i = path.lastIndexOf('/');
if (i > -1) {
dirname = path.substr(0, i);
basename = path.substr(i + 1);
} else {
basename = path;
}
if (!dirname)
return onDirFound(this.filesystem.root);
this.getOrCreatePath(dirname, onDirFound, errorCallback);
},
/**
* Locate the directory referred to by path, creating directories along the
* way.
*/
getOrCreatePath: function(path, successCallback, errorCallback) {
var names = path.split('/');
function getOrCreateNextName(dir) {
if (!names.length)
return successCallback(dir);
var name;
do {
name = names.shift();
} while (!name || name == '.');
dir.getDirectory(name, { create: true }, getOrCreateNextName,
errorCallback);
}
getOrCreateNextName(this.filesystem.root);
}
};