Commit 72876dba authored by Andrey Lushnikov's avatar Andrey Lushnikov Committed by Commit Bot

DevTools: teach navigator to show unique names for file system projects

This patch starts computing unique suffixes for file system projects.

BUG=633305
R=dgozman

Change-Id: I9e0cea72ccf7750b21d0708e079f69178e06650d
Reviewed-on: https://chromium-review.googlesource.com/822603
Commit-Queue: Andrey Lushnikov <lushnikov@chromium.org>
Reviewed-by: default avatarDmitry Gozman <dgozman@chromium.org>
Cr-Commit-Position: refs/heads/master@{#523601}
parent c9e5af61
Verify that navigator view removes mapped UISourceCodes.
[largeicon-navigator-folder] bad/foo/bar [dimmed]
[largeicon-navigator-file] 2.js
[largeicon-navigator-folder] ugly/bar [dimmed]
[largeicon-navigator-file] 3.js
[largeicon-navigator-folder] good/foo/bar [dimmed]
[largeicon-navigator-file] 1.js
// Copyright 2017 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
(async function() {
TestRunner.addResult(`Verify that navigator view removes mapped UISourceCodes.\n`);
await TestRunner.loadModule('sources_test_runner');
await TestRunner.loadModule('bindings_test_runner');
Runtime.experiments.enableForTest('persistence2');
var filesNavigator = new Sources.FilesNavigatorView();
filesNavigator.show(UI.inspectorView.element);
var fs1 = new BindingsTestRunner.TestFileSystem('file:///home/workspace/good/foo/bar');
fs1.addFile('1.js', '');
fs1.reportCreated(function() { });
var fs2 = new BindingsTestRunner.TestFileSystem('file:///home/workspace/bad/foo/bar');
fs2.addFile('2.js', '');
fs2.reportCreated(function(){ });
var fs3 = new BindingsTestRunner.TestFileSystem('file:///home/workspace/ugly/bar');
fs3.addFile('3.js', '');
fs3.reportCreated(function(){ });
await Promise.all([
TestRunner.waitForUISourceCode('1.js'),
TestRunner.waitForUISourceCode('2.js'),
TestRunner.waitForUISourceCode('3.js')
]);
SourcesTestRunner.dumpNavigatorView(filesNavigator, true);
TestRunner.completeTest();
})();
...@@ -25,7 +25,7 @@ Persistence.Automapping = class { ...@@ -25,7 +25,7 @@ Persistence.Automapping = class {
this._fileSystemUISourceCodes = new Map(); this._fileSystemUISourceCodes = new Map();
this._sweepThrottler = new Common.Throttler(100); this._sweepThrottler = new Common.Throttler(100);
var pathEncoder = new Persistence.Automapping.PathEncoder(); var pathEncoder = new Persistence.PathEncoder();
this._filesIndex = new Persistence.Automapping.FilePathIndex(pathEncoder); this._filesIndex = new Persistence.Automapping.FilePathIndex(pathEncoder);
this._projectFoldersIndex = new Persistence.Automapping.FolderIndex(pathEncoder); this._projectFoldersIndex = new Persistence.Automapping.FolderIndex(pathEncoder);
this._activeFoldersIndex = new Persistence.Automapping.FolderIndex(pathEncoder); this._activeFoldersIndex = new Persistence.Automapping.FolderIndex(pathEncoder);
...@@ -335,38 +335,12 @@ Persistence.Automapping._binding = Symbol('Automapping.Binding'); ...@@ -335,38 +335,12 @@ Persistence.Automapping._binding = Symbol('Automapping.Binding');
Persistence.Automapping._processingPromise = Symbol('Automapping.ProcessingPromise'); Persistence.Automapping._processingPromise = Symbol('Automapping.ProcessingPromise');
Persistence.Automapping._metadata = Symbol('Automapping.Metadata'); Persistence.Automapping._metadata = Symbol('Automapping.Metadata');
/**
* @unrestricted
*/
Persistence.Automapping.PathEncoder = class {
constructor() {
/** @type {!Common.CharacterIdMap<string>} */
this._encoder = new Common.CharacterIdMap();
}
/**
* @param {string} path
* @return {string}
*/
encode(path) {
return path.split('/').map(token => this._encoder.toChar(token)).join('');
}
/**
* @param {string} path
* @return {string}
*/
decode(path) {
return path.split('').map(token => this._encoder.fromChar(token)).join('/');
}
};
/** /**
* @unrestricted * @unrestricted
*/ */
Persistence.Automapping.FilePathIndex = class { Persistence.Automapping.FilePathIndex = class {
/** /**
* @param {!Persistence.Automapping.PathEncoder} encoder * @param {!Persistence.PathEncoder} encoder
*/ */
constructor(encoder) { constructor(encoder) {
this._encoder = encoder; this._encoder = encoder;
...@@ -408,7 +382,7 @@ Persistence.Automapping.FilePathIndex = class { ...@@ -408,7 +382,7 @@ Persistence.Automapping.FilePathIndex = class {
*/ */
Persistence.Automapping.FolderIndex = class { Persistence.Automapping.FolderIndex = class {
/** /**
* @param {!Persistence.Automapping.PathEncoder} encoder * @param {!Persistence.PathEncoder} encoder
*/ */
constructor(encoder) { constructor(encoder) {
this._encoder = encoder; this._encoder = encoder;
......
...@@ -401,6 +401,32 @@ Persistence.Persistence.Events = { ...@@ -401,6 +401,32 @@ Persistence.Persistence.Events = {
BindingRemoved: Symbol('BindingRemoved') BindingRemoved: Symbol('BindingRemoved')
}; };
/**
* @unrestricted
*/
Persistence.PathEncoder = class {
constructor() {
/** @type {!Common.CharacterIdMap<string>} */
this._encoder = new Common.CharacterIdMap();
}
/**
* @param {string} path
* @return {string}
*/
encode(path) {
return path.split('/').map(token => this._encoder.toChar(token)).join('');
}
/**
* @param {string} path
* @return {string}
*/
decode(path) {
return path.split('').map(token => this._encoder.fromChar(token)).join('/');
}
};
/** /**
* @unrestricted * @unrestricted
*/ */
......
...@@ -226,13 +226,20 @@ Sources.NavigatorView = class extends UI.VBox { ...@@ -226,13 +226,20 @@ Sources.NavigatorView = class extends UI.VBox {
this._workspace = workspace; this._workspace = workspace;
this._workspace.addEventListener(Workspace.Workspace.Events.UISourceCodeAdded, this._uiSourceCodeAdded, this); this._workspace.addEventListener(Workspace.Workspace.Events.UISourceCodeAdded, this._uiSourceCodeAdded, this);
this._workspace.addEventListener(Workspace.Workspace.Events.UISourceCodeRemoved, this._uiSourceCodeRemoved, this); this._workspace.addEventListener(Workspace.Workspace.Events.UISourceCodeRemoved, this._uiSourceCodeRemoved, this);
this._workspace.addEventListener( this._workspace.addEventListener(Workspace.Workspace.Events.ProjectAdded, event => {
Workspace.Workspace.Events.ProjectAdded, var project = /** @type {!Workspace.Project} */ (event.data);
event => this._projectAdded(/** @type {!Workspace.Project} */ (event.data)), this); this._projectAdded(project);
this._workspace.addEventListener( if (project.type() === Workspace.projectTypes.FileSystem)
Workspace.Workspace.Events.ProjectRemoved, this._computeUniqueFileSystemProjectNames();
event => this._removeProject(/** @type {!Workspace.Project} */ (event.data)), this); });
this._workspace.addEventListener(Workspace.Workspace.Events.ProjectRemoved, event => {
var project = /** @type {!Workspace.Project} */ (event.data);
this._removeProject(project);
if (project.type() === Workspace.projectTypes.FileSystem)
this._computeUniqueFileSystemProjectNames();
});
this._workspace.projects().forEach(this._projectAdded.bind(this)); this._workspace.projects().forEach(this._projectAdded.bind(this));
this._computeUniqueFileSystemProjectNames();
} }
/** /**
...@@ -371,6 +378,32 @@ Sources.NavigatorView = class extends UI.VBox { ...@@ -371,6 +378,32 @@ Sources.NavigatorView = class extends UI.VBox {
this, project, project.id(), Sources.NavigatorView.Types.FileSystem, project.displayName())); this, project, project.id(), Sources.NavigatorView.Types.FileSystem, project.displayName()));
} }
_computeUniqueFileSystemProjectNames() {
var fileSystemProjects = this._workspace.projectsForType(Workspace.projectTypes.FileSystem);
if (!fileSystemProjects.length)
return;
var encoder = new Persistence.PathEncoder();
var reversedPaths = fileSystemProjects.map(project => {
var fileSystem = /** @type {!Persistence.FileSystemWorkspaceBinding.FileSystem} */ (project);
return encoder.encode(fileSystem.fileSystemPath()).reverse();
});
var reversedIndex = new Common.Trie();
for (var reversedPath of reversedPaths)
reversedIndex.add(reversedPath);
for (var i = 0; i < fileSystemProjects.length; ++i) {
var reversedPath = reversedPaths[i];
var project = fileSystemProjects[i];
reversedIndex.remove(reversedPath);
var commonPrefix = reversedIndex.longestPrefix(reversedPath, false /* fullWordOnly */);
reversedIndex.add(reversedPath);
var path = encoder.decode(reversedPath.substring(0, commonPrefix.length + 1).reverse());
var fileSystemNode = this._rootNode.child(project.id());
if (fileSystemNode)
fileSystemNode.setTitle(path);
}
}
/** /**
* @param {!Workspace.Project} project * @param {!Workspace.Project} project
*/ */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment