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

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

Issue 2466123002: DevTools: reformat front-end code to match chromium style. (Closed)
Patch Set: all done Created 4 years, 1 month 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
11 * copyright notice, this list of conditions and the following disclaimer 11 * copyright notice, this list of conditions and the following disclaimer
12 * in the documentation and/or other materials provided with the 12 * in the documentation and/or other materials provided with the
13 * distribution. 13 * distribution.
14 * * Neither the name of Google Inc. nor the names of its 14 * * Neither the name of Google Inc. nor the names of its
15 * contributors may be used to endorse or promote products derived from 15 * contributors may be used to endorse or promote products derived from
16 * this software without specific prior written permission. 16 * this software without specific prior written permission.
17 * 17 *
18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 19 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 20 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 21 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
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
31 /** 30 /**
32 * @constructor 31 * @unrestricted
33 * @extends {WebInspector.SDKModel}
34 * @param {!WebInspector.Target} target
35 */ 32 */
36 WebInspector.NetworkManager = function(target) 33 WebInspector.NetworkManager = class extends WebInspector.SDKModel {
37 { 34 /**
38 WebInspector.SDKModel.call(this, WebInspector.NetworkManager, target); 35 * @param {!WebInspector.Target} target
36 */
37 constructor(target) {
38 super(WebInspector.NetworkManager, target);
39 this._dispatcher = new WebInspector.NetworkDispatcher(this); 39 this._dispatcher = new WebInspector.NetworkDispatcher(this);
40 this._target = target; 40 this._target = target;
41 this._networkAgent = target.networkAgent(); 41 this._networkAgent = target.networkAgent();
42 target.registerNetworkDispatcher(this._dispatcher); 42 target.registerNetworkDispatcher(this._dispatcher);
43 if (WebInspector.moduleSetting("cacheDisabled").get()) 43 if (WebInspector.moduleSetting('cacheDisabled').get())
44 this._networkAgent.setCacheDisabled(true); 44 this._networkAgent.setCacheDisabled(true);
45 if (WebInspector.moduleSetting("monitoringXHREnabled").get()) 45 if (WebInspector.moduleSetting('monitoringXHREnabled').get())
46 this._networkAgent.setMonitoringXHREnabled(true); 46 this._networkAgent.setMonitoringXHREnabled(true);
47 47
48 // Limit buffer when talking to a remote device. 48 // Limit buffer when talking to a remote device.
49 if (Runtime.queryParam("remoteFrontend") || Runtime.queryParam("ws")) 49 if (Runtime.queryParam('remoteFrontend') || Runtime.queryParam('ws'))
50 this._networkAgent.enable(10000000, 5000000); 50 this._networkAgent.enable(10000000, 5000000);
51 else 51 else
52 this._networkAgent.enable(); 52 this._networkAgent.enable();
53 53
54 this._bypassServiceWorkerSetting = WebInspector.settings.createSetting("bypa ssServiceWorker", false); 54 this._bypassServiceWorkerSetting = WebInspector.settings.createSetting('bypa ssServiceWorker', false);
55 if (this._bypassServiceWorkerSetting.get()) 55 if (this._bypassServiceWorkerSetting.get())
56 this._bypassServiceWorkerChanged(); 56 this._bypassServiceWorkerChanged();
57 this._bypassServiceWorkerSetting.addChangeListener(this._bypassServiceWorker Changed, this); 57 this._bypassServiceWorkerSetting.addChangeListener(this._bypassServiceWorker Changed, this);
58 58
59 WebInspector.moduleSetting("cacheDisabled").addChangeListener(this._cacheDis abledSettingChanged, this); 59 WebInspector.moduleSetting('cacheDisabled').addChangeListener(this._cacheDis abledSettingChanged, this);
60 }
61
62 /**
63 * @param {!WebInspector.Target} target
64 * @return {?WebInspector.NetworkManager}
65 */
66 static fromTarget(target) {
67 return /** @type {?WebInspector.NetworkManager} */ (target.model(WebInspecto r.NetworkManager));
68 }
69
70 /**
71 * @param {!WebInspector.NetworkManager.Conditions} conditions
72 * @return {!NetworkAgent.ConnectionType}
73 * TODO(allada): this belongs to NetworkConditionsSelector, which should hardc ode/guess it.
74 */
75 static _connectionType(conditions) {
76 if (!conditions.download && !conditions.upload)
77 return NetworkAgent.ConnectionType.None;
78 var types = WebInspector.NetworkManager._connectionTypes;
79 if (!types) {
80 WebInspector.NetworkManager._connectionTypes = [];
81 types = WebInspector.NetworkManager._connectionTypes;
82 types.push(['2g', NetworkAgent.ConnectionType.Cellular2g]);
83 types.push(['3g', NetworkAgent.ConnectionType.Cellular3g]);
84 types.push(['4g', NetworkAgent.ConnectionType.Cellular4g]);
85 types.push(['bluetooth', NetworkAgent.ConnectionType.Bluetooth]);
86 types.push(['wifi', NetworkAgent.ConnectionType.Wifi]);
87 types.push(['wimax', NetworkAgent.ConnectionType.Wimax]);
88 }
89 for (var type of types) {
90 if (conditions.title.toLowerCase().indexOf(type[0]) !== -1)
91 return type[1];
92 }
93 return NetworkAgent.ConnectionType.Other;
94 }
95
96 /**
97 * @param {string} url
98 * @return {!WebInspector.NetworkRequest}
99 */
100 inflightRequestForURL(url) {
101 return this._dispatcher._inflightRequestsByURL[url];
102 }
103
104 /**
105 * @param {!WebInspector.Event} event
106 */
107 _cacheDisabledSettingChanged(event) {
108 var enabled = /** @type {boolean} */ (event.data);
109 this._networkAgent.setCacheDisabled(enabled);
110 }
111
112 /**
113 * @override
114 */
115 dispose() {
116 WebInspector.moduleSetting('cacheDisabled').removeChangeListener(this._cache DisabledSettingChanged, this);
117 }
118
119 _bypassServiceWorkerChanged() {
120 this._networkAgent.setBypassServiceWorker(this._bypassServiceWorkerSetting.g et());
121 }
60 }; 122 };
61 123
62 /** @enum {symbol} */ 124 /** @enum {symbol} */
63 WebInspector.NetworkManager.Events = { 125 WebInspector.NetworkManager.Events = {
64 RequestStarted: Symbol("RequestStarted"), 126 RequestStarted: Symbol('RequestStarted'),
65 RequestUpdated: Symbol("RequestUpdated"), 127 RequestUpdated: Symbol('RequestUpdated'),
66 RequestFinished: Symbol("RequestFinished"), 128 RequestFinished: Symbol('RequestFinished'),
67 RequestUpdateDropped: Symbol("RequestUpdateDropped"), 129 RequestUpdateDropped: Symbol('RequestUpdateDropped'),
68 ResponseReceived: Symbol("ResponseReceived") 130 ResponseReceived: Symbol('ResponseReceived')
69 }; 131 };
70 132
71 WebInspector.NetworkManager._MIMETypes = { 133 WebInspector.NetworkManager._MIMETypes = {
72 "text/html": {"document": true}, 134 'text/html': {'document': true},
73 "text/xml": {"document": true}, 135 'text/xml': {'document': true},
74 "text/plain": {"document": true}, 136 'text/plain': {'document': true},
75 "application/xhtml+xml": {"document": true}, 137 'application/xhtml+xml': {'document': true},
76 "image/svg+xml": {"document": true}, 138 'image/svg+xml': {'document': true},
77 "text/css": {"stylesheet": true}, 139 'text/css': {'stylesheet': true},
78 "text/xsl": {"stylesheet": true}, 140 'text/xsl': {'stylesheet': true},
79 "text/vtt": {"texttrack": true}, 141 'text/vtt': {'texttrack': true},
80 }; 142 };
81 143
82 /**
83 * @param {!WebInspector.Target} target
84 * @return {?WebInspector.NetworkManager}
85 */
86 WebInspector.NetworkManager.fromTarget = function(target)
87 {
88 return /** @type {?WebInspector.NetworkManager} */ (target.model(WebInspecto r.NetworkManager));
89 };
90 144
91 /** @typedef {{download: number, upload: number, latency: number, title: string} } */ 145 /** @typedef {{download: number, upload: number, latency: number, title: string} } */
92 WebInspector.NetworkManager.Conditions; 146 WebInspector.NetworkManager.Conditions;
93 /** @type {!WebInspector.NetworkManager.Conditions} */ 147 /** @type {!WebInspector.NetworkManager.Conditions} */
94 WebInspector.NetworkManager.NoThrottlingConditions = {title: WebInspector.UIStri ng("No throttling"), download: -1, upload: -1, latency: 0}; 148 WebInspector.NetworkManager.NoThrottlingConditions = {
149 title: WebInspector.UIString('No throttling'),
150 download: -1,
151 upload: -1,
152 latency: 0
153 };
95 /** @type {!WebInspector.NetworkManager.Conditions} */ 154 /** @type {!WebInspector.NetworkManager.Conditions} */
96 WebInspector.NetworkManager.OfflineConditions = {title: WebInspector.UIString("O ffline"), download: 0, upload: 0, latency: 0}; 155 WebInspector.NetworkManager.OfflineConditions = {
156 title: WebInspector.UIString('Offline'),
157 download: 0,
158 upload: 0,
159 latency: 0
160 };
161
97 162
98 /** 163 /**
99 * @param {!WebInspector.NetworkManager.Conditions} conditions 164 * @implements {NetworkAgent.Dispatcher}
100 * @return {!NetworkAgent.ConnectionType} 165 * @unrestricted
101 * TODO(allada): this belongs to NetworkConditionsSelector, which should hardcod e/guess it.
102 */ 166 */
103 WebInspector.NetworkManager._connectionType = function(conditions) 167 WebInspector.NetworkDispatcher = class {
104 { 168 constructor(manager) {
105 if (!conditions.download && !conditions.upload)
106 return NetworkAgent.ConnectionType.None;
107 var types = WebInspector.NetworkManager._connectionTypes;
108 if (!types) {
109 WebInspector.NetworkManager._connectionTypes = [];
110 types = WebInspector.NetworkManager._connectionTypes;
111 types.push(["2g", NetworkAgent.ConnectionType.Cellular2g]);
112 types.push(["3g", NetworkAgent.ConnectionType.Cellular3g]);
113 types.push(["4g", NetworkAgent.ConnectionType.Cellular4g]);
114 types.push(["bluetooth", NetworkAgent.ConnectionType.Bluetooth]);
115 types.push(["wifi", NetworkAgent.ConnectionType.Wifi]);
116 types.push(["wimax", NetworkAgent.ConnectionType.Wimax]);
117 }
118 for (var type of types) {
119 if (conditions.title.toLowerCase().indexOf(type[0]) !== -1)
120 return type[1];
121 }
122 return NetworkAgent.ConnectionType.Other;
123 };
124
125 WebInspector.NetworkManager.prototype = {
126 /**
127 * @param {string} url
128 * @return {!WebInspector.NetworkRequest}
129 */
130 inflightRequestForURL: function(url)
131 {
132 return this._dispatcher._inflightRequestsByURL[url];
133 },
134
135 /**
136 * @param {!WebInspector.Event} event
137 */
138 _cacheDisabledSettingChanged: function(event)
139 {
140 var enabled = /** @type {boolean} */ (event.data);
141 this._networkAgent.setCacheDisabled(enabled);
142 },
143
144 dispose: function()
145 {
146 WebInspector.moduleSetting("cacheDisabled").removeChangeListener(this._c acheDisabledSettingChanged, this);
147 },
148
149 _bypassServiceWorkerChanged: function()
150 {
151 this._networkAgent.setBypassServiceWorker(this._bypassServiceWorkerSetti ng.get());
152 },
153
154 __proto__: WebInspector.SDKModel.prototype
155 };
156
157 /**
158 * @constructor
159 * @implements {NetworkAgent.Dispatcher}
160 */
161 WebInspector.NetworkDispatcher = function(manager)
162 {
163 this._manager = manager; 169 this._manager = manager;
164 this._inflightRequestsById = {}; 170 this._inflightRequestsById = {};
165 this._inflightRequestsByURL = {}; 171 this._inflightRequestsByURL = {};
172 }
173
174 /**
175 * @param {!NetworkAgent.Headers} headersMap
176 * @return {!Array.<!WebInspector.NetworkRequest.NameValue>}
177 */
178 _headersMapToHeadersArray(headersMap) {
179 var result = [];
180 for (var name in headersMap) {
181 var values = headersMap[name].split('\n');
182 for (var i = 0; i < values.length; ++i)
183 result.push({name: name, value: values[i]});
184 }
185 return result;
186 }
187
188 /**
189 * @param {!WebInspector.NetworkRequest} networkRequest
190 * @param {!NetworkAgent.Request} request
191 */
192 _updateNetworkRequestWithRequest(networkRequest, request) {
193 networkRequest.requestMethod = request.method;
194 networkRequest.setRequestHeaders(this._headersMapToHeadersArray(request.head ers));
195 networkRequest.requestFormData = request.postData;
196 networkRequest.setInitialPriority(request.initialPriority);
197 networkRequest.mixedContentType = request.mixedContentType || NetworkAgent.R equestMixedContentType.None;
198 }
199
200 /**
201 * @param {!WebInspector.NetworkRequest} networkRequest
202 * @param {!NetworkAgent.Response=} response
203 */
204 _updateNetworkRequestWithResponse(networkRequest, response) {
205 if (response.url && networkRequest.url !== response.url)
206 networkRequest.url = response.url;
207 networkRequest.mimeType = response.mimeType;
208 networkRequest.statusCode = response.status;
209 networkRequest.statusText = response.statusText;
210 networkRequest.responseHeaders = this._headersMapToHeadersArray(response.hea ders);
211 if (response.encodedDataLength >= 0)
212 networkRequest.setTransferSize(response.encodedDataLength);
213 if (response.headersText)
214 networkRequest.responseHeadersText = response.headersText;
215 if (response.requestHeaders) {
216 networkRequest.setRequestHeaders(this._headersMapToHeadersArray(response.r equestHeaders));
217 networkRequest.setRequestHeadersText(response.requestHeadersText || '');
218 }
219
220 networkRequest.connectionReused = response.connectionReused;
221 networkRequest.connectionId = String(response.connectionId);
222 if (response.remoteIPAddress)
223 networkRequest.setRemoteAddress(response.remoteIPAddress, response.remoteP ort || -1);
224
225 if (response.fromServiceWorker)
226 networkRequest.fetchedViaServiceWorker = true;
227
228 if (response.fromDiskCache)
229 networkRequest.setFromDiskCache();
230 networkRequest.timing = response.timing;
231
232 networkRequest.protocol = response.protocol;
233
234 networkRequest.setSecurityState(response.securityState);
235
236 if (!this._mimeTypeIsConsistentWithType(networkRequest)) {
237 var consoleModel = this._manager._target.consoleModel;
238 consoleModel.addMessage(new WebInspector.ConsoleMessage(
239 consoleModel.target(), WebInspector.ConsoleMessage.MessageSource.Netwo rk,
240 WebInspector.ConsoleMessage.MessageLevel.Log,
241 WebInspector.UIString(
242 'Resource interpreted as %s but transferred with MIME type %s: "%s ".',
243 networkRequest.resourceType().title(), networkRequest.mimeType, ne tworkRequest.url),
244 WebInspector.ConsoleMessage.MessageType.Log, '', 0, 0, networkRequest. requestId));
245 }
246
247 if (response.securityDetails)
248 networkRequest.setSecurityDetails(response.securityDetails);
249 }
250
251 /**
252 * @param {!WebInspector.NetworkRequest} networkRequest
253 * @return {boolean}
254 */
255 _mimeTypeIsConsistentWithType(networkRequest) {
256 // If status is an error, content is likely to be of an inconsistent type,
257 // as it's going to be an error message. We do not want to emit a warning
258 // for this, though, as this will already be reported as resource loading fa ilure.
259 // Also, if a URL like http://localhost/wiki/load.php?debug=true&lang=en pro duces text/css and gets reloaded,
260 // it is 304 Not Modified and its guessed mime-type is text/php, which is wr ong.
261 // Don't check for mime-types in 304-resources.
262 if (networkRequest.hasErrorStatusCode() || networkRequest.statusCode === 304 || networkRequest.statusCode === 204)
263 return true;
264
265 var resourceType = networkRequest.resourceType();
266 if (resourceType !== WebInspector.resourceTypes.Stylesheet &&
267 resourceType !== WebInspector.resourceTypes.Document && resourceType !== WebInspector.resourceTypes.TextTrack) {
268 return true;
269 }
270
271 if (!networkRequest.mimeType)
272 return true; // Might be not known for cached resources with null respons es.
273
274 if (networkRequest.mimeType in WebInspector.NetworkManager._MIMETypes)
275 return resourceType.name() in WebInspector.NetworkManager._MIMETypes[netwo rkRequest.mimeType];
276
277 return false;
278 }
279
280 /**
281 * @override
282 * @param {!NetworkAgent.RequestId} requestId
283 * @param {!NetworkAgent.ResourcePriority} newPriority
284 * @param {!NetworkAgent.Timestamp} timestamp
285 */
286 resourceChangedPriority(requestId, newPriority, timestamp) {
287 var networkRequest = this._inflightRequestsById[requestId];
288 if (networkRequest)
289 networkRequest.setPriority(newPriority);
290 }
291
292 /**
293 * @override
294 * @param {!NetworkAgent.RequestId} requestId
295 * @param {!PageAgent.FrameId} frameId
296 * @param {!NetworkAgent.LoaderId} loaderId
297 * @param {string} documentURL
298 * @param {!NetworkAgent.Request} request
299 * @param {!NetworkAgent.Timestamp} time
300 * @param {!NetworkAgent.Timestamp} wallTime
301 * @param {!NetworkAgent.Initiator} initiator
302 * @param {!NetworkAgent.Response=} redirectResponse
303 * @param {!PageAgent.ResourceType=} resourceType
304 */
305 requestWillBeSent(
306 requestId,
307 frameId,
308 loaderId,
309 documentURL,
310 request,
311 time,
312 wallTime,
313 initiator,
314 redirectResponse,
315 resourceType) {
316 var networkRequest = this._inflightRequestsById[requestId];
317 if (networkRequest) {
318 // FIXME: move this check to the backend.
319 if (!redirectResponse)
320 return;
321 this.responseReceived(requestId, frameId, loaderId, time, PageAgent.Resour ceType.Other, redirectResponse);
322 networkRequest = this._appendRedirect(requestId, time, request.url);
323 } else
324 networkRequest = this._createNetworkRequest(requestId, frameId, loaderId, request.url, documentURL, initiator);
325 networkRequest.hasNetworkData = true;
326 this._updateNetworkRequestWithRequest(networkRequest, request);
327 networkRequest.setIssueTime(time, wallTime);
328 networkRequest.setResourceType(WebInspector.resourceTypes[resourceType]);
329
330 this._startNetworkRequest(networkRequest);
331 }
332
333 /**
334 * @override
335 * @param {!NetworkAgent.RequestId} requestId
336 */
337 requestServedFromCache(requestId) {
338 var networkRequest = this._inflightRequestsById[requestId];
339 if (!networkRequest)
340 return;
341
342 networkRequest.setFromMemoryCache();
343 }
344
345 /**
346 * @override
347 * @param {!NetworkAgent.RequestId} requestId
348 * @param {!PageAgent.FrameId} frameId
349 * @param {!NetworkAgent.LoaderId} loaderId
350 * @param {!NetworkAgent.Timestamp} time
351 * @param {!PageAgent.ResourceType} resourceType
352 * @param {!NetworkAgent.Response} response
353 */
354 responseReceived(requestId, frameId, loaderId, time, resourceType, response) {
355 var networkRequest = this._inflightRequestsById[requestId];
356 if (!networkRequest) {
357 // We missed the requestWillBeSent.
358 var eventData = {};
359 eventData.url = response.url;
360 eventData.frameId = frameId;
361 eventData.loaderId = loaderId;
362 eventData.resourceType = resourceType;
363 eventData.mimeType = response.mimeType;
364 var lastModifiedHeader = response.headers['last-modified'];
365 eventData.lastModified = lastModifiedHeader ? new Date(lastModifiedHeader) : null;
366 this._manager.dispatchEventToListeners(WebInspector.NetworkManager.Events. RequestUpdateDropped, eventData);
367 return;
368 }
369
370 networkRequest.responseReceivedTime = time;
371 networkRequest.setResourceType(WebInspector.resourceTypes[resourceType]);
372
373 this._updateNetworkRequestWithResponse(networkRequest, response);
374
375 this._updateNetworkRequest(networkRequest);
376 this._manager.dispatchEventToListeners(WebInspector.NetworkManager.Events.Re sponseReceived, networkRequest);
377 }
378
379 /**
380 * @override
381 * @param {!NetworkAgent.RequestId} requestId
382 * @param {!NetworkAgent.Timestamp} time
383 * @param {number} dataLength
384 * @param {number} encodedDataLength
385 */
386 dataReceived(requestId, time, dataLength, encodedDataLength) {
387 var networkRequest = this._inflightRequestsById[requestId];
388 if (!networkRequest)
389 return;
390
391 networkRequest.resourceSize += dataLength;
392 if (encodedDataLength !== -1)
393 networkRequest.increaseTransferSize(encodedDataLength);
394 networkRequest.endTime = time;
395
396 this._updateNetworkRequest(networkRequest);
397 }
398
399 /**
400 * @override
401 * @param {!NetworkAgent.RequestId} requestId
402 * @param {!NetworkAgent.Timestamp} finishTime
403 * @param {number} encodedDataLength
404 */
405 loadingFinished(requestId, finishTime, encodedDataLength) {
406 var networkRequest = this._inflightRequestsById[requestId];
407 if (!networkRequest)
408 return;
409 this._finishNetworkRequest(networkRequest, finishTime, encodedDataLength);
410 }
411
412 /**
413 * @override
414 * @param {!NetworkAgent.RequestId} requestId
415 * @param {!NetworkAgent.Timestamp} time
416 * @param {!PageAgent.ResourceType} resourceType
417 * @param {string} localizedDescription
418 * @param {boolean=} canceled
419 * @param {!NetworkAgent.BlockedReason=} blockedReason
420 */
421 loadingFailed(requestId, time, resourceType, localizedDescription, canceled, b lockedReason) {
422 var networkRequest = this._inflightRequestsById[requestId];
423 if (!networkRequest)
424 return;
425
426 networkRequest.failed = true;
427 networkRequest.setResourceType(WebInspector.resourceTypes[resourceType]);
428 networkRequest.canceled = canceled;
429 if (blockedReason) {
430 networkRequest.setBlockedReason(blockedReason);
431 if (blockedReason === NetworkAgent.BlockedReason.Inspector) {
432 var consoleModel = this._manager._target.consoleModel;
433 consoleModel.addMessage(new WebInspector.ConsoleMessage(
434 consoleModel.target(), WebInspector.ConsoleMessage.MessageSource.Net work,
435 WebInspector.ConsoleMessage.MessageLevel.Warning,
436 WebInspector.UIString('Request was blocked by DevTools: "%s".', netw orkRequest.url),
437 WebInspector.ConsoleMessage.MessageType.Log, '', 0, 0, networkReques t.requestId));
438 }
439 }
440 networkRequest.localizedFailDescription = localizedDescription;
441 this._finishNetworkRequest(networkRequest, time, -1);
442 }
443
444 /**
445 * @override
446 * @param {!NetworkAgent.RequestId} requestId
447 * @param {string} requestURL
448 * @param {!NetworkAgent.Initiator=} initiator
449 */
450 webSocketCreated(requestId, requestURL, initiator) {
451 var networkRequest =
452 new WebInspector.NetworkRequest(this._manager._target, requestId, reques tURL, '', '', '', initiator || null);
453 networkRequest.setResourceType(WebInspector.resourceTypes.WebSocket);
454 this._startNetworkRequest(networkRequest);
455 }
456
457 /**
458 * @override
459 * @param {!NetworkAgent.RequestId} requestId
460 * @param {!NetworkAgent.Timestamp} time
461 * @param {!NetworkAgent.Timestamp} wallTime
462 * @param {!NetworkAgent.WebSocketRequest} request
463 */
464 webSocketWillSendHandshakeRequest(requestId, time, wallTime, request) {
465 var networkRequest = this._inflightRequestsById[requestId];
466 if (!networkRequest)
467 return;
468
469 networkRequest.requestMethod = 'GET';
470 networkRequest.setRequestHeaders(this._headersMapToHeadersArray(request.head ers));
471 networkRequest.setIssueTime(time, wallTime);
472
473 this._updateNetworkRequest(networkRequest);
474 }
475
476 /**
477 * @override
478 * @param {!NetworkAgent.RequestId} requestId
479 * @param {!NetworkAgent.Timestamp} time
480 * @param {!NetworkAgent.WebSocketResponse} response
481 */
482 webSocketHandshakeResponseReceived(requestId, time, response) {
483 var networkRequest = this._inflightRequestsById[requestId];
484 if (!networkRequest)
485 return;
486
487 networkRequest.statusCode = response.status;
488 networkRequest.statusText = response.statusText;
489 networkRequest.responseHeaders = this._headersMapToHeadersArray(response.hea ders);
490 networkRequest.responseHeadersText = response.headersText;
491 if (response.requestHeaders)
492 networkRequest.setRequestHeaders(this._headersMapToHeadersArray(response.r equestHeaders));
493 if (response.requestHeadersText)
494 networkRequest.setRequestHeadersText(response.requestHeadersText);
495 networkRequest.responseReceivedTime = time;
496 networkRequest.protocol = 'websocket';
497
498 this._updateNetworkRequest(networkRequest);
499 }
500
501 /**
502 * @override
503 * @param {!NetworkAgent.RequestId} requestId
504 * @param {!NetworkAgent.Timestamp} time
505 * @param {!NetworkAgent.WebSocketFrame} response
506 */
507 webSocketFrameReceived(requestId, time, response) {
508 var networkRequest = this._inflightRequestsById[requestId];
509 if (!networkRequest)
510 return;
511
512 networkRequest.addFrame(response, time);
513 networkRequest.responseReceivedTime = time;
514
515 this._updateNetworkRequest(networkRequest);
516 }
517
518 /**
519 * @override
520 * @param {!NetworkAgent.RequestId} requestId
521 * @param {!NetworkAgent.Timestamp} time
522 * @param {!NetworkAgent.WebSocketFrame} response
523 */
524 webSocketFrameSent(requestId, time, response) {
525 var networkRequest = this._inflightRequestsById[requestId];
526 if (!networkRequest)
527 return;
528
529 networkRequest.addFrame(response, time, true);
530 networkRequest.responseReceivedTime = time;
531
532 this._updateNetworkRequest(networkRequest);
533 }
534
535 /**
536 * @override
537 * @param {!NetworkAgent.RequestId} requestId
538 * @param {!NetworkAgent.Timestamp} time
539 * @param {string} errorMessage
540 */
541 webSocketFrameError(requestId, time, errorMessage) {
542 var networkRequest = this._inflightRequestsById[requestId];
543 if (!networkRequest)
544 return;
545
546 networkRequest.addFrameError(errorMessage, time);
547 networkRequest.responseReceivedTime = time;
548
549 this._updateNetworkRequest(networkRequest);
550 }
551
552 /**
553 * @override
554 * @param {!NetworkAgent.RequestId} requestId
555 * @param {!NetworkAgent.Timestamp} time
556 */
557 webSocketClosed(requestId, time) {
558 var networkRequest = this._inflightRequestsById[requestId];
559 if (!networkRequest)
560 return;
561 this._finishNetworkRequest(networkRequest, time, -1);
562 }
563
564 /**
565 * @override
566 * @param {!NetworkAgent.RequestId} requestId
567 * @param {!NetworkAgent.Timestamp} time
568 * @param {string} eventName
569 * @param {string} eventId
570 * @param {string} data
571 */
572 eventSourceMessageReceived(requestId, time, eventName, eventId, data) {
573 var networkRequest = this._inflightRequestsById[requestId];
574 if (!networkRequest)
575 return;
576 networkRequest.addEventSourceMessage(time, eventName, eventId, data);
577 }
578
579 /**
580 * @param {!NetworkAgent.RequestId} requestId
581 * @param {!NetworkAgent.Timestamp} time
582 * @param {string} redirectURL
583 * @return {!WebInspector.NetworkRequest}
584 */
585 _appendRedirect(requestId, time, redirectURL) {
586 var originalNetworkRequest = this._inflightRequestsById[requestId];
587 var previousRedirects = originalNetworkRequest.redirects || [];
588 originalNetworkRequest.requestId = requestId + ':redirected.' + previousRedi rects.length;
589 delete originalNetworkRequest.redirects;
590 if (previousRedirects.length > 0)
591 originalNetworkRequest.redirectSource = previousRedirects[previousRedirect s.length - 1];
592 this._finishNetworkRequest(originalNetworkRequest, time, -1);
593 var newNetworkRequest = this._createNetworkRequest(
594 requestId, originalNetworkRequest.frameId, originalNetworkRequest.loader Id, redirectURL,
595 originalNetworkRequest.documentURL, originalNetworkRequest.initiator());
596 newNetworkRequest.redirects = previousRedirects.concat(originalNetworkReques t);
597 return newNetworkRequest;
598 }
599
600 /**
601 * @param {!WebInspector.NetworkRequest} networkRequest
602 */
603 _startNetworkRequest(networkRequest) {
604 this._inflightRequestsById[networkRequest.requestId] = networkRequest;
605 this._inflightRequestsByURL[networkRequest.url] = networkRequest;
606 this._dispatchEventToListeners(WebInspector.NetworkManager.Events.RequestSta rted, networkRequest);
607 }
608
609 /**
610 * @param {!WebInspector.NetworkRequest} networkRequest
611 */
612 _updateNetworkRequest(networkRequest) {
613 this._dispatchEventToListeners(WebInspector.NetworkManager.Events.RequestUpd ated, networkRequest);
614 }
615
616 /**
617 * @param {!WebInspector.NetworkRequest} networkRequest
618 * @param {!NetworkAgent.Timestamp} finishTime
619 * @param {number} encodedDataLength
620 */
621 _finishNetworkRequest(networkRequest, finishTime, encodedDataLength) {
622 networkRequest.endTime = finishTime;
623 networkRequest.finished = true;
624 if (encodedDataLength >= 0)
625 networkRequest.setTransferSize(encodedDataLength);
626 this._dispatchEventToListeners(WebInspector.NetworkManager.Events.RequestFin ished, networkRequest);
627 delete this._inflightRequestsById[networkRequest.requestId];
628 delete this._inflightRequestsByURL[networkRequest.url];
629 }
630
631 /**
632 * @param {string} eventType
633 * @param {!WebInspector.NetworkRequest} networkRequest
634 */
635 _dispatchEventToListeners(eventType, networkRequest) {
636 this._manager.dispatchEventToListeners(eventType, networkRequest);
637 }
638
639 /**
640 * @param {!NetworkAgent.RequestId} requestId
641 * @param {string} frameId
642 * @param {!NetworkAgent.LoaderId} loaderId
643 * @param {string} url
644 * @param {string} documentURL
645 * @param {?NetworkAgent.Initiator} initiator
646 */
647 _createNetworkRequest(requestId, frameId, loaderId, url, documentURL, initiato r) {
648 return new WebInspector.NetworkRequest(
649 this._manager._target, requestId, url, documentURL, frameId, loaderId, i nitiator);
650 }
166 }; 651 };
167 652
168 WebInspector.NetworkDispatcher.prototype = {
169 /**
170 * @param {!NetworkAgent.Headers} headersMap
171 * @return {!Array.<!WebInspector.NetworkRequest.NameValue>}
172 */
173 _headersMapToHeadersArray: function(headersMap)
174 {
175 var result = [];
176 for (var name in headersMap) {
177 var values = headersMap[name].split("\n");
178 for (var i = 0; i < values.length; ++i)
179 result.push({name: name, value: values[i]});
180 }
181 return result;
182 },
183
184 /**
185 * @param {!WebInspector.NetworkRequest} networkRequest
186 * @param {!NetworkAgent.Request} request
187 */
188 _updateNetworkRequestWithRequest: function(networkRequest, request)
189 {
190 networkRequest.requestMethod = request.method;
191 networkRequest.setRequestHeaders(this._headersMapToHeadersArray(request. headers));
192 networkRequest.requestFormData = request.postData;
193 networkRequest.setInitialPriority(request.initialPriority);
194 networkRequest.mixedContentType = request.mixedContentType || NetworkAge nt.RequestMixedContentType.None;
195 },
196
197 /**
198 * @param {!WebInspector.NetworkRequest} networkRequest
199 * @param {!NetworkAgent.Response=} response
200 */
201 _updateNetworkRequestWithResponse: function(networkRequest, response)
202 {
203 if (response.url && networkRequest.url !== response.url)
204 networkRequest.url = response.url;
205 networkRequest.mimeType = response.mimeType;
206 networkRequest.statusCode = response.status;
207 networkRequest.statusText = response.statusText;
208 networkRequest.responseHeaders = this._headersMapToHeadersArray(response .headers);
209 if (response.encodedDataLength >= 0)
210 networkRequest.setTransferSize(response.encodedDataLength);
211 if (response.headersText)
212 networkRequest.responseHeadersText = response.headersText;
213 if (response.requestHeaders) {
214 networkRequest.setRequestHeaders(this._headersMapToHeadersArray(resp onse.requestHeaders));
215 networkRequest.setRequestHeadersText(response.requestHeadersText || "");
216 }
217
218 networkRequest.connectionReused = response.connectionReused;
219 networkRequest.connectionId = String(response.connectionId);
220 if (response.remoteIPAddress)
221 networkRequest.setRemoteAddress(response.remoteIPAddress, response.r emotePort || -1);
222
223 if (response.fromServiceWorker)
224 networkRequest.fetchedViaServiceWorker = true;
225
226 if (response.fromDiskCache)
227 networkRequest.setFromDiskCache();
228 networkRequest.timing = response.timing;
229
230 networkRequest.protocol = response.protocol;
231
232 networkRequest.setSecurityState(response.securityState);
233
234 if (!this._mimeTypeIsConsistentWithType(networkRequest)) {
235 var consoleModel = this._manager._target.consoleModel;
236 consoleModel.addMessage(new WebInspector.ConsoleMessage(consoleModel .target(), WebInspector.ConsoleMessage.MessageSource.Network,
237 WebInspector.ConsoleMessage.MessageLevel.Log,
238 WebInspector.UIString("Resource interpreted as %s but transferre d with MIME type %s: \"%s\".", networkRequest.resourceType().title(), networkReq uest.mimeType, networkRequest.url),
239 WebInspector.ConsoleMessage.MessageType.Log,
240 "",
241 0,
242 0,
243 networkRequest.requestId));
244 }
245
246 if (response.securityDetails)
247 networkRequest.setSecurityDetails(response.securityDetails);
248 },
249
250 /**
251 * @param {!WebInspector.NetworkRequest} networkRequest
252 * @return {boolean}
253 */
254 _mimeTypeIsConsistentWithType: function(networkRequest)
255 {
256 // If status is an error, content is likely to be of an inconsistent typ e,
257 // as it's going to be an error message. We do not want to emit a warnin g
258 // for this, though, as this will already be reported as resource loadin g failure.
259 // Also, if a URL like http://localhost/wiki/load.php?debug=true&lang=en produces text/css and gets reloaded,
260 // it is 304 Not Modified and its guessed mime-type is text/php, which i s wrong.
261 // Don't check for mime-types in 304-resources.
262 if (networkRequest.hasErrorStatusCode() || networkRequest.statusCode === 304 || networkRequest.statusCode === 204)
263 return true;
264
265 var resourceType = networkRequest.resourceType();
266 if (resourceType !== WebInspector.resourceTypes.Stylesheet &&
267 resourceType !== WebInspector.resourceTypes.Document &&
268 resourceType !== WebInspector.resourceTypes.TextTrack) {
269 return true;
270 }
271
272 if (!networkRequest.mimeType)
273 return true; // Might be not known for cached resources with null re sponses.
274
275 if (networkRequest.mimeType in WebInspector.NetworkManager._MIMETypes)
276 return resourceType.name() in WebInspector.NetworkManager._MIMETypes [networkRequest.mimeType];
277
278 return false;
279 },
280
281 /**
282 * @override
283 * @param {!NetworkAgent.RequestId} requestId
284 * @param {!NetworkAgent.ResourcePriority} newPriority
285 * @param {!NetworkAgent.Timestamp} timestamp
286 */
287 resourceChangedPriority: function(requestId, newPriority, timestamp)
288 {
289 var networkRequest = this._inflightRequestsById[requestId];
290 if (networkRequest)
291 networkRequest.setPriority(newPriority);
292 },
293
294 /**
295 * @override
296 * @param {!NetworkAgent.RequestId} requestId
297 * @param {!PageAgent.FrameId} frameId
298 * @param {!NetworkAgent.LoaderId} loaderId
299 * @param {string} documentURL
300 * @param {!NetworkAgent.Request} request
301 * @param {!NetworkAgent.Timestamp} time
302 * @param {!NetworkAgent.Timestamp} wallTime
303 * @param {!NetworkAgent.Initiator} initiator
304 * @param {!NetworkAgent.Response=} redirectResponse
305 * @param {!PageAgent.ResourceType=} resourceType
306 */
307 requestWillBeSent: function(requestId, frameId, loaderId, documentURL, reque st, time, wallTime, initiator, redirectResponse, resourceType)
308 {
309 var networkRequest = this._inflightRequestsById[requestId];
310 if (networkRequest) {
311 // FIXME: move this check to the backend.
312 if (!redirectResponse)
313 return;
314 this.responseReceived(requestId, frameId, loaderId, time, PageAgent. ResourceType.Other, redirectResponse);
315 networkRequest = this._appendRedirect(requestId, time, request.url);
316 } else
317 networkRequest = this._createNetworkRequest(requestId, frameId, load erId, request.url, documentURL, initiator);
318 networkRequest.hasNetworkData = true;
319 this._updateNetworkRequestWithRequest(networkRequest, request);
320 networkRequest.setIssueTime(time, wallTime);
321 networkRequest.setResourceType(WebInspector.resourceTypes[resourceType]) ;
322
323 this._startNetworkRequest(networkRequest);
324 },
325
326 /**
327 * @override
328 * @param {!NetworkAgent.RequestId} requestId
329 */
330 requestServedFromCache: function(requestId)
331 {
332 var networkRequest = this._inflightRequestsById[requestId];
333 if (!networkRequest)
334 return;
335
336 networkRequest.setFromMemoryCache();
337 },
338
339 /**
340 * @override
341 * @param {!NetworkAgent.RequestId} requestId
342 * @param {!PageAgent.FrameId} frameId
343 * @param {!NetworkAgent.LoaderId} loaderId
344 * @param {!NetworkAgent.Timestamp} time
345 * @param {!PageAgent.ResourceType} resourceType
346 * @param {!NetworkAgent.Response} response
347 */
348 responseReceived: function(requestId, frameId, loaderId, time, resourceType, response)
349 {
350 var networkRequest = this._inflightRequestsById[requestId];
351 if (!networkRequest) {
352 // We missed the requestWillBeSent.
353 var eventData = {};
354 eventData.url = response.url;
355 eventData.frameId = frameId;
356 eventData.loaderId = loaderId;
357 eventData.resourceType = resourceType;
358 eventData.mimeType = response.mimeType;
359 var lastModifiedHeader = response.headers["last-modified"];
360 eventData.lastModified = lastModifiedHeader ? new Date(lastModifiedH eader) : null;
361 this._manager.dispatchEventToListeners(WebInspector.NetworkManager.E vents.RequestUpdateDropped, eventData);
362 return;
363 }
364
365 networkRequest.responseReceivedTime = time;
366 networkRequest.setResourceType(WebInspector.resourceTypes[resourceType]) ;
367
368 this._updateNetworkRequestWithResponse(networkRequest, response);
369
370 this._updateNetworkRequest(networkRequest);
371 this._manager.dispatchEventToListeners(WebInspector.NetworkManager.Event s.ResponseReceived, networkRequest);
372 },
373
374 /**
375 * @override
376 * @param {!NetworkAgent.RequestId} requestId
377 * @param {!NetworkAgent.Timestamp} time
378 * @param {number} dataLength
379 * @param {number} encodedDataLength
380 */
381 dataReceived: function(requestId, time, dataLength, encodedDataLength)
382 {
383 var networkRequest = this._inflightRequestsById[requestId];
384 if (!networkRequest)
385 return;
386
387 networkRequest.resourceSize += dataLength;
388 if (encodedDataLength !== -1)
389 networkRequest.increaseTransferSize(encodedDataLength);
390 networkRequest.endTime = time;
391
392 this._updateNetworkRequest(networkRequest);
393 },
394
395 /**
396 * @override
397 * @param {!NetworkAgent.RequestId} requestId
398 * @param {!NetworkAgent.Timestamp} finishTime
399 * @param {number} encodedDataLength
400 */
401 loadingFinished: function(requestId, finishTime, encodedDataLength)
402 {
403 var networkRequest = this._inflightRequestsById[requestId];
404 if (!networkRequest)
405 return;
406 this._finishNetworkRequest(networkRequest, finishTime, encodedDataLength );
407 },
408
409 /**
410 * @override
411 * @param {!NetworkAgent.RequestId} requestId
412 * @param {!NetworkAgent.Timestamp} time
413 * @param {!PageAgent.ResourceType} resourceType
414 * @param {string} localizedDescription
415 * @param {boolean=} canceled
416 * @param {!NetworkAgent.BlockedReason=} blockedReason
417 */
418 loadingFailed: function(requestId, time, resourceType, localizedDescription, canceled, blockedReason)
419 {
420 var networkRequest = this._inflightRequestsById[requestId];
421 if (!networkRequest)
422 return;
423
424 networkRequest.failed = true;
425 networkRequest.setResourceType(WebInspector.resourceTypes[resourceType]) ;
426 networkRequest.canceled = canceled;
427 if (blockedReason) {
428 networkRequest.setBlockedReason(blockedReason);
429 if (blockedReason === NetworkAgent.BlockedReason.Inspector) {
430 var consoleModel = this._manager._target.consoleModel;
431 consoleModel.addMessage(new WebInspector.ConsoleMessage(consoleM odel.target(), WebInspector.ConsoleMessage.MessageSource.Network,
432 WebInspector.ConsoleMessage.MessageLevel.Warning,
433 WebInspector.UIString("Request was blocked by DevTools: \"%s \".", networkRequest.url),
434 WebInspector.ConsoleMessage.MessageType.Log,
435 "",
436 0,
437 0,
438 networkRequest.requestId));
439 }
440 }
441 networkRequest.localizedFailDescription = localizedDescription;
442 this._finishNetworkRequest(networkRequest, time, -1);
443 },
444
445 /**
446 * @override
447 * @param {!NetworkAgent.RequestId} requestId
448 * @param {string} requestURL
449 * @param {!NetworkAgent.Initiator=} initiator
450 */
451 webSocketCreated: function(requestId, requestURL, initiator)
452 {
453 var networkRequest = new WebInspector.NetworkRequest(this._manager._targ et, requestId, requestURL, "", "", "", initiator || null);
454 networkRequest.setResourceType(WebInspector.resourceTypes.WebSocket);
455 this._startNetworkRequest(networkRequest);
456 },
457
458 /**
459 * @override
460 * @param {!NetworkAgent.RequestId} requestId
461 * @param {!NetworkAgent.Timestamp} time
462 * @param {!NetworkAgent.Timestamp} wallTime
463 * @param {!NetworkAgent.WebSocketRequest} request
464 */
465 webSocketWillSendHandshakeRequest: function(requestId, time, wallTime, reque st)
466 {
467 var networkRequest = this._inflightRequestsById[requestId];
468 if (!networkRequest)
469 return;
470
471 networkRequest.requestMethod = "GET";
472 networkRequest.setRequestHeaders(this._headersMapToHeadersArray(request. headers));
473 networkRequest.setIssueTime(time, wallTime);
474
475 this._updateNetworkRequest(networkRequest);
476 },
477
478 /**
479 * @override
480 * @param {!NetworkAgent.RequestId} requestId
481 * @param {!NetworkAgent.Timestamp} time
482 * @param {!NetworkAgent.WebSocketResponse} response
483 */
484 webSocketHandshakeResponseReceived: function(requestId, time, response)
485 {
486 var networkRequest = this._inflightRequestsById[requestId];
487 if (!networkRequest)
488 return;
489
490 networkRequest.statusCode = response.status;
491 networkRequest.statusText = response.statusText;
492 networkRequest.responseHeaders = this._headersMapToHeadersArray(response .headers);
493 networkRequest.responseHeadersText = response.headersText;
494 if (response.requestHeaders)
495 networkRequest.setRequestHeaders(this._headersMapToHeadersArray(resp onse.requestHeaders));
496 if (response.requestHeadersText)
497 networkRequest.setRequestHeadersText(response.requestHeadersText);
498 networkRequest.responseReceivedTime = time;
499 networkRequest.protocol = "websocket";
500
501 this._updateNetworkRequest(networkRequest);
502 },
503
504 /**
505 * @override
506 * @param {!NetworkAgent.RequestId} requestId
507 * @param {!NetworkAgent.Timestamp} time
508 * @param {!NetworkAgent.WebSocketFrame} response
509 */
510 webSocketFrameReceived: function(requestId, time, response)
511 {
512 var networkRequest = this._inflightRequestsById[requestId];
513 if (!networkRequest)
514 return;
515
516 networkRequest.addFrame(response, time);
517 networkRequest.responseReceivedTime = time;
518
519 this._updateNetworkRequest(networkRequest);
520 },
521
522 /**
523 * @override
524 * @param {!NetworkAgent.RequestId} requestId
525 * @param {!NetworkAgent.Timestamp} time
526 * @param {!NetworkAgent.WebSocketFrame} response
527 */
528 webSocketFrameSent: function(requestId, time, response)
529 {
530 var networkRequest = this._inflightRequestsById[requestId];
531 if (!networkRequest)
532 return;
533
534 networkRequest.addFrame(response, time, true);
535 networkRequest.responseReceivedTime = time;
536
537 this._updateNetworkRequest(networkRequest);
538 },
539
540 /**
541 * @override
542 * @param {!NetworkAgent.RequestId} requestId
543 * @param {!NetworkAgent.Timestamp} time
544 * @param {string} errorMessage
545 */
546 webSocketFrameError: function(requestId, time, errorMessage)
547 {
548 var networkRequest = this._inflightRequestsById[requestId];
549 if (!networkRequest)
550 return;
551
552 networkRequest.addFrameError(errorMessage, time);
553 networkRequest.responseReceivedTime = time;
554
555 this._updateNetworkRequest(networkRequest);
556 },
557
558 /**
559 * @override
560 * @param {!NetworkAgent.RequestId} requestId
561 * @param {!NetworkAgent.Timestamp} time
562 */
563 webSocketClosed: function(requestId, time)
564 {
565 var networkRequest = this._inflightRequestsById[requestId];
566 if (!networkRequest)
567 return;
568 this._finishNetworkRequest(networkRequest, time, -1);
569 },
570
571 /**
572 * @override
573 * @param {!NetworkAgent.RequestId} requestId
574 * @param {!NetworkAgent.Timestamp} time
575 * @param {string} eventName
576 * @param {string} eventId
577 * @param {string} data
578 */
579 eventSourceMessageReceived: function(requestId, time, eventName, eventId, da ta)
580 {
581 var networkRequest = this._inflightRequestsById[requestId];
582 if (!networkRequest)
583 return;
584 networkRequest.addEventSourceMessage(time, eventName, eventId, data);
585 },
586
587 /**
588 * @param {!NetworkAgent.RequestId} requestId
589 * @param {!NetworkAgent.Timestamp} time
590 * @param {string} redirectURL
591 * @return {!WebInspector.NetworkRequest}
592 */
593 _appendRedirect: function(requestId, time, redirectURL)
594 {
595 var originalNetworkRequest = this._inflightRequestsById[requestId];
596 var previousRedirects = originalNetworkRequest.redirects || [];
597 originalNetworkRequest.requestId = requestId + ":redirected." + previous Redirects.length;
598 delete originalNetworkRequest.redirects;
599 if (previousRedirects.length > 0)
600 originalNetworkRequest.redirectSource = previousRedirects[previousRe directs.length - 1];
601 this._finishNetworkRequest(originalNetworkRequest, time, -1);
602 var newNetworkRequest = this._createNetworkRequest(requestId, originalNe tworkRequest.frameId, originalNetworkRequest.loaderId,
603 redirectURL, originalNetworkRequest.documentURL, originalNetworkReq uest.initiator());
604 newNetworkRequest.redirects = previousRedirects.concat(originalNetworkRe quest);
605 return newNetworkRequest;
606 },
607
608 /**
609 * @param {!WebInspector.NetworkRequest} networkRequest
610 */
611 _startNetworkRequest: function(networkRequest)
612 {
613 this._inflightRequestsById[networkRequest.requestId] = networkRequest;
614 this._inflightRequestsByURL[networkRequest.url] = networkRequest;
615 this._dispatchEventToListeners(WebInspector.NetworkManager.Events.Reques tStarted, networkRequest);
616 },
617
618 /**
619 * @param {!WebInspector.NetworkRequest} networkRequest
620 */
621 _updateNetworkRequest: function(networkRequest)
622 {
623 this._dispatchEventToListeners(WebInspector.NetworkManager.Events.Reques tUpdated, networkRequest);
624 },
625
626 /**
627 * @param {!WebInspector.NetworkRequest} networkRequest
628 * @param {!NetworkAgent.Timestamp} finishTime
629 * @param {number} encodedDataLength
630 */
631 _finishNetworkRequest: function(networkRequest, finishTime, encodedDataLengt h)
632 {
633 networkRequest.endTime = finishTime;
634 networkRequest.finished = true;
635 if (encodedDataLength >= 0)
636 networkRequest.setTransferSize(encodedDataLength);
637 this._dispatchEventToListeners(WebInspector.NetworkManager.Events.Reques tFinished, networkRequest);
638 delete this._inflightRequestsById[networkRequest.requestId];
639 delete this._inflightRequestsByURL[networkRequest.url];
640 },
641
642 /**
643 * @param {string} eventType
644 * @param {!WebInspector.NetworkRequest} networkRequest
645 */
646 _dispatchEventToListeners: function(eventType, networkRequest)
647 {
648 this._manager.dispatchEventToListeners(eventType, networkRequest);
649 },
650
651 /**
652 * @param {!NetworkAgent.RequestId} requestId
653 * @param {string} frameId
654 * @param {!NetworkAgent.LoaderId} loaderId
655 * @param {string} url
656 * @param {string} documentURL
657 * @param {?NetworkAgent.Initiator} initiator
658 */
659 _createNetworkRequest: function(requestId, frameId, loaderId, url, documentU RL, initiator)
660 {
661 return new WebInspector.NetworkRequest(this._manager._target, requestId, url, documentURL, frameId, loaderId, initiator);
662 }
663 };
664
665
666 /** 653 /**
667 * @constructor
668 * @extends {WebInspector.Object}
669 * @implements {WebInspector.TargetManager.Observer} 654 * @implements {WebInspector.TargetManager.Observer}
655 * @unrestricted
670 */ 656 */
671 WebInspector.MultitargetNetworkManager = function() 657 WebInspector.MultitargetNetworkManager = class extends WebInspector.Object {
672 { 658 constructor() {
673 WebInspector.Object.call(this); 659 super();
674 660
675 /** @type {!Set<string>} */ 661 /** @type {!Set<string>} */
676 this._blockedURLs = new Set(); 662 this._blockedURLs = new Set();
677 this._blockedSetting = WebInspector.moduleSetting("blockedURLs"); 663 this._blockedSetting = WebInspector.moduleSetting('blockedURLs');
678 this._blockedSetting.addChangeListener(this._updateBlockedURLs, this); 664 this._blockedSetting.addChangeListener(this._updateBlockedURLs, this);
679 this._blockedSetting.set([]); 665 this._blockedSetting.set([]);
680 this._updateBlockedURLs(); 666 this._updateBlockedURLs();
681 667
682 this._userAgentOverride = ""; 668 this._userAgentOverride = '';
683 /** @type {!Set<!Protocol.NetworkAgent>} */ 669 /** @type {!Set<!Protocol.NetworkAgent>} */
684 this._agents = new Set(); 670 this._agents = new Set();
685 /** @type {!WebInspector.NetworkManager.Conditions} */ 671 /** @type {!WebInspector.NetworkManager.Conditions} */
686 this._networkConditions = WebInspector.NetworkManager.NoThrottlingConditions ; 672 this._networkConditions = WebInspector.NetworkManager.NoThrottlingConditions ;
687 673
688 WebInspector.targetManager.observeTargets(this, WebInspector.Target.Capabili ty.Network); 674 WebInspector.targetManager.observeTargets(this, WebInspector.Target.Capabili ty.Network);
675 }
676
677 /**
678 * @param {string} uaString
679 * @return {string}
680 */
681 static patchUserAgentWithChromeVersion(uaString) {
682 // Patches Chrome/CriOS version from user agent ("1.2.3.4" when user agent i s: "Chrome/1.2.3.4").
683 var chromeRegex = new RegExp('(?:^|\\W)Chrome/(\\S+)');
684 var chromeMatch = navigator.userAgent.match(chromeRegex);
685 if (chromeMatch && chromeMatch.length > 1)
686 return String.sprintf(uaString, chromeMatch[1]);
687 return uaString;
688 }
689
690 /**
691 * @override
692 * @param {!WebInspector.Target} target
693 */
694 targetAdded(target) {
695 var networkAgent = target.networkAgent();
696 if (this._extraHeaders)
697 networkAgent.setExtraHTTPHeaders(this._extraHeaders);
698 if (this._currentUserAgent())
699 networkAgent.setUserAgentOverride(this._currentUserAgent());
700 for (var url of this._blockedURLs)
701 networkAgent.addBlockedURL(url);
702 this._agents.add(networkAgent);
703 if (this.isThrottling())
704 this._updateNetworkConditions(networkAgent);
705 }
706
707 /**
708 * @override
709 * @param {!WebInspector.Target} target
710 */
711 targetRemoved(target) {
712 this._agents.delete(target.networkAgent());
713 }
714
715 /**
716 * @return {boolean}
717 */
718 isThrottling() {
719 return this._networkConditions.download >= 0 || this._networkConditions.uplo ad >= 0 ||
720 this._networkConditions.latency > 0;
721 }
722
723 /**
724 * @return {boolean}
725 */
726 isOffline() {
727 return !this._networkConditions.download && !this._networkConditions.upload;
728 }
729
730 /**
731 * @param {!WebInspector.NetworkManager.Conditions} conditions
732 */
733 setNetworkConditions(conditions) {
734 this._networkConditions = conditions;
735 for (var agent of this._agents)
736 this._updateNetworkConditions(agent);
737 this.dispatchEventToListeners(WebInspector.MultitargetNetworkManager.Events. ConditionsChanged);
738 }
739
740 /**
741 * @return {!WebInspector.NetworkManager.Conditions}
742 */
743 networkConditions() {
744 return this._networkConditions;
745 }
746
747 /**
748 * @param {!Protocol.NetworkAgent} networkAgent
749 */
750 _updateNetworkConditions(networkAgent) {
751 var conditions = this._networkConditions;
752 if (!this.isThrottling()) {
753 networkAgent.emulateNetworkConditions(false, 0, 0, 0);
754 } else {
755 networkAgent.emulateNetworkConditions(
756 this.isOffline(), conditions.latency, conditions.download < 0 ? 0 : co nditions.download,
757 conditions.upload < 0 ? 0 : conditions.upload, WebInspector.NetworkMan ager._connectionType(conditions));
758 }
759 }
760
761 /**
762 * @param {!NetworkAgent.Headers} headers
763 */
764 setExtraHTTPHeaders(headers) {
765 this._extraHeaders = headers;
766 for (var agent of this._agents)
767 agent.setExtraHTTPHeaders(this._extraHeaders);
768 }
769
770 /**
771 * @return {string}
772 */
773 _currentUserAgent() {
774 return this._customUserAgent ? this._customUserAgent : this._userAgentOverri de;
775 }
776
777 _updateUserAgentOverride() {
778 var userAgent = this._currentUserAgent();
779 WebInspector.ResourceLoader.targetUserAgent = userAgent;
780 for (var agent of this._agents)
781 agent.setUserAgentOverride(userAgent);
782 }
783
784 /**
785 * @param {string} userAgent
786 */
787 setUserAgentOverride(userAgent) {
788 if (this._userAgentOverride === userAgent)
789 return;
790 this._userAgentOverride = userAgent;
791 if (!this._customUserAgent)
792 this._updateUserAgentOverride();
793 this.dispatchEventToListeners(WebInspector.MultitargetNetworkManager.Events. UserAgentChanged);
794 }
795
796 /**
797 * @return {string}
798 */
799 userAgentOverride() {
800 return this._userAgentOverride;
801 }
802
803 /**
804 * @param {string} userAgent
805 */
806 setCustomUserAgentOverride(userAgent) {
807 this._customUserAgent = userAgent;
808 this._updateUserAgentOverride();
809 }
810
811 _updateBlockedURLs() {
812 var blocked = this._blockedSetting.get();
813 for (var url of blocked) {
814 if (!this._blockedURLs.has(url))
815 this._addBlockedURL(url);
816 }
817 for (var url of this._blockedURLs) {
818 if (blocked.indexOf(url) === -1)
819 this._removeBlockedURL(url);
820 }
821 }
822
823 /**
824 * @param {string} url
825 */
826 _addBlockedURL(url) {
827 this._blockedURLs.add(url);
828 for (var agent of this._agents)
829 agent.addBlockedURL(url);
830 }
831
832 /**
833 * @param {string} url
834 */
835 _removeBlockedURL(url) {
836 this._blockedURLs.delete(url);
837 for (var agent of this._agents)
838 agent.removeBlockedURL(url);
839 }
840
841 clearBrowserCache() {
842 for (var agent of this._agents)
843 agent.clearBrowserCache();
844 }
845
846 clearBrowserCookies() {
847 for (var agent of this._agents)
848 agent.clearBrowserCookies();
849 }
850
851 /**
852 * @param {string} origin
853 * @param {function(!Array<string>)} callback
854 */
855 getCertificate(origin, callback) {
856 var target = WebInspector.targetManager.mainTarget();
857 target.networkAgent().getCertificate(origin, mycallback);
858
859 /**
860 * @param {?Protocol.Error} error
861 * @param {!Array<string>} certificate
862 */
863 function mycallback(error, certificate) {
864 callback(error ? [] : certificate);
865 }
866 }
867
868 /**
869 * @param {string} url
870 * @param {function(number, !Object.<string, string>, string)} callback
871 */
872 loadResource(url, callback) {
873 var headers = {};
874
875 var currentUserAgent = this._currentUserAgent();
876 if (currentUserAgent)
877 headers['User-Agent'] = currentUserAgent;
878
879 if (WebInspector.moduleSetting('cacheDisabled').get())
880 headers['Cache-Control'] = 'no-cache';
881
882 WebInspector.ResourceLoader.load(url, headers, callback);
883 }
689 }; 884 };
690 885
691 /** @enum {symbol} */ 886 /** @enum {symbol} */
692 WebInspector.MultitargetNetworkManager.Events = { 887 WebInspector.MultitargetNetworkManager.Events = {
693 ConditionsChanged: Symbol("ConditionsChanged"), 888 ConditionsChanged: Symbol('ConditionsChanged'),
694 UserAgentChanged: Symbol("UserAgentChanged") 889 UserAgentChanged: Symbol('UserAgentChanged')
695 }; 890 };
696 891
697 /**
698 * @param {string} uaString
699 * @return {string}
700 */
701 WebInspector.MultitargetNetworkManager.patchUserAgentWithChromeVersion = functio n(uaString)
702 {
703 // Patches Chrome/CriOS version from user agent ("1.2.3.4" when user agent i s: "Chrome/1.2.3.4").
704 var chromeRegex = new RegExp("(?:^|\\W)Chrome/(\\S+)");
705 var chromeMatch = navigator.userAgent.match(chromeRegex);
706 if (chromeMatch && chromeMatch.length > 1)
707 return String.sprintf(uaString, chromeMatch[1]);
708 return uaString;
709 };
710
711 WebInspector.MultitargetNetworkManager.prototype = {
712 /**
713 * @override
714 * @param {!WebInspector.Target} target
715 */
716 targetAdded: function(target)
717 {
718 var networkAgent = target.networkAgent();
719 if (this._extraHeaders)
720 networkAgent.setExtraHTTPHeaders(this._extraHeaders);
721 if (this._currentUserAgent())
722 networkAgent.setUserAgentOverride(this._currentUserAgent());
723 for (var url of this._blockedURLs)
724 networkAgent.addBlockedURL(url);
725 this._agents.add(networkAgent);
726 if (this.isThrottling())
727 this._updateNetworkConditions(networkAgent);
728 },
729
730 /**
731 * @override
732 * @param {!WebInspector.Target} target
733 */
734 targetRemoved: function(target)
735 {
736 this._agents.delete(target.networkAgent());
737 },
738
739 /**
740 * @return {boolean}
741 */
742 isThrottling: function()
743 {
744 return this._networkConditions.download >= 0 || this._networkConditions. upload >= 0 || this._networkConditions.latency > 0;
745 },
746
747 /**
748 * @return {boolean}
749 */
750 isOffline: function()
751 {
752 return !this._networkConditions.download && !this._networkConditions.upl oad;
753 },
754
755 /**
756 * @param {!WebInspector.NetworkManager.Conditions} conditions
757 */
758 setNetworkConditions: function(conditions)
759 {
760 this._networkConditions = conditions;
761 for (var agent of this._agents)
762 this._updateNetworkConditions(agent);
763 this.dispatchEventToListeners(WebInspector.MultitargetNetworkManager.Eve nts.ConditionsChanged);
764 },
765
766 /**
767 * @return {!WebInspector.NetworkManager.Conditions}
768 */
769 networkConditions: function()
770 {
771 return this._networkConditions;
772 },
773
774 /**
775 * @param {!Protocol.NetworkAgent} networkAgent
776 */
777 _updateNetworkConditions: function(networkAgent)
778 {
779 var conditions = this._networkConditions;
780 if (!this.isThrottling()) {
781 networkAgent.emulateNetworkConditions(false, 0, 0, 0);
782 } else {
783 networkAgent.emulateNetworkConditions(this.isOffline(), conditions.l atency, conditions.download < 0 ? 0 : conditions.download, conditions.upload < 0 ? 0 : conditions.upload, WebInspector.NetworkManager._connectionType(conditions ));
784 }
785 },
786
787 /**
788 * @param {!NetworkAgent.Headers} headers
789 */
790 setExtraHTTPHeaders: function(headers)
791 {
792 this._extraHeaders = headers;
793 for (var agent of this._agents)
794 agent.setExtraHTTPHeaders(this._extraHeaders);
795 },
796
797 /**
798 * @return {string}
799 */
800 _currentUserAgent: function()
801 {
802 return this._customUserAgent ? this._customUserAgent : this._userAgentOv erride;
803 },
804
805 _updateUserAgentOverride: function()
806 {
807 var userAgent = this._currentUserAgent();
808 WebInspector.ResourceLoader.targetUserAgent = userAgent;
809 for (var agent of this._agents)
810 agent.setUserAgentOverride(userAgent);
811 },
812
813 /**
814 * @param {string} userAgent
815 */
816 setUserAgentOverride: function(userAgent)
817 {
818 if (this._userAgentOverride === userAgent)
819 return;
820 this._userAgentOverride = userAgent;
821 if (!this._customUserAgent)
822 this._updateUserAgentOverride();
823 this.dispatchEventToListeners(WebInspector.MultitargetNetworkManager.Eve nts.UserAgentChanged);
824 },
825
826 /**
827 * @return {string}
828 */
829 userAgentOverride: function()
830 {
831 return this._userAgentOverride;
832 },
833
834 /**
835 * @param {string} userAgent
836 */
837 setCustomUserAgentOverride: function(userAgent)
838 {
839 this._customUserAgent = userAgent;
840 this._updateUserAgentOverride();
841 },
842
843 _updateBlockedURLs: function()
844 {
845 var blocked = this._blockedSetting.get();
846 for (var url of blocked) {
847 if (!this._blockedURLs.has(url))
848 this._addBlockedURL(url);
849 }
850 for (var url of this._blockedURLs) {
851 if (blocked.indexOf(url) === -1)
852 this._removeBlockedURL(url);
853 }
854 },
855
856 /**
857 * @param {string} url
858 */
859 _addBlockedURL: function(url)
860 {
861 this._blockedURLs.add(url);
862 for (var agent of this._agents)
863 agent.addBlockedURL(url);
864 },
865
866 /**
867 * @param {string} url
868 */
869 _removeBlockedURL: function(url)
870 {
871 this._blockedURLs.delete(url);
872 for (var agent of this._agents)
873 agent.removeBlockedURL(url);
874 },
875
876 clearBrowserCache: function()
877 {
878 for (var agent of this._agents)
879 agent.clearBrowserCache();
880 },
881
882 clearBrowserCookies: function()
883 {
884 for (var agent of this._agents)
885 agent.clearBrowserCookies();
886 },
887
888 /**
889 * @param {string} origin
890 * @param {function(!Array<string>)} callback
891 */
892 getCertificate: function(origin, callback)
893 {
894 var target = WebInspector.targetManager.mainTarget();
895 target.networkAgent().getCertificate(origin, mycallback);
896
897 /**
898 * @param {?Protocol.Error} error
899 * @param {!Array<string>} certificate
900 */
901 function mycallback(error, certificate)
902 {
903 callback(error ? [] : certificate);
904 }
905 },
906
907 /**
908 * @param {string} url
909 * @param {function(number, !Object.<string, string>, string)} callback
910 */
911 loadResource: function(url, callback)
912 {
913 var headers = {};
914
915 var currentUserAgent = this._currentUserAgent();
916 if (currentUserAgent)
917 headers["User-Agent"] = currentUserAgent;
918
919 if (WebInspector.moduleSetting("cacheDisabled").get())
920 headers["Cache-Control"] = "no-cache";
921
922 WebInspector.ResourceLoader.load(url, headers, callback);
923 },
924
925 __proto__: WebInspector.Object.prototype
926 };
927 892
928 /** 893 /**
929 * @type {!WebInspector.MultitargetNetworkManager} 894 * @type {!WebInspector.MultitargetNetworkManager}
930 */ 895 */
931 WebInspector.multitargetNetworkManager; 896 WebInspector.multitargetNetworkManager;
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698