| 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..91c4a6450c91bcf1238aac0153ea5a5191d0a1e9 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,10 @@ 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.FrameAttributionAdded, this._frameAttributionAdded, this);
|
| + Bindings.networkProjectManager.addEventListener(
|
| + Bindings.NetworkProjectManager.Events.FrameAttributionRemoved, this._frameAttributionRemoved, this);
|
| }
|
|
|
| /**
|
| @@ -182,10 +186,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,17 +245,68 @@ Sources.NavigatorView = class extends UI.VBox {
|
| return !uiSourceCode.project().isServiceProject();
|
| }
|
|
|
| + /**
|
| + * @param {!Common.Event} event
|
| + */
|
| + _frameAttributionAdded(event) {
|
| + var uiSourceCode = /** @type {!Workspace.UISourceCode} */ (event.data.uiSourceCode);
|
| + if (!this._acceptsUISourceCode(uiSourceCode))
|
| + return;
|
| +
|
| + var addedFrame = /** @type {?SDK.ResourceTreeFrame} */ (event.data.frame);
|
| + // This event does not happen for UISourceCodes without initial attribution.
|
| + this._addUISourceCodeNode(uiSourceCode, addedFrame);
|
| + }
|
| +
|
| + /**
|
| + * @param {!Common.Event} event
|
| + */
|
| + _frameAttributionRemoved(event) {
|
| + var uiSourceCode = /** @type {!Workspace.UISourceCode} */ (event.data.uiSourceCode);
|
| + if (!this._acceptsUISourceCode(uiSourceCode))
|
| + return;
|
| +
|
| + var removedFrame = /** @type {?SDK.ResourceTreeFrame} */ (event.data.frame);
|
| + var node = Array.from(this._uiSourceCodeNodes.get(uiSourceCode)).find(node => node.frame() === removedFrame);
|
| + this._removeUISourceCodeNode(node);
|
| + }
|
| +
|
| /**
|
| * @param {!Workspace.UISourceCode} uiSourceCode
|
| + * @return {boolean}
|
| */
|
| - _addUISourceCode(uiSourceCode) {
|
| + _acceptsUISourceCode(uiSourceCode) {
|
| if (!this.accept(uiSourceCode))
|
| - return;
|
| + return false;
|
|
|
| var binding = Persistence.persistence.binding(uiSourceCode);
|
| if (!Runtime.experiments.isEnabled('persistence2') && binding && binding.network === uiSourceCode)
|
| + return false;
|
| + return true;
|
| + }
|
| +
|
| + /**
|
| + * @param {!Workspace.UISourceCode} uiSourceCode
|
| + */
|
| + _addUISourceCode(uiSourceCode) {
|
| + if (!this._acceptsUISourceCode(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 +316,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 +533,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;
|
| }
|
|
|
| /**
|
| @@ -521,44 +563,46 @@ Sources.NavigatorView = class extends UI.VBox {
|
| * @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);
|
| + 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();
|
|
|