1926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)/*
2926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * Copyright (C) 2013 Google Inc. All rights reserved.
3926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) *
4926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * Redistribution and use in source and binary forms, with or without
5926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * modification, are permitted provided that the following conditions are
6926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * met:
7926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) *
8926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) *     * Redistributions of source code must retain the above copyright
9926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * notice, this list of conditions and the following disclaimer.
10926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) *     * Redistributions in binary form must reproduce the above
11926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * copyright notice, this list of conditions and the following disclaimer
12926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * in the documentation and/or other materials provided with the
13926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * distribution.
14926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) *     * Neither the name of Google Inc. nor the names of its
15926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * contributors may be used to endorse or promote products derived from
16926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * this software without specific prior written permission.
17926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) *
18926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) */
30926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
31926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)/**
32926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * @constructor
33926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * @param {WebInspector.IsolatedFileSystemManager} manager
34926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * @param {string} path
35926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) */
36926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)WebInspector.IsolatedFileSystem = function(manager, path, name, rootURL)
37926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
38926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    this._manager = manager;
39926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    this._path = path;
40926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    this._name = name;
41926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    this._rootURL = rootURL;
42926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
43926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
44926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)WebInspector.IsolatedFileSystem.errorMessage = function(error)
45926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
46926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    var msg;
47926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    switch (error.code) {
48926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    case FileError.QUOTA_EXCEEDED_ERR:
49926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        msg = "QUOTA_EXCEEDED_ERR";
50926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        break;
51926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    case FileError.NOT_FOUND_ERR:
52926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        msg = "NOT_FOUND_ERR";
53926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        break;
54926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    case FileError.SECURITY_ERR:
55926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        msg = "SECURITY_ERR";
56926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        break;
57926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    case FileError.INVALID_MODIFICATION_ERR:
58926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        msg = "INVALID_MODIFICATION_ERR";
59926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        break;
60926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    case FileError.INVALID_STATE_ERR:
61926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        msg = "INVALID_STATE_ERR";
62926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        break;
63926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    default:
64926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        msg = "Unknown Error";
65926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        break;
66926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    };
67926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
68926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return "File system error: " + msg;
69926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
70926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
71926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)WebInspector.IsolatedFileSystem.prototype = {
72926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    /**
73926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     * @return {string}
74926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     */
75926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    path: function()
76926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
77926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return this._path;
78926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    },
79926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
80926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    /**
81926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     * @return {string}
82926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     */
83926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    name: function()
84926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
85926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return this._name;
86926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    },
87926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
88926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    /**
89926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     * @return {string}
90926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     */
91926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    rootURL: function()
92926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
93926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return this._rootURL;
94926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    },
95926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
96926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    /**
97926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     * @param {function(DOMFileSystem)} callback
98926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     */
99926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    _requestFileSystem: function(callback)
100926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
101926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        this._manager.requestDOMFileSystem(this._path, callback);
102926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    },
103926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
104926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    /**
105926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     * @param {string} path
106926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     * @param {function(string)} callback
107926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     */
108926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    requestFilesRecursive: function(path, callback)
109926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
110926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        this._requestFileSystem(fileSystemLoaded.bind(this));
111926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
112926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        var domFileSystem;
113926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        /**
114926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)         * @param {DOMFileSystem} fs
115926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)         */
116926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        function fileSystemLoaded(fs)
117926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        {
118926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            domFileSystem = fs;
119926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            this._requestEntries(domFileSystem, path, innerCallback.bind(this));
120926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        }
121926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
122926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        /**
123926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)         * @param {Array.<FileEntry>} entries
124926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)         */
125926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        function innerCallback(entries)
126926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        {
127926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            for (var i = 0; i < entries.length; ++i) {
128926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                var entry = entries[i];
129926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                if (!entry.isDirectory)
130521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)                    callback(entry.fullPath.substr(1));
131926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                else
132926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                    this._requestEntries(domFileSystem, entry.fullPath, innerCallback.bind(this));
133926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            }
134926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        }
135926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    },
136926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
137926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    /**
138926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     * @param {string} path
13923e46e0f045bc1935a09565578b448d36cfc5b8cBen Murdoch     * @param {?string} name
14023e46e0f045bc1935a09565578b448d36cfc5b8cBen Murdoch     * @param {function(?string)} callback
14123e46e0f045bc1935a09565578b448d36cfc5b8cBen Murdoch     */
14223e46e0f045bc1935a09565578b448d36cfc5b8cBen Murdoch    createFile: function(path, name, callback)
14323e46e0f045bc1935a09565578b448d36cfc5b8cBen Murdoch    {
14423e46e0f045bc1935a09565578b448d36cfc5b8cBen Murdoch        this._requestFileSystem(fileSystemLoaded.bind(this));
14523e46e0f045bc1935a09565578b448d36cfc5b8cBen Murdoch        var newFileIndex = 1;
14623e46e0f045bc1935a09565578b448d36cfc5b8cBen Murdoch        if (!name)
14723e46e0f045bc1935a09565578b448d36cfc5b8cBen Murdoch            name = "NewFile";
14823e46e0f045bc1935a09565578b448d36cfc5b8cBen Murdoch        var nameCandidate;
14923e46e0f045bc1935a09565578b448d36cfc5b8cBen Murdoch
15023e46e0f045bc1935a09565578b448d36cfc5b8cBen Murdoch        /**
15123e46e0f045bc1935a09565578b448d36cfc5b8cBen Murdoch         * @param {DOMFileSystem} domFileSystem
15223e46e0f045bc1935a09565578b448d36cfc5b8cBen Murdoch         */
15323e46e0f045bc1935a09565578b448d36cfc5b8cBen Murdoch        function fileSystemLoaded(domFileSystem)
15423e46e0f045bc1935a09565578b448d36cfc5b8cBen Murdoch        {
15523e46e0f045bc1935a09565578b448d36cfc5b8cBen Murdoch            domFileSystem.root.getDirectory(path, null, dirEntryLoaded.bind(this), errorHandler.bind(this));
15623e46e0f045bc1935a09565578b448d36cfc5b8cBen Murdoch        }
15723e46e0f045bc1935a09565578b448d36cfc5b8cBen Murdoch
15823e46e0f045bc1935a09565578b448d36cfc5b8cBen Murdoch        /**
15923e46e0f045bc1935a09565578b448d36cfc5b8cBen Murdoch         * @param {DirectoryEntry} dirEntry
16023e46e0f045bc1935a09565578b448d36cfc5b8cBen Murdoch         */
16123e46e0f045bc1935a09565578b448d36cfc5b8cBen Murdoch        function dirEntryLoaded(dirEntry)
16223e46e0f045bc1935a09565578b448d36cfc5b8cBen Murdoch        {
16323e46e0f045bc1935a09565578b448d36cfc5b8cBen Murdoch            var nameCandidate = name;
16423e46e0f045bc1935a09565578b448d36cfc5b8cBen Murdoch            if (newFileIndex > 1)
16523e46e0f045bc1935a09565578b448d36cfc5b8cBen Murdoch                nameCandidate += newFileIndex;
16623e46e0f045bc1935a09565578b448d36cfc5b8cBen Murdoch            ++newFileIndex;
16723e46e0f045bc1935a09565578b448d36cfc5b8cBen Murdoch            dirEntry.getFile(nameCandidate, { create: true, exclusive: true }, fileCreated, fileCreationError);
16823e46e0f045bc1935a09565578b448d36cfc5b8cBen Murdoch
16923e46e0f045bc1935a09565578b448d36cfc5b8cBen Murdoch            function fileCreated(entry)
17023e46e0f045bc1935a09565578b448d36cfc5b8cBen Murdoch            {
17123e46e0f045bc1935a09565578b448d36cfc5b8cBen Murdoch                callback(entry.fullPath.substr(1));
17223e46e0f045bc1935a09565578b448d36cfc5b8cBen Murdoch            }
17323e46e0f045bc1935a09565578b448d36cfc5b8cBen Murdoch
17423e46e0f045bc1935a09565578b448d36cfc5b8cBen Murdoch            function fileCreationError(error)
17523e46e0f045bc1935a09565578b448d36cfc5b8cBen Murdoch            {
17623e46e0f045bc1935a09565578b448d36cfc5b8cBen Murdoch                if (error.code === FileError.INVALID_MODIFICATION_ERR) {
17723e46e0f045bc1935a09565578b448d36cfc5b8cBen Murdoch                    dirEntryLoaded(dirEntry);
17823e46e0f045bc1935a09565578b448d36cfc5b8cBen Murdoch                    return;
17923e46e0f045bc1935a09565578b448d36cfc5b8cBen Murdoch                }
18023e46e0f045bc1935a09565578b448d36cfc5b8cBen Murdoch
18123e46e0f045bc1935a09565578b448d36cfc5b8cBen Murdoch                var errorMessage = WebInspector.IsolatedFileSystem.errorMessage(error);
18223e46e0f045bc1935a09565578b448d36cfc5b8cBen Murdoch                console.error(errorMessage + " when testing if file exists '" + (this._path + "/" + path + "/" + nameCandidate) + "'");
18323e46e0f045bc1935a09565578b448d36cfc5b8cBen Murdoch                callback(null);
18423e46e0f045bc1935a09565578b448d36cfc5b8cBen Murdoch            }
18523e46e0f045bc1935a09565578b448d36cfc5b8cBen Murdoch        }
18623e46e0f045bc1935a09565578b448d36cfc5b8cBen Murdoch
18723e46e0f045bc1935a09565578b448d36cfc5b8cBen Murdoch        function errorHandler(error)
18823e46e0f045bc1935a09565578b448d36cfc5b8cBen Murdoch        {
18923e46e0f045bc1935a09565578b448d36cfc5b8cBen Murdoch            var errorMessage = WebInspector.IsolatedFileSystem.errorMessage(error);
19023e46e0f045bc1935a09565578b448d36cfc5b8cBen Murdoch            var filePath = this._path + "/" + path;
19123e46e0f045bc1935a09565578b448d36cfc5b8cBen Murdoch            if (nameCandidate)
19223e46e0f045bc1935a09565578b448d36cfc5b8cBen Murdoch                filePath += "/" + nameCandidate;
19323e46e0f045bc1935a09565578b448d36cfc5b8cBen Murdoch            console.error(errorMessage + " when getting content for file '" + (filePath) + "'");
19423e46e0f045bc1935a09565578b448d36cfc5b8cBen Murdoch            callback(null);
19523e46e0f045bc1935a09565578b448d36cfc5b8cBen Murdoch        }
19623e46e0f045bc1935a09565578b448d36cfc5b8cBen Murdoch    },
19723e46e0f045bc1935a09565578b448d36cfc5b8cBen Murdoch
19823e46e0f045bc1935a09565578b448d36cfc5b8cBen Murdoch    /**
19923e46e0f045bc1935a09565578b448d36cfc5b8cBen Murdoch     * @param {string} path
20023e46e0f045bc1935a09565578b448d36cfc5b8cBen Murdoch     */
20123e46e0f045bc1935a09565578b448d36cfc5b8cBen Murdoch    deleteFile: function(path)
20223e46e0f045bc1935a09565578b448d36cfc5b8cBen Murdoch    {
20323e46e0f045bc1935a09565578b448d36cfc5b8cBen Murdoch        this._requestFileSystem(fileSystemLoaded.bind(this));
20423e46e0f045bc1935a09565578b448d36cfc5b8cBen Murdoch
20523e46e0f045bc1935a09565578b448d36cfc5b8cBen Murdoch        /**
20623e46e0f045bc1935a09565578b448d36cfc5b8cBen Murdoch         * @param {DOMFileSystem} domFileSystem
20723e46e0f045bc1935a09565578b448d36cfc5b8cBen Murdoch         */
20823e46e0f045bc1935a09565578b448d36cfc5b8cBen Murdoch        function fileSystemLoaded(domFileSystem)
20923e46e0f045bc1935a09565578b448d36cfc5b8cBen Murdoch        {
21023e46e0f045bc1935a09565578b448d36cfc5b8cBen Murdoch            domFileSystem.root.getFile(path, null, fileEntryLoaded.bind(this), errorHandler.bind(this));
21123e46e0f045bc1935a09565578b448d36cfc5b8cBen Murdoch        }
21223e46e0f045bc1935a09565578b448d36cfc5b8cBen Murdoch
21323e46e0f045bc1935a09565578b448d36cfc5b8cBen Murdoch        /**
21423e46e0f045bc1935a09565578b448d36cfc5b8cBen Murdoch         * @param {FileEntry} fileEntry
21523e46e0f045bc1935a09565578b448d36cfc5b8cBen Murdoch         */
21623e46e0f045bc1935a09565578b448d36cfc5b8cBen Murdoch        function fileEntryLoaded(fileEntry)
21723e46e0f045bc1935a09565578b448d36cfc5b8cBen Murdoch        {
21823e46e0f045bc1935a09565578b448d36cfc5b8cBen Murdoch            fileEntry.remove(fileEntryRemoved.bind(this), errorHandler.bind(this));
21923e46e0f045bc1935a09565578b448d36cfc5b8cBen Murdoch        }
22023e46e0f045bc1935a09565578b448d36cfc5b8cBen Murdoch
22123e46e0f045bc1935a09565578b448d36cfc5b8cBen Murdoch        function fileEntryRemoved()
22223e46e0f045bc1935a09565578b448d36cfc5b8cBen Murdoch        {
22323e46e0f045bc1935a09565578b448d36cfc5b8cBen Murdoch        }
22423e46e0f045bc1935a09565578b448d36cfc5b8cBen Murdoch
22523e46e0f045bc1935a09565578b448d36cfc5b8cBen Murdoch        /**
22623e46e0f045bc1935a09565578b448d36cfc5b8cBen Murdoch         * @param {FileError} error
22723e46e0f045bc1935a09565578b448d36cfc5b8cBen Murdoch         */
22823e46e0f045bc1935a09565578b448d36cfc5b8cBen Murdoch        function errorHandler(error)
22923e46e0f045bc1935a09565578b448d36cfc5b8cBen Murdoch        {
23023e46e0f045bc1935a09565578b448d36cfc5b8cBen Murdoch            var errorMessage = WebInspector.IsolatedFileSystem.errorMessage(error);
23123e46e0f045bc1935a09565578b448d36cfc5b8cBen Murdoch            console.error(errorMessage + " when deleting file '" + (this._path + "/" + path) + "'");
23223e46e0f045bc1935a09565578b448d36cfc5b8cBen Murdoch        }
23323e46e0f045bc1935a09565578b448d36cfc5b8cBen Murdoch    },
23423e46e0f045bc1935a09565578b448d36cfc5b8cBen Murdoch
23523e46e0f045bc1935a09565578b448d36cfc5b8cBen Murdoch    /**
23623e46e0f045bc1935a09565578b448d36cfc5b8cBen Murdoch     * @param {string} path
237591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch     * @param {function(?Date, ?number)} callback
238591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch     */
239591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    requestMetadata: function(path, callback)
240591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    {
241591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        this._requestFileSystem(fileSystemLoaded.bind(this));
242591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
243591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        /**
244591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch         * @param {DOMFileSystem} domFileSystem
245591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch         */
246591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        function fileSystemLoaded(domFileSystem)
247591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        {
248591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch            domFileSystem.root.getFile(path, null, fileEntryLoaded, errorHandler);
249591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        }
250591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
251591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        /**
252591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch         * @param {FileEntry} entry
253591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch         */
254591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        function fileEntryLoaded(entry)
255591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        {
256591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch            entry.getMetadata(successHandler, errorHandler);
257591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        }
258591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
259591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        /**
260591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch         * @param {Metadata} metadata
261591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch         */
262591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        function successHandler(metadata)
263591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        {
264591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch            callback(metadata.modificationTime, metadata.size);
265591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        }
266591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
267591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        /**
268591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch         * @param {FileError} error
269591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch         */
270591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        function errorHandler(error)
271591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        {
272591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch            callback(null, null);
273591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        }
274591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    },
275591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
276591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    /**
277591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch     * @param {string} path
278926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     * @param {function(?string)} callback
279926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     */
280926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    requestFileContent: function(path, callback)
281926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
282926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        this._requestFileSystem(fileSystemLoaded.bind(this));
283926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
284926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        /**
285926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)         * @param {DOMFileSystem} domFileSystem
286926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)         */
287926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        function fileSystemLoaded(domFileSystem)
288926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        {
289591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch            domFileSystem.root.getFile(path, null, fileEntryLoaded, errorHandler.bind(this));
290926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        }
291926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
292926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        /**
293926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)         * @param {FileEntry} entry
294926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)         */
295926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        function fileEntryLoaded(entry)
296926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        {
297591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch            entry.file(fileLoaded, errorHandler.bind(this));
298926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        }
299926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
300926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        /**
301926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)         * @param {!Blob} file
302926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)         */
303926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        function fileLoaded(file)
304926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        {
305926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            var reader = new FileReader();
306926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            reader.onloadend = readerLoadEnd;
307926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            reader.readAsText(file);
308926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        }
309926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
310926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        /**
311926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)         * @this {FileReader}
312926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)         */
313926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        function readerLoadEnd()
314926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        {
315926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            callback(/** @type {string} */ (this.result));
316926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        }
317926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
318926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        function errorHandler(error)
319926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        {
32053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)            if (error.code === FileError.NOT_FOUND_ERR) {
32153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)                callback(null);
32253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)                return;
32353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)            }
32453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
325926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            var errorMessage = WebInspector.IsolatedFileSystem.errorMessage(error);
326926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            console.error(errorMessage + " when getting content for file '" + (this._path + "/" + path) + "'");
327926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            callback(null);
328926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        }
329926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    },
330926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
331926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    /**
332926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     * @param {string} path
333926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     * @param {string} content
334926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     * @param {function()} callback
335926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     */
336926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    setFileContent: function(path, content, callback)
337926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
338926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        this._requestFileSystem(fileSystemLoaded);
339926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
340926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        /**
341926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)         * @param {DOMFileSystem} domFileSystem
342926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)         */
343926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        function fileSystemLoaded(domFileSystem)
344926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        {
3455267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)            domFileSystem.root.getFile(path, { create: true }, fileEntryLoaded, errorHandler.bind(this));
346926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        }
347926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
348926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        /**
349926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)         * @param {FileEntry} entry
350926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)         */
351926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        function fileEntryLoaded(entry)
352926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        {
3535267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)            entry.createWriter(fileWriterCreated, errorHandler.bind(this));
354926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        }
355926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
356926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        /**
357926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)         * @param {FileWriter} fileWriter
358926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)         */
359926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        function fileWriterCreated(fileWriter)
360926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        {
3615267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)            fileWriter.onerror = errorHandler.bind(this);
362926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            fileWriter.onwriteend = fileTruncated;
363926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            fileWriter.truncate(0);
364926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
365926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            function fileTruncated()
366926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            {
367926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                fileWriter.onwriteend = writerEnd;
368926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                var blob = new Blob([content], { type: "text/plain" });
369926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                fileWriter.write(blob);
370926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            }
371926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        }
372926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
373926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        function writerEnd()
374926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        {
375926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            callback();
376926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        }
377926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
378926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        function errorHandler(error)
379926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        {
380926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            var errorMessage = WebInspector.IsolatedFileSystem.errorMessage(error);
381926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            console.error(errorMessage + " when setting content for file '" + (this._path + "/" + path) + "'");
382926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            callback();
383926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        }
384926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    },
385926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
386926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    /**
3875267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)     * @param {string} path
3885267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)     * @param {string} newName
3895267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)     * @param {function(boolean, string=)} callback
3905267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)     */
3915267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    renameFile: function(path, newName, callback)
3925267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    {
3935267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        newName = newName ? newName.trim() : newName;
3945267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        if (!newName || newName.indexOf("/") !== -1) {
3955267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)            callback(false);
3965267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)            return;
3975267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        }
3985267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        var fileEntry;
3995267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        var dirEntry;
4005267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        var newFileEntry;
4015267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        this._requestFileSystem(fileSystemLoaded);
4025267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
4035267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        /**
4045267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)         * @param {DOMFileSystem} domFileSystem
4055267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)         */
4065267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        function fileSystemLoaded(domFileSystem)
4075267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        {
4085267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)            domFileSystem.root.getFile(path, null, fileEntryLoaded, errorHandler.bind(this));
4095267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        }
4105267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
4115267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        /**
4125267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)         * @param {FileEntry} entry
4135267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)         */
4145267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        function fileEntryLoaded(entry)
4155267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        {
4165267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)            if (entry.name === newName) {
4175267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)                callback(false);
4185267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)                return;
4195267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)            }
4205267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
4215267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)            fileEntry = entry;
4225267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)            fileEntry.getParent(dirEntryLoaded, errorHandler.bind(this));
4235267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        }
4245267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
4255267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        /**
4265267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)         * @param {Entry} entry
4275267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)         */
4285267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        function dirEntryLoaded(entry)
4295267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        {
4305267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)            dirEntry = entry;
4315267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)            dirEntry.getFile(newName, null, newFileEntryLoaded, newFileEntryLoadErrorHandler);
4325267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        }
4335267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
4345267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        /**
4355267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)         * @param {FileEntry} entry
4365267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)         */
4375267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        function newFileEntryLoaded(entry)
4385267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        {
4395267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)            callback(false);
4405267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        }
4415267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
4425267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        function newFileEntryLoadErrorHandler(error)
4435267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        {
4445267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)            if (error.code !== FileError.NOT_FOUND_ERR) {
4455267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)                callback(false);
4465267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)                return;
4475267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)            }
4485267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)            fileEntry.moveTo(dirEntry, newName, fileRenamed, errorHandler.bind(this));
4495267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        }
4505267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
4515267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        /**
4525267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)         * @param {FileEntry} entry
4535267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)         */
4545267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        function fileRenamed(entry)
4555267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        {
4565267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)            callback(true, entry.name);
4575267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        }
4585267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
4595267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        function errorHandler(error)
4605267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        {
4615267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)            var errorMessage = WebInspector.IsolatedFileSystem.errorMessage(error);
4625267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)            console.error(errorMessage + " when renaming file '" + (this._path + "/" + path) + "' to '" + newName + "'");
4635267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)            callback(false);
4645267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        }
4655267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    },
4665267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
4675267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    /**
468926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     * @param {DirectoryEntry} dirEntry
469926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     * @param {function(Array.<FileEntry>)} callback
470926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     */
471926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    _readDirectory: function(dirEntry, callback)
472926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
473926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        var dirReader = dirEntry.createReader();
474926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        var entries = [];
475926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
476926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        function innerCallback(results)
477926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        {
478926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            if (!results.length)
479926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                callback(entries.sort());
480926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            else {
481926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                entries = entries.concat(toArray(results));
482926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                dirReader.readEntries(innerCallback, errorHandler);
483926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            }
484926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        }
485926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
486926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        function toArray(list)
487926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        {
488926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            return Array.prototype.slice.call(list || [], 0);
489926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        }
490926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
491926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        dirReader.readEntries(innerCallback, errorHandler);
492926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
493926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        function errorHandler(error)
494926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        {
495926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            var errorMessage = WebInspector.IsolatedFileSystem.errorMessage(error);
496926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            console.error(errorMessage + " when reading directory '" + dirEntry.fullPath + "'");
497926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            callback([]);
498926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        }
499926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    },
500926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
501926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    /**
502926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     * @param {DOMFileSystem} domFileSystem
503926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     * @param {string} path
504926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     * @param {function(Array.<FileEntry>)} callback
505926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     */
506926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    _requestEntries: function(domFileSystem, path, callback)
507926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
508926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        domFileSystem.root.getDirectory(path, null, innerCallback.bind(this), errorHandler);
509926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
510926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        function innerCallback(dirEntry)
511926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        {
512926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            this._readDirectory(dirEntry, callback)
513926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        }
514926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
515926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        function errorHandler(error)
516926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        {
517926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            var errorMessage = WebInspector.IsolatedFileSystem.errorMessage(error);
518926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            console.error(errorMessage + " when requesting entry '" + path + "'");
519926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            callback([]);
520926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        }
521926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
522926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
523