Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(966)

Side by Side Diff: third_party/WebKit/Source/devtools/front_end/sdk/NetworkLog.js

Issue 2749043005: [DevTools] Make NetworkLog a singleton, and not an SDKModel (Closed)
Patch Set: review comments addressed Created 3 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2011 Google Inc. All rights reserved. 2 * Copyright (C) 2011 Google Inc. All rights reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are 5 * modification, are permitted provided that the following conditions are
6 * met: 6 * met:
7 * 7 *
8 * * Redistributions of source code must retain the above copyright 8 * * Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer. 9 * notice, this list of conditions and the following disclaimer.
10 * * Redistributions in binary form must reproduce the above 10 * * Redistributions in binary form must reproduce the above
(...skipping 11 matching lines...) Expand all
22 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 22 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 23 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 24 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 */ 29 */
30 30
31 /** 31 /**
32 * @unrestricted 32 * @implements {SDK.SDKModelObserver<!SDK.NetworkManager>}
33 */ 33 */
34 SDK.NetworkLog = class { 34 SDK.NetworkLog = class {
35 /** 35 constructor() {
36 * @param {!SDK.Target} target
37 * @param {!SDK.ResourceTreeModel} resourceTreeModel
38 * @param {!SDK.NetworkManager} networkManager
39 */
40 constructor(target, resourceTreeModel, networkManager) {
41 this._target = target;
42 target[SDK.NetworkLog._logSymbol] = this;
43 /** @type {!Array<!SDK.NetworkRequest>} */ 36 /** @type {!Array<!SDK.NetworkRequest>} */
44 this._requests = []; 37 this._requests = [];
45 /** @type {!Object<string, !SDK.NetworkRequest>} */ 38 /** @type {!Map<!SDK.Target, !Map<string, !SDK.NetworkRequest>>} */
46 this._requestForId = {}; 39 this._requestsByTargetAndId = new Map();
47 networkManager.addEventListener(SDK.NetworkManager.Events.RequestStarted, th is._onRequestStarted, this); 40 /** @type {!Map<!SDK.Target, !SDK.PageLoad>} */
48 resourceTreeModel.addEventListener( 41 this._currentPageLoad = new Map();
49 SDK.ResourceTreeModel.Events.MainFrameNavigated, this._onMainFrameNaviga ted, this); 42 SDK.targetManager.observeModels(SDK.NetworkManager, this);
50 resourceTreeModel.addEventListener(SDK.ResourceTreeModel.Events.Load, this._ onLoad, this);
51 resourceTreeModel.addEventListener(SDK.ResourceTreeModel.Events.DOMContentLo aded, this._onDOMContentLoaded, this);
52 networkManager.on(SDK.NetworkManager.RequestRedirectEvent, this._onRequestRe direct, this);
53 } 43 }
54 44
55 /** 45 /**
56 * @return {!SDK.Target} 46 * @override
47 * @param {!SDK.NetworkManager} networkManager
57 */ 48 */
58 target() { 49 modelAdded(networkManager) {
59 return this._target; 50 var eventListeners = [];
51 eventListeners.push(
52 networkManager.addEventListener(SDK.NetworkManager.Events.RequestStarted , this._onRequestStarted, this));
53 eventListeners.push(networkManager.on(SDK.NetworkManager.RequestRedirectEven t, this._onRequestRedirect, this));
54
55 var resourceTreeModel = networkManager.target().model(SDK.ResourceTreeModel) ;
56 if (resourceTreeModel) {
57 eventListeners.push(resourceTreeModel.addEventListener(
58 SDK.ResourceTreeModel.Events.MainFrameNavigated, this._onMainFrameNavi gated, this));
59 eventListeners.push(resourceTreeModel.addEventListener(
60 SDK.ResourceTreeModel.Events.Load, this._onLoad.bind(this, resourceTre eModel)));
61 eventListeners.push(resourceTreeModel.addEventListener(
62 SDK.ResourceTreeModel.Events.DOMContentLoaded, this._onDOMContentLoade d.bind(this, resourceTreeModel)));
63 }
64
65 networkManager[SDK.NetworkLog._events] = eventListeners;
66 this._requestsByTargetAndId.set(networkManager.target(), new Map());
60 } 67 }
61 68
62 /** 69 /**
63 * @param {!SDK.Target} target 70 * @override
64 * @return {?SDK.NetworkLog} 71 * @param {!SDK.NetworkManager} networkManager
65 */ 72 */
66 static fromTarget(target) { 73 modelRemoved(networkManager) {
67 return target[SDK.NetworkLog._logSymbol] || null; 74 this._requestsByTargetAndId.delete(networkManager.target());
75 Common.EventTarget.removeEventListeners(networkManager[SDK.NetworkLog._event s]);
68 } 76 }
69 77
70 /** 78 /**
71 * @param {string} url 79 * @param {string} url
72 * @return {?SDK.NetworkRequest} 80 * @return {?SDK.NetworkRequest}
73 */ 81 */
74 static requestForURL(url) { 82 requestForURL(url) {
75 for (var target of SDK.targetManager.targets()) { 83 return this._requests.find(request => request.url() === url) || null;
76 var networkLog = SDK.NetworkLog.fromTarget(target); 84 }
77 var result = networkLog && networkLog.requestForURL(url); 85
78 if (result) 86 /**
79 return result; 87 * @return {!Array<!SDK.NetworkRequest>}
88 */
89 requests() {
90 return this._requests;
91 }
92
93 /**
94 * @param {!SDK.Target} target
95 * @return {!Array<!SDK.NetworkRequest>}
96 */
97 requestsForTarget(target) {
98 var map = this._requestsByTargetAndId.get(target);
99 return map ? Array.from(map.values()) : [];
100 }
101
102 /**
103 * @param {string} url
104 * @param {!SDK.Target} target
105 * @return {?SDK.NetworkRequest}
106 */
107 _requestForURLInTarget(url, target) {
108 var map = this._requestsByTargetAndId.get(target);
109 if (!map)
110 return null;
111 for (var request of map.values()) {
112 if (request.url() === url)
113 return request;
80 } 114 }
81 return null; 115 return null;
82 } 116 }
83 117
84 /** 118 /**
85 * @return {!Array.<!SDK.NetworkRequest>}
86 */
87 static requests() {
88 var result = [];
89 for (var target of SDK.targetManager.targets()) {
90 var networkLog = SDK.NetworkLog.fromTarget(target);
91 if (networkLog)
92 result = result.concat(networkLog.requests());
93 }
94 return result;
95 }
96
97 /**
98 * @param {!SDK.NetworkRequest} request
99 * @return {?SDK.NetworkLog}
100 */
101 static fromRequest(request) {
102 return SDK.NetworkLog.fromTarget(request.target());
103 }
104
105 /**
106 * @param {!SDK.NetworkRequest} request 119 * @param {!SDK.NetworkRequest} request
107 */ 120 */
108 static _initializeInitiatorSymbolIfNeeded(request) { 121 _initializeInitiatorSymbolIfNeeded(request) {
109 if (!request[SDK.NetworkLog._initiatorDataSymbol]) { 122 if (!request[SDK.NetworkLog._initiatorDataSymbol]) {
110 /** @type {!{info: ?SDK.NetworkLog._InitiatorInfo, chain: !Set<!SDK.Networ kRequest>, request: (?SDK.NetworkRequest|undefined)}} */ 123 /** @type {!{info: ?SDK.NetworkLog._InitiatorInfo, chain: !Set<!SDK.Networ kRequest>, request: (?SDK.NetworkRequest|undefined)}} */
111 request[SDK.NetworkLog._initiatorDataSymbol] = { 124 request[SDK.NetworkLog._initiatorDataSymbol] = {
112 info: null, 125 info: null,
113 chain: null, 126 chain: null,
114 request: undefined, 127 request: undefined,
115 }; 128 };
116 } 129 }
117 } 130 }
118 131
119 /** 132 /**
120 * @param {!SDK.NetworkRequest} request 133 * @param {!SDK.NetworkRequest} request
121 * @return {!SDK.NetworkLog._InitiatorInfo} 134 * @return {!SDK.NetworkLog._InitiatorInfo}
122 */ 135 */
123 static initiatorInfoForRequest(request) { 136 initiatorInfoForRequest(request) {
124 SDK.NetworkLog._initializeInitiatorSymbolIfNeeded(request); 137 this._initializeInitiatorSymbolIfNeeded(request);
125 if (request[SDK.NetworkLog._initiatorDataSymbol].info) 138 if (request[SDK.NetworkLog._initiatorDataSymbol].info)
126 return request[SDK.NetworkLog._initiatorDataSymbol].info; 139 return request[SDK.NetworkLog._initiatorDataSymbol].info;
127 140
128 var type = SDK.NetworkRequest.InitiatorType.Other; 141 var type = SDK.NetworkRequest.InitiatorType.Other;
129 var url = ''; 142 var url = '';
130 var lineNumber = -Infinity; 143 var lineNumber = -Infinity;
131 var columnNumber = -Infinity; 144 var columnNumber = -Infinity;
132 var scriptId = null; 145 var scriptId = null;
133 var initiator = request.initiator(); 146 var initiator = request.initiator();
134 147
(...skipping 24 matching lines...) Expand all
159 172
160 request[SDK.NetworkLog._initiatorDataSymbol].info = 173 request[SDK.NetworkLog._initiatorDataSymbol].info =
161 {type: type, url: url, lineNumber: lineNumber, columnNumber: columnNumbe r, scriptId: scriptId}; 174 {type: type, url: url, lineNumber: lineNumber, columnNumber: columnNumbe r, scriptId: scriptId};
162 return request[SDK.NetworkLog._initiatorDataSymbol].info; 175 return request[SDK.NetworkLog._initiatorDataSymbol].info;
163 } 176 }
164 177
165 /** 178 /**
166 * @param {!SDK.NetworkRequest} request 179 * @param {!SDK.NetworkRequest} request
167 * @return {!SDK.NetworkLog.InitiatorGraph} 180 * @return {!SDK.NetworkLog.InitiatorGraph}
168 */ 181 */
169 static initiatorGraphForRequest(request) { 182 initiatorGraphForRequest(request) {
170 /** @type {!Set<!SDK.NetworkRequest>} */ 183 /** @type {!Set<!SDK.NetworkRequest>} */
171 var initiated = new Set(); 184 var initiated = new Set();
172 var networkLog = SDK.NetworkLog.fromRequest(request); 185 var map = this._requestsByTargetAndId.get(request.target());
173 if (!networkLog) 186 if (map) {
174 return {initiators: new Set(), initiated: new Set()}; 187 for (var otherRequest of map.values()) {
188 if (this._initiatorChain(otherRequest).has(request))
189 initiated.add(otherRequest);
190 }
191 }
192 return {initiators: this._initiatorChain(request), initiated: initiated};
193 }
175 194
176 var requests = networkLog.requests(); 195 /**
177 for (var logRequest of requests) { 196 * @param {!SDK.NetworkRequest} request
178 var localInitiators = initiatorChain(logRequest); 197 * @return {!Set<!SDK.NetworkRequest>}
179 if (localInitiators.has(request)) 198 */
180 initiated.add(logRequest); 199 _initiatorChain(request) {
181 } 200 this._initializeInitiatorSymbolIfNeeded(request);
182 return {initiators: initiatorChain(request), initiated: initiated}; 201 var initiatorChainCache =
202 /** @type {?Set<!SDK.NetworkRequest>} */ (request[SDK.NetworkLog._initia torDataSymbol].chain);
203 if (initiatorChainCache)
204 return initiatorChainCache;
183 205
184 /** 206 initiatorChainCache = new Set();
185 * @param {!SDK.NetworkRequest} request
186 * @return {!Set<!SDK.NetworkRequest>}
187 */
188 function initiatorChain(request) {
189 SDK.NetworkLog._initializeInitiatorSymbolIfNeeded(request);
190 var initiatorChainCache =
191 /** @type {?Set<!SDK.NetworkRequest>} */ (request[SDK.NetworkLog._init iatorDataSymbol].chain);
192 if (initiatorChainCache)
193 return initiatorChainCache;
194 207
195 initiatorChainCache = new Set(); 208 var checkRequest = request;
209 do {
210 initiatorChainCache.add(checkRequest);
211 checkRequest = this._initiatorRequest(checkRequest);
212 } while (checkRequest);
213 request[SDK.NetworkLog._initiatorDataSymbol].chain = initiatorChainCache;
214 return initiatorChainCache;
215 }
196 216
197 var checkRequest = request; 217 /**
198 while (checkRequest) { 218 * @param {!SDK.NetworkRequest} request
199 initiatorChainCache.add(checkRequest); 219 * @return {?SDK.NetworkRequest}
200 checkRequest = initiatorRequest(checkRequest); 220 */
201 } 221 _initiatorRequest(request) {
202 request[SDK.NetworkLog._initiatorDataSymbol].chain = initiatorChainCache; 222 this._initializeInitiatorSymbolIfNeeded(request);
203 return initiatorChainCache; 223 if (request[SDK.NetworkLog._initiatorDataSymbol].request !== undefined)
204 }
205
206 /**
207 * @param {!SDK.NetworkRequest} request
208 * @return {?SDK.NetworkRequest}
209 */
210 function initiatorRequest(request) {
211 SDK.NetworkLog._initializeInitiatorSymbolIfNeeded(request);
212 if (request[SDK.NetworkLog._initiatorDataSymbol].request !== undefined)
213 return request[SDK.NetworkLog._initiatorDataSymbol].request;
214 var networkLog = SDK.NetworkLog.fromRequest(request);
215 var url = SDK.NetworkLog.initiatorInfoForRequest(request).url;
216 request[SDK.NetworkLog._initiatorDataSymbol].request = networkLog.requestF orURL(url);
217 return request[SDK.NetworkLog._initiatorDataSymbol].request; 224 return request[SDK.NetworkLog._initiatorDataSymbol].request;
218 } 225 var url = this.initiatorInfoForRequest(request).url;
226 request[SDK.NetworkLog._initiatorDataSymbol].request = this._requestForURLIn Target(url, request.target());
227 return request[SDK.NetworkLog._initiatorDataSymbol].request;
219 } 228 }
220 229
221 /** 230 /**
222 * @param {!SDK.NetworkRequest} request 231 * @param {!SDK.NetworkRequest} request
223 * @return {?SDK.PageLoad} 232 * @return {?SDK.PageLoad}
224 */ 233 */
225 static pageLoadForRequest(request) { 234 pageLoadForRequest(request) {
226 return request[SDK.NetworkLog._pageLoadForRequestSymbol]; 235 return request[SDK.NetworkLog._pageLoadForRequestSymbol];
227 } 236 }
228 237
229 /** 238 /**
230 * @return {!Array.<!SDK.NetworkRequest>}
231 */
232 requests() {
233 return this._requests;
234 }
235
236 /**
237 * @param {string} url
238 * @return {?SDK.NetworkRequest}
239 */
240 requestForURL(url) {
241 for (var i = 0; i < this._requests.length; ++i) {
242 if (this._requests[i].url() === url)
243 return this._requests[i];
244 }
245 return null;
246 }
247
248 /**
249 * @param {!Common.Event} event 239 * @param {!Common.Event} event
250 */ 240 */
251 _onMainFrameNavigated(event) { 241 _onMainFrameNavigated(event) {
252 var mainFrame = /** type {SDK.ResourceTreeFrame} */ event.data; 242 var mainFrame = /** @type {!SDK.ResourceTreeFrame} */ (event.data);
243 var target = mainFrame.target();
244 this._currentPageLoad.delete(target);
245 var oldRequests = this.requestsForTarget(target);
246 this._requests = this._requests.filter(request => request.target() !== targe t);
247 var idMap = new Map();
248 this._requestsByTargetAndId.set(target, idMap);
249
253 // Preserve requests from the new session. 250 // Preserve requests from the new session.
254 this._currentPageLoad = null; 251 var currentPageLoad = null;
255 var oldRequests = this._requests.splice(0, this._requests.length);
256 this._requestForId = {};
257 for (var i = 0; i < oldRequests.length; ++i) { 252 for (var i = 0; i < oldRequests.length; ++i) {
258 var request = oldRequests[i]; 253 var request = oldRequests[i];
259 if (request.loaderId === mainFrame.loaderId) { 254 if (request.loaderId === mainFrame.loaderId) {
260 if (!this._currentPageLoad) 255 if (!currentPageLoad)
261 this._currentPageLoad = new SDK.PageLoad(request); 256 currentPageLoad = new SDK.PageLoad(request);
262 this._requests.push(request); 257 this._requests.push(request);
263 this._requestForId[request.requestId()] = request; 258 idMap.set(request.requestId(), request);
264 request[SDK.NetworkLog._pageLoadForRequestSymbol] = this._currentPageLoa d; 259 request[SDK.NetworkLog._pageLoadForRequestSymbol] = currentPageLoad;
265 } 260 }
266 } 261 }
262 if (currentPageLoad)
263 this._currentPageLoad.set(target, currentPageLoad);
267 } 264 }
268 265
269 /** 266 /**
270 * @param {!Common.Event} event 267 * @param {!Common.Event} event
271 */ 268 */
272 _onRequestStarted(event) { 269 _onRequestStarted(event) {
273 var request = /** @type {!SDK.NetworkRequest} */ (event.data); 270 var request = /** @type {!SDK.NetworkRequest} */ (event.data);
274 this._requests.push(request); 271 this._requests.push(request);
275 this._requestForId[request.requestId()] = request; 272 this._requestsByTargetAndId.get(request.target()).set(request.requestId(), r equest);
276 request[SDK.NetworkLog._pageLoadForRequestSymbol] = this._currentPageLoad; 273 request[SDK.NetworkLog._pageLoadForRequestSymbol] = this._currentPageLoad.ge t(request.target());
277 } 274 }
278 275
279 /** 276 /**
280 * @param {!SDK.NetworkManager.RequestRedirectEvent} event 277 * @param {!SDK.NetworkManager.RequestRedirectEvent} event
281 */ 278 */
282 _onRequestRedirect(event) { 279 _onRequestRedirect(event) {
283 var request = event.request; 280 var request = event.request;
284 delete request[SDK.NetworkLog._initiatorDataSymbol]; 281 delete request[SDK.NetworkLog._initiatorDataSymbol];
285 } 282 }
286 283
287 /** 284 /**
285 * @param {!SDK.ResourceTreeModel} resourceTreeModel
288 * @param {!Common.Event} event 286 * @param {!Common.Event} event
289 */ 287 */
290 _onDOMContentLoaded(event) { 288 _onDOMContentLoaded(resourceTreeModel, event) {
291 if (this._currentPageLoad) 289 var pageLoad = this._currentPageLoad.get(resourceTreeModel.target());
292 this._currentPageLoad.contentLoadTime = event.data; 290 if (pageLoad)
291 pageLoad.contentLoadTime = /** @type {number} */ (event.data);
293 } 292 }
294 293
295 /** 294 /**
295 * @param {!SDK.ResourceTreeModel} resourceTreeModel
296 * @param {!Common.Event} event 296 * @param {!Common.Event} event
297 */ 297 */
298 _onLoad(event) { 298 _onLoad(resourceTreeModel, event) {
299 if (this._currentPageLoad) 299 var pageLoad = this._currentPageLoad.get(resourceTreeModel.target());
300 this._currentPageLoad.loadTime = event.data; 300 if (pageLoad)
301 pageLoad.loadTime = /** @type {number} */ (event.data);
301 } 302 }
302 303
303 /** 304 /**
305 * @param {!SDK.Target} target
304 * @param {!Protocol.Network.RequestId} requestId 306 * @param {!Protocol.Network.RequestId} requestId
305 * @return {?SDK.NetworkRequest} 307 * @return {?SDK.NetworkRequest}
306 */ 308 */
307 requestForId(requestId) { 309 requestForId(target, requestId) {
308 return this._requestForId[requestId]; 310 var map = this._requestsByTargetAndId.get(target);
311 return map ? (map.get(requestId) || null) : null;
309 } 312 }
310 }; 313 };
311 314
312 /**
313 * @unrestricted
314 */
315 SDK.PageLoad = class { 315 SDK.PageLoad = class {
316 /** 316 /**
317 * @param {!SDK.NetworkRequest} mainRequest 317 * @param {!SDK.NetworkRequest} mainRequest
318 */ 318 */
319 constructor(mainRequest) { 319 constructor(mainRequest) {
320 this.id = ++SDK.PageLoad._lastIdentifier; 320 this.id = ++SDK.PageLoad._lastIdentifier;
321 this.url = mainRequest.url(); 321 this.url = mainRequest.url();
322 this.startTime = mainRequest.startTime; 322 this.startTime = mainRequest.startTime;
323 /** @type {number} */
324 this.loadTime;
325 /** @type {number} */
326 this.contentLoadTime;
323 } 327 }
324 }; 328 };
325 329
326 SDK.PageLoad._lastIdentifier = 0; 330 SDK.PageLoad._lastIdentifier = 0;
327 331
328 /** @typedef {!{initiators: !Set<!SDK.NetworkRequest>, initiated: !Set<!SDK.Netw orkRequest>}} */ 332 /** @typedef {!{initiators: !Set<!SDK.NetworkRequest>, initiated: !Set<!SDK.Netw orkRequest>}} */
329 SDK.NetworkLog.InitiatorGraph; 333 SDK.NetworkLog.InitiatorGraph;
330 334
331 /** @typedef {!{type: !SDK.NetworkRequest.InitiatorType, url: string, lineNumber : number, columnNumber: number, scriptId: ?string}} */ 335 /** @typedef {!{type: !SDK.NetworkRequest.InitiatorType, url: string, lineNumber : number, columnNumber: number, scriptId: ?string}} */
332 SDK.NetworkLog._InitiatorInfo; 336 SDK.NetworkLog._InitiatorInfo;
333 337
334 SDK.NetworkLog._initiatorDataSymbol = Symbol('InitiatorData'); 338 SDK.NetworkLog._initiatorDataSymbol = Symbol('InitiatorData');
335 SDK.NetworkLog._pageLoadForRequestSymbol = Symbol('PageLoadForRequest'); 339 SDK.NetworkLog._pageLoadForRequestSymbol = Symbol('PageLoadForRequest');
336 SDK.NetworkLog._logSymbol = Symbol('NetworkLog'); 340 SDK.NetworkLog._events = Symbol('SDK.NetworkLog.events');
341
342 /** @type {!SDK.NetworkLog} */
343 SDK.networkLog;
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698