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