Chromium Code Reviews| Index: third_party/WebKit/Source/devtools/front_end/network_log/NetworkLog.js |
| diff --git a/third_party/WebKit/Source/devtools/front_end/network_log/NetworkLog.js b/third_party/WebKit/Source/devtools/front_end/network_log/NetworkLog.js |
| index 638f68d2d3cdf26fb202cb5a95c8589d33023537..859358836e4d1551eec27efce46f532477244b8f 100644 |
| --- a/third_party/WebKit/Source/devtools/front_end/network_log/NetworkLog.js |
| +++ b/third_party/WebKit/Source/devtools/front_end/network_log/NetworkLog.js |
| @@ -31,14 +31,18 @@ |
| /** |
| * @implements {SDK.SDKModelObserver<!SDK.NetworkManager>} |
| */ |
| -NetworkLog.NetworkLog = class { |
| +NetworkLog.NetworkLog = class extends Common.Object { |
| constructor() { |
| + super(); |
| /** @type {!Array<!SDK.NetworkRequest>} */ |
| this._requests = []; |
| + /** @type {!Set<!SDK.NetworkRequest>} */ |
| + this._requestsSet = new Set(); |
| /** @type {!Map<!SDK.NetworkManager, !Map<string, !SDK.NetworkRequest>>} */ |
| this._requestsByManagerAndId = new Map(); |
| /** @type {!Map<!SDK.NetworkManager, !NetworkLog.PageLoad>} */ |
| this._currentPageLoad = new Map(); |
| + this._isRecording = true; |
| SDK.targetManager.observeModels(SDK.NetworkManager, this); |
| } |
| @@ -50,11 +54,17 @@ NetworkLog.NetworkLog = class { |
| var eventListeners = []; |
| eventListeners.push( |
| networkManager.addEventListener(SDK.NetworkManager.Events.RequestStarted, this._onRequestStarted, this)); |
| + eventListeners.push( |
| + networkManager.addEventListener(SDK.NetworkManager.Events.RequestUpdated, this._onRequestUpdated, this)); |
| eventListeners.push( |
| networkManager.addEventListener(SDK.NetworkManager.Events.RequestRedirected, this._onRequestRedirect, this)); |
| + eventListeners.push( |
| + networkManager.addEventListener(SDK.NetworkManager.Events.RequestFinished, this._onRequestUpdated, this)); |
| var resourceTreeModel = networkManager.target().model(SDK.ResourceTreeModel); |
| if (resourceTreeModel) { |
| + eventListeners.push( |
| + resourceTreeModel.addEventListener(SDK.ResourceTreeModel.Events.WillReloadPage, this._willReloadPage, this)); |
| eventListeners.push(resourceTreeModel.addEventListener( |
| SDK.ResourceTreeModel.Events.MainFrameNavigated, this._onMainFrameNavigated, this)); |
| eventListeners.push(resourceTreeModel.addEventListener(SDK.ResourceTreeModel.Events.Load, this._onLoad, this)); |
| @@ -72,15 +82,41 @@ NetworkLog.NetworkLog = class { |
| */ |
| modelRemoved(networkManager) { |
| this._requestsByManagerAndId.delete(networkManager); |
| + this._removeNetworkManagerListeners(networkManager); |
| + } |
| + |
| + /** |
| + * @param {!SDK.NetworkManager} networkManager |
| + */ |
| + _removeNetworkManagerListeners(networkManager) { |
| Common.EventTarget.removeEventListeners(networkManager[NetworkLog.NetworkLog._events]); |
| } |
| + /** |
| + * @param {boolean} enabled |
| + */ |
| + setIsRecording(enabled) { |
| + if (this._isRecording === enabled) |
| + return; |
| + this._isRecording = enabled; |
| + if (enabled) { |
| + SDK.targetManager.observeModels(SDK.NetworkManager, this); |
| + } else { |
| + SDK.targetManager.unobserveModels(SDK.NetworkManager, this); |
| + SDK.targetManager.models(SDK.NetworkManager).forEach(this._removeNetworkManagerListeners.bind(this)); |
| + } |
| + } |
| + |
| /** |
| * @param {string} url |
| * @return {?SDK.NetworkRequest} |
| */ |
| requestForURL(url) { |
| - return this._requests.find(request => request.url() === url) || null; |
|
dgozman
2017/06/15 20:24:10
It was pretty good before :)
allada
2017/06/17 00:04:13
Ooops I think this was because I was debugging it.
|
| + for (var request of this._requests) { |
| + if (request.url() === url) |
| + return request; |
| + } |
| + return null; |
| } |
| /** |
| @@ -233,7 +269,12 @@ NetworkLog.NetworkLog = class { |
| * @return {?NetworkLog.PageLoad} |
| */ |
| pageLoadForRequest(request) { |
| - return request[NetworkLog.NetworkLog._pageLoadForRequestSymbol]; |
| + return request[NetworkLog.NetworkLog._pageLoadForRequestSymbol] || null; |
| + } |
| + |
| + _willReloadPage() { |
| + if (!Common.moduleSetting('network_log.preserve-log').get()) |
| + this.reset(); |
| } |
| /** |
| @@ -245,36 +286,84 @@ NetworkLog.NetworkLog = class { |
| if (!networkManager) |
| return; |
| - this._currentPageLoad.delete(networkManager); |
| - var oldRequests = this.requestsForManager(networkManager); |
| - this._requests = this._requests.filter(request => request.networkManager() !== networkManager); |
| + var oldManagerRequests = this.requestsForManager(networkManager); |
| + var oldRequests = this._requests; |
| + this._requests = []; |
| + this._requestsSet = new Set(); |
| var idMap = new Map(); |
| + // TODO(allada) This should be removed in a future patch, but if somewhere else does a request on this in a reset |
| + // event it may cause problems. |
| this._requestsByManagerAndId.set(networkManager, idMap); |
| + this.dispatchEventToListeners(NetworkLog.NetworkLog.Events.Reset); |
| // Preserve requests from the new session. |
| var currentPageLoad = null; |
| - for (var i = 0; i < oldRequests.length; ++i) { |
| - var request = oldRequests[i]; |
| - if (request.loaderId === mainFrame.loaderId) { |
| - if (!currentPageLoad) |
| - currentPageLoad = new NetworkLog.PageLoad(request); |
| - this._requests.push(request); |
| + for (var i = 0; i < oldManagerRequests.length; ++i) { |
| + var request = oldManagerRequests[i]; |
| + if (request.loaderId !== mainFrame.loaderId) |
| + continue; |
| + if (!currentPageLoad) { |
| + currentPageLoad = new NetworkLog.PageLoad(request); |
| + if (request.redirects) { |
| + for (var redirectRequest of request.redirects) { |
| + idMap.set(request.requestId(), request); |
| + request[NetworkLog.NetworkLog._pageLoadForRequestSymbol] = currentPageLoad; |
|
dgozman
2017/06/15 20:24:09
request -> redirectRequest?
allada
2017/06/17 00:04:13
Done.
|
| + this._addRequest(redirectRequest, idMap, currentPageLoad); |
|
dgozman
2017/06/15 20:24:10
Looks like this call does handle the page load and
allada
2017/06/17 00:04:13
Done.
|
| + } |
| + } |
| + // When navigation requests happen we recompute the map and associated PageLoad which can change. We however do |
| + // not always recompute the request array, so we always set the map and PageLoad but not always add the request |
| + // since it may already exist in the list. |
| idMap.set(request.requestId(), request); |
| request[NetworkLog.NetworkLog._pageLoadForRequestSymbol] = currentPageLoad; |
| } |
| + |
| + this._addRequest(request, idMap, currentPageLoad); |
| + } |
| + |
| + if (Common.moduleSetting('network_log.preserve-log').get()) { |
| + for (var request of oldRequests) |
| + this._addRequest(request); |
| } |
| + |
| if (currentPageLoad) |
| this._currentPageLoad.set(networkManager, currentPageLoad); |
| } |
| + /** |
| + * @param {!SDK.NetworkRequest} request |
| + * @param {!Map<string, !SDK.NetworkRequest>=} requestIdMap |
|
dgozman
2017/06/15 20:24:10
remove =
allada
2017/06/17 00:04:13
I need it to not update the map or pageload if the
dgozman
2017/06/17 00:12:56
Let's inline _addRequest everywhere.
|
| + * @param {!NetworkLog.PageLoad=} pageLoad |
|
dgozman
2017/06/15 20:24:10
?NetworkLog.PageLoad
allada
2017/06/17 00:04:14
ditto.
|
| + */ |
| + _addRequest(request, requestIdMap, pageLoad) { |
| + if (this._requestsSet.has(request)) |
|
dgozman
2017/06/15 20:24:09
How could this happen?
allada
2017/06/17 00:04:13
If preserve log is on it may try to add the naviga
|
| + return; |
| + this._requests.push(request); |
| + this._requestsSet.add(request); |
| + if (requestIdMap) |
| + requestIdMap.set(request.requestId(), request); |
| + if (pageLoad) |
| + request[NetworkLog.NetworkLog._pageLoadForRequestSymbol] = pageLoad; |
| + this.dispatchEventToListeners(NetworkLog.NetworkLog.Events.RequestAdded, request); |
| + } |
| + |
| /** |
| * @param {!Common.Event} event |
| */ |
| _onRequestStarted(event) { |
| var request = /** @type {!SDK.NetworkRequest} */ (event.data); |
| - this._requests.push(request); |
| - this._requestsByManagerAndId.get(request.networkManager()).set(request.requestId(), request); |
| - request[NetworkLog.NetworkLog._pageLoadForRequestSymbol] = this._currentPageLoad.get(request.networkManager()); |
| + var idMap = this._requestsByManagerAndId.get(request.networkManager()); |
| + this._addRequest(request, idMap, this._currentPageLoad.get(request.networkManager()) || null); |
| + } |
| + |
| + /** |
| + * @param {!Common.Event} event |
| + */ |
| + _onRequestUpdated(event) { |
| + var request = /** @type {!SDK.NetworkRequest} */ (event.data); |
| + if (!this._requestsSet.has(request)) |
| + return; |
| + this.dispatchEventToListeners(NetworkLog.NetworkLog.Events.RequestUpdated, request); |
| } |
| /** |
| @@ -315,6 +404,19 @@ NetworkLog.NetworkLog = class { |
| var map = this._requestsByManagerAndId.get(networkManager); |
| return map ? (map.get(requestId) || null) : null; |
| } |
| + |
| + reset() { |
| + this._requests = []; |
| + this._requestsSet.clear(); |
| + this._requestsByManagerAndId.forEach(map => map.clear()); |
| + var networkManagers = new Set(SDK.targetManager.models(SDK.NetworkManager)); |
| + for (var networkManager of this._currentPageLoad.keys()) { |
| + if (!networkManagers.has(networkManager)) |
| + this._currentPageLoad.delete(networkManager); |
| + } |
| + |
| + this.dispatchEventToListeners(NetworkLog.NetworkLog.Events.Reset); |
| + } |
| }; |
| NetworkLog.PageLoad = class { |
| @@ -329,6 +431,7 @@ NetworkLog.PageLoad = class { |
| this.loadTime; |
| /** @type {number} */ |
| this.contentLoadTime; |
| + this.mainRequest = mainRequest; |
| } |
| }; |
| @@ -337,6 +440,12 @@ NetworkLog.PageLoad._lastIdentifier = 0; |
| /** @typedef {!{initiators: !Set<!SDK.NetworkRequest>, initiated: !Set<!SDK.NetworkRequest>}} */ |
| NetworkLog.NetworkLog.InitiatorGraph; |
| +NetworkLog.NetworkLog.Events = { |
| + Reset: Symbol('Reset'), |
| + RequestAdded: Symbol('RequestAdded'), |
| + RequestUpdated: Symbol('RequestUpdated') |
| +}; |
| + |
| /** @typedef {!{type: !SDK.NetworkRequest.InitiatorType, url: string, lineNumber: number, columnNumber: number, scriptId: ?string}} */ |
| NetworkLog.NetworkLog._InitiatorInfo; |