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..81fe604e9d292118640c7704df2ad97c0fe59f95 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; |
+ for (var request of this._requests) { |
+ if (request.url() === url) |
+ return request; |
+ } |
+ return null; |
} |
/** |
@@ -236,6 +272,11 @@ NetworkLog.NetworkLog = class { |
return request[NetworkLog.NetworkLog._pageLoadForRequestSymbol]; |
} |
+ _willReloadPage() { |
+ if (!Common.moduleSetting('network_log.preserve-log').get()) |
+ this.reset(); |
+ } |
+ |
/** |
* @param {!Common.Event} event |
*/ |
@@ -245,9 +286,13 @@ 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 removedRequests = new Set(); |
+ if (!Common.moduleSetting('network_log.preserve-log').get()) { |
+ removedRequests = new Set(this._requests.filter(request => request.networkManager() === networkManager)); |
+ this._requests = this._requests.filter(request => request.networkManager() !== networkManager); |
+ this._requestsSet = new Set(this._requests); |
+ } |
var idMap = new Map(); |
this._requestsByManagerAndId.set(networkManager, idMap); |
@@ -255,26 +300,59 @@ NetworkLog.NetworkLog = class { |
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); |
- idMap.set(request.requestId(), request); |
- request[NetworkLog.NetworkLog._pageLoadForRequestSymbol] = currentPageLoad; |
+ if (request.loaderId !== mainFrame.loaderId) |
+ continue; |
+ if (!currentPageLoad) { |
+ currentPageLoad = new NetworkLog.PageLoad(request); |
+ if (request.redirects) { |
+ for (var redirectRequest of request.redirects) { |
+ this._addRequest(redirectRequest, idMap, currentPageLoad); |
+ removedRequests.delete(redirectRequest); |
+ } |
+ } |
} |
+ |
+ this._addRequest(request, idMap, currentPageLoad); |
+ removedRequests.delete(request); |
} |
+ |
+ this.dispatchEventToListeners(NetworkLog.NetworkLog.Events.RequestsRemoved, removedRequests); |
if (currentPageLoad) |
this._currentPageLoad.set(networkManager, currentPageLoad); |
} |
+ /** |
+ * @param {!SDK.NetworkRequest} request |
+ * @param {!Map<string, !SDK.NetworkRequest>} requestIdMap |
+ * @param {!NetworkLog.PageLoad|undefined} pageLoad |
+ */ |
+ _addRequest(request, requestIdMap, pageLoad) { |
+ if (this._requestsSet.has(request)) |
+ return; |
+ this._requests.push(request); |
+ this._requestsSet.add(request); |
+ requestIdMap.set(request.requestId(), request); |
+ request[NetworkLog.NetworkLog._pageLoadForRequestSymbol] = pageLoad; |
+ } |
+ |
/** |
* @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()) || new Map(); |
+ this._addRequest(request, idMap, this._currentPageLoad.get(request.networkManager())); |
+ this.dispatchEventToListeners(NetworkLog.NetworkLog.Events.RequestAdded, request); |
+ } |
+ |
+ /** |
+ * @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 +393,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 +420,7 @@ NetworkLog.PageLoad = class { |
this.loadTime; |
/** @type {number} */ |
this.contentLoadTime; |
+ this.mainRequest = mainRequest; |
} |
}; |
@@ -337,6 +429,13 @@ 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'), |
+ RequestsRemoved: Symbol('RequestsRemoved'), |
+ RequestUpdated: Symbol('RequestUpdated') |
+}; |
+ |
/** @typedef {!{type: !SDK.NetworkRequest.InitiatorType, url: string, lineNumber: number, columnNumber: number, scriptId: ?string}} */ |
NetworkLog.NetworkLog._InitiatorInfo; |