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; |