| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2012 Google Inc. All rights reserved. | 2 * Copyright (C) 2012 Google Inc. All rights reserved. |
| 3 * | 3 * |
| 4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
| 5 * modification, are permitted provided that the following conditions are | 5 * modification, are permitted provided that the following conditions are |
| 6 * met: | 6 * met: |
| 7 * | 7 * |
| 8 * 1. Redistributions of source code must retain the above copyright | 8 * 1. Redistributions of source code must retain the above copyright |
| 9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
| 10 * | 10 * |
| (...skipping 22 matching lines...) Expand all Loading... |
| 33 constructor() { | 33 constructor() { |
| 34 super(); | 34 super(); |
| 35 this.registerRequiredCSS('sources/navigatorView.css'); | 35 this.registerRequiredCSS('sources/navigatorView.css'); |
| 36 | 36 |
| 37 this._scriptsTree = new UI.TreeOutlineInShadow(); | 37 this._scriptsTree = new UI.TreeOutlineInShadow(); |
| 38 this._scriptsTree.registerRequiredCSS('sources/navigatorTree.css'); | 38 this._scriptsTree.registerRequiredCSS('sources/navigatorTree.css'); |
| 39 this._scriptsTree.setComparator(Sources.NavigatorView._treeElementsCompare); | 39 this._scriptsTree.setComparator(Sources.NavigatorView._treeElementsCompare); |
| 40 this.element.appendChild(this._scriptsTree.element); | 40 this.element.appendChild(this._scriptsTree.element); |
| 41 this.setDefaultFocusedElement(this._scriptsTree.element); | 41 this.setDefaultFocusedElement(this._scriptsTree.element); |
| 42 | 42 |
| 43 /** @type {!Map.<!Workspace.UISourceCode, !Array<!Sources.NavigatorUISourceC
odeTreeNode>>} */ | 43 /** @type {!Multimap<!Workspace.UISourceCode, !Sources.NavigatorUISourceCode
TreeNode>} */ |
| 44 this._uiSourceCodeNodes = new Map(); | 44 this._uiSourceCodeNodes = new Multimap(); |
| 45 /** @type {!Map.<string, !Sources.NavigatorFolderTreeNode>} */ | 45 /** @type {!Map.<string, !Sources.NavigatorFolderTreeNode>} */ |
| 46 this._subfolderNodes = new Map(); | 46 this._subfolderNodes = new Map(); |
| 47 | 47 |
| 48 this._rootNode = new Sources.NavigatorRootTreeNode(this); | 48 this._rootNode = new Sources.NavigatorRootTreeNode(this); |
| 49 this._rootNode.populate(); | 49 this._rootNode.populate(); |
| 50 | 50 |
| 51 /** @type {!Map.<!SDK.ResourceTreeFrame, !Sources.NavigatorGroupTreeNode>} *
/ | 51 /** @type {!Map.<!SDK.ResourceTreeFrame, !Sources.NavigatorGroupTreeNode>} *
/ |
| 52 this._frameNodes = new Map(); | 52 this._frameNodes = new Map(); |
| 53 | 53 |
| 54 this.element.addEventListener('contextmenu', this.handleContextMenu.bind(thi
s), false); | 54 this.element.addEventListener('contextmenu', this.handleContextMenu.bind(thi
s), false); |
| (...skipping 12 matching lines...) Expand all Loading... |
| 67 Persistence.persistence.addEventListener( | 67 Persistence.persistence.addEventListener( |
| 68 Persistence.Persistence.Events.BindingCreated, this._onBindingCreated,
this); | 68 Persistence.Persistence.Events.BindingCreated, this._onBindingCreated,
this); |
| 69 Persistence.persistence.addEventListener( | 69 Persistence.persistence.addEventListener( |
| 70 Persistence.Persistence.Events.BindingRemoved, this._onBindingRemoved,
this); | 70 Persistence.Persistence.Events.BindingRemoved, this._onBindingRemoved,
this); |
| 71 } | 71 } |
| 72 SDK.targetManager.addEventListener(SDK.TargetManager.Events.NameChanged, thi
s._targetNameChanged, this); | 72 SDK.targetManager.addEventListener(SDK.TargetManager.Events.NameChanged, thi
s._targetNameChanged, this); |
| 73 | 73 |
| 74 SDK.targetManager.observeTargets(this); | 74 SDK.targetManager.observeTargets(this); |
| 75 this._resetWorkspace(Workspace.workspace); | 75 this._resetWorkspace(Workspace.workspace); |
| 76 this._workspace.uiSourceCodes().forEach(this._addUISourceCode.bind(this)); | 76 this._workspace.uiSourceCodes().forEach(this._addUISourceCode.bind(this)); |
| 77 Bindings.networkProjectManager.addEventListener( |
| 78 Bindings.NetworkProjectManager.Events.FrameAttributionAdded, this._frame
AttributionAdded, this); |
| 79 Bindings.networkProjectManager.addEventListener( |
| 80 Bindings.NetworkProjectManager.Events.FrameAttributionRemoved, this._fra
meAttributionRemoved, this); |
| 77 } | 81 } |
| 78 | 82 |
| 79 /** | 83 /** |
| 80 * @param {!UI.TreeElement} treeElement | 84 * @param {!UI.TreeElement} treeElement |
| 81 */ | 85 */ |
| 82 static _treeElementOrder(treeElement) { | 86 static _treeElementOrder(treeElement) { |
| 83 if (treeElement._boostOrder) | 87 if (treeElement._boostOrder) |
| 84 return 0; | 88 return 0; |
| 85 | 89 |
| 86 if (!Sources.NavigatorView._typeOrders) { | 90 if (!Sources.NavigatorView._typeOrders) { |
| (...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 175 this._addUISourceCode(binding.network); | 179 this._addUISourceCode(binding.network); |
| 176 } | 180 } |
| 177 | 181 |
| 178 /** | 182 /** |
| 179 * @param {!Common.Event} event | 183 * @param {!Common.Event} event |
| 180 */ | 184 */ |
| 181 _onBindingChanged(event) { | 185 _onBindingChanged(event) { |
| 182 var binding = /** @type {!Persistence.PersistenceBinding} */ (event.data); | 186 var binding = /** @type {!Persistence.PersistenceBinding} */ (event.data); |
| 183 | 187 |
| 184 // Update UISourceCode titles. | 188 // Update UISourceCode titles. |
| 185 var networkNodes = this._uiSourceCodeNodes.get(binding.network) || []; | 189 var networkNodes = this._uiSourceCodeNodes.get(binding.network); |
| 186 for (var networkNode of networkNodes) | 190 for (var networkNode of networkNodes) |
| 187 networkNode.updateTitle(); | 191 networkNode.updateTitle(); |
| 188 var fileSystemNodes = this._uiSourceCodeNodes.get(binding.fileSystem) || []; | 192 var fileSystemNodes = this._uiSourceCodeNodes.get(binding.fileSystem); |
| 189 for (var fileSystemNode of fileSystemNodes) | 193 for (var fileSystemNode of fileSystemNodes) |
| 190 fileSystemNode.updateTitle(); | 194 fileSystemNode.updateTitle(); |
| 191 | 195 |
| 192 // Update folder titles. | 196 // Update folder titles. |
| 193 var pathTokens = Persistence.FileSystemWorkspaceBinding.relativePath(binding
.fileSystem); | 197 var pathTokens = Persistence.FileSystemWorkspaceBinding.relativePath(binding
.fileSystem); |
| 194 var folderPath = ''; | 198 var folderPath = ''; |
| 195 for (var i = 0; i < pathTokens.length - 1; ++i) { | 199 for (var i = 0; i < pathTokens.length - 1; ++i) { |
| 196 folderPath += pathTokens[i]; | 200 folderPath += pathTokens[i]; |
| 197 var folderId = | 201 var folderId = |
| 198 this._folderNodeId(binding.fileSystem.project(), null, null, binding.f
ileSystem.origin(), folderPath); | 202 this._folderNodeId(binding.fileSystem.project(), null, null, binding.f
ileSystem.origin(), folderPath); |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 235 | 239 |
| 236 /** | 240 /** |
| 237 * @param {!Workspace.UISourceCode} uiSourceCode | 241 * @param {!Workspace.UISourceCode} uiSourceCode |
| 238 * @return {boolean} | 242 * @return {boolean} |
| 239 */ | 243 */ |
| 240 accept(uiSourceCode) { | 244 accept(uiSourceCode) { |
| 241 return !uiSourceCode.project().isServiceProject(); | 245 return !uiSourceCode.project().isServiceProject(); |
| 242 } | 246 } |
| 243 | 247 |
| 244 /** | 248 /** |
| 249 * @param {!Common.Event} event |
| 250 */ |
| 251 _frameAttributionAdded(event) { |
| 252 var uiSourceCode = /** @type {!Workspace.UISourceCode} */ (event.data.uiSour
ceCode); |
| 253 if (!this._acceptsUISourceCode(uiSourceCode)) |
| 254 return; |
| 255 |
| 256 var addedFrame = /** @type {?SDK.ResourceTreeFrame} */ (event.data.frame); |
| 257 // This event does not happen for UISourceCodes without initial attribution. |
| 258 this._addUISourceCodeNode(uiSourceCode, addedFrame); |
| 259 } |
| 260 |
| 261 /** |
| 262 * @param {!Common.Event} event |
| 263 */ |
| 264 _frameAttributionRemoved(event) { |
| 265 var uiSourceCode = /** @type {!Workspace.UISourceCode} */ (event.data.uiSour
ceCode); |
| 266 if (!this._acceptsUISourceCode(uiSourceCode)) |
| 267 return; |
| 268 |
| 269 var removedFrame = /** @type {?SDK.ResourceTreeFrame} */ (event.data.frame); |
| 270 var node = Array.from(this._uiSourceCodeNodes.get(uiSourceCode)).find(node =
> node.frame() === removedFrame); |
| 271 this._removeUISourceCodeNode(node); |
| 272 } |
| 273 |
| 274 /** |
| 275 * @param {!Workspace.UISourceCode} uiSourceCode |
| 276 * @return {boolean} |
| 277 */ |
| 278 _acceptsUISourceCode(uiSourceCode) { |
| 279 if (!this.accept(uiSourceCode)) |
| 280 return false; |
| 281 |
| 282 var binding = Persistence.persistence.binding(uiSourceCode); |
| 283 if (!Runtime.experiments.isEnabled('persistence2') && binding && binding.net
work === uiSourceCode) |
| 284 return false; |
| 285 return true; |
| 286 } |
| 287 |
| 288 /** |
| 245 * @param {!Workspace.UISourceCode} uiSourceCode | 289 * @param {!Workspace.UISourceCode} uiSourceCode |
| 246 */ | 290 */ |
| 247 _addUISourceCode(uiSourceCode) { | 291 _addUISourceCode(uiSourceCode) { |
| 248 if (!this.accept(uiSourceCode)) | 292 if (!this._acceptsUISourceCode(uiSourceCode)) |
| 249 return; | 293 return; |
| 250 | 294 |
| 251 var binding = Persistence.persistence.binding(uiSourceCode); | 295 var frames = Bindings.NetworkProject.framesForUISourceCode(uiSourceCode); |
| 252 if (!Runtime.experiments.isEnabled('persistence2') && binding && binding.net
work === uiSourceCode) | 296 if (frames.length) { |
| 253 return; | 297 for (var frame of frames) |
| 298 this._addUISourceCodeNode(uiSourceCode, frame); |
| 299 } else { |
| 300 this._addUISourceCodeNode(uiSourceCode, null); |
| 301 } |
| 302 this.uiSourceCodeAdded(uiSourceCode); |
| 303 } |
| 254 | 304 |
| 305 /** |
| 306 * @param {!Workspace.UISourceCode} uiSourceCode |
| 307 * @param {?SDK.ResourceTreeFrame} frame |
| 308 */ |
| 309 _addUISourceCodeNode(uiSourceCode, frame) { |
| 255 var isFromSourceMap = uiSourceCode.contentType().isFromSourceMap(); | 310 var isFromSourceMap = uiSourceCode.contentType().isFromSourceMap(); |
| 256 var path; | 311 var path; |
| 257 if (uiSourceCode.project().type() === Workspace.projectTypes.FileSystem) | 312 if (uiSourceCode.project().type() === Workspace.projectTypes.FileSystem) |
| 258 path = Persistence.FileSystemWorkspaceBinding.relativePath(uiSourceCode).s
lice(0, -1); | 313 path = Persistence.FileSystemWorkspaceBinding.relativePath(uiSourceCode).s
lice(0, -1); |
| 259 else | 314 else |
| 260 path = Common.ParsedURL.extractPath(uiSourceCode.url()).split('/').slice(1
, -1); | 315 path = Common.ParsedURL.extractPath(uiSourceCode.url()).split('/').slice(1
, -1); |
| 261 | 316 |
| 262 var project = uiSourceCode.project(); | 317 var project = uiSourceCode.project(); |
| 263 var target = Bindings.NetworkProject.targetForUISourceCode(uiSourceCode); | 318 var target = Bindings.NetworkProject.targetForUISourceCode(uiSourceCode); |
| 264 var frames = Bindings.NetworkProject.framesForUISourceCode(uiSourceCode); | 319 var folderNode = |
| 265 var uiSourceCodeNodes = []; | 320 this._folderNode(uiSourceCode, project, target, frame, uiSourceCode.orig
in(), path, isFromSourceMap); |
| 266 if (frames.length) { | 321 var uiSourceCodeNode = new Sources.NavigatorUISourceCodeTreeNode(this, uiSou
rceCode, frame); |
| 267 for (var frame of frames) { | 322 folderNode.appendChild(uiSourceCodeNode); |
| 268 var folderNode = | 323 this._uiSourceCodeNodes.set(uiSourceCode, uiSourceCodeNode); |
| 269 this._folderNode(uiSourceCode, project, target, frame, uiSourceCode.
origin(), path, isFromSourceMap); | |
| 270 var uiSourceCodeNode = new Sources.NavigatorUISourceCodeTreeNode(this, u
iSourceCode, frame); | |
| 271 folderNode.appendChild(uiSourceCodeNode); | |
| 272 uiSourceCodeNodes.push(uiSourceCodeNode); | |
| 273 } | |
| 274 } else { | |
| 275 var folderNode = | |
| 276 this._folderNode(uiSourceCode, project, target, null, uiSourceCode.ori
gin(), path, isFromSourceMap); | |
| 277 var uiSourceCodeNode = new Sources.NavigatorUISourceCodeTreeNode(this, uiS
ourceCode, null); | |
| 278 folderNode.appendChild(uiSourceCodeNode); | |
| 279 uiSourceCodeNodes.push(uiSourceCodeNode); | |
| 280 } | |
| 281 this._uiSourceCodeNodes.set(uiSourceCode, uiSourceCodeNodes); | |
| 282 this.uiSourceCodeAdded(uiSourceCode); | |
| 283 } | 324 } |
| 284 | 325 |
| 285 /** | 326 /** |
| 286 * @param {!Workspace.UISourceCode} uiSourceCode | 327 * @param {!Workspace.UISourceCode} uiSourceCode |
| 287 */ | 328 */ |
| 288 uiSourceCodeAdded(uiSourceCode) { | 329 uiSourceCodeAdded(uiSourceCode) { |
| 289 } | 330 } |
| 290 | 331 |
| 291 /** | 332 /** |
| 292 * @param {!Common.Event} event | 333 * @param {!Common.Event} event |
| (...skipping 192 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 485 return (prettyURL || projectOrigin); | 526 return (prettyURL || projectOrigin); |
| 486 } | 527 } |
| 487 | 528 |
| 488 /** | 529 /** |
| 489 * @param {!Workspace.UISourceCode} uiSourceCode | 530 * @param {!Workspace.UISourceCode} uiSourceCode |
| 490 * @param {boolean=} select | 531 * @param {boolean=} select |
| 491 * @return {?Sources.NavigatorUISourceCodeTreeNode} | 532 * @return {?Sources.NavigatorUISourceCodeTreeNode} |
| 492 */ | 533 */ |
| 493 revealUISourceCode(uiSourceCode, select) { | 534 revealUISourceCode(uiSourceCode, select) { |
| 494 var nodes = this._uiSourceCodeNodes.get(uiSourceCode); | 535 var nodes = this._uiSourceCodeNodes.get(uiSourceCode); |
| 495 if (!nodes) | 536 var node = nodes.firstValue(); |
| 537 if (!node) |
| 496 return null; | 538 return null; |
| 497 if (this._scriptsTree.selectedTreeElement) | 539 if (this._scriptsTree.selectedTreeElement) |
| 498 this._scriptsTree.selectedTreeElement.deselect(); | 540 this._scriptsTree.selectedTreeElement.deselect(); |
| 499 this._lastSelectedUISourceCode = uiSourceCode; | 541 this._lastSelectedUISourceCode = uiSourceCode; |
| 500 // TODO(dgozman): figure out revealing multiple. | 542 // TODO(dgozman): figure out revealing multiple. |
| 501 nodes[0].reveal(select); | 543 node.reveal(select); |
| 502 return nodes[0]; | 544 return node; |
| 503 } | 545 } |
| 504 | 546 |
| 505 /** | 547 /** |
| 506 * @param {!Workspace.UISourceCode} uiSourceCode | 548 * @param {!Workspace.UISourceCode} uiSourceCode |
| 507 * @param {boolean} focusSource | 549 * @param {boolean} focusSource |
| 508 */ | 550 */ |
| 509 _sourceSelected(uiSourceCode, focusSource) { | 551 _sourceSelected(uiSourceCode, focusSource) { |
| 510 this._lastSelectedUISourceCode = uiSourceCode; | 552 this._lastSelectedUISourceCode = uiSourceCode; |
| 511 Common.Revealer.reveal(uiSourceCode, !focusSource); | 553 Common.Revealer.reveal(uiSourceCode, !focusSource); |
| 512 } | 554 } |
| 513 | 555 |
| 514 /** | 556 /** |
| 515 * @param {!Workspace.UISourceCode} uiSourceCode | 557 * @param {!Workspace.UISourceCode} uiSourceCode |
| 516 */ | 558 */ |
| 517 sourceDeleted(uiSourceCode) { | 559 sourceDeleted(uiSourceCode) { |
| 518 } | 560 } |
| 519 | 561 |
| 520 /** | 562 /** |
| 521 * @param {!Workspace.UISourceCode} uiSourceCode | 563 * @param {!Workspace.UISourceCode} uiSourceCode |
| 522 */ | 564 */ |
| 523 _removeUISourceCode(uiSourceCode) { | 565 _removeUISourceCode(uiSourceCode) { |
| 524 var nodes = this._uiSourceCodeNodes.get(uiSourceCode) || []; | 566 var nodes = this._uiSourceCodeNodes.get(uiSourceCode); |
| 525 for (var i = 0; i < nodes.length; i++) { | 567 for (var node of nodes) |
| 526 var node = nodes[i]; | 568 this._removeUISourceCodeNode(node); |
| 569 } |
| 527 | 570 |
| 528 var project = uiSourceCode.project(); | 571 /** |
| 529 var target = Bindings.NetworkProject.targetForUISourceCode(uiSourceCode); | 572 * @param {!Sources.NavigatorUISourceCodeTreeNode} node |
| 530 var frame = node.frame(); | 573 */ |
| 574 _removeUISourceCodeNode(node) { |
| 575 var uiSourceCode = node.uiSourceCode(); |
| 576 this._uiSourceCodeNodes.remove(uiSourceCode, node); |
| 577 var project = uiSourceCode.project(); |
| 578 var target = Bindings.NetworkProject.targetForUISourceCode(uiSourceCode); |
| 579 var frame = node.frame(); |
| 531 | 580 |
| 532 var parentNode = node.parent; | 581 var parentNode = node.parent; |
| 582 parentNode.removeChild(node); |
| 583 node = parentNode; |
| 584 |
| 585 while (node) { |
| 586 parentNode = node.parent; |
| 587 if (!parentNode || !node.isEmpty()) |
| 588 break; |
| 589 if (!(node instanceof Sources.NavigatorGroupTreeNode || node instanceof So
urces.NavigatorFolderTreeNode)) |
| 590 break; |
| 591 if (node._type === Sources.NavigatorView.Types.Frame) { |
| 592 this._discardFrame(/** @type {!SDK.ResourceTreeFrame} */ (frame)); |
| 593 break; |
| 594 } |
| 595 |
| 596 var folderId = this._folderNodeId(project, target, frame, uiSourceCode.ori
gin(), node._folderPath); |
| 597 this._subfolderNodes.delete(folderId); |
| 533 parentNode.removeChild(node); | 598 parentNode.removeChild(node); |
| 534 node = parentNode; | 599 node = parentNode; |
| 535 | |
| 536 while (node) { | |
| 537 parentNode = node.parent; | |
| 538 if (!parentNode || !node.isEmpty()) | |
| 539 break; | |
| 540 if (!(node instanceof Sources.NavigatorGroupTreeNode || node instanceof
Sources.NavigatorFolderTreeNode)) | |
| 541 break; | |
| 542 if (node._type === Sources.NavigatorView.Types.Frame) { | |
| 543 this._discardFrame(/** @type {!SDK.ResourceTreeFrame} */ (frame)); | |
| 544 break; | |
| 545 } | |
| 546 | |
| 547 var folderId = this._folderNodeId(project, target, frame, uiSourceCode.o
rigin(), node._folderPath); | |
| 548 this._subfolderNodes.delete(folderId); | |
| 549 parentNode.removeChild(node); | |
| 550 node = parentNode; | |
| 551 } | |
| 552 } | 600 } |
| 553 this._uiSourceCodeNodes.delete(uiSourceCode); | |
| 554 } | 601 } |
| 555 | 602 |
| 556 reset() { | 603 reset() { |
| 557 for (var entry of this._uiSourceCodeNodes) { | 604 for (var node of this._uiSourceCodeNodes.valuesArray()) |
| 558 var nodes = /** @type {!Array<!Sources.NavigatorUISourceCodeTreeNode>} */
(entry[1]); | 605 node.dispose(); |
| 559 for (var i = 0; i < nodes.length; i++) | |
| 560 nodes[i].dispose(); | |
| 561 } | |
| 562 | 606 |
| 563 this._scriptsTree.removeChildren(); | 607 this._scriptsTree.removeChildren(); |
| 564 this._uiSourceCodeNodes.clear(); | 608 this._uiSourceCodeNodes.clear(); |
| 565 this._subfolderNodes.clear(); | 609 this._subfolderNodes.clear(); |
| 566 this._frameNodes.clear(); | 610 this._frameNodes.clear(); |
| 567 this._rootNode.reset(); | 611 this._rootNode.reset(); |
| 568 } | 612 } |
| 569 | 613 |
| 570 /** | 614 /** |
| 571 * @param {!Event} event | 615 * @param {!Event} event |
| (...skipping 1023 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1595 /** | 1639 /** |
| 1596 * @param {string} title | 1640 * @param {string} title |
| 1597 * @override | 1641 * @override |
| 1598 */ | 1642 */ |
| 1599 setTitle(title) { | 1643 setTitle(title) { |
| 1600 this._title = title; | 1644 this._title = title; |
| 1601 if (this._treeElement) | 1645 if (this._treeElement) |
| 1602 this._treeElement.title = this._title; | 1646 this._treeElement.title = this._title; |
| 1603 } | 1647 } |
| 1604 }; | 1648 }; |
| OLD | NEW |