WebInspector.WorkspaceController = function(workspace)
{
this._workspace = workspace;
WebInspector.resourceTreeModel.addEventListener(WebInspector.ResourceTreeModel.EventTypes.InspectedURLChanged, this._inspectedURLChanged, this);
}
WebInspector.WorkspaceController.prototype = {
_inspectedURLChanged: function(event)
{
WebInspector.Revision.filterOutStaleRevisions();
}
}
WebInspector.FileDescriptor = function(path, originURL, url, contentType, isEditable, isContentScript)
{
this.path = path;
this.originURL = originURL;
this.url = url;
this.contentType = contentType;
this.isEditable = isEditable;
this.isContentScript = isContentScript || false;
}
WebInspector.ProjectDelegate = function() { }
WebInspector.ProjectDelegate.Events = {
FileAdded: "FileAdded",
FileRemoved: "FileRemoved",
Reset: "Reset",
}
WebInspector.ProjectDelegate.prototype = {
id: function() { },
type: function() { },
displayName: function() { },
requestFileContent: function(path, callback) { },
canSetFileContent: function() { },
setFileContent: function(path, newContent, callback) { },
searchInFileContent: function(path, query, caseSensitive, isRegex, callback) { }
}
WebInspector.workspaceController = null;
WebInspector.Project = function(workspace, projectDelegate)
{
this._uiSourceCodes = {};
this._workspace = workspace;
this._projectDelegate = projectDelegate;
this._projectDelegate.addEventListener(WebInspector.ProjectDelegate.Events.FileAdded, this._fileAdded, this);
this._projectDelegate.addEventListener(WebInspector.ProjectDelegate.Events.FileRemoved, this._fileRemoved, this);
this._projectDelegate.addEventListener(WebInspector.ProjectDelegate.Events.Reset, this._reset, this);
}
WebInspector.Project.prototype = {
id: function()
{
return this._projectDelegate.id();
},
type: function()
{
return this._projectDelegate.type();
},
displayName: function()
{
return this._projectDelegate.displayName();
},
isServiceProject: function()
{
return this._projectDelegate.type() === WebInspector.projectTypes.Debugger || this._projectDelegate.type() === WebInspector.projectTypes.LiveEdit;
},
_fileAdded: function(event)
{
var fileDescriptor = (event.data);
var uiSourceCode = this.uiSourceCode(fileDescriptor.path);
if (uiSourceCode) {
return;
}
uiSourceCode = new WebInspector.UISourceCode(this, fileDescriptor.path, fileDescriptor.originURL, fileDescriptor.url, fileDescriptor.contentType, fileDescriptor.isEditable);
uiSourceCode.isContentScript = fileDescriptor.isContentScript;
this._uiSourceCodes[uiSourceCode.path().join("/")] = uiSourceCode;
this._workspace.dispatchEventToListeners(WebInspector.UISourceCodeProvider.Events.UISourceCodeAdded, uiSourceCode);
},
_fileRemoved: function(event)
{
var path = (event.data);
var uiSourceCode = this.uiSourceCode(path);
if (!uiSourceCode)
return;
delete this._uiSourceCodes[uiSourceCode.path().join("/")];
this._workspace.dispatchEventToListeners(WebInspector.UISourceCodeProvider.Events.UISourceCodeRemoved, uiSourceCode);
},
_reset: function()
{
this._workspace.dispatchEventToListeners(WebInspector.Workspace.Events.ProjectWillReset, this);
this._uiSourceCodes = {};
},
uiSourceCode: function(path)
{
return this._uiSourceCodes[path.join("/")] || null;
},
uiSourceCodeForOriginURL: function(originURL)
{
for (var path in this._uiSourceCodes) {
var uiSourceCode = this._uiSourceCodes[path];
if (uiSourceCode.originURL() === originURL)
return uiSourceCode;
}
return null;
},
uiSourceCodes: function()
{
return Object.values(this._uiSourceCodes);
},
requestFileContent: function(uiSourceCode, callback)
{
this._projectDelegate.requestFileContent(uiSourceCode.path(), callback);
},
canSetFileContent: function()
{
return this._projectDelegate.canSetFileContent();
},
setFileContent: function(uiSourceCode, newContent, callback)
{
this._projectDelegate.setFileContent(uiSourceCode.path(), newContent, callback);
this._workspace.dispatchEventToListeners(WebInspector.Workspace.Events.UISourceCodeContentCommitted, { uiSourceCode: uiSourceCode, content: newContent });
},
searchInFileContent: function(uiSourceCode, query, caseSensitive, isRegex, callback)
{
this._projectDelegate.searchInFileContent(uiSourceCode.path(), query, caseSensitive, isRegex, callback);
},
dispose: function()
{
this._projectDelegate.reset();
}
}
WebInspector.projectTypes = {
Debugger: "debugger",
LiveEdit: "liveedit",
Network: "network",
Snippets: "snippets",
FileSystem: "filesystem"
}
WebInspector.Workspace = function(fileMapping, fileSystemMapping)
{
this._fileMapping = fileMapping;
this._fileSystemMapping = fileSystemMapping;
this._projects = {};
}
WebInspector.Workspace.Events = {
UISourceCodeContentCommitted: "UISourceCodeContentCommitted",
ProjectWillReset: "ProjectWillReset"
}
WebInspector.Workspace.prototype = {
uiSourceCode: function(projectId, path)
{
var project = this._projects[projectId];
return project ? project.uiSourceCode(path) : null;
},
uiSourceCodeForOriginURL: function(originURL)
{
var networkProjects = this.projectsForType(WebInspector.projectTypes.Network)
for (var i = 0; i < networkProjects.length; ++i) {
var project = networkProjects[i];
var uiSourceCode = project.uiSourceCodeForOriginURL(originURL);
if (uiSourceCode)
return uiSourceCode;
}
return null;
},
uiSourceCodesForProjectType: function(type)
{
var result = [];
for (var projectName in this._projects) {
var project = this._projects[projectName];
if (project.type() === type)
result = result.concat(project.uiSourceCodes());
}
return result;
},
addProject: function(projectDelegate)
{
var projectId = projectDelegate.id();
this._projects[projectId] = new WebInspector.Project(this, projectDelegate);
return this._projects[projectId];
},
removeProject: function(projectId)
{
var project = this._projects[projectId];
if (!project)
return;
project.dispose();
delete this._projects[projectId];
},
project: function(projectId)
{
return this._projects[projectId];
},
projects: function()
{
return Object.values(this._projects);
},
projectsForType: function(type)
{
function filterByType(project)
{
return project.type() === type;
}
return this.projects().filter(filterByType);
},
uiSourceCodes: function()
{
var result = [];
for (var projectId in this._projects) {
var project = this._projects[projectId];
result = result.concat(project.uiSourceCodes());
}
return result;
},
hasMappingForURL: function(url)
{
var entry = this._fileMapping.mappingEntryForURL(url);
if (!entry)
return false;
return !!this._fileSystemPathForEntry(entry);
},
_fileSystemPathForEntry: function(entry)
{
return this._fileSystemMapping.fileSystemPathForPrefix(entry.pathPrefix);
},
uiSourceCodeForURL: function(url)
{
var entry = this._fileMapping.mappingEntryForURL(url);
var fileSystemPath = entry ? this._fileSystemPathForEntry(entry) : null;
if (!fileSystemPath) {
var splittedURL = WebInspector.ParsedURL.splitURL(url);
var projectId = WebInspector.SimpleProjectDelegate.projectId(splittedURL[0], WebInspector.projectTypes.Network);
var path = WebInspector.SimpleWorkspaceProvider.pathForSplittedURL(splittedURL);
var project = this.project(projectId);
return project ? project.uiSourceCode(path) : null;
}
var projectId = WebInspector.FileSystemProjectDelegate.projectId(fileSystemPath);
var pathPrefix = entry.pathPrefix.substr(fileSystemPath.length + 1);
var path = pathPrefix + url.substr(entry.urlPrefix.length);
var project = this.project(projectId);
return project ? project.uiSourceCode(path.split("/")) : null;
},
urlForPath: function(path)
{
var entry = this._fileMapping.mappingEntryForPath(path);
if (!entry)
return "";
return entry.urlPrefix + path.substring(entry.pathPrefix.length);
},
addMapping: function(networkUISourceCode, uiSourceCode, fileSystemWorkspaceProvider)
{
var url = networkUISourceCode.url;
var path = uiSourceCode.path();
var suffix = "";
for (var i = path.length - 1; i >= 0; --i) {
var nextSuffix = "/" + path[i] + suffix;
if (!url.endsWith(nextSuffix))
break;
suffix = nextSuffix;
}
var fileSystemPath = fileSystemWorkspaceProvider.fileSystemPath(uiSourceCode);
var filePath = "/" + path.join("/");
var pathPrefix = fileSystemPath + filePath.substr(0, filePath.length - suffix.length) + "/";
var urlPrefix = url.substr(0, url.length - suffix.length) + "/";
var entries = this._fileMapping.mappingEntries();
var entry = new WebInspector.FileMapping.Entry(urlPrefix, pathPrefix);
entries.push(entry);
this._fileMapping.setMappingEntries(entries);
WebInspector.suggestReload();
},
removeMapping: function(uiSourceCode)
{
var entry = this._fileMapping.mappingEntryForURL(uiSourceCode.url);
var entries = this._fileMapping.mappingEntries();
entries.remove(entry);
this._fileMapping.setMappingEntries(entries);
WebInspector.suggestReload();
},
__proto__: WebInspector.Object.prototype
}
WebInspector.workspace = null;