Chromium Code Reviews| Index: third_party/WebKit/Source/devtools/front_end/network/NetworkLogView.js |
| diff --git a/third_party/WebKit/Source/devtools/front_end/network/NetworkLogView.js b/third_party/WebKit/Source/devtools/front_end/network/NetworkLogView.js |
| index c15bedf79c1a9cf4b6ea1e9a97643c0d5dad44e5..864534646ad4263d0f53e0ab78b248d8f500c91e 100644 |
| --- a/third_party/WebKit/Source/devtools/front_end/network/NetworkLogView.js |
| +++ b/third_party/WebKit/Source/devtools/front_end/network/NetworkLogView.js |
| @@ -71,10 +71,10 @@ Network.NetworkLogView = class extends UI.VBox { |
| this._columns = new Network.NetworkLogViewColumns( |
| this, this._timeCalculator, this._durationCalculator, networkLogLargeRowsSetting); |
| - /** @type {!Map.<string, !Network.NetworkRequestNode>} */ |
| - this._nodesByRequestId = new Map(); |
| - /** @type {!Object.<string, boolean>} */ |
| - this._staleRequestIds = {}; |
| + /** @type {!Set<!SDK.NetworkRequest>} */ |
| + this._staleRequests = new Set(); |
| + /** @type {!Set<!SDK.NetworkRequest>} */ |
| + this._nodesToRemove = new Set(); |
| /** @type {number} */ |
| this._mainRequestLoadTime = -1; |
| /** @type {number} */ |
| @@ -114,12 +114,10 @@ Network.NetworkLogView = class extends UI.VBox { |
| .addChangeListener(this._invalidateAllItems.bind(this, false), this); |
| SDK.targetManager.observeModels(SDK.NetworkManager, this); |
| - SDK.targetManager.addModelListener( |
| - SDK.NetworkManager, SDK.NetworkManager.Events.RequestStarted, this._onRequestStarted, this); |
| - SDK.targetManager.addModelListener( |
| - SDK.NetworkManager, SDK.NetworkManager.Events.RequestUpdated, this._onRequestUpdated, this); |
| - SDK.targetManager.addModelListener( |
| - SDK.NetworkManager, SDK.NetworkManager.Events.RequestFinished, this._onRequestUpdated, this); |
| + NetworkLog.networkLog.addEventListener(NetworkLog.NetworkLog.Events.RequestAdded, this._onRequestUpdated, this); |
| + NetworkLog.networkLog.addEventListener(NetworkLog.NetworkLog.Events.RequestUpdated, this._onRequestUpdated, this); |
| + NetworkLog.networkLog.addEventListener(NetworkLog.NetworkLog.Events.Reset, this._reset, this); |
| + NetworkLog.networkLog.addEventListener(NetworkLog.NetworkLog.Events.RequestsRemoved, this._onRequestsRemoved, this); |
| this._updateGroupByFrame(); |
| Common.moduleSetting('network.group-by-frame').addChangeListener(() => this._updateGroupByFrame()); |
| @@ -365,8 +363,6 @@ Network.NetworkLogView = class extends UI.VBox { |
| _setGrouping(groupKey) { |
| var groupLookup = groupKey ? this._groupLookups.get(groupKey) || null : null; |
| this._activeGroupLookup = groupLookup; |
| - if (groupLookup) |
| - groupLookup.reset(); |
| this._invalidateAllItems(); |
| } |
| @@ -379,7 +375,7 @@ Network.NetworkLogView = class extends UI.VBox { |
| * @return {?Network.NetworkRequestNode} |
| */ |
| nodeForRequest(request) { |
| - return this._nodesByRequestId.get(request.requestId()); |
| + return request[Network.NetworkLogView._networkNodeSymbol] || null; |
| } |
| /** |
| @@ -402,17 +398,15 @@ Network.NetworkLogView = class extends UI.VBox { |
| * @param {!SDK.NetworkManager} networkManager |
| */ |
| modelAdded(networkManager) { |
| - if (!networkManager.target().parentTarget()) { |
| - var resourceTreeModel = networkManager.target().model(SDK.ResourceTreeModel); |
| - if (resourceTreeModel) { |
| - resourceTreeModel.addEventListener( |
| - SDK.ResourceTreeModel.Events.MainFrameNavigated, this._mainFrameNavigated, this); |
| - resourceTreeModel.addEventListener(SDK.ResourceTreeModel.Events.Load, this._loadEventFired, this); |
| - resourceTreeModel.addEventListener( |
| - SDK.ResourceTreeModel.Events.DOMContentLoaded, this._domContentLoadedEventFired, this); |
| - } |
| + // TODO(allada) Remove dependency on networkManager and instead use NetworkLog and PageLoad for needed data. |
| + if (networkManager.target().parentTarget()) |
| + return; |
| + var resourceTreeModel = networkManager.target().model(SDK.ResourceTreeModel); |
| + if (resourceTreeModel) { |
| + resourceTreeModel.addEventListener(SDK.ResourceTreeModel.Events.Load, this._loadEventFired, this); |
| + resourceTreeModel.addEventListener( |
| + SDK.ResourceTreeModel.Events.DOMContentLoaded, this._domContentLoadedEventFired, this); |
| } |
| - NetworkLog.networkLog.requestsForManager(networkManager).forEach(this._appendRequest.bind(this)); |
| } |
| /** |
| @@ -423,8 +417,6 @@ Network.NetworkLogView = class extends UI.VBox { |
| if (!networkManager.target().parentTarget()) { |
| var resourceTreeModel = networkManager.target().model(SDK.ResourceTreeModel); |
| if (resourceTreeModel) { |
| - resourceTreeModel.removeEventListener( |
| - SDK.ResourceTreeModel.Events.MainFrameNavigated, this._mainFrameNavigated, this); |
| resourceTreeModel.removeEventListener(SDK.ResourceTreeModel.Events.Load, this._loadEventFired, this); |
| resourceTreeModel.removeEventListener( |
| SDK.ResourceTreeModel.Events.DOMContentLoaded, this._domContentLoadedEventFired, this); |
| @@ -520,7 +512,7 @@ Network.NetworkLogView = class extends UI.VBox { |
| UI.formatLocalized('Perform a request or hit %s to record the reload.', [reloadShortcutNode])); |
| } else { |
| var recordNode = hintText.createChild('b'); |
| - recordNode.textContent = UI.shortcutRegistry.shortcutTitleForAction('network.toggle-recording'); |
| + recordNode.textContent = UI.shortcutRegistry.shortcutTitleForAction('network_log.toggle-recording'); |
|
dgozman
2017/06/14 22:21:47
This does not work.
allada
2017/06/15 00:19:48
Done.
|
| hintText.appendChild(UI.formatLocalized( |
| 'Record (%s) or reload (%s) to display network activity.', [recordNode, reloadShortcutNode])); |
| } |
| @@ -600,26 +592,24 @@ Network.NetworkLogView = class extends UI.VBox { |
| } |
| _updateSummaryBar() { |
| - var requestsNumber = this._nodesByRequestId.size; |
| - |
| - if (!requestsNumber) { |
| - this._showRecordingHint(); |
| - return; |
| - } |
| this._hideRecordingHint(); |
| var transferSize = 0; |
| - var selectedRequestsNumber = 0; |
| + var selectedNodeNumber = 0; |
| var selectedTransferSize = 0; |
| var baseTime = -1; |
| var maxTime = -1; |
| - var nodes = this._nodesByRequestId.valuesArray(); |
| - for (var i = 0; i < nodes.length; ++i) { |
| - var request = nodes[i].request(); |
| + |
| + var nodeCount = 0; |
| + for (var request of NetworkLog.networkLog.requests()) { |
| + var node = request[Network.NetworkLogView._networkNodeSymbol]; |
| + if (!node) |
| + continue; |
| + nodeCount++; |
| var requestTransferSize = request.transferSize; |
| transferSize += requestTransferSize; |
| - if (!nodes[i][Network.NetworkLogView._isFilteredOutSymbol]) { |
| - selectedRequestsNumber++; |
| + if (!node[Network.NetworkLogView._isFilteredOutSymbol]) { |
| + selectedNodeNumber++; |
| selectedTransferSize += requestTransferSize; |
| } |
| if (request.url() === request.networkManager().target().inspectedURL() && |
| @@ -629,6 +619,11 @@ Network.NetworkLogView = class extends UI.VBox { |
| maxTime = request.endTime; |
| } |
| + if (!nodeCount) { |
| + this._showRecordingHint(); |
| + return; |
| + } |
| + |
| var summaryBar = this._summaryBarElement; |
| summaryBar.removeChildren(); |
| var separator = '\u2002\u2758\u2002'; |
| @@ -644,13 +639,13 @@ Network.NetworkLogView = class extends UI.VBox { |
| return span; |
| } |
| - if (selectedRequestsNumber !== requestsNumber) { |
| - appendChunk(Common.UIString('%d / %d requests', selectedRequestsNumber, requestsNumber)); |
| + if (selectedNodeNumber !== nodeCount) { |
| + appendChunk(Common.UIString('%d / %d requests', selectedNodeNumber, nodeCount)); |
| appendChunk(separator); |
| appendChunk(Common.UIString( |
| '%s / %s transferred', Number.bytesToString(selectedTransferSize), Number.bytesToString(transferSize))); |
| } else { |
| - appendChunk(Common.UIString('%d requests', requestsNumber)); |
| + appendChunk(Common.UIString('%d requests', nodeCount)); |
| appendChunk(separator); |
| appendChunk(Common.UIString('%s transferred', Number.bytesToString(transferSize))); |
| } |
| @@ -709,9 +704,7 @@ Network.NetworkLogView = class extends UI.VBox { |
| * @param {boolean=} deferUpdate |
| */ |
| _invalidateAllItems(deferUpdate) { |
| - var requestIds = this._nodesByRequestId.keysArray(); |
| - for (var i = 0; i < requestIds.length; ++i) |
| - this._staleRequestIds[requestIds[i]] = true; |
| + this._staleRequests = new Set(NetworkLog.networkLog.requests()); |
| if (deferUpdate) |
| this.scheduleRefresh(); |
| else |
| @@ -832,10 +825,29 @@ Network.NetworkLogView = class extends UI.VBox { |
| var nodesToInsert = new Map(); |
| /** @type {!Array<!Network.NetworkNode>} */ |
| var nodesToRefresh = []; |
| - for (var requestId in this._staleRequestIds) { |
| - var node = this._nodesByRequestId.get(requestId); |
| + |
| + /** @type {!Set<!Network.NetworkRequestNode>} */ |
| + var staleNodes = new Set(); |
| + |
| + for (var node of this._nodesToRemove) { |
| + if (node.parent) |
| + node.parent.removeChild(node); |
| + } |
| + |
| + this._nodesToRemove.clear(); |
| + |
| + // While creating nodes it may add more entries into _staleRequests because redirect request nodes update the parent |
| + // node so we loop until we have no more stale requests. |
| + while (this._staleRequests.size) { |
| + var request = this._staleRequests.firstValue(); |
| + this._staleRequests.delete(request); |
| + var node = request[Network.NetworkLogView._networkNodeSymbol]; |
| if (!node) |
| - continue; |
| + node = this._createNodeForRequest(request); |
| + staleNodes.add(node); |
| + } |
| + |
| + for (var node of staleNodes) { |
| var isFilteredOut = !this._applyFilter(node); |
| if (isFilteredOut && node === this._hoveredNode) |
| this._setHoveredNode(null); |
| @@ -884,13 +896,16 @@ Network.NetworkLogView = class extends UI.VBox { |
| this._highlightNthMatchedRequestForSearch( |
| this._updateMatchCountAndFindMatchIndex(this._currentMatchedRequestNode), false); |
| - this._staleRequestIds = {}; |
| this._updateSummaryBar(); |
| if (nodesToInsert.size) |
| this._columns.sortByCurrentColumn(); |
| this._dataGrid.updateInstantly(); |
| + this._didRefreshForTest(); |
| + } |
| + |
| + _didRefreshForTest() { |
| } |
| /** |
| @@ -907,7 +922,7 @@ Network.NetworkLogView = class extends UI.VBox { |
| return groupNode; |
| } |
| - reset() { |
| + _reset() { |
| this._requestWithHighlightedInitiators = null; |
| this.dispatchEventToListeners(Network.NetworkLogView.Events.RequestSelected, null); |
| @@ -923,10 +938,7 @@ Network.NetworkLogView = class extends UI.VBox { |
| this.linkifier.reset(); |
| this.badgePool.reset(); |
| - if (this._activeGroupLookup) |
| - this._activeGroupLookup.reset(); |
| - this._nodesByRequestId.clear(); |
| - this._staleRequestIds = {}; |
| + this._staleRequests.clear(); |
| this._resetSuggestionBuilder(); |
| this._mainRequestLoadTime = -1; |
| @@ -947,38 +959,46 @@ Network.NetworkLogView = class extends UI.VBox { |
| this._resourceCategoryFilterUI.reset(); |
| } |
| - /** |
| - * @param {!Common.Event} event |
| - */ |
| - _onRequestStarted(event) { |
| - if (!this._recording) |
| - return; |
| - var request = /** @type {!SDK.NetworkRequest} */ (event.data); |
| - this._appendRequest(request); |
| - } |
| - |
| /** |
| * @param {!SDK.NetworkRequest} request |
| */ |
| - _appendRequest(request) { |
| + _createNodeForRequest(request) { |
| var node = new Network.NetworkRequestNode(this, request); |
| + request[Network.NetworkLogView._networkNodeSymbol] = node; |
| node[Network.NetworkLogView._isFilteredOutSymbol] = true; |
|
dgozman
2017/06/14 22:21:47
Why filtered by default?
allada
2017/06/15 00:19:48
This is what it was doing, I did not change the lo
|
| node[Network.NetworkLogView._isMatchingSearchQuerySymbol] = false; |
| - // In case of redirect request id is reassigned to a redirected |
| - // request and we need to update _nodesByRequestId and search results. |
| - var originalRequestNode = this._nodesByRequestId.get(request.requestId()); |
| - if (originalRequestNode) |
| - this._nodesByRequestId.set(originalRequestNode.request().requestId(), originalRequestNode); |
| - this._nodesByRequestId.set(request.requestId(), node); |
| - |
| - // Pull all the redirects of the main request upon commit load. |
| - if (request.redirects) { |
| - for (var i = 0; i < request.redirects.length; ++i) |
| - this._refreshRequest(request.redirects[i]); |
| + if (request.redirects) |
| + request.redirects.forEach(this._refreshRequest.bind(this)); |
| + return node; |
| + } |
| + |
| + /** |
| + * @param {!Common.Event} event |
| + */ |
| + _onRequestsRemoved(event) { |
|
dgozman
2017/06/14 22:21:47
As discussed offline, let's recreate everything in
allada
2017/06/15 00:19:48
Done.
|
| + var requests = /** @type {!Set<!SDK.NetworkRequest>} */ (event.data); |
| + var rootNode = this._dataGrid.rootNode(); |
| + for (var request of requests) { |
| + var node = request[Network.NetworkLogView._networkNodeSymbol]; |
| + while (node && node.parent) { |
| + var parent = node.parent; |
| + this._nodesToRemove.add(node); |
| + if (parent === rootNode || !parent.children.every(child => this._nodesToRemove.has(child))) |
|
dgozman
2017/06/14 22:21:47
I think this is still O(n^2).
allada
2017/06/15 00:19:48
Acknowledged.
|
| + break; |
| + node = parent; |
| + } |
| + this._staleRequests.delete(request); |
| + delete request[Network.NetworkLogView._networkNodeSymbol]; |
| } |
| - this._refreshRequest(request); |
| + // TODO(allada) We need to unify these calculators with NetworkOverview. |
| + this._calculator.reset(); |
| + this._durationCalculator.reset(); |
| + for (var request of NetworkLog.networkLog.requests()) { |
| + this._timeCalculator.updateBoundaries(request); |
| + this._durationCalculator.updateBoundaries(request); |
| + } |
| } |
| /** |
| @@ -993,9 +1013,6 @@ Network.NetworkLogView = class extends UI.VBox { |
| * @param {!SDK.NetworkRequest} request |
| */ |
| _refreshRequest(request) { |
| - if (!this._nodesByRequestId.get(request.requestId())) |
| - return; |
| - |
| Network.NetworkLogView._subdomains(request.domain) |
| .forEach( |
| this._suggestionBuilder.addItem.bind(this._suggestionBuilder, Network.NetworkLogView.FilterType.Domain)); |
| @@ -1037,46 +1054,10 @@ Network.NetworkLogView = class extends UI.VBox { |
| this._suggestionBuilder.addItem(Network.NetworkLogView.FilterType.SetCookieValue, cookie.value()); |
| } |
| - this._staleRequestIds[request.requestId()] = true; |
| - this.dispatchEventToListeners(Network.NetworkLogView.Events.UpdateRequest, request); |
| + this._staleRequests.add(request); |
| this.scheduleRefresh(); |
| } |
| - /** |
| - * @param {!Common.Event} event |
| - */ |
| - _mainFrameNavigated(event) { |
| - if (!this._recording) |
| - return; |
| - |
| - var frame = /** @type {!SDK.ResourceTreeFrame} */ (event.data); |
| - var loaderId = frame.loaderId; |
| - |
| - // Pick provisional load requests. |
| - var requestsToPick = []; |
| - var networkManager = frame.resourceTreeModel().target().model(SDK.NetworkManager); |
| - var requests = networkManager ? NetworkLog.networkLog.requestsForManager(networkManager) : []; |
| - for (var i = 0; i < requests.length; ++i) { |
| - var request = requests[i]; |
| - if (request.loaderId === loaderId) |
| - requestsToPick.push(request); |
| - } |
| - |
| - if (!Common.moduleSetting('network.preserve-log').get()) { |
| - this.reset(); |
| - for (var i = 0; i < requestsToPick.length; ++i) |
| - this._appendRequest(requestsToPick[i]); |
| - } |
| - for (var i = 0; i < requestsToPick.length; ++i) { |
| - var request = requestsToPick[i]; |
| - var node = this._nodesByRequestId.get(request.requestId()); |
| - if (node) { |
| - node.markAsNavigationRequest(); |
| - break; |
| - } |
| - } |
| - } |
| - |
| /** |
| * @return {number} |
| */ |
| @@ -1185,10 +1166,7 @@ Network.NetworkLogView = class extends UI.VBox { |
| } |
| _harRequests() { |
| - var requests = this._nodesByRequestId.valuesArray().map(function(node) { |
| - return node.request(); |
| - }); |
| - var httpRequests = requests.filter(Network.NetworkLogView.HTTPRequestsFilter); |
| + var httpRequests = NetworkLog.networkLog.requests().filter(Network.NetworkLogView.HTTPRequestsFilter); |
| return httpRequests.filter(Network.NetworkLogView.FinishedRequestsFilter); |
| } |
| @@ -1238,7 +1216,7 @@ Network.NetworkLogView = class extends UI.VBox { |
| * @param {string} platform |
| */ |
| _copyAllCurlCommand(platform) { |
| - var requests = this._nodesByRequestId.valuesArray().map(node => node.request()); |
| + var requests = NetworkLog.networkLog.requests(); |
| var commands = []; |
| for (var request of requests) |
| commands.push(this._generateCurlCommand(request, platform)); |
| @@ -1606,7 +1584,7 @@ Network.NetworkLogView = class extends UI.VBox { |
| revealAndHighlightRequest(request) { |
| this.removeAllNodeHighlights(); |
| - var node = this._nodesByRequestId.get(request.requestId()); |
| + var node = request[Network.NetworkLogView._networkNodeSymbol]; |
| if (node) { |
| node.reveal(); |
| this._highlightNode(node); |
| @@ -1757,6 +1735,7 @@ Network.NetworkLogView = class extends UI.VBox { |
| Network.NetworkLogView._isFilteredOutSymbol = Symbol('isFilteredOut'); |
| Network.NetworkLogView._isMatchingSearchQuerySymbol = Symbol('isMatchingSearchQuery'); |
| +Network.NetworkLogView._networkNodeSymbol = Symbol('NetworkNode'); |
| Network.NetworkLogView.HTTPSchemas = { |
| 'http': true, |
| @@ -1769,8 +1748,7 @@ Network.NetworkLogView.HTTPSchemas = { |
| Network.NetworkLogView.Events = { |
| RequestSelected: Symbol('RequestSelected'), |
| SearchCountUpdated: Symbol('SearchCountUpdated'), |
| - SearchIndexUpdated: Symbol('SearchIndexUpdated'), |
| - UpdateRequest: Symbol('UpdateRequest') |
| + SearchIndexUpdated: Symbol('SearchIndexUpdated') |
| }; |
| /** @enum {string} */ |
| @@ -1821,7 +1799,5 @@ Network.GroupLookupInterface.prototype = { |
| * @param {!SDK.NetworkRequest} request |
| * @return {?Network.NetworkGroupNode} |
| */ |
| - groupNodeForRequest: function(request) {}, |
| - |
| - reset: function() {} |
| + groupNodeForRequest: function(request) {} |
| }; |