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) * @implements {WebInspector.ProjectDelegate}
34926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * @extends {WebInspector.Object}
35926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * @param {WebInspector.IsolatedFileSystem} isolatedFileSystem
36926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * @param {WebInspector.Workspace} workspace
37926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) */
38926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)WebInspector.FileSystemProjectDelegate = function(isolatedFileSystem, workspace)
39926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
40926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    this._fileSystem = isolatedFileSystem;
41e6d4491e48613634a83c1957c72759da80987961Ben Murdoch    this._normalizedFileSystemPath = this._fileSystem.path();
42e6d4491e48613634a83c1957c72759da80987961Ben Murdoch    if (WebInspector.isWin())
43e6d4491e48613634a83c1957c72759da80987961Ben Murdoch        this._normalizedFileSystemPath = this._normalizedFileSystemPath.replace(/\\/g, "/");
44e6d4491e48613634a83c1957c72759da80987961Ben Murdoch    this._fileSystemURL = "file://" + this._normalizedFileSystemPath + "/";
45926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    this._workspace = workspace;
46f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)    /** @type {Object.<number, function(Array.<string>)>} */
47f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)    this._searchCallbacks = {};
48f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)    /** @type {Object.<number, function()>} */
49f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)    this._indexingCallbacks = {};
50f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)    /** @type {Object.<number, WebInspector.Progress>} */
51f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)    this._indexingProgresses = {};
52926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
53926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
54591b958dee2cf159d33a0b931e6231072eaf38d5Ben MurdochWebInspector.FileSystemProjectDelegate._scriptExtensions = ["js", "java", "coffee", "ts", "dart"].keySet();
55591b958dee2cf159d33a0b931e6231072eaf38d5Ben MurdochWebInspector.FileSystemProjectDelegate._styleSheetExtensions = ["css", "scss", "sass", "less"].keySet();
56591b958dee2cf159d33a0b931e6231072eaf38d5Ben MurdochWebInspector.FileSystemProjectDelegate._documentExtensions = ["htm", "html", "asp", "aspx", "phtml", "jsp"].keySet();
57926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
58926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)WebInspector.FileSystemProjectDelegate.projectId = function(fileSystemPath)
59926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
60926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return "filesystem:" + fileSystemPath;
61926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
62926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
63f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)WebInspector.FileSystemProjectDelegate._lastRequestId = 0;
64f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)
65926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)WebInspector.FileSystemProjectDelegate.prototype = {
66926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    /**
67926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     * @return {string}
68926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     */
69926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    id: function()
70926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
71926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return WebInspector.FileSystemProjectDelegate.projectId(this._fileSystem.path());
72926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    },
73926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
74926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    /**
75926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     * @return {string}
76926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     */
77926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    type: function()
78926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
79926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return WebInspector.projectTypes.FileSystem;
80926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    },
81926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
82926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    /**
83926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     * @return {string}
84926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     */
85926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    fileSystemPath: function()
86926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
87926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return this._fileSystem.path();
88926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    },
89926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
90926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    /**
91926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     * @return {string}
92926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     */
93926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    displayName: function()
94926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
95e6d4491e48613634a83c1957c72759da80987961Ben Murdoch        return this._normalizedFileSystemPath.substr(this._normalizedFileSystemPath.lastIndexOf("/") + 1);
96926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    },
97926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
98926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    /**
99591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch     * @param {string} path
100926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     * @return {string}
101926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     */
102926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    _filePathForPath: function(path)
103926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
104591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        return "/" + path;
105926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    },
106926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
107926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    /**
108591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch     * @param {string} path
109926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     * @param {function(?string,boolean,string)} callback
110926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     */
111926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    requestFileContent: function(path, callback)
112926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
113926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        var filePath = this._filePathForPath(path);
114926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        this._fileSystem.requestFileContent(filePath, innerCallback.bind(this));
115926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
116926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        /**
117926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)         * @param {?string} content
118926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)         */
119926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        function innerCallback(content)
120926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        {
121591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch            var extension = this._extensionForPath(path);
122591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch            var mimeType = WebInspector.ResourceType.mimeTypesForExtensions[extension];
123591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch            callback(content, false, mimeType);
124926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        }
125926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    },
126926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
127926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    /**
128591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch     * @param {string} path
129591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch     * @param {function(?Date, ?number)} callback
130591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch     */
131591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    requestMetadata: function(path, callback)
132591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    {
133591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        var filePath = this._filePathForPath(path);
134591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        this._fileSystem.requestMetadata(filePath, callback);
135591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    },
136591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
137591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    /**
138926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     * @return {boolean}
139926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     */
140926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    canSetFileContent: function()
141926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
142926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return true;
143926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    },
144926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
145926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    /**
146591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch     * @param {string} path
147926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     * @param {string} newContent
148926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     * @param {function(?string)} callback
149926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     */
150926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    setFileContent: function(path, newContent, callback)
151926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
152926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        var filePath = this._filePathForPath(path);
153926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        this._fileSystem.setFileContent(filePath, newContent, callback.bind(this, ""));
154926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    },
155926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
156926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    /**
15793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)     * @return {boolean}
15893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)     */
15993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    canRename: function()
16093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    {
1615267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        return true;
16293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    },
16393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
16493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    /**
165591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch     * @param {string} path
16693ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)     * @param {string} newName
16793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)     * @param {function(boolean, string=)} callback
16893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)     */
16993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    rename: function(path, newName, callback)
17093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    {
1715267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        var filePath = this._filePathForPath(path);
1725267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        this._fileSystem.renameFile(filePath, newName, callback);
17393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    },
17493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
17593ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    /**
176591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch     * @param {string} path
177926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     * @param {string} query
178926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     * @param {boolean} caseSensitive
179926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     * @param {boolean} isRegex
180926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     * @param {function(Array.<WebInspector.ContentProvider.SearchMatch>)} callback
181926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     */
182926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    searchInFileContent: function(path, query, caseSensitive, isRegex, callback)
183926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
184926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        var filePath = this._filePathForPath(path);
185926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        this._fileSystem.requestFileContent(filePath, contentCallback.bind(this));
186926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
187926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        /**
188926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)         * @param {?string} content
189926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)         */
190926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        function contentCallback(content)
191926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        {
192926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            var result = [];
193926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            if (content !== null)
194926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                result = WebInspector.ContentProvider.performSearchInContent(content, query, caseSensitive, isRegex);
195926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            callback(result);
196926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        }
197926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    },
198926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
199926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    /**
200f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)     * @param {string} query
201f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)     * @param {boolean} caseSensitive
202f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)     * @param {boolean} isRegex
203f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)     * @param {WebInspector.Progress} progress
204f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)     * @param {function(StringMap)} callback
205f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)     */
206f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)    searchInContent: function(query, caseSensitive, isRegex, progress, callback)
207f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)    {
208f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)        var requestId = ++WebInspector.FileSystemProjectDelegate._lastRequestId;
209f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)        this._searchCallbacks[requestId] = innerCallback.bind(this);
2101fad5ca6c42d689812b66fc493992aa6d747a6fbBen Murdoch        InspectorFrontendHost.searchInPath(requestId, this._fileSystem.path(), isRegex ? "" : query);
211f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)
212f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)        function innerCallback(files)
213f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)        {
214d3549321f2fe80c2cb1c3e6b0a7c41a4e79c05a5Torne (Richard Coles)            function trimAndNormalizeFileSystemPath(fullPath)
215f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)            {
216d3549321f2fe80c2cb1c3e6b0a7c41a4e79c05a5Torne (Richard Coles)                var trimmedPath = fullPath.substr(this._fileSystem.path().length + 1);
217d3549321f2fe80c2cb1c3e6b0a7c41a4e79c05a5Torne (Richard Coles)                if (WebInspector.isWin())
218d3549321f2fe80c2cb1c3e6b0a7c41a4e79c05a5Torne (Richard Coles)                    trimmedPath = trimmedPath.replace(/\\/g, "/");
219d3549321f2fe80c2cb1c3e6b0a7c41a4e79c05a5Torne (Richard Coles)                return trimmedPath;
220f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)            }
221f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)
222d3549321f2fe80c2cb1c3e6b0a7c41a4e79c05a5Torne (Richard Coles)            files = files.map(trimAndNormalizeFileSystemPath.bind(this));
223f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)            var result = new StringMap();
224e6d4491e48613634a83c1957c72759da80987961Ben Murdoch            progress.setTotalWork(files.length);
225e6d4491e48613634a83c1957c72759da80987961Ben Murdoch            if (files.length === 0) {
226e6d4491e48613634a83c1957c72759da80987961Ben Murdoch                progress.done();
227f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)                callback(result);
228f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)                return;
229f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)            }
230f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)
231e6d4491e48613634a83c1957c72759da80987961Ben Murdoch            var fileIndex = 0;
232e6d4491e48613634a83c1957c72759da80987961Ben Murdoch            var maxFileContentRequests = 20;
233e6d4491e48613634a83c1957c72759da80987961Ben Murdoch            var callbacksLeft = 0;
234e6d4491e48613634a83c1957c72759da80987961Ben Murdoch
235e6d4491e48613634a83c1957c72759da80987961Ben Murdoch            function searchInNextFiles()
236e6d4491e48613634a83c1957c72759da80987961Ben Murdoch            {
237e6d4491e48613634a83c1957c72759da80987961Ben Murdoch                for (; callbacksLeft < maxFileContentRequests; ++callbacksLeft) {
238e6d4491e48613634a83c1957c72759da80987961Ben Murdoch                    if (fileIndex >= files.length)
239e6d4491e48613634a83c1957c72759da80987961Ben Murdoch                        break;
240e6d4491e48613634a83c1957c72759da80987961Ben Murdoch                    var path = files[fileIndex++];
241e6d4491e48613634a83c1957c72759da80987961Ben Murdoch                    var filePath = this._filePathForPath(path);
242e6d4491e48613634a83c1957c72759da80987961Ben Murdoch                    this._fileSystem.requestFileContent(filePath, contentCallback.bind(this, path));
243e6d4491e48613634a83c1957c72759da80987961Ben Murdoch                }
244f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)            }
245e6d4491e48613634a83c1957c72759da80987961Ben Murdoch
246e6d4491e48613634a83c1957c72759da80987961Ben Murdoch            searchInNextFiles.call(this);
247f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)
248f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)            /**
249f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)             * @param {string} path
250f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)             * @param {?string} content
251f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)             */
252f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)            function contentCallback(path, content)
253f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)            {
254f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)                var matches = [];
255f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)                if (content !== null)
256f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)                    matches = WebInspector.ContentProvider.performSearchInContent(content, query, caseSensitive, isRegex);
257f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)
258f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)                result.put(path, matches);
259e6d4491e48613634a83c1957c72759da80987961Ben Murdoch                progress.worked(1);
260e6d4491e48613634a83c1957c72759da80987961Ben Murdoch
261e6d4491e48613634a83c1957c72759da80987961Ben Murdoch                --callbacksLeft;
262e6d4491e48613634a83c1957c72759da80987961Ben Murdoch                if (fileIndex < files.length) {
263e6d4491e48613634a83c1957c72759da80987961Ben Murdoch                    searchInNextFiles.call(this);
264e6d4491e48613634a83c1957c72759da80987961Ben Murdoch                } else {
265e6d4491e48613634a83c1957c72759da80987961Ben Murdoch                    if (callbacksLeft)
266e6d4491e48613634a83c1957c72759da80987961Ben Murdoch                        return;
267e6d4491e48613634a83c1957c72759da80987961Ben Murdoch                    progress.done();
268e6d4491e48613634a83c1957c72759da80987961Ben Murdoch                    callback(result);
269e6d4491e48613634a83c1957c72759da80987961Ben Murdoch                }
270f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)            }
271f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)        }
272f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)    },
273f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)
274f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)    /**
275f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)     * @param {number} requestId
276f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)     * @param {Array.<string>} files
277f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)     */
278f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)    searchCompleted: function(requestId, files)
279f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)    {
280f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)        if (!this._searchCallbacks[requestId])
281f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)            return;
282f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)        var callback = this._searchCallbacks[requestId];
283f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)        delete this._searchCallbacks[requestId];
284f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)        callback(files);
285f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)    },
286f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)
287f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)    /**
288f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)     * @param {WebInspector.Progress} progress
289f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)     * @param {function()} callback
290f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)     */
291f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)    indexContent: function(progress, callback)
292f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)    {
293f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)        var requestId = ++WebInspector.FileSystemProjectDelegate._lastRequestId;
294f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)        this._indexingCallbacks[requestId] = callback;
295f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)        this._indexingProgresses[requestId] = progress;
296f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)        progress.setTotalWork(1);
297f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)        progress.addEventListener(WebInspector.Progress.Events.Canceled, this._indexingCanceled.bind(this, requestId));
2981fad5ca6c42d689812b66fc493992aa6d747a6fbBen Murdoch        InspectorFrontendHost.indexPath(requestId, this._fileSystem.path());
299f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)    },
300f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)
301f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)    /**
302f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)     * @param {number} requestId
303f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)     */
304f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)    _indexingCanceled: function(requestId)
305f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)    {
306f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)        if (!this._indexingProgresses[requestId])
307f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)            return;
3081fad5ca6c42d689812b66fc493992aa6d747a6fbBen Murdoch        InspectorFrontendHost.stopIndexing(requestId);
309f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)        delete this._indexingProgresses[requestId];
310f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)        delete this._indexingCallbacks[requestId];
311f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)    },
312f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)
313f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)    /**
314f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)     * @param {number} requestId
315f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)     * @param {number} totalWork
316f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)     */
317f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)    indexingTotalWorkCalculated: function(requestId, totalWork)
318f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)    {
319f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)        if (!this._indexingProgresses[requestId])
320f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)            return;
321f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)        var progress = this._indexingProgresses[requestId];
322f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)        progress.setTotalWork(totalWork);
323f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)    },
324f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)
325f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)    /**
326f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)     * @param {number} requestId
327f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)     * @param {number} worked
328f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)     */
329f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)    indexingWorked: function(requestId, worked)
330f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)    {
331f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)        if (!this._indexingProgresses[requestId])
332f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)            return;
333f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)        var progress = this._indexingProgresses[requestId];
334f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)        progress.worked(worked);
335f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)    },
336f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)
337f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)    /**
338f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)     * @param {number} requestId
339f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)     */
340f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)    indexingDone: function(requestId)
341f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)    {
342f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)        if (!this._indexingProgresses[requestId])
343f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)            return;
344f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)        var progress = this._indexingProgresses[requestId];
345f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)        var callback = this._indexingCallbacks[requestId];
346f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)        delete this._indexingProgresses[requestId];
347f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)        delete this._indexingCallbacks[requestId];
348f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)        progress.done();
349f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)        callback.call();
350f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)    },
351f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)
352f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)    /**
353591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch     * @param {string} path
354591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch     * @return {string}
355591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch     */
356591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    _extensionForPath: function(path)
357591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    {
358591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        var extensionIndex = path.lastIndexOf(".");
359591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        if (extensionIndex === -1)
360591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch            return "";
361591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        return path.substring(extensionIndex + 1).toLowerCase();
362591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    },
363591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
364591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    /**
365591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch     * @param {string} extension
366926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     * @return {WebInspector.ResourceType}
367926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     */
368591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    _contentTypeForExtension: function(extension)
369926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
370926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        if (WebInspector.FileSystemProjectDelegate._scriptExtensions[extension])
371926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            return WebInspector.resourceTypes.Script;
37253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        if (WebInspector.FileSystemProjectDelegate._styleSheetExtensions[extension])
373926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            return WebInspector.resourceTypes.Stylesheet;
374591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        if (WebInspector.FileSystemProjectDelegate._documentExtensions[extension])
375926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            return WebInspector.resourceTypes.Document;
376926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return WebInspector.resourceTypes.Other;
377926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    },
378926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
379926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    populate: function()
380926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
3815267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        this._fileSystem.requestFilesRecursive("", this._addFile.bind(this));
382926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    },
383926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
384926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    /**
3851fad5ca6c42d689812b66fc493992aa6d747a6fbBen Murdoch     * @param {string} path
3861fad5ca6c42d689812b66fc493992aa6d747a6fbBen Murdoch     */
3871fad5ca6c42d689812b66fc493992aa6d747a6fbBen Murdoch    refresh: function(path)
3881fad5ca6c42d689812b66fc493992aa6d747a6fbBen Murdoch    {
3891fad5ca6c42d689812b66fc493992aa6d747a6fbBen Murdoch        this._fileSystem.requestFilesRecursive(path, this._addFile.bind(this));
3901fad5ca6c42d689812b66fc493992aa6d747a6fbBen Murdoch    },
3911fad5ca6c42d689812b66fc493992aa6d747a6fbBen Murdoch
3921fad5ca6c42d689812b66fc493992aa6d747a6fbBen Murdoch    /**
39323e46e0f045bc1935a09565578b448d36cfc5b8cBen Murdoch     * @param {string} path
39423e46e0f045bc1935a09565578b448d36cfc5b8cBen Murdoch     * @param {?string} name
39523e46e0f045bc1935a09565578b448d36cfc5b8cBen Murdoch     * @param {function(?string)} callback
39623e46e0f045bc1935a09565578b448d36cfc5b8cBen Murdoch     */
39723e46e0f045bc1935a09565578b448d36cfc5b8cBen Murdoch    createFile: function(path, name, callback)
39823e46e0f045bc1935a09565578b448d36cfc5b8cBen Murdoch    {
39923e46e0f045bc1935a09565578b448d36cfc5b8cBen Murdoch        this._fileSystem.createFile(path, name, innerCallback.bind(this));
40023e46e0f045bc1935a09565578b448d36cfc5b8cBen Murdoch
40123e46e0f045bc1935a09565578b448d36cfc5b8cBen Murdoch        function innerCallback(filePath)
40223e46e0f045bc1935a09565578b448d36cfc5b8cBen Murdoch        {
40323e46e0f045bc1935a09565578b448d36cfc5b8cBen Murdoch            this._addFile(filePath);
40423e46e0f045bc1935a09565578b448d36cfc5b8cBen Murdoch            callback(filePath);
40523e46e0f045bc1935a09565578b448d36cfc5b8cBen Murdoch        }
40623e46e0f045bc1935a09565578b448d36cfc5b8cBen Murdoch    },
40723e46e0f045bc1935a09565578b448d36cfc5b8cBen Murdoch
40823e46e0f045bc1935a09565578b448d36cfc5b8cBen Murdoch    /**
40923e46e0f045bc1935a09565578b448d36cfc5b8cBen Murdoch     * @param {string} path
41023e46e0f045bc1935a09565578b448d36cfc5b8cBen Murdoch     */
41123e46e0f045bc1935a09565578b448d36cfc5b8cBen Murdoch    deleteFile: function(path)
41223e46e0f045bc1935a09565578b448d36cfc5b8cBen Murdoch    {
41323e46e0f045bc1935a09565578b448d36cfc5b8cBen Murdoch        this._fileSystem.deleteFile(path);
41423e46e0f045bc1935a09565578b448d36cfc5b8cBen Murdoch        this._removeFile(path);
41523e46e0f045bc1935a09565578b448d36cfc5b8cBen Murdoch    },
41623e46e0f045bc1935a09565578b448d36cfc5b8cBen Murdoch
417e6d4491e48613634a83c1957c72759da80987961Ben Murdoch    remove: function()
418e6d4491e48613634a83c1957c72759da80987961Ben Murdoch    {
419e6d4491e48613634a83c1957c72759da80987961Ben Murdoch        WebInspector.isolatedFileSystemManager.removeFileSystem(this._fileSystem.path());
420e6d4491e48613634a83c1957c72759da80987961Ben Murdoch    },
421e6d4491e48613634a83c1957c72759da80987961Ben Murdoch
42223e46e0f045bc1935a09565578b448d36cfc5b8cBen Murdoch    /**
4235267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)     * @param {string} filePath
424926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     */
4255267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    _addFile: function(filePath)
4265267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    {
427591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        if (!filePath)
428591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch            console.assert(false);
429521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)
430591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        var slash = filePath.lastIndexOf("/");
431591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        var parentPath = filePath.substring(0, slash);
432591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        var name = filePath.substring(slash + 1);
433591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
434521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        var url = this._workspace.urlForPath(this._fileSystem.path(), filePath);
435e6d4491e48613634a83c1957c72759da80987961Ben Murdoch        var extension = this._extensionForPath(name);
436591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        var contentType = this._contentTypeForExtension(extension);
437591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
438e6d4491e48613634a83c1957c72759da80987961Ben Murdoch        var fileDescriptor = new WebInspector.FileDescriptor(parentPath, name, this._fileSystemURL + filePath, url, contentType, true);
439926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        this.dispatchEventToListeners(WebInspector.ProjectDelegate.Events.FileAdded, fileDescriptor);
440926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    },
441926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
442926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    /**
443591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch     * @param {string} path
444926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     */
445926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    _removeFile: function(path)
446926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
447926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        this.dispatchEventToListeners(WebInspector.ProjectDelegate.Events.FileRemoved, path);
448926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    },
449926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
450926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    reset: function()
451926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
452926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        this.dispatchEventToListeners(WebInspector.ProjectDelegate.Events.Reset, null);
453926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    },
454926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
455926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    __proto__: WebInspector.Object.prototype
456926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
457926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
458926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)/**
459926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * @type {?WebInspector.FileSystemProjectDelegate}
460926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) */
461926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)WebInspector.fileSystemProjectDelegate = null;
462926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
463926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)/**
464926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * @constructor
465926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * @param {WebInspector.IsolatedFileSystemManager} isolatedFileSystemManager
466926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * @param {WebInspector.Workspace} workspace
467926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) */
468926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)WebInspector.FileSystemWorkspaceProvider = function(isolatedFileSystemManager, workspace)
469926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
470926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    this._isolatedFileSystemManager = isolatedFileSystemManager;
471926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    this._workspace = workspace;
472926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    this._isolatedFileSystemManager.addEventListener(WebInspector.IsolatedFileSystemManager.Events.FileSystemAdded, this._fileSystemAdded, this);
473926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    this._isolatedFileSystemManager.addEventListener(WebInspector.IsolatedFileSystemManager.Events.FileSystemRemoved, this._fileSystemRemoved, this);
474f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)    this._projectDelegates = {};
475926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
476926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
477926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)WebInspector.FileSystemWorkspaceProvider.prototype = {
478926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    /**
479926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     * @param {WebInspector.Event} event
480926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     */
481926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    _fileSystemAdded: function(event)
482926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
483926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        var fileSystem = /** @type {WebInspector.IsolatedFileSystem} */ (event.data);
484926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        var projectId = WebInspector.FileSystemProjectDelegate.projectId(fileSystem.path());
485926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        var projectDelegate = new WebInspector.FileSystemProjectDelegate(fileSystem, this._workspace)
486f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)        this._projectDelegates[projectDelegate.id()] = projectDelegate;
487926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        console.assert(!this._workspace.project(projectDelegate.id()));
488926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        this._workspace.addProject(projectDelegate);
489926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        projectDelegate.populate();
490926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    },
491926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
492926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    /**
493926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     * @param {WebInspector.Event} event
494926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     */
495926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    _fileSystemRemoved: function(event)
496926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
497926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        var fileSystem = /** @type {WebInspector.IsolatedFileSystem} */ (event.data);
498926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        var projectId = WebInspector.FileSystemProjectDelegate.projectId(fileSystem.path());
499926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        this._workspace.removeProject(projectId);
500f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)        delete this._projectDelegates[projectId];
501926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    },
502926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
503926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    /**
504926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     * @param {WebInspector.UISourceCode} uiSourceCode
505926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)     */
506926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    fileSystemPath: function(uiSourceCode)
507926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    {
508f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)        var projectDelegate = this._projectDelegates[uiSourceCode.project().id()];
509926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return projectDelegate.fileSystemPath();
510f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)    },
511f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)
512f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)    /**
513f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)     * @param {WebInspector.FileSystemProjectDelegate} fileSystemPath
514f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)     */
515f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)    delegate: function(fileSystemPath)
516f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)    {
517f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)        var projectId = WebInspector.FileSystemProjectDelegate.projectId(fileSystemPath);
518f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)        return this._projectDelegates[projectId];
519926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
520926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
521926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
522926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)/**
523926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) * @type {?WebInspector.FileSystemWorkspaceProvider}
524926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) */
525926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)WebInspector.fileSystemWorkspaceProvider = null;
526