Commit 2878e413 authored by allada's avatar allada Committed by Commit bot

[Devtools] Add experiment for network group support

This patch adds a hidden experiment to support groups of requests in
network panel.

Right now the patch only adds group by domain, but we'll be tweaking that with time to add interface and get rid of non-supported aspects of groups.

See: http://imgur.com/a/FDmmt

R=dgozman
BUG=664704

Review-Url: https://codereview.chromium.org/2561683003
Cr-Commit-Position: refs/heads/master@{#439711}
parent abaa208f
...@@ -17,6 +17,8 @@ function test() { ...@@ -17,6 +17,8 @@ function test() {
function onNodeInserted(node) function onNodeInserted(node)
{ {
if (node.dataGrid !== UI.panels.network._networkLogView._dataGrid)
return;
if (node.request().name() !== "empty.html?xhr") if (node.request().name() !== "empty.html?xhr")
return; return;
xhrNode = node; xhrNode = node;
...@@ -45,7 +47,7 @@ function test() { ...@@ -45,7 +47,7 @@ function test() {
InspectorTest.recordNetwork(); InspectorTest.recordNetwork();
InspectorTest.networkManager.addEventListener(SDK.NetworkManager.Events.RequestFinished, onRequestFinished); InspectorTest.networkManager.addEventListener(SDK.NetworkManager.Events.RequestFinished, onRequestFinished);
InspectorTest.addSniffer(UI.panels.network._networkLogView._dataGrid, "insertChild", onNodeInserted, true); InspectorTest.addSniffer(UI.SortableDataGridNode.prototype, "insertChild", onNodeInserted, true);
InspectorTest.NetworkAgent.setCacheDisabled(true, InspectorTest.evaluateInPage.bind(null, "sendXHRRequest()")); InspectorTest.NetworkAgent.setCacheDisabled(true, InspectorTest.evaluateInPage.bind(null, "sendXHRRequest()"));
} }
</script> </script>
......
...@@ -103,6 +103,7 @@ Main.Main = class { ...@@ -103,6 +103,7 @@ Main.Main = class {
Runtime.experiments.register('emptySourceMapAutoStepping', 'Empty sourcemap auto-stepping'); Runtime.experiments.register('emptySourceMapAutoStepping', 'Empty sourcemap auto-stepping');
Runtime.experiments.register('inputEventsOnTimelineOverview', 'Input events on Timeline overview', true); Runtime.experiments.register('inputEventsOnTimelineOverview', 'Input events on Timeline overview', true);
Runtime.experiments.register('liveSASS', 'Live SASS'); Runtime.experiments.register('liveSASS', 'Live SASS');
Runtime.experiments.register('networkGroupingRequests', 'Network request groups support', true);
Runtime.experiments.register('nodeDebugging', 'Node debugging', true); Runtime.experiments.register('nodeDebugging', 'Node debugging', true);
Runtime.experiments.register('persistence2', 'Persistence 2.0'); Runtime.experiments.register('persistence2', 'Persistence 2.0');
Runtime.experiments.register('persistenceValidation', 'Validate persistence bindings'); Runtime.experiments.register('persistenceValidation', 'Validate persistence bindings');
......
...@@ -69,8 +69,10 @@ Network.NetworkLogView = class extends UI.VBox { ...@@ -69,8 +69,10 @@ Network.NetworkLogView = class extends UI.VBox {
this._columns = new Network.NetworkLogViewColumns( this._columns = new Network.NetworkLogViewColumns(
this, this._timeCalculator, this._durationCalculator, networkLogLargeRowsSetting); this, this._timeCalculator, this._durationCalculator, networkLogLargeRowsSetting);
/** @type {!Map.<string, !Network.NetworkDataGridNode>} */ /** @type {!Map.<string, !Network.NetworkRequestNode>} */
this._nodesByRequestId = new Map(); this._nodesByRequestId = new Map();
/** @type {!Map.<string, !Network.NetworkGroupNode>} */
this._nodeGroups = new Map();
/** @type {!Object.<string, boolean>} */ /** @type {!Object.<string, boolean>} */
this._staleRequestIds = {}; this._staleRequestIds = {};
/** @type {number} */ /** @type {number} */
...@@ -84,6 +86,7 @@ Network.NetworkLogView = class extends UI.VBox { ...@@ -84,6 +86,7 @@ Network.NetworkLogView = class extends UI.VBox {
this._filters = []; this._filters = [];
/** @type {?Network.NetworkLogView.Filter} */ /** @type {?Network.NetworkLogView.Filter} */
this._timeFilter = null; this._timeFilter = null;
/** @type {?Network.NetworkNode} */
this._hoveredNode = null; this._hoveredNode = null;
this._currentMatchedRequestNode = null; this._currentMatchedRequestNode = null;
...@@ -519,8 +522,8 @@ Network.NetworkLogView = class extends UI.VBox { ...@@ -519,8 +522,8 @@ Network.NetworkLogView = class extends UI.VBox {
* @param {!Event} event * @param {!Event} event
*/ */
_dataGridMouseMove(event) { _dataGridMouseMove(event) {
var node = /** @type {?Network.NetworkDataGridNode} */ ( var node =
this._dataGrid.dataGridNodeFromNode(/** @type {!Node} */ (event.target))); /** @type {?Network.NetworkNode} */ (this._dataGrid.dataGridNodeFromNode(/** @type {!Node} */ (event.target)));
var highlightInitiatorChain = event.shiftKey; var highlightInitiatorChain = event.shiftKey;
this._setHoveredNode(node, highlightInitiatorChain); this._setHoveredNode(node, highlightInitiatorChain);
this._highlightInitiatorChain((highlightInitiatorChain && node) ? node.request() : null); this._highlightInitiatorChain((highlightInitiatorChain && node) ? node.request() : null);
...@@ -532,7 +535,7 @@ Network.NetworkLogView = class extends UI.VBox { ...@@ -532,7 +535,7 @@ Network.NetworkLogView = class extends UI.VBox {
} }
/** /**
* @param {?Network.NetworkDataGridNode} node * @param {?Network.NetworkNode} node
* @param {boolean} highlightInitiatorChain * @param {boolean} highlightInitiatorChain
*/ */
setHoveredNode(node, highlightInitiatorChain) { setHoveredNode(node, highlightInitiatorChain) {
...@@ -541,7 +544,7 @@ Network.NetworkLogView = class extends UI.VBox { ...@@ -541,7 +544,7 @@ Network.NetworkLogView = class extends UI.VBox {
} }
/** /**
* @param {?Network.NetworkDataGridNode} node * @param {?Network.NetworkNode} node
* @param {boolean=} highlightInitiatorChain * @param {boolean=} highlightInitiatorChain
*/ */
_setHoveredNode(node, highlightInitiatorChain) { _setHoveredNode(node, highlightInitiatorChain) {
...@@ -780,7 +783,7 @@ Network.NetworkLogView = class extends UI.VBox { ...@@ -780,7 +783,7 @@ Network.NetworkLogView = class extends UI.VBox {
} }
/** /**
* @return {!Array<!Network.NetworkDataGridNode>} * @return {!Array<!Network.NetworkNode>}
*/ */
flatNodesList() { flatNodesList() {
return this._dataGrid.rootNode().flatChildren(); return this._dataGrid.rootNode().flatChildren();
...@@ -801,11 +804,9 @@ Network.NetworkLogView = class extends UI.VBox { ...@@ -801,11 +804,9 @@ Network.NetworkLogView = class extends UI.VBox {
this._timeCalculator.updateBoundariesForEventTime(this._mainRequestDOMContentLoadedTime); this._timeCalculator.updateBoundariesForEventTime(this._mainRequestDOMContentLoadedTime);
this._durationCalculator.updateBoundariesForEventTime(this._mainRequestDOMContentLoadedTime); this._durationCalculator.updateBoundariesForEventTime(this._mainRequestDOMContentLoadedTime);
var dataGrid = this._dataGrid; /** @type {!Array<!Network.NetworkRequestNode> } */
var rootNode = dataGrid.rootNode();
/** @type {!Array<!Network.NetworkDataGridNode> } */
var nodesToInsert = []; var nodesToInsert = [];
/** @type {!Array<!Network.NetworkDataGridNode> } */ /** @type {!Array<!Network.NetworkRequestNode> } */
var nodesToRefresh = []; var nodesToRefresh = [];
for (var requestId in this._staleRequestIds) { for (var requestId in this._staleRequestIds) {
var node = this._nodesByRequestId.get(requestId); var node = this._nodesByRequestId.get(requestId);
...@@ -816,7 +817,7 @@ Network.NetworkLogView = class extends UI.VBox { ...@@ -816,7 +817,7 @@ Network.NetworkLogView = class extends UI.VBox {
this._setHoveredNode(null); this._setHoveredNode(null);
if (node[Network.NetworkLogView._isFilteredOutSymbol] !== isFilteredOut) { if (node[Network.NetworkLogView._isFilteredOutSymbol] !== isFilteredOut) {
if (!node[Network.NetworkLogView._isFilteredOutSymbol]) if (!node[Network.NetworkLogView._isFilteredOutSymbol])
rootNode.removeChild(node); node.parent.removeChild(node);
node[Network.NetworkLogView._isFilteredOutSymbol] = isFilteredOut; node[Network.NetworkLogView._isFilteredOutSymbol] = isFilteredOut;
...@@ -833,8 +834,9 @@ Network.NetworkLogView = class extends UI.VBox { ...@@ -833,8 +834,9 @@ Network.NetworkLogView = class extends UI.VBox {
for (var i = 0; i < nodesToInsert.length; ++i) { for (var i = 0; i < nodesToInsert.length; ++i) {
var node = nodesToInsert[i]; var node = nodesToInsert[i];
var request = node.request(); var request = node.request();
dataGrid.insertChild(node);
node[Network.NetworkLogView._isMatchingSearchQuerySymbol] = this._matchRequest(request); node[Network.NetworkLogView._isMatchingSearchQuerySymbol] = this._matchRequest(request);
var parent = this._parentNodeForInsert(node);
parent.appendChild(node);
} }
for (var node of nodesToRefresh) for (var node of nodesToRefresh)
...@@ -849,6 +851,26 @@ Network.NetworkLogView = class extends UI.VBox { ...@@ -849,6 +851,26 @@ Network.NetworkLogView = class extends UI.VBox {
this._columns.dataChanged(); this._columns.dataChanged();
} }
/**
* @param {!Network.NetworkRequestNode} node
* @return {!Network.NetworkNode}
*/
_parentNodeForInsert(node) {
if (!Runtime.experiments.isEnabled('networkGroupingRequests'))
return /** @type {!Network.NetworkNode} */ (this._dataGrid.rootNode());
var request = node.request();
// TODO(allada) Make this dynamic and allow multiple grouping types.
var groupKey = request.domain;
var group = this._nodeGroups.get(groupKey);
if (group)
return group;
group = new Network.NetworkGroupNode(this, groupKey);
this._nodeGroups.set(groupKey, group);
this._dataGrid.rootNode().appendChild(group);
return group;
}
reset() { reset() {
this._requestWithHighlightedInitiators = null; this._requestWithHighlightedInitiators = null;
this.dispatchEventToListeners(Network.NetworkLogView.Events.RequestSelected, null); this.dispatchEventToListeners(Network.NetworkLogView.Events.RequestSelected, null);
...@@ -867,6 +889,7 @@ Network.NetworkLogView = class extends UI.VBox { ...@@ -867,6 +889,7 @@ Network.NetworkLogView = class extends UI.VBox {
for (var i = 0; i < nodes.length; ++i) for (var i = 0; i < nodes.length; ++i)
nodes[i].dispose(); nodes[i].dispose();
this._nodeGroups.clear();
this._nodesByRequestId.clear(); this._nodesByRequestId.clear();
this._staleRequestIds = {}; this._staleRequestIds = {};
this._resetSuggestionBuilder(); this._resetSuggestionBuilder();
...@@ -904,7 +927,7 @@ Network.NetworkLogView = class extends UI.VBox { ...@@ -904,7 +927,7 @@ Network.NetworkLogView = class extends UI.VBox {
* @param {!SDK.NetworkRequest} request * @param {!SDK.NetworkRequest} request
*/ */
_appendRequest(request) { _appendRequest(request) {
var node = new Network.NetworkDataGridNode(this, request); var node = new Network.NetworkRequestNode(this, request);
node[Network.NetworkLogView._isFilteredOutSymbol] = true; node[Network.NetworkLogView._isFilteredOutSymbol] = true;
node[Network.NetworkLogView._isMatchingSearchQuerySymbol] = false; node[Network.NetworkLogView._isMatchingSearchQuerySymbol] = false;
...@@ -1234,7 +1257,7 @@ Network.NetworkLogView = class extends UI.VBox { ...@@ -1234,7 +1257,7 @@ Network.NetworkLogView = class extends UI.VBox {
_highlightNthMatchedRequestForSearch(n, reveal) { _highlightNthMatchedRequestForSearch(n, reveal) {
this._removeAllHighlights(); this._removeAllHighlights();
/** @type {!Array.<!Network.NetworkDataGridNode>} */ /** @type {!Array.<!Network.NetworkRequestNode>} */
var nodes = this._dataGrid.rootNode().children; var nodes = this._dataGrid.rootNode().children;
var matchCount = 0; var matchCount = 0;
var node = null; var node = null;
...@@ -1275,7 +1298,7 @@ Network.NetworkLogView = class extends UI.VBox { ...@@ -1275,7 +1298,7 @@ Network.NetworkLogView = class extends UI.VBox {
this._clearSearchMatchedList(); this._clearSearchMatchedList();
this._searchRegex = createPlainTextSearchRegex(query, 'i'); this._searchRegex = createPlainTextSearchRegex(query, 'i');
/** @type {!Array.<!Network.NetworkDataGridNode>} */ /** @type {!Array.<!Network.NetworkRequestNode>} */
var nodes = this._dataGrid.rootNode().children; var nodes = this._dataGrid.rootNode().children;
for (var i = 0; i < nodes.length; ++i) for (var i = 0; i < nodes.length; ++i)
nodes[i][Network.NetworkLogView._isMatchingSearchQuerySymbol] = this._matchRequest(nodes[i].request()); nodes[i][Network.NetworkLogView._isMatchingSearchQuerySymbol] = this._matchRequest(nodes[i].request());
...@@ -1302,11 +1325,11 @@ Network.NetworkLogView = class extends UI.VBox { ...@@ -1302,11 +1325,11 @@ Network.NetworkLogView = class extends UI.VBox {
} }
/** /**
* @param {?Network.NetworkDataGridNode} node * @param {?Network.NetworkRequestNode} node
* @return {number} * @return {number}
*/ */
_updateMatchCountAndFindMatchIndex(node) { _updateMatchCountAndFindMatchIndex(node) {
/** @type {!Array.<!Network.NetworkDataGridNode>} */ /** @type {!Array.<!Network.NetworkRequestNode>} */
var nodes = this._dataGrid.rootNode().children; var nodes = this._dataGrid.rootNode().children;
var matchCount = 0; var matchCount = 0;
var matchIndex = 0; var matchIndex = 0;
...@@ -1333,7 +1356,7 @@ Network.NetworkLogView = class extends UI.VBox { ...@@ -1333,7 +1356,7 @@ Network.NetworkLogView = class extends UI.VBox {
} }
/** /**
* @param {!Network.NetworkDataGridNode} node * @param {!Network.NetworkRequestNode} node
* @return {boolean} * @return {boolean}
*/ */
_applyFilter(node) { _applyFilter(node) {
...@@ -1536,7 +1559,7 @@ Network.NetworkLogView = class extends UI.VBox { ...@@ -1536,7 +1559,7 @@ Network.NetworkLogView = class extends UI.VBox {
} }
/** /**
* @param {!Network.NetworkDataGridNode} node * @param {!Network.NetworkRequestNode} node
*/ */
_highlightNode(node) { _highlightNode(node) {
UI.runCSSAnimationOnce(node.element(), 'highlighted-row'); UI.runCSSAnimationOnce(node.element(), 'highlighted-row');
......
...@@ -203,7 +203,7 @@ Network.NetworkLogViewColumns = class { ...@@ -203,7 +203,7 @@ Network.NetworkLogViewColumns = class {
} }
/** /**
* @param {?Network.NetworkDataGridNode} node * @param {?Network.NetworkNode} node
* @param {boolean} highlightInitiatorChain * @param {boolean} highlightInitiatorChain
*/ */
setHoveredNode(node, highlightInitiatorChain) { setHoveredNode(node, highlightInitiatorChain) {
...@@ -285,7 +285,7 @@ Network.NetworkLogViewColumns = class { ...@@ -285,7 +285,7 @@ Network.NetworkLogViewColumns = class {
this._waterfallColumnSortIcon.classList.add('sort-descending'); this._waterfallColumnSortIcon.classList.add('sort-descending');
this._waterfallRequestsAreStale = true; this._waterfallRequestsAreStale = true;
var sortFunction = Network.NetworkDataGridNode.RequestPropertyComparator.bind(null, this._activeWaterfallSortId); var sortFunction = Network.NetworkRequestNode.RequestPropertyComparator.bind(null, this._activeWaterfallSortId);
this._dataGrid.sortNodes(sortFunction, !this._dataGrid.isSortOrderAscending()); this._dataGrid.sortNodes(sortFunction, !this._dataGrid.isSortOrderAscending());
this._networkLogView.dataGridSorted(); this._networkLogView.dataGridSorted();
return; return;
...@@ -500,7 +500,7 @@ Network.NetworkLogViewColumns = class { ...@@ -500,7 +500,7 @@ Network.NetworkLogViewColumns = class {
isResponseHeader: true, isResponseHeader: true,
isCustomHeader: true, isCustomHeader: true,
visible: true, visible: true,
sortingFunction: Network.NetworkDataGridNode.ResponseHeaderStringComparator.bind(null, headerId) sortingFunction: Network.NetworkRequestNode.ResponseHeaderStringComparator.bind(null, headerId)
})); }));
this._columns.splice(index, 0, columnConfig); this._columns.splice(index, 0, columnConfig);
if (this._dataGrid) if (this._dataGrid)
...@@ -626,7 +626,7 @@ Network.NetworkLogViewColumns._initialSortColumn = 'waterfall'; ...@@ -626,7 +626,7 @@ Network.NetworkLogViewColumns._initialSortColumn = 'waterfall';
* sortable: boolean, * sortable: boolean,
* align: (?UI.DataGrid.Align|undefined), * align: (?UI.DataGrid.Align|undefined),
* isResponseHeader: boolean, * isResponseHeader: boolean,
* sortingFunction: (!function(!Network.NetworkDataGridNode, !Network.NetworkDataGridNode):number|undefined), * sortingFunction: (!function(!Network.NetworkRequestNode, !Network.NetworkRequestNode):number|undefined),
* isCustomHeader: boolean * isCustomHeader: boolean
* }} * }}
*/ */
...@@ -666,66 +666,66 @@ Network.NetworkLogViewColumns._defaultColumns = [ ...@@ -666,66 +666,66 @@ Network.NetworkLogViewColumns._defaultColumns = [
hideable: false, hideable: false,
nonSelectable: false, nonSelectable: false,
alwaysVisible: true, alwaysVisible: true,
sortingFunction: Network.NetworkDataGridNode.NameComparator sortingFunction: Network.NetworkRequestNode.NameComparator
}, },
{ {
id: 'method', id: 'method',
title: Common.UIString('Method'), title: Common.UIString('Method'),
sortingFunction: Network.NetworkDataGridNode.RequestPropertyComparator.bind(null, 'requestMethod') sortingFunction: Network.NetworkRequestNode.RequestPropertyComparator.bind(null, 'requestMethod')
}, },
{ {
id: 'status', id: 'status',
title: Common.UIString('Status'), title: Common.UIString('Status'),
visible: true, visible: true,
subtitle: Common.UIString('Text'), subtitle: Common.UIString('Text'),
sortingFunction: Network.NetworkDataGridNode.RequestPropertyComparator.bind(null, 'statusCode') sortingFunction: Network.NetworkRequestNode.RequestPropertyComparator.bind(null, 'statusCode')
}, },
{ {
id: 'protocol', id: 'protocol',
title: Common.UIString('Protocol'), title: Common.UIString('Protocol'),
sortingFunction: Network.NetworkDataGridNode.RequestPropertyComparator.bind(null, 'protocol') sortingFunction: Network.NetworkRequestNode.RequestPropertyComparator.bind(null, 'protocol')
}, },
{ {
id: 'scheme', id: 'scheme',
title: Common.UIString('Scheme'), title: Common.UIString('Scheme'),
sortingFunction: Network.NetworkDataGridNode.RequestPropertyComparator.bind(null, 'scheme') sortingFunction: Network.NetworkRequestNode.RequestPropertyComparator.bind(null, 'scheme')
}, },
{ {
id: 'domain', id: 'domain',
title: Common.UIString('Domain'), title: Common.UIString('Domain'),
sortingFunction: Network.NetworkDataGridNode.RequestPropertyComparator.bind(null, 'domain') sortingFunction: Network.NetworkRequestNode.RequestPropertyComparator.bind(null, 'domain')
}, },
{ {
id: 'remoteaddress', id: 'remoteaddress',
title: Common.UIString('Remote Address'), title: Common.UIString('Remote Address'),
weight: 10, weight: 10,
align: UI.DataGrid.Align.Right, align: UI.DataGrid.Align.Right,
sortingFunction: Network.NetworkDataGridNode.RemoteAddressComparator sortingFunction: Network.NetworkRequestNode.RemoteAddressComparator
}, },
{ {
id: 'type', id: 'type',
title: Common.UIString('Type'), title: Common.UIString('Type'),
visible: true, visible: true,
sortingFunction: Network.NetworkDataGridNode.TypeComparator sortingFunction: Network.NetworkRequestNode.TypeComparator
}, },
{ {
id: 'initiator', id: 'initiator',
title: Common.UIString('Initiator'), title: Common.UIString('Initiator'),
visible: true, visible: true,
weight: 10, weight: 10,
sortingFunction: Network.NetworkDataGridNode.InitiatorComparator sortingFunction: Network.NetworkRequestNode.InitiatorComparator
}, },
{ {
id: 'cookies', id: 'cookies',
title: Common.UIString('Cookies'), title: Common.UIString('Cookies'),
align: UI.DataGrid.Align.Right, align: UI.DataGrid.Align.Right,
sortingFunction: Network.NetworkDataGridNode.RequestCookiesCountComparator sortingFunction: Network.NetworkRequestNode.RequestCookiesCountComparator
}, },
{ {
id: 'setcookies', id: 'setcookies',
title: Common.UIString('Set Cookies'), title: Common.UIString('Set Cookies'),
align: UI.DataGrid.Align.Right, align: UI.DataGrid.Align.Right,
sortingFunction: Network.NetworkDataGridNode.ResponseCookiesCountComparator sortingFunction: Network.NetworkRequestNode.ResponseCookiesCountComparator
}, },
{ {
id: 'size', id: 'size',
...@@ -733,7 +733,7 @@ Network.NetworkLogViewColumns._defaultColumns = [ ...@@ -733,7 +733,7 @@ Network.NetworkLogViewColumns._defaultColumns = [
visible: true, visible: true,
subtitle: Common.UIString('Content'), subtitle: Common.UIString('Content'),
align: UI.DataGrid.Align.Right, align: UI.DataGrid.Align.Right,
sortingFunction: Network.NetworkDataGridNode.SizeComparator sortingFunction: Network.NetworkRequestNode.SizeComparator
}, },
{ {
id: 'time', id: 'time',
...@@ -741,72 +741,72 @@ Network.NetworkLogViewColumns._defaultColumns = [ ...@@ -741,72 +741,72 @@ Network.NetworkLogViewColumns._defaultColumns = [
visible: true, visible: true,
subtitle: Common.UIString('Latency'), subtitle: Common.UIString('Latency'),
align: UI.DataGrid.Align.Right, align: UI.DataGrid.Align.Right,
sortingFunction: Network.NetworkDataGridNode.RequestPropertyComparator.bind(null, 'duration') sortingFunction: Network.NetworkRequestNode.RequestPropertyComparator.bind(null, 'duration')
}, },
{ {
id: 'priority', id: 'priority',
title: Common.UIString('Priority'), title: Common.UIString('Priority'),
sortingFunction: Network.NetworkDataGridNode.InitialPriorityComparator sortingFunction: Network.NetworkRequestNode.InitialPriorityComparator
}, },
{ {
id: 'connectionid', id: 'connectionid',
title: Common.UIString('Connection ID'), title: Common.UIString('Connection ID'),
sortingFunction: Network.NetworkDataGridNode.RequestPropertyComparator.bind(null, 'connectionId') sortingFunction: Network.NetworkRequestNode.RequestPropertyComparator.bind(null, 'connectionId')
}, },
{ {
id: 'cache-control', id: 'cache-control',
isResponseHeader: true, isResponseHeader: true,
title: Common.UIString('Cache-Control'), title: Common.UIString('Cache-Control'),
sortingFunction: Network.NetworkDataGridNode.ResponseHeaderStringComparator.bind(null, 'cache-control') sortingFunction: Network.NetworkRequestNode.ResponseHeaderStringComparator.bind(null, 'cache-control')
}, },
{ {
id: 'connection', id: 'connection',
isResponseHeader: true, isResponseHeader: true,
title: Common.UIString('Connection'), title: Common.UIString('Connection'),
sortingFunction: Network.NetworkDataGridNode.ResponseHeaderStringComparator.bind(null, 'connection') sortingFunction: Network.NetworkRequestNode.ResponseHeaderStringComparator.bind(null, 'connection')
}, },
{ {
id: 'content-encoding', id: 'content-encoding',
isResponseHeader: true, isResponseHeader: true,
title: Common.UIString('Content-Encoding'), title: Common.UIString('Content-Encoding'),
sortingFunction: Network.NetworkDataGridNode.ResponseHeaderStringComparator.bind(null, 'content-encoding') sortingFunction: Network.NetworkRequestNode.ResponseHeaderStringComparator.bind(null, 'content-encoding')
}, },
{ {
id: 'content-length', id: 'content-length',
isResponseHeader: true, isResponseHeader: true,
title: Common.UIString('Content-Length'), title: Common.UIString('Content-Length'),
align: UI.DataGrid.Align.Right, align: UI.DataGrid.Align.Right,
sortingFunction: Network.NetworkDataGridNode.ResponseHeaderNumberComparator.bind(null, 'content-length') sortingFunction: Network.NetworkRequestNode.ResponseHeaderNumberComparator.bind(null, 'content-length')
}, },
{ {
id: 'etag', id: 'etag',
isResponseHeader: true, isResponseHeader: true,
title: Common.UIString('ETag'), title: Common.UIString('ETag'),
sortingFunction: Network.NetworkDataGridNode.ResponseHeaderStringComparator.bind(null, 'etag') sortingFunction: Network.NetworkRequestNode.ResponseHeaderStringComparator.bind(null, 'etag')
}, },
{ {
id: 'keep-alive', id: 'keep-alive',
isResponseHeader: true, isResponseHeader: true,
title: Common.UIString('Keep-Alive'), title: Common.UIString('Keep-Alive'),
sortingFunction: Network.NetworkDataGridNode.ResponseHeaderStringComparator.bind(null, 'keep-alive') sortingFunction: Network.NetworkRequestNode.ResponseHeaderStringComparator.bind(null, 'keep-alive')
}, },
{ {
id: 'last-modified', id: 'last-modified',
isResponseHeader: true, isResponseHeader: true,
title: Common.UIString('Last-Modified'), title: Common.UIString('Last-Modified'),
sortingFunction: Network.NetworkDataGridNode.ResponseHeaderDateComparator.bind(null, 'last-modified') sortingFunction: Network.NetworkRequestNode.ResponseHeaderDateComparator.bind(null, 'last-modified')
}, },
{ {
id: 'server', id: 'server',
isResponseHeader: true, isResponseHeader: true,
title: Common.UIString('Server'), title: Common.UIString('Server'),
sortingFunction: Network.NetworkDataGridNode.ResponseHeaderStringComparator.bind(null, 'server') sortingFunction: Network.NetworkRequestNode.ResponseHeaderStringComparator.bind(null, 'server')
}, },
{ {
id: 'vary', id: 'vary',
isResponseHeader: true, isResponseHeader: true,
title: Common.UIString('Vary'), title: Common.UIString('Vary'),
sortingFunction: Network.NetworkDataGridNode.ResponseHeaderStringComparator.bind(null, 'vary') sortingFunction: Network.NetworkRequestNode.ResponseHeaderStringComparator.bind(null, 'vary')
}, },
// This header is a placeholder to let datagrid know that it can be sorted by this column, but never shown. // This header is a placeholder to let datagrid know that it can be sorted by this column, but never shown.
{id: 'waterfall', title: '', visible: false, hideable: false} {id: 'waterfall', title: '', visible: false, hideable: false}
......
...@@ -34,10 +34,10 @@ Network.NetworkWaterfallColumn = class extends UI.VBox { ...@@ -34,10 +34,10 @@ Network.NetworkWaterfallColumn = class extends UI.VBox {
this._popoverHelper.initializeCallbacks(this._getPopoverAnchor.bind(this), this._showPopover.bind(this)); this._popoverHelper.initializeCallbacks(this._getPopoverAnchor.bind(this), this._showPopover.bind(this));
this._popoverHelper.setTimeout(300, 300); this._popoverHelper.setTimeout(300, 300);
/** @type {!Array<!Network.NetworkDataGridNode>} */ /** @type {!Array<!Network.NetworkNode>} */
this._nodes = []; this._nodes = [];
/** @type {?Network.NetworkDataGridNode} */ /** @type {?Network.NetworkNode} */
this._hoveredNode = null; this._hoveredNode = null;
/** @type {?SDK.NetworkRequest.InitiatorGraph} */ /** @type {?SDK.NetworkRequest.InitiatorGraph} */
this._initiatorGraph = null; this._initiatorGraph = null;
...@@ -83,12 +83,15 @@ Network.NetworkWaterfallColumn = class extends UI.VBox { ...@@ -83,12 +83,15 @@ Network.NetworkWaterfallColumn = class extends UI.VBox {
return; return;
var useTimingBars = !Common.moduleSetting('networkColorCodeResourceTypes').get() && !this._calculator.startAtZero; var useTimingBars = !Common.moduleSetting('networkColorCodeResourceTypes').get() && !this._calculator.startAtZero;
if (useTimingBars) { if (useTimingBars) {
var range = Network.RequestTimingView.calculateRequestTimeRanges(this._hoveredNode.request(), 0) var request = this._hoveredNode.request();
if (!request)
return;
var range = Network.RequestTimingView.calculateRequestTimeRanges(request, 0)
.find(data => data.name === Network.RequestTimeRangeNames.Total); .find(data => data.name === Network.RequestTimeRangeNames.Total);
var start = this._timeToPosition(range.start); var start = this._timeToPosition(range.start);
var end = this._timeToPosition(range.end); var end = this._timeToPosition(range.end);
} else { } else {
var range = this._getSimplifiedBarRange(this._hoveredNode, 0); var range = this._getSimplifiedBarRange(this.request(), 0);
var start = range.start; var start = range.start;
var end = range.end; var end = range.end;
} }
...@@ -124,18 +127,20 @@ Network.NetworkWaterfallColumn = class extends UI.VBox { ...@@ -124,18 +127,20 @@ Network.NetworkWaterfallColumn = class extends UI.VBox {
_showPopover(anchor, popover) { _showPopover(anchor, popover) {
if (!this._hoveredNode) if (!this._hoveredNode)
return; return;
var content = var request = this._hoveredNode.request();
Network.RequestTimingView.createTimingTable(this._hoveredNode.request(), this._calculator.minimumBoundary()); if (!request)
return;
var content = Network.RequestTimingView.createTimingTable(request, this._calculator.minimumBoundary());
popover.showForAnchor(content, anchor); popover.showForAnchor(content, anchor);
} }
/** /**
* @param {?Network.NetworkDataGridNode} node * @param {?Network.NetworkNode} node
* @param {boolean} highlightInitiatorChain * @param {boolean} highlightInitiatorChain
*/ */
setHoveredNode(node, highlightInitiatorChain) { setHoveredNode(node, highlightInitiatorChain) {
this._hoveredNode = node; this._hoveredNode = node;
this._initiatorGraph = (highlightInitiatorChain && node) ? node.request().initiatorGraph() : null; this._initiatorGraph = (highlightInitiatorChain && node && node.request()) ? node.request().initiatorGraph() : null;
this.update(); this.update();
} }
...@@ -171,7 +176,7 @@ Network.NetworkWaterfallColumn = class extends UI.VBox { ...@@ -171,7 +176,7 @@ Network.NetworkWaterfallColumn = class extends UI.VBox {
/** /**
* @param {number} x * @param {number} x
* @param {number} y * @param {number} y
* @return {?Network.NetworkDataGridNode} * @return {?Network.NetworkNode}
*/ */
getNodeFromPoint(x, y) { getNodeFromPoint(x, y) {
return this._nodes[Math.floor((this._scrollTop + y - this._headerHeight) / this._rowHeight)]; return this._nodes[Math.floor((this._scrollTop + y - this._headerHeight) / this._rowHeight)];
...@@ -186,7 +191,7 @@ Network.NetworkWaterfallColumn = class extends UI.VBox { ...@@ -186,7 +191,7 @@ Network.NetworkWaterfallColumn = class extends UI.VBox {
/** /**
* @param {number=} scrollTop * @param {number=} scrollTop
* @param {!Map<string, !Array<number>>=} eventDividers * @param {!Map<string, !Array<number>>=} eventDividers
* @param {!Array<!Network.NetworkDataGridNode>=} nodes * @param {!Array<!Network.NetworkNode>=} nodes
*/ */
update(scrollTop, eventDividers, nodes) { update(scrollTop, eventDividers, nodes) {
if (scrollTop !== undefined) if (scrollTop !== undefined)
...@@ -353,11 +358,11 @@ Network.NetworkWaterfallColumn = class extends UI.VBox { ...@@ -353,11 +358,11 @@ Network.NetworkWaterfallColumn = class extends UI.VBox {
} }
/** /**
* @param {!Network.NetworkDataGridNode} node * @param {!SDK.NetworkRequest} request
* @return {string} * @return {string}
*/ */
_borderColorForResourceType(node) { _borderColorForResourceType(request) {
var resourceType = node.request().resourceType(); var resourceType = request.resourceType();
if (this._borderColorsForResourceTypeCache.has(resourceType)) if (this._borderColorsForResourceTypeCache.has(resourceType))
return this._borderColorsForResourceTypeCache.get(resourceType); return this._borderColorsForResourceTypeCache.get(resourceType);
var colorsForResourceType = Network.NetworkWaterfallColumn._colorsForResourceType; var colorsForResourceType = Network.NetworkWaterfallColumn._colorsForResourceType;
...@@ -373,11 +378,10 @@ Network.NetworkWaterfallColumn = class extends UI.VBox { ...@@ -373,11 +378,10 @@ Network.NetworkWaterfallColumn = class extends UI.VBox {
/** /**
* @param {!CanvasRenderingContext2D} context * @param {!CanvasRenderingContext2D} context
* @param {!Network.NetworkDataGridNode} node * @param {!SDK.NetworkRequest} request
* @return {string|!CanvasGradient} * @return {string|!CanvasGradient}
*/ */
_colorForResourceType(context, node) { _colorForResourceType(context, request) {
var request = node.request();
var colorsForResourceType = Network.NetworkWaterfallColumn._colorsForResourceType; var colorsForResourceType = Network.NetworkWaterfallColumn._colorsForResourceType;
var resourceType = request.resourceType(); var resourceType = request.resourceType();
var color = colorsForResourceType[resourceType] || colorsForResourceType.Other; var color = colorsForResourceType[resourceType] || colorsForResourceType.Other;
...@@ -398,13 +402,13 @@ Network.NetworkWaterfallColumn = class extends UI.VBox { ...@@ -398,13 +402,13 @@ Network.NetworkWaterfallColumn = class extends UI.VBox {
} }
/** /**
* @param {!Network.NetworkDataGridNode} node * @param {!SDK.NetworkRequest} request
* @param {number} borderOffset * @param {number} borderOffset
* @return {!{start: number, mid: number, end: number}} * @return {!{start: number, mid: number, end: number}}
*/ */
_getSimplifiedBarRange(node, borderOffset) { _getSimplifiedBarRange(request, borderOffset) {
var drawWidth = this._offsetWidth - this._leftPadding; var drawWidth = this._offsetWidth - this._leftPadding;
var percentages = this._calculator.computeBarGraphPercentages(node.request()); var percentages = this._calculator.computeBarGraphPercentages(request);
return { return {
start: this._leftPadding + Math.floor((percentages.start / 100) * drawWidth) + borderOffset, start: this._leftPadding + Math.floor((percentages.start / 100) * drawWidth) + borderOffset,
mid: this._leftPadding + Math.floor((percentages.middle / 100) * drawWidth) + borderOffset, mid: this._leftPadding + Math.floor((percentages.middle / 100) * drawWidth) + borderOffset,
...@@ -414,21 +418,25 @@ Network.NetworkWaterfallColumn = class extends UI.VBox { ...@@ -414,21 +418,25 @@ Network.NetworkWaterfallColumn = class extends UI.VBox {
/** /**
* @param {!CanvasRenderingContext2D} context * @param {!CanvasRenderingContext2D} context
* @param {!Network.NetworkDataGridNode} node * @param {!Network.NetworkNode} node
* @param {number} y * @param {number} y
*/ */
_drawSimplifiedBars(context, node, y) { _drawSimplifiedBars(context, node, y) {
// TODO(allada) This should draw bars for groupped requests.
var request = node.request();
if (!request)
return;
const borderWidth = 1; const borderWidth = 1;
var borderOffset = borderWidth % 2 === 0 ? 0 : 0.5; var borderOffset = borderWidth % 2 === 0 ? 0 : 0.5;
context.save(); context.save();
var ranges = this._getSimplifiedBarRange(node, borderOffset); var ranges = this._getSimplifiedBarRange(request, borderOffset);
var height = this._getBarHeight(); var height = this._getBarHeight();
y += Math.floor(this._rowHeight / 2 - height / 2 + borderWidth) - borderWidth / 2; y += Math.floor(this._rowHeight / 2 - height / 2 + borderWidth) - borderWidth / 2;
context.translate(0, y); context.translate(0, y);
context.fillStyle = this._colorForResourceType(context, node); context.fillStyle = this._colorForResourceType(context, request);
context.strokeStyle = this._borderColorForResourceType(node); context.strokeStyle = this._borderColorForResourceType(request);
context.lineWidth = borderWidth; context.lineWidth = borderWidth;
context.beginPath(); context.beginPath();
...@@ -447,13 +455,13 @@ Network.NetworkWaterfallColumn = class extends UI.VBox { ...@@ -447,13 +455,13 @@ Network.NetworkWaterfallColumn = class extends UI.VBox {
/** @type {?{left: string, right: string, tooltip: (string|undefined)}} */ /** @type {?{left: string, right: string, tooltip: (string|undefined)}} */
var labels = null; var labels = null;
if (node === this._hoveredNode) { if (node === this._hoveredNode) {
labels = this._calculator.computeBarGraphLabels(node.request()); labels = this._calculator.computeBarGraphLabels(request);
this._drawSimplifiedBarDetails( this._drawSimplifiedBarDetails(
context, labels.left, labels.right, ranges.start, ranges.mid, ranges.mid + barWidth + borderOffset); context, labels.left, labels.right, ranges.start, ranges.mid, ranges.mid + barWidth + borderOffset);
} }
if (!this._calculator.startAtZero) { if (!this._calculator.startAtZero) {
var queueingRange = Network.RequestTimingView.calculateRequestTimeRanges(node.request(), 0) var queueingRange = Network.RequestTimingView.calculateRequestTimeRanges(request, 0)
.find(data => data.name === Network.RequestTimeRangeNames.Total); .find(data => data.name === Network.RequestTimeRangeNames.Total);
var leftLabelWidth = labels ? context.measureText(labels.left).width : 0; var leftLabelWidth = labels ? context.measureText(labels.left).width : 0;
var leftTextPlacedInBar = leftLabelWidth < ranges.mid - ranges.start; var leftTextPlacedInBar = leftLabelWidth < ranges.mid - ranges.start;
...@@ -529,12 +537,16 @@ Network.NetworkWaterfallColumn = class extends UI.VBox { ...@@ -529,12 +537,16 @@ Network.NetworkWaterfallColumn = class extends UI.VBox {
/** /**
* @param {!CanvasRenderingContext2D} context * @param {!CanvasRenderingContext2D} context
* @param {!Network.NetworkDataGridNode} node * @param {!Network.NetworkNode} node
* @param {number} y * @param {number} y
*/ */
_drawTimingBars(context, node, y) { _drawTimingBars(context, node, y) {
// TODO(allada) This should draw bars for groupped requests.
var request = node.request();
if (!request)
return;
context.save(); context.save();
var ranges = Network.RequestTimingView.calculateRequestTimeRanges(node.request(), 0); var ranges = Network.RequestTimingView.calculateRequestTimeRanges(request, 0);
for (var range of ranges) { for (var range of ranges) {
if (range.name === Network.RequestTimeRangeNames.Total || range.name === Network.RequestTimeRangeNames.Sending || if (range.name === Network.RequestTimeRangeNames.Total || range.name === Network.RequestTimeRangeNames.Sending ||
range.end - range.start === 0) range.end - range.start === 0)
...@@ -567,7 +579,7 @@ Network.NetworkWaterfallColumn = class extends UI.VBox { ...@@ -567,7 +579,7 @@ Network.NetworkWaterfallColumn = class extends UI.VBox {
/** /**
* @param {!CanvasRenderingContext2D} context * @param {!CanvasRenderingContext2D} context
* @param {!Network.NetworkDataGridNode} node * @param {!Network.NetworkNode} node
* @param {number} rowNumber * @param {number} rowNumber
* @param {number} y * @param {number} y
*/ */
...@@ -594,7 +606,7 @@ Network.NetworkWaterfallColumn = class extends UI.VBox { ...@@ -594,7 +606,7 @@ Network.NetworkWaterfallColumn = class extends UI.VBox {
var request = node.request(); var request = node.request();
if (this._hoveredNode === node) if (this._hoveredNode === node)
return this._rowHoverColor; return this._rowHoverColor;
if (this._initiatorGraph) { if (request && this._initiatorGraph) {
if (this._initiatorGraph.initiators.has(request)) if (this._initiatorGraph.initiators.has(request))
return this._parentInitiatorColor; return this._parentInitiatorColor;
if (this._initiatorGraph.initiated.has(request)) if (this._initiatorGraph.initiated.has(request))
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment