Chromium Code Reviews| Index: third_party/WebKit/Source/devtools/front_end/sdk/NetworkLog.js |
| diff --git a/third_party/WebKit/Source/devtools/front_end/sdk/NetworkLog.js b/third_party/WebKit/Source/devtools/front_end/sdk/NetworkLog.js |
| index f61c76b93337f9fa592dfb768a8f68516665deed..771f42d1d0c684dfac629536a895dc7bd13a831b 100644 |
| --- a/third_party/WebKit/Source/devtools/front_end/sdk/NetworkLog.js |
| +++ b/third_party/WebKit/Source/devtools/front_end/sdk/NetworkLog.js |
| @@ -29,83 +29,96 @@ |
| */ |
| /** |
| - * @unrestricted |
| + * @implements {SDK.SDKModelObserver<!SDK.NetworkManager>} |
| */ |
| SDK.NetworkLog = class { |
| - /** |
| - * @param {!SDK.Target} target |
| - * @param {!SDK.ResourceTreeModel} resourceTreeModel |
| - * @param {!SDK.NetworkManager} networkManager |
| - */ |
| - constructor(target, resourceTreeModel, networkManager) { |
| - this._target = target; |
| - target[SDK.NetworkLog._logSymbol] = this; |
| + constructor() { |
| /** @type {!Array<!SDK.NetworkRequest>} */ |
| this._requests = []; |
| - /** @type {!Object<string, !SDK.NetworkRequest>} */ |
| - this._requestForId = {}; |
| - networkManager.addEventListener(SDK.NetworkManager.Events.RequestStarted, this._onRequestStarted, this); |
| - resourceTreeModel.addEventListener( |
| - SDK.ResourceTreeModel.Events.MainFrameNavigated, this._onMainFrameNavigated, this); |
| - resourceTreeModel.addEventListener(SDK.ResourceTreeModel.Events.Load, this._onLoad, this); |
| - resourceTreeModel.addEventListener(SDK.ResourceTreeModel.Events.DOMContentLoaded, this._onDOMContentLoaded, this); |
| - networkManager.on(SDK.NetworkManager.RequestRedirectEvent, this._onRequestRedirect, this); |
| + /** @type {!Map<!SDK.Target, !Map<string, !SDK.NetworkRequest>>} */ |
| + this._requestsByTargetAndId = new Map(); |
| + /** @type {!Map<!SDK.Target, !SDK.PageLoad>} */ |
| + this._currentPageLoad = new Map(); |
| + SDK.targetManager.observeModels(SDK.NetworkManager, this); |
| } |
| /** |
| - * @return {!SDK.Target} |
| + * @override |
| + * @param {!SDK.NetworkManager} networkManager |
| */ |
| - target() { |
| - return this._target; |
| + modelAdded(networkManager) { |
| + var eventListeners = []; |
| + eventListeners.push( |
| + networkManager.addEventListener(SDK.NetworkManager.Events.RequestStarted, this._onRequestStarted, this)); |
| + eventListeners.push(networkManager.on(SDK.NetworkManager.RequestRedirectEvent, this._onRequestRedirect, this)); |
| + |
| + var resourceTreeModel = networkManager.target().model(SDK.ResourceTreeModel); |
| + if (resourceTreeModel) { |
| + eventListeners.push(resourceTreeModel.addEventListener( |
| + SDK.ResourceTreeModel.Events.MainFrameNavigated, this._onMainFrameNavigated, this)); |
| + eventListeners.push(resourceTreeModel.addEventListener( |
| + SDK.ResourceTreeModel.Events.Load, this._onLoad.bind(this, resourceTreeModel))); |
| + eventListeners.push(resourceTreeModel.addEventListener( |
| + SDK.ResourceTreeModel.Events.DOMContentLoaded, this._onDOMContentLoaded.bind(this, resourceTreeModel))); |
| + } |
| + |
| + networkManager[SDK.NetworkLog._events] = eventListeners; |
| + this._requestsByTargetAndId.set(networkManager.target(), new Map()); |
| } |
| /** |
| - * @param {!SDK.Target} target |
| - * @return {?SDK.NetworkLog} |
| + * @override |
| + * @param {!SDK.NetworkManager} networkManager |
| */ |
| - static fromTarget(target) { |
| - return target[SDK.NetworkLog._logSymbol] || null; |
| + modelRemoved(networkManager) { |
| + this._requestsByTargetAndId.delete(networkManager.target()); |
| + Common.EventTarget.removeEventListeners(networkManager[SDK.NetworkLog._events]); |
| } |
| /** |
| * @param {string} url |
| * @return {?SDK.NetworkRequest} |
| */ |
| - static requestForURL(url) { |
| - for (var target of SDK.targetManager.targets()) { |
| - var networkLog = SDK.NetworkLog.fromTarget(target); |
| - var result = networkLog && networkLog.requestForURL(url); |
| - if (result) |
| - return result; |
| + requestForURL(url) { |
| + for (var i = 0; i < this._requests.length; ++i) { |
|
caseq
2017/03/16 20:27:47
return this._requests.find(request => request.url(
dgozman
2017/03/16 20:51:20
Done.
|
| + if (this._requests[i].url() === url) |
| + return this._requests[i]; |
| } |
| return null; |
| } |
| /** |
| - * @return {!Array.<!SDK.NetworkRequest>} |
| + * @return {!Array<!SDK.NetworkRequest>} |
| */ |
| - static requests() { |
| - var result = []; |
| - for (var target of SDK.targetManager.targets()) { |
| - var networkLog = SDK.NetworkLog.fromTarget(target); |
| - if (networkLog) |
| - result = result.concat(networkLog.requests()); |
| - } |
| - return result; |
| + requests() { |
| + return this._requests; |
| } |
| /** |
| - * @param {!SDK.NetworkRequest} request |
| - * @return {?SDK.NetworkLog} |
| + * @param {!SDK.Target} target |
| + * @return {!Array<!SDK.NetworkRequest>} |
| + */ |
| + requestsForTarget(target) { |
| + return this._requests.filter(request => request.target() === target); |
|
caseq
2017/03/16 20:27:47
return Array.from(this._requestsByTargetAndId.get(
dgozman
2017/03/16 20:51:20
Done.
|
| + } |
| + |
| + /** |
| + * @param {string} url |
| + * @param {!SDK.Target} target |
| + * @return {?SDK.NetworkRequest} |
| */ |
| - static fromRequest(request) { |
| - return SDK.NetworkLog.fromTarget(request.target()); |
| + _requestForURLInTarget(url, target) { |
| + for (var i = 0; i < this._requests.length; ++i) { |
| + if (this._requests[i].target() === target && this._requests[i].url() === url) |
|
caseq
2017/03/16 20:27:47
Iterate over this._requestsByTargetAndId.get(targe
dgozman
2017/03/16 20:51:20
Done.
|
| + return this._requests[i]; |
| + } |
| + return null; |
| } |
| /** |
| * @param {!SDK.NetworkRequest} request |
| */ |
| - static _initializeInitiatorSymbolIfNeeded(request) { |
| + _initializeInitiatorSymbolIfNeeded(request) { |
| if (!request[SDK.NetworkLog._initiatorDataSymbol]) { |
| /** @type {!{info: ?SDK.NetworkLog._InitiatorInfo, chain: !Set<!SDK.NetworkRequest>, request: (?SDK.NetworkRequest|undefined)}} */ |
| request[SDK.NetworkLog._initiatorDataSymbol] = { |
| @@ -120,8 +133,8 @@ SDK.NetworkLog = class { |
| * @param {!SDK.NetworkRequest} request |
| * @return {!SDK.NetworkLog._InitiatorInfo} |
| */ |
| - static initiatorInfoForRequest(request) { |
| - SDK.NetworkLog._initializeInitiatorSymbolIfNeeded(request); |
| + initiatorInfoForRequest(request) { |
| + this._initializeInitiatorSymbolIfNeeded(request); |
| if (request[SDK.NetworkLog._initiatorDataSymbol].info) |
| return request[SDK.NetworkLog._initiatorDataSymbol].info; |
| @@ -166,104 +179,87 @@ SDK.NetworkLog = class { |
| * @param {!SDK.NetworkRequest} request |
| * @return {!SDK.NetworkLog.InitiatorGraph} |
| */ |
| - static initiatorGraphForRequest(request) { |
| + initiatorGraphForRequest(request) { |
| /** @type {!Set<!SDK.NetworkRequest>} */ |
| var initiated = new Set(); |
| - var networkLog = SDK.NetworkLog.fromRequest(request); |
| - if (!networkLog) |
| - return {initiators: new Set(), initiated: new Set()}; |
| - |
| - var requests = networkLog.requests(); |
| - for (var logRequest of requests) { |
| - var localInitiators = initiatorChain(logRequest); |
| + for (var logRequest of this._requests) { |
| + if (logRequest.target() !== request.target()) |
|
caseq
2017/03/16 20:27:47
ditto
dgozman
2017/03/16 20:51:20
Done.
|
| + continue; |
| + var localInitiators = this._initiatorChain(logRequest); |
| if (localInitiators.has(request)) |
| initiated.add(logRequest); |
| } |
| - return {initiators: initiatorChain(request), initiated: initiated}; |
| - |
| - /** |
| - * @param {!SDK.NetworkRequest} request |
| - * @return {!Set<!SDK.NetworkRequest>} |
| - */ |
| - function initiatorChain(request) { |
| - SDK.NetworkLog._initializeInitiatorSymbolIfNeeded(request); |
| - var initiatorChainCache = |
| - /** @type {?Set<!SDK.NetworkRequest>} */ (request[SDK.NetworkLog._initiatorDataSymbol].chain); |
| - if (initiatorChainCache) |
| - return initiatorChainCache; |
| - |
| - initiatorChainCache = new Set(); |
| - |
| - var checkRequest = request; |
| - while (checkRequest) { |
| - initiatorChainCache.add(checkRequest); |
| - checkRequest = initiatorRequest(checkRequest); |
| - } |
| - request[SDK.NetworkLog._initiatorDataSymbol].chain = initiatorChainCache; |
| - return initiatorChainCache; |
| - } |
| - |
| - /** |
| - * @param {!SDK.NetworkRequest} request |
| - * @return {?SDK.NetworkRequest} |
| - */ |
| - function initiatorRequest(request) { |
| - SDK.NetworkLog._initializeInitiatorSymbolIfNeeded(request); |
| - if (request[SDK.NetworkLog._initiatorDataSymbol].request !== undefined) |
| - return request[SDK.NetworkLog._initiatorDataSymbol].request; |
| - var networkLog = SDK.NetworkLog.fromRequest(request); |
| - var url = SDK.NetworkLog.initiatorInfoForRequest(request).url; |
| - request[SDK.NetworkLog._initiatorDataSymbol].request = networkLog.requestForURL(url); |
| - return request[SDK.NetworkLog._initiatorDataSymbol].request; |
| - } |
| + return {initiators: this._initiatorChain(request), initiated: initiated}; |
| } |
| /** |
| * @param {!SDK.NetworkRequest} request |
| - * @return {?SDK.PageLoad} |
| + * @return {!Set<!SDK.NetworkRequest>} |
| */ |
| - static pageLoadForRequest(request) { |
| - return request[SDK.NetworkLog._pageLoadForRequestSymbol]; |
| + _initiatorChain(request) { |
| + this._initializeInitiatorSymbolIfNeeded(request); |
| + var initiatorChainCache = |
| + /** @type {?Set<!SDK.NetworkRequest>} */ (request[SDK.NetworkLog._initiatorDataSymbol].chain); |
| + if (initiatorChainCache) |
| + return initiatorChainCache; |
| + |
| + initiatorChainCache = new Set(); |
| + |
| + var checkRequest = request; |
| + while (checkRequest) { |
| + initiatorChainCache.add(checkRequest); |
| + checkRequest = this._initiatorRequest(checkRequest); |
| + } |
| + request[SDK.NetworkLog._initiatorDataSymbol].chain = initiatorChainCache; |
| + return initiatorChainCache; |
| } |
| /** |
| - * @return {!Array.<!SDK.NetworkRequest>} |
| + * @param {!SDK.NetworkRequest} request |
| + * @return {?SDK.NetworkRequest} |
| */ |
| - requests() { |
| - return this._requests; |
| + _initiatorRequest(request) { |
| + this._initializeInitiatorSymbolIfNeeded(request); |
| + if (request[SDK.NetworkLog._initiatorDataSymbol].request !== undefined) |
| + return request[SDK.NetworkLog._initiatorDataSymbol].request; |
| + var url = this.initiatorInfoForRequest(request).url; |
| + request[SDK.NetworkLog._initiatorDataSymbol].request = this._requestForURLInTarget(url, request.target()); |
| + return request[SDK.NetworkLog._initiatorDataSymbol].request; |
| } |
| /** |
| - * @param {string} url |
| - * @return {?SDK.NetworkRequest} |
| + * @param {!SDK.NetworkRequest} request |
| + * @return {?SDK.PageLoad} |
| */ |
| - requestForURL(url) { |
| - for (var i = 0; i < this._requests.length; ++i) { |
| - if (this._requests[i].url() === url) |
| - return this._requests[i]; |
| - } |
| - return null; |
| + pageLoadForRequest(request) { |
| + return request[SDK.NetworkLog._pageLoadForRequestSymbol]; |
| } |
| /** |
| * @param {!Common.Event} event |
| */ |
| _onMainFrameNavigated(event) { |
| - var mainFrame = /** type {SDK.ResourceTreeFrame} */ event.data; |
| + var mainFrame = /** type {!SDK.ResourceTreeFrame} */ (event.data); |
| + var target = mainFrame.target(); |
| + this._currentPageLoad.delete(target); |
| + var oldRequests = this.requestsForTarget(target); |
| + this._requests = this._requests.filter(request => request.target() !== target); |
| + this._requestsByTargetAndId.set(target, new Map()); |
| + |
| // Preserve requests from the new session. |
| - this._currentPageLoad = null; |
| - var oldRequests = this._requests.splice(0, this._requests.length); |
| - this._requestForId = {}; |
| + var currentPageLoad = null; |
| for (var i = 0; i < oldRequests.length; ++i) { |
| var request = oldRequests[i]; |
| if (request.loaderId === mainFrame.loaderId) { |
| - if (!this._currentPageLoad) |
| - this._currentPageLoad = new SDK.PageLoad(request); |
| + if (!currentPageLoad) |
| + currentPageLoad = new SDK.PageLoad(request); |
| this._requests.push(request); |
| - this._requestForId[request.requestId()] = request; |
| - request[SDK.NetworkLog._pageLoadForRequestSymbol] = this._currentPageLoad; |
| + this._requestsByTargetAndId.get(target).set(request.requestId(), request); |
| + request[SDK.NetworkLog._pageLoadForRequestSymbol] = currentPageLoad; |
| } |
| } |
| + if (currentPageLoad) |
| + this._currentPageLoad.set(target, currentPageLoad); |
|
caseq
2017/03/16 20:27:47
Why can we have more than one?
dgozman
2017/03/16 20:51:20
One per target in case of multiple targets?
|
| } |
| /** |
| @@ -272,8 +268,8 @@ SDK.NetworkLog = class { |
| _onRequestStarted(event) { |
| var request = /** @type {!SDK.NetworkRequest} */ (event.data); |
| this._requests.push(request); |
| - this._requestForId[request.requestId()] = request; |
| - request[SDK.NetworkLog._pageLoadForRequestSymbol] = this._currentPageLoad; |
| + this._requestsByTargetAndId.get(request.target()).set(request.requestId(), request); |
| + request[SDK.NetworkLog._pageLoadForRequestSymbol] = this._currentPageLoad.get(request.target()); |
| } |
| /** |
| @@ -285,27 +281,33 @@ SDK.NetworkLog = class { |
| } |
| /** |
| + * @param {!SDK.ResourceTreeModel} resourceTreeModel |
| * @param {!Common.Event} event |
| */ |
| - _onDOMContentLoaded(event) { |
| - if (this._currentPageLoad) |
| - this._currentPageLoad.contentLoadTime = event.data; |
| + _onDOMContentLoaded(resourceTreeModel, event) { |
| + var pageLoad = this._currentPageLoad.get(resourceTreeModel.target()); |
| + if (pageLoad) |
| + pageLoad.contentLoadTime = event.data; |
| } |
| /** |
| + * @param {!SDK.ResourceTreeModel} resourceTreeModel |
| * @param {!Common.Event} event |
| */ |
| - _onLoad(event) { |
| - if (this._currentPageLoad) |
| - this._currentPageLoad.loadTime = event.data; |
| + _onLoad(resourceTreeModel, event) { |
| + var pageLoad = this._currentPageLoad.get(resourceTreeModel.target()); |
| + if (pageLoad) |
| + pageLoad.loadTime = event.data; |
| } |
| /** |
| + * @param {!SDK.Target} target |
| * @param {!Protocol.Network.RequestId} requestId |
| * @return {?SDK.NetworkRequest} |
| */ |
| - requestForId(requestId) { |
| - return this._requestForId[requestId]; |
| + requestForId(target, requestId) { |
| + var map = this._requestsByTargetAndId.get(target); |
| + return map ? (map.get(requestId) || null) : null; |
| } |
| }; |
| @@ -333,4 +335,7 @@ SDK.NetworkLog._InitiatorInfo; |
| SDK.NetworkLog._initiatorDataSymbol = Symbol('InitiatorData'); |
| SDK.NetworkLog._pageLoadForRequestSymbol = Symbol('PageLoadForRequest'); |
| -SDK.NetworkLog._logSymbol = Symbol('NetworkLog'); |
| +SDK.NetworkLog._events = Symbol('SDK.NetworkLog.events'); |
| + |
| +/** @type {!SDK.NetworkLog} */ |
| +SDK.networkLog; |