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

Side by Side Diff: Source/devtools/front_end/NetworkPanel.js

Issue 207553010: DevTools: speed up network scrolling and layout. (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Created 6 years, 9 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 | Annotate | Revision Log
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2007, 2008 Apple Inc. All rights reserved. 2 * Copyright (C) 2007, 2008 Apple Inc. All rights reserved.
3 * Copyright (C) 2008, 2009 Anthony Ricaud <rik@webkit.org> 3 * Copyright (C) 2008, 2009 Anthony Ricaud <rik@webkit.org>
4 * Copyright (C) 2011 Google Inc. All rights reserved. 4 * Copyright (C) 2011 Google Inc. All rights reserved.
5 * 5 *
6 * Redistribution and use in source and binary forms, with or without 6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions 7 * modification, are permitted provided that the following conditions
8 * are met: 8 * are met:
9 * 9 *
10 * 1. Redistributions of source code must retain the above copyright 10 * 1. Redistributions of source code must retain the above copyright
(...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after
177 /** 177 /**
178 * @return {!Array.<!Element>} 178 * @return {!Array.<!Element>}
179 */ 179 */
180 elementsToRestoreScrollPositionsFor: function() 180 elementsToRestoreScrollPositionsFor: function()
181 { 181 {
182 if (!this._dataGrid) // Not initialized yet. 182 if (!this._dataGrid) // Not initialized yet.
183 return []; 183 return [];
184 return [this._dataGrid.scrollContainer]; 184 return [this._dataGrid.scrollContainer];
185 }, 185 },
186 186
187 onResize: function()
188 {
189 this._updateOffscreenRows();
190 },
191
192 _createTimelineGrid: function() 187 _createTimelineGrid: function()
193 { 188 {
194 this._timelineGrid = new WebInspector.TimelineGrid(); 189 this._timelineGrid = new WebInspector.TimelineGrid();
195 this._timelineGrid.element.classList.add("network-timeline-grid"); 190 this._timelineGrid.element.classList.add("network-timeline-grid");
196 this._dataGrid.element.appendChild(this._timelineGrid.element); 191 this._dataGrid.element.appendChild(this._timelineGrid.element);
197 }, 192 },
198 193
199 _createTable: function() 194 _createTable: function()
200 { 195 {
201 var columns = []; 196 var columns = [];
(...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after
318 this._dataGrid = new WebInspector.DataGrid(columns); 313 this._dataGrid = new WebInspector.DataGrid(columns);
319 this._dataGrid.setName("networkLog"); 314 this._dataGrid.setName("networkLog");
320 this._dataGrid.resizeMethod = WebInspector.DataGrid.ResizeMethod.Last; 315 this._dataGrid.resizeMethod = WebInspector.DataGrid.ResizeMethod.Last;
321 this._dataGrid.element.classList.add("network-log-grid"); 316 this._dataGrid.element.classList.add("network-log-grid");
322 this._dataGrid.element.addEventListener("contextmenu", this._contextMenu .bind(this), true); 317 this._dataGrid.element.addEventListener("contextmenu", this._contextMenu .bind(this), true);
323 this._dataGrid.show(this.element); 318 this._dataGrid.show(this.element);
324 319
325 // Event listeners need to be added _after_ we attach to the document, s o that owner document is properly update. 320 // Event listeners need to be added _after_ we attach to the document, s o that owner document is properly update.
326 this._dataGrid.addEventListener(WebInspector.DataGrid.Events.SortingChan ged, this._sortItems, this); 321 this._dataGrid.addEventListener(WebInspector.DataGrid.Events.SortingChan ged, this._sortItems, this);
327 this._dataGrid.addEventListener(WebInspector.DataGrid.Events.ColumnsResi zed, this._updateDividersIfNeeded, this); 322 this._dataGrid.addEventListener(WebInspector.DataGrid.Events.ColumnsResi zed, this._updateDividersIfNeeded, this);
328 this._dataGrid.scrollContainer.addEventListener("scroll", this._updateOf fscreenRows.bind(this));
329 323
330 this._patchTimelineHeader(); 324 this._patchTimelineHeader();
331 }, 325 },
332 326
333 _makeHeaderFragment: function(title, subtitle) 327 _makeHeaderFragment: function(title, subtitle)
334 { 328 {
335 var fragment = document.createDocumentFragment(); 329 var fragment = document.createDocumentFragment();
336 fragment.createTextChild(title); 330 fragment.createTextChild(title);
337 var subtitleDiv = fragment.createChild("div", "network-header-subtitle") ; 331 var subtitleDiv = fragment.createChild("div", "network-header-subtitle") ;
338 subtitleDiv.createTextChild(subtitle); 332 subtitleDiv.createTextChild(subtitle);
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after
422 if (columnIdentifier === "timeline") { 416 if (columnIdentifier === "timeline") {
423 this._sortByTimeline(); 417 this._sortByTimeline();
424 return; 418 return;
425 } 419 }
426 var sortingFunction = this._sortingFunctions[columnIdentifier]; 420 var sortingFunction = this._sortingFunctions[columnIdentifier];
427 if (!sortingFunction) 421 if (!sortingFunction)
428 return; 422 return;
429 423
430 this._dataGrid.sortNodes(sortingFunction, !this._dataGrid.isSortOrderAsc ending()); 424 this._dataGrid.sortNodes(sortingFunction, !this._dataGrid.isSortOrderAsc ending());
431 this._timelineSortSelector.selectedIndex = 0; 425 this._timelineSortSelector.selectedIndex = 0;
432 this._updateOffscreenRows(); 426 this._updateRows();
433 427
434 this.searchCanceled(); 428 this.searchCanceled();
435 429
436 WebInspector.notifications.dispatchEventToListeners(WebInspector.UserMet rics.UserAction, { 430 WebInspector.notifications.dispatchEventToListeners(WebInspector.UserMet rics.UserAction, {
437 action: WebInspector.UserMetrics.UserActionNames.NetworkSort, 431 action: WebInspector.UserMetrics.UserActionNames.NetworkSort,
438 column: columnIdentifier, 432 column: columnIdentifier,
439 sortOrder: this._dataGrid.sortOrder() 433 sortOrder: this._dataGrid.sortOrder()
440 }); 434 });
441 }, 435 },
442 436
443 _sortByTimeline: function() 437 _sortByTimeline: function()
444 { 438 {
445 this._removeAllNodeHighlights(); 439 this._removeAllNodeHighlights();
446 var selectedIndex = this._timelineSortSelector.selectedIndex; 440 var selectedIndex = this._timelineSortSelector.selectedIndex;
447 if (!selectedIndex) 441 if (!selectedIndex)
448 selectedIndex = 1; // Sort by start time by default. 442 selectedIndex = 1; // Sort by start time by default.
449 var selectedOption = this._timelineSortSelector[selectedIndex]; 443 var selectedOption = this._timelineSortSelector[selectedIndex];
450 var value = selectedOption.value; 444 var value = selectedOption.value;
451 445
452 var sortingFunction = this._sortingFunctions[value]; 446 var sortingFunction = this._sortingFunctions[value];
453 this._dataGrid.sortNodes(sortingFunction); 447 this._dataGrid.sortNodes(sortingFunction);
454 this.calculator = this._calculators[value]; 448 this.calculator = this._calculators[value];
455 if (this.calculator.startAtZero) 449 if (this.calculator.startAtZero)
456 this._timelineGrid.hideEventDividers(); 450 this._timelineGrid.hideEventDividers();
457 else 451 else
458 this._timelineGrid.showEventDividers(); 452 this._timelineGrid.showEventDividers();
459 this._dataGrid.markColumnAsSortedBy("timeline", WebInspector.DataGrid.Or der.Ascending); 453 this._dataGrid.markColumnAsSortedBy("timeline", WebInspector.DataGrid.Or der.Ascending);
460 this._updateOffscreenRows(); 454 this._updateRows();
461 }, 455 },
462 456
463 _createStatusBarItems: function() 457 _createStatusBarItems: function()
464 { 458 {
465 this._progressBarContainer = document.createElement("div"); 459 this._progressBarContainer = document.createElement("div");
466 this._progressBarContainer.className = "status-bar-item"; 460 this._progressBarContainer.className = "status-bar-item";
467 }, 461 },
468 462
469 _updateSummaryBar: function() 463 _updateSummaryBar: function()
470 { 464 {
(...skipping 434 matching lines...) Expand 10 before | Expand all | Expand 10 after
905 if (!enabled) { 899 if (!enabled) {
906 this._largerRequestsButton.title = WebInspector.UIString("Use large resource rows."); 900 this._largerRequestsButton.title = WebInspector.UIString("Use large resource rows.");
907 this._dataGrid.element.classList.add("small"); 901 this._dataGrid.element.classList.add("small");
908 this._timelineGrid.element.classList.add("small"); 902 this._timelineGrid.element.classList.add("small");
909 } else { 903 } else {
910 this._largerRequestsButton.title = WebInspector.UIString("Use small resource rows."); 904 this._largerRequestsButton.title = WebInspector.UIString("Use small resource rows.");
911 this._dataGrid.element.classList.remove("small"); 905 this._dataGrid.element.classList.remove("small");
912 this._timelineGrid.element.classList.remove("small"); 906 this._timelineGrid.element.classList.remove("small");
913 } 907 }
914 this.dispatchEventToListeners(WebInspector.NetworkLogView.EventTypes.Row SizeChanged, { largeRows: enabled }); 908 this.dispatchEventToListeners(WebInspector.NetworkLogView.EventTypes.Row SizeChanged, { largeRows: enabled });
915 this._updateOffscreenRows();
916 }, 909 },
917 910
918 _getPopoverAnchor: function(element) 911 _getPopoverAnchor: function(element)
919 { 912 {
920 if (!this._allowPopover) 913 if (!this._allowPopover)
921 return; 914 return;
922 var anchor = element.enclosingNodeOrSelfWithClass("network-graph-bar") | | element.enclosingNodeOrSelfWithClass("network-graph-label"); 915 var anchor = element.enclosingNodeOrSelfWithClass("network-graph-bar") | | element.enclosingNodeOrSelfWithClass("network-graph-label");
923 if (anchor && anchor.parentElement.request && anchor.parentElement.reque st.timing) 916 if (anchor && anchor.parentElement.request && anchor.parentElement.reque st.timing)
924 return anchor; 917 return anchor;
925 anchor = element.enclosingNodeOrSelfWithClass("network-script-initiated" ); 918 anchor = element.enclosingNodeOrSelfWithClass("network-script-initiated" );
(...skipping 221 matching lines...) Expand 10 before | Expand all | Expand 10 after
1147 if (confirm(WebInspector.UIString("Are you sure you want to clear browse r cache?"))) 1140 if (confirm(WebInspector.UIString("Are you sure you want to clear browse r cache?")))
1148 NetworkAgent.clearBrowserCache(); 1141 NetworkAgent.clearBrowserCache();
1149 }, 1142 },
1150 1143
1151 _clearBrowserCookies: function() 1144 _clearBrowserCookies: function()
1152 { 1145 {
1153 if (confirm(WebInspector.UIString("Are you sure you want to clear browse r cookies?"))) 1146 if (confirm(WebInspector.UIString("Are you sure you want to clear browse r cookies?")))
1154 NetworkAgent.clearBrowserCookies(); 1147 NetworkAgent.clearBrowserCookies();
1155 }, 1148 },
1156 1149
1157 _updateOffscreenRows: function() 1150 _updateRows: function()
eustas 2014/03/26 04:46:48 This method could be eliminated totally by adding
pfeldman 2014/03/26 05:00:57 I don't think so - it is responsible for filtering
1158 { 1151 {
1159 var dataTableBody = this._dataGrid.dataTableBody; 1152 var dataTableBody = this._dataGrid.dataTableBody;
1160 var rows = dataTableBody.children; 1153 var rows = dataTableBody.children;
1161 var recordsCount = rows.length; 1154 var recordsCount = rows.length;
1162 if (recordsCount < 2) 1155 if (recordsCount < 2)
1163 return; // Filler row only. 1156 return; // Filler row only.
1164 1157
1165 var visibleTop = this._dataGrid.scrollContainer.scrollTop;
1166 var visibleBottom = visibleTop + this._dataGrid.scrollContainer.offsetHe ight;
1167
1168 var rowHeight = 0;
1169
1170 // Filler is at recordsCount - 1. 1158 // Filler is at recordsCount - 1.
1171 var unfilteredRowIndex = 0; 1159 var unfilteredRowIndex = 0;
1172 for (var i = 0; i < recordsCount - 1; ++i) { 1160 for (var i = 0; i < recordsCount - 1; ++i) {
1173 var row = rows[i]; 1161 var row = rows[i];
1174 1162
1175 var dataGridNode = this._dataGrid.dataGridNodeFromNode(row); 1163 var dataGridNode = this._dataGrid.dataGridNodeFromNode(row);
1176 if (dataGridNode.isFilteredOut()) { 1164 if (dataGridNode.isFilteredOut()) {
1177 row.classList.remove("offscreen"); 1165 row.classList.remove("offscreen");
1178 continue; 1166 continue;
1179 } 1167 }
1180 1168
1181 if (!rowHeight)
1182 rowHeight = row.offsetHeight;
1183
1184 var rowIsVisible = unfilteredRowIndex * rowHeight < visibleBottom && (unfilteredRowIndex + 1) * rowHeight > visibleTop;
1185 if (rowIsVisible !== row.rowIsVisible) {
1186 row.classList.toggle("offscreen", !rowIsVisible);
1187 row.rowIsVisible = rowIsVisible;
1188 }
1189 var rowIsOdd = !!(unfilteredRowIndex & 1); 1169 var rowIsOdd = !!(unfilteredRowIndex & 1);
1190 if (rowIsOdd !== row.rowIsOdd) { 1170 if (rowIsOdd !== row.rowIsOdd) {
1191 row.classList.toggle("odd", rowIsOdd); 1171 row.classList.toggle("odd", rowIsOdd);
1192 row.rowIsOdd = rowIsOdd; 1172 row.rowIsOdd = rowIsOdd;
1193 } 1173 }
1194 unfilteredRowIndex++; 1174 unfilteredRowIndex++;
1195 } 1175 }
1196 }, 1176 },
1197 1177
1198 _matchRequest: function(request) 1178 _matchRequest: function(request)
(...skipping 197 matching lines...) Expand 10 before | Expand all | Expand 10 after
1396 1376
1397 _filterRequests: function() 1377 _filterRequests: function()
1398 { 1378 {
1399 this._removeAllHighlights(); 1379 this._removeAllHighlights();
1400 this._filteredOutRequests.clear(); 1380 this._filteredOutRequests.clear();
1401 1381
1402 var nodes = this._dataGrid.rootNode().children; 1382 var nodes = this._dataGrid.rootNode().children;
1403 for (var i = 0; i < nodes.length; ++i) 1383 for (var i = 0; i < nodes.length; ++i)
1404 this._applyFilter(nodes[i]); 1384 this._applyFilter(nodes[i]);
1405 this._updateSummaryBar(); 1385 this._updateSummaryBar();
1406 this._updateOffscreenRows(); 1386 this._updateRows();
1407 }, 1387 },
1408 1388
1409 jumpToPreviousSearchResult: function() 1389 jumpToPreviousSearchResult: function()
1410 { 1390 {
1411 if (!this._matchedRequests.length) 1391 if (!this._matchedRequests.length)
1412 return; 1392 return;
1413 this._highlightNthMatchedRequestForSearch((this._currentMatchedRequestIn dex + this._matchedRequests.length - 1) % this._matchedRequests.length, true); 1393 this._highlightNthMatchedRequestForSearch((this._currentMatchedRequestIn dex + this._matchedRequests.length - 1) % this._matchedRequests.length, true);
1414 }, 1394 },
1415 1395
1416 jumpToNextSearchResult: function() 1396 jumpToNextSearchResult: function()
(...skipping 959 matching lines...) Expand 10 before | Expand all | Expand 10 after
2376 WebInspector.DataGridNode.call(this, {}); 2356 WebInspector.DataGridNode.call(this, {});
2377 this._parentView = parentView; 2357 this._parentView = parentView;
2378 this._request = request; 2358 this._request = request;
2379 this._linkifier = new WebInspector.Linkifier(); 2359 this._linkifier = new WebInspector.Linkifier();
2380 } 2360 }
2381 2361
2382 WebInspector.NetworkDataGridNode.prototype = { 2362 WebInspector.NetworkDataGridNode.prototype = {
2383 /** override */ 2363 /** override */
2384 createCells: function() 2364 createCells: function()
2385 { 2365 {
2386 // Out of sight, out of mind: create nodes offscreen to save on render t ree update times when running updateOffscreenRows() 2366 // Out of sight, out of mind: create nodes offscreen to save on render t ree update times when running updateOffscreenRows()
alph 2014/03/25 22:07:24 Nuke it
pfeldman 2014/03/26 05:00:57 Done.
2387 this._element.classList.add("offscreen");
2388 this._nameCell = this._createDivInTD("name"); 2367 this._nameCell = this._createDivInTD("name");
2389 this._methodCell = this._createDivInTD("method"); 2368 this._methodCell = this._createDivInTD("method");
2390 this._statusCell = this._createDivInTD("status"); 2369 this._statusCell = this._createDivInTD("status");
2391 this._schemeCell = this._createDivInTD("scheme"); 2370 this._schemeCell = this._createDivInTD("scheme");
2392 this._domainCell = this._createDivInTD("domain"); 2371 this._domainCell = this._createDivInTD("domain");
2393 this._remoteAddressCell = this._createDivInTD("remoteAddress"); 2372 this._remoteAddressCell = this._createDivInTD("remoteAddress");
2394 this._typeCell = this._createDivInTD("type"); 2373 this._typeCell = this._createDivInTD("type");
2395 this._initiatorCell = this._createDivInTD("initiator"); 2374 this._initiatorCell = this._createDivInTD("initiator");
2396 this._cookiesCell = this._createDivInTD("cookies"); 2375 this._cookiesCell = this._createDivInTD("cookies");
2397 this._setCookiesCell = this._createDivInTD("setCookies"); 2376 this._setCookiesCell = this._createDivInTD("setCookies");
(...skipping 498 matching lines...) Expand 10 before | Expand all | Expand 10 after
2896 WebInspector.NetworkDataGridNode.RequestPropertyComparator = function(propertyNa me, revert, a, b) 2875 WebInspector.NetworkDataGridNode.RequestPropertyComparator = function(propertyNa me, revert, a, b)
2897 { 2876 {
2898 var aValue = a._request[propertyName]; 2877 var aValue = a._request[propertyName];
2899 var bValue = b._request[propertyName]; 2878 var bValue = b._request[propertyName];
2900 if (aValue > bValue) 2879 if (aValue > bValue)
2901 return revert ? -1 : 1; 2880 return revert ? -1 : 1;
2902 if (bValue > aValue) 2881 if (bValue > aValue)
2903 return revert ? 1 : -1; 2882 return revert ? 1 : -1;
2904 return 0; 2883 return 0;
2905 } 2884 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698