| Index: third_party/WebKit/Source/devtools/front_end/persistence/Automapping.js
|
| diff --git a/third_party/WebKit/Source/devtools/front_end/persistence/Automapping.js b/third_party/WebKit/Source/devtools/front_end/persistence/Automapping.js
|
| index 04d961fe75380656f844b056e2562682337320d8..fb1afe9e43d7de22110db92d657dc949ee61afb8 100644
|
| --- a/third_party/WebKit/Source/devtools/front_end/persistence/Automapping.js
|
| +++ b/third_party/WebKit/Source/devtools/front_end/persistence/Automapping.js
|
| @@ -1,15 +1,16 @@
|
| // Copyright 2016 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.
|
| -
|
| /**
|
| - * @constructor
|
| - * @param {!WebInspector.Workspace} workspace
|
| - * @param {function(!WebInspector.PersistenceBinding)} onBindingCreated
|
| - * @param {function(!WebInspector.PersistenceBinding)} onBindingRemoved
|
| + * @unrestricted
|
| */
|
| -WebInspector.Automapping = function(workspace, onBindingCreated, onBindingRemoved)
|
| -{
|
| +WebInspector.Automapping = class {
|
| + /**
|
| + * @param {!WebInspector.Workspace} workspace
|
| + * @param {function(!WebInspector.PersistenceBinding)} onBindingCreated
|
| + * @param {function(!WebInspector.PersistenceBinding)} onBindingRemoved
|
| + */
|
| + constructor(workspace, onBindingCreated, onBindingRemoved) {
|
| this._workspace = workspace;
|
|
|
| this._onBindingCreated = onBindingCreated;
|
| @@ -27,384 +28,374 @@ WebInspector.Automapping = function(workspace, onBindingCreated, onBindingRemove
|
| this._activeFoldersIndex = new WebInspector.Automapping.FolderIndex(pathEncoder);
|
|
|
| this._eventListeners = [
|
| - this._workspace.addEventListener(WebInspector.Workspace.Events.UISourceCodeAdded, event => this._onUISourceCodeAdded(/** @type {!WebInspector.UISourceCode} */(event.data))),
|
| - this._workspace.addEventListener(WebInspector.Workspace.Events.UISourceCodeRemoved, event => this._onUISourceCodeRemoved(/** @type {!WebInspector.UISourceCode} */(event.data))),
|
| - this._workspace.addEventListener(WebInspector.Workspace.Events.ProjectAdded, event => this._onProjectAdded(/** @type {!WebInspector.Project} */(event.data)), this),
|
| - this._workspace.addEventListener(WebInspector.Workspace.Events.ProjectRemoved, event => this._onProjectRemoved(/** @type {!WebInspector.Project} */(event.data)), this),
|
| + this._workspace.addEventListener(
|
| + WebInspector.Workspace.Events.UISourceCodeAdded,
|
| + event => this._onUISourceCodeAdded(/** @type {!WebInspector.UISourceCode} */ (event.data))),
|
| + this._workspace.addEventListener(
|
| + WebInspector.Workspace.Events.UISourceCodeRemoved,
|
| + event => this._onUISourceCodeRemoved(/** @type {!WebInspector.UISourceCode} */ (event.data))),
|
| + this._workspace.addEventListener(
|
| + WebInspector.Workspace.Events.ProjectAdded,
|
| + event => this._onProjectAdded(/** @type {!WebInspector.Project} */ (event.data)), this),
|
| + this._workspace.addEventListener(
|
| + WebInspector.Workspace.Events.ProjectRemoved,
|
| + event => this._onProjectRemoved(/** @type {!WebInspector.Project} */ (event.data)), this),
|
| ];
|
|
|
| for (var fileSystem of workspace.projects())
|
| - this._onProjectAdded(fileSystem);
|
| + this._onProjectAdded(fileSystem);
|
| for (var uiSourceCode of workspace.uiSourceCodes())
|
| - this._onUISourceCodeAdded(uiSourceCode);
|
| -};
|
| + this._onUISourceCodeAdded(uiSourceCode);
|
| + }
|
|
|
| -WebInspector.Automapping._binding = Symbol("Automapping.Binding");
|
| -WebInspector.Automapping._processingPromise = Symbol("Automapping.ProcessingPromise");
|
| -WebInspector.Automapping._metadata = Symbol("Automapping.Metadata");
|
| -
|
| -WebInspector.Automapping.prototype = {
|
| - _scheduleRemap: function()
|
| - {
|
| - for (var binding of this._bindings.valuesArray())
|
| - this._unbindNetwork(binding.network);
|
| - this._scheduleSweep();
|
| - },
|
| -
|
| - _scheduleSweep: function()
|
| - {
|
| - this._sweepThrottler.schedule(sweepUnmapped.bind(this));
|
| -
|
| - /**
|
| - * @this {WebInspector.Automapping}
|
| - * @return {!Promise}
|
| - */
|
| - function sweepUnmapped()
|
| - {
|
| - var networkProjects = this._workspace.projectsForType(WebInspector.projectTypes.Network);
|
| - for (var networkProject of networkProjects) {
|
| - for (var uiSourceCode of networkProject.uiSourceCodes())
|
| - this._bindNetwork(uiSourceCode);
|
| - }
|
| - this._onSweepHappenedForTest();
|
| - return Promise.resolve();
|
| - }
|
| - },
|
| -
|
| - _onSweepHappenedForTest: function() { },
|
| + _scheduleRemap() {
|
| + for (var binding of this._bindings.valuesArray())
|
| + this._unbindNetwork(binding.network);
|
| + this._scheduleSweep();
|
| + }
|
|
|
| - /**
|
| - * @param {!WebInspector.Project} project
|
| - */
|
| - _onProjectRemoved: function(project)
|
| - {
|
| - for (var uiSourceCode of project.uiSourceCodes())
|
| - this._onUISourceCodeRemoved(uiSourceCode);
|
| - if (project.type() !== WebInspector.projectTypes.FileSystem)
|
| - return;
|
| - var fileSystem = /** @type {!WebInspector.FileSystemWorkspaceBinding.FileSystem} */(project);
|
| - for (var gitFolder of fileSystem.gitFolders())
|
| - this._projectFoldersIndex.removeFolder(gitFolder);
|
| - this._projectFoldersIndex.removeFolder(fileSystem.fileSystemPath());
|
| - this._scheduleRemap();
|
| - },
|
| -
|
| - /**
|
| - * @param {!WebInspector.Project} project
|
| - */
|
| - _onProjectAdded: function(project)
|
| - {
|
| - if (project.type() !== WebInspector.projectTypes.FileSystem)
|
| - return;
|
| - var fileSystem = /** @type {!WebInspector.FileSystemWorkspaceBinding.FileSystem} */(project);
|
| - for (var gitFolder of fileSystem.gitFolders())
|
| - this._projectFoldersIndex.addFolder(gitFolder);
|
| - this._projectFoldersIndex.addFolder(fileSystem.fileSystemPath());
|
| - this._scheduleRemap();
|
| - },
|
| + _scheduleSweep() {
|
| + this._sweepThrottler.schedule(sweepUnmapped.bind(this));
|
|
|
| /**
|
| - * @param {!WebInspector.UISourceCode} uiSourceCode
|
| - */
|
| - _onUISourceCodeAdded: function(uiSourceCode)
|
| - {
|
| - if (uiSourceCode.project().type() === WebInspector.projectTypes.FileSystem) {
|
| - this._filesIndex.addPath(uiSourceCode.url());
|
| - this._fileSystemUISourceCodes.set(uiSourceCode.url(), uiSourceCode);
|
| - this._scheduleSweep();
|
| - } else if (uiSourceCode.project().type() === WebInspector.projectTypes.Network) {
|
| - this._bindNetwork(uiSourceCode);
|
| - }
|
| - },
|
| -
|
| - /**
|
| - * @param {!WebInspector.UISourceCode} uiSourceCode
|
| + * @this {WebInspector.Automapping}
|
| + * @return {!Promise}
|
| */
|
| - _onUISourceCodeRemoved: function(uiSourceCode)
|
| - {
|
| - if (uiSourceCode.project().type() === WebInspector.projectTypes.FileSystem) {
|
| - this._filesIndex.removePath(uiSourceCode.url());
|
| - this._fileSystemUISourceCodes.delete(uiSourceCode.url());
|
| - var binding = uiSourceCode[WebInspector.Automapping._binding];
|
| - if (binding)
|
| - this._unbindNetwork(binding.network);
|
| - } else if (uiSourceCode.project().type() === WebInspector.projectTypes.Network) {
|
| - this._unbindNetwork(uiSourceCode);
|
| - }
|
| - },
|
| + function sweepUnmapped() {
|
| + var networkProjects = this._workspace.projectsForType(WebInspector.projectTypes.Network);
|
| + for (var networkProject of networkProjects) {
|
| + for (var uiSourceCode of networkProject.uiSourceCodes())
|
| + this._bindNetwork(uiSourceCode);
|
| + }
|
| + this._onSweepHappenedForTest();
|
| + return Promise.resolve();
|
| + }
|
| + }
|
| +
|
| + _onSweepHappenedForTest() {
|
| + }
|
| +
|
| + /**
|
| + * @param {!WebInspector.Project} project
|
| + */
|
| + _onProjectRemoved(project) {
|
| + for (var uiSourceCode of project.uiSourceCodes())
|
| + this._onUISourceCodeRemoved(uiSourceCode);
|
| + if (project.type() !== WebInspector.projectTypes.FileSystem)
|
| + return;
|
| + var fileSystem = /** @type {!WebInspector.FileSystemWorkspaceBinding.FileSystem} */ (project);
|
| + for (var gitFolder of fileSystem.gitFolders())
|
| + this._projectFoldersIndex.removeFolder(gitFolder);
|
| + this._projectFoldersIndex.removeFolder(fileSystem.fileSystemPath());
|
| + this._scheduleRemap();
|
| + }
|
| +
|
| + /**
|
| + * @param {!WebInspector.Project} project
|
| + */
|
| + _onProjectAdded(project) {
|
| + if (project.type() !== WebInspector.projectTypes.FileSystem)
|
| + return;
|
| + var fileSystem = /** @type {!WebInspector.FileSystemWorkspaceBinding.FileSystem} */ (project);
|
| + for (var gitFolder of fileSystem.gitFolders())
|
| + this._projectFoldersIndex.addFolder(gitFolder);
|
| + this._projectFoldersIndex.addFolder(fileSystem.fileSystemPath());
|
| + this._scheduleRemap();
|
| + }
|
| +
|
| + /**
|
| + * @param {!WebInspector.UISourceCode} uiSourceCode
|
| + */
|
| + _onUISourceCodeAdded(uiSourceCode) {
|
| + if (uiSourceCode.project().type() === WebInspector.projectTypes.FileSystem) {
|
| + this._filesIndex.addPath(uiSourceCode.url());
|
| + this._fileSystemUISourceCodes.set(uiSourceCode.url(), uiSourceCode);
|
| + this._scheduleSweep();
|
| + } else if (uiSourceCode.project().type() === WebInspector.projectTypes.Network) {
|
| + this._bindNetwork(uiSourceCode);
|
| + }
|
| + }
|
| +
|
| + /**
|
| + * @param {!WebInspector.UISourceCode} uiSourceCode
|
| + */
|
| + _onUISourceCodeRemoved(uiSourceCode) {
|
| + if (uiSourceCode.project().type() === WebInspector.projectTypes.FileSystem) {
|
| + this._filesIndex.removePath(uiSourceCode.url());
|
| + this._fileSystemUISourceCodes.delete(uiSourceCode.url());
|
| + var binding = uiSourceCode[WebInspector.Automapping._binding];
|
| + if (binding)
|
| + this._unbindNetwork(binding.network);
|
| + } else if (uiSourceCode.project().type() === WebInspector.projectTypes.Network) {
|
| + this._unbindNetwork(uiSourceCode);
|
| + }
|
| + }
|
| +
|
| + /**
|
| + * @param {!WebInspector.UISourceCode} networkSourceCode
|
| + */
|
| + _bindNetwork(networkSourceCode) {
|
| + if (networkSourceCode[WebInspector.Automapping._processingPromise] ||
|
| + networkSourceCode[WebInspector.Automapping._binding])
|
| + return;
|
| + var createBindingPromise = this._createBinding(networkSourceCode).then(onBinding.bind(this));
|
| + networkSourceCode[WebInspector.Automapping._processingPromise] = createBindingPromise;
|
|
|
| /**
|
| - * @param {!WebInspector.UISourceCode} networkSourceCode
|
| + * @param {?WebInspector.PersistenceBinding} binding
|
| + * @this {WebInspector.Automapping}
|
| */
|
| - _bindNetwork: function(networkSourceCode)
|
| - {
|
| - if (networkSourceCode[WebInspector.Automapping._processingPromise] || networkSourceCode[WebInspector.Automapping._binding])
|
| - return;
|
| - var createBindingPromise = this._createBinding(networkSourceCode).then(onBinding.bind(this));
|
| - networkSourceCode[WebInspector.Automapping._processingPromise] = createBindingPromise;
|
| -
|
| - /**
|
| - * @param {?WebInspector.PersistenceBinding} binding
|
| - * @this {WebInspector.Automapping}
|
| - */
|
| - function onBinding(binding)
|
| - {
|
| - if (networkSourceCode[WebInspector.Automapping._processingPromise] !== createBindingPromise)
|
| - return;
|
| - networkSourceCode[WebInspector.Automapping._processingPromise] = null;
|
| - if (!binding) {
|
| - this._onBindingFailedForTest();
|
| - return;
|
| - }
|
| -
|
| - this._bindings.add(binding);
|
| - binding.network[WebInspector.Automapping._binding] = binding;
|
| - binding.fileSystem[WebInspector.Automapping._binding] = binding;
|
| - if (binding.exactMatch) {
|
| - var projectFolder = this._projectFoldersIndex.closestParentFolder(binding.fileSystem.url());
|
| - var newFolderAdded = projectFolder ? this._activeFoldersIndex.addFolder(projectFolder) : false;
|
| - if (newFolderAdded)
|
| - this._scheduleSweep();
|
| - }
|
| - this._onBindingCreated.call(null, binding);
|
| - }
|
| - },
|
| -
|
| - _onBindingFailedForTest: function() { },
|
| + function onBinding(binding) {
|
| + if (networkSourceCode[WebInspector.Automapping._processingPromise] !== createBindingPromise)
|
| + return;
|
| + networkSourceCode[WebInspector.Automapping._processingPromise] = null;
|
| + if (!binding) {
|
| + this._onBindingFailedForTest();
|
| + return;
|
| + }
|
| +
|
| + this._bindings.add(binding);
|
| + binding.network[WebInspector.Automapping._binding] = binding;
|
| + binding.fileSystem[WebInspector.Automapping._binding] = binding;
|
| + if (binding.exactMatch) {
|
| + var projectFolder = this._projectFoldersIndex.closestParentFolder(binding.fileSystem.url());
|
| + var newFolderAdded = projectFolder ? this._activeFoldersIndex.addFolder(projectFolder) : false;
|
| + if (newFolderAdded)
|
| + this._scheduleSweep();
|
| + }
|
| + this._onBindingCreated.call(null, binding);
|
| + }
|
| + }
|
| +
|
| + _onBindingFailedForTest() {
|
| + }
|
| +
|
| + /**
|
| + * @param {!WebInspector.UISourceCode} networkSourceCode
|
| + */
|
| + _unbindNetwork(networkSourceCode) {
|
| + if (networkSourceCode[WebInspector.Automapping._processingPromise]) {
|
| + networkSourceCode[WebInspector.Automapping._processingPromise] = null;
|
| + return;
|
| + }
|
| + var binding = networkSourceCode[WebInspector.Automapping._binding];
|
| + if (!binding)
|
| + return;
|
| +
|
| + this._bindings.delete(binding);
|
| + binding.network[WebInspector.Automapping._binding] = null;
|
| + binding.fileSystem[WebInspector.Automapping._binding] = null;
|
| + if (binding.exactMatch) {
|
| + var projectFolder = this._projectFoldersIndex.closestParentFolder(binding.fileSystem.url());
|
| + if (projectFolder)
|
| + this._activeFoldersIndex.removeFolder(projectFolder);
|
| + }
|
| + this._onBindingRemoved.call(null, binding);
|
| + }
|
| +
|
| + /**
|
| + * @param {!WebInspector.UISourceCode} networkSourceCode
|
| + * @return {!Promise<?WebInspector.PersistenceBinding>}
|
| + */
|
| + _createBinding(networkSourceCode) {
|
| + var networkPath = WebInspector.ParsedURL.extractPath(networkSourceCode.url());
|
| + if (networkPath === null)
|
| + return Promise.resolve(/** @type {?WebInspector.PersistenceBinding} */ (null));
|
| +
|
| + if (networkPath.endsWith('/'))
|
| + networkPath += 'index.html';
|
| + var similarFiles = this._filesIndex.similarFiles(networkPath).map(path => this._fileSystemUISourceCodes.get(path));
|
| + if (!similarFiles.length)
|
| + return Promise.resolve(/** @type {?WebInspector.PersistenceBinding} */ (null));
|
| +
|
| + return this._pullMetadatas(similarFiles.concat(networkSourceCode)).then(onMetadatas.bind(this));
|
|
|
| /**
|
| - * @param {!WebInspector.UISourceCode} networkSourceCode
|
| + * @this {WebInspector.Automapping}
|
| */
|
| - _unbindNetwork: function(networkSourceCode)
|
| - {
|
| - if (networkSourceCode[WebInspector.Automapping._processingPromise]) {
|
| - networkSourceCode[WebInspector.Automapping._processingPromise] = null;
|
| - return;
|
| - }
|
| - var binding = networkSourceCode[WebInspector.Automapping._binding];
|
| - if (!binding)
|
| - return;
|
| -
|
| - this._bindings.delete(binding);
|
| - binding.network[WebInspector.Automapping._binding] = null;
|
| - binding.fileSystem[WebInspector.Automapping._binding] = null;
|
| - if (binding.exactMatch) {
|
| - var projectFolder = this._projectFoldersIndex.closestParentFolder(binding.fileSystem.url());
|
| - if (projectFolder)
|
| - this._activeFoldersIndex.removeFolder(projectFolder);
|
| - }
|
| - this._onBindingRemoved.call(null, binding);
|
| - },
|
| + function onMetadatas() {
|
| + var activeFiles = similarFiles.filter(file => !!this._activeFoldersIndex.closestParentFolder(file.url()));
|
| + var networkMetadata = networkSourceCode[WebInspector.Automapping._metadata];
|
| + if (!networkMetadata || (!networkMetadata.modificationTime && typeof networkMetadata.contentSize !== 'number')) {
|
| + // If networkSourceCode does not have metadata, try to match against active folders.
|
| + if (activeFiles.length !== 1)
|
| + return null;
|
| + return new WebInspector.PersistenceBinding(networkSourceCode, activeFiles[0], false);
|
| + }
|
| +
|
| + // Try to find exact matches, prioritizing active folders.
|
| + var exactMatches = this._filterWithMetadata(activeFiles, networkMetadata);
|
| + if (!exactMatches.length)
|
| + exactMatches = this._filterWithMetadata(similarFiles, networkMetadata);
|
| + if (exactMatches.length !== 1)
|
| + return null;
|
| + return new WebInspector.PersistenceBinding(networkSourceCode, exactMatches[0], true);
|
| + }
|
| + }
|
|
|
| - /**
|
| - * @param {!WebInspector.UISourceCode} networkSourceCode
|
| - * @return {!Promise<?WebInspector.PersistenceBinding>}
|
| - */
|
| - _createBinding: function(networkSourceCode)
|
| - {
|
| - var networkPath = WebInspector.ParsedURL.extractPath(networkSourceCode.url());
|
| - if (networkPath === null)
|
| - return Promise.resolve(/** @type {?WebInspector.PersistenceBinding} */(null));
|
| -
|
| - if (networkPath.endsWith("/"))
|
| - networkPath += "index.html";
|
| - var similarFiles = this._filesIndex.similarFiles(networkPath).map(path => this._fileSystemUISourceCodes.get(path));
|
| - if (!similarFiles.length)
|
| - return Promise.resolve(/** @type {?WebInspector.PersistenceBinding} */(null));
|
| -
|
| - return this._pullMetadatas(similarFiles.concat(networkSourceCode)).then(onMetadatas.bind(this));
|
| -
|
| - /**
|
| - * @this {WebInspector.Automapping}
|
| - */
|
| - function onMetadatas()
|
| - {
|
| - var activeFiles = similarFiles.filter(file => !!this._activeFoldersIndex.closestParentFolder(file.url()));
|
| - var networkMetadata = networkSourceCode[WebInspector.Automapping._metadata];
|
| - if (!networkMetadata || (!networkMetadata.modificationTime && typeof networkMetadata.contentSize !== "number")) {
|
| - // If networkSourceCode does not have metadata, try to match against active folders.
|
| - if (activeFiles.length !== 1)
|
| - return null;
|
| - return new WebInspector.PersistenceBinding(networkSourceCode, activeFiles[0], false);
|
| - }
|
| -
|
| - // Try to find exact matches, prioritizing active folders.
|
| - var exactMatches = this._filterWithMetadata(activeFiles, networkMetadata);
|
| - if (!exactMatches.length)
|
| - exactMatches = this._filterWithMetadata(similarFiles, networkMetadata);
|
| - if (exactMatches.length !== 1)
|
| - return null;
|
| - return new WebInspector.PersistenceBinding(networkSourceCode, exactMatches[0], true);
|
| - }
|
| - },
|
| + /**
|
| + * @param {!Array<!WebInspector.UISourceCode>} uiSourceCodes
|
| + * @return {!Promise}
|
| + */
|
| + _pullMetadatas(uiSourceCodes) {
|
| + var promises = uiSourceCodes.map(file => fetchMetadata(file));
|
| + return Promise.all(promises);
|
|
|
| /**
|
| - * @param {!Array<!WebInspector.UISourceCode>} uiSourceCodes
|
| + * @param {!WebInspector.UISourceCode} file
|
| * @return {!Promise}
|
| */
|
| - _pullMetadatas: function(uiSourceCodes)
|
| - {
|
| - var promises = uiSourceCodes.map(file => fetchMetadata(file));
|
| - return Promise.all(promises);
|
| -
|
| - /**
|
| - * @param {!WebInspector.UISourceCode} file
|
| - * @return {!Promise}
|
| - */
|
| - function fetchMetadata(file)
|
| - {
|
| - return file.requestMetadata().then(metadata => file[WebInspector.Automapping._metadata] = metadata);
|
| - }
|
| - },
|
| -
|
| - /**
|
| - * @param {!Array<!WebInspector.UISourceCode>} files
|
| - * @param {!WebInspector.UISourceCodeMetadata} networkMetadata
|
| - * @return {!Array<!WebInspector.UISourceCode>}
|
| - */
|
| - _filterWithMetadata: function(files, networkMetadata)
|
| - {
|
| - return files.filter(file => {
|
| - var fileMetadata = file[WebInspector.Automapping._metadata];
|
| - if (!fileMetadata)
|
| - return false;
|
| - // Allow a second of difference due to network timestamps lack of precision.
|
| - var timeMatches = !networkMetadata.modificationTime || Math.abs(networkMetadata.modificationTime - fileMetadata.modificationTime) < 1000;
|
| - var contentMatches = !networkMetadata.contentSize || fileMetadata.contentSize === networkMetadata.contentSize;
|
| - return timeMatches && contentMatches;
|
| - });
|
| + function fetchMetadata(file) {
|
| + return file.requestMetadata().then(metadata => file[WebInspector.Automapping._metadata] = metadata);
|
| }
|
| + }
|
| +
|
| + /**
|
| + * @param {!Array<!WebInspector.UISourceCode>} files
|
| + * @param {!WebInspector.UISourceCodeMetadata} networkMetadata
|
| + * @return {!Array<!WebInspector.UISourceCode>}
|
| + */
|
| + _filterWithMetadata(files, networkMetadata) {
|
| + return files.filter(file => {
|
| + var fileMetadata = file[WebInspector.Automapping._metadata];
|
| + if (!fileMetadata)
|
| + return false;
|
| + // Allow a second of difference due to network timestamps lack of precision.
|
| + var timeMatches = !networkMetadata.modificationTime ||
|
| + Math.abs(networkMetadata.modificationTime - fileMetadata.modificationTime) < 1000;
|
| + var contentMatches = !networkMetadata.contentSize || fileMetadata.contentSize === networkMetadata.contentSize;
|
| + return timeMatches && contentMatches;
|
| + });
|
| + }
|
| };
|
|
|
| +WebInspector.Automapping._binding = Symbol('Automapping.Binding');
|
| +WebInspector.Automapping._processingPromise = Symbol('Automapping.ProcessingPromise');
|
| +WebInspector.Automapping._metadata = Symbol('Automapping.Metadata');
|
| +
|
| /**
|
| - * @constructor
|
| + * @unrestricted
|
| */
|
| -WebInspector.Automapping.PathEncoder = function()
|
| -{
|
| +WebInspector.Automapping.PathEncoder = class {
|
| + constructor() {
|
| /** @type {!WebInspector.CharacterIdMap<string>} */
|
| this._encoder = new WebInspector.CharacterIdMap();
|
| -};
|
| -
|
| -WebInspector.Automapping.PathEncoder.prototype = {
|
| - /**
|
| - * @param {string} path
|
| - * @return {string}
|
| - */
|
| - encode: function(path)
|
| - {
|
| - return path.split("/").map(token => this._encoder.toChar(token)).join("");
|
| - },
|
| -
|
| - /**
|
| - * @param {string} path
|
| - * @return {string}
|
| - */
|
| - decode: function(path)
|
| - {
|
| - return path.split("").map(token => this._encoder.fromChar(token)).join("/");
|
| - }
|
| + }
|
| +
|
| + /**
|
| + * @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('/');
|
| + }
|
| };
|
|
|
| /**
|
| - * @constructor
|
| - * @param {!WebInspector.Automapping.PathEncoder} encoder
|
| + * @unrestricted
|
| */
|
| -WebInspector.Automapping.FilePathIndex = function(encoder)
|
| -{
|
| +WebInspector.Automapping.FilePathIndex = class {
|
| + /**
|
| + * @param {!WebInspector.Automapping.PathEncoder} encoder
|
| + */
|
| + constructor(encoder) {
|
| this._encoder = encoder;
|
| this._reversedIndex = new WebInspector.Trie();
|
| -};
|
| -
|
| -WebInspector.Automapping.FilePathIndex.prototype = {
|
| - /**
|
| - * @param {string} path
|
| - */
|
| - addPath: function(path)
|
| - {
|
| - var encodedPath = this._encoder.encode(path);
|
| - this._reversedIndex.add(encodedPath.reverse());
|
| - },
|
| -
|
| - /**
|
| - * @param {string} path
|
| - */
|
| - removePath: function(path)
|
| - {
|
| - var encodedPath = this._encoder.encode(path);
|
| - this._reversedIndex.remove(encodedPath.reverse());
|
| - },
|
| -
|
| - /**
|
| - * @param {string} networkPath
|
| - * @return {!Array<string>}
|
| - */
|
| - similarFiles: function(networkPath)
|
| - {
|
| - var encodedPath = this._encoder.encode(networkPath);
|
| - var longestCommonPrefix = this._reversedIndex.longestPrefix(encodedPath.reverse(), false);
|
| - if (!longestCommonPrefix)
|
| - return [];
|
| - return this._reversedIndex.words(longestCommonPrefix).map(encodedPath => this._encoder.decode(encodedPath.reverse()));
|
| - },
|
| + }
|
| +
|
| + /**
|
| + * @param {string} path
|
| + */
|
| + addPath(path) {
|
| + var encodedPath = this._encoder.encode(path);
|
| + this._reversedIndex.add(encodedPath.reverse());
|
| + }
|
| +
|
| + /**
|
| + * @param {string} path
|
| + */
|
| + removePath(path) {
|
| + var encodedPath = this._encoder.encode(path);
|
| + this._reversedIndex.remove(encodedPath.reverse());
|
| + }
|
| +
|
| + /**
|
| + * @param {string} networkPath
|
| + * @return {!Array<string>}
|
| + */
|
| + similarFiles(networkPath) {
|
| + var encodedPath = this._encoder.encode(networkPath);
|
| + var longestCommonPrefix = this._reversedIndex.longestPrefix(encodedPath.reverse(), false);
|
| + if (!longestCommonPrefix)
|
| + return [];
|
| + return this._reversedIndex.words(longestCommonPrefix)
|
| + .map(encodedPath => this._encoder.decode(encodedPath.reverse()));
|
| + }
|
| };
|
|
|
| /**
|
| - * @constructor
|
| - * @param {!WebInspector.Automapping.PathEncoder} encoder
|
| + * @unrestricted
|
| */
|
| -WebInspector.Automapping.FolderIndex = function(encoder)
|
| -{
|
| +WebInspector.Automapping.FolderIndex = class {
|
| + /**
|
| + * @param {!WebInspector.Automapping.PathEncoder} encoder
|
| + */
|
| + constructor(encoder) {
|
| this._encoder = encoder;
|
| this._index = new WebInspector.Trie();
|
| /** @type {!Map<string, number>} */
|
| this._folderCount = new Map();
|
| -};
|
| -
|
| -WebInspector.Automapping.FolderIndex.prototype = {
|
| - /**
|
| - * @param {string} path
|
| - * @return {boolean}
|
| - */
|
| - addFolder: function(path)
|
| - {
|
| - if (path.endsWith("/"))
|
| - path = path.substring(0, path.length - 1);
|
| - var encodedPath = this._encoder.encode(path);
|
| - this._index.add(encodedPath);
|
| - var count = this._folderCount.get(encodedPath) || 0;
|
| - this._folderCount.set(encodedPath, count + 1);
|
| - return count === 0;
|
| - },
|
| -
|
| - /**
|
| - * @param {string} path
|
| - * @return {boolean}
|
| - */
|
| - removeFolder: function(path)
|
| - {
|
| - if (path.endsWith("/"))
|
| - path = path.substring(0, path.length - 1);
|
| - var encodedPath = this._encoder.encode(path);
|
| - var count = this._folderCount.get(encodedPath) || 0;
|
| - if (!count)
|
| - return false;
|
| - if (count > 1) {
|
| - this._folderCount.set(encodedPath, count - 1);
|
| - return false;
|
| - }
|
| - this._index.remove(encodedPath);
|
| - this._folderCount.delete(encodedPath);
|
| - return true;
|
| - },
|
| -
|
| - /**
|
| - * @param {string} path
|
| - * @return {string}
|
| - */
|
| - closestParentFolder: function(path)
|
| - {
|
| - var encodedPath = this._encoder.encode(path);
|
| - var commonPrefix = this._index.longestPrefix(encodedPath, true);
|
| - return this._encoder.decode(commonPrefix);
|
| + }
|
| +
|
| + /**
|
| + * @param {string} path
|
| + * @return {boolean}
|
| + */
|
| + addFolder(path) {
|
| + if (path.endsWith('/'))
|
| + path = path.substring(0, path.length - 1);
|
| + var encodedPath = this._encoder.encode(path);
|
| + this._index.add(encodedPath);
|
| + var count = this._folderCount.get(encodedPath) || 0;
|
| + this._folderCount.set(encodedPath, count + 1);
|
| + return count === 0;
|
| + }
|
| +
|
| + /**
|
| + * @param {string} path
|
| + * @return {boolean}
|
| + */
|
| + removeFolder(path) {
|
| + if (path.endsWith('/'))
|
| + path = path.substring(0, path.length - 1);
|
| + var encodedPath = this._encoder.encode(path);
|
| + var count = this._folderCount.get(encodedPath) || 0;
|
| + if (!count)
|
| + return false;
|
| + if (count > 1) {
|
| + this._folderCount.set(encodedPath, count - 1);
|
| + return false;
|
| }
|
| + this._index.remove(encodedPath);
|
| + this._folderCount.delete(encodedPath);
|
| + return true;
|
| + }
|
| +
|
| + /**
|
| + * @param {string} path
|
| + * @return {string}
|
| + */
|
| + closestParentFolder(path) {
|
| + var encodedPath = this._encoder.encode(path);
|
| + var commonPrefix = this._index.longestPrefix(encodedPath, true);
|
| + return this._encoder.decode(commonPrefix);
|
| + }
|
| };
|
|
|