OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2007, 2008 Apple Inc. All rights reserved. | 2 * Copyright (C) 2007, 2008 Apple Inc. All rights reserved. |
3 * Copyright (C) IBM Corp. 2009 All rights reserved. | 3 * Copyright (C) IBM Corp. 2009 All rights reserved. |
4 * Copyright (C) 2010 Google Inc. All rights reserved. | 4 * Copyright (C) 2010 Google Inc. All rights reserved. |
5 * | 5 * |
6 * Redistribution and use in source and binary forms, with or without | 6 * Redistribution and use in source and binary forms, with or without |
7 * modification, are permitted provided that the following conditions | 7 * modification, are permitted provided that the following conditions |
8 * are met: | 8 * are met: |
9 * | 9 * |
10 * 1. Redistributions of source code must retain the above copyright | 10 * 1. Redistributions of source code must retain the above copyright |
11 * notice, this list of conditions and the following disclaimer. | 11 * notice, this list of conditions and the following disclaimer. |
12 * 2. Redistributions in binary form must reproduce the above copyright | 12 * 2. Redistributions in binary form must reproduce the above copyright |
13 * notice, this list of conditions and the following disclaimer in the | 13 * notice, this list of conditions and the following disclaimer in the |
14 * documentation and/or other materials provided with the distribution. | 14 * documentation and/or other materials provided with the distribution. |
15 * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of | 15 * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of |
16 * its contributors may be used to endorse or promote products derived | 16 * its contributors may be used to endorse or promote products derived |
17 * from this software without specific prior written permission. | 17 * from this software without specific prior written permission. |
18 * | 18 * |
19 * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY | 19 * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY |
20 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | 20 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED |
21 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | 21 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE |
22 * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY | 22 * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY |
23 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | 23 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES |
24 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | 24 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; |
25 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | 25 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND |
26 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | 26 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF | 27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
28 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 28 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
29 */ | 29 */ |
30 | |
31 /** | 30 /** |
32 * @constructor | 31 * @unrestricted |
33 * @extends {WebInspector.VBox} | |
34 * @param {!WebInspector.NetworkRequest} request | |
35 */ | 32 */ |
36 WebInspector.RequestHeadersView = function(request) | 33 WebInspector.RequestHeadersView = class extends WebInspector.VBox { |
37 { | 34 /** |
38 WebInspector.VBox.call(this); | 35 * @param {!WebInspector.NetworkRequest} request |
39 this.registerRequiredCSS("network/requestHeadersView.css"); | 36 */ |
40 this.element.classList.add("request-headers-view"); | 37 constructor(request) { |
| 38 super(); |
| 39 this.registerRequiredCSS('network/requestHeadersView.css'); |
| 40 this.element.classList.add('request-headers-view'); |
41 | 41 |
42 this._request = request; | 42 this._request = request; |
43 this._decodeRequestParameters = true; | 43 this._decodeRequestParameters = true; |
44 this._showRequestHeadersText = false; | 44 this._showRequestHeadersText = false; |
45 this._showResponseHeadersText = false; | 45 this._showResponseHeadersText = false; |
46 | 46 |
47 var root = new TreeOutlineInShadow(); | 47 var root = new TreeOutlineInShadow(); |
48 root.registerRequiredCSS("network/requestHeadersTree.css"); | 48 root.registerRequiredCSS('network/requestHeadersTree.css'); |
49 root.element.classList.add("request-headers-tree"); | 49 root.element.classList.add('request-headers-tree'); |
50 root.setFocusable(false); | 50 root.setFocusable(false); |
51 root.makeDense(); | 51 root.makeDense(); |
52 root.expandTreeElementsWhenArrowing = true; | 52 root.expandTreeElementsWhenArrowing = true; |
53 this.element.appendChild(root.element); | 53 this.element.appendChild(root.element); |
54 | 54 |
55 var generalCategory = new WebInspector.RequestHeadersView.Category(root, "ge
neral", WebInspector.UIString("General")); | 55 var generalCategory = |
| 56 new WebInspector.RequestHeadersView.Category(root, 'general', WebInspect
or.UIString('General')); |
56 generalCategory.hidden = false; | 57 generalCategory.hidden = false; |
57 this._urlItem = generalCategory.createLeaf(); | 58 this._urlItem = generalCategory.createLeaf(); |
58 this._requestMethodItem = generalCategory.createLeaf(); | 59 this._requestMethodItem = generalCategory.createLeaf(); |
59 this._statusCodeItem = generalCategory.createLeaf(); | 60 this._statusCodeItem = generalCategory.createLeaf(); |
60 this._remoteAddressItem = generalCategory.createLeaf(); | 61 this._remoteAddressItem = generalCategory.createLeaf(); |
61 this._remoteAddressItem.hidden = true; | 62 this._remoteAddressItem.hidden = true; |
62 | 63 |
63 this._responseHeadersCategory = new WebInspector.RequestHeadersView.Category
(root, "responseHeaders", ""); | 64 this._responseHeadersCategory = new WebInspector.RequestHeadersView.Category
(root, 'responseHeaders', ''); |
64 this._requestHeadersCategory = new WebInspector.RequestHeadersView.Category(
root, "requestHeaders", ""); | 65 this._requestHeadersCategory = new WebInspector.RequestHeadersView.Category(
root, 'requestHeaders', ''); |
65 this._queryStringCategory = new WebInspector.RequestHeadersView.Category(roo
t, "queryString", ""); | 66 this._queryStringCategory = new WebInspector.RequestHeadersView.Category(roo
t, 'queryString', ''); |
66 this._formDataCategory = new WebInspector.RequestHeadersView.Category(root,
"formData", ""); | 67 this._formDataCategory = new WebInspector.RequestHeadersView.Category(root,
'formData', ''); |
67 this._requestPayloadCategory = new WebInspector.RequestHeadersView.Category(
root, "requestPayload", WebInspector.UIString("Request Payload")); | 68 this._requestPayloadCategory = |
68 }; | 69 new WebInspector.RequestHeadersView.Category(root, 'requestPayload', Web
Inspector.UIString('Request Payload')); |
69 | 70 } |
70 WebInspector.RequestHeadersView.prototype = { | 71 |
71 wasShown: function() | 72 /** |
72 { | 73 * @override |
73 this._request.addEventListener(WebInspector.NetworkRequest.Events.Remote
AddressChanged, this._refreshRemoteAddress, this); | 74 */ |
74 this._request.addEventListener(WebInspector.NetworkRequest.Events.Reques
tHeadersChanged, this._refreshRequestHeaders, this); | 75 wasShown() { |
75 this._request.addEventListener(WebInspector.NetworkRequest.Events.Respon
seHeadersChanged, this._refreshResponseHeaders, this); | 76 this._request.addEventListener( |
76 this._request.addEventListener(WebInspector.NetworkRequest.Events.Finish
edLoading, this._refreshHTTPInformation, this); | 77 WebInspector.NetworkRequest.Events.RemoteAddressChanged, this._refreshRe
moteAddress, this); |
77 | 78 this._request.addEventListener( |
78 this._refreshURL(); | 79 WebInspector.NetworkRequest.Events.RequestHeadersChanged, this._refreshR
equestHeaders, this); |
79 this._refreshQueryString(); | 80 this._request.addEventListener( |
80 this._refreshRequestHeaders(); | 81 WebInspector.NetworkRequest.Events.ResponseHeadersChanged, this._refresh
ResponseHeaders, this); |
81 this._refreshResponseHeaders(); | 82 this._request.addEventListener( |
82 this._refreshHTTPInformation(); | 83 WebInspector.NetworkRequest.Events.FinishedLoading, this._refreshHTTPInf
ormation, this); |
83 this._refreshRemoteAddress(); | 84 |
84 }, | 85 this._refreshURL(); |
85 | 86 this._refreshQueryString(); |
86 willHide: function() | 87 this._refreshRequestHeaders(); |
87 { | 88 this._refreshResponseHeaders(); |
88 this._request.removeEventListener(WebInspector.NetworkRequest.Events.Rem
oteAddressChanged, this._refreshRemoteAddress, this); | 89 this._refreshHTTPInformation(); |
89 this._request.removeEventListener(WebInspector.NetworkRequest.Events.Req
uestHeadersChanged, this._refreshRequestHeaders, this); | 90 this._refreshRemoteAddress(); |
90 this._request.removeEventListener(WebInspector.NetworkRequest.Events.Res
ponseHeadersChanged, this._refreshResponseHeaders, this); | 91 } |
91 this._request.removeEventListener(WebInspector.NetworkRequest.Events.Fin
ishedLoading, this._refreshHTTPInformation, this); | 92 |
92 }, | 93 /** |
93 | 94 * @override |
94 /** | 95 */ |
95 * @param {string} name | 96 willHide() { |
96 * @param {string} value | 97 this._request.removeEventListener( |
97 * @return {!DocumentFragment} | 98 WebInspector.NetworkRequest.Events.RemoteAddressChanged, this._refreshRe
moteAddress, this); |
98 */ | 99 this._request.removeEventListener( |
99 _formatHeader: function(name, value) | 100 WebInspector.NetworkRequest.Events.RequestHeadersChanged, this._refreshR
equestHeaders, this); |
100 { | 101 this._request.removeEventListener( |
101 var fragment = createDocumentFragment(); | 102 WebInspector.NetworkRequest.Events.ResponseHeadersChanged, this._refresh
ResponseHeaders, this); |
102 fragment.createChild("div", "header-name").textContent = name + ":"; | 103 this._request.removeEventListener( |
103 fragment.createChild("div", "header-value source-code").textContent = va
lue; | 104 WebInspector.NetworkRequest.Events.FinishedLoading, this._refreshHTTPInf
ormation, this); |
104 | 105 } |
105 return fragment; | 106 |
106 }, | 107 /** |
107 | 108 * @param {string} name |
108 /** | 109 * @param {string} value |
109 * @param {string} value | 110 * @return {!DocumentFragment} |
110 * @param {string} className | 111 */ |
111 * @param {boolean} decodeParameters | 112 _formatHeader(name, value) { |
112 * @return {!Element} | 113 var fragment = createDocumentFragment(); |
113 */ | 114 fragment.createChild('div', 'header-name').textContent = name + ':'; |
114 _formatParameter: function(value, className, decodeParameters) | 115 fragment.createChild('div', 'header-value source-code').textContent = value; |
115 { | 116 |
116 var errorDecoding = false; | 117 return fragment; |
117 | 118 } |
118 if (decodeParameters) { | 119 |
119 value = value.replace(/\+/g, " "); | 120 /** |
120 if (value.indexOf("%") >= 0) { | 121 * @param {string} value |
121 try { | 122 * @param {string} className |
122 value = decodeURIComponent(value); | 123 * @param {boolean} decodeParameters |
123 } catch (e) { | 124 * @return {!Element} |
124 errorDecoding = true; | 125 */ |
125 } | 126 _formatParameter(value, className, decodeParameters) { |
126 } | 127 var errorDecoding = false; |
| 128 |
| 129 if (decodeParameters) { |
| 130 value = value.replace(/\+/g, ' '); |
| 131 if (value.indexOf('%') >= 0) { |
| 132 try { |
| 133 value = decodeURIComponent(value); |
| 134 } catch (e) { |
| 135 errorDecoding = true; |
127 } | 136 } |
128 var div = createElementWithClass("div", className); | 137 } |
129 if (value === "") | 138 } |
130 div.classList.add("empty-value"); | 139 var div = createElementWithClass('div', className); |
131 if (errorDecoding) | 140 if (value === '') |
132 div.createChild("span", "header-decode-error").textContent = WebInsp
ector.UIString("(unable to decode value)"); | 141 div.classList.add('empty-value'); |
133 else | 142 if (errorDecoding) |
134 div.textContent = value; | 143 div.createChild('span', 'header-decode-error').textContent = WebInspector.
UIString('(unable to decode value)'); |
135 return div; | 144 else |
136 }, | 145 div.textContent = value; |
137 | 146 return div; |
138 _refreshURL: function() | 147 } |
139 { | 148 |
140 this._urlItem.title = this._formatHeader(WebInspector.UIString("Request
URL"), this._request.url); | 149 _refreshURL() { |
141 }, | 150 this._urlItem.title = this._formatHeader(WebInspector.UIString('Request URL'
), this._request.url); |
142 | 151 } |
143 _refreshQueryString: function() | 152 |
144 { | 153 _refreshQueryString() { |
145 var queryString = this._request.queryString(); | 154 var queryString = this._request.queryString(); |
146 var queryParameters = this._request.queryParameters; | 155 var queryParameters = this._request.queryParameters; |
147 this._queryStringCategory.hidden = !queryParameters; | 156 this._queryStringCategory.hidden = !queryParameters; |
148 if (queryParameters) | 157 if (queryParameters) |
149 this._refreshParams(WebInspector.UIString("Query String Parameters")
, queryParameters, queryString, this._queryStringCategory); | 158 this._refreshParams( |
150 }, | 159 WebInspector.UIString('Query String Parameters'), queryParameters, que
ryString, this._queryStringCategory); |
151 | 160 } |
152 _refreshFormData: function() | 161 |
153 { | 162 _refreshFormData() { |
154 this._formDataCategory.hidden = true; | 163 this._formDataCategory.hidden = true; |
155 this._requestPayloadCategory.hidden = true; | 164 this._requestPayloadCategory.hidden = true; |
156 | 165 |
157 var formData = this._request.requestFormData; | 166 var formData = this._request.requestFormData; |
158 if (!formData) | 167 if (!formData) |
159 return; | 168 return; |
160 | 169 |
161 var formParameters = this._request.formParameters; | 170 var formParameters = this._request.formParameters; |
162 if (formParameters) { | 171 if (formParameters) { |
163 this._formDataCategory.hidden = false; | 172 this._formDataCategory.hidden = false; |
164 this._refreshParams(WebInspector.UIString("Form Data"), formParamete
rs, formData, this._formDataCategory); | 173 this._refreshParams(WebInspector.UIString('Form Data'), formParameters, fo
rmData, this._formDataCategory); |
165 } else { | 174 } else { |
166 this._requestPayloadCategory.hidden = false; | 175 this._requestPayloadCategory.hidden = false; |
167 try { | 176 try { |
168 var json = JSON.parse(formData); | 177 var json = JSON.parse(formData); |
169 this._refreshRequestJSONPayload(json, formData); | 178 this._refreshRequestJSONPayload(json, formData); |
170 } catch (e) { | 179 } catch (e) { |
171 this._populateTreeElementWithSourceText(this._requestPayloadCate
gory, formData); | 180 this._populateTreeElementWithSourceText(this._requestPayloadCategory, fo
rmData); |
172 } | 181 } |
173 } | 182 } |
174 }, | 183 } |
175 | 184 |
176 /** | 185 /** |
177 * @param {!TreeElement} treeElement | 186 * @param {!TreeElement} treeElement |
178 * @param {?string} sourceText | 187 * @param {?string} sourceText |
179 */ | 188 */ |
180 _populateTreeElementWithSourceText: function(treeElement, sourceText) | 189 _populateTreeElementWithSourceText(treeElement, sourceText) { |
181 { | 190 var sourceTextElement = createElementWithClass('span', 'header-value source-
code'); |
182 var sourceTextElement = createElementWithClass("span", "header-value sou
rce-code"); | 191 sourceTextElement.textContent = String(sourceText || '').trim(); |
183 sourceTextElement.textContent = String(sourceText || "").trim(); | 192 |
184 | 193 var sourceTreeElement = new TreeElement(sourceTextElement); |
185 var sourceTreeElement = new TreeElement(sourceTextElement); | 194 sourceTreeElement.selectable = false; |
186 sourceTreeElement.selectable = false; | 195 treeElement.removeChildren(); |
187 treeElement.removeChildren(); | 196 treeElement.appendChild(sourceTreeElement); |
188 treeElement.appendChild(sourceTreeElement); | 197 } |
189 }, | 198 |
190 | 199 /** |
191 /** | 200 * @param {string} title |
192 * @param {string} title | 201 * @param {?Array.<!WebInspector.NetworkRequest.NameValue>} params |
193 * @param {?Array.<!WebInspector.NetworkRequest.NameValue>} params | 202 * @param {?string} sourceText |
194 * @param {?string} sourceText | 203 * @param {!TreeElement} paramsTreeElement |
195 * @param {!TreeElement} paramsTreeElement | 204 */ |
196 */ | 205 _refreshParams(title, params, sourceText, paramsTreeElement) { |
197 _refreshParams: function(title, params, sourceText, paramsTreeElement) | 206 paramsTreeElement.removeChildren(); |
198 { | 207 |
199 paramsTreeElement.removeChildren(); | 208 paramsTreeElement.listItemElement.removeChildren(); |
200 | 209 paramsTreeElement.listItemElement.createTextChild(title); |
201 paramsTreeElement.listItemElement.removeChildren(); | 210 |
202 paramsTreeElement.listItemElement.createTextChild(title); | 211 var headerCount = createElementWithClass('span', 'header-count'); |
203 | 212 headerCount.textContent = WebInspector.UIString('\u00A0(%d)', params.length)
; |
204 var headerCount = createElementWithClass("span", "header-count"); | 213 paramsTreeElement.listItemElement.appendChild(headerCount); |
205 headerCount.textContent = WebInspector.UIString("\u00A0(%d)", params.len
gth); | |
206 paramsTreeElement.listItemElement.appendChild(headerCount); | |
207 | |
208 /** | |
209 * @param {!Event} event | |
210 * @this {WebInspector.RequestHeadersView} | |
211 */ | |
212 function toggleViewSource(event) | |
213 { | |
214 paramsTreeElement._viewSource = !paramsTreeElement._viewSource; | |
215 this._refreshParams(title, params, sourceText, paramsTreeElement); | |
216 event.consume(); | |
217 } | |
218 | |
219 paramsTreeElement.listItemElement.appendChild(this._createViewSourceTogg
le(paramsTreeElement._viewSource, toggleViewSource.bind(this))); | |
220 | |
221 if (paramsTreeElement._viewSource) { | |
222 this._populateTreeElementWithSourceText(paramsTreeElement, sourceTex
t); | |
223 return; | |
224 } | |
225 | |
226 var toggleTitle = this._decodeRequestParameters ? WebInspector.UIString(
"view URL encoded") : WebInspector.UIString("view decoded"); | |
227 var toggleButton = this._createToggleButton(toggleTitle); | |
228 toggleButton.addEventListener("click", this._toggleURLDecoding.bind(this
), false); | |
229 paramsTreeElement.listItemElement.appendChild(toggleButton); | |
230 | |
231 for (var i = 0; i < params.length; ++i) { | |
232 var paramNameValue = createDocumentFragment(); | |
233 if (params[i].name !== "") { | |
234 var name = this._formatParameter(params[i].name + ":", "header-n
ame", this._decodeRequestParameters); | |
235 var value = this._formatParameter(params[i].value, "header-value
source-code", this._decodeRequestParameters); | |
236 paramNameValue.appendChild(name); | |
237 paramNameValue.appendChild(value); | |
238 } else { | |
239 paramNameValue.appendChild(this._formatParameter(WebInspector.UI
String("(empty)"), "empty-request-header", this._decodeRequestParameters)); | |
240 } | |
241 | |
242 var paramTreeElement = new TreeElement(paramNameValue); | |
243 paramTreeElement.selectable = false; | |
244 paramsTreeElement.appendChild(paramTreeElement); | |
245 } | |
246 }, | |
247 | |
248 /** | |
249 * @param {*} parsedObject | |
250 * @param {string} sourceText | |
251 */ | |
252 _refreshRequestJSONPayload: function(parsedObject, sourceText) | |
253 { | |
254 var treeElement = this._requestPayloadCategory; | |
255 treeElement.removeChildren(); | |
256 | |
257 var listItem = this._requestPayloadCategory.listItemElement; | |
258 listItem.removeChildren(); | |
259 listItem.createTextChild(this._requestPayloadCategory.title); | |
260 | |
261 /** | |
262 * @param {!Event} event | |
263 * @this {WebInspector.RequestHeadersView} | |
264 */ | |
265 function toggleViewSource(event) | |
266 { | |
267 treeElement._viewSource = !treeElement._viewSource; | |
268 this._refreshRequestJSONPayload(parsedObject, sourceText); | |
269 event.consume(); | |
270 } | |
271 | |
272 listItem.appendChild(this._createViewSourceToggle(treeElement._viewSourc
e, toggleViewSource.bind(this))); | |
273 if (treeElement._viewSource) { | |
274 this._populateTreeElementWithSourceText(this._requestPayloadCategory
, sourceText); | |
275 } else { | |
276 var object = WebInspector.RemoteObject.fromLocalObject(parsedObject)
; | |
277 var section = new WebInspector.ObjectPropertiesSection(object, objec
t.description); | |
278 section.expand(); | |
279 section.editable = false; | |
280 treeElement.appendChild(new TreeElement(section.element)); | |
281 } | |
282 }, | |
283 | |
284 /** | |
285 * @param {boolean} viewSource | |
286 * @param {function(!Event)} handler | |
287 * @return {!Element} | |
288 */ | |
289 _createViewSourceToggle: function(viewSource, handler) | |
290 { | |
291 var viewSourceToggleTitle = viewSource ? WebInspector.UIString("view par
sed") : WebInspector.UIString("view source"); | |
292 var viewSourceToggleButton = this._createToggleButton(viewSourceToggleTi
tle); | |
293 viewSourceToggleButton.addEventListener("click", handler, false); | |
294 return viewSourceToggleButton; | |
295 }, | |
296 | 214 |
297 /** | 215 /** |
298 * @param {!Event} event | 216 * @param {!Event} event |
| 217 * @this {WebInspector.RequestHeadersView} |
299 */ | 218 */ |
300 _toggleURLDecoding: function(event) | 219 function toggleViewSource(event) { |
301 { | 220 paramsTreeElement._viewSource = !paramsTreeElement._viewSource; |
302 this._decodeRequestParameters = !this._decodeRequestParameters; | 221 this._refreshParams(title, params, sourceText, paramsTreeElement); |
303 this._refreshQueryString(); | 222 event.consume(); |
304 this._refreshFormData(); | 223 } |
305 event.consume(); | 224 |
306 }, | 225 paramsTreeElement.listItemElement.appendChild( |
307 | 226 this._createViewSourceToggle(paramsTreeElement._viewSource, toggleViewSo
urce.bind(this))); |
308 _refreshRequestHeaders: function() | 227 |
309 { | 228 if (paramsTreeElement._viewSource) { |
310 var treeElement = this._requestHeadersCategory; | 229 this._populateTreeElementWithSourceText(paramsTreeElement, sourceText); |
311 var headers = this._request.requestHeaders().slice(); | 230 return; |
312 headers.sort(function(a, b) { return a.name.toLowerCase().compareTo(b.na
me.toLowerCase()); }); | 231 } |
313 var headersText = this._request.requestHeadersText(); | 232 |
314 | 233 var toggleTitle = this._decodeRequestParameters ? WebInspector.UIString('vie
w URL encoded') : |
315 if (this._showRequestHeadersText && headersText) | 234 WebInspector.UIString('vie
w decoded'); |
316 this._refreshHeadersText(WebInspector.UIString("Request Headers"), h
eaders.length, headersText, treeElement); | 235 var toggleButton = this._createToggleButton(toggleTitle); |
317 else | 236 toggleButton.addEventListener('click', this._toggleURLDecoding.bind(this), f
alse); |
318 this._refreshHeaders(WebInspector.UIString("Request Headers"), heade
rs, treeElement, headersText === undefined); | 237 paramsTreeElement.listItemElement.appendChild(toggleButton); |
319 | 238 |
320 if (headersText) { | 239 for (var i = 0; i < params.length; ++i) { |
321 var toggleButton = this._createHeadersToggleButton(this._showRequest
HeadersText); | 240 var paramNameValue = createDocumentFragment(); |
322 toggleButton.addEventListener("click", this._toggleRequestHeadersTex
t.bind(this), false); | 241 if (params[i].name !== '') { |
323 treeElement.listItemElement.appendChild(toggleButton); | 242 var name = this._formatParameter(params[i].name + ':', 'header-name', th
is._decodeRequestParameters); |
324 } | 243 var value = this._formatParameter(params[i].value, 'header-value source-
code', this._decodeRequestParameters); |
325 | 244 paramNameValue.appendChild(name); |
326 this._refreshFormData(); | 245 paramNameValue.appendChild(value); |
327 }, | 246 } else { |
328 | 247 paramNameValue.appendChild(this._formatParameter( |
329 _refreshResponseHeaders: function() | 248 WebInspector.UIString('(empty)'), 'empty-request-header', this._deco
deRequestParameters)); |
330 { | 249 } |
331 var treeElement = this._responseHeadersCategory; | 250 |
332 var headers = this._request.sortedResponseHeaders.slice(); | 251 var paramTreeElement = new TreeElement(paramNameValue); |
333 var headersText = this._request.responseHeadersText; | 252 paramTreeElement.selectable = false; |
334 | 253 paramsTreeElement.appendChild(paramTreeElement); |
335 if (this._showResponseHeadersText) | 254 } |
336 this._refreshHeadersText(WebInspector.UIString("Response Headers"),
headers.length, headersText, treeElement); | 255 } |
337 else | 256 |
338 this._refreshHeaders(WebInspector.UIString("Response Headers"), head
ers, treeElement); | 257 /** |
339 | 258 * @param {*} parsedObject |
340 if (headersText) { | 259 * @param {string} sourceText |
341 var toggleButton = this._createHeadersToggleButton(this._showRespons
eHeadersText); | 260 */ |
342 toggleButton.addEventListener("click", this._toggleResponseHeadersTe
xt.bind(this), false); | 261 _refreshRequestJSONPayload(parsedObject, sourceText) { |
343 treeElement.listItemElement.appendChild(toggleButton); | 262 var treeElement = this._requestPayloadCategory; |
344 } | 263 treeElement.removeChildren(); |
345 }, | 264 |
346 | 265 var listItem = this._requestPayloadCategory.listItemElement; |
347 _refreshHTTPInformation: function() | 266 listItem.removeChildren(); |
348 { | 267 listItem.createTextChild(this._requestPayloadCategory.title); |
349 var requestMethodElement = this._requestMethodItem; | |
350 requestMethodElement.hidden = !this._request.statusCode; | |
351 var statusCodeElement = this._statusCodeItem; | |
352 statusCodeElement.hidden = !this._request.statusCode; | |
353 | |
354 if (this._request.statusCode) { | |
355 var statusCodeFragment = createDocumentFragment(); | |
356 statusCodeFragment.createChild("div", "header-name").textContent = W
ebInspector.UIString("Status Code") + ":"; | |
357 | |
358 var statusCodeImage = statusCodeFragment.createChild("label", "resou
rce-status-image", "dt-icon-label"); | |
359 statusCodeImage.title = this._request.statusCode + " " + this._reque
st.statusText; | |
360 | |
361 if (this._request.statusCode < 300 || this._request.statusCode === 3
04) | |
362 statusCodeImage.type = "green-ball"; | |
363 else if (this._request.statusCode < 400) | |
364 statusCodeImage.type = "orange-ball"; | |
365 else | |
366 statusCodeImage.type = "red-ball"; | |
367 | |
368 requestMethodElement.title = this._formatHeader(WebInspector.UIStrin
g("Request Method"), this._request.requestMethod); | |
369 | |
370 var statusTextElement = statusCodeFragment.createChild("div", "heade
r-value source-code"); | |
371 var statusText = this._request.statusCode + " " + this._request.stat
usText; | |
372 if (this._request.fetchedViaServiceWorker) { | |
373 statusText += " " + WebInspector.UIString("(from ServiceWorker)"
); | |
374 statusTextElement.classList.add("status-from-cache"); | |
375 } else if (this._request.cached()) { | |
376 if (this._request.cachedInMemory()) | |
377 statusText += " " + WebInspector.UIString("(from memory cach
e)"); | |
378 else | |
379 statusText += " " + WebInspector.UIString("(from disk cache)
"); | |
380 statusTextElement.classList.add("status-from-cache"); | |
381 } | |
382 statusTextElement.textContent = statusText; | |
383 | |
384 statusCodeElement.title = statusCodeFragment; | |
385 } | |
386 }, | |
387 | |
388 /** | |
389 * @param {string} title | |
390 * @param {!TreeElement} headersTreeElement | |
391 * @param {number} headersLength | |
392 */ | |
393 _refreshHeadersTitle: function(title, headersTreeElement, headersLength) | |
394 { | |
395 headersTreeElement.listItemElement.removeChildren(); | |
396 headersTreeElement.listItemElement.createTextChild(title); | |
397 | |
398 var headerCount = WebInspector.UIString("\u00A0(%d)", headersLength); | |
399 headersTreeElement.listItemElement.createChild("span", "header-count").t
extContent = headerCount; | |
400 }, | |
401 | |
402 /** | |
403 * @param {string} title | |
404 * @param {!Array.<!WebInspector.NetworkRequest.NameValue>} headers | |
405 * @param {!TreeElement} headersTreeElement | |
406 * @param {boolean=} provisionalHeaders | |
407 */ | |
408 _refreshHeaders: function(title, headers, headersTreeElement, provisionalHea
ders) | |
409 { | |
410 headersTreeElement.removeChildren(); | |
411 | |
412 var length = headers.length; | |
413 this._refreshHeadersTitle(title, headersTreeElement, length); | |
414 | |
415 if (provisionalHeaders) { | |
416 var cautionText = WebInspector.UIString("Provisional headers are sho
wn"); | |
417 var cautionFragment = createDocumentFragment(); | |
418 cautionFragment.createChild("label", "", "dt-icon-label").type = "wa
rning-icon"; | |
419 cautionFragment.createChild("div", "caution").textContent = cautionT
ext; | |
420 var cautionTreeElement = new TreeElement(cautionFragment); | |
421 cautionTreeElement.selectable = false; | |
422 headersTreeElement.appendChild(cautionTreeElement); | |
423 } | |
424 | |
425 headersTreeElement.hidden = !length && !provisionalHeaders; | |
426 for (var i = 0; i < length; ++i) { | |
427 var headerTreeElement = new TreeElement(this._formatHeader(headers[i
].name, headers[i].value)); | |
428 headerTreeElement.selectable = false; | |
429 headersTreeElement.appendChild(headerTreeElement); | |
430 } | |
431 }, | |
432 | |
433 /** | |
434 * @param {string} title | |
435 * @param {number} count | |
436 * @param {string} headersText | |
437 * @param {!TreeElement} headersTreeElement | |
438 */ | |
439 _refreshHeadersText: function(title, count, headersText, headersTreeElement) | |
440 { | |
441 this._populateTreeElementWithSourceText(headersTreeElement, headersText)
; | |
442 this._refreshHeadersTitle(title, headersTreeElement, count); | |
443 }, | |
444 | |
445 _refreshRemoteAddress: function() | |
446 { | |
447 var remoteAddress = this._request.remoteAddress(); | |
448 var treeElement = this._remoteAddressItem; | |
449 treeElement.hidden = !remoteAddress; | |
450 if (remoteAddress) | |
451 treeElement.title = this._formatHeader(WebInspector.UIString("Remote
Address"), remoteAddress); | |
452 }, | |
453 | 268 |
454 /** | 269 /** |
455 * @param {!Event} event | 270 * @param {!Event} event |
| 271 * @this {WebInspector.RequestHeadersView} |
456 */ | 272 */ |
457 _toggleRequestHeadersText: function(event) | 273 function toggleViewSource(event) { |
458 { | 274 treeElement._viewSource = !treeElement._viewSource; |
459 this._showRequestHeadersText = !this._showRequestHeadersText; | 275 this._refreshRequestJSONPayload(parsedObject, sourceText); |
460 this._refreshRequestHeaders(); | 276 event.consume(); |
461 event.consume(); | 277 } |
462 }, | 278 |
463 | 279 listItem.appendChild(this._createViewSourceToggle(treeElement._viewSource, t
oggleViewSource.bind(this))); |
464 /** | 280 if (treeElement._viewSource) { |
465 * @param {!Event} event | 281 this._populateTreeElementWithSourceText(this._requestPayloadCategory, sour
ceText); |
466 */ | 282 } else { |
467 _toggleResponseHeadersText: function(event) | 283 var object = WebInspector.RemoteObject.fromLocalObject(parsedObject); |
468 { | 284 var section = new WebInspector.ObjectPropertiesSection(object, object.desc
ription); |
469 this._showResponseHeadersText = !this._showResponseHeadersText; | 285 section.expand(); |
470 this._refreshResponseHeaders(); | 286 section.editable = false; |
471 event.consume(); | 287 treeElement.appendChild(new TreeElement(section.element)); |
472 }, | 288 } |
473 | 289 } |
474 /** | 290 |
475 * @param {string} title | 291 /** |
476 * @return {!Element} | 292 * @param {boolean} viewSource |
477 */ | 293 * @param {function(!Event)} handler |
478 _createToggleButton: function(title) | 294 * @return {!Element} |
479 { | 295 */ |
480 var button = createElementWithClass("span", "header-toggle"); | 296 _createViewSourceToggle(viewSource, handler) { |
481 button.textContent = title; | 297 var viewSourceToggleTitle = |
482 return button; | 298 viewSource ? WebInspector.UIString('view parsed') : WebInspector.UIStrin
g('view source'); |
483 }, | 299 var viewSourceToggleButton = this._createToggleButton(viewSourceToggleTitle)
; |
484 | 300 viewSourceToggleButton.addEventListener('click', handler, false); |
485 /** | 301 return viewSourceToggleButton; |
486 * @param {boolean} isHeadersTextShown | 302 } |
487 * @return {!Element} | 303 |
488 */ | 304 /** |
489 _createHeadersToggleButton: function(isHeadersTextShown) | 305 * @param {!Event} event |
490 { | 306 */ |
491 var toggleTitle = isHeadersTextShown ? WebInspector.UIString("view parse
d") : WebInspector.UIString("view source"); | 307 _toggleURLDecoding(event) { |
492 return this._createToggleButton(toggleTitle); | 308 this._decodeRequestParameters = !this._decodeRequestParameters; |
493 }, | 309 this._refreshQueryString(); |
494 | 310 this._refreshFormData(); |
495 __proto__: WebInspector.VBox.prototype | 311 event.consume(); |
| 312 } |
| 313 |
| 314 _refreshRequestHeaders() { |
| 315 var treeElement = this._requestHeadersCategory; |
| 316 var headers = this._request.requestHeaders().slice(); |
| 317 headers.sort(function(a, b) { |
| 318 return a.name.toLowerCase().compareTo(b.name.toLowerCase()); |
| 319 }); |
| 320 var headersText = this._request.requestHeadersText(); |
| 321 |
| 322 if (this._showRequestHeadersText && headersText) |
| 323 this._refreshHeadersText(WebInspector.UIString('Request Headers'), headers
.length, headersText, treeElement); |
| 324 else |
| 325 this._refreshHeaders(WebInspector.UIString('Request Headers'), headers, tr
eeElement, headersText === undefined); |
| 326 |
| 327 if (headersText) { |
| 328 var toggleButton = this._createHeadersToggleButton(this._showRequestHeader
sText); |
| 329 toggleButton.addEventListener('click', this._toggleRequestHeadersText.bind
(this), false); |
| 330 treeElement.listItemElement.appendChild(toggleButton); |
| 331 } |
| 332 |
| 333 this._refreshFormData(); |
| 334 } |
| 335 |
| 336 _refreshResponseHeaders() { |
| 337 var treeElement = this._responseHeadersCategory; |
| 338 var headers = this._request.sortedResponseHeaders.slice(); |
| 339 var headersText = this._request.responseHeadersText; |
| 340 |
| 341 if (this._showResponseHeadersText) |
| 342 this._refreshHeadersText(WebInspector.UIString('Response Headers'), header
s.length, headersText, treeElement); |
| 343 else |
| 344 this._refreshHeaders(WebInspector.UIString('Response Headers'), headers, t
reeElement); |
| 345 |
| 346 if (headersText) { |
| 347 var toggleButton = this._createHeadersToggleButton(this._showResponseHeade
rsText); |
| 348 toggleButton.addEventListener('click', this._toggleResponseHeadersText.bin
d(this), false); |
| 349 treeElement.listItemElement.appendChild(toggleButton); |
| 350 } |
| 351 } |
| 352 |
| 353 _refreshHTTPInformation() { |
| 354 var requestMethodElement = this._requestMethodItem; |
| 355 requestMethodElement.hidden = !this._request.statusCode; |
| 356 var statusCodeElement = this._statusCodeItem; |
| 357 statusCodeElement.hidden = !this._request.statusCode; |
| 358 |
| 359 if (this._request.statusCode) { |
| 360 var statusCodeFragment = createDocumentFragment(); |
| 361 statusCodeFragment.createChild('div', 'header-name').textContent = WebInsp
ector.UIString('Status Code') + ':'; |
| 362 |
| 363 var statusCodeImage = statusCodeFragment.createChild('label', 'resource-st
atus-image', 'dt-icon-label'); |
| 364 statusCodeImage.title = this._request.statusCode + ' ' + this._request.sta
tusText; |
| 365 |
| 366 if (this._request.statusCode < 300 || this._request.statusCode === 304) |
| 367 statusCodeImage.type = 'green-ball'; |
| 368 else if (this._request.statusCode < 400) |
| 369 statusCodeImage.type = 'orange-ball'; |
| 370 else |
| 371 statusCodeImage.type = 'red-ball'; |
| 372 |
| 373 requestMethodElement.title = |
| 374 this._formatHeader(WebInspector.UIString('Request Method'), this._requ
est.requestMethod); |
| 375 |
| 376 var statusTextElement = statusCodeFragment.createChild('div', 'header-valu
e source-code'); |
| 377 var statusText = this._request.statusCode + ' ' + this._request.statusText
; |
| 378 if (this._request.fetchedViaServiceWorker) { |
| 379 statusText += ' ' + WebInspector.UIString('(from ServiceWorker)'); |
| 380 statusTextElement.classList.add('status-from-cache'); |
| 381 } else if (this._request.cached()) { |
| 382 if (this._request.cachedInMemory()) |
| 383 statusText += ' ' + WebInspector.UIString('(from memory cache)'); |
| 384 else |
| 385 statusText += ' ' + WebInspector.UIString('(from disk cache)'); |
| 386 statusTextElement.classList.add('status-from-cache'); |
| 387 } |
| 388 statusTextElement.textContent = statusText; |
| 389 |
| 390 statusCodeElement.title = statusCodeFragment; |
| 391 } |
| 392 } |
| 393 |
| 394 /** |
| 395 * @param {string} title |
| 396 * @param {!TreeElement} headersTreeElement |
| 397 * @param {number} headersLength |
| 398 */ |
| 399 _refreshHeadersTitle(title, headersTreeElement, headersLength) { |
| 400 headersTreeElement.listItemElement.removeChildren(); |
| 401 headersTreeElement.listItemElement.createTextChild(title); |
| 402 |
| 403 var headerCount = WebInspector.UIString('\u00A0(%d)', headersLength); |
| 404 headersTreeElement.listItemElement.createChild('span', 'header-count').textC
ontent = headerCount; |
| 405 } |
| 406 |
| 407 /** |
| 408 * @param {string} title |
| 409 * @param {!Array.<!WebInspector.NetworkRequest.NameValue>} headers |
| 410 * @param {!TreeElement} headersTreeElement |
| 411 * @param {boolean=} provisionalHeaders |
| 412 */ |
| 413 _refreshHeaders(title, headers, headersTreeElement, provisionalHeaders) { |
| 414 headersTreeElement.removeChildren(); |
| 415 |
| 416 var length = headers.length; |
| 417 this._refreshHeadersTitle(title, headersTreeElement, length); |
| 418 |
| 419 if (provisionalHeaders) { |
| 420 var cautionText = WebInspector.UIString('Provisional headers are shown'); |
| 421 var cautionFragment = createDocumentFragment(); |
| 422 cautionFragment.createChild('label', '', 'dt-icon-label').type = 'warning-
icon'; |
| 423 cautionFragment.createChild('div', 'caution').textContent = cautionText; |
| 424 var cautionTreeElement = new TreeElement(cautionFragment); |
| 425 cautionTreeElement.selectable = false; |
| 426 headersTreeElement.appendChild(cautionTreeElement); |
| 427 } |
| 428 |
| 429 headersTreeElement.hidden = !length && !provisionalHeaders; |
| 430 for (var i = 0; i < length; ++i) { |
| 431 var headerTreeElement = new TreeElement(this._formatHeader(headers[i].name
, headers[i].value)); |
| 432 headerTreeElement.selectable = false; |
| 433 headersTreeElement.appendChild(headerTreeElement); |
| 434 } |
| 435 } |
| 436 |
| 437 /** |
| 438 * @param {string} title |
| 439 * @param {number} count |
| 440 * @param {string} headersText |
| 441 * @param {!TreeElement} headersTreeElement |
| 442 */ |
| 443 _refreshHeadersText(title, count, headersText, headersTreeElement) { |
| 444 this._populateTreeElementWithSourceText(headersTreeElement, headersText); |
| 445 this._refreshHeadersTitle(title, headersTreeElement, count); |
| 446 } |
| 447 |
| 448 _refreshRemoteAddress() { |
| 449 var remoteAddress = this._request.remoteAddress(); |
| 450 var treeElement = this._remoteAddressItem; |
| 451 treeElement.hidden = !remoteAddress; |
| 452 if (remoteAddress) |
| 453 treeElement.title = this._formatHeader(WebInspector.UIString('Remote Addre
ss'), remoteAddress); |
| 454 } |
| 455 |
| 456 /** |
| 457 * @param {!Event} event |
| 458 */ |
| 459 _toggleRequestHeadersText(event) { |
| 460 this._showRequestHeadersText = !this._showRequestHeadersText; |
| 461 this._refreshRequestHeaders(); |
| 462 event.consume(); |
| 463 } |
| 464 |
| 465 /** |
| 466 * @param {!Event} event |
| 467 */ |
| 468 _toggleResponseHeadersText(event) { |
| 469 this._showResponseHeadersText = !this._showResponseHeadersText; |
| 470 this._refreshResponseHeaders(); |
| 471 event.consume(); |
| 472 } |
| 473 |
| 474 /** |
| 475 * @param {string} title |
| 476 * @return {!Element} |
| 477 */ |
| 478 _createToggleButton(title) { |
| 479 var button = createElementWithClass('span', 'header-toggle'); |
| 480 button.textContent = title; |
| 481 return button; |
| 482 } |
| 483 |
| 484 /** |
| 485 * @param {boolean} isHeadersTextShown |
| 486 * @return {!Element} |
| 487 */ |
| 488 _createHeadersToggleButton(isHeadersTextShown) { |
| 489 var toggleTitle = isHeadersTextShown ? WebInspector.UIString('view parsed')
: WebInspector.UIString('view source'); |
| 490 return this._createToggleButton(toggleTitle); |
| 491 } |
496 }; | 492 }; |
497 | 493 |
498 /** | 494 /** |
499 * @constructor | 495 * @unrestricted |
500 * @extends {TreeElement} | |
501 * @param {!TreeOutline} root | |
502 * @param {string} name | |
503 * @param {string=} title | |
504 */ | 496 */ |
505 WebInspector.RequestHeadersView.Category = function(root, name, title) | 497 WebInspector.RequestHeadersView.Category = class extends TreeElement { |
506 { | 498 /** |
507 TreeElement.call(this, title || "", true); | 499 * @param {!TreeOutline} root |
| 500 * @param {string} name |
| 501 * @param {string=} title |
| 502 */ |
| 503 constructor(root, name, title) { |
| 504 super(title || '', true); |
508 this.selectable = false; | 505 this.selectable = false; |
509 this.toggleOnClick = true; | 506 this.toggleOnClick = true; |
510 this.hidden = true; | 507 this.hidden = true; |
511 this._expandedSetting = WebInspector.settings.createSetting("request-info-"
+ name + "-category-expanded", true); | 508 this._expandedSetting = WebInspector.settings.createSetting('request-info-'
+ name + '-category-expanded', true); |
512 this.expanded = this._expandedSetting.get(); | 509 this.expanded = this._expandedSetting.get(); |
513 root.appendChild(this); | 510 root.appendChild(this); |
| 511 } |
| 512 |
| 513 /** |
| 514 * @return {!TreeElement} |
| 515 */ |
| 516 createLeaf() { |
| 517 var leaf = new TreeElement(); |
| 518 leaf.selectable = false; |
| 519 this.appendChild(leaf); |
| 520 return leaf; |
| 521 } |
| 522 |
| 523 /** |
| 524 * @override |
| 525 */ |
| 526 onexpand() { |
| 527 this._expandedSetting.set(true); |
| 528 } |
| 529 |
| 530 /** |
| 531 * @override |
| 532 */ |
| 533 oncollapse() { |
| 534 this._expandedSetting.set(false); |
| 535 } |
514 }; | 536 }; |
515 | |
516 WebInspector.RequestHeadersView.Category.prototype = { | |
517 /** | |
518 * @return {!TreeElement} | |
519 */ | |
520 createLeaf: function() | |
521 { | |
522 var leaf = new TreeElement(); | |
523 leaf.selectable = false; | |
524 this.appendChild(leaf); | |
525 return leaf; | |
526 }, | |
527 | |
528 onexpand: function() | |
529 { | |
530 this._expandedSetting.set(true); | |
531 }, | |
532 | |
533 oncollapse: function() | |
534 { | |
535 this._expandedSetting.set(false); | |
536 }, | |
537 | |
538 __proto__: TreeElement.prototype | |
539 }; | |
OLD | NEW |