blob: 513ab15204eeb56a40c33ece0f3050086735ac2b [file] [log] [blame]
Blink Reformat4c46d092018-04-07 15:32:371/*
2 * Copyright (C) 2007, 2008 Apple Inc. All rights reserved.
3 * Copyright (C) IBM Corp. 2009 All rights reserved.
4 * Copyright (C) 2010 Google Inc. All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:
9 *
10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
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
17 * from this software without specific prior written permission.
18 *
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
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
23 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
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
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
28 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 */
30
Tim van der Lippe0ed1d2b2020-02-04 13:45:1331import * as Common from '../common/common.js';
32import * as ObjectUI from '../object_ui/object_ui.js';
33import * as SDK from '../sdk/sdk.js';
34import * as UI from '../ui/ui.js';
35
36export class RequestHeadersView extends UI.Widget.VBox {
Blink Reformat4c46d092018-04-07 15:32:3737 /**
Tim van der Lippe0ed1d2b2020-02-04 13:45:1338 * @param {!SDK.NetworkRequest.NetworkRequest} request
Blink Reformat4c46d092018-04-07 15:32:3739 */
40 constructor(request) {
41 super();
42 this.registerRequiredCSS('network/requestHeadersView.css');
43 this.element.classList.add('request-headers-view');
44
45 this._request = request;
46 this._decodeRequestParameters = true;
47 this._showRequestHeadersText = false;
48 this._showResponseHeadersText = false;
49
Tim van der Lippe0ed1d2b2020-02-04 13:45:1350 /** @type {?UI.TreeOutline.TreeElement} */
Blink Reformat4c46d092018-04-07 15:32:3751 this._highlightedElement = null;
52
Tim van der Lippe0ed1d2b2020-02-04 13:45:1353 const root = new UI.TreeOutline.TreeOutlineInShadow();
Amanda Bakerc3d15272019-10-25 00:56:3954 root.registerRequiredCSS('object_ui/objectValue.css');
55 root.registerRequiredCSS('object_ui/objectPropertiesSection.css');
Blink Reformat4c46d092018-04-07 15:32:3756 root.registerRequiredCSS('network/requestHeadersTree.css');
57 root.element.classList.add('request-headers-tree');
Blink Reformat4c46d092018-04-07 15:32:3758 root.makeDense();
Blink Reformat4c46d092018-04-07 15:32:3759 this.element.appendChild(root.element);
60
Tim van der Lippe0ed1d2b2020-02-04 13:45:1361 const generalCategory = new Category(root, 'general', Common.UIString.UIString('General'));
Blink Reformat4c46d092018-04-07 15:32:3762 generalCategory.hidden = false;
Amanda Baker2e19a1b2019-10-25 00:41:0263 this._root = generalCategory;
Blink Reformat4c46d092018-04-07 15:32:3764 this._urlItem = generalCategory.createLeaf();
65 this._requestMethodItem = generalCategory.createLeaf();
66 this._statusCodeItem = generalCategory.createLeaf();
67 this._remoteAddressItem = generalCategory.createLeaf();
68 this._remoteAddressItem.hidden = true;
69 this._referrerPolicyItem = generalCategory.createLeaf();
70 this._referrerPolicyItem.hidden = true;
71
Paul Lewis56509652019-12-06 12:51:5872 this._responseHeadersCategory = new Category(root, 'responseHeaders', '');
73 this._requestHeadersCategory = new Category(root, 'requestHeaders', '');
74 this._queryStringCategory = new Category(root, 'queryString', '');
75 this._formDataCategory = new Category(root, 'formData', '');
Tim van der Lippe0ed1d2b2020-02-04 13:45:1376 this._requestPayloadCategory = new Category(root, 'requestPayload', Common.UIString.UIString('Request Payload'));
Blink Reformat4c46d092018-04-07 15:32:3777 }
78
79 /**
80 * @override
81 */
82 wasShown() {
83 this._clearHighlight();
84 this._request.addEventListener(SDK.NetworkRequest.Events.RemoteAddressChanged, this._refreshRemoteAddress, this);
85 this._request.addEventListener(SDK.NetworkRequest.Events.RequestHeadersChanged, this._refreshRequestHeaders, this);
86 this._request.addEventListener(
87 SDK.NetworkRequest.Events.ResponseHeadersChanged, this._refreshResponseHeaders, this);
88 this._request.addEventListener(SDK.NetworkRequest.Events.FinishedLoading, this._refreshHTTPInformation, this);
89
90 this._refreshURL();
91 this._refreshQueryString();
92 this._refreshRequestHeaders();
93 this._refreshResponseHeaders();
94 this._refreshHTTPInformation();
95 this._refreshRemoteAddress();
96 this._refreshReferrerPolicy();
Amanda Baker2e19a1b2019-10-25 00:41:0297 this._root.select(/* omitFocus */ true, /* selectedByUser */ false);
Blink Reformat4c46d092018-04-07 15:32:3798 }
99
100 /**
101 * @override
102 */
103 willHide() {
104 this._request.removeEventListener(SDK.NetworkRequest.Events.RemoteAddressChanged, this._refreshRemoteAddress, this);
105 this._request.removeEventListener(
106 SDK.NetworkRequest.Events.RequestHeadersChanged, this._refreshRequestHeaders, this);
107 this._request.removeEventListener(
108 SDK.NetworkRequest.Events.ResponseHeadersChanged, this._refreshResponseHeaders, this);
109 this._request.removeEventListener(SDK.NetworkRequest.Events.FinishedLoading, this._refreshHTTPInformation, this);
110 }
111
112 /**
113 * @param {string} name
114 * @param {string} value
115 * @return {!DocumentFragment}
116 */
117 _formatHeader(name, value) {
118 const fragment = createDocumentFragment();
119 fragment.createChild('div', 'header-name').textContent = name + ': ';
120 fragment.createChild('span', 'header-separator');
121 fragment.createChild('div', 'header-value source-code').textContent = value;
122
123 return fragment;
124 }
125
126 /**
Sigurd Schneidercae7b532020-03-06 11:20:06127 * @param {!{name:string,value:(string|undefined),headerNotSet:(boolean|undefined),headerValueIncorrect:(boolean|undefined),details:(!{explanation:string,examples:!Array<!{codeSnippet:string,comment:(string|undefined)}>}|undefined)}} header
Sigurd Schneidera2afe0b2020-03-03 15:27:13128 * @return {!DocumentFragment}
129 */
130 _formatHeaderObject(header) {
131 const fragment = createDocumentFragment();
132 if (header.headerNotSet) {
133 fragment.createChild('div', 'header-badge header-badge-text').textContent = 'not-set';
134 }
135 const colon = header.value ? ': ' : '';
136 fragment.createChild('div', 'header-name').textContent = header.name + colon;
137 fragment.createChild('span', 'header-separator');
138 if (header.value) {
139 if (header.headerValueIncorrect) {
140 fragment.createChild('div', 'header-value source-code header-warning').textContent = header.value;
141 } else {
142 fragment.createChild('div', 'header-value source-code').textContent = header.value;
143 }
144 }
145 if (header.details) {
Sigurd Schneidercae7b532020-03-06 11:20:06146 const detailsNode = fragment.createChild('div', 'header-details');
147 const callToAction = detailsNode.createChild('div', 'call-to-action');
148 const callToActionBody = callToAction.createChild('div', 'call-to-action-body');
149 callToActionBody.createChild('div', 'explanation').textContent = header.details.explanation;
150 for (const example of header.details.examples) {
151 const exampleNode = callToActionBody.createChild('div', 'example');
152 exampleNode.createChild('code').textContent = example.codeSnippet;
153 if (example.comment) {
154 exampleNode.createChild('span', 'comment').textContent = example.comment;
155 }
156 }
Sigurd Schneidere07f9ee2020-03-25 14:09:39157
158 if (Root.Runtime.experiments.isEnabled('issuesPane') &&
159 SDK.RelatedIssue.hasIssueOfCategory(
160 this._request, SDK.RelatedIssue.IssueCategory.CrossOriginEmbedderPolicy)) {
161 const link = createElementWithClass('div', 'devtools-link');
162 link.onclick = () => {
163 SDK.RelatedIssue.reveal(this._request, SDK.RelatedIssue.IssueCategory.CrossOriginEmbedderPolicy);
164 };
165 const text = createElementWithClass('span', 'devtools-link');
166 text.textContent = 'Learn more in the issues panel';
167 link.appendChild(text);
168 link.prepend(UI.Icon.Icon.create('largeicon-breaking-change', 'icon'));
169 callToActionBody.appendChild(link);
170 } else if (header.details.link) {
Sigurd Schneidereaadca12020-03-10 13:50:40171 const link = UI.XLink.XLink.create(header.details.link.url, ls`Learn more`, 'link');
172 link.prepend(UI.Icon.Icon.create('largeicon-link', 'link-icon'));
173 callToActionBody.appendChild(link);
174 }
Sigurd Schneidera2afe0b2020-03-03 15:27:13175 }
176 return fragment;
177 }
178
179 /**
Blink Reformat4c46d092018-04-07 15:32:37180 * @param {string} value
181 * @param {string} className
182 * @param {boolean} decodeParameters
183 * @return {!Element}
184 */
185 _formatParameter(value, className, decodeParameters) {
186 let errorDecoding = false;
187
188 if (decodeParameters) {
189 value = value.replace(/\+/g, ' ');
190 if (value.indexOf('%') >= 0) {
191 try {
192 value = decodeURIComponent(value);
193 } catch (e) {
194 errorDecoding = true;
195 }
196 }
197 }
198 const div = createElementWithClass('div', className);
Tim van der Lippe1d6e57a2019-09-30 11:55:34199 if (value === '') {
Blink Reformat4c46d092018-04-07 15:32:37200 div.classList.add('empty-value');
Tim van der Lippe1d6e57a2019-09-30 11:55:34201 }
202 if (errorDecoding) {
Tim van der Lippe0ed1d2b2020-02-04 13:45:13203 div.createChild('span', 'header-decode-error').textContent = Common.UIString.UIString('(unable to decode value)');
Tim van der Lippe1d6e57a2019-09-30 11:55:34204 } else {
Blink Reformat4c46d092018-04-07 15:32:37205 div.textContent = value;
Tim van der Lippe1d6e57a2019-09-30 11:55:34206 }
Blink Reformat4c46d092018-04-07 15:32:37207 return div;
208 }
209
210 _refreshURL() {
Tim van der Lippe0ed1d2b2020-02-04 13:45:13211 this._urlItem.title = this._formatHeader(Common.UIString.UIString('Request URL'), this._request.url());
Blink Reformat4c46d092018-04-07 15:32:37212 }
213
214 _refreshQueryString() {
215 const queryString = this._request.queryString();
216 const queryParameters = this._request.queryParameters;
217 this._queryStringCategory.hidden = !queryParameters;
218 if (queryParameters) {
219 this._refreshParams(
Tim van der Lippe0ed1d2b2020-02-04 13:45:13220 Common.UIString.UIString('Query String Parameters'), queryParameters, queryString, this._queryStringCategory);
Blink Reformat4c46d092018-04-07 15:32:37221 }
222 }
223
224 async _refreshFormData() {
225 this._formDataCategory.hidden = true;
226 this._requestPayloadCategory.hidden = true;
227
228 const formData = await this._request.requestFormData();
Tim van der Lippe1d6e57a2019-09-30 11:55:34229 if (!formData) {
Blink Reformat4c46d092018-04-07 15:32:37230 return;
Tim van der Lippe1d6e57a2019-09-30 11:55:34231 }
Blink Reformat4c46d092018-04-07 15:32:37232
233 const formParameters = await this._request.formParameters();
234 if (formParameters) {
235 this._formDataCategory.hidden = false;
Tim van der Lippe0ed1d2b2020-02-04 13:45:13236 this._refreshParams(Common.UIString.UIString('Form Data'), formParameters, formData, this._formDataCategory);
Blink Reformat4c46d092018-04-07 15:32:37237 } else {
238 this._requestPayloadCategory.hidden = false;
239 try {
240 const json = JSON.parse(formData);
241 this._refreshRequestJSONPayload(json, formData);
242 } catch (e) {
243 this._populateTreeElementWithSourceText(this._requestPayloadCategory, formData);
244 }
245 }
246 }
247
248 /**
Tim van der Lippe0ed1d2b2020-02-04 13:45:13249 * @param {!UI.TreeOutline.TreeElement} treeElement
Blink Reformat4c46d092018-04-07 15:32:37250 * @param {?string} sourceText
251 */
252 _populateTreeElementWithSourceText(treeElement, sourceText) {
253 const max_len = 3000;
254 const text = (sourceText || '').trim();
255 const trim = text.length > max_len;
256
257 const sourceTextElement = createElementWithClass('span', 'header-value source-code');
258 sourceTextElement.textContent = trim ? text.substr(0, max_len) : text;
259
Tim van der Lippe0ed1d2b2020-02-04 13:45:13260 const sourceTreeElement = new UI.TreeOutline.TreeElement(sourceTextElement);
Blink Reformat4c46d092018-04-07 15:32:37261 treeElement.removeChildren();
262 treeElement.appendChild(sourceTreeElement);
Tim van der Lippe1d6e57a2019-09-30 11:55:34263 if (!trim) {
Blink Reformat4c46d092018-04-07 15:32:37264 return;
Tim van der Lippe1d6e57a2019-09-30 11:55:34265 }
Blink Reformat4c46d092018-04-07 15:32:37266
267 const showMoreButton = createElementWithClass('button', 'request-headers-show-more-button');
Tim van der Lippe0ed1d2b2020-02-04 13:45:13268 showMoreButton.textContent = Common.UIString.UIString('Show more');
Amanda Baker89806492019-10-25 01:49:02269
270 function showMore() {
Blink Reformat4c46d092018-04-07 15:32:37271 showMoreButton.remove();
272 sourceTextElement.textContent = text;
Amanda Baker89806492019-10-25 01:49:02273 sourceTreeElement.listItemElement.removeEventListener('contextmenu', onContextMenuShowMore);
274 }
275 showMoreButton.addEventListener('click', showMore);
276
277 /**
278 * @param {!Event} event
279 */
280 function onContextMenuShowMore(event) {
Tim van der Lippe0ed1d2b2020-02-04 13:45:13281 const contextMenu = new UI.ContextMenu.ContextMenu(event);
Amanda Baker89806492019-10-25 01:49:02282 const section = contextMenu.newSection();
283 section.appendItem(ls`Show more`, showMore);
284 contextMenu.show();
285 }
286 sourceTreeElement.listItemElement.addEventListener('contextmenu', onContextMenuShowMore);
Blink Reformat4c46d092018-04-07 15:32:37287 sourceTextElement.appendChild(showMoreButton);
288 }
289
290 /**
291 * @param {string} title
292 * @param {?Array.<!SDK.NetworkRequest.NameValue>} params
293 * @param {?string} sourceText
Tim van der Lippe0ed1d2b2020-02-04 13:45:13294 * @param {!UI.TreeOutline.TreeElement} paramsTreeElement
Blink Reformat4c46d092018-04-07 15:32:37295 */
296 _refreshParams(title, params, sourceText, paramsTreeElement) {
297 paramsTreeElement.removeChildren();
298
299 paramsTreeElement.listItemElement.removeChildren();
Amanda Baker2e19a1b2019-10-25 00:41:02300 paramsTreeElement.listItemElement.createChild('div', 'selection fill');
Blink Reformat4c46d092018-04-07 15:32:37301 paramsTreeElement.listItemElement.createTextChild(title);
302
303 const headerCount = createElementWithClass('span', 'header-count');
Tim van der Lippe0ed1d2b2020-02-04 13:45:13304 headerCount.textContent = Common.UIString.UIString('\xA0(%d)', params.length);
Blink Reformat4c46d092018-04-07 15:32:37305 paramsTreeElement.listItemElement.appendChild(headerCount);
306
Paul Lewis56509652019-12-06 12:51:58307 const shouldViewSource = paramsTreeElement[_viewSourceSymbol];
Amanda Bakere2bb99d2019-10-25 01:28:43308 if (shouldViewSource) {
309 this._appendParamsSource(title, params, sourceText, paramsTreeElement);
310 } else {
311 this._appendParamsParsed(title, params, sourceText, paramsTreeElement);
312 }
313 }
314
315 /**
316 * @param {string} title
317 * @param {?Array.<!SDK.NetworkRequest.NameValue>} params
318 * @param {?string} sourceText
Tim van der Lippe0ed1d2b2020-02-04 13:45:13319 * @param {!UI.TreeOutline.TreeElement} paramsTreeElement
Amanda Bakere2bb99d2019-10-25 01:28:43320 */
321 _appendParamsSource(title, params, sourceText, paramsTreeElement) {
322 this._populateTreeElementWithSourceText(paramsTreeElement, sourceText);
323
324 const listItemElement = paramsTreeElement.listItemElement;
325
Blink Reformat4c46d092018-04-07 15:32:37326 /**
327 * @param {!Event} event
Paul Lewis56509652019-12-06 12:51:58328 * @this {RequestHeadersView}
Blink Reformat4c46d092018-04-07 15:32:37329 */
Amanda Bakere2bb99d2019-10-25 01:28:43330 const viewParsed = function(event) {
331 listItemElement.removeEventListener('contextmenu', viewParsedContextMenu);
332
Paul Lewis56509652019-12-06 12:51:58333 paramsTreeElement[_viewSourceSymbol] = false;
Blink Reformat4c46d092018-04-07 15:32:37334 this._refreshParams(title, params, sourceText, paramsTreeElement);
335 event.consume();
Amanda Bakere2bb99d2019-10-25 01:28:43336 };
Blink Reformat4c46d092018-04-07 15:32:37337
Amanda Bakere2bb99d2019-10-25 01:28:43338 /**
339 * @param {!Event} event
Paul Lewis56509652019-12-06 12:51:58340 * @this {RequestHeadersView}
Amanda Bakere2bb99d2019-10-25 01:28:43341 */
342 const viewParsedContextMenu = function(event) {
343 if (!paramsTreeElement.expanded) {
344 return;
345 }
Tim van der Lippe0ed1d2b2020-02-04 13:45:13346 const contextMenu = new UI.ContextMenu.ContextMenu(event);
Amanda Bakere2bb99d2019-10-25 01:28:43347 contextMenu.newSection().appendItem(ls`View parsed`, viewParsed.bind(this, event));
348 contextMenu.show();
349 }.bind(this);
Blink Reformat4c46d092018-04-07 15:32:37350
Amanda Bakere2bb99d2019-10-25 01:28:43351 const viewParsedButton = this._createViewSourceToggle(/* viewSource */ true, viewParsed.bind(this));
352 listItemElement.appendChild(viewParsedButton);
Blink Reformat4c46d092018-04-07 15:32:37353
Amanda Bakere2bb99d2019-10-25 01:28:43354 listItemElement.addEventListener('contextmenu', viewParsedContextMenu);
355 }
Blink Reformat4c46d092018-04-07 15:32:37356
Amanda Bakere2bb99d2019-10-25 01:28:43357 /**
358 * @param {string} title
359 * @param {?Array.<!SDK.NetworkRequest.NameValue>} params
360 * @param {?string} sourceText
Tim van der Lippe0ed1d2b2020-02-04 13:45:13361 * @param {!UI.TreeOutline.TreeElement} paramsTreeElement
Amanda Bakere2bb99d2019-10-25 01:28:43362 */
363 _appendParamsParsed(title, params, sourceText, paramsTreeElement) {
Blink Reformat4c46d092018-04-07 15:32:37364 for (let i = 0; i < params.length; ++i) {
365 const paramNameValue = createDocumentFragment();
366 if (params[i].name !== '') {
367 const name = this._formatParameter(params[i].name + ': ', 'header-name', this._decodeRequestParameters);
368 const value = this._formatParameter(params[i].value, 'header-value source-code', this._decodeRequestParameters);
369 paramNameValue.appendChild(name);
370 paramNameValue.createChild('span', 'header-separator');
371 paramNameValue.appendChild(value);
372 } else {
Tim van der Lippe0ed1d2b2020-02-04 13:45:13373 paramNameValue.appendChild(this._formatParameter(
374 Common.UIString.UIString('(empty)'), 'empty-request-header', this._decodeRequestParameters));
Blink Reformat4c46d092018-04-07 15:32:37375 }
376
Tim van der Lippe0ed1d2b2020-02-04 13:45:13377 const paramTreeElement = new UI.TreeOutline.TreeElement(paramNameValue);
Blink Reformat4c46d092018-04-07 15:32:37378 paramsTreeElement.appendChild(paramTreeElement);
379 }
Amanda Bakere2bb99d2019-10-25 01:28:43380
381 const listItemElement = paramsTreeElement.listItemElement;
382
383 /**
384 * @param {!Event} event
Paul Lewis56509652019-12-06 12:51:58385 * @this {RequestHeadersView}
Amanda Bakere2bb99d2019-10-25 01:28:43386 */
387 const viewSource = function(event) {
388 listItemElement.removeEventListener('contextmenu', viewSourceContextMenu);
389
Paul Lewis56509652019-12-06 12:51:58390 paramsTreeElement[_viewSourceSymbol] = true;
Amanda Bakere2bb99d2019-10-25 01:28:43391 this._refreshParams(title, params, sourceText, paramsTreeElement);
392 event.consume();
393 };
394
395 /**
396 * @param {!Event} event
Paul Lewis56509652019-12-06 12:51:58397 * @this {RequestHeadersView}
Amanda Bakere2bb99d2019-10-25 01:28:43398 */
399 const toggleURLDecoding = function(event) {
400 listItemElement.removeEventListener('contextmenu', viewSourceContextMenu);
401 this._toggleURLDecoding(event);
402 };
403
404 /**
405 * @param {!Event} event
Paul Lewis56509652019-12-06 12:51:58406 * @this {RequestHeadersView}
Amanda Bakere2bb99d2019-10-25 01:28:43407 */
408 const viewSourceContextMenu = function(event) {
409 if (!paramsTreeElement.expanded) {
410 return;
411 }
Tim van der Lippe0ed1d2b2020-02-04 13:45:13412 const contextMenu = new UI.ContextMenu.ContextMenu(event);
Amanda Bakere2bb99d2019-10-25 01:28:43413 const section = contextMenu.newSection();
414 section.appendItem(ls`View source`, viewSource.bind(this, event));
415 const viewURLEncodedText = this._decodeRequestParameters ? ls`View URL encoded` : ls`View decoded`;
416 section.appendItem(viewURLEncodedText, toggleURLDecoding.bind(this, event));
417 contextMenu.show();
418 }.bind(this);
419
420 const viewSourceButton = this._createViewSourceToggle(/* viewSource */ false, viewSource.bind(this));
421 listItemElement.appendChild(viewSourceButton);
422
423 const toggleTitle = this._decodeRequestParameters ? ls`view URL encoded` : ls`view decoded`;
424 const toggleButton = this._createToggleButton(toggleTitle);
425 toggleButton.addEventListener('click', toggleURLDecoding.bind(this), false);
426 listItemElement.appendChild(toggleButton);
427
428 listItemElement.addEventListener('contextmenu', viewSourceContextMenu);
Blink Reformat4c46d092018-04-07 15:32:37429 }
430
431 /**
432 * @param {*} parsedObject
433 * @param {string} sourceText
434 */
435 _refreshRequestJSONPayload(parsedObject, sourceText) {
Amanda Baker1815fca2019-10-25 01:16:00436 const rootListItem = this._requestPayloadCategory;
437 rootListItem.removeChildren();
Blink Reformat4c46d092018-04-07 15:32:37438
Amanda Baker1815fca2019-10-25 01:16:00439 const rootListItemElement = rootListItem.listItemElement;
440 rootListItemElement.removeChildren();
441 rootListItemElement.createChild('div', 'selection fill');
442 rootListItemElement.createTextChild(this._requestPayloadCategory.title);
443
Paul Lewis56509652019-12-06 12:51:58444 const shouldViewSource = rootListItem[_viewSourceSymbol];
Amanda Baker1815fca2019-10-25 01:16:00445 if (shouldViewSource) {
446 this._appendJSONPayloadSource(rootListItem, parsedObject, sourceText);
447 } else {
448 this._appendJSONPayloadParsed(rootListItem, parsedObject, sourceText);
449 }
450 }
451
452 /**
Paul Lewis56509652019-12-06 12:51:58453 * @param {!Category} rootListItem
Amanda Baker1815fca2019-10-25 01:16:00454 * @param {*} parsedObject
455 * @param {string} sourceText
456 */
457 _appendJSONPayloadSource(rootListItem, parsedObject, sourceText) {
458 const rootListItemElement = rootListItem.listItemElement;
459 this._populateTreeElementWithSourceText(rootListItem, sourceText);
Blink Reformat4c46d092018-04-07 15:32:37460
461 /**
462 * @param {!Event} event
Paul Lewis56509652019-12-06 12:51:58463 * @this {RequestHeadersView}
Blink Reformat4c46d092018-04-07 15:32:37464 */
Amanda Baker1815fca2019-10-25 01:16:00465 const viewParsed = function(event) {
466 rootListItemElement.removeEventListener('contextmenu', viewParsedContextMenu);
Paul Lewis56509652019-12-06 12:51:58467 rootListItem[_viewSourceSymbol] = false;
Blink Reformat4c46d092018-04-07 15:32:37468 this._refreshRequestJSONPayload(parsedObject, sourceText);
469 event.consume();
Amanda Baker1815fca2019-10-25 01:16:00470 };
Blink Reformat4c46d092018-04-07 15:32:37471
Amanda Baker1815fca2019-10-25 01:16:00472 const viewParsedButton = this._createViewSourceToggle(/* viewSource */ true, viewParsed.bind(this));
473 rootListItemElement.appendChild(viewParsedButton);
474
475 /**
476 * @param {!Event} event
Paul Lewis56509652019-12-06 12:51:58477 * @this {RequestHeadersView}
Amanda Baker1815fca2019-10-25 01:16:00478 */
479 const viewParsedContextMenu = function(event) {
480 if (!rootListItem.expanded) {
481 return;
482 }
Tim van der Lippe0ed1d2b2020-02-04 13:45:13483 const contextMenu = new UI.ContextMenu.ContextMenu(event);
Amanda Baker1815fca2019-10-25 01:16:00484 contextMenu.newSection().appendItem(ls`View parsed`, viewParsed.bind(this, event));
485 contextMenu.show();
486 }.bind(this);
487
488 rootListItemElement.addEventListener('contextmenu', viewParsedContextMenu);
489 }
490
491 /**
Paul Lewis56509652019-12-06 12:51:58492 * @param {!Category} rootListItem
Amanda Baker1815fca2019-10-25 01:16:00493 * @param {*} parsedObject
494 * @param {string} sourceText
495 */
496 _appendJSONPayloadParsed(rootListItem, parsedObject, sourceText) {
Tim van der Lippe0ed1d2b2020-02-04 13:45:13497 const object =
498 /** @type {!SDK.RemoteObject.LocalJSONObject} */ (SDK.RemoteObject.RemoteObject.fromLocalObject(parsedObject));
Amanda Baker1815fca2019-10-25 01:16:00499 const section = new ObjectUI.ObjectPropertiesSection.RootElement(object);
500 section.title = object.description;
501 section.expand();
502 section.editable = false;
503 rootListItem.childrenListElement.classList.add('source-code', 'object-properties-section');
504
505 rootListItem.appendChild(section);
506 const rootListItemElement = rootListItem.listItemElement;
507
508 /**
509 * @param {!Event} event
Paul Lewis56509652019-12-06 12:51:58510 * @this {RequestHeadersView}
Amanda Baker1815fca2019-10-25 01:16:00511 */
512 const viewSource = function(event) {
513 rootListItemElement.removeEventListener('contextmenu', viewSourceContextMenu);
514
Paul Lewis56509652019-12-06 12:51:58515 rootListItem[_viewSourceSymbol] = true;
Amanda Baker1815fca2019-10-25 01:16:00516 this._refreshRequestJSONPayload(parsedObject, sourceText);
517 event.consume();
518 };
519
520 /**
521 * @param {!Event} event
Paul Lewis56509652019-12-06 12:51:58522 * @this {RequestHeadersView}
Amanda Baker1815fca2019-10-25 01:16:00523 */
524 const viewSourceContextMenu = function(event) {
525 if (!rootListItem.expanded) {
526 return;
527 }
Tim van der Lippe0ed1d2b2020-02-04 13:45:13528 const contextMenu = new UI.ContextMenu.ContextMenu(event);
Amanda Baker1815fca2019-10-25 01:16:00529 contextMenu.newSection().appendItem(ls`View source`, viewSource.bind(this, event));
530 contextMenu.show();
531 }.bind(this);
532
533 const viewSourceButton = this._createViewSourceToggle(/* viewSource */ false, viewSource.bind(this));
534 rootListItemElement.appendChild(viewSourceButton);
535
536 rootListItemElement.addEventListener('contextmenu', viewSourceContextMenu);
Blink Reformat4c46d092018-04-07 15:32:37537 }
538
539 /**
540 * @param {boolean} viewSource
541 * @param {function(!Event)} handler
542 * @return {!Element}
543 */
544 _createViewSourceToggle(viewSource, handler) {
Tim van der Lippe0ed1d2b2020-02-04 13:45:13545 const viewSourceToggleTitle =
546 viewSource ? Common.UIString.UIString('view parsed') : Common.UIString.UIString('view source');
Blink Reformat4c46d092018-04-07 15:32:37547 const viewSourceToggleButton = this._createToggleButton(viewSourceToggleTitle);
548 viewSourceToggleButton.addEventListener('click', handler, false);
549 return viewSourceToggleButton;
550 }
551
552 /**
553 * @param {!Event} event
554 */
555 _toggleURLDecoding(event) {
556 this._decodeRequestParameters = !this._decodeRequestParameters;
557 this._refreshQueryString();
558 this._refreshFormData();
559 event.consume();
560 }
561
562 _refreshRequestHeaders() {
563 const treeElement = this._requestHeadersCategory;
564 const headers = this._request.requestHeaders().slice();
565 headers.sort(function(a, b) {
566 return a.name.toLowerCase().compareTo(b.name.toLowerCase());
567 });
568 const headersText = this._request.requestHeadersText();
569
Tim van der Lippe1d6e57a2019-09-30 11:55:34570 if (this._showRequestHeadersText && headersText) {
Tim van der Lippe0ed1d2b2020-02-04 13:45:13571 this._refreshHeadersText(Common.UIString.UIString('Request Headers'), headers.length, headersText, treeElement);
Tim van der Lippe1d6e57a2019-09-30 11:55:34572 } else {
Tim van der Lippe0ed1d2b2020-02-04 13:45:13573 this._refreshHeaders(
574 Common.UIString.UIString('Request Headers'), headers, treeElement, headersText === undefined);
Tim van der Lippe1d6e57a2019-09-30 11:55:34575 }
Blink Reformat4c46d092018-04-07 15:32:37576
577 if (headersText) {
578 const toggleButton = this._createHeadersToggleButton(this._showRequestHeadersText);
579 toggleButton.addEventListener('click', this._toggleRequestHeadersText.bind(this), false);
580 treeElement.listItemElement.appendChild(toggleButton);
581 }
582
583 this._refreshFormData();
584 }
585
586 _refreshResponseHeaders() {
587 const treeElement = this._responseHeadersCategory;
588 const headers = this._request.sortedResponseHeaders.slice();
589 const headersText = this._request.responseHeadersText;
590
Joey Arhar7199a942019-09-10 22:37:39591 if (this._showResponseHeadersText) {
Tim van der Lippe0ed1d2b2020-02-04 13:45:13592 this._refreshHeadersText(Common.UIString.UIString('Response Headers'), headers.length, headersText, treeElement);
Joey Arhar7199a942019-09-10 22:37:39593 } else {
Sigurd Schneidera2afe0b2020-03-03 15:27:13594 const headersWithIssues = [];
595 if (this._request.wasBlocked()) {
596 const headerWithIssues = BlockedReasonDetails.get(this._request.blockedReason());
597 if (headerWithIssues) {
598 headersWithIssues.push(headerWithIssues);
599 }
600 }
Joey Arhar7199a942019-09-10 22:37:39601 this._refreshHeaders(
Sigurd Schneidera2afe0b2020-03-03 15:27:13602 Common.UIString.UIString('Response Headers'), mergeHeadersWithIssues(headers, headersWithIssues), treeElement,
603 /* provisional */ false, this._request.blockedResponseCookies());
Joey Arhar7199a942019-09-10 22:37:39604 }
Blink Reformat4c46d092018-04-07 15:32:37605
606 if (headersText) {
607 const toggleButton = this._createHeadersToggleButton(this._showResponseHeadersText);
608 toggleButton.addEventListener('click', this._toggleResponseHeadersText.bind(this), false);
609 treeElement.listItemElement.appendChild(toggleButton);
610 }
Sigurd Schneidera2afe0b2020-03-03 15:27:13611
612 /**
613 *
614 * @param {!Array<*>} headers
615 * @param {!Array<*>} headersWithIssues
616 */
617 function mergeHeadersWithIssues(headers, headersWithIssues) {
618 let i = 0, j = 0;
619 const result = [];
620 while (i < headers.length || j < headersWithIssues.length) {
621 if (i < headers.length && (j >= headersWithIssues.length || headers[i].name < headersWithIssues[j].name)) {
622 result.push({...headers[i++], headerNotSet: false});
623 } else if (
624 j < headersWithIssues.length && (i >= headers.length || headers[i].name > headersWithIssues[j].name)) {
625 result.push({...headersWithIssues[j++], headerNotSet: true});
626 } else if (
627 i < headers.length && j < headersWithIssues.length && headers[i].name === headersWithIssues[j].name) {
628 result.push({...headersWithIssues[j++], ...headers[i++], headerNotSet: false});
629 }
630 }
631 return result;
632 }
Blink Reformat4c46d092018-04-07 15:32:37633 }
634
635 _refreshHTTPInformation() {
636 const requestMethodElement = this._requestMethodItem;
637 requestMethodElement.hidden = !this._request.statusCode;
638 const statusCodeElement = this._statusCodeItem;
639 statusCodeElement.hidden = !this._request.statusCode;
640
641 if (this._request.statusCode) {
642 const statusCodeFragment = createDocumentFragment();
Tsuyoshi Horo41dcffd2019-05-24 03:59:05643 statusCodeFragment.createChild('div', 'header-name').textContent = ls`Status Code` +
644 ': ';
Blink Reformat4c46d092018-04-07 15:32:37645 statusCodeFragment.createChild('span', 'header-separator');
646
Joel Einbinder7fbe24c2019-01-24 05:19:01647 const statusCodeImage = statusCodeFragment.createChild('span', 'resource-status-image', 'dt-icon-label');
Blink Reformat4c46d092018-04-07 15:32:37648 statusCodeImage.title = this._request.statusCode + ' ' + this._request.statusText;
649
Tim van der Lippe1d6e57a2019-09-30 11:55:34650 if (this._request.statusCode < 300 || this._request.statusCode === 304) {
Blink Reformat4c46d092018-04-07 15:32:37651 statusCodeImage.type = 'smallicon-green-ball';
Tim van der Lippe1d6e57a2019-09-30 11:55:34652 } else if (this._request.statusCode < 400) {
Blink Reformat4c46d092018-04-07 15:32:37653 statusCodeImage.type = 'smallicon-orange-ball';
Tim van der Lippe1d6e57a2019-09-30 11:55:34654 } else {
Blink Reformat4c46d092018-04-07 15:32:37655 statusCodeImage.type = 'smallicon-red-ball';
Tim van der Lippe1d6e57a2019-09-30 11:55:34656 }
Blink Reformat4c46d092018-04-07 15:32:37657
Tsuyoshi Horo41dcffd2019-05-24 03:59:05658 requestMethodElement.title = this._formatHeader(ls`Request Method`, this._request.requestMethod);
Blink Reformat4c46d092018-04-07 15:32:37659
660 const statusTextElement = statusCodeFragment.createChild('div', 'header-value source-code');
661 let statusText = this._request.statusCode + ' ' + this._request.statusText;
Ben Kelly0375f502018-09-11 17:05:50662 if (this._request.cachedInMemory()) {
Tsuyoshi Horo41dcffd2019-05-24 03:59:05663 statusText += ' ' + ls`(from memory cache)`;
Ben Kelly0375f502018-09-11 17:05:50664 statusTextElement.classList.add('status-from-cache');
665 } else if (this._request.fetchedViaServiceWorker) {
Tsuyoshi Horo41dcffd2019-05-24 03:59:05666 statusText += ' ' + ls`(from ServiceWorker)`;
Blink Reformat4c46d092018-04-07 15:32:37667 statusTextElement.classList.add('status-from-cache');
Tsuyoshi Horo8f6a2b12018-10-01 22:24:03668 } else if (
669 this._request.redirectSource() && this._request.redirectSource().signedExchangeInfo() &&
670 !this._request.redirectSource().signedExchangeInfo().errors) {
Tsuyoshi Horo41dcffd2019-05-24 03:59:05671 statusText += ' ' + ls`(from signed-exchange)`;
672 statusTextElement.classList.add('status-from-cache');
673 } else if (this._request.fromPrefetchCache()) {
674 statusText += ' ' + ls`(from prefetch cache)`;
Tsuyoshi Horo02266c32018-05-21 17:01:18675 statusTextElement.classList.add('status-from-cache');
Blink Reformat4c46d092018-04-07 15:32:37676 } else if (this._request.cached()) {
Tsuyoshi Horo41dcffd2019-05-24 03:59:05677 statusText += ' ' + ls`(from disk cache)`;
Blink Reformat4c46d092018-04-07 15:32:37678 statusTextElement.classList.add('status-from-cache');
679 }
680 statusTextElement.textContent = statusText;
681
682 statusCodeElement.title = statusCodeFragment;
683 }
684 }
685
686 /**
687 * @param {string} title
Tim van der Lippe0ed1d2b2020-02-04 13:45:13688 * @param {!UI.TreeOutline.TreeElement} headersTreeElement
Blink Reformat4c46d092018-04-07 15:32:37689 * @param {number} headersLength
690 */
691 _refreshHeadersTitle(title, headersTreeElement, headersLength) {
692 headersTreeElement.listItemElement.removeChildren();
Amanda Baker2e19a1b2019-10-25 00:41:02693 headersTreeElement.listItemElement.createChild('div', 'selection fill');
Blink Reformat4c46d092018-04-07 15:32:37694 headersTreeElement.listItemElement.createTextChild(title);
695
Tim van der Lippe0ed1d2b2020-02-04 13:45:13696 const headerCount = Common.UIString.UIString('\xA0(%d)', headersLength);
Blink Reformat4c46d092018-04-07 15:32:37697 headersTreeElement.listItemElement.createChild('span', 'header-count').textContent = headerCount;
698 }
699
700 /**
701 * @param {string} title
702 * @param {!Array.<!SDK.NetworkRequest.NameValue>} headers
Tim van der Lippe0ed1d2b2020-02-04 13:45:13703 * @param {!UI.TreeOutline.TreeElement} headersTreeElement
Blink Reformat4c46d092018-04-07 15:32:37704 * @param {boolean=} provisionalHeaders
Joey Arhar7199a942019-09-10 22:37:39705 * @param {!Array<!SDK.NetworkRequest.BlockedSetCookieWithReason>=} blockedResponseCookies
Blink Reformat4c46d092018-04-07 15:32:37706 */
Joey Arhar7199a942019-09-10 22:37:39707 _refreshHeaders(title, headers, headersTreeElement, provisionalHeaders, blockedResponseCookies) {
Blink Reformat4c46d092018-04-07 15:32:37708 headersTreeElement.removeChildren();
709
710 const length = headers.length;
711 this._refreshHeadersTitle(title, headersTreeElement, length);
712
713 if (provisionalHeaders) {
Joey Arhara613f912020-01-17 22:46:57714 let cautionText;
715 let cautionTitle = '';
716 if (this._request.cachedInMemory() || this._request.cached()) {
717 cautionText = ls`Provisional headers are shown. Disable cache to see full headers.`;
718 cautionTitle = ls
719 `Only provisional headers are available because this request was not sent over the network and instead was served from a local cache, which doesn't store the original request headers. Disable cache to see full request headers.`;
720 } else {
721 cautionText = ls`Provisional headers are shown`;
722 }
723 const cautionElement = createElement('div');
724 cautionElement.title = cautionTitle;
725 cautionElement.createChild('span', '', 'dt-icon-label').type = 'smallicon-warning';
726 cautionElement.createChild('div', 'caution').textContent = cautionText;
Tim van der Lippe0ed1d2b2020-02-04 13:45:13727 const cautionTreeElement = new UI.TreeOutline.TreeElement(cautionElement);
Blink Reformat4c46d092018-04-07 15:32:37728 headersTreeElement.appendChild(cautionTreeElement);
729 }
730
Joey Arhar41a5fad2019-09-13 22:18:45731 /** @type {!Map<string, !Array<!Protocol.Network.SetCookieBlockedReason>>} */
732 const blockedCookieLineToReasons = new Map();
Joey Arhar7199a942019-09-10 22:37:39733 if (blockedResponseCookies) {
734 blockedResponseCookies.forEach(blockedCookie => {
Joey Arhar41a5fad2019-09-13 22:18:45735 blockedCookieLineToReasons.set(blockedCookie.cookieLine, blockedCookie.blockedReasons);
Joey Arhar7199a942019-09-10 22:37:39736 });
737 }
738
Blink Reformat4c46d092018-04-07 15:32:37739 headersTreeElement.hidden = !length && !provisionalHeaders;
740 for (let i = 0; i < length; ++i) {
Sigurd Schneidera2afe0b2020-03-03 15:27:13741 const headerTreeElement = new UI.TreeOutline.TreeElement(this._formatHeaderObject(headers[i]));
Paul Lewis56509652019-12-06 12:51:58742 headerTreeElement[_headerNameSymbol] = headers[i].name;
Joey Arhar7199a942019-09-10 22:37:39743
744 if (headers[i].name.toLowerCase() === 'set-cookie') {
Joey Arhar41a5fad2019-09-13 22:18:45745 const matchingBlockedReasons = blockedCookieLineToReasons.get(headers[i].value);
746 if (matchingBlockedReasons) {
Tim van der Lippe0ed1d2b2020-02-04 13:45:13747 const icon = UI.Icon.Icon.create('smallicon-warning', '');
Joey Arhar7199a942019-09-10 22:37:39748 headerTreeElement.listItemElement.appendChild(icon);
Joey Arhar41a5fad2019-09-13 22:18:45749
750 let titleText = '';
751 for (const blockedReason of matchingBlockedReasons) {
Tim van der Lippe1d6e57a2019-09-30 11:55:34752 if (titleText) {
Joey Arhar41a5fad2019-09-13 22:18:45753 titleText += '\n';
Tim van der Lippe1d6e57a2019-09-30 11:55:34754 }
Joey Arhar41a5fad2019-09-13 22:18:45755 titleText += SDK.NetworkRequest.setCookieBlockedReasonToUiString(blockedReason);
756 }
757 icon.title = titleText;
Joey Arhar7199a942019-09-10 22:37:39758 }
759 }
760
761 headersTreeElement.appendChild(headerTreeElement);
Blink Reformat4c46d092018-04-07 15:32:37762 }
763 }
764
765 /**
766 * @param {string} title
767 * @param {number} count
768 * @param {string} headersText
Tim van der Lippe0ed1d2b2020-02-04 13:45:13769 * @param {!UI.TreeOutline.TreeElement} headersTreeElement
Blink Reformat4c46d092018-04-07 15:32:37770 */
771 _refreshHeadersText(title, count, headersText, headersTreeElement) {
772 this._populateTreeElementWithSourceText(headersTreeElement, headersText);
773 this._refreshHeadersTitle(title, headersTreeElement, count);
774 }
775
776 _refreshRemoteAddress() {
777 const remoteAddress = this._request.remoteAddress();
778 const treeElement = this._remoteAddressItem;
779 treeElement.hidden = !remoteAddress;
Tim van der Lippe1d6e57a2019-09-30 11:55:34780 if (remoteAddress) {
Tim van der Lippe0ed1d2b2020-02-04 13:45:13781 treeElement.title = this._formatHeader(Common.UIString.UIString('Remote Address'), remoteAddress);
Tim van der Lippe1d6e57a2019-09-30 11:55:34782 }
Blink Reformat4c46d092018-04-07 15:32:37783 }
784
785 _refreshReferrerPolicy() {
786 const referrerPolicy = this._request.referrerPolicy();
787 const treeElement = this._referrerPolicyItem;
788 treeElement.hidden = !referrerPolicy;
Tim van der Lippe1d6e57a2019-09-30 11:55:34789 if (referrerPolicy) {
Tim van der Lippe0ed1d2b2020-02-04 13:45:13790 treeElement.title = this._formatHeader(Common.UIString.UIString('Referrer Policy'), referrerPolicy);
Tim van der Lippe1d6e57a2019-09-30 11:55:34791 }
Blink Reformat4c46d092018-04-07 15:32:37792 }
793
794 /**
795 * @param {!Event} event
796 */
797 _toggleRequestHeadersText(event) {
798 this._showRequestHeadersText = !this._showRequestHeadersText;
799 this._refreshRequestHeaders();
800 event.consume();
801 }
802
803 /**
804 * @param {!Event} event
805 */
806 _toggleResponseHeadersText(event) {
807 this._showResponseHeadersText = !this._showResponseHeadersText;
808 this._refreshResponseHeaders();
809 event.consume();
810 }
811
812 /**
813 * @param {string} title
814 * @return {!Element}
815 */
816 _createToggleButton(title) {
817 const button = createElementWithClass('span', 'header-toggle');
818 button.textContent = title;
819 return button;
820 }
821
822 /**
823 * @param {boolean} isHeadersTextShown
824 * @return {!Element}
825 */
826 _createHeadersToggleButton(isHeadersTextShown) {
Tim van der Lippe0ed1d2b2020-02-04 13:45:13827 const toggleTitle =
828 isHeadersTextShown ? Common.UIString.UIString('view parsed') : Common.UIString.UIString('view source');
Blink Reformat4c46d092018-04-07 15:32:37829 return this._createToggleButton(toggleTitle);
830 }
831
832 _clearHighlight() {
Tim van der Lippe1d6e57a2019-09-30 11:55:34833 if (this._highlightedElement) {
Blink Reformat4c46d092018-04-07 15:32:37834 this._highlightedElement.listItemElement.classList.remove('header-highlight');
Tim van der Lippe1d6e57a2019-09-30 11:55:34835 }
Blink Reformat4c46d092018-04-07 15:32:37836 this._highlightedElement = null;
837 }
838
839
840 /**
Tim van der Lippe0ed1d2b2020-02-04 13:45:13841 * @param {?UI.TreeOutline.TreeElement} category
Blink Reformat4c46d092018-04-07 15:32:37842 * @param {string} name
843 */
844 _revealAndHighlight(category, name) {
845 this._clearHighlight();
846 for (const element of category.children()) {
Paul Lewis56509652019-12-06 12:51:58847 if (element[_headerNameSymbol] !== name) {
Blink Reformat4c46d092018-04-07 15:32:37848 continue;
Tim van der Lippe1d6e57a2019-09-30 11:55:34849 }
Blink Reformat4c46d092018-04-07 15:32:37850 this._highlightedElement = element;
851 element.reveal();
852 element.listItemElement.classList.add('header-highlight');
853 return;
854 }
855 }
856
857 /**
858 * @param {string} header
859 */
860 revealRequestHeader(header) {
861 this._revealAndHighlight(this._requestHeadersCategory, header);
862 }
863
864 /**
865 * @param {string} header
866 */
867 revealResponseHeader(header) {
868 this._revealAndHighlight(this._responseHeadersCategory, header);
869 }
Paul Lewis56509652019-12-06 12:51:58870}
Blink Reformat4c46d092018-04-07 15:32:37871
Paul Lewis56509652019-12-06 12:51:58872export const _headerNameSymbol = Symbol('HeaderName');
873export const _viewSourceSymbol = Symbol('ViewSource');
Blink Reformat4c46d092018-04-07 15:32:37874
875/**
876 * @unrestricted
877 */
Tim van der Lippe0ed1d2b2020-02-04 13:45:13878export class Category extends UI.TreeOutline.TreeElement {
Blink Reformat4c46d092018-04-07 15:32:37879 /**
Tim van der Lippe0ed1d2b2020-02-04 13:45:13880 * @param {!UI.TreeOutline.TreeOutline} root
Blink Reformat4c46d092018-04-07 15:32:37881 * @param {string} name
882 * @param {string=} title
883 */
884 constructor(root, name, title) {
885 super(title || '', true);
Blink Reformat4c46d092018-04-07 15:32:37886 this.toggleOnClick = true;
887 this.hidden = true;
Paul Lewis2d7d65c2020-03-16 17:26:30888 this._expandedSetting =
889 Common.Settings.Settings.instance().createSetting('request-info-' + name + '-category-expanded', true);
Blink Reformat4c46d092018-04-07 15:32:37890 this.expanded = this._expandedSetting.get();
891 root.appendChild(this);
892 }
893
894 /**
Tim van der Lippe0ed1d2b2020-02-04 13:45:13895 * @return {!UI.TreeOutline.TreeElement}
Blink Reformat4c46d092018-04-07 15:32:37896 */
897 createLeaf() {
Tim van der Lippe0ed1d2b2020-02-04 13:45:13898 const leaf = new UI.TreeOutline.TreeElement();
Blink Reformat4c46d092018-04-07 15:32:37899 this.appendChild(leaf);
900 return leaf;
901 }
902
903 /**
904 * @override
905 */
906 onexpand() {
907 this._expandedSetting.set(true);
908 }
909
910 /**
911 * @override
912 */
913 oncollapse() {
914 this._expandedSetting.set(false);
915 }
Paul Lewis56509652019-12-06 12:51:58916}
Sigurd Schneidera2afe0b2020-03-03 15:27:13917
918
919const BlockedReasonDetails = new Map([
920 [
921 Protocol.Network.BlockedReason.CoepFrameResourceNeedsCoepHeader, {
922 name: 'cross-origin-embedder-policy',
923 value: null,
Sigurd Schneidercae7b532020-03-06 11:20:06924 details: {
925 explanation:
926 ls
927 `To embed this frame in your document, the response needs to enable the cross-origin embedder policy by specifying the following response header:`,
Sigurd Schneidereaadca12020-03-10 13:50:40928 examples: [{codeSnippet:'Cross-Origin-Embedder-Policy: require-corp'}],
929 link: {url: 'https://web.dev/coop-coep/'}
Sigurd Schneidercae7b532020-03-06 11:20:06930 }
Sigurd Schneidera2afe0b2020-03-03 15:27:13931 }
932 ],
933 [
934 Protocol.Network.BlockedReason.CorpNotSameOriginAfterDefaultedToSameOriginByCoep, {
935 name: 'cross-origin-resource-policy',
936 value: null,
Sigurd Schneidercae7b532020-03-06 11:20:06937 details: {
938 explanation:
939 ls
940 `To use this resource from a different origin, the server needs to specify a cross-origin resource policy in the response headers:`,
941 examples: [
942 {codeSnippet:'Cross-Origin-Resource-Policy: same-site', comment: ls`Choose this option if the resource and the document are served from the same site.` },
943 {codeSnippet:'Cross-Origin-Resource-Policy: cross-origin', comment: ls`Only choose this option if an arbitrary website including this resource does not impose a security risk.` },
Sigurd Schneidereaadca12020-03-10 13:50:40944 ],
945 link: {url: 'https://web.dev/coop-coep/'}
Sigurd Schneidercae7b532020-03-06 11:20:06946 }
Sigurd Schneidera2afe0b2020-03-03 15:27:13947 }
948 ],
949 [
950 Protocol.Network.BlockedReason.CoopSandboxedIframeCannotNavigateToCoopPage, {
951 name: 'cross-origin-opener-policy',
952 value: null,
953 headerValueIncorrect: false,
Sigurd Schneidercae7b532020-03-06 11:20:06954 details: {
955 explanation:
956 ls
957 `This document was blocked from loading in an iframe with a sandbox attribute because this document specified a cross-origin opener policy.`,
Sigurd Schneidereaadca12020-03-10 13:50:40958 examples: [],
959 link: {url: 'https://web.dev/coop-coep/'}
Sigurd Schneidercae7b532020-03-06 11:20:06960 }
Sigurd Schneidera2afe0b2020-03-03 15:27:13961 }
962 ],
963 [
964 Protocol.Network.BlockedReason.CorpNotSameSite, {
965 name: 'cross-origin-resource-policy',
966 value: null,
967 headerValueIncorrect: true,
Sigurd Schneidercae7b532020-03-06 11:20:06968 details: {
969 explanation:
970 ls
971 `To use this resource from a different site, the server may relax the cross-origin resource policy response header:`,
972 examples: [
973 {codeSnippet:'Cross-Origin-Resource-Policy: cross-origin', comment: ls`Only choose this option if an arbitrary website including this resource does not impose a security risk.` },
974 ]
975 }
Sigurd Schneidera2afe0b2020-03-03 15:27:13976 }
977 ],
978 [
979 Protocol.Network.BlockedReason.CorpNotSameOrigin, {
980 name: 'cross-origin-resource-policy',
981 value: null,
982 headerValueIncorrect: true,
Sigurd Schneidercae7b532020-03-06 11:20:06983 details: {
984 explanation:
985 ls
986 `To use this resource from a different origin, the server may relax the cross-origin resource policy response header:`,
987 examples: [
988 {codeSnippet:'Cross-Origin-Resource-Policy: same-site', comment: ls`Choose this option if the resource and the document are served from the same site.` },
989 {codeSnippet:'Cross-Origin-Resource-Policy: cross-origin', comment: ls`Only choose this option if an arbitrary website including this resource does not impose a security risk.` },
990 ]
991 }
Sigurd Schneidera2afe0b2020-03-03 15:27:13992 }
993 ],
994]);