1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved. 2ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Use of this source code is governed by a BSD-style license that can be 3ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// found in the LICENSE file. 4ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 5ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvar harness = { 6ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen /** 7ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * Kick off the test harness. 8ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * 9ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * Called by harness.html after the dom has been parsed. 10ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen */ 11ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen init: function() { 12ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen console.log('Initializing harness...'); 13ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 14ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen util.installFileErrorToString(); 15ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 16ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen var self = this; 17ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 18ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen function onFilesystem(filesystem) { 19ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen console.log('Filesystem found.'); 20ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen self.filesystem = filesystem; 21ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen }; 22ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 23ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen window.webkitRequestFileSystem(window.PERSISTENT, 16 * 1024 * 1024, 24ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen onFilesystem, 25ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen util.flog('Error initializing filesystem')); 26ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 27ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen var paramstr = decodeURIComponent(document.location.search.substr(1)); 28ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen this.params = paramstr ? JSON.parse(paramstr) : {}; 29ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 30ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen var input = document.getElementById('default-path'); 31ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen input.value = this.params.defaultPath || ''; 32ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen input.addEventListener('keyup', this.onInputKeyUp.bind(this)); 33ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 34ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen var iframe = document.getElementById('dialog'); 35ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen iframe.setAttribute('src', 'main.html' + document.location.search); 36ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen }, 37ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 38ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen onInputKeyUp: function(event) { 39ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (event.keyCode != 13) 40ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return; 41ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 42ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen this.changePath(); 43ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen }, 44ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 45ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen changePath: function() { 46ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen var input = document.getElementById('default-path'); 47ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen this.changeParam('defaultPath', input.value); 48ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen }, 49ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 50ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen changeParam: function(name, value) { 51ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen this.params[name] = value; 52ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen document.location.href = '?' + JSON.stringify(this.params); 53ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen }, 54ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 55ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen /** 56ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * 'Reset Fileystem' button click handler. 57ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen */ 58ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen onClearClick: function() { 59ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen utils.forEachDirEntry(this.filesystem.root, function(dirEntry) { 60ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!dirEntry) 61ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return console.log('Filesystem reset.'); 62ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 63ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen console.log('Remove: ' + dirEntry.name); 64ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 65ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (dirEntry.isDirectory) { 66ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen dirEntry.removeRecursively(); 67ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } else { 68ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen dirEntry.remove(); 69ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 70ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen }); 71ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen }, 72ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 73ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen /** 74ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * Change handler for the 'input type=file' element. 75ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen */ 76ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen onFilesChange: function(event) { 77ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen this.importFiles([].slice.call(event.target.files)); 78ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen }, 79ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 80ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen /** 81ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * The fileManager object under test. 82ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * 83ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * This is a getter rather than a normal property because the fileManager 84ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * is initialized asynchronously, and we won't be sure when it'll be 85ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * done. Since harness.fileManager is intended to be used for debugging 86ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * from the JS console, we don't really need to be sure it's ready at any 87ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * particular time. 88ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen */ 89ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen get fileManager() { 90ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return document.getElementById('dialog').contentWindow.fileManager; 91ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen }, 92ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 93ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen /** 94ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * Import a list of File objects into harness.filesystem. 95ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen */ 96ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen importFiles: function(files) { 97ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen var currentSrc = null; 98ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen var currentDest = null; 99ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen var importCount = 0; 100ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 101ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen var self = this; 102ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 103ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen function onWriterCreated(writer) { 104ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen writer.onerror = util.flog('Error writing: ' + currentDest.fullPath); 105ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen writer.onwriteend = function() { 106ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen console.log('Wrote: ' + currentDest.fullPath); 107ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen //console.log(writer); 108ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen //console.log(currentDest); 109ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ++importCount; 110ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen processNextFile(); 111ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen }; 112ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 113ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen writer.write(currentSrc); 114ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 115ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 116ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen function onFileFound(fileEntry) { 117ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen currentDest = fileEntry; 118ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen currentDest.createWriter(onWriterCreated, 119ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen util.flog('Error creating writer for: ' + 120ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen currentDest.fullPath)); 121ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 122ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 123ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen function processNextFile() { 124ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (files.length == 0) { 125ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen console.log('Import complete: ' + importCount + ' file(s)'); 126ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return; 127ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 128ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 129ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen currentSrc = files.shift(); 130ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen var destPath = currentSrc.name.replace(/\^\^/g, '/'); 131ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen self.getOrCreateFile(destPath, onFileFound, 132ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen util.flog('Error finding path: ' + destPath)); 133ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 134ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 135ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen console.log('Start import: ' + files.length + ' file(s)'); 136ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen processNextFile(); 137ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen }, 138ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 139ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen /** 140ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * Locate the file referred to by path, creating directories or the file 141ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * itself if necessary. 142ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen */ 143ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen getOrCreateFile: function(path, successCallback, errorCallback) { 144ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen var dirname = null; 145ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen var basename = null; 146ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 147ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen function onDirFound(dirEntry) { 148ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen dirEntry.getFile(basename, { create: true }, 149ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen successCallback, errorCallback); 150ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 151ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 152ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen var i = path.lastIndexOf('/'); 153ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (i > -1) { 154ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen dirname = path.substr(0, i); 155ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen basename = path.substr(i + 1); 156ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } else { 157ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen basename = path; 158ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 159ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 160ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!dirname) 161ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return onDirFound(this.filesystem.root); 162ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 163ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen this.getOrCreatePath(dirname, onDirFound, errorCallback); 164ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen }, 165ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 166ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen /** 167ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * Locate the directory referred to by path, creating directories along the 168ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * way. 169ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen */ 170ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen getOrCreatePath: function(path, successCallback, errorCallback) { 171ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen var names = path.split('/'); 172ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 173ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen function getOrCreateNextName(dir) { 174ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen if (!names.length) 175ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return successCallback(dir); 176ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 177ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen var name; 178ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen do { 179ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen name = names.shift(); 180ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } while (!name || name == '.'); 181ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 182ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen dir.getDirectory(name, { create: true }, getOrCreateNextName, 183ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen errorCallback); 184ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 185ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 186ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen getOrCreateNextName(this.filesystem.root); 187ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 188ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}; 189