blob: 2016dc43e3b845ad0ee2108c2041a4d361911cd1 [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 Schneidera2afe0b2020-03-03 15:27:13157 }
158 return fragment;
159 }
160
161 /**
Blink Reformat4c46d092018-04-07 15:32:37162 * @param {string} value
163 * @param {string} className
164 * @param {boolean} decodeParameters
165 * @return {!Element}
166 */
167 _formatParameter(value, className, decodeParameters) {
168 let errorDecoding = false;
169
170 if (decodeParameters) {
171 value = value.replace(/\+/g, ' ');
172 if (value.indexOf('%') >= 0) {
173 try {
174 value = decodeURIComponent(value);
175 } catch (e) {
176 errorDecoding = true;
177 }
178 }
179 }
180 const div = createElementWithClass('div', className);
Tim van der Lippe1d6e57a2019-09-30 11:55:34181 if (value === '') {
Blink Reformat4c46d092018-04-07 15:32:37182 div.classList.add('empty-value');
Tim van der Lippe1d6e57a2019-09-30 11:55:34183 }
184 if (errorDecoding) {
Tim van der Lippe0ed1d2b2020-02-04 13:45:13185 div.createChild('span', 'header-decode-error').textContent = Common.UIString.UIString('(unable to decode value)');
Tim van der Lippe1d6e57a2019-09-30 11:55:34186 } else {
Blink Reformat4c46d092018-04-07 15:32:37187 div.textContent = value;
Tim van der Lippe1d6e57a2019-09-30 11:55:34188 }
Blink Reformat4c46d092018-04-07 15:32:37189 return div;
190 }
191
192 _refreshURL() {
Tim van der Lippe0ed1d2b2020-02-04 13:45:13193 this._urlItem.title = this._formatHeader(Common.UIString.UIString('Request URL'), this._request.url());
Blink Reformat4c46d092018-04-07 15:32:37194 }
195
196 _refreshQueryString() {
197 const queryString = this._request.queryString();
198 const queryParameters = this._request.queryParameters;
199 this._queryStringCategory.hidden = !queryParameters;
200 if (queryParameters) {
201 this._refreshParams(
Tim van der Lippe0ed1d2b2020-02-04 13:45:13202 Common.UIString.UIString('Query String Parameters'), queryParameters, queryString, this._queryStringCategory);
Blink Reformat4c46d092018-04-07 15:32:37203 }
204 }
205
206 async _refreshFormData() {
207 this._formDataCategory.hidden = true;
208 this._requestPayloadCategory.hidden = true;
209
210 const formData = await this._request.requestFormData();
Tim van der Lippe1d6e57a2019-09-30 11:55:34211 if (!formData) {
Blink Reformat4c46d092018-04-07 15:32:37212 return;
Tim van der Lippe1d6e57a2019-09-30 11:55:34213 }
Blink Reformat4c46d092018-04-07 15:32:37214
215 const formParameters = await this._request.formParameters();
216 if (formParameters) {
217 this._formDataCategory.hidden = false;
Tim van der Lippe0ed1d2b2020-02-04 13:45:13218 this._refreshParams(Common.UIString.UIString('Form Data'), formParameters, formData, this._formDataCategory);
Blink Reformat4c46d092018-04-07 15:32:37219 } else {
220 this._requestPayloadCategory.hidden = false;
221 try {
222 const json = JSON.parse(formData);
223 this._refreshRequestJSONPayload(json, formData);
224 } catch (e) {
225 this._populateTreeElementWithSourceText(this._requestPayloadCategory, formData);
226 }
227 }
228 }
229
230 /**
Tim van der Lippe0ed1d2b2020-02-04 13:45:13231 * @param {!UI.TreeOutline.TreeElement} treeElement
Blink Reformat4c46d092018-04-07 15:32:37232 * @param {?string} sourceText
233 */
234 _populateTreeElementWithSourceText(treeElement, sourceText) {
235 const max_len = 3000;
236 const text = (sourceText || '').trim();
237 const trim = text.length > max_len;
238
239 const sourceTextElement = createElementWithClass('span', 'header-value source-code');
240 sourceTextElement.textContent = trim ? text.substr(0, max_len) : text;
241
Tim van der Lippe0ed1d2b2020-02-04 13:45:13242 const sourceTreeElement = new UI.TreeOutline.TreeElement(sourceTextElement);
Blink Reformat4c46d092018-04-07 15:32:37243 treeElement.removeChildren();
244 treeElement.appendChild(sourceTreeElement);
Tim van der Lippe1d6e57a2019-09-30 11:55:34245 if (!trim) {
Blink Reformat4c46d092018-04-07 15:32:37246 return;
Tim van der Lippe1d6e57a2019-09-30 11:55:34247 }
Blink Reformat4c46d092018-04-07 15:32:37248
249 const showMoreButton = createElementWithClass('button', 'request-headers-show-more-button');
Tim van der Lippe0ed1d2b2020-02-04 13:45:13250 showMoreButton.textContent = Common.UIString.UIString('Show more');
Amanda Baker89806492019-10-25 01:49:02251
252 function showMore() {
Blink Reformat4c46d092018-04-07 15:32:37253 showMoreButton.remove();
254 sourceTextElement.textContent = text;
Amanda Baker89806492019-10-25 01:49:02255 sourceTreeElement.listItemElement.removeEventListener('contextmenu', onContextMenuShowMore);
256 }
257 showMoreButton.addEventListener('click', showMore);
258
259 /**
260 * @param {!Event} event
261 */
262 function onContextMenuShowMore(event) {
Tim van der Lippe0ed1d2b2020-02-04 13:45:13263 const contextMenu = new UI.ContextMenu.ContextMenu(event);
Amanda Baker89806492019-10-25 01:49:02264 const section = contextMenu.newSection();
265 section.appendItem(ls`Show more`, showMore);
266 contextMenu.show();
267 }
268 sourceTreeElement.listItemElement.addEventListener('contextmenu', onContextMenuShowMore);
Blink Reformat4c46d092018-04-07 15:32:37269 sourceTextElement.appendChild(showMoreButton);
270 }
271
272 /**
273 * @param {string} title
274 * @param {?Array.<!SDK.NetworkRequest.NameValue>} params
275 * @param {?string} sourceText
Tim van der Lippe0ed1d2b2020-02-04 13:45:13276 * @param {!UI.TreeOutline.TreeElement} paramsTreeElement
Blink Reformat4c46d092018-04-07 15:32:37277 */
278 _refreshParams(title, params, sourceText, paramsTreeElement) {
279 paramsTreeElement.removeChildren();
280
281 paramsTreeElement.listItemElement.removeChildren();
Amanda Baker2e19a1b2019-10-25 00:41:02282 paramsTreeElement.listItemElement.createChild('div', 'selection fill');
Blink Reformat4c46d092018-04-07 15:32:37283 paramsTreeElement.listItemElement.createTextChild(title);
284
285 const headerCount = createElementWithClass('span', 'header-count');
Tim van der Lippe0ed1d2b2020-02-04 13:45:13286 headerCount.textContent = Common.UIString.UIString('\xA0(%d)', params.length);
Blink Reformat4c46d092018-04-07 15:32:37287 paramsTreeElement.listItemElement.appendChild(headerCount);
288
Paul Lewis56509652019-12-06 12:51:58289 const shouldViewSource = paramsTreeElement[_viewSourceSymbol];
Amanda Bakere2bb99d2019-10-25 01:28:43290 if (shouldViewSource) {
291 this._appendParamsSource(title, params, sourceText, paramsTreeElement);
292 } else {
293 this._appendParamsParsed(title, params, sourceText, paramsTreeElement);
294 }
295 }
296
297 /**
298 * @param {string} title
299 * @param {?Array.<!SDK.NetworkRequest.NameValue>} params
300 * @param {?string} sourceText
Tim van der Lippe0ed1d2b2020-02-04 13:45:13301 * @param {!UI.TreeOutline.TreeElement} paramsTreeElement
Amanda Bakere2bb99d2019-10-25 01:28:43302 */
303 _appendParamsSource(title, params, sourceText, paramsTreeElement) {
304 this._populateTreeElementWithSourceText(paramsTreeElement, sourceText);
305
306 const listItemElement = paramsTreeElement.listItemElement;
307
Blink Reformat4c46d092018-04-07 15:32:37308 /**
309 * @param {!Event} event
Paul Lewis56509652019-12-06 12:51:58310 * @this {RequestHeadersView}
Blink Reformat4c46d092018-04-07 15:32:37311 */
Amanda Bakere2bb99d2019-10-25 01:28:43312 const viewParsed = function(event) {
313 listItemElement.removeEventListener('contextmenu', viewParsedContextMenu);
314
Paul Lewis56509652019-12-06 12:51:58315 paramsTreeElement[_viewSourceSymbol] = false;
Blink Reformat4c46d092018-04-07 15:32:37316 this._refreshParams(title, params, sourceText, paramsTreeElement);
317 event.consume();
Amanda Bakere2bb99d2019-10-25 01:28:43318 };
Blink Reformat4c46d092018-04-07 15:32:37319
Amanda Bakere2bb99d2019-10-25 01:28:43320 /**
321 * @param {!Event} event
Paul Lewis56509652019-12-06 12:51:58322 * @this {RequestHeadersView}
Amanda Bakere2bb99d2019-10-25 01:28:43323 */
324 const viewParsedContextMenu = function(event) {
325 if (!paramsTreeElement.expanded) {
326 return;
327 }
Tim van der Lippe0ed1d2b2020-02-04 13:45:13328 const contextMenu = new UI.ContextMenu.ContextMenu(event);
Amanda Bakere2bb99d2019-10-25 01:28:43329 contextMenu.newSection().appendItem(ls`View parsed`, viewParsed.bind(this, event));
330 contextMenu.show();
331 }.bind(this);
Blink Reformat4c46d092018-04-07 15:32:37332
Amanda Bakere2bb99d2019-10-25 01:28:43333 const viewParsedButton = this._createViewSourceToggle(/* viewSource */ true, viewParsed.bind(this));
334 listItemElement.appendChild(viewParsedButton);
Blink Reformat4c46d092018-04-07 15:32:37335
Amanda Bakere2bb99d2019-10-25 01:28:43336 listItemElement.addEventListener('contextmenu', viewParsedContextMenu);
337 }
Blink Reformat4c46d092018-04-07 15:32:37338
Amanda Bakere2bb99d2019-10-25 01:28:43339 /**
340 * @param {string} title
341 * @param {?Array.<!SDK.NetworkRequest.NameValue>} params
342 * @param {?string} sourceText
Tim van der Lippe0ed1d2b2020-02-04 13:45:13343 * @param {!UI.TreeOutline.TreeElement} paramsTreeElement
Amanda Bakere2bb99d2019-10-25 01:28:43344 */
345 _appendParamsParsed(title, params, sourceText, paramsTreeElement) {
Blink Reformat4c46d092018-04-07 15:32:37346 for (let i = 0; i < params.length; ++i) {
347 const paramNameValue = createDocumentFragment();
348 if (params[i].name !== '') {
349 const name = this._formatParameter(params[i].name + ': ', 'header-name', this._decodeRequestParameters);
350 const value = this._formatParameter(params[i].value, 'header-value source-code', this._decodeRequestParameters);
351 paramNameValue.appendChild(name);
352 paramNameValue.createChild('span', 'header-separator');
353 paramNameValue.appendChild(value);
354 } else {
Tim van der Lippe0ed1d2b2020-02-04 13:45:13355 paramNameValue.appendChild(this._formatParameter(
356 Common.UIString.UIString('(empty)'), 'empty-request-header', this._decodeRequestParameters));
Blink Reformat4c46d092018-04-07 15:32:37357 }
358
Tim van der Lippe0ed1d2b2020-02-04 13:45:13359 const paramTreeElement = new UI.TreeOutline.TreeElement(paramNameValue);
Blink Reformat4c46d092018-04-07 15:32:37360 paramsTreeElement.appendChild(paramTreeElement);
361 }
Amanda Bakere2bb99d2019-10-25 01:28:43362
363 const listItemElement = paramsTreeElement.listItemElement;
364
365 /**
366 * @param {!Event} event
Paul Lewis56509652019-12-06 12:51:58367 * @this {RequestHeadersView}
Amanda Bakere2bb99d2019-10-25 01:28:43368 */
369 const viewSource = function(event) {
370 listItemElement.removeEventListener('contextmenu', viewSourceContextMenu);
371
Paul Lewis56509652019-12-06 12:51:58372 paramsTreeElement[_viewSourceSymbol] = true;
Amanda Bakere2bb99d2019-10-25 01:28:43373 this._refreshParams(title, params, sourceText, paramsTreeElement);
374 event.consume();
375 };
376
377 /**
378 * @param {!Event} event
Paul Lewis56509652019-12-06 12:51:58379 * @this {RequestHeadersView}
Amanda Bakere2bb99d2019-10-25 01:28:43380 */
381 const toggleURLDecoding = function(event) {
382 listItemElement.removeEventListener('contextmenu', viewSourceContextMenu);
383 this._toggleURLDecoding(event);
384 };
385
386 /**
387 * @param {!Event} event
Paul Lewis56509652019-12-06 12:51:58388 * @this {RequestHeadersView}
Amanda Bakere2bb99d2019-10-25 01:28:43389 */
390 const viewSourceContextMenu = function(event) {
391 if (!paramsTreeElement.expanded) {
392 return;
393 }
Tim van der Lippe0ed1d2b2020-02-04 13:45:13394 const contextMenu = new UI.ContextMenu.ContextMenu(event);
Amanda Bakere2bb99d2019-10-25 01:28:43395 const section = contextMenu.newSection();
396 section.appendItem(ls`View source`, viewSource.bind(this, event));
397 const viewURLEncodedText = this._decodeRequestParameters ? ls`View URL encoded` : ls`View decoded`;
398 section.appendItem(viewURLEncodedText, toggleURLDecoding.bind(this, event));
399 contextMenu.show();
400 }.bind(this);
401
402 const viewSourceButton = this._createViewSourceToggle(/* viewSource */ false, viewSource.bind(this));
403 listItemElement.appendChild(viewSourceButton);
404
405 const toggleTitle = this._decodeRequestParameters ? ls`view URL encoded` : ls`view decoded`;
406 const toggleButton = this._createToggleButton(toggleTitle);
407 toggleButton.addEventListener('click', toggleURLDecoding.bind(this), false);
408 listItemElement.appendChild(toggleButton);
409
410 listItemElement.addEventListener('contextmenu', viewSourceContextMenu);
Blink Reformat4c46d092018-04-07 15:32:37411 }
412
413 /**
414 * @param {*} parsedObject
415 * @param {string} sourceText
416 */
417 _refreshRequestJSONPayload(parsedObject, sourceText) {
Amanda Baker1815fca2019-10-25 01:16:00418 const rootListItem = this._requestPayloadCategory;
419 rootListItem.removeChildren();
Blink Reformat4c46d092018-04-07 15:32:37420
Amanda Baker1815fca2019-10-25 01:16:00421 const rootListItemElement = rootListItem.listItemElement;
422 rootListItemElement.removeChildren();
423 rootListItemElement.createChild('div', 'selection fill');
424 rootListItemElement.createTextChild(this._requestPayloadCategory.title);
425
Paul Lewis56509652019-12-06 12:51:58426 const shouldViewSource = rootListItem[_viewSourceSymbol];
Amanda Baker1815fca2019-10-25 01:16:00427 if (shouldViewSource) {
428 this._appendJSONPayloadSource(rootListItem, parsedObject, sourceText);
429 } else {
430 this._appendJSONPayloadParsed(rootListItem, parsedObject, sourceText);
431 }
432 }
433
434 /**
Paul Lewis56509652019-12-06 12:51:58435 * @param {!Category} rootListItem
Amanda Baker1815fca2019-10-25 01:16:00436 * @param {*} parsedObject
437 * @param {string} sourceText
438 */
439 _appendJSONPayloadSource(rootListItem, parsedObject, sourceText) {
440 const rootListItemElement = rootListItem.listItemElement;
441 this._populateTreeElementWithSourceText(rootListItem, sourceText);
Blink Reformat4c46d092018-04-07 15:32:37442
443 /**
444 * @param {!Event} event
Paul Lewis56509652019-12-06 12:51:58445 * @this {RequestHeadersView}
Blink Reformat4c46d092018-04-07 15:32:37446 */
Amanda Baker1815fca2019-10-25 01:16:00447 const viewParsed = function(event) {
448 rootListItemElement.removeEventListener('contextmenu', viewParsedContextMenu);
Paul Lewis56509652019-12-06 12:51:58449 rootListItem[_viewSourceSymbol] = false;
Blink Reformat4c46d092018-04-07 15:32:37450 this._refreshRequestJSONPayload(parsedObject, sourceText);
451 event.consume();
Amanda Baker1815fca2019-10-25 01:16:00452 };
Blink Reformat4c46d092018-04-07 15:32:37453
Amanda Baker1815fca2019-10-25 01:16:00454 const viewParsedButton = this._createViewSourceToggle(/* viewSource */ true, viewParsed.bind(this));
455 rootListItemElement.appendChild(viewParsedButton);
456
457 /**
458 * @param {!Event} event
Paul Lewis56509652019-12-06 12:51:58459 * @this {RequestHeadersView}
Amanda Baker1815fca2019-10-25 01:16:00460 */
461 const viewParsedContextMenu = function(event) {
462 if (!rootListItem.expanded) {
463 return;
464 }
Tim van der Lippe0ed1d2b2020-02-04 13:45:13465 const contextMenu = new UI.ContextMenu.ContextMenu(event);
Amanda Baker1815fca2019-10-25 01:16:00466 contextMenu.newSection().appendItem(ls`View parsed`, viewParsed.bind(this, event));
467 contextMenu.show();
468 }.bind(this);
469
470 rootListItemElement.addEventListener('contextmenu', viewParsedContextMenu);
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 _appendJSONPayloadParsed(rootListItem, parsedObject, sourceText) {
Tim van der Lippe0ed1d2b2020-02-04 13:45:13479 const object =
480 /** @type {!SDK.RemoteObject.LocalJSONObject} */ (SDK.RemoteObject.RemoteObject.fromLocalObject(parsedObject));
Amanda Baker1815fca2019-10-25 01:16:00481 const section = new ObjectUI.ObjectPropertiesSection.RootElement(object);
482 section.title = object.description;
483 section.expand();
484 section.editable = false;
485 rootListItem.childrenListElement.classList.add('source-code', 'object-properties-section');
486
487 rootListItem.appendChild(section);
488 const rootListItemElement = rootListItem.listItemElement;
489
490 /**
491 * @param {!Event} event
Paul Lewis56509652019-12-06 12:51:58492 * @this {RequestHeadersView}
Amanda Baker1815fca2019-10-25 01:16:00493 */
494 const viewSource = function(event) {
495 rootListItemElement.removeEventListener('contextmenu', viewSourceContextMenu);
496
Paul Lewis56509652019-12-06 12:51:58497 rootListItem[_viewSourceSymbol] = true;
Amanda Baker1815fca2019-10-25 01:16:00498 this._refreshRequestJSONPayload(parsedObject, sourceText);
499 event.consume();
500 };
501
502 /**
503 * @param {!Event} event
Paul Lewis56509652019-12-06 12:51:58504 * @this {RequestHeadersView}
Amanda Baker1815fca2019-10-25 01:16:00505 */
506 const viewSourceContextMenu = function(event) {
507 if (!rootListItem.expanded) {
508 return;
509 }
Tim van der Lippe0ed1d2b2020-02-04 13:45:13510 const contextMenu = new UI.ContextMenu.ContextMenu(event);
Amanda Baker1815fca2019-10-25 01:16:00511 contextMenu.newSection().appendItem(ls`View source`, viewSource.bind(this, event));
512 contextMenu.show();
513 }.bind(this);
514
515 const viewSourceButton = this._createViewSourceToggle(/* viewSource */ false, viewSource.bind(this));
516 rootListItemElement.appendChild(viewSourceButton);
517
518 rootListItemElement.addEventListener('contextmenu', viewSourceContextMenu);
Blink Reformat4c46d092018-04-07 15:32:37519 }
520
521 /**
522 * @param {boolean} viewSource
523 * @param {function(!Event)} handler
524 * @return {!Element}
525 */
526 _createViewSourceToggle(viewSource, handler) {
Tim van der Lippe0ed1d2b2020-02-04 13:45:13527 const viewSourceToggleTitle =
528 viewSource ? Common.UIString.UIString('view parsed') : Common.UIString.UIString('view source');
Blink Reformat4c46d092018-04-07 15:32:37529 const viewSourceToggleButton = this._createToggleButton(viewSourceToggleTitle);
530 viewSourceToggleButton.addEventListener('click', handler, false);
531 return viewSourceToggleButton;
532 }
533
534 /**
535 * @param {!Event} event
536 */
537 _toggleURLDecoding(event) {
538 this._decodeRequestParameters = !this._decodeRequestParameters;
539 this._refreshQueryString();
540 this._refreshFormData();
541 event.consume();
542 }
543
544 _refreshRequestHeaders() {
545 const treeElement = this._requestHeadersCategory;
546 const headers = this._request.requestHeaders().slice();
547 headers.sort(function(a, b) {
548 return a.name.toLowerCase().compareTo(b.name.toLowerCase());
549 });
550 const headersText = this._request.requestHeadersText();
551
Tim van der Lippe1d6e57a2019-09-30 11:55:34552 if (this._showRequestHeadersText && headersText) {
Tim van der Lippe0ed1d2b2020-02-04 13:45:13553 this._refreshHeadersText(Common.UIString.UIString('Request Headers'), headers.length, headersText, treeElement);
Tim van der Lippe1d6e57a2019-09-30 11:55:34554 } else {
Tim van der Lippe0ed1d2b2020-02-04 13:45:13555 this._refreshHeaders(
556 Common.UIString.UIString('Request Headers'), headers, treeElement, headersText === undefined);
Tim van der Lippe1d6e57a2019-09-30 11:55:34557 }
Blink Reformat4c46d092018-04-07 15:32:37558
559 if (headersText) {
560 const toggleButton = this._createHeadersToggleButton(this._showRequestHeadersText);
561 toggleButton.addEventListener('click', this._toggleRequestHeadersText.bind(this), false);
562 treeElement.listItemElement.appendChild(toggleButton);
563 }
564
565 this._refreshFormData();
566 }
567
568 _refreshResponseHeaders() {
569 const treeElement = this._responseHeadersCategory;
570 const headers = this._request.sortedResponseHeaders.slice();
571 const headersText = this._request.responseHeadersText;
572
Joey Arhar7199a942019-09-10 22:37:39573 if (this._showResponseHeadersText) {
Tim van der Lippe0ed1d2b2020-02-04 13:45:13574 this._refreshHeadersText(Common.UIString.UIString('Response Headers'), headers.length, headersText, treeElement);
Joey Arhar7199a942019-09-10 22:37:39575 } else {
Sigurd Schneidera2afe0b2020-03-03 15:27:13576 const headersWithIssues = [];
577 if (this._request.wasBlocked()) {
578 const headerWithIssues = BlockedReasonDetails.get(this._request.blockedReason());
579 if (headerWithIssues) {
580 headersWithIssues.push(headerWithIssues);
581 }
582 }
Joey Arhar7199a942019-09-10 22:37:39583 this._refreshHeaders(
Sigurd Schneidera2afe0b2020-03-03 15:27:13584 Common.UIString.UIString('Response Headers'), mergeHeadersWithIssues(headers, headersWithIssues), treeElement,
585 /* provisional */ false, this._request.blockedResponseCookies());
Joey Arhar7199a942019-09-10 22:37:39586 }
Blink Reformat4c46d092018-04-07 15:32:37587
588 if (headersText) {
589 const toggleButton = this._createHeadersToggleButton(this._showResponseHeadersText);
590 toggleButton.addEventListener('click', this._toggleResponseHeadersText.bind(this), false);
591 treeElement.listItemElement.appendChild(toggleButton);
592 }
Sigurd Schneidera2afe0b2020-03-03 15:27:13593
594 /**
595 *
596 * @param {!Array<*>} headers
597 * @param {!Array<*>} headersWithIssues
598 */
599 function mergeHeadersWithIssues(headers, headersWithIssues) {
600 let i = 0, j = 0;
601 const result = [];
602 while (i < headers.length || j < headersWithIssues.length) {
603 if (i < headers.length && (j >= headersWithIssues.length || headers[i].name < headersWithIssues[j].name)) {
604 result.push({...headers[i++], headerNotSet: false});
605 } else if (
606 j < headersWithIssues.length && (i >= headers.length || headers[i].name > headersWithIssues[j].name)) {
607 result.push({...headersWithIssues[j++], headerNotSet: true});
608 } else if (
609 i < headers.length && j < headersWithIssues.length && headers[i].name === headersWithIssues[j].name) {
610 result.push({...headersWithIssues[j++], ...headers[i++], headerNotSet: false});
611 }
612 }
613 return result;
614 }
Blink Reformat4c46d092018-04-07 15:32:37615 }
616
617 _refreshHTTPInformation() {
618 const requestMethodElement = this._requestMethodItem;
619 requestMethodElement.hidden = !this._request.statusCode;
620 const statusCodeElement = this._statusCodeItem;
621 statusCodeElement.hidden = !this._request.statusCode;
622
623 if (this._request.statusCode) {
624 const statusCodeFragment = createDocumentFragment();
Tsuyoshi Horo41dcffd2019-05-24 03:59:05625 statusCodeFragment.createChild('div', 'header-name').textContent = ls`Status Code` +
626 ': ';
Blink Reformat4c46d092018-04-07 15:32:37627 statusCodeFragment.createChild('span', 'header-separator');
628
Joel Einbinder7fbe24c2019-01-24 05:19:01629 const statusCodeImage = statusCodeFragment.createChild('span', 'resource-status-image', 'dt-icon-label');
Blink Reformat4c46d092018-04-07 15:32:37630 statusCodeImage.title = this._request.statusCode + ' ' + this._request.statusText;
631
Tim van der Lippe1d6e57a2019-09-30 11:55:34632 if (this._request.statusCode < 300 || this._request.statusCode === 304) {
Blink Reformat4c46d092018-04-07 15:32:37633 statusCodeImage.type = 'smallicon-green-ball';
Tim van der Lippe1d6e57a2019-09-30 11:55:34634 } else if (this._request.statusCode < 400) {
Blink Reformat4c46d092018-04-07 15:32:37635 statusCodeImage.type = 'smallicon-orange-ball';
Tim van der Lippe1d6e57a2019-09-30 11:55:34636 } else {
Blink Reformat4c46d092018-04-07 15:32:37637 statusCodeImage.type = 'smallicon-red-ball';
Tim van der Lippe1d6e57a2019-09-30 11:55:34638 }
Blink Reformat4c46d092018-04-07 15:32:37639
Tsuyoshi Horo41dcffd2019-05-24 03:59:05640 requestMethodElement.title = this._formatHeader(ls`Request Method`, this._request.requestMethod);
Blink Reformat4c46d092018-04-07 15:32:37641
642 const statusTextElement = statusCodeFragment.createChild('div', 'header-value source-code');
643 let statusText = this._request.statusCode + ' ' + this._request.statusText;
Ben Kelly0375f502018-09-11 17:05:50644 if (this._request.cachedInMemory()) {
Tsuyoshi Horo41dcffd2019-05-24 03:59:05645 statusText += ' ' + ls`(from memory cache)`;
Ben Kelly0375f502018-09-11 17:05:50646 statusTextElement.classList.add('status-from-cache');
647 } else if (this._request.fetchedViaServiceWorker) {
Tsuyoshi Horo41dcffd2019-05-24 03:59:05648 statusText += ' ' + ls`(from ServiceWorker)`;
Blink Reformat4c46d092018-04-07 15:32:37649 statusTextElement.classList.add('status-from-cache');
Tsuyoshi Horo8f6a2b12018-10-01 22:24:03650 } else if (
651 this._request.redirectSource() && this._request.redirectSource().signedExchangeInfo() &&
652 !this._request.redirectSource().signedExchangeInfo().errors) {
Tsuyoshi Horo41dcffd2019-05-24 03:59:05653 statusText += ' ' + ls`(from signed-exchange)`;
654 statusTextElement.classList.add('status-from-cache');
655 } else if (this._request.fromPrefetchCache()) {
656 statusText += ' ' + ls`(from prefetch cache)`;
Tsuyoshi Horo02266c32018-05-21 17:01:18657 statusTextElement.classList.add('status-from-cache');
Blink Reformat4c46d092018-04-07 15:32:37658 } else if (this._request.cached()) {
Tsuyoshi Horo41dcffd2019-05-24 03:59:05659 statusText += ' ' + ls`(from disk cache)`;
Blink Reformat4c46d092018-04-07 15:32:37660 statusTextElement.classList.add('status-from-cache');
661 }
662 statusTextElement.textContent = statusText;
663
664 statusCodeElement.title = statusCodeFragment;
665 }
666 }
667
668 /**
669 * @param {string} title
Tim van der Lippe0ed1d2b2020-02-04 13:45:13670 * @param {!UI.TreeOutline.TreeElement} headersTreeElement
Blink Reformat4c46d092018-04-07 15:32:37671 * @param {number} headersLength
672 */
673 _refreshHeadersTitle(title, headersTreeElement, headersLength) {
674 headersTreeElement.listItemElement.removeChildren();
Amanda Baker2e19a1b2019-10-25 00:41:02675 headersTreeElement.listItemElement.createChild('div', 'selection fill');
Blink Reformat4c46d092018-04-07 15:32:37676 headersTreeElement.listItemElement.createTextChild(title);
677
Tim van der Lippe0ed1d2b2020-02-04 13:45:13678 const headerCount = Common.UIString.UIString('\xA0(%d)', headersLength);
Blink Reformat4c46d092018-04-07 15:32:37679 headersTreeElement.listItemElement.createChild('span', 'header-count').textContent = headerCount;
680 }
681
682 /**
683 * @param {string} title
684 * @param {!Array.<!SDK.NetworkRequest.NameValue>} headers
Tim van der Lippe0ed1d2b2020-02-04 13:45:13685 * @param {!UI.TreeOutline.TreeElement} headersTreeElement
Blink Reformat4c46d092018-04-07 15:32:37686 * @param {boolean=} provisionalHeaders
Joey Arhar7199a942019-09-10 22:37:39687 * @param {!Array<!SDK.NetworkRequest.BlockedSetCookieWithReason>=} blockedResponseCookies
Blink Reformat4c46d092018-04-07 15:32:37688 */
Joey Arhar7199a942019-09-10 22:37:39689 _refreshHeaders(title, headers, headersTreeElement, provisionalHeaders, blockedResponseCookies) {
Blink Reformat4c46d092018-04-07 15:32:37690 headersTreeElement.removeChildren();
691
692 const length = headers.length;
693 this._refreshHeadersTitle(title, headersTreeElement, length);
694
695 if (provisionalHeaders) {
Joey Arhara613f912020-01-17 22:46:57696 let cautionText;
697 let cautionTitle = '';
698 if (this._request.cachedInMemory() || this._request.cached()) {
699 cautionText = ls`Provisional headers are shown. Disable cache to see full headers.`;
700 cautionTitle = ls
701 `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.`;
702 } else {
703 cautionText = ls`Provisional headers are shown`;
704 }
705 const cautionElement = createElement('div');
706 cautionElement.title = cautionTitle;
707 cautionElement.createChild('span', '', 'dt-icon-label').type = 'smallicon-warning';
708 cautionElement.createChild('div', 'caution').textContent = cautionText;
Tim van der Lippe0ed1d2b2020-02-04 13:45:13709 const cautionTreeElement = new UI.TreeOutline.TreeElement(cautionElement);
Blink Reformat4c46d092018-04-07 15:32:37710 headersTreeElement.appendChild(cautionTreeElement);
711 }
712
Joey Arhar41a5fad2019-09-13 22:18:45713 /** @type {!Map<string, !Array<!Protocol.Network.SetCookieBlockedReason>>} */
714 const blockedCookieLineToReasons = new Map();
Joey Arhar7199a942019-09-10 22:37:39715 if (blockedResponseCookies) {
716 blockedResponseCookies.forEach(blockedCookie => {
Joey Arhar41a5fad2019-09-13 22:18:45717 blockedCookieLineToReasons.set(blockedCookie.cookieLine, blockedCookie.blockedReasons);
Joey Arhar7199a942019-09-10 22:37:39718 });
719 }
720
Blink Reformat4c46d092018-04-07 15:32:37721 headersTreeElement.hidden = !length && !provisionalHeaders;
722 for (let i = 0; i < length; ++i) {
Sigurd Schneidera2afe0b2020-03-03 15:27:13723 const headerTreeElement = new UI.TreeOutline.TreeElement(this._formatHeaderObject(headers[i]));
Paul Lewis56509652019-12-06 12:51:58724 headerTreeElement[_headerNameSymbol] = headers[i].name;
Joey Arhar7199a942019-09-10 22:37:39725
726 if (headers[i].name.toLowerCase() === 'set-cookie') {
Joey Arhar41a5fad2019-09-13 22:18:45727 const matchingBlockedReasons = blockedCookieLineToReasons.get(headers[i].value);
728 if (matchingBlockedReasons) {
Tim van der Lippe0ed1d2b2020-02-04 13:45:13729 const icon = UI.Icon.Icon.create('smallicon-warning', '');
Joey Arhar7199a942019-09-10 22:37:39730 headerTreeElement.listItemElement.appendChild(icon);
Joey Arhar41a5fad2019-09-13 22:18:45731
732 let titleText = '';
733 for (const blockedReason of matchingBlockedReasons) {
Tim van der Lippe1d6e57a2019-09-30 11:55:34734 if (titleText) {
Joey Arhar41a5fad2019-09-13 22:18:45735 titleText += '\n';
Tim van der Lippe1d6e57a2019-09-30 11:55:34736 }
Joey Arhar41a5fad2019-09-13 22:18:45737 titleText += SDK.NetworkRequest.setCookieBlockedReasonToUiString(blockedReason);
738 }
739 icon.title = titleText;
Joey Arhar7199a942019-09-10 22:37:39740 }
741 }
742
743 headersTreeElement.appendChild(headerTreeElement);
Blink Reformat4c46d092018-04-07 15:32:37744 }
745 }
746
747 /**
748 * @param {string} title
749 * @param {number} count
750 * @param {string} headersText
Tim van der Lippe0ed1d2b2020-02-04 13:45:13751 * @param {!UI.TreeOutline.TreeElement} headersTreeElement
Blink Reformat4c46d092018-04-07 15:32:37752 */
753 _refreshHeadersText(title, count, headersText, headersTreeElement) {
754 this._populateTreeElementWithSourceText(headersTreeElement, headersText);
755 this._refreshHeadersTitle(title, headersTreeElement, count);
756 }
757
758 _refreshRemoteAddress() {
759 const remoteAddress = this._request.remoteAddress();
760 const treeElement = this._remoteAddressItem;
761 treeElement.hidden = !remoteAddress;
Tim van der Lippe1d6e57a2019-09-30 11:55:34762 if (remoteAddress) {
Tim van der Lippe0ed1d2b2020-02-04 13:45:13763 treeElement.title = this._formatHeader(Common.UIString.UIString('Remote Address'), remoteAddress);
Tim van der Lippe1d6e57a2019-09-30 11:55:34764 }
Blink Reformat4c46d092018-04-07 15:32:37765 }
766
767 _refreshReferrerPolicy() {
768 const referrerPolicy = this._request.referrerPolicy();
769 const treeElement = this._referrerPolicyItem;
770 treeElement.hidden = !referrerPolicy;
Tim van der Lippe1d6e57a2019-09-30 11:55:34771 if (referrerPolicy) {
Tim van der Lippe0ed1d2b2020-02-04 13:45:13772 treeElement.title = this._formatHeader(Common.UIString.UIString('Referrer Policy'), referrerPolicy);
Tim van der Lippe1d6e57a2019-09-30 11:55:34773 }
Blink Reformat4c46d092018-04-07 15:32:37774 }
775
776 /**
777 * @param {!Event} event
778 */
779 _toggleRequestHeadersText(event) {
780 this._showRequestHeadersText = !this._showRequestHeadersText;
781 this._refreshRequestHeaders();
782 event.consume();
783 }
784
785 /**
786 * @param {!Event} event
787 */
788 _toggleResponseHeadersText(event) {
789 this._showResponseHeadersText = !this._showResponseHeadersText;
790 this._refreshResponseHeaders();
791 event.consume();
792 }
793
794 /**
795 * @param {string} title
796 * @return {!Element}
797 */
798 _createToggleButton(title) {
799 const button = createElementWithClass('span', 'header-toggle');
800 button.textContent = title;
801 return button;
802 }
803
804 /**
805 * @param {boolean} isHeadersTextShown
806 * @return {!Element}
807 */
808 _createHeadersToggleButton(isHeadersTextShown) {
Tim van der Lippe0ed1d2b2020-02-04 13:45:13809 const toggleTitle =
810 isHeadersTextShown ? Common.UIString.UIString('view parsed') : Common.UIString.UIString('view source');
Blink Reformat4c46d092018-04-07 15:32:37811 return this._createToggleButton(toggleTitle);
812 }
813
814 _clearHighlight() {
Tim van der Lippe1d6e57a2019-09-30 11:55:34815 if (this._highlightedElement) {
Blink Reformat4c46d092018-04-07 15:32:37816 this._highlightedElement.listItemElement.classList.remove('header-highlight');
Tim van der Lippe1d6e57a2019-09-30 11:55:34817 }
Blink Reformat4c46d092018-04-07 15:32:37818 this._highlightedElement = null;
819 }
820
821
822 /**
Tim van der Lippe0ed1d2b2020-02-04 13:45:13823 * @param {?UI.TreeOutline.TreeElement} category
Blink Reformat4c46d092018-04-07 15:32:37824 * @param {string} name
825 */
826 _revealAndHighlight(category, name) {
827 this._clearHighlight();
828 for (const element of category.children()) {
Paul Lewis56509652019-12-06 12:51:58829 if (element[_headerNameSymbol] !== name) {
Blink Reformat4c46d092018-04-07 15:32:37830 continue;
Tim van der Lippe1d6e57a2019-09-30 11:55:34831 }
Blink Reformat4c46d092018-04-07 15:32:37832 this._highlightedElement = element;
833 element.reveal();
834 element.listItemElement.classList.add('header-highlight');
835 return;
836 }
837 }
838
839 /**
840 * @param {string} header
841 */
842 revealRequestHeader(header) {
843 this._revealAndHighlight(this._requestHeadersCategory, header);
844 }
845
846 /**
847 * @param {string} header
848 */
849 revealResponseHeader(header) {
850 this._revealAndHighlight(this._responseHeadersCategory, header);
851 }
Paul Lewis56509652019-12-06 12:51:58852}
Blink Reformat4c46d092018-04-07 15:32:37853
Paul Lewis56509652019-12-06 12:51:58854export const _headerNameSymbol = Symbol('HeaderName');
855export const _viewSourceSymbol = Symbol('ViewSource');
Blink Reformat4c46d092018-04-07 15:32:37856
857/**
858 * @unrestricted
859 */
Tim van der Lippe0ed1d2b2020-02-04 13:45:13860export class Category extends UI.TreeOutline.TreeElement {
Blink Reformat4c46d092018-04-07 15:32:37861 /**
Tim van der Lippe0ed1d2b2020-02-04 13:45:13862 * @param {!UI.TreeOutline.TreeOutline} root
Blink Reformat4c46d092018-04-07 15:32:37863 * @param {string} name
864 * @param {string=} title
865 */
866 constructor(root, name, title) {
867 super(title || '', true);
Blink Reformat4c46d092018-04-07 15:32:37868 this.toggleOnClick = true;
869 this.hidden = true;
Paul Lewis6bcdb182020-01-23 11:08:05870 this._expandedSetting = self.Common.settings.createSetting('request-info-' + name + '-category-expanded', true);
Blink Reformat4c46d092018-04-07 15:32:37871 this.expanded = this._expandedSetting.get();
872 root.appendChild(this);
873 }
874
875 /**
Tim van der Lippe0ed1d2b2020-02-04 13:45:13876 * @return {!UI.TreeOutline.TreeElement}
Blink Reformat4c46d092018-04-07 15:32:37877 */
878 createLeaf() {
Tim van der Lippe0ed1d2b2020-02-04 13:45:13879 const leaf = new UI.TreeOutline.TreeElement();
Blink Reformat4c46d092018-04-07 15:32:37880 this.appendChild(leaf);
881 return leaf;
882 }
883
884 /**
885 * @override
886 */
887 onexpand() {
888 this._expandedSetting.set(true);
889 }
890
891 /**
892 * @override
893 */
894 oncollapse() {
895 this._expandedSetting.set(false);
896 }
Paul Lewis56509652019-12-06 12:51:58897}
Sigurd Schneidera2afe0b2020-03-03 15:27:13898
899
900const BlockedReasonDetails = new Map([
901 [
902 Protocol.Network.BlockedReason.CoepFrameResourceNeedsCoepHeader, {
903 name: 'cross-origin-embedder-policy',
904 value: null,
Sigurd Schneidercae7b532020-03-06 11:20:06905 details: {
906 explanation:
907 ls
908 `To embed this frame in your document, the response needs to enable the cross-origin embedder policy by specifying the following response header:`,
909 examples: [{codeSnippet:'Cross-Origin-Embedder-Policy: require-corp'}]
910 }
Sigurd Schneidera2afe0b2020-03-03 15:27:13911 }
912 ],
913 [
914 Protocol.Network.BlockedReason.CorpNotSameOriginAfterDefaultedToSameOriginByCoep, {
915 name: 'cross-origin-resource-policy',
916 value: null,
Sigurd Schneidercae7b532020-03-06 11:20:06917 details: {
918 explanation:
919 ls
920 `To use this resource from a different origin, the server needs to specify a cross-origin resource policy in the response headers:`,
921 examples: [
922 {codeSnippet:'Cross-Origin-Resource-Policy: same-site', comment: ls`Choose this option if the resource and the document are served from the same site.` },
923 {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.` },
924 ]
925 }
Sigurd Schneidera2afe0b2020-03-03 15:27:13926 }
927 ],
928 [
929 Protocol.Network.BlockedReason.CoopSandboxedIframeCannotNavigateToCoopPage, {
930 name: 'cross-origin-opener-policy',
931 value: null,
932 headerValueIncorrect: false,
Sigurd Schneidercae7b532020-03-06 11:20:06933 details: {
934 explanation:
935 ls
936 `This document was blocked from loading in an iframe with a sandbox attribute because this document specified a cross-origin opener policy.`,
937 examples: []
938 }
Sigurd Schneidera2afe0b2020-03-03 15:27:13939 }
940 ],
941 [
942 Protocol.Network.BlockedReason.CorpNotSameSite, {
943 name: 'cross-origin-resource-policy',
944 value: null,
945 headerValueIncorrect: true,
Sigurd Schneidercae7b532020-03-06 11:20:06946 details: {
947 explanation:
948 ls
949 `To use this resource from a different site, the server may relax the cross-origin resource policy response header:`,
950 examples: [
951 {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.` },
952 ]
953 }
Sigurd Schneidera2afe0b2020-03-03 15:27:13954 }
955 ],
956 [
957 Protocol.Network.BlockedReason.CorpNotSameOrigin, {
958 name: 'cross-origin-resource-policy',
959 value: null,
960 headerValueIncorrect: true,
Sigurd Schneidercae7b532020-03-06 11:20:06961 details: {
962 explanation:
963 ls
964 `To use this resource from a different origin, the server may relax the cross-origin resource policy response header:`,
965 examples: [
966 {codeSnippet:'Cross-Origin-Resource-Policy: same-site', comment: ls`Choose this option if the resource and the document are served from the same site.` },
967 {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.` },
968 ]
969 }
Sigurd Schneidera2afe0b2020-03-03 15:27:13970 }
971 ],
972]);