Chromium Code Reviews| Index: third_party/WebKit/Source/devtools/front_end/sources/NavigatorView.js |
| diff --git a/third_party/WebKit/Source/devtools/front_end/sources/NavigatorView.js b/third_party/WebKit/Source/devtools/front_end/sources/NavigatorView.js |
| index 79421682d8e36ed8107f2693ae59e011a17df0b1..98bb64a3c8a03bfcba6bec5e37c1ac5bdc840c5c 100644 |
| --- a/third_party/WebKit/Source/devtools/front_end/sources/NavigatorView.js |
| +++ b/third_party/WebKit/Source/devtools/front_end/sources/NavigatorView.js |
| @@ -40,8 +40,8 @@ Sources.NavigatorView = class extends UI.VBox { |
| this.element.appendChild(this._scriptsTree.element); |
| this.setDefaultFocusedElement(this._scriptsTree.element); |
| - /** @type {!Map.<!Workspace.UISourceCode, !Array<!Sources.NavigatorUISourceCodeTreeNode>>} */ |
| - this._uiSourceCodeNodes = new Map(); |
| + /** @type {!Multimap<!Workspace.UISourceCode, !Sources.NavigatorUISourceCodeTreeNode>} */ |
| + this._uiSourceCodeNodes = new Multimap(); |
| /** @type {!Map.<string, !Sources.NavigatorFolderTreeNode>} */ |
| this._subfolderNodes = new Map(); |
| @@ -74,6 +74,8 @@ Sources.NavigatorView = class extends UI.VBox { |
| SDK.targetManager.observeTargets(this); |
| this._resetWorkspace(Workspace.workspace); |
| this._workspace.uiSourceCodes().forEach(this._addUISourceCode.bind(this)); |
| + Bindings.networkProjectManager.addEventListener( |
| + Bindings.NetworkProjectManager.Events.FrameAttributionChanged, this._frameAttributionChanged, this); |
| } |
| /** |
| @@ -182,10 +184,10 @@ Sources.NavigatorView = class extends UI.VBox { |
| var binding = /** @type {!Persistence.PersistenceBinding} */ (event.data); |
| // Update UISourceCode titles. |
| - var networkNodes = this._uiSourceCodeNodes.get(binding.network) || []; |
| + var networkNodes = this._uiSourceCodeNodes.get(binding.network); |
| for (var networkNode of networkNodes) |
| networkNode.updateTitle(); |
| - var fileSystemNodes = this._uiSourceCodeNodes.get(binding.fileSystem) || []; |
| + var fileSystemNodes = this._uiSourceCodeNodes.get(binding.fileSystem); |
| for (var fileSystemNode of fileSystemNodes) |
| fileSystemNode.updateTitle(); |
| @@ -241,6 +243,21 @@ Sources.NavigatorView = class extends UI.VBox { |
| return !uiSourceCode.project().isServiceProject(); |
| } |
| + /** |
| + * @param {!Common.Event} event |
| + */ |
| + _frameAttributionChanged(event) { |
| + var uiSourceCode = /** @type {!Workspace.UISourceCode} */ (event.data.uiSourceCode); |
| + var addedFrame = /** @type {?SDK.ResourceTreeFrame} */ (event.data.added); |
| + var removedFrame = /** @type {?SDK.ResourceTreeFrame} */ (event.data.removed); |
| + if (addedFrame) |
| + this._addUISourceCodeNode(uiSourceCode, addedFrame); |
| + if (removedFrame) { |
| + var node = Array.from(this._uiSourceCodeNodes.get(uiSourceCode)).find(node => node.frame() === removedFrame); |
|
dgozman
2017/05/11 23:55:16
Why Array.from? It's already an array.
lushnikov
2017/05/12 01:18:00
Nah, it's a set
|
| + this._removeUISourceCodeNode(node); |
| + } |
| + } |
| + |
| /** |
| * @param {!Workspace.UISourceCode} uiSourceCode |
| */ |
| @@ -252,6 +269,21 @@ Sources.NavigatorView = class extends UI.VBox { |
| if (!Runtime.experiments.isEnabled('persistence2') && binding && binding.network === uiSourceCode) |
| return; |
| + var frames = Bindings.NetworkProject.framesForUISourceCode(uiSourceCode); |
| + if (frames.length) { |
| + for (var frame of frames) |
| + this._addUISourceCodeNode(uiSourceCode, frame); |
| + } else { |
| + this._addUISourceCodeNode(uiSourceCode, null); |
| + } |
| + this.uiSourceCodeAdded(uiSourceCode); |
| + } |
| + |
| + /** |
| + * @param {!Workspace.UISourceCode} uiSourceCode |
| + * @param {?SDK.ResourceTreeFrame} frame |
| + */ |
| + _addUISourceCodeNode(uiSourceCode, frame) { |
| var isFromSourceMap = uiSourceCode.contentType().isFromSourceMap(); |
| var path; |
| if (uiSourceCode.project().type() === Workspace.projectTypes.FileSystem) |
| @@ -261,25 +293,11 @@ Sources.NavigatorView = class extends UI.VBox { |
| var project = uiSourceCode.project(); |
| var target = Bindings.NetworkProject.targetForUISourceCode(uiSourceCode); |
| - var frames = Bindings.NetworkProject.framesForUISourceCode(uiSourceCode); |
| - var uiSourceCodeNodes = []; |
| - if (frames.length) { |
| - for (var frame of frames) { |
| - var folderNode = |
| - this._folderNode(uiSourceCode, project, target, frame, uiSourceCode.origin(), path, isFromSourceMap); |
| - var uiSourceCodeNode = new Sources.NavigatorUISourceCodeTreeNode(this, uiSourceCode, frame); |
| - folderNode.appendChild(uiSourceCodeNode); |
| - uiSourceCodeNodes.push(uiSourceCodeNode); |
| - } |
| - } else { |
| - var folderNode = |
| - this._folderNode(uiSourceCode, project, target, null, uiSourceCode.origin(), path, isFromSourceMap); |
| - var uiSourceCodeNode = new Sources.NavigatorUISourceCodeTreeNode(this, uiSourceCode, null); |
| - folderNode.appendChild(uiSourceCodeNode); |
| - uiSourceCodeNodes.push(uiSourceCodeNode); |
| - } |
| - this._uiSourceCodeNodes.set(uiSourceCode, uiSourceCodeNodes); |
| - this.uiSourceCodeAdded(uiSourceCode); |
| + var folderNode = |
| + this._folderNode(uiSourceCode, project, target, frame, uiSourceCode.origin(), path, isFromSourceMap); |
| + var uiSourceCodeNode = new Sources.NavigatorUISourceCodeTreeNode(this, uiSourceCode, frame); |
| + folderNode.appendChild(uiSourceCodeNode); |
| + this._uiSourceCodeNodes.set(uiSourceCode, uiSourceCodeNode); |
| } |
| /** |
| @@ -492,14 +510,15 @@ Sources.NavigatorView = class extends UI.VBox { |
| */ |
| revealUISourceCode(uiSourceCode, select) { |
| var nodes = this._uiSourceCodeNodes.get(uiSourceCode); |
| - if (!nodes) |
| + var node = nodes.firstValue(); |
| + if (!node) |
| return null; |
| if (this._scriptsTree.selectedTreeElement) |
| this._scriptsTree.selectedTreeElement.deselect(); |
| this._lastSelectedUISourceCode = uiSourceCode; |
| // TODO(dgozman): figure out revealing multiple. |
| - nodes[0].reveal(select); |
| - return nodes[0]; |
| + node.reveal(select); |
| + return node; |
| } |
| /** |
| @@ -517,48 +536,51 @@ Sources.NavigatorView = class extends UI.VBox { |
| sourceDeleted(uiSourceCode) { |
| } |
| + |
|
dgozman
2017/05/11 23:55:16
nit: extra blank line
lushnikov
2017/05/12 01:18:00
Done.
|
| /** |
| * @param {!Workspace.UISourceCode} uiSourceCode |
| */ |
| _removeUISourceCode(uiSourceCode) { |
| - var nodes = this._uiSourceCodeNodes.get(uiSourceCode) || []; |
| - for (var i = 0; i < nodes.length; i++) { |
| - var node = nodes[i]; |
| + var nodes = this._uiSourceCodeNodes.get(uiSourceCode); |
| + for (var node of nodes) |
| + this._removeUISourceCodeNode(node); |
| + } |
| - var project = uiSourceCode.project(); |
| - var target = Bindings.NetworkProject.targetForUISourceCode(uiSourceCode); |
| - var frame = node.frame(); |
| + /** |
| + * @param {!Sources.NavigatorUISourceCodeTreeNode} node |
| + */ |
| + _removeUISourceCodeNode(node) { |
| + var uiSourceCode = node.uiSourceCode(); |
| + this._uiSourceCodeNodes.remove(uiSourceCode, node); |
|
dgozman
2017/05/11 23:55:16
You mutate the same collection in line 545. That's
lushnikov
2017/05/12 01:18:00
That's ok for sets (we have set here): http://stac
|
| + var project = uiSourceCode.project(); |
| + var target = Bindings.NetworkProject.targetForUISourceCode(uiSourceCode); |
| + var frame = node.frame(); |
| + |
| + var parentNode = node.parent; |
| + parentNode.removeChild(node); |
| + node = parentNode; |
| + |
| + while (node) { |
| + parentNode = node.parent; |
| + if (!parentNode || !node.isEmpty()) |
| + break; |
| + if (!(node instanceof Sources.NavigatorGroupTreeNode || node instanceof Sources.NavigatorFolderTreeNode)) |
| + break; |
| + if (node._type === Sources.NavigatorView.Types.Frame) { |
| + this._discardFrame(/** @type {!SDK.ResourceTreeFrame} */ (frame)); |
| + break; |
| + } |
| - var parentNode = node.parent; |
| + var folderId = this._folderNodeId(project, target, frame, uiSourceCode.origin(), node._folderPath); |
| + this._subfolderNodes.delete(folderId); |
| parentNode.removeChild(node); |
| node = parentNode; |
| - |
| - while (node) { |
| - parentNode = node.parent; |
| - if (!parentNode || !node.isEmpty()) |
| - break; |
| - if (!(node instanceof Sources.NavigatorGroupTreeNode || node instanceof Sources.NavigatorFolderTreeNode)) |
| - break; |
| - if (node._type === Sources.NavigatorView.Types.Frame) { |
| - this._discardFrame(/** @type {!SDK.ResourceTreeFrame} */ (frame)); |
| - break; |
| - } |
| - |
| - var folderId = this._folderNodeId(project, target, frame, uiSourceCode.origin(), node._folderPath); |
| - this._subfolderNodes.delete(folderId); |
| - parentNode.removeChild(node); |
| - node = parentNode; |
| - } |
| } |
| - this._uiSourceCodeNodes.delete(uiSourceCode); |
| } |
| reset() { |
| - for (var entry of this._uiSourceCodeNodes) { |
| - var nodes = /** @type {!Array<!Sources.NavigatorUISourceCodeTreeNode>} */ (entry[1]); |
| - for (var i = 0; i < nodes.length; i++) |
| - nodes[i].dispose(); |
| - } |
| + for (var node of this._uiSourceCodeNodes.valuesArray()) |
| + node.dispose(); |
| this._scriptsTree.removeChildren(); |
| this._uiSourceCodeNodes.clear(); |