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