Chromium Code Reviews| 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._addUISourceCodeNode(uiSourceCode, addedFrame); | |
|
dgozman
2017/05/12 19:12:50
// This event does not happen for UISourceCodes wi
lushnikov
2017/05/15 21:05:02
Done.
| |
| 258 } | |
| 259 | |
| 260 /** | |
| 261 * @param {!Common.Event} event | |
| 262 */ | |
| 263 _frameAttributionRemoved(event) { | |
| 264 var uiSourceCode = /** @type {!Workspace.UISourceCode} */ (event.data.uiSour ceCode); | |
| 265 if (!this._acceptsUISourceCode(uiSourceCode)) | |
| 266 return; | |
| 267 | |
| 268 var removedFrame = /** @type {?SDK.ResourceTreeFrame} */ (event.data.frame); | |
| 269 var node = Array.from(this._uiSourceCodeNodes.get(uiSourceCode)).find(node = > node.frame() === removedFrame); | |
| 270 this._removeUISourceCodeNode(node); | |
| 271 } | |
| 272 | |
| 273 /** | |
| 274 * @param {!Workspace.UISourceCode} uiSourceCode | |
| 275 * @return {boolean} | |
| 276 */ | |
| 277 _acceptsUISourceCode(uiSourceCode) { | |
| 278 if (!this.accept(uiSourceCode)) | |
| 279 return false; | |
| 280 | |
| 281 var binding = Persistence.persistence.binding(uiSourceCode); | |
| 282 if (!Runtime.experiments.isEnabled('persistence2') && binding && binding.net work === uiSourceCode) | |
| 283 return false; | |
| 284 return true; | |
| 285 } | |
| 286 | |
| 287 /** | |
| 245 * @param {!Workspace.UISourceCode} uiSourceCode | 288 * @param {!Workspace.UISourceCode} uiSourceCode |
| 246 */ | 289 */ |
| 247 _addUISourceCode(uiSourceCode) { | 290 _addUISourceCode(uiSourceCode) { |
| 248 if (!this.accept(uiSourceCode)) | 291 if (!this._acceptsUISourceCode(uiSourceCode)) |
| 249 return; | 292 return; |
| 250 | 293 |
| 251 var binding = Persistence.persistence.binding(uiSourceCode); | 294 var frames = Bindings.NetworkProject.framesForUISourceCode(uiSourceCode); |
| 252 if (!Runtime.experiments.isEnabled('persistence2') && binding && binding.net work === uiSourceCode) | 295 if (frames.length) { |
| 253 return; | 296 for (var frame of frames) |
| 297 this._addUISourceCodeNode(uiSourceCode, frame); | |
| 298 } else { | |
| 299 this._addUISourceCodeNode(uiSourceCode, null); | |
| 300 } | |
| 301 this.uiSourceCodeAdded(uiSourceCode); | |
| 302 } | |
| 254 | 303 |
| 304 /** | |
| 305 * @param {!Workspace.UISourceCode} uiSourceCode | |
| 306 * @param {?SDK.ResourceTreeFrame} frame | |
| 307 */ | |
| 308 _addUISourceCodeNode(uiSourceCode, frame) { | |
| 255 var isFromSourceMap = uiSourceCode.contentType().isFromSourceMap(); | 309 var isFromSourceMap = uiSourceCode.contentType().isFromSourceMap(); |
| 256 var path; | 310 var path; |
| 257 if (uiSourceCode.project().type() === Workspace.projectTypes.FileSystem) | 311 if (uiSourceCode.project().type() === Workspace.projectTypes.FileSystem) |
| 258 path = Persistence.FileSystemWorkspaceBinding.relativePath(uiSourceCode).s lice(0, -1); | 312 path = Persistence.FileSystemWorkspaceBinding.relativePath(uiSourceCode).s lice(0, -1); |
| 259 else | 313 else |
| 260 path = Common.ParsedURL.extractPath(uiSourceCode.url()).split('/').slice(1 , -1); | 314 path = Common.ParsedURL.extractPath(uiSourceCode.url()).split('/').slice(1 , -1); |
| 261 | 315 |
| 262 var project = uiSourceCode.project(); | 316 var project = uiSourceCode.project(); |
| 263 var target = Bindings.NetworkProject.targetForUISourceCode(uiSourceCode); | 317 var target = Bindings.NetworkProject.targetForUISourceCode(uiSourceCode); |
| 264 var frames = Bindings.NetworkProject.framesForUISourceCode(uiSourceCode); | 318 var folderNode = |
| 265 var uiSourceCodeNodes = []; | 319 this._folderNode(uiSourceCode, project, target, frame, uiSourceCode.orig in(), path, isFromSourceMap); |
| 266 if (frames.length) { | 320 var uiSourceCodeNode = new Sources.NavigatorUISourceCodeTreeNode(this, uiSou rceCode, frame); |
| 267 for (var frame of frames) { | 321 folderNode.appendChild(uiSourceCodeNode); |
| 268 var folderNode = | 322 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 } | 323 } |
| 284 | 324 |
| 285 /** | 325 /** |
| 286 * @param {!Workspace.UISourceCode} uiSourceCode | 326 * @param {!Workspace.UISourceCode} uiSourceCode |
| 287 */ | 327 */ |
| 288 uiSourceCodeAdded(uiSourceCode) { | 328 uiSourceCodeAdded(uiSourceCode) { |
| 289 } | 329 } |
| 290 | 330 |
| 291 /** | 331 /** |
| 292 * @param {!Common.Event} event | 332 * @param {!Common.Event} event |
| (...skipping 192 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 485 return (prettyURL || projectOrigin); | 525 return (prettyURL || projectOrigin); |
| 486 } | 526 } |
| 487 | 527 |
| 488 /** | 528 /** |
| 489 * @param {!Workspace.UISourceCode} uiSourceCode | 529 * @param {!Workspace.UISourceCode} uiSourceCode |
| 490 * @param {boolean=} select | 530 * @param {boolean=} select |
| 491 * @return {?Sources.NavigatorUISourceCodeTreeNode} | 531 * @return {?Sources.NavigatorUISourceCodeTreeNode} |
| 492 */ | 532 */ |
| 493 revealUISourceCode(uiSourceCode, select) { | 533 revealUISourceCode(uiSourceCode, select) { |
| 494 var nodes = this._uiSourceCodeNodes.get(uiSourceCode); | 534 var nodes = this._uiSourceCodeNodes.get(uiSourceCode); |
| 495 if (!nodes) | 535 var node = nodes.firstValue(); |
| 536 if (!node) | |
| 496 return null; | 537 return null; |
| 497 if (this._scriptsTree.selectedTreeElement) | 538 if (this._scriptsTree.selectedTreeElement) |
| 498 this._scriptsTree.selectedTreeElement.deselect(); | 539 this._scriptsTree.selectedTreeElement.deselect(); |
| 499 this._lastSelectedUISourceCode = uiSourceCode; | 540 this._lastSelectedUISourceCode = uiSourceCode; |
| 500 // TODO(dgozman): figure out revealing multiple. | 541 // TODO(dgozman): figure out revealing multiple. |
| 501 nodes[0].reveal(select); | 542 node.reveal(select); |
| 502 return nodes[0]; | 543 return node; |
| 503 } | 544 } |
| 504 | 545 |
| 505 /** | 546 /** |
| 506 * @param {!Workspace.UISourceCode} uiSourceCode | 547 * @param {!Workspace.UISourceCode} uiSourceCode |
| 507 * @param {boolean} focusSource | 548 * @param {boolean} focusSource |
| 508 */ | 549 */ |
| 509 _sourceSelected(uiSourceCode, focusSource) { | 550 _sourceSelected(uiSourceCode, focusSource) { |
| 510 this._lastSelectedUISourceCode = uiSourceCode; | 551 this._lastSelectedUISourceCode = uiSourceCode; |
| 511 Common.Revealer.reveal(uiSourceCode, !focusSource); | 552 Common.Revealer.reveal(uiSourceCode, !focusSource); |
| 512 } | 553 } |
| 513 | 554 |
| 514 /** | 555 /** |
| 515 * @param {!Workspace.UISourceCode} uiSourceCode | 556 * @param {!Workspace.UISourceCode} uiSourceCode |
| 516 */ | 557 */ |
| 517 sourceDeleted(uiSourceCode) { | 558 sourceDeleted(uiSourceCode) { |
| 518 } | 559 } |
| 519 | 560 |
| 520 /** | 561 /** |
| 521 * @param {!Workspace.UISourceCode} uiSourceCode | 562 * @param {!Workspace.UISourceCode} uiSourceCode |
| 522 */ | 563 */ |
| 523 _removeUISourceCode(uiSourceCode) { | 564 _removeUISourceCode(uiSourceCode) { |
| 524 var nodes = this._uiSourceCodeNodes.get(uiSourceCode) || []; | 565 var nodes = this._uiSourceCodeNodes.get(uiSourceCode); |
| 525 for (var i = 0; i < nodes.length; i++) { | 566 for (var node of nodes) |
| 526 var node = nodes[i]; | 567 this._removeUISourceCodeNode(node); |
| 568 } | |
| 527 | 569 |
| 528 var project = uiSourceCode.project(); | 570 /** |
| 529 var target = Bindings.NetworkProject.targetForUISourceCode(uiSourceCode); | 571 * @param {!Sources.NavigatorUISourceCodeTreeNode} node |
| 530 var frame = node.frame(); | 572 */ |
| 573 _removeUISourceCodeNode(node) { | |
| 574 var uiSourceCode = node.uiSourceCode(); | |
| 575 this._uiSourceCodeNodes.remove(uiSourceCode, node); | |
| 576 var project = uiSourceCode.project(); | |
| 577 var target = Bindings.NetworkProject.targetForUISourceCode(uiSourceCode); | |
| 578 var frame = node.frame(); | |
| 531 | 579 |
| 532 var parentNode = node.parent; | 580 var parentNode = node.parent; |
| 581 parentNode.removeChild(node); | |
| 582 node = parentNode; | |
| 583 | |
| 584 while (node) { | |
| 585 parentNode = node.parent; | |
| 586 if (!parentNode || !node.isEmpty()) | |
| 587 break; | |
| 588 if (!(node instanceof Sources.NavigatorGroupTreeNode || node instanceof So urces.NavigatorFolderTreeNode)) | |
| 589 break; | |
| 590 if (node._type === Sources.NavigatorView.Types.Frame) { | |
| 591 this._discardFrame(/** @type {!SDK.ResourceTreeFrame} */ (frame)); | |
| 592 break; | |
| 593 } | |
| 594 | |
| 595 var folderId = this._folderNodeId(project, target, frame, uiSourceCode.ori gin(), node._folderPath); | |
| 596 this._subfolderNodes.delete(folderId); | |
| 533 parentNode.removeChild(node); | 597 parentNode.removeChild(node); |
| 534 node = parentNode; | 598 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 } | 599 } |
| 553 this._uiSourceCodeNodes.delete(uiSourceCode); | |
| 554 } | 600 } |
| 555 | 601 |
| 556 reset() { | 602 reset() { |
| 557 for (var entry of this._uiSourceCodeNodes) { | 603 for (var node of this._uiSourceCodeNodes.valuesArray()) |
| 558 var nodes = /** @type {!Array<!Sources.NavigatorUISourceCodeTreeNode>} */ (entry[1]); | 604 node.dispose(); |
| 559 for (var i = 0; i < nodes.length; i++) | |
| 560 nodes[i].dispose(); | |
| 561 } | |
| 562 | 605 |
| 563 this._scriptsTree.removeChildren(); | 606 this._scriptsTree.removeChildren(); |
| 564 this._uiSourceCodeNodes.clear(); | 607 this._uiSourceCodeNodes.clear(); |
| 565 this._subfolderNodes.clear(); | 608 this._subfolderNodes.clear(); |
| 566 this._frameNodes.clear(); | 609 this._frameNodes.clear(); |
| 567 this._rootNode.reset(); | 610 this._rootNode.reset(); |
| 568 } | 611 } |
| 569 | 612 |
| 570 /** | 613 /** |
| 571 * @param {!Event} event | 614 * @param {!Event} event |
| (...skipping 1023 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1595 /** | 1638 /** |
| 1596 * @param {string} title | 1639 * @param {string} title |
| 1597 * @override | 1640 * @override |
| 1598 */ | 1641 */ |
| 1599 setTitle(title) { | 1642 setTitle(title) { |
| 1600 this._title = title; | 1643 this._title = title; |
| 1601 if (this._treeElement) | 1644 if (this._treeElement) |
| 1602 this._treeElement.title = this._title; | 1645 this._treeElement.title = this._title; |
| 1603 } | 1646 } |
| 1604 }; | 1647 }; |
| OLD | NEW |