blob: 3c10522fe3bdb9fca41d140726e537ca915f7062 [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
Sigurd Schneiderba818512020-04-29 10:54:3731import * as BrowserSDK from '../browser_sdk/browser_sdk.js';
Mathias Bynens4a0d1932020-07-28 06:31:3732import * as ClientVariationsParser from '../client_variations/client_variations.js';
Tim van der Lippe0ed1d2b2020-02-04 13:45:1333import * as Common from '../common/common.js';
Wolfgang Beyera03d3df2020-05-04 13:59:3134import * as Host from '../host/host.js';
Tim van der Lippe0ed1d2b2020-02-04 13:45:1335import * as ObjectUI from '../object_ui/object_ui.js';
Sigurd Schneiderc8c1e352020-05-08 14:33:2236import * as Root from '../root/root.js';
Tim van der Lippe0ed1d2b2020-02-04 13:45:1337import * as SDK from '../sdk/sdk.js';
38import * as UI from '../ui/ui.js';
39
40export class RequestHeadersView extends UI.Widget.VBox {
Blink Reformat4c46d092018-04-07 15:32:3741 /**
Tim van der Lippe0ed1d2b2020-02-04 13:45:1342 * @param {!SDK.NetworkRequest.NetworkRequest} request
Blink Reformat4c46d092018-04-07 15:32:3743 */
44 constructor(request) {
45 super();
46 this.registerRequiredCSS('network/requestHeadersView.css');
47 this.element.classList.add('request-headers-view');
48
49 this._request = request;
50 this._decodeRequestParameters = true;
51 this._showRequestHeadersText = false;
52 this._showResponseHeadersText = false;
53
Alex Rudenko9d00edb2020-04-09 09:50:0954 const contentType = request.requestContentType();
55 if (contentType) {
56 this._decodeRequestParameters = !!contentType.match(/^application\/x-www-form-urlencoded\s*(;.*)?$/i);
57 }
58
Tim van der Lippe0ed1d2b2020-02-04 13:45:1359 /** @type {?UI.TreeOutline.TreeElement} */
Blink Reformat4c46d092018-04-07 15:32:3760 this._highlightedElement = null;
61
Tim van der Lippe0ed1d2b2020-02-04 13:45:1362 const root = new UI.TreeOutline.TreeOutlineInShadow();
Amanda Bakerc3d15272019-10-25 00:56:3963 root.registerRequiredCSS('object_ui/objectValue.css');
64 root.registerRequiredCSS('object_ui/objectPropertiesSection.css');
Blink Reformat4c46d092018-04-07 15:32:3765 root.registerRequiredCSS('network/requestHeadersTree.css');
66 root.element.classList.add('request-headers-tree');
Blink Reformat4c46d092018-04-07 15:32:3767 root.makeDense();
Blink Reformat4c46d092018-04-07 15:32:3768 this.element.appendChild(root.element);
69
Tim van der Lippe0ed1d2b2020-02-04 13:45:1370 const generalCategory = new Category(root, 'general', Common.UIString.UIString('General'));
Blink Reformat4c46d092018-04-07 15:32:3771 generalCategory.hidden = false;
Amanda Baker2e19a1b2019-10-25 00:41:0272 this._root = generalCategory;
Jack Lynch8abed542020-05-08 23:13:4273 this.setDefaultFocusedElement(this._root.listItemElement);
Blink Reformat4c46d092018-04-07 15:32:3774 this._urlItem = generalCategory.createLeaf();
75 this._requestMethodItem = generalCategory.createLeaf();
76 this._statusCodeItem = generalCategory.createLeaf();
77 this._remoteAddressItem = generalCategory.createLeaf();
78 this._remoteAddressItem.hidden = true;
79 this._referrerPolicyItem = generalCategory.createLeaf();
80 this._referrerPolicyItem.hidden = true;
81
Paul Lewis56509652019-12-06 12:51:5882 this._responseHeadersCategory = new Category(root, 'responseHeaders', '');
83 this._requestHeadersCategory = new Category(root, 'requestHeaders', '');
84 this._queryStringCategory = new Category(root, 'queryString', '');
85 this._formDataCategory = new Category(root, 'formData', '');
Tim van der Lippe0ed1d2b2020-02-04 13:45:1386 this._requestPayloadCategory = new Category(root, 'requestPayload', Common.UIString.UIString('Request Payload'));
Blink Reformat4c46d092018-04-07 15:32:3787 }
88
89 /**
90 * @override
91 */
92 wasShown() {
93 this._clearHighlight();
94 this._request.addEventListener(SDK.NetworkRequest.Events.RemoteAddressChanged, this._refreshRemoteAddress, this);
95 this._request.addEventListener(SDK.NetworkRequest.Events.RequestHeadersChanged, this._refreshRequestHeaders, this);
96 this._request.addEventListener(
97 SDK.NetworkRequest.Events.ResponseHeadersChanged, this._refreshResponseHeaders, this);
98 this._request.addEventListener(SDK.NetworkRequest.Events.FinishedLoading, this._refreshHTTPInformation, this);
99
100 this._refreshURL();
101 this._refreshQueryString();
102 this._refreshRequestHeaders();
103 this._refreshResponseHeaders();
104 this._refreshHTTPInformation();
105 this._refreshRemoteAddress();
106 this._refreshReferrerPolicy();
Amanda Baker2e19a1b2019-10-25 00:41:02107 this._root.select(/* omitFocus */ true, /* selectedByUser */ false);
Blink Reformat4c46d092018-04-07 15:32:37108 }
109
110 /**
111 * @override
112 */
113 willHide() {
114 this._request.removeEventListener(SDK.NetworkRequest.Events.RemoteAddressChanged, this._refreshRemoteAddress, this);
115 this._request.removeEventListener(
116 SDK.NetworkRequest.Events.RequestHeadersChanged, this._refreshRequestHeaders, this);
117 this._request.removeEventListener(
118 SDK.NetworkRequest.Events.ResponseHeadersChanged, this._refreshResponseHeaders, this);
119 this._request.removeEventListener(SDK.NetworkRequest.Events.FinishedLoading, this._refreshHTTPInformation, this);
120 }
121
122 /**
123 * @param {string} name
124 * @param {string} value
125 * @return {!DocumentFragment}
126 */
127 _formatHeader(name, value) {
128 const fragment = createDocumentFragment();
129 fragment.createChild('div', 'header-name').textContent = name + ': ';
130 fragment.createChild('span', 'header-separator');
131 fragment.createChild('div', 'header-value source-code').textContent = value;
132
133 return fragment;
134 }
135
136 /**
Sigurd Schneidercae7b532020-03-06 11:20:06137 * @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:13138 * @return {!DocumentFragment}
139 */
140 _formatHeaderObject(header) {
141 const fragment = createDocumentFragment();
142 if (header.headerNotSet) {
143 fragment.createChild('div', 'header-badge header-badge-text').textContent = 'not-set';
144 }
145 const colon = header.value ? ': ' : '';
146 fragment.createChild('div', 'header-name').textContent = header.name + colon;
147 fragment.createChild('span', 'header-separator');
148 if (header.value) {
149 if (header.headerValueIncorrect) {
150 fragment.createChild('div', 'header-value source-code header-warning').textContent = header.value;
151 } else {
152 fragment.createChild('div', 'header-value source-code').textContent = header.value;
153 }
154 }
155 if (header.details) {
Sigurd Schneidercae7b532020-03-06 11:20:06156 const detailsNode = fragment.createChild('div', 'header-details');
157 const callToAction = detailsNode.createChild('div', 'call-to-action');
158 const callToActionBody = callToAction.createChild('div', 'call-to-action-body');
159 callToActionBody.createChild('div', 'explanation').textContent = header.details.explanation;
160 for (const example of header.details.examples) {
161 const exampleNode = callToActionBody.createChild('div', 'example');
162 exampleNode.createChild('code').textContent = example.codeSnippet;
163 if (example.comment) {
164 exampleNode.createChild('span', 'comment').textContent = example.comment;
165 }
166 }
Sigurd Schneidere07f9ee2020-03-25 14:09:39167
168 if (Root.Runtime.experiments.isEnabled('issuesPane') &&
Sigurd Schneiderba818512020-04-29 10:54:37169 BrowserSDK.RelatedIssue.hasIssueOfCategory(
170 this._request, SDK.Issue.IssueCategory.CrossOriginEmbedderPolicy)) {
Tim van der Lippef49e2322020-05-01 15:03:09171 const link = document.createElement('div');
172 link.classList.add('devtools-link');
Sigurd Schneidere07f9ee2020-03-25 14:09:39173 link.onclick = () => {
Wolfgang Beyera03d3df2020-05-04 13:59:31174 Host.userMetrics.issuesPanelOpenedFrom(Host.UserMetrics.IssueOpener.LearnMoreLinkCOEP);
Sigurd Schneiderba818512020-04-29 10:54:37175 BrowserSDK.RelatedIssue.reveal(this._request, SDK.Issue.IssueCategory.CrossOriginEmbedderPolicy);
Sigurd Schneidere07f9ee2020-03-25 14:09:39176 };
Tim van der Lippef49e2322020-05-01 15:03:09177 const text = document.createElement('span');
178 text.classList.add('devtools-link');
Sigurd Schneider4be26cf2020-05-12 12:35:23179 text.textContent = ls`Learn more in the issues tab`;
Sigurd Schneidere07f9ee2020-03-25 14:09:39180 link.appendChild(text);
181 link.prepend(UI.Icon.Icon.create('largeicon-breaking-change', 'icon'));
182 callToActionBody.appendChild(link);
183 } else if (header.details.link) {
Sigurd Schneidereaadca12020-03-10 13:50:40184 const link = UI.XLink.XLink.create(header.details.link.url, ls`Learn more`, 'link');
185 link.prepend(UI.Icon.Icon.create('largeicon-link', 'link-icon'));
186 callToActionBody.appendChild(link);
187 }
Sigurd Schneidera2afe0b2020-03-03 15:27:13188 }
189 return fragment;
190 }
191
192 /**
Blink Reformat4c46d092018-04-07 15:32:37193 * @param {string} value
194 * @param {string} className
195 * @param {boolean} decodeParameters
196 * @return {!Element}
197 */
198 _formatParameter(value, className, decodeParameters) {
199 let errorDecoding = false;
200
201 if (decodeParameters) {
202 value = value.replace(/\+/g, ' ');
203 if (value.indexOf('%') >= 0) {
204 try {
205 value = decodeURIComponent(value);
206 } catch (e) {
207 errorDecoding = true;
208 }
209 }
210 }
Tim van der Lippe7ea01c22020-05-04 12:27:22211 const div = document.createElement('div');
212 if (className) {
213 div.className = className;
214 }
Tim van der Lippe1d6e57a2019-09-30 11:55:34215 if (value === '') {
Blink Reformat4c46d092018-04-07 15:32:37216 div.classList.add('empty-value');
Tim van der Lippe1d6e57a2019-09-30 11:55:34217 }
218 if (errorDecoding) {
Tim van der Lippe0ed1d2b2020-02-04 13:45:13219 div.createChild('span', 'header-decode-error').textContent = Common.UIString.UIString('(unable to decode value)');
Tim van der Lippe1d6e57a2019-09-30 11:55:34220 } else {
Blink Reformat4c46d092018-04-07 15:32:37221 div.textContent = value;
Tim van der Lippe1d6e57a2019-09-30 11:55:34222 }
Blink Reformat4c46d092018-04-07 15:32:37223 return div;
224 }
225
226 _refreshURL() {
Tim van der Lippe0ed1d2b2020-02-04 13:45:13227 this._urlItem.title = this._formatHeader(Common.UIString.UIString('Request URL'), this._request.url());
Blink Reformat4c46d092018-04-07 15:32:37228 }
229
230 _refreshQueryString() {
231 const queryString = this._request.queryString();
232 const queryParameters = this._request.queryParameters;
233 this._queryStringCategory.hidden = !queryParameters;
234 if (queryParameters) {
235 this._refreshParams(
Tim van der Lippe0ed1d2b2020-02-04 13:45:13236 Common.UIString.UIString('Query String Parameters'), queryParameters, queryString, this._queryStringCategory);
Blink Reformat4c46d092018-04-07 15:32:37237 }
238 }
239
240 async _refreshFormData() {
Blink Reformat4c46d092018-04-07 15:32:37241 const formData = await this._request.requestFormData();
Tim van der Lippe1d6e57a2019-09-30 11:55:34242 if (!formData) {
Alex Rudenko9d00edb2020-04-09 09:50:09243 this._formDataCategory.hidden = true;
244 this._requestPayloadCategory.hidden = true;
Blink Reformat4c46d092018-04-07 15:32:37245 return;
Tim van der Lippe1d6e57a2019-09-30 11:55:34246 }
Blink Reformat4c46d092018-04-07 15:32:37247
248 const formParameters = await this._request.formParameters();
249 if (formParameters) {
250 this._formDataCategory.hidden = false;
Alex Rudenko9d00edb2020-04-09 09:50:09251 this._requestPayloadCategory.hidden = true;
Tim van der Lippe0ed1d2b2020-02-04 13:45:13252 this._refreshParams(Common.UIString.UIString('Form Data'), formParameters, formData, this._formDataCategory);
Blink Reformat4c46d092018-04-07 15:32:37253 } else {
254 this._requestPayloadCategory.hidden = false;
Alex Rudenko9d00edb2020-04-09 09:50:09255 this._formDataCategory.hidden = true;
Blink Reformat4c46d092018-04-07 15:32:37256 try {
257 const json = JSON.parse(formData);
258 this._refreshRequestJSONPayload(json, formData);
259 } catch (e) {
260 this._populateTreeElementWithSourceText(this._requestPayloadCategory, formData);
261 }
262 }
263 }
264
265 /**
Tim van der Lippe0ed1d2b2020-02-04 13:45:13266 * @param {!UI.TreeOutline.TreeElement} treeElement
Blink Reformat4c46d092018-04-07 15:32:37267 * @param {?string} sourceText
268 */
269 _populateTreeElementWithSourceText(treeElement, sourceText) {
270 const max_len = 3000;
271 const text = (sourceText || '').trim();
272 const trim = text.length > max_len;
273
Tim van der Lippee7f27052020-05-01 15:15:28274 const sourceTextElement = document.createElement('span');
275 sourceTextElement.classList.add('header-value');
276 sourceTextElement.classList.add('source-code');
Blink Reformat4c46d092018-04-07 15:32:37277 sourceTextElement.textContent = trim ? text.substr(0, max_len) : text;
278
Tim van der Lippe0ed1d2b2020-02-04 13:45:13279 const sourceTreeElement = new UI.TreeOutline.TreeElement(sourceTextElement);
Blink Reformat4c46d092018-04-07 15:32:37280 treeElement.removeChildren();
281 treeElement.appendChild(sourceTreeElement);
Tim van der Lippe1d6e57a2019-09-30 11:55:34282 if (!trim) {
Blink Reformat4c46d092018-04-07 15:32:37283 return;
Tim van der Lippe1d6e57a2019-09-30 11:55:34284 }
Blink Reformat4c46d092018-04-07 15:32:37285
Tim van der Lippef49e2322020-05-01 15:03:09286 const showMoreButton = document.createElement('button');
287 showMoreButton.classList.add('request-headers-show-more-button');
Tim van der Lippe0ed1d2b2020-02-04 13:45:13288 showMoreButton.textContent = Common.UIString.UIString('Show more');
Amanda Baker89806492019-10-25 01:49:02289
290 function showMore() {
Blink Reformat4c46d092018-04-07 15:32:37291 showMoreButton.remove();
292 sourceTextElement.textContent = text;
Amanda Baker89806492019-10-25 01:49:02293 sourceTreeElement.listItemElement.removeEventListener('contextmenu', onContextMenuShowMore);
294 }
295 showMoreButton.addEventListener('click', showMore);
296
297 /**
298 * @param {!Event} event
299 */
300 function onContextMenuShowMore(event) {
Tim van der Lippe0ed1d2b2020-02-04 13:45:13301 const contextMenu = new UI.ContextMenu.ContextMenu(event);
Amanda Baker89806492019-10-25 01:49:02302 const section = contextMenu.newSection();
303 section.appendItem(ls`Show more`, showMore);
304 contextMenu.show();
305 }
306 sourceTreeElement.listItemElement.addEventListener('contextmenu', onContextMenuShowMore);
Blink Reformat4c46d092018-04-07 15:32:37307 sourceTextElement.appendChild(showMoreButton);
308 }
309
310 /**
311 * @param {string} title
312 * @param {?Array.<!SDK.NetworkRequest.NameValue>} params
313 * @param {?string} sourceText
Tim van der Lippe0ed1d2b2020-02-04 13:45:13314 * @param {!UI.TreeOutline.TreeElement} paramsTreeElement
Blink Reformat4c46d092018-04-07 15:32:37315 */
316 _refreshParams(title, params, sourceText, paramsTreeElement) {
317 paramsTreeElement.removeChildren();
318
319 paramsTreeElement.listItemElement.removeChildren();
Amanda Baker2e19a1b2019-10-25 00:41:02320 paramsTreeElement.listItemElement.createChild('div', 'selection fill');
Blink Reformat4c46d092018-04-07 15:32:37321 paramsTreeElement.listItemElement.createTextChild(title);
322
Tim van der Lippef49e2322020-05-01 15:03:09323 const headerCount = document.createElement('span');
324 headerCount.classList.add('header-count');
Tim van der Lippe0ed1d2b2020-02-04 13:45:13325 headerCount.textContent = Common.UIString.UIString('\xA0(%d)', params.length);
Blink Reformat4c46d092018-04-07 15:32:37326 paramsTreeElement.listItemElement.appendChild(headerCount);
327
Paul Lewis56509652019-12-06 12:51:58328 const shouldViewSource = paramsTreeElement[_viewSourceSymbol];
Amanda Bakere2bb99d2019-10-25 01:28:43329 if (shouldViewSource) {
330 this._appendParamsSource(title, params, sourceText, paramsTreeElement);
331 } else {
332 this._appendParamsParsed(title, params, sourceText, paramsTreeElement);
333 }
334 }
335
336 /**
337 * @param {string} title
338 * @param {?Array.<!SDK.NetworkRequest.NameValue>} params
339 * @param {?string} sourceText
Tim van der Lippe0ed1d2b2020-02-04 13:45:13340 * @param {!UI.TreeOutline.TreeElement} paramsTreeElement
Amanda Bakere2bb99d2019-10-25 01:28:43341 */
342 _appendParamsSource(title, params, sourceText, paramsTreeElement) {
343 this._populateTreeElementWithSourceText(paramsTreeElement, sourceText);
344
345 const listItemElement = paramsTreeElement.listItemElement;
346
Blink Reformat4c46d092018-04-07 15:32:37347 /**
348 * @param {!Event} event
Paul Lewis56509652019-12-06 12:51:58349 * @this {RequestHeadersView}
Blink Reformat4c46d092018-04-07 15:32:37350 */
Amanda Bakere2bb99d2019-10-25 01:28:43351 const viewParsed = function(event) {
352 listItemElement.removeEventListener('contextmenu', viewParsedContextMenu);
353
Paul Lewis56509652019-12-06 12:51:58354 paramsTreeElement[_viewSourceSymbol] = false;
Blink Reformat4c46d092018-04-07 15:32:37355 this._refreshParams(title, params, sourceText, paramsTreeElement);
356 event.consume();
Amanda Bakere2bb99d2019-10-25 01:28:43357 };
Blink Reformat4c46d092018-04-07 15:32:37358
Amanda Bakere2bb99d2019-10-25 01:28:43359 /**
360 * @param {!Event} event
Paul Lewis56509652019-12-06 12:51:58361 * @this {RequestHeadersView}
Amanda Bakere2bb99d2019-10-25 01:28:43362 */
363 const viewParsedContextMenu = function(event) {
364 if (!paramsTreeElement.expanded) {
365 return;
366 }
Tim van der Lippe0ed1d2b2020-02-04 13:45:13367 const contextMenu = new UI.ContextMenu.ContextMenu(event);
Amanda Bakere2bb99d2019-10-25 01:28:43368 contextMenu.newSection().appendItem(ls`View parsed`, viewParsed.bind(this, event));
369 contextMenu.show();
370 }.bind(this);
Blink Reformat4c46d092018-04-07 15:32:37371
Amanda Bakere2bb99d2019-10-25 01:28:43372 const viewParsedButton = this._createViewSourceToggle(/* viewSource */ true, viewParsed.bind(this));
373 listItemElement.appendChild(viewParsedButton);
Blink Reformat4c46d092018-04-07 15:32:37374
Amanda Bakere2bb99d2019-10-25 01:28:43375 listItemElement.addEventListener('contextmenu', viewParsedContextMenu);
376 }
Blink Reformat4c46d092018-04-07 15:32:37377
Amanda Bakere2bb99d2019-10-25 01:28:43378 /**
379 * @param {string} title
380 * @param {?Array.<!SDK.NetworkRequest.NameValue>} params
381 * @param {?string} sourceText
Tim van der Lippe0ed1d2b2020-02-04 13:45:13382 * @param {!UI.TreeOutline.TreeElement} paramsTreeElement
Amanda Bakere2bb99d2019-10-25 01:28:43383 */
384 _appendParamsParsed(title, params, sourceText, paramsTreeElement) {
Blink Reformat4c46d092018-04-07 15:32:37385 for (let i = 0; i < params.length; ++i) {
386 const paramNameValue = createDocumentFragment();
387 if (params[i].name !== '') {
388 const name = this._formatParameter(params[i].name + ': ', 'header-name', this._decodeRequestParameters);
389 const value = this._formatParameter(params[i].value, 'header-value source-code', this._decodeRequestParameters);
390 paramNameValue.appendChild(name);
391 paramNameValue.createChild('span', 'header-separator');
392 paramNameValue.appendChild(value);
393 } else {
Tim van der Lippe0ed1d2b2020-02-04 13:45:13394 paramNameValue.appendChild(this._formatParameter(
395 Common.UIString.UIString('(empty)'), 'empty-request-header', this._decodeRequestParameters));
Blink Reformat4c46d092018-04-07 15:32:37396 }
397
Tim van der Lippe0ed1d2b2020-02-04 13:45:13398 const paramTreeElement = new UI.TreeOutline.TreeElement(paramNameValue);
Blink Reformat4c46d092018-04-07 15:32:37399 paramsTreeElement.appendChild(paramTreeElement);
400 }
Amanda Bakere2bb99d2019-10-25 01:28:43401
402 const listItemElement = paramsTreeElement.listItemElement;
403
404 /**
405 * @param {!Event} event
Paul Lewis56509652019-12-06 12:51:58406 * @this {RequestHeadersView}
Amanda Bakere2bb99d2019-10-25 01:28:43407 */
408 const viewSource = function(event) {
409 listItemElement.removeEventListener('contextmenu', viewSourceContextMenu);
410
Paul Lewis56509652019-12-06 12:51:58411 paramsTreeElement[_viewSourceSymbol] = true;
Amanda Bakere2bb99d2019-10-25 01:28:43412 this._refreshParams(title, params, sourceText, paramsTreeElement);
413 event.consume();
414 };
415
416 /**
417 * @param {!Event} event
Paul Lewis56509652019-12-06 12:51:58418 * @this {RequestHeadersView}
Amanda Bakere2bb99d2019-10-25 01:28:43419 */
420 const toggleURLDecoding = function(event) {
421 listItemElement.removeEventListener('contextmenu', viewSourceContextMenu);
422 this._toggleURLDecoding(event);
423 };
424
425 /**
426 * @param {!Event} event
Paul Lewis56509652019-12-06 12:51:58427 * @this {RequestHeadersView}
Amanda Bakere2bb99d2019-10-25 01:28:43428 */
429 const viewSourceContextMenu = function(event) {
430 if (!paramsTreeElement.expanded) {
431 return;
432 }
Tim van der Lippe0ed1d2b2020-02-04 13:45:13433 const contextMenu = new UI.ContextMenu.ContextMenu(event);
Amanda Bakere2bb99d2019-10-25 01:28:43434 const section = contextMenu.newSection();
435 section.appendItem(ls`View source`, viewSource.bind(this, event));
436 const viewURLEncodedText = this._decodeRequestParameters ? ls`View URL encoded` : ls`View decoded`;
437 section.appendItem(viewURLEncodedText, toggleURLDecoding.bind(this, event));
438 contextMenu.show();
439 }.bind(this);
440
441 const viewSourceButton = this._createViewSourceToggle(/* viewSource */ false, viewSource.bind(this));
442 listItemElement.appendChild(viewSourceButton);
443
444 const toggleTitle = this._decodeRequestParameters ? ls`view URL encoded` : ls`view decoded`;
445 const toggleButton = this._createToggleButton(toggleTitle);
446 toggleButton.addEventListener('click', toggleURLDecoding.bind(this), false);
447 listItemElement.appendChild(toggleButton);
448
449 listItemElement.addEventListener('contextmenu', viewSourceContextMenu);
Blink Reformat4c46d092018-04-07 15:32:37450 }
451
452 /**
453 * @param {*} parsedObject
454 * @param {string} sourceText
455 */
456 _refreshRequestJSONPayload(parsedObject, sourceText) {
Amanda Baker1815fca2019-10-25 01:16:00457 const rootListItem = this._requestPayloadCategory;
458 rootListItem.removeChildren();
Blink Reformat4c46d092018-04-07 15:32:37459
Amanda Baker1815fca2019-10-25 01:16:00460 const rootListItemElement = rootListItem.listItemElement;
461 rootListItemElement.removeChildren();
462 rootListItemElement.createChild('div', 'selection fill');
463 rootListItemElement.createTextChild(this._requestPayloadCategory.title);
464
Paul Lewis56509652019-12-06 12:51:58465 const shouldViewSource = rootListItem[_viewSourceSymbol];
Amanda Baker1815fca2019-10-25 01:16:00466 if (shouldViewSource) {
467 this._appendJSONPayloadSource(rootListItem, parsedObject, sourceText);
468 } else {
469 this._appendJSONPayloadParsed(rootListItem, parsedObject, sourceText);
470 }
471 }
472
473 /**
Paul Lewis56509652019-12-06 12:51:58474 * @param {!Category} rootListItem
Amanda Baker1815fca2019-10-25 01:16:00475 * @param {*} parsedObject
476 * @param {string} sourceText
477 */
478 _appendJSONPayloadSource(rootListItem, parsedObject, sourceText) {
479 const rootListItemElement = rootListItem.listItemElement;
480 this._populateTreeElementWithSourceText(rootListItem, sourceText);
Blink Reformat4c46d092018-04-07 15:32:37481
482 /**
483 * @param {!Event} event
Paul Lewis56509652019-12-06 12:51:58484 * @this {RequestHeadersView}
Blink Reformat4c46d092018-04-07 15:32:37485 */
Amanda Baker1815fca2019-10-25 01:16:00486 const viewParsed = function(event) {
487 rootListItemElement.removeEventListener('contextmenu', viewParsedContextMenu);
Paul Lewis56509652019-12-06 12:51:58488 rootListItem[_viewSourceSymbol] = false;
Blink Reformat4c46d092018-04-07 15:32:37489 this._refreshRequestJSONPayload(parsedObject, sourceText);
490 event.consume();
Amanda Baker1815fca2019-10-25 01:16:00491 };
Blink Reformat4c46d092018-04-07 15:32:37492
Amanda Baker1815fca2019-10-25 01:16:00493 const viewParsedButton = this._createViewSourceToggle(/* viewSource */ true, viewParsed.bind(this));
494 rootListItemElement.appendChild(viewParsedButton);
495
496 /**
497 * @param {!Event} event
Paul Lewis56509652019-12-06 12:51:58498 * @this {RequestHeadersView}
Amanda Baker1815fca2019-10-25 01:16:00499 */
500 const viewParsedContextMenu = function(event) {
501 if (!rootListItem.expanded) {
502 return;
503 }
Tim van der Lippe0ed1d2b2020-02-04 13:45:13504 const contextMenu = new UI.ContextMenu.ContextMenu(event);
Amanda Baker1815fca2019-10-25 01:16:00505 contextMenu.newSection().appendItem(ls`View parsed`, viewParsed.bind(this, event));
506 contextMenu.show();
507 }.bind(this);
508
509 rootListItemElement.addEventListener('contextmenu', viewParsedContextMenu);
510 }
511
512 /**
Paul Lewis56509652019-12-06 12:51:58513 * @param {!Category} rootListItem
Amanda Baker1815fca2019-10-25 01:16:00514 * @param {*} parsedObject
515 * @param {string} sourceText
516 */
517 _appendJSONPayloadParsed(rootListItem, parsedObject, sourceText) {
Tim van der Lippe0ed1d2b2020-02-04 13:45:13518 const object =
519 /** @type {!SDK.RemoteObject.LocalJSONObject} */ (SDK.RemoteObject.RemoteObject.fromLocalObject(parsedObject));
Amanda Baker1815fca2019-10-25 01:16:00520 const section = new ObjectUI.ObjectPropertiesSection.RootElement(object);
521 section.title = object.description;
522 section.expand();
523 section.editable = false;
524 rootListItem.childrenListElement.classList.add('source-code', 'object-properties-section');
525
526 rootListItem.appendChild(section);
527 const rootListItemElement = rootListItem.listItemElement;
528
529 /**
530 * @param {!Event} event
Paul Lewis56509652019-12-06 12:51:58531 * @this {RequestHeadersView}
Amanda Baker1815fca2019-10-25 01:16:00532 */
533 const viewSource = function(event) {
534 rootListItemElement.removeEventListener('contextmenu', viewSourceContextMenu);
535
Paul Lewis56509652019-12-06 12:51:58536 rootListItem[_viewSourceSymbol] = true;
Amanda Baker1815fca2019-10-25 01:16:00537 this._refreshRequestJSONPayload(parsedObject, sourceText);
538 event.consume();
539 };
540
541 /**
542 * @param {!Event} event
Paul Lewis56509652019-12-06 12:51:58543 * @this {RequestHeadersView}
Amanda Baker1815fca2019-10-25 01:16:00544 */
545 const viewSourceContextMenu = function(event) {
546 if (!rootListItem.expanded) {
547 return;
548 }
Tim van der Lippe0ed1d2b2020-02-04 13:45:13549 const contextMenu = new UI.ContextMenu.ContextMenu(event);
Amanda Baker1815fca2019-10-25 01:16:00550 contextMenu.newSection().appendItem(ls`View source`, viewSource.bind(this, event));
551 contextMenu.show();
552 }.bind(this);
553
554 const viewSourceButton = this._createViewSourceToggle(/* viewSource */ false, viewSource.bind(this));
555 rootListItemElement.appendChild(viewSourceButton);
556
557 rootListItemElement.addEventListener('contextmenu', viewSourceContextMenu);
Blink Reformat4c46d092018-04-07 15:32:37558 }
559
560 /**
561 * @param {boolean} viewSource
562 * @param {function(!Event)} handler
563 * @return {!Element}
564 */
565 _createViewSourceToggle(viewSource, handler) {
Tim van der Lippe0ed1d2b2020-02-04 13:45:13566 const viewSourceToggleTitle =
567 viewSource ? Common.UIString.UIString('view parsed') : Common.UIString.UIString('view source');
Blink Reformat4c46d092018-04-07 15:32:37568 const viewSourceToggleButton = this._createToggleButton(viewSourceToggleTitle);
569 viewSourceToggleButton.addEventListener('click', handler, false);
570 return viewSourceToggleButton;
571 }
572
573 /**
574 * @param {!Event} event
575 */
576 _toggleURLDecoding(event) {
577 this._decodeRequestParameters = !this._decodeRequestParameters;
578 this._refreshQueryString();
579 this._refreshFormData();
580 event.consume();
581 }
582
583 _refreshRequestHeaders() {
584 const treeElement = this._requestHeadersCategory;
585 const headers = this._request.requestHeaders().slice();
586 headers.sort(function(a, b) {
587 return a.name.toLowerCase().compareTo(b.name.toLowerCase());
588 });
589 const headersText = this._request.requestHeadersText();
590
Tim van der Lippe1d6e57a2019-09-30 11:55:34591 if (this._showRequestHeadersText && headersText) {
Tim van der Lippe0ed1d2b2020-02-04 13:45:13592 this._refreshHeadersText(Common.UIString.UIString('Request Headers'), headers.length, headersText, treeElement);
Tim van der Lippe1d6e57a2019-09-30 11:55:34593 } else {
Tim van der Lippe0ed1d2b2020-02-04 13:45:13594 this._refreshHeaders(
595 Common.UIString.UIString('Request Headers'), headers, treeElement, headersText === undefined);
Tim van der Lippe1d6e57a2019-09-30 11:55:34596 }
Blink Reformat4c46d092018-04-07 15:32:37597
598 if (headersText) {
599 const toggleButton = this._createHeadersToggleButton(this._showRequestHeadersText);
600 toggleButton.addEventListener('click', this._toggleRequestHeadersText.bind(this), false);
601 treeElement.listItemElement.appendChild(toggleButton);
602 }
603
604 this._refreshFormData();
605 }
606
607 _refreshResponseHeaders() {
608 const treeElement = this._responseHeadersCategory;
609 const headers = this._request.sortedResponseHeaders.slice();
610 const headersText = this._request.responseHeadersText;
611
Joey Arhar7199a942019-09-10 22:37:39612 if (this._showResponseHeadersText) {
Tim van der Lippe0ed1d2b2020-02-04 13:45:13613 this._refreshHeadersText(Common.UIString.UIString('Response Headers'), headers.length, headersText, treeElement);
Joey Arhar7199a942019-09-10 22:37:39614 } else {
Sigurd Schneidera2afe0b2020-03-03 15:27:13615 const headersWithIssues = [];
616 if (this._request.wasBlocked()) {
617 const headerWithIssues = BlockedReasonDetails.get(this._request.blockedReason());
618 if (headerWithIssues) {
619 headersWithIssues.push(headerWithIssues);
620 }
621 }
Joey Arhar7199a942019-09-10 22:37:39622 this._refreshHeaders(
Sigurd Schneidera2afe0b2020-03-03 15:27:13623 Common.UIString.UIString('Response Headers'), mergeHeadersWithIssues(headers, headersWithIssues), treeElement,
624 /* provisional */ false, this._request.blockedResponseCookies());
Joey Arhar7199a942019-09-10 22:37:39625 }
Blink Reformat4c46d092018-04-07 15:32:37626
627 if (headersText) {
628 const toggleButton = this._createHeadersToggleButton(this._showResponseHeadersText);
629 toggleButton.addEventListener('click', this._toggleResponseHeadersText.bind(this), false);
630 treeElement.listItemElement.appendChild(toggleButton);
631 }
Sigurd Schneidera2afe0b2020-03-03 15:27:13632
633 /**
634 *
635 * @param {!Array<*>} headers
636 * @param {!Array<*>} headersWithIssues
637 */
638 function mergeHeadersWithIssues(headers, headersWithIssues) {
639 let i = 0, j = 0;
640 const result = [];
641 while (i < headers.length || j < headersWithIssues.length) {
642 if (i < headers.length && (j >= headersWithIssues.length || headers[i].name < headersWithIssues[j].name)) {
643 result.push({...headers[i++], headerNotSet: false});
644 } else if (
645 j < headersWithIssues.length && (i >= headers.length || headers[i].name > headersWithIssues[j].name)) {
646 result.push({...headersWithIssues[j++], headerNotSet: true});
647 } else if (
648 i < headers.length && j < headersWithIssues.length && headers[i].name === headersWithIssues[j].name) {
649 result.push({...headersWithIssues[j++], ...headers[i++], headerNotSet: false});
650 }
651 }
652 return result;
653 }
Blink Reformat4c46d092018-04-07 15:32:37654 }
655
656 _refreshHTTPInformation() {
657 const requestMethodElement = this._requestMethodItem;
658 requestMethodElement.hidden = !this._request.statusCode;
659 const statusCodeElement = this._statusCodeItem;
660 statusCodeElement.hidden = !this._request.statusCode;
661
662 if (this._request.statusCode) {
663 const statusCodeFragment = createDocumentFragment();
Tsuyoshi Horo41dcffd2019-05-24 03:59:05664 statusCodeFragment.createChild('div', 'header-name').textContent = ls`Status Code` +
665 ': ';
Blink Reformat4c46d092018-04-07 15:32:37666 statusCodeFragment.createChild('span', 'header-separator');
667
Joel Einbinder7fbe24c2019-01-24 05:19:01668 const statusCodeImage = statusCodeFragment.createChild('span', 'resource-status-image', 'dt-icon-label');
Blink Reformat4c46d092018-04-07 15:32:37669 statusCodeImage.title = this._request.statusCode + ' ' + this._request.statusText;
670
Tim van der Lippe1d6e57a2019-09-30 11:55:34671 if (this._request.statusCode < 300 || this._request.statusCode === 304) {
Blink Reformat4c46d092018-04-07 15:32:37672 statusCodeImage.type = 'smallicon-green-ball';
Tim van der Lippe1d6e57a2019-09-30 11:55:34673 } else if (this._request.statusCode < 400) {
Blink Reformat4c46d092018-04-07 15:32:37674 statusCodeImage.type = 'smallicon-orange-ball';
Tim van der Lippe1d6e57a2019-09-30 11:55:34675 } else {
Blink Reformat4c46d092018-04-07 15:32:37676 statusCodeImage.type = 'smallicon-red-ball';
Tim van der Lippe1d6e57a2019-09-30 11:55:34677 }
Blink Reformat4c46d092018-04-07 15:32:37678
Tsuyoshi Horo41dcffd2019-05-24 03:59:05679 requestMethodElement.title = this._formatHeader(ls`Request Method`, this._request.requestMethod);
Blink Reformat4c46d092018-04-07 15:32:37680
681 const statusTextElement = statusCodeFragment.createChild('div', 'header-value source-code');
682 let statusText = this._request.statusCode + ' ' + this._request.statusText;
Ben Kelly0375f502018-09-11 17:05:50683 if (this._request.cachedInMemory()) {
Tsuyoshi Horo41dcffd2019-05-24 03:59:05684 statusText += ' ' + ls`(from memory cache)`;
Ben Kelly0375f502018-09-11 17:05:50685 statusTextElement.classList.add('status-from-cache');
686 } else if (this._request.fetchedViaServiceWorker) {
Tsuyoshi Horo41dcffd2019-05-24 03:59:05687 statusText += ' ' + ls`(from ServiceWorker)`;
Blink Reformat4c46d092018-04-07 15:32:37688 statusTextElement.classList.add('status-from-cache');
Tsuyoshi Horo8f6a2b12018-10-01 22:24:03689 } else if (
690 this._request.redirectSource() && this._request.redirectSource().signedExchangeInfo() &&
691 !this._request.redirectSource().signedExchangeInfo().errors) {
Tsuyoshi Horo41dcffd2019-05-24 03:59:05692 statusText += ' ' + ls`(from signed-exchange)`;
693 statusTextElement.classList.add('status-from-cache');
694 } else if (this._request.fromPrefetchCache()) {
695 statusText += ' ' + ls`(from prefetch cache)`;
Tsuyoshi Horo02266c32018-05-21 17:01:18696 statusTextElement.classList.add('status-from-cache');
Blink Reformat4c46d092018-04-07 15:32:37697 } else if (this._request.cached()) {
Tsuyoshi Horo41dcffd2019-05-24 03:59:05698 statusText += ' ' + ls`(from disk cache)`;
Blink Reformat4c46d092018-04-07 15:32:37699 statusTextElement.classList.add('status-from-cache');
700 }
701 statusTextElement.textContent = statusText;
702
703 statusCodeElement.title = statusCodeFragment;
704 }
705 }
706
707 /**
708 * @param {string} title
Tim van der Lippe0ed1d2b2020-02-04 13:45:13709 * @param {!UI.TreeOutline.TreeElement} headersTreeElement
Blink Reformat4c46d092018-04-07 15:32:37710 * @param {number} headersLength
711 */
712 _refreshHeadersTitle(title, headersTreeElement, headersLength) {
713 headersTreeElement.listItemElement.removeChildren();
Amanda Baker2e19a1b2019-10-25 00:41:02714 headersTreeElement.listItemElement.createChild('div', 'selection fill');
Blink Reformat4c46d092018-04-07 15:32:37715 headersTreeElement.listItemElement.createTextChild(title);
716
Tim van der Lippe0ed1d2b2020-02-04 13:45:13717 const headerCount = Common.UIString.UIString('\xA0(%d)', headersLength);
Blink Reformat4c46d092018-04-07 15:32:37718 headersTreeElement.listItemElement.createChild('span', 'header-count').textContent = headerCount;
719 }
720
721 /**
722 * @param {string} title
723 * @param {!Array.<!SDK.NetworkRequest.NameValue>} headers
Tim van der Lippe0ed1d2b2020-02-04 13:45:13724 * @param {!UI.TreeOutline.TreeElement} headersTreeElement
Blink Reformat4c46d092018-04-07 15:32:37725 * @param {boolean=} provisionalHeaders
Joey Arhar7199a942019-09-10 22:37:39726 * @param {!Array<!SDK.NetworkRequest.BlockedSetCookieWithReason>=} blockedResponseCookies
Blink Reformat4c46d092018-04-07 15:32:37727 */
Joey Arhar7199a942019-09-10 22:37:39728 _refreshHeaders(title, headers, headersTreeElement, provisionalHeaders, blockedResponseCookies) {
Blink Reformat4c46d092018-04-07 15:32:37729 headersTreeElement.removeChildren();
730
731 const length = headers.length;
732 this._refreshHeadersTitle(title, headersTreeElement, length);
733
734 if (provisionalHeaders) {
Joey Arhara613f912020-01-17 22:46:57735 let cautionText;
736 let cautionTitle = '';
737 if (this._request.cachedInMemory() || this._request.cached()) {
738 cautionText = ls`Provisional headers are shown. Disable cache to see full headers.`;
739 cautionTitle = ls
Mathias Bynens4a0d1932020-07-28 06:31:37740 `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.`;
Joey Arhara613f912020-01-17 22:46:57741 } else {
742 cautionText = ls`Provisional headers are shown`;
743 }
744 const cautionElement = createElement('div');
745 cautionElement.title = cautionTitle;
746 cautionElement.createChild('span', '', 'dt-icon-label').type = 'smallicon-warning';
747 cautionElement.createChild('div', 'caution').textContent = cautionText;
Tim van der Lippe0ed1d2b2020-02-04 13:45:13748 const cautionTreeElement = new UI.TreeOutline.TreeElement(cautionElement);
Blink Reformat4c46d092018-04-07 15:32:37749 headersTreeElement.appendChild(cautionTreeElement);
750 }
751
Joey Arhar41a5fad2019-09-13 22:18:45752 /** @type {!Map<string, !Array<!Protocol.Network.SetCookieBlockedReason>>} */
753 const blockedCookieLineToReasons = new Map();
Joey Arhar7199a942019-09-10 22:37:39754 if (blockedResponseCookies) {
755 blockedResponseCookies.forEach(blockedCookie => {
Joey Arhar41a5fad2019-09-13 22:18:45756 blockedCookieLineToReasons.set(blockedCookie.cookieLine, blockedCookie.blockedReasons);
Joey Arhar7199a942019-09-10 22:37:39757 });
758 }
759
Blink Reformat4c46d092018-04-07 15:32:37760 headersTreeElement.hidden = !length && !provisionalHeaders;
Mathias Bynens4a0d1932020-07-28 06:31:37761 for (const header of headers) {
762 const headerTreeElement = new UI.TreeOutline.TreeElement(this._formatHeaderObject(header));
763 headerTreeElement[_headerNameSymbol] = header.name;
Joey Arhar7199a942019-09-10 22:37:39764
Mathias Bynens4a0d1932020-07-28 06:31:37765 const headerId = header.name.toLowerCase();
766
767 if (headerId === 'set-cookie') {
768 const matchingBlockedReasons = blockedCookieLineToReasons.get(header.value);
Joey Arhar41a5fad2019-09-13 22:18:45769 if (matchingBlockedReasons) {
Tim van der Lippe0ed1d2b2020-02-04 13:45:13770 const icon = UI.Icon.Icon.create('smallicon-warning', '');
Joey Arhar7199a942019-09-10 22:37:39771 headerTreeElement.listItemElement.appendChild(icon);
Joey Arhar41a5fad2019-09-13 22:18:45772
773 let titleText = '';
774 for (const blockedReason of matchingBlockedReasons) {
Tim van der Lippe1d6e57a2019-09-30 11:55:34775 if (titleText) {
Joey Arhar41a5fad2019-09-13 22:18:45776 titleText += '\n';
Tim van der Lippe1d6e57a2019-09-30 11:55:34777 }
Joey Arhar41a5fad2019-09-13 22:18:45778 titleText += SDK.NetworkRequest.setCookieBlockedReasonToUiString(blockedReason);
779 }
780 icon.title = titleText;
Joey Arhar7199a942019-09-10 22:37:39781 }
782 }
783
784 headersTreeElement.appendChild(headerTreeElement);
Mathias Bynens4a0d1932020-07-28 06:31:37785
786 if (headerId === 'x-client-data') {
787 // https://source.chromium.org/chromium/chromium/src/+/master:components/variations/proto/client_variations.proto;l=14-21
788 const {variationIds, triggerVariationIds} = ClientVariationsParser.parseClientVariations(header.value);
789 if (variationIds.length || triggerVariationIds.length) {
790 const element = createElement('div');
791 element.classList.add('x-client-data-details');
792 if (variationIds.length) {
793 element.createChild('div').textContent =
794 ls`Active client experiment variation IDs: ${variationIds.join(', ')}`;
795 }
796 if (triggerVariationIds.length) {
797 element.createChild('div').textContent =
798 ls`Active client experiment variation IDs that trigger server-side behavior: ${
799 triggerVariationIds.join(', ')}`;
800 }
801 headerTreeElement.listItemElement.appendChild(element);
802 }
803 }
Blink Reformat4c46d092018-04-07 15:32:37804 }
805 }
806
807 /**
808 * @param {string} title
809 * @param {number} count
810 * @param {string} headersText
Tim van der Lippe0ed1d2b2020-02-04 13:45:13811 * @param {!UI.TreeOutline.TreeElement} headersTreeElement
Blink Reformat4c46d092018-04-07 15:32:37812 */
813 _refreshHeadersText(title, count, headersText, headersTreeElement) {
814 this._populateTreeElementWithSourceText(headersTreeElement, headersText);
815 this._refreshHeadersTitle(title, headersTreeElement, count);
816 }
817
818 _refreshRemoteAddress() {
819 const remoteAddress = this._request.remoteAddress();
820 const treeElement = this._remoteAddressItem;
821 treeElement.hidden = !remoteAddress;
Tim van der Lippe1d6e57a2019-09-30 11:55:34822 if (remoteAddress) {
Tim van der Lippe0ed1d2b2020-02-04 13:45:13823 treeElement.title = this._formatHeader(Common.UIString.UIString('Remote Address'), remoteAddress);
Tim van der Lippe1d6e57a2019-09-30 11:55:34824 }
Blink Reformat4c46d092018-04-07 15:32:37825 }
826
827 _refreshReferrerPolicy() {
828 const referrerPolicy = this._request.referrerPolicy();
829 const treeElement = this._referrerPolicyItem;
830 treeElement.hidden = !referrerPolicy;
Tim van der Lippe1d6e57a2019-09-30 11:55:34831 if (referrerPolicy) {
Tim van der Lippe0ed1d2b2020-02-04 13:45:13832 treeElement.title = this._formatHeader(Common.UIString.UIString('Referrer Policy'), referrerPolicy);
Tim van der Lippe1d6e57a2019-09-30 11:55:34833 }
Blink Reformat4c46d092018-04-07 15:32:37834 }
835
836 /**
837 * @param {!Event} event
838 */
839 _toggleRequestHeadersText(event) {
840 this._showRequestHeadersText = !this._showRequestHeadersText;
841 this._refreshRequestHeaders();
842 event.consume();
843 }
844
845 /**
846 * @param {!Event} event
847 */
848 _toggleResponseHeadersText(event) {
849 this._showResponseHeadersText = !this._showResponseHeadersText;
850 this._refreshResponseHeaders();
851 event.consume();
852 }
853
854 /**
855 * @param {string} title
856 * @return {!Element}
857 */
858 _createToggleButton(title) {
Tim van der Lippef49e2322020-05-01 15:03:09859 const button = document.createElement('span');
860 button.classList.add('header-toggle');
Blink Reformat4c46d092018-04-07 15:32:37861 button.textContent = title;
862 return button;
863 }
864
865 /**
866 * @param {boolean} isHeadersTextShown
867 * @return {!Element}
868 */
869 _createHeadersToggleButton(isHeadersTextShown) {
Tim van der Lippe0ed1d2b2020-02-04 13:45:13870 const toggleTitle =
871 isHeadersTextShown ? Common.UIString.UIString('view parsed') : Common.UIString.UIString('view source');
Blink Reformat4c46d092018-04-07 15:32:37872 return this._createToggleButton(toggleTitle);
873 }
874
875 _clearHighlight() {
Tim van der Lippe1d6e57a2019-09-30 11:55:34876 if (this._highlightedElement) {
Blink Reformat4c46d092018-04-07 15:32:37877 this._highlightedElement.listItemElement.classList.remove('header-highlight');
Tim van der Lippe1d6e57a2019-09-30 11:55:34878 }
Blink Reformat4c46d092018-04-07 15:32:37879 this._highlightedElement = null;
880 }
881
882
883 /**
Tim van der Lippe0ed1d2b2020-02-04 13:45:13884 * @param {?UI.TreeOutline.TreeElement} category
Blink Reformat4c46d092018-04-07 15:32:37885 * @param {string} name
886 */
887 _revealAndHighlight(category, name) {
888 this._clearHighlight();
889 for (const element of category.children()) {
Paul Lewis56509652019-12-06 12:51:58890 if (element[_headerNameSymbol] !== name) {
Blink Reformat4c46d092018-04-07 15:32:37891 continue;
Tim van der Lippe1d6e57a2019-09-30 11:55:34892 }
Blink Reformat4c46d092018-04-07 15:32:37893 this._highlightedElement = element;
894 element.reveal();
895 element.listItemElement.classList.add('header-highlight');
896 return;
897 }
898 }
899
900 /**
901 * @param {string} header
902 */
903 revealRequestHeader(header) {
904 this._revealAndHighlight(this._requestHeadersCategory, header);
905 }
906
907 /**
908 * @param {string} header
909 */
910 revealResponseHeader(header) {
911 this._revealAndHighlight(this._responseHeadersCategory, header);
912 }
Paul Lewis56509652019-12-06 12:51:58913}
Blink Reformat4c46d092018-04-07 15:32:37914
Paul Lewis56509652019-12-06 12:51:58915export const _headerNameSymbol = Symbol('HeaderName');
916export const _viewSourceSymbol = Symbol('ViewSource');
Blink Reformat4c46d092018-04-07 15:32:37917
918/**
919 * @unrestricted
920 */
Tim van der Lippe0ed1d2b2020-02-04 13:45:13921export class Category extends UI.TreeOutline.TreeElement {
Blink Reformat4c46d092018-04-07 15:32:37922 /**
Tim van der Lippe0ed1d2b2020-02-04 13:45:13923 * @param {!UI.TreeOutline.TreeOutline} root
Blink Reformat4c46d092018-04-07 15:32:37924 * @param {string} name
925 * @param {string=} title
926 */
927 constructor(root, name, title) {
928 super(title || '', true);
Blink Reformat4c46d092018-04-07 15:32:37929 this.toggleOnClick = true;
930 this.hidden = true;
Paul Lewis2d7d65c2020-03-16 17:26:30931 this._expandedSetting =
932 Common.Settings.Settings.instance().createSetting('request-info-' + name + '-category-expanded', true);
Blink Reformat4c46d092018-04-07 15:32:37933 this.expanded = this._expandedSetting.get();
934 root.appendChild(this);
935 }
936
937 /**
Tim van der Lippe0ed1d2b2020-02-04 13:45:13938 * @return {!UI.TreeOutline.TreeElement}
Blink Reformat4c46d092018-04-07 15:32:37939 */
940 createLeaf() {
Tim van der Lippe0ed1d2b2020-02-04 13:45:13941 const leaf = new UI.TreeOutline.TreeElement();
Blink Reformat4c46d092018-04-07 15:32:37942 this.appendChild(leaf);
943 return leaf;
944 }
945
946 /**
947 * @override
948 */
949 onexpand() {
950 this._expandedSetting.set(true);
951 }
952
953 /**
954 * @override
955 */
956 oncollapse() {
957 this._expandedSetting.set(false);
958 }
Paul Lewis56509652019-12-06 12:51:58959}
Sigurd Schneidera2afe0b2020-03-03 15:27:13960
961
962const BlockedReasonDetails = new Map([
963 [
964 Protocol.Network.BlockedReason.CoepFrameResourceNeedsCoepHeader, {
965 name: 'cross-origin-embedder-policy',
966 value: null,
Sigurd Schneidercae7b532020-03-06 11:20:06967 details: {
968 explanation:
969 ls
970 `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:40971 examples: [{codeSnippet:'Cross-Origin-Embedder-Policy: require-corp'}],
972 link: {url: 'https://web.dev/coop-coep/'}
Sigurd Schneidercae7b532020-03-06 11:20:06973 }
Sigurd Schneidera2afe0b2020-03-03 15:27:13974 }
975 ],
976 [
977 Protocol.Network.BlockedReason.CorpNotSameOriginAfterDefaultedToSameOriginByCoep, {
978 name: 'cross-origin-resource-policy',
979 value: null,
Sigurd Schneidercae7b532020-03-06 11:20:06980 details: {
981 explanation:
982 ls
983 `To use this resource from a different origin, the server needs to specify a cross-origin resource policy in the response headers:`,
984 examples: [
985 {codeSnippet:'Cross-Origin-Resource-Policy: same-site', comment: ls`Choose this option if the resource and the document are served from the same site.` },
986 {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:40987 ],
988 link: {url: 'https://web.dev/coop-coep/'}
Sigurd Schneidercae7b532020-03-06 11:20:06989 }
Sigurd Schneidera2afe0b2020-03-03 15:27:13990 }
991 ],
992 [
993 Protocol.Network.BlockedReason.CoopSandboxedIframeCannotNavigateToCoopPage, {
994 name: 'cross-origin-opener-policy',
995 value: null,
996 headerValueIncorrect: false,
Sigurd Schneidercae7b532020-03-06 11:20:06997 details: {
998 explanation:
999 ls
1000 `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:401001 examples: [],
1002 link: {url: 'https://web.dev/coop-coep/'}
Sigurd Schneidercae7b532020-03-06 11:20:061003 }
Sigurd Schneidera2afe0b2020-03-03 15:27:131004 }
1005 ],
1006 [
1007 Protocol.Network.BlockedReason.CorpNotSameSite, {
1008 name: 'cross-origin-resource-policy',
1009 value: null,
1010 headerValueIncorrect: true,
Sigurd Schneidercae7b532020-03-06 11:20:061011 details: {
1012 explanation:
1013 ls
1014 `To use this resource from a different site, the server may relax the cross-origin resource policy response header:`,
1015 examples: [
1016 {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.` },
1017 ]
1018 }
Sigurd Schneidera2afe0b2020-03-03 15:27:131019 }
1020 ],
1021 [
1022 Protocol.Network.BlockedReason.CorpNotSameOrigin, {
1023 name: 'cross-origin-resource-policy',
1024 value: null,
1025 headerValueIncorrect: true,
Sigurd Schneidercae7b532020-03-06 11:20:061026 details: {
1027 explanation:
1028 ls
1029 `To use this resource from a different origin, the server may relax the cross-origin resource policy response header:`,
1030 examples: [
1031 {codeSnippet:'Cross-Origin-Resource-Policy: same-site', comment: ls`Choose this option if the resource and the document are served from the same site.` },
1032 {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.` },
1033 ]
1034 }
Sigurd Schneidera2afe0b2020-03-03 15:27:131035 }
1036 ],
1037]);