Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(583)

Side by Side Diff: third_party/WebKit/Source/devtools/front_end/sources/NavigatorView.js

Issue 2869293002: DevTools: make CompilerScriptMapping / SASSSourceMapping manage UISourceCodes (Closed)
Patch Set: address comments Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
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
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
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 };
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698