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

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

Issue 1523193002: DevTools: merge UISourceCode's parentPath, name, originURL and uri. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: all tests pass Created 5 years 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 25 matching lines...) Expand all
36 36
37 var scriptsOutlineElement = this.element.createChild("div", "navigator"); 37 var scriptsOutlineElement = this.element.createChild("div", "navigator");
38 this._scriptsTree = new TreeOutlineInShadow(); 38 this._scriptsTree = new TreeOutlineInShadow();
39 this._scriptsTree.registerRequiredCSS("sources/navigatorView.css"); 39 this._scriptsTree.registerRequiredCSS("sources/navigatorView.css");
40 this._scriptsTree.setComparator(WebInspector.NavigatorView._treeElementsComp are); 40 this._scriptsTree.setComparator(WebInspector.NavigatorView._treeElementsComp are);
41 this.element.appendChild(this._scriptsTree.element); 41 this.element.appendChild(this._scriptsTree.element);
42 this.setDefaultFocusedElement(this._scriptsTree.element); 42 this.setDefaultFocusedElement(this._scriptsTree.element);
43 43
44 /** @type {!Map.<!WebInspector.UISourceCode, !WebInspector.NavigatorUISource CodeTreeNode>} */ 44 /** @type {!Map.<!WebInspector.UISourceCode, !WebInspector.NavigatorUISource CodeTreeNode>} */
45 this._uiSourceCodeNodes = new Map(); 45 this._uiSourceCodeNodes = new Map();
46 /** @type {!Map.<!WebInspector.NavigatorTreeNode, !Map.<string, !WebInspecto r.NavigatorFolderTreeNode>>} */ 46 /** @type {!Map.<string, !WebInspector.NavigatorFolderTreeNode>} */
47 this._subfolderNodes = new Map(); 47 this._subfolderNodes = new Map();
48 48
49 this._rootNode = new WebInspector.NavigatorRootTreeNode(this); 49 this._rootNode = new WebInspector.NavigatorRootTreeNode(this);
50 this._rootNode.populate(); 50 this._rootNode.populate();
51 51
52 this.element.addEventListener("contextmenu", this.handleContextMenu.bind(thi s), false); 52 this.element.addEventListener("contextmenu", this.handleContextMenu.bind(thi s), false);
53 } 53 }
54 54
55 WebInspector.NavigatorView.Events = { 55 WebInspector.NavigatorView.Events = {
56 ItemSelected: "ItemSelected", 56 ItemSelected: "ItemSelected",
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
108 }, 108 },
109 109
110 /** 110 /**
111 * @param {!WebInspector.UISourceCode} uiSourceCode 111 * @param {!WebInspector.UISourceCode} uiSourceCode
112 */ 112 */
113 _addUISourceCode: function(uiSourceCode) 113 _addUISourceCode: function(uiSourceCode)
114 { 114 {
115 if (!this.accept(uiSourceCode)) 115 if (!this.accept(uiSourceCode))
116 return; 116 return;
117 var isFromSourceMap = uiSourceCode.contentType().isFromSourceMap(); 117 var isFromSourceMap = uiSourceCode.contentType().isFromSourceMap();
118 var projectNode = this._projectNode(uiSourceCode.project(), isFromSource Map); 118 var path;
119 var folderNode = this._folderNode(projectNode, uiSourceCode.parentPath() , isFromSourceMap); 119 if (uiSourceCode.project().type() === WebInspector.projectTypes.FileSyst em)
120 path = WebInspector.FileSystemWorkspaceBinding.relativePath(uiSource Code).slice(0, -1);
121 else
122 path = WebInspector.ParsedURL.splitURLIntoPathComponents(uiSourceCod e.path()).slice(1, -1);
123 var folderNode = this._folderNode(uiSourceCode.project(), uiSourceCode.h ost(), path, isFromSourceMap);
120 var uiSourceCodeNode = new WebInspector.NavigatorUISourceCodeTreeNode(th is, uiSourceCode); 124 var uiSourceCodeNode = new WebInspector.NavigatorUISourceCodeTreeNode(th is, uiSourceCode);
121 this._uiSourceCodeNodes.set(uiSourceCode, uiSourceCodeNode); 125 this._uiSourceCodeNodes.set(uiSourceCode, uiSourceCodeNode);
122 folderNode.appendChild(uiSourceCodeNode); 126 folderNode.appendChild(uiSourceCodeNode);
123 }, 127 },
124 128
125 /** 129 /**
126 * @param {!WebInspector.Event} event 130 * @param {!WebInspector.Event} event
127 */ 131 */
128 _uiSourceCodeAdded: function(event) 132 _uiSourceCodeAdded: function(event)
129 { 133 {
(...skipping 16 matching lines...) Expand all
146 _projectRemoved: function(event) 150 _projectRemoved: function(event)
147 { 151 {
148 var project = /** @type {!WebInspector.Project} */ (event.data); 152 var project = /** @type {!WebInspector.Project} */ (event.data);
149 var uiSourceCodes = project.uiSourceCodes(); 153 var uiSourceCodes = project.uiSourceCodes();
150 for (var i = 0; i < uiSourceCodes.length; ++i) 154 for (var i = 0; i < uiSourceCodes.length; ++i)
151 this._removeUISourceCode(uiSourceCodes[i]); 155 this._removeUISourceCode(uiSourceCodes[i]);
152 }, 156 },
153 157
154 /** 158 /**
155 * @param {!WebInspector.Project} project 159 * @param {!WebInspector.Project} project
156 * @param {boolean} isFromSourceMap 160 * @param {string} projectHost
157 * @return {!WebInspector.NavigatorTreeNode} 161 * @param {!Array<string>} path
158 */
159 _projectNode: function(project, isFromSourceMap)
160 {
161 if (!project.displayName())
162 return this._rootNode;
163
164 var projectNode = this._rootNode.child(project.id());
165 if (!projectNode) {
166 projectNode = this._createProjectNode(project, isFromSourceMap);
167 this._rootNode.appendChild(projectNode);
168 }
169 return projectNode;
170 },
171
172 /**
173 * @param {!WebInspector.Project} project
174 * @param {boolean} isFromSourceMap
175 * @return {!WebInspector.NavigatorTreeNode}
176 */
177 _createProjectNode: function(project, isFromSourceMap)
178 {
179 var type;
180 if (isFromSourceMap)
181 type = WebInspector.NavigatorView.Types.SourceMapFolder;
182 else
183 type = project.type() === WebInspector.projectTypes.FileSystem ? Web Inspector.NavigatorView.Types.FileSystem : WebInspector.NavigatorView.Types.Doma in;
184 var projectNode = new WebInspector.NavigatorFolderTreeNode(this, project , project.id(), type, "", project.displayName());
185 return projectNode;
186 },
187
188 /**
189 * @param {!WebInspector.NavigatorTreeNode} projectNode
190 * @param {string} folderPath
191 * @param {boolean} fromSourceMap 162 * @param {boolean} fromSourceMap
192 * @return {!WebInspector.NavigatorTreeNode} 163 * @return {!WebInspector.NavigatorTreeNode}
193 */ 164 */
194 _folderNode: function(projectNode, folderPath, fromSourceMap) 165 _folderNode: function(project, projectHost, path, fromSourceMap)
195 { 166 {
196 if (!folderPath) 167 if (project.type() === WebInspector.projectTypes.Snippets)
197 return projectNode; 168 return this._rootNode;
198 169
199 var subfolderNodes = this._subfolderNodes.get(projectNode); 170 var folderPath = path.join("/");
200 if (!subfolderNodes) { 171 var folderId = project.id() + ":" + projectHost + ":" + folderPath;
201 subfolderNodes = /** @type {!Map.<string, !WebInspector.NavigatorFol derTreeNode>} */ (new Map()); 172 var folderNode = this._subfolderNodes.get(folderId);
202 this._subfolderNodes.set(projectNode, subfolderNodes);
203 }
204
205 var folderNode = subfolderNodes.get(folderPath);
206 if (folderNode) 173 if (folderNode)
207 return folderNode; 174 return folderNode;
208 175
209 var parentNode = projectNode; 176 var parentNode = path.length ? this._folderNode(project, projectHost, pa th.slice(0, -1), fromSourceMap) : this._rootNode;
210 var index = folderPath.lastIndexOf("/");
211 if (index !== -1)
212 parentNode = this._folderNode(projectNode, folderPath.substring(0, i ndex), fromSourceMap);
213 177
214 var name = folderPath.substring(index + 1); 178 var type = fromSourceMap ? WebInspector.NavigatorView.Types.SourceMapFol der : WebInspector.NavigatorView.Types.Folder;
215 folderNode = new WebInspector.NavigatorFolderTreeNode(this, null, name, fromSourceMap ? WebInspector.NavigatorView.Types.SourceMapFolder : WebInspector. NavigatorView.Types.Folder, folderPath, name); 179 var name = path[path.length - 1];
dgozman 2015/12/16 07:58:30 peekLast
pfeldman 2015/12/16 18:02:18 Acknowledged.
216 subfolderNodes.set(folderPath, folderNode); 180 if (parentNode === this._rootNode) {
181 var target = WebInspector.NetworkProject.targetForProject(project);
182 if (target) {
183 name = this._computeProjectDisplayName(target, projectHost);
184 if (!fromSourceMap)
185 type = WebInspector.NavigatorView.Types.Domain;
186 } else {
187 name = project.displayName();
188 }
189 }
190
191 folderNode = new WebInspector.NavigatorFolderTreeNode(this, project, fol derId, type, folderPath, name);
192 this._subfolderNodes.set(folderId, folderNode);
217 parentNode.appendChild(folderNode); 193 parentNode.appendChild(folderNode);
218 return folderNode; 194 return folderNode;
219 }, 195 },
220 196
221 /** 197 /**
198 * @param {!WebInspector.Target} target
199 * @param {string} projectHost
200 * @return {string}
201 */
202 _computeProjectDisplayName: function(target, projectHost)
203 {
204 for (var context of target.runtimeModel.executionContexts()) {
205 if (context.name && context.origin && projectHost.startsWith(context .origin))
206 return context.name;
207 }
208
209 var targetSuffix = target.isPage() ? "" : " \u2014 " + target.name();
210 if (!projectHost)
211 return WebInspector.UIString("(no domain)") + targetSuffix;
212 var parsedURL = new WebInspector.ParsedURL(projectHost);
213 var prettyURL = parsedURL.isValid ? parsedURL.host + (parsedURL.port ? ( ":" + parsedURL.port) : "") : "";
214 return (prettyURL || projectHost) + targetSuffix;
215 },
216
217 /**
222 * @param {!WebInspector.UISourceCode} uiSourceCode 218 * @param {!WebInspector.UISourceCode} uiSourceCode
223 * @param {boolean=} select 219 * @param {boolean=} select
224 */ 220 */
225 revealUISourceCode: function(uiSourceCode, select) 221 revealUISourceCode: function(uiSourceCode, select)
226 { 222 {
227 var node = this._uiSourceCodeNodes.get(uiSourceCode); 223 var node = this._uiSourceCodeNodes.get(uiSourceCode);
228 if (!node) 224 if (!node)
229 return; 225 return;
230 if (this._scriptsTree.selectedTreeElement) 226 if (this._scriptsTree.selectedTreeElement)
231 this._scriptsTree.selectedTreeElement.deselect(); 227 this._scriptsTree.selectedTreeElement.deselect();
(...skipping 21 matching lines...) Expand all
253 249
254 /** 250 /**
255 * @param {!WebInspector.UISourceCode} uiSourceCode 251 * @param {!WebInspector.UISourceCode} uiSourceCode
256 */ 252 */
257 _removeUISourceCode: function(uiSourceCode) 253 _removeUISourceCode: function(uiSourceCode)
258 { 254 {
259 var node = this._uiSourceCodeNodes.get(uiSourceCode); 255 var node = this._uiSourceCodeNodes.get(uiSourceCode);
260 if (!node) 256 if (!node)
261 return; 257 return;
262 258
263 var projectNode = this._projectNode(uiSourceCode.project(), false);
264 var subfolderNodes = this._subfolderNodes.get(projectNode);
265 var parentNode = node.parent; 259 var parentNode = node.parent;
266 this._uiSourceCodeNodes.remove(uiSourceCode); 260 this._uiSourceCodeNodes.remove(uiSourceCode);
267 parentNode.removeChild(node); 261 parentNode.removeChild(node);
268 node = parentNode; 262 node = parentNode;
269 263
270 while (node) { 264 while (node) {
271 parentNode = node.parent; 265 parentNode = node.parent;
272 if (!parentNode || !node.isEmpty()) 266 if (!parentNode || !node.isEmpty())
273 break; 267 break;
274 if (subfolderNodes) 268 this._subfolderNodes.remove(uiSourceCode.project().id() + ":" + uiSo urceCode.host() + ":" + node._folderPath);
275 subfolderNodes.remove(node._folderPath);
276 parentNode.removeChild(node); 269 parentNode.removeChild(node);
277 node = parentNode; 270 node = parentNode;
278 } 271 }
279 }, 272 },
280 273
281 reset: function() 274 reset: function()
282 { 275 {
283 var nodes = this._uiSourceCodeNodes.valuesArray(); 276 var nodes = this._uiSourceCodeNodes.valuesArray();
284 for (var i = 0; i < nodes.length; ++i) 277 for (var i = 0; i < nodes.length; ++i)
285 nodes[i].dispose(); 278 nodes[i].dispose();
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
329 322
330 /** 323 /**
331 * @param {!WebInspector.Project} project 324 * @param {!WebInspector.Project} project
332 * @param {string} path 325 * @param {string} path
333 */ 326 */
334 _handleContextMenuExclude: function(project, path) 327 _handleContextMenuExclude: function(project, path)
335 { 328 {
336 var shouldExclude = window.confirm(WebInspector.UIString("Are you sure y ou want to exclude this folder?")); 329 var shouldExclude = window.confirm(WebInspector.UIString("Are you sure y ou want to exclude this folder?"));
337 if (shouldExclude) { 330 if (shouldExclude) {
338 WebInspector.startBatchUpdate(); 331 WebInspector.startBatchUpdate();
339 project.excludeFolder(path); 332 project.excludeFolder("file:///" + path + "/");
dgozman 2015/12/16 07:58:30 This looks bad. Can we just pass |path| and left F
pfeldman 2015/12/16 18:02:18 There are no "path"s in the Workspace / UISourceCo
340 WebInspector.endBatchUpdate(); 333 WebInspector.endBatchUpdate();
341 } 334 }
342 }, 335 },
343 336
344 /** 337 /**
345 * @param {!WebInspector.UISourceCode} uiSourceCode 338 * @param {!WebInspector.UISourceCode} uiSourceCode
346 */ 339 */
347 _handleContextMenuDelete: function(uiSourceCode) 340 _handleContextMenuDelete: function(uiSourceCode)
348 { 341 {
349 var shouldDelete = window.confirm(WebInspector.UIString("Are you sure yo u want to delete this file?")); 342 var shouldDelete = window.confirm(WebInspector.UIString("Are you sure yo u want to delete this file?"));
(...skipping 22 matching lines...) Expand all
372 365
373 contextMenu.show(); 366 contextMenu.show();
374 }, 367 },
375 368
376 /** 369 /**
377 * @param {!Event} event 370 * @param {!Event} event
378 * @param {!WebInspector.NavigatorFolderTreeNode} node 371 * @param {!WebInspector.NavigatorFolderTreeNode} node
379 */ 372 */
380 handleFolderContextMenu: function(event, node) 373 handleFolderContextMenu: function(event, node)
381 { 374 {
375 var path = node._folderPath;
376 var project = node._project;
377
382 var contextMenu = new WebInspector.ContextMenu(event); 378 var contextMenu = new WebInspector.ContextMenu(event);
383 var path = "/";
384 var projectNode = node;
385 while (projectNode.parent !== this._rootNode) {
386 path = "/" + projectNode.id + path;
387 projectNode = projectNode.parent;
388 }
389 379
390 var project = projectNode._project; 380 if (project && project.type() === WebInspector.projectTypes.FileSystem) {
391
392 if (project.type() === WebInspector.projectTypes.FileSystem) {
393 contextMenu.appendItem(WebInspector.UIString.capitalize("Refresh"), this._handleContextMenuRefresh.bind(this, project, path)); 381 contextMenu.appendItem(WebInspector.UIString.capitalize("Refresh"), this._handleContextMenuRefresh.bind(this, project, path));
394 contextMenu.appendItem(WebInspector.UIString.capitalize("New ^file") , this._handleContextMenuCreate.bind(this, project, path)); 382 contextMenu.appendItem(WebInspector.UIString.capitalize("New ^file") , this._handleContextMenuCreate.bind(this, project, path));
395 contextMenu.appendItem(WebInspector.UIString.capitalize("Exclude ^fo lder"), this._handleContextMenuExclude.bind(this, project, path)); 383 contextMenu.appendItem(WebInspector.UIString.capitalize("Exclude ^fo lder"), this._handleContextMenuExclude.bind(this, project, path));
396 } 384 }
397 contextMenu.appendSeparator(); 385 contextMenu.appendSeparator();
398 WebInspector.NavigatorView.appendAddFolderItem(contextMenu); 386 WebInspector.NavigatorView.appendAddFolderItem(contextMenu);
399 387
400 function removeFolder() 388 function removeFolder()
401 { 389 {
402 var shouldRemove = window.confirm(WebInspector.UIString("Are you sur e you want to remove this folder?")); 390 var shouldRemove = window.confirm(WebInspector.UIString("Are you sur e you want to remove this folder?"));
403 if (shouldRemove) 391 if (shouldRemove)
404 project.remove(); 392 project.remove();
405 } 393 }
406 394
407 if (project.type() === WebInspector.projectTypes.FileSystem && node === projectNode) { 395 if (project.type() === WebInspector.projectTypes.FileSystem) {
408 var removeFolderLabel = WebInspector.UIString.capitalize("Remove ^fo lder from ^workspace"); 396 var removeFolderLabel = WebInspector.UIString.capitalize("Remove ^fo lder from ^workspace");
409 contextMenu.appendItem(removeFolderLabel, removeFolder); 397 contextMenu.appendItem(removeFolderLabel, removeFolder);
410 } 398 }
411 399
412 contextMenu.show(); 400 contextMenu.show();
413 }, 401 },
414 402
415 /** 403 /**
416 * @param {!WebInspector.UISourceCode} uiSourceCode 404 * @param {!WebInspector.UISourceCode} uiSourceCode
417 * @param {boolean} deleteIfCanceled 405 * @param {boolean} deleteIfCanceled
(...skipping 476 matching lines...) Expand 10 before | Expand all | Expand 10 after
894 882
895 /** 883 /**
896 * @return {boolean} 884 * @return {boolean}
897 */ 885 */
898 isEmpty: function() 886 isEmpty: function()
899 { 887 {
900 return !this._children.size; 888 return !this._children.size;
901 }, 889 },
902 890
903 /** 891 /**
904 * @param {string} id
905 * @return {?WebInspector.NavigatorTreeNode}
906 */
907 child: function(id)
908 {
909 return this._children.get(id) || null;
910 },
911
912 /**
913 * @return {!Array.<!WebInspector.NavigatorTreeNode>} 892 * @return {!Array.<!WebInspector.NavigatorTreeNode>}
914 */ 893 */
915 children: function() 894 children: function()
916 { 895 {
917 return this._children.valuesArray(); 896 return this._children.valuesArray();
918 }, 897 },
919 898
920 /** 899 /**
921 * @param {!WebInspector.NavigatorTreeNode} node 900 * @param {!WebInspector.NavigatorTreeNode} node
922 */ 901 */
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
978 } 957 }
979 958
980 /** 959 /**
981 * @constructor 960 * @constructor
982 * @extends {WebInspector.NavigatorTreeNode} 961 * @extends {WebInspector.NavigatorTreeNode}
983 * @param {!WebInspector.NavigatorView} navigatorView 962 * @param {!WebInspector.NavigatorView} navigatorView
984 * @param {!WebInspector.UISourceCode} uiSourceCode 963 * @param {!WebInspector.UISourceCode} uiSourceCode
985 */ 964 */
986 WebInspector.NavigatorUISourceCodeTreeNode = function(navigatorView, uiSourceCod e) 965 WebInspector.NavigatorUISourceCodeTreeNode = function(navigatorView, uiSourceCod e)
987 { 966 {
988 WebInspector.NavigatorTreeNode.call(this, uiSourceCode.name()); 967 WebInspector.NavigatorTreeNode.call(this, uiSourceCode.project().id() + ":" + uiSourceCode.path());
989 this._navigatorView = navigatorView; 968 this._navigatorView = navigatorView;
990 this._uiSourceCode = uiSourceCode; 969 this._uiSourceCode = uiSourceCode;
991 this._treeElement = null; 970 this._treeElement = null;
992 } 971 }
993 972
994 WebInspector.NavigatorUISourceCodeTreeNode.prototype = { 973 WebInspector.NavigatorUISourceCodeTreeNode.prototype = {
995 /** 974 /**
996 * @return {!WebInspector.UISourceCode} 975 * @return {!WebInspector.UISourceCode}
997 */ 976 */
998 uiSourceCode: function() 977 uiSourceCode: function()
(...skipping 28 matching lines...) Expand all
1027 if (!this._treeElement) 1006 if (!this._treeElement)
1028 return; 1007 return;
1029 1008
1030 var titleText = this._uiSourceCode.displayName(); 1009 var titleText = this._uiSourceCode.displayName();
1031 if (!ignoreIsDirty && (this._uiSourceCode.isDirty() || this._uiSourceCod e.hasUnsavedCommittedChanges())) 1010 if (!ignoreIsDirty && (this._uiSourceCode.isDirty() || this._uiSourceCod e.hasUnsavedCommittedChanges()))
1032 titleText = "*" + titleText; 1011 titleText = "*" + titleText;
1033 var tooltip = titleText; 1012 var tooltip = titleText;
1034 if (this._uiSourceCode.contentType().isFromSourceMap()) 1013 if (this._uiSourceCode.contentType().isFromSourceMap())
1035 tooltip = WebInspector.UIString("%s (from source map)", this._uiSour ceCode.displayName()); 1014 tooltip = WebInspector.UIString("%s (from source map)", this._uiSour ceCode.displayName());
1036 this._treeElement.title = titleText; 1015 this._treeElement.title = titleText;
1037 this._treeElement.tooltip = tooltip; 1016 this._treeElement.tooltip = this._uiSourceCode.originURL();
dgozman 2015/12/16 07:58:30 (from source map) is now gone. Restore?
pfeldman 2015/12/16 18:02:18 Okay
1038 }, 1017 },
1039 1018
1040 /** 1019 /**
1041 * @override 1020 * @override
1042 * @return {boolean} 1021 * @return {boolean}
1043 */ 1022 */
1044 hasChildren: function() 1023 hasChildren: function()
1045 { 1024 {
1046 return false; 1025 return false;
1047 }, 1026 },
(...skipping 234 matching lines...) Expand 10 before | Expand all | Expand 10 after
1282 1261
1283 willRemoveChild: function(node) 1262 willRemoveChild: function(node)
1284 { 1263 {
1285 if (node._isMerged || !this.isPopulated()) 1264 if (node._isMerged || !this.isPopulated())
1286 return; 1265 return;
1287 this._treeElement.removeChild(node._treeElement); 1266 this._treeElement.removeChild(node._treeElement);
1288 }, 1267 },
1289 1268
1290 __proto__: WebInspector.NavigatorTreeNode.prototype 1269 __proto__: WebInspector.NavigatorTreeNode.prototype
1291 } 1270 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698