blob: 5537565df54cb097ab290b255ef015bb0b04fdc9 [file] [log] [blame]
Wolfgang Beyer40530b682022-05-17 13:02:011// Copyright 2022 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5import * as Common from '../../../core/common/common.js';
Wolfgang Beyer7f495ee2022-07-08 13:45:136import * as Host from '../../../core/host/host.js';
Wolfgang Beyer40530b682022-05-17 13:02:017import * as i18n from '../../../core/i18n/i18n.js';
Wolfgang Beyer7f495ee2022-07-08 13:45:138import * as Platform from '../../../core/platform/platform.js';
Wolfgang Beyer185fb1f2022-08-01 13:48:259import * as Root from '../../../core/root/root.js';
Wolfgang Beyer40530b682022-05-17 13:02:0110import * as SDK from '../../../core/sdk/sdk.js';
Wolfgang Beyer7f495ee2022-07-08 13:45:1311import * as Protocol from '../../../generated/protocol.js';
12import * as IssuesManager from '../../../models/issues_manager/issues_manager.js';
Wolfgang Beyer185fb1f2022-08-01 13:48:2513import * as Persistence from '../../../models/persistence/persistence.js';
14import * as Workspace from '../../../models/workspace/workspace.js';
Wolfgang Beyer40426d82022-08-03 11:08:0715import * as NetworkForward from '../../../panels/network/forward/forward.js';
Wolfgang Beyerbcf4a832022-07-25 12:34:4716import * as ClientVariations from '../../../third_party/chromium/client-variations/client-variations.js';
Wolfgang Beyerd1dd7962022-05-24 15:48:4817import * as Buttons from '../../../ui/components/buttons/buttons.js';
Wolfgang Beyer40530b682022-05-17 13:02:0118import * as ComponentHelpers from '../../../ui/components/helpers/helpers.js';
Wolfgang Beyer7f495ee2022-07-08 13:45:1319import * as IconButton from '../../../ui/components/icon_button/icon_button.js';
Jack Franklin1f19d522022-07-06 14:00:1820import * as Input from '../../../ui/components/input/input.js';
Wolfgang Beyer40530b682022-05-17 13:02:0121import * as UI from '../../../ui/legacy/legacy.js';
22import * as LitHtml from '../../../ui/lit-html/lit-html.js';
Wolfgang Beyer185fb1f2022-08-01 13:48:2523import * as Sources from '../../sources/sources.js';
Wolfgang Beyer40530b682022-05-17 13:02:0124
25import requestHeadersViewStyles from './RequestHeadersView.css.js';
26
Wolfgang Beyerd1dd7962022-05-24 15:48:4827const RAW_HEADER_CUTOFF = 3000;
Wolfgang Beyer40530b682022-05-17 13:02:0128const {render, html} = LitHtml;
29
30const UIStrings = {
31 /**
Wolfgang Beyerbcf4a832022-07-25 12:34:4732 *@description Comment used in decoded X-Client-Data HTTP header output in Headers View of the Network panel
33 */
34 activeClientExperimentVariation: 'Active `client experiment variation IDs`.',
35 /**
36 *@description Comment used in decoded X-Client-Data HTTP header output in Headers View of the Network panel
37 */
38 activeClientExperimentVariationIds: 'Active `client experiment variation IDs` that trigger server-side behavior.',
39 /**
Wolfgang Beyer7f495ee2022-07-08 13:45:1340 *@description Text in Headers View of the Network panel
41 */
42 chooseThisOptionIfTheResourceAnd:
43 'Choose this option if the resource and the document are served from the same site.',
44 /**
Wolfgang Beyerbcf4a832022-07-25 12:34:4745 *@description Text in Headers View of the Network panel for X-Client-Data HTTP headers
46 */
47 decoded: 'Decoded:',
48 /**
Wolfgang Beyer40530b682022-05-17 13:02:0149 *@description Text in Request Headers View of the Network panel
50 */
Wolfgang Beyer37fcd282022-06-29 09:34:1751 fromDiskCache: '(from disk cache)',
52 /**
53 *@description Text in Request Headers View of the Network panel
54 */
Wolfgang Beyer40530b682022-05-17 13:02:0155 fromMemoryCache: '(from memory cache)',
56 /**
57 *@description Text in Request Headers View of the Network panel
58 */
Wolfgang Beyer37fcd282022-06-29 09:34:1759 fromPrefetchCache: '(from prefetch cache)',
60 /**
61 *@description Text in Request Headers View of the Network panel
62 */
Wolfgang Beyer40530b682022-05-17 13:02:0163 fromServiceWorker: '(from `service worker`)',
64 /**
65 *@description Text in Request Headers View of the Network panel
66 */
67 fromSignedexchange: '(from signed-exchange)',
68 /**
69 *@description Text in Request Headers View of the Network panel
70 */
Wolfgang Beyer40530b682022-05-17 13:02:0171 fromWebBundle: '(from Web Bundle)',
72 /**
73 *@description Section header for a list of the main aspects of a http request
74 */
75 general: 'General',
76 /**
Wolfgang Beyer185fb1f2022-08-01 13:48:2577 *@description Label for a link from the network panel's headers view to the file in which
78 * header overrides are defined in the sources panel.
79 */
80 headerOverrides: 'Header overrides',
81 /**
Wolfgang Beyer7f495ee2022-07-08 13:45:1382 *@description Text that is usually a hyperlink to more documentation
83 */
84 learnMore: 'Learn more',
85 /**
86 *@description Text for a link to the issues panel
87 */
88 learnMoreInTheIssuesTab: 'Learn more in the issues tab',
89 /**
Wolfgang Beyer235544c2022-05-24 08:07:4590 *@description Label for a checkbox to switch between raw and parsed headers
91 */
92 raw: 'Raw',
93 /**
Wolfgang Beyer7f495ee2022-07-08 13:45:1394 *@description Text in Headers View of the Network panel
95 */
96 onlyChooseThisOptionIfAn:
97 'Only choose this option if an arbitrary website including this resource does not impose a security risk.',
98 /**
Wolfgang Beyerd0ab3a62022-07-12 12:59:0299 *@description Message to explain lack of raw headers for a particular network request
100 */
101 provisionalHeadersAreShownDisableCache: 'Provisional headers are shown. Disable cache to see full headers.',
102 /**
103 *@description Tooltip to explain lack of raw headers for a particular network request
104 */
105 onlyProvisionalHeadersAre:
106 '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.',
107 /**
108 *@description Message to explain lack of raw headers for a particular network request
109 */
110 provisionalHeadersAreShown: 'Provisional headers are shown.',
111 /**
Wolfgang Beyer235544c2022-05-24 08:07:45112 *@description Text in Request Headers View of the Network panel
113 */
Wolfgang Beyer37fcd282022-06-29 09:34:17114 referrerPolicy: 'Referrer Policy',
Wolfgang Beyer235544c2022-05-24 08:07:45115 /**
Wolfgang Beyer37fcd282022-06-29 09:34:17116 *@description Text in Network Log View Columns of the Network panel
Wolfgang Beyer40530b682022-05-17 13:02:01117 */
Wolfgang Beyer37fcd282022-06-29 09:34:17118 remoteAddress: 'Remote Address',
119 /**
120 *@description Text in Request Headers View of the Network panel
121 */
122 requestHeaders: 'Request Headers',
Wolfgang Beyer40530b682022-05-17 13:02:01123 /**
124 *@description The HTTP method of a request
125 */
126 requestMethod: 'Request Method',
127 /**
Wolfgang Beyer37fcd282022-06-29 09:34:17128 *@description The URL of a request
129 */
130 requestUrl: 'Request URL',
131 /**
Wolfgang Beyer235544c2022-05-24 08:07:45132 *@description A context menu item in the Network Log View Columns of the Network panel
133 */
134 responseHeaders: 'Response Headers',
135 /**
Wolfgang Beyerd1dd7962022-05-24 15:48:48136 *@description Text to show more content
137 */
138 showMore: 'Show more',
139 /**
Wolfgang Beyer40530b682022-05-17 13:02:01140 *@description HTTP response code
141 */
142 statusCode: 'Status Code',
Wolfgang Beyer7f495ee2022-07-08 13:45:13143 /**
144 *@description Text in Headers View of the Network panel
145 */
146 thisDocumentWasBlockedFrom:
147 'This document was blocked from loading in an `iframe` with a `sandbox` attribute because this document specified a cross-origin opener policy.',
148 /**
149 *@description Text in Headers View of the Network panel
150 */
151 toEmbedThisFrameInYourDocument:
152 'To embed this frame in your document, the response needs to enable the cross-origin embedder policy by specifying the following response header:',
153 /**
154 *@description Text in Headers View of the Network panel
155 */
156 toUseThisResourceFromADifferent:
157 'To use this resource from a different origin, the server needs to specify a cross-origin resource policy in the response headers:',
158 /**
159 *@description Text in Headers View of the Network panel
160 */
161 toUseThisResourceFromADifferentOrigin:
162 'To use this resource from a different origin, the server may relax the cross-origin resource policy response header:',
163 /**
164 *@description Text in Headers View of the Network panel
165 */
166 toUseThisResourceFromADifferentSite:
167 'To use this resource from a different site, the server may relax the cross-origin resource policy response header:',
Wolfgang Beyer40530b682022-05-17 13:02:01168};
169const str_ = i18n.i18n.registerUIStrings('panels/network/components/RequestHeadersView.ts', UIStrings);
170const i18nString = i18n.i18n.getLocalizedString.bind(undefined, str_);
Wolfgang Beyer7f495ee2022-07-08 13:45:13171const i18nLazyString = i18n.i18n.getLazilyComputedLocalizedString.bind(undefined, str_);
Wolfgang Beyer40530b682022-05-17 13:02:01172
173export class RequestHeadersView extends UI.Widget.VBox {
174 readonly #headersView = new RequestHeadersComponent();
175 readonly #request: SDK.NetworkRequest.NetworkRequest;
176
177 constructor(request: SDK.NetworkRequest.NetworkRequest) {
178 super();
179 this.#request = request;
180 this.contentElement.appendChild(this.#headersView);
181 }
182
183 wasShown(): void {
184 this.#request.addEventListener(SDK.NetworkRequest.Events.RemoteAddressChanged, this.#refreshHeadersView, this);
185 this.#request.addEventListener(SDK.NetworkRequest.Events.FinishedLoading, this.#refreshHeadersView, this);
Wolfgang Beyer87150062022-07-29 10:45:47186 this.#request.addEventListener(SDK.NetworkRequest.Events.RequestHeadersChanged, this.#refreshHeadersView, this);
187 this.#request.addEventListener(SDK.NetworkRequest.Events.ResponseHeadersChanged, this.#refreshHeadersView, this);
Wolfgang Beyer40530b682022-05-17 13:02:01188 this.#refreshHeadersView();
189 }
190
191 willHide(): void {
192 this.#request.removeEventListener(SDK.NetworkRequest.Events.RemoteAddressChanged, this.#refreshHeadersView, this);
193 this.#request.removeEventListener(SDK.NetworkRequest.Events.FinishedLoading, this.#refreshHeadersView, this);
Wolfgang Beyer87150062022-07-29 10:45:47194 this.#request.removeEventListener(SDK.NetworkRequest.Events.RequestHeadersChanged, this.#refreshHeadersView, this);
195 this.#request.removeEventListener(SDK.NetworkRequest.Events.ResponseHeadersChanged, this.#refreshHeadersView, this);
Wolfgang Beyer40530b682022-05-17 13:02:01196 }
197
198 #refreshHeadersView(): void {
199 this.#headersView.data = {
200 request: this.#request,
201 };
202 }
Wolfgang Beyer40426d82022-08-03 11:08:07203
204 revealHeader(section: NetworkForward.UIRequestLocation.UIHeaderSection, header?: string): void {
205 this.#headersView.data = {
206 request: this.#request,
207 toReveal: {section, header: header},
208 };
209 }
Wolfgang Beyer40530b682022-05-17 13:02:01210}
211
212export interface RequestHeadersComponentData {
213 request: SDK.NetworkRequest.NetworkRequest;
Wolfgang Beyer40426d82022-08-03 11:08:07214 toReveal?: {section: NetworkForward.UIRequestLocation.UIHeaderSection, header?: string};
Wolfgang Beyer40530b682022-05-17 13:02:01215}
216
217export class RequestHeadersComponent extends HTMLElement {
218 static readonly litTagName = LitHtml.literal`devtools-request-headers`;
219 readonly #shadow = this.attachShadow({mode: 'open'});
220 #request?: Readonly<SDK.NetworkRequest.NetworkRequest>;
Wolfgang Beyer235544c2022-05-24 08:07:45221 #showResponseHeadersText = false;
222 #showRequestHeadersText = false;
Wolfgang Beyerd1dd7962022-05-24 15:48:48223 #showResponseHeadersTextFull = false;
224 #showRequestHeadersTextFull = false;
Wolfgang Beyer40426d82022-08-03 11:08:07225 #toReveal?: {section: NetworkForward.UIRequestLocation.UIHeaderSection, header?: string} = undefined;
Wolfgang Beyer185fb1f2022-08-01 13:48:25226 readonly #workspace = Workspace.Workspace.WorkspaceImpl.instance();
Wolfgang Beyer40530b682022-05-17 13:02:01227
228 set data(data: RequestHeadersComponentData) {
229 this.#request = data.request;
Wolfgang Beyer40426d82022-08-03 11:08:07230 this.#toReveal = data.toReveal;
Wolfgang Beyer40530b682022-05-17 13:02:01231 this.#render();
232 }
233
234 connectedCallback(): void {
235 this.#shadow.adoptedStyleSheets = [requestHeadersViewStyles];
Wolfgang Beyer185fb1f2022-08-01 13:48:25236 this.#workspace.addEventListener(
237 Workspace.Workspace.Events.UISourceCodeAdded, this.#uiSourceCodeAddedOrRemoved, this);
238 this.#workspace.addEventListener(
239 Workspace.Workspace.Events.UISourceCodeRemoved, this.#uiSourceCodeAddedOrRemoved, this);
240 }
241
242 disconnectedCallback(): void {
243 this.#workspace.removeEventListener(
244 Workspace.Workspace.Events.UISourceCodeAdded, this.#uiSourceCodeAddedOrRemoved, this);
245 this.#workspace.removeEventListener(
246 Workspace.Workspace.Events.UISourceCodeRemoved, this.#uiSourceCodeAddedOrRemoved, this);
247 }
248
249 #uiSourceCodeAddedOrRemoved(event: Common.EventTarget.EventTargetEvent<Workspace.UISourceCode.UISourceCode>): void {
250 if (this.#getHeaderOverridesFileUrl() === event.data.url()) {
251 this.#render();
252 }
Wolfgang Beyer40530b682022-05-17 13:02:01253 }
254
255 #render(): void {
Wolfgang Beyer3e62bd72022-07-28 14:26:48256 if (!this.#request) {
257 return;
258 }
Wolfgang Beyer40530b682022-05-17 13:02:01259
260 // Disabled until https://crbug.com/1079231 is fixed.
261 // clang-format off
262 render(html`
263 ${this.#renderGeneralSection()}
Wolfgang Beyer235544c2022-05-24 08:07:45264 ${this.#renderResponseHeaders()}
265 ${this.#renderRequestHeaders()}
Wolfgang Beyer40530b682022-05-17 13:02:01266 `, this.#shadow, {host: this});
267 // clang-format on
268 }
269
Wolfgang Beyer3e62bd72022-07-28 14:26:48270 #renderResponseHeaders(): LitHtml.LitTemplate {
271 if (!this.#request) {
272 return LitHtml.nothing;
273 }
Wolfgang Beyer235544c2022-05-24 08:07:45274
Wolfgang Beyer7f495ee2022-07-08 13:45:13275 const headersWithIssues = [];
276 if (this.#request.wasBlocked()) {
277 const headerWithIssues =
278 BlockedReasonDetails.get((this.#request.blockedReason() as Protocol.Network.BlockedReason));
279 if (headerWithIssues) {
280 headersWithIssues.push(headerWithIssues);
281 }
282 }
283
284 function mergeHeadersWithIssues(
285 headers: SDK.NetworkRequest.NameValue[], headersWithIssues: HeaderDescriptor[]): HeaderDescriptor[] {
286 let i = 0, j = 0;
287 const result: HeaderDescriptor[] = [];
288 while (i < headers.length && j < headersWithIssues.length) {
289 if (headers[i].name < headersWithIssues[j].name) {
290 result.push({...headers[i++], headerNotSet: false});
291 } else if (headers[i].name > headersWithIssues[j].name) {
292 result.push({...headersWithIssues[j++], headerNotSet: true});
293 } else {
294 result.push({...headersWithIssues[j++], ...headers[i++], headerNotSet: false});
295 }
296 }
297 while (i < headers.length) {
298 result.push({...headers[i++], headerNotSet: false});
299 }
300 while (j < headersWithIssues.length) {
301 result.push({...headersWithIssues[j++], headerNotSet: true});
302 }
303 return result;
304 }
305
306 const mergedHeaders = mergeHeadersWithIssues(this.#request.sortedResponseHeaders.slice(), headersWithIssues);
307
Wolfgang Beyer21894d52022-07-26 12:12:44308 const blockedResponseCookies = this.#request.blockedResponseCookies();
309 const blockedCookieLineToReasons = new Map<string, Protocol.Network.SetCookieBlockedReason[]>(
310 blockedResponseCookies?.map(c => [c.cookieLine, c.blockedReasons]));
311 for (const header of mergedHeaders) {
312 if (header.name.toLowerCase() === 'set-cookie' && header.value) {
313 const matchingBlockedReasons = blockedCookieLineToReasons.get(header.value.toString());
314 if (matchingBlockedReasons) {
315 header.setCookieBlockedReasons = matchingBlockedReasons;
316 }
317 }
318 }
319
Wolfgang Beyer235544c2022-05-24 08:07:45320 const toggleShowRaw = (): void => {
321 this.#showResponseHeadersText = !this.#showResponseHeadersText;
322 this.#render();
323 };
324
Wolfgang Beyer28c01322022-08-02 13:15:32325 if (!mergedHeaders.length) {
326 return LitHtml.nothing;
327 }
328
Wolfgang Beyer235544c2022-05-24 08:07:45329 // Disabled until https://crbug.com/1079231 is fixed.
330 // clang-format off
331 return html`
332 <${Category.litTagName}
333 @togglerawevent=${toggleShowRaw}
334 .data=${{
335 name: 'responseHeaders',
336 title: i18nString(UIStrings.responseHeaders),
337 headerCount: this.#request.sortedResponseHeaders.length,
338 checked: this.#request.responseHeadersText ? this.#showResponseHeadersText : undefined,
Wolfgang Beyer185fb1f2022-08-01 13:48:25339 additionalContent: this.#renderHeaderOverridesLink(),
Wolfgang Beyer40426d82022-08-03 11:08:07340 forceOpen: this.#toReveal?.section === NetworkForward.UIRequestLocation.UIHeaderSection.Response,
Wolfgang Beyer235544c2022-05-24 08:07:45341 } as CategoryData}
342 aria-label=${i18nString(UIStrings.responseHeaders)}
343 >
Wolfgang Beyerd1dd7962022-05-24 15:48:48344 ${this.#showResponseHeadersText ?
345 this.#renderRawHeaders(this.#request.responseHeadersText, true) : html`
Wolfgang Beyer40426d82022-08-03 11:08:07346 ${mergedHeaders.map(header => this.#renderHeader(header, NetworkForward.UIRequestLocation.UIHeaderSection.Response))}
Wolfgang Beyer235544c2022-05-24 08:07:45347 `}
348 </${Category.litTagName}>
349 `;
Wolfgang Beyerbcf4a832022-07-25 12:34:47350 // clang-format on
Wolfgang Beyer235544c2022-05-24 08:07:45351 }
352
Wolfgang Beyer185fb1f2022-08-01 13:48:25353 #renderHeaderOverridesLink(): LitHtml.LitTemplate {
354 const overrideable = Root.Runtime.experiments.isEnabled(Root.Runtime.ExperimentName.HEADER_OVERRIDES);
355 if (!overrideable || !this.#workspace.uiSourceCodeForURL(this.#getHeaderOverridesFileUrl())) {
356 return LitHtml.nothing;
357 }
358
359 const overridesSetting: Common.Settings.Setting<boolean> =
360 Common.Settings.Settings.instance().moduleSetting('persistenceNetworkOverridesEnabled');
361 // Disabled until https://crbug.com/1079231 is fixed.
362 // clang-format off
363 const fileIcon = overridesSetting.get() ? html`
364 <${IconButton.Icon.Icon.litTagName} class="inline-icon purple-dot" .data=${{
365 iconName: 'file-sync_icon',
366 width: '11px',
367 height: '13px',
368 } as IconButton.Icon.IconData}>
369 </${IconButton.Icon.Icon.litTagName}>` : html`
370 <${IconButton.Icon.Icon.litTagName} class="inline-icon" .data=${{
371 iconName: 'file_icon',
372 color: 'var(--color-text-primary)',
373 width: '12px',
374 height: '12px',
375 } as IconButton.Icon.IconData}>
376 </${IconButton.Icon.Icon.litTagName}>`;
377 // clang-format on
378
379 const revealHeadersFile = (event: Event): void => {
380 event.preventDefault();
381 const uiSourceCode = this.#workspace.uiSourceCodeForURL(this.#getHeaderOverridesFileUrl());
382 if (uiSourceCode) {
383 Sources.SourcesPanel.SourcesPanel.instance().showUISourceCode(uiSourceCode);
384 }
385 };
386
387 return html`
388 <x-link @click=${revealHeadersFile} class="link devtools-link">
389 ${fileIcon}${i18nString(UIStrings.headerOverrides)}
390 </x-link>
391 `;
392 }
393
394 #getHeaderOverridesFileUrl(): Platform.DevToolsPath.UrlString {
395 if (!this.#request) {
396 return Platform.DevToolsPath.EmptyUrlString;
397 }
398 const fileUrl = Persistence.NetworkPersistenceManager.NetworkPersistenceManager.instance().fileUrlFromNetworkUrl(
399 this.#request.url(), /* ignoreInactive */ true);
400 return fileUrl.substring(0, fileUrl.lastIndexOf('/')) + '/' +
401 Persistence.NetworkPersistenceManager.HEADERS_FILENAME as Platform.DevToolsPath.UrlString;
402 }
403
Wolfgang Beyer3e62bd72022-07-28 14:26:48404 #renderRequestHeaders(): LitHtml.LitTemplate {
405 if (!this.#request) {
406 return LitHtml.nothing;
407 }
Wolfgang Beyer235544c2022-05-24 08:07:45408
Wolfgang Beyer7f495ee2022-07-08 13:45:13409 const headers = this.#request.requestHeaders().slice();
410 headers.sort(function(a, b) {
411 return Platform.StringUtilities.compare(a.name.toLowerCase(), b.name.toLowerCase());
412 });
413 const requestHeadersText = this.#request.requestHeadersText();
Wolfgang Beyer28c01322022-08-02 13:15:32414 if (!headers.length && requestHeadersText !== undefined) {
415 return LitHtml.nothing;
416 }
Wolfgang Beyer7f495ee2022-07-08 13:45:13417
Wolfgang Beyer235544c2022-05-24 08:07:45418 const toggleShowRaw = (): void => {
419 this.#showRequestHeadersText = !this.#showRequestHeadersText;
420 this.#render();
421 };
422
Wolfgang Beyer235544c2022-05-24 08:07:45423 // Disabled until https://crbug.com/1079231 is fixed.
424 // clang-format off
425 return html`
426 <${Category.litTagName}
427 @togglerawevent=${toggleShowRaw}
428 .data=${{
429 name: 'requestHeaders',
430 title: i18nString(UIStrings.requestHeaders),
431 headerCount: this.#request.requestHeaders().length,
432 checked: requestHeadersText? this.#showRequestHeadersText : undefined,
Wolfgang Beyer40426d82022-08-03 11:08:07433 forceOpen: this.#toReveal?.section === NetworkForward.UIRequestLocation.UIHeaderSection.Request,
Wolfgang Beyer235544c2022-05-24 08:07:45434 } as CategoryData}
435 aria-label=${i18nString(UIStrings.requestHeaders)}
436 >
Wolfgang Beyerd1dd7962022-05-24 15:48:48437 ${(this.#showRequestHeadersText && requestHeadersText) ?
438 this.#renderRawHeaders(requestHeadersText, false) : html`
Wolfgang Beyerd0ab3a62022-07-12 12:59:02439 ${this.#maybeRenderProvisionalHeadersWarning()}
Wolfgang Beyer40426d82022-08-03 11:08:07440 ${headers.map(header => this.#renderHeader({...header, headerNotSet: false}, NetworkForward.UIRequestLocation.UIHeaderSection.Request))}
Wolfgang Beyer235544c2022-05-24 08:07:45441 `}
442 </${Category.litTagName}>
443 `;
Wolfgang Beyerbcf4a832022-07-25 12:34:47444 // clang-format on
Wolfgang Beyer235544c2022-05-24 08:07:45445 }
446
Wolfgang Beyerd0ab3a62022-07-12 12:59:02447 #maybeRenderProvisionalHeadersWarning(): LitHtml.LitTemplate {
Wolfgang Beyer3e62bd72022-07-28 14:26:48448 if (!this.#request || this.#request.requestHeadersText() !== undefined) {
Wolfgang Beyerd0ab3a62022-07-12 12:59:02449 return LitHtml.nothing;
450 }
451
452 let cautionText;
453 let cautionTitle = '';
454 if (this.#request.cachedInMemory() || this.#request.cached()) {
455 cautionText = i18nString(UIStrings.provisionalHeadersAreShownDisableCache);
456 cautionTitle = i18nString(UIStrings.onlyProvisionalHeadersAre);
457 } else {
458 cautionText = i18nString(UIStrings.provisionalHeadersAreShown);
459 }
Wolfgang Beyerb7dadd32022-07-27 12:34:52460 // Disabled until https://crbug.com/1079231 is fixed.
461 // clang-format off
Wolfgang Beyerd0ab3a62022-07-12 12:59:02462 return html`
463 <div class="call-to-action">
464 <div class="call-to-action-body">
465 <div class="explanation" title=${cautionTitle}>
466 <${IconButton.Icon.Icon.litTagName} class="inline-icon" .data=${{
Wolfgang Beyerb7dadd32022-07-27 12:34:52467 iconName: 'clear-warning_icon',
468 width: '12px',
469 height: '12px',
Wolfgang Beyerd0ab3a62022-07-12 12:59:02470 } as IconButton.Icon.IconData}>
471 </${IconButton.Icon.Icon.litTagName}>
472 ${cautionText} <x-link href="https://developer.chrome.com/docs/devtools/network/reference/#provisional-headers" class="link">${i18nString(UIStrings.learnMore)}</x-link>
473 </div>
474 </div>
475 </div>
476 `;
Wolfgang Beyerb7dadd32022-07-27 12:34:52477 // clang-format on
Wolfgang Beyerd0ab3a62022-07-12 12:59:02478 }
479
Wolfgang Beyer40426d82022-08-03 11:08:07480 #renderHeader(header: HeaderDescriptor, section: NetworkForward.UIRequestLocation.UIHeaderSection):
481 LitHtml.TemplateResult {
482 const isHighlighted =
483 section === this.#toReveal?.section && header.name.toUpperCase() === this.#toReveal?.header?.toUpperCase();
Wolfgang Beyerbcf4a832022-07-25 12:34:47484 // Disabled until https://crbug.com/1079231 is fixed.
485 // clang-format off
Wolfgang Beyer7f495ee2022-07-08 13:45:13486 return html`
Wolfgang Beyer40426d82022-08-03 11:08:07487 <div class="row ${isHighlighted ? 'header-highlight' : ''}">
Wolfgang Beyerbcf4a832022-07-25 12:34:47488 <div class="header-name">
Wolfgang Beyerfccc2762022-07-27 12:03:09489 ${header.headerNotSet ?
490 html`<div class="header-badge header-badge-text">${i18n.i18n.lockedString('not-set')}</div>` :
491 LitHtml.nothing
492 }${header.name}:
Wolfgang Beyerbcf4a832022-07-25 12:34:47493 </div>
Wolfgang Beyerd815e1f2022-07-28 16:01:29494 <div
495 class="header-value ${header.headerValueIncorrect ? 'header-warning' : ''}"
496 @copy=${():void => Host.userMetrics.actionTaken(Host.UserMetrics.Action.NetworkPanelCopyValue)}
497 >
Wolfgang Beyer21894d52022-07-26 12:12:44498 ${header.value?.toString() || ''}
499 ${this.#maybeRenderHeaderValueSuffix(header)}
500 </div>
Wolfgang Beyer7f495ee2022-07-08 13:45:13501 </div>
Wolfgang Beyer21894d52022-07-26 12:12:44502 ${this.#maybeRenderBlockedDetails(header.blockedDetails)}
Wolfgang Beyer7f495ee2022-07-08 13:45:13503 `;
Wolfgang Beyerbcf4a832022-07-25 12:34:47504 // clang-format on
505 }
506
Wolfgang Beyer21894d52022-07-26 12:12:44507 #maybeRenderHeaderValueSuffix(header: HeaderDescriptor): LitHtml.LitTemplate {
Wolfgang Beyerbcf4a832022-07-25 12:34:47508 const headerId = header.name.toLowerCase();
Wolfgang Beyer21894d52022-07-26 12:12:44509
510 if (headerId === 'set-cookie' && header.setCookieBlockedReasons) {
511 const titleText =
512 header.setCookieBlockedReasons.map(SDK.NetworkRequest.setCookieBlockedReasonToUiString).join('\n');
513 // Disabled until https://crbug.com/1079231 is fixed.
514 // clang-format off
515 return html`
516 <${IconButton.Icon.Icon.litTagName} class="inline-icon" title=${titleText} .data=${{
Wolfgang Beyerb7dadd32022-07-27 12:34:52517 iconName: 'clear-warning_icon',
518 width: '12px',
519 height: '12px',
520 } as IconButton.Icon.IconData}>
Wolfgang Beyer21894d52022-07-26 12:12:44521 </${IconButton.Icon.Icon.litTagName}>
522 `;
523 // clang-format on
524 }
525
Wolfgang Beyerbcf4a832022-07-25 12:34:47526 if (headerId === 'x-client-data') {
527 const data = ClientVariations.parseClientVariations(header.value?.toString() || '');
528 const output = ClientVariations.formatClientVariations(
529 data, i18nString(UIStrings.activeClientExperimentVariation),
530 i18nString(UIStrings.activeClientExperimentVariationIds));
531 return html`
Wolfgang Beyer21894d52022-07-26 12:12:44532 <div>${i18nString(UIStrings.decoded)}</div>
533 <code>${output}</code>
Wolfgang Beyerbcf4a832022-07-25 12:34:47534 `;
535 }
536
Wolfgang Beyer21894d52022-07-26 12:12:44537 return LitHtml.nothing;
Wolfgang Beyer7f495ee2022-07-08 13:45:13538 }
539
Wolfgang Beyer21894d52022-07-26 12:12:44540 #maybeRenderBlockedDetails(blockedDetails?: BlockedDetailsDescriptor): LitHtml.LitTemplate {
541 if (!blockedDetails) {
Wolfgang Beyer7f495ee2022-07-08 13:45:13542 return LitHtml.nothing;
543 }
Wolfgang Beyer21894d52022-07-26 12:12:44544 // Disabled until https://crbug.com/1079231 is fixed.
545 // clang-format off
Wolfgang Beyer7f495ee2022-07-08 13:45:13546 return html`
Wolfgang Beyerd0ab3a62022-07-12 12:59:02547 <div class="call-to-action">
548 <div class="call-to-action-body">
Wolfgang Beyer21894d52022-07-26 12:12:44549 <div class="explanation">${blockedDetails.explanation()}</div>
550 ${blockedDetails.examples.map(example => html`
Wolfgang Beyerd0ab3a62022-07-12 12:59:02551 <div class="example">
552 <code>${example.codeSnippet}</code>
553 ${example.comment ? html`
554 <span class="comment">${example.comment()}</span>
555 ` : ''}
556 </div>
557 `)}
Wolfgang Beyer21894d52022-07-26 12:12:44558 ${this.#maybeRenderBlockedDetailsLink(blockedDetails)}
Wolfgang Beyer7f495ee2022-07-08 13:45:13559 </div>
560 </div>
561 `;
Wolfgang Beyer21894d52022-07-26 12:12:44562 // clang-format on
Wolfgang Beyer7f495ee2022-07-08 13:45:13563 }
564
Wolfgang Beyer21894d52022-07-26 12:12:44565 #maybeRenderBlockedDetailsLink(blockedDetails?: BlockedDetailsDescriptor): LitHtml.LitTemplate {
Wolfgang Beyer7f495ee2022-07-08 13:45:13566 if (this.#request && IssuesManager.RelatedIssue.hasIssueOfCategory(this.#request, IssuesManager.Issue.IssueCategory.CrossOriginEmbedderPolicy)) {
567 const followLink = (): void => {
568 Host.userMetrics.issuesPanelOpenedFrom(Host.UserMetrics.IssueOpener.LearnMoreLinkCOEP);
569 if (this.#request) {
570 void IssuesManager.RelatedIssue.reveal(
571 this.#request, IssuesManager.Issue.IssueCategory.CrossOriginEmbedderPolicy);
572 }
573 };
574 return html`
575 <div class="devtools-link" @click=${followLink}>
576 <${IconButton.Icon.Icon.litTagName} class="inline-icon" .data=${{
577 iconName: 'issue-exclamation-icon',
578 color: 'var(--issue-color-yellow)',
579 width: '16px',
580 height: '16px',
581 } as IconButton.Icon.IconData}>
582 </${IconButton.Icon.Icon.litTagName}>
583 ${i18nString(UIStrings.learnMoreInTheIssuesTab)}
584 </div>
585 `;
586 }
Wolfgang Beyer21894d52022-07-26 12:12:44587 if (blockedDetails?.link) {
588 // Disabled until https://crbug.com/1079231 is fixed.
589 // clang-format off
Wolfgang Beyer7f495ee2022-07-08 13:45:13590 return html`
Wolfgang Beyer21894d52022-07-26 12:12:44591 <x-link href=${blockedDetails.link.url} class="link">
Wolfgang Beyer7f495ee2022-07-08 13:45:13592 <${IconButton.Icon.Icon.litTagName} class="inline-icon" .data=${{
593 iconName: 'link_icon',
594 color: 'var(--color-link)',
595 width: '16px',
596 height: '16px',
597 } as IconButton.Icon.IconData}>
598 </${IconButton.Icon.Icon.litTagName}
599 >${i18nString(UIStrings.learnMore)}
600 </x-link>
601 `;
Wolfgang Beyer21894d52022-07-26 12:12:44602 // clang-format on
Wolfgang Beyer7f495ee2022-07-08 13:45:13603 }
604 return LitHtml.nothing;
605 }
606
Wolfgang Beyerd1dd7962022-05-24 15:48:48607 #renderRawHeaders(rawHeadersText: string, forResponseHeaders: boolean): LitHtml.TemplateResult {
608 const trimmed = rawHeadersText.trim();
609 const showFull = forResponseHeaders ? this.#showResponseHeadersTextFull : this.#showRequestHeadersTextFull;
610 const isShortened = !showFull && trimmed.length > RAW_HEADER_CUTOFF;
611
612 const showMore = ():void => {
613 if (forResponseHeaders) {
614 this.#showResponseHeadersTextFull = true;
615 } else {
616 this.#showRequestHeadersTextFull = true;
617 }
618 this.#render();
619 };
620
621 const onContextMenuOpen = (event: Event): void => {
622 const showFull = forResponseHeaders ? this.#showResponseHeadersTextFull : this.#showRequestHeadersTextFull;
623 if (!showFull) {
624 const contextMenu = new UI.ContextMenu.ContextMenu(event);
625 const section = contextMenu.newSection();
626 section.appendItem(i18nString(UIStrings.showMore), showMore);
627 void contextMenu.show();
628 }
629 };
630
631 const addContextMenuListener = (el: Element):void => {
632 if (isShortened) {
633 el.addEventListener('contextmenu', onContextMenuOpen);
634 }
635 };
636
637 return html`
638 <div class="row raw-headers-row" on-render=${ComponentHelpers.Directives.nodeRenderedCallback(addContextMenuListener)}>
639 <div class="raw-headers">${isShortened ? trimmed.substring(0, RAW_HEADER_CUTOFF) : trimmed}</div>
640 ${isShortened ? html`
641 <${Buttons.Button.Button.litTagName}
642 .size=${Buttons.Button.Size.SMALL}
643 .variant=${Buttons.Button.Variant.SECONDARY}
644 @click=${showMore}
645 >${i18nString(UIStrings.showMore)}</${Buttons.Button.Button.litTagName}>
646 ` : LitHtml.nothing}
647 </div>
648 `;
649 }
650
Wolfgang Beyer3e62bd72022-07-28 14:26:48651 #renderGeneralSection(): LitHtml.LitTemplate {
652 if (!this.#request) {
653 return LitHtml.nothing;
654 }
Wolfgang Beyer40530b682022-05-17 13:02:01655
Wolfgang Beyer40426d82022-08-03 11:08:07656 const statusClasses = [];
Wolfgang Beyer40530b682022-05-17 13:02:01657 if (this.#request.statusCode < 300 || this.#request.statusCode === 304) {
Wolfgang Beyer40426d82022-08-03 11:08:07658 statusClasses.push('green-circle');
Wolfgang Beyer40530b682022-05-17 13:02:01659 } else if (this.#request.statusCode < 400) {
Wolfgang Beyer40426d82022-08-03 11:08:07660 statusClasses.push('yellow-circle');
661 } else {
662 statusClasses.push('red-circle');
Wolfgang Beyer40530b682022-05-17 13:02:01663 }
664
665 let statusText = this.#request.statusCode + ' ' + this.#request.statusText;
Wolfgang Beyer40530b682022-05-17 13:02:01666 if (this.#request.cachedInMemory()) {
667 statusText += ' ' + i18nString(UIStrings.fromMemoryCache);
Wolfgang Beyer40426d82022-08-03 11:08:07668 statusClasses.push('status-with-comment');
Wolfgang Beyer40530b682022-05-17 13:02:01669 } else if (this.#request.fetchedViaServiceWorker) {
670 statusText += ' ' + i18nString(UIStrings.fromServiceWorker);
Wolfgang Beyer40426d82022-08-03 11:08:07671 statusClasses.push('status-with-comment');
Wolfgang Beyer40530b682022-05-17 13:02:01672 } else if (this.#request.redirectSourceSignedExchangeInfoHasNoErrors()) {
673 statusText += ' ' + i18nString(UIStrings.fromSignedexchange);
Wolfgang Beyer40426d82022-08-03 11:08:07674 statusClasses.push('status-with-comment');
Wolfgang Beyer40530b682022-05-17 13:02:01675 } else if (this.#request.webBundleInnerRequestInfo()) {
676 statusText += ' ' + i18nString(UIStrings.fromWebBundle);
Wolfgang Beyer40426d82022-08-03 11:08:07677 statusClasses.push('status-with-comment');
Wolfgang Beyer40530b682022-05-17 13:02:01678 } else if (this.#request.fromPrefetchCache()) {
679 statusText += ' ' + i18nString(UIStrings.fromPrefetchCache);
Wolfgang Beyer40426d82022-08-03 11:08:07680 statusClasses.push('status-with-comment');
Wolfgang Beyer40530b682022-05-17 13:02:01681 } else if (this.#request.cached()) {
682 statusText += ' ' + i18nString(UIStrings.fromDiskCache);
Wolfgang Beyer40426d82022-08-03 11:08:07683 statusClasses.push('status-with-comment');
Wolfgang Beyer40530b682022-05-17 13:02:01684 }
685
686 // Disabled until https://crbug.com/1079231 is fixed.
687 // clang-format off
688 return html`
Wolfgang Beyer235544c2022-05-24 08:07:45689 <${Category.litTagName}
Wolfgang Beyer40426d82022-08-03 11:08:07690 .data=${{
691 name: 'general',
692 title: i18nString(UIStrings.general),
693 forceOpen: this.#toReveal?.section === NetworkForward.UIRequestLocation.UIHeaderSection.General,
694 } as CategoryData}
Wolfgang Beyer235544c2022-05-24 08:07:45695 aria-label=${i18nString(UIStrings.general)}
696 >
Wolfgang Beyer40426d82022-08-03 11:08:07697 ${this.#renderGeneralRow(i18nString(UIStrings.requestUrl), this.#request.url())}
698 ${this.#request.statusCode? this.#renderGeneralRow(i18nString(UIStrings.requestMethod), this.#request.requestMethod) : LitHtml.nothing}
699 ${this.#request.statusCode? this.#renderGeneralRow(i18nString(UIStrings.statusCode), statusText, statusClasses) : LitHtml.nothing}
700 ${this.#request.remoteAddress()? this.#renderGeneralRow(i18nString(UIStrings.remoteAddress), this.#request.remoteAddress()) : LitHtml.nothing}
701 ${this.#request.referrerPolicy()? this.#renderGeneralRow(i18nString(UIStrings.referrerPolicy), String(this.#request.referrerPolicy())) : LitHtml.nothing}
Wolfgang Beyer40530b682022-05-17 13:02:01702 </${Category.litTagName}>
703 `;
704 // clang-format on
705 }
Wolfgang Beyer40426d82022-08-03 11:08:07706
707 #renderGeneralRow(name: Common.UIString.LocalizedString, value: string, classNames?: string[]): LitHtml.LitTemplate {
708 const isHighlighted = this.#toReveal?.section === NetworkForward.UIRequestLocation.UIHeaderSection.General &&
709 name.toUpperCase() === this.#toReveal?.header?.toUpperCase();
710 return html`
711 <div class="row ${isHighlighted ? 'header-highlight' : ''}">
712 <div class="header-name">${name}:</div>
713 <div
714 class="header-value ${classNames?.join(' ')}"
715 @copy=${(): void => Host.userMetrics.actionTaken(Host.UserMetrics.Action.NetworkPanelCopyValue)}
716 >${value}</div>
717 </div>
718 `;
719 }
Wolfgang Beyer40530b682022-05-17 13:02:01720}
721
Wolfgang Beyer235544c2022-05-24 08:07:45722export class ToggleRawHeadersEvent extends Event {
723 static readonly eventName = 'togglerawevent';
724
725 constructor() {
726 super(ToggleRawHeadersEvent.eventName, {});
727 }
728}
729
Wolfgang Beyer40530b682022-05-17 13:02:01730export interface CategoryData {
731 name: string;
732 title: Common.UIString.LocalizedString;
Wolfgang Beyer235544c2022-05-24 08:07:45733 headerCount?: number;
734 checked?: boolean;
Wolfgang Beyer185fb1f2022-08-01 13:48:25735 additionalContent?: LitHtml.LitTemplate;
Wolfgang Beyer40426d82022-08-03 11:08:07736 forceOpen?: boolean;
Wolfgang Beyer40530b682022-05-17 13:02:01737}
738
739export class Category extends HTMLElement {
740 static readonly litTagName = LitHtml.literal`devtools-request-headers-category`;
741 readonly #shadow = this.attachShadow({mode: 'open'});
742 #expandedSetting?: Common.Settings.Setting<boolean>;
743 #title: Common.UIString.LocalizedString = Common.UIString.LocalizedEmptyString;
Wolfgang Beyer235544c2022-05-24 08:07:45744 #headerCount?: number = undefined;
745 #checked: boolean|undefined = undefined;
Wolfgang Beyer185fb1f2022-08-01 13:48:25746 #additionalContent: LitHtml.LitTemplate|undefined = undefined;
Wolfgang Beyer40426d82022-08-03 11:08:07747 #forceOpen: boolean|undefined = undefined;
Wolfgang Beyer40530b682022-05-17 13:02:01748
749 connectedCallback(): void {
Jack Franklin1f19d522022-07-06 14:00:18750 this.#shadow.adoptedStyleSheets = [requestHeadersViewStyles, Input.checkboxStyles];
Wolfgang Beyer40530b682022-05-17 13:02:01751 }
752
753 set data(data: CategoryData) {
754 this.#title = data.title;
755 this.#expandedSetting =
756 Common.Settings.Settings.instance().createSetting('request-info-' + data.name + '-category-expanded', true);
Wolfgang Beyer235544c2022-05-24 08:07:45757 this.#headerCount = data.headerCount;
758 this.#checked = data.checked;
Wolfgang Beyer185fb1f2022-08-01 13:48:25759 this.#additionalContent = data.additionalContent;
Wolfgang Beyer40426d82022-08-03 11:08:07760 this.#forceOpen = data.forceOpen;
Wolfgang Beyer40530b682022-05-17 13:02:01761 this.#render();
762 }
763
Wolfgang Beyer235544c2022-05-24 08:07:45764 #onCheckboxToggle(): void {
765 this.dispatchEvent(new ToggleRawHeadersEvent());
766 }
767
Wolfgang Beyer40530b682022-05-17 13:02:01768 #render(): void {
Wolfgang Beyer40426d82022-08-03 11:08:07769 const isOpen = (this.#expandedSetting ? this.#expandedSetting.get() : true) || this.#forceOpen;
Wolfgang Beyer40530b682022-05-17 13:02:01770 // Disabled until https://crbug.com/1079231 is fixed.
771 // clang-format off
772 render(html`
Wolfgang Beyer235544c2022-05-24 08:07:45773 <details ?open=${isOpen} @toggle=${this.#onToggle}>
774 <summary class="header" @keydown=${this.#onSummaryKeyDown}>
Wolfgang Beyer185fb1f2022-08-01 13:48:25775 <div class="header-grid-container">
776 <div>
777 ${this.#title}${this.#headerCount ?
778 html`<span class="header-count"> (${this.#headerCount})</span>` :
779 LitHtml.nothing
780 }
781 </div>
782 <div class="hide-when-closed">
783 ${this.#checked !== undefined ? html`
784 <label><input type="checkbox" .checked=${this.#checked} @change=${this.#onCheckboxToggle} />${i18nString(UIStrings.raw)}</label>
785 ` : LitHtml.nothing}
786 </div>
787 <div class="hide-when-closed">${this.#additionalContent}</div>
Wolfgang Beyer235544c2022-05-24 08:07:45788 </summary>
Wolfgang Beyer40530b682022-05-17 13:02:01789 <slot></slot>
790 </details>
791 `, this.#shadow, {host: this});
792 // clang-format on
793 }
794
795 #onSummaryKeyDown(event: KeyboardEvent): void {
796 if (!event.target) {
797 return;
798 }
799 const summaryElement = event.target as HTMLElement;
800 const detailsElement = summaryElement.parentElement as HTMLDetailsElement;
801 if (!detailsElement) {
802 throw new Error('<details> element is not found for a <summary> element');
803 }
804 switch (event.key) {
805 case 'ArrowLeft':
806 detailsElement.open = false;
807 break;
808 case 'ArrowRight':
809 detailsElement.open = true;
810 break;
811 }
812 }
813
814 #onToggle(event: Event): void {
815 this.#expandedSetting?.set((event.target as HTMLDetailsElement).open);
816 }
817}
818
819ComponentHelpers.CustomElements.defineComponent('devtools-request-headers', RequestHeadersComponent);
820ComponentHelpers.CustomElements.defineComponent('devtools-request-headers-category', Category);
821
822declare global {
823 // eslint-disable-next-line @typescript-eslint/no-unused-vars
824 interface HTMLElementTagNameMap {
825 'devtools-request-headers': RequestHeadersComponent;
826 'devtools-request-headers-category': Category;
827 }
828}
Wolfgang Beyer7f495ee2022-07-08 13:45:13829
Wolfgang Beyer21894d52022-07-26 12:12:44830interface BlockedDetailsDescriptor {
Wolfgang Beyer7f495ee2022-07-08 13:45:13831 explanation: () => string;
832 examples: Array<{
833 codeSnippet: string,
834 comment?: (() => string),
835 }>;
836 link: {
837 url: string,
838 }|null;
839}
840
841interface HeaderDescriptor {
842 name: string;
843 value: Object|null;
844 headerValueIncorrect?: boolean|null;
Wolfgang Beyer21894d52022-07-26 12:12:44845 blockedDetails?: BlockedDetailsDescriptor;
Wolfgang Beyer7f495ee2022-07-08 13:45:13846 headerNotSet: boolean|null;
Wolfgang Beyer21894d52022-07-26 12:12:44847 setCookieBlockedReasons?: Protocol.Network.SetCookieBlockedReason[];
Wolfgang Beyer7f495ee2022-07-08 13:45:13848}
849
850const BlockedReasonDetails = new Map<Protocol.Network.BlockedReason, HeaderDescriptor>([
851 [
852 Protocol.Network.BlockedReason.CoepFrameResourceNeedsCoepHeader,
853 {
854 name: 'cross-origin-embedder-policy',
855 value: null,
856 headerValueIncorrect: null,
Wolfgang Beyer21894d52022-07-26 12:12:44857 blockedDetails: {
Wolfgang Beyer7f495ee2022-07-08 13:45:13858 explanation: i18nLazyString(UIStrings.toEmbedThisFrameInYourDocument),
859 examples: [{codeSnippet: 'Cross-Origin-Embedder-Policy: require-corp', comment: undefined}],
860 link: {url: 'https://web.dev/coop-coep/'},
861 },
862 headerNotSet: null,
863 },
864 ],
865 [
866 Protocol.Network.BlockedReason.CorpNotSameOriginAfterDefaultedToSameOriginByCoep,
867 {
868 name: 'cross-origin-resource-policy',
869 value: null,
870 headerValueIncorrect: null,
Wolfgang Beyer21894d52022-07-26 12:12:44871 blockedDetails: {
Wolfgang Beyer7f495ee2022-07-08 13:45:13872 explanation: i18nLazyString(UIStrings.toUseThisResourceFromADifferent),
873 examples: [
874 {
875 codeSnippet: 'Cross-Origin-Resource-Policy: same-site',
876 comment: i18nLazyString(UIStrings.chooseThisOptionIfTheResourceAnd),
877 },
878 {
879 codeSnippet: 'Cross-Origin-Resource-Policy: cross-origin',
880 comment: i18nLazyString(UIStrings.onlyChooseThisOptionIfAn),
881 },
882 ],
883 link: {url: 'https://web.dev/coop-coep/'},
884 },
885 headerNotSet: null,
886 },
887 ],
888 [
889 Protocol.Network.BlockedReason.CoopSandboxedIframeCannotNavigateToCoopPage,
890 {
891 name: 'cross-origin-opener-policy',
892 value: null,
893 headerValueIncorrect: false,
Wolfgang Beyer21894d52022-07-26 12:12:44894 blockedDetails: {
Wolfgang Beyer7f495ee2022-07-08 13:45:13895 explanation: i18nLazyString(UIStrings.thisDocumentWasBlockedFrom),
896 examples: [],
897 link: {url: 'https://web.dev/coop-coep/'},
898 },
899 headerNotSet: null,
900 },
901 ],
902 [
903 Protocol.Network.BlockedReason.CorpNotSameSite,
904 {
905 name: 'cross-origin-resource-policy',
906 value: null,
907 headerValueIncorrect: true,
Wolfgang Beyer21894d52022-07-26 12:12:44908 blockedDetails: {
Wolfgang Beyer7f495ee2022-07-08 13:45:13909 explanation: i18nLazyString(UIStrings.toUseThisResourceFromADifferentSite),
910 examples: [
911 {
912 codeSnippet: 'Cross-Origin-Resource-Policy: cross-origin',
913 comment: i18nLazyString(UIStrings.onlyChooseThisOptionIfAn),
914 },
915 ],
916 link: null,
917 },
918 headerNotSet: null,
919 },
920 ],
921 [
922 Protocol.Network.BlockedReason.CorpNotSameOrigin,
923 {
924 name: 'cross-origin-resource-policy',
925 value: null,
926 headerValueIncorrect: true,
Wolfgang Beyer21894d52022-07-26 12:12:44927 blockedDetails: {
Wolfgang Beyer7f495ee2022-07-08 13:45:13928 explanation: i18nLazyString(UIStrings.toUseThisResourceFromADifferentOrigin),
929 examples: [
930 {
931 codeSnippet: 'Cross-Origin-Resource-Policy: same-site',
932 comment: i18nLazyString(UIStrings.chooseThisOptionIfTheResourceAnd),
933 },
934 {
935 codeSnippet: 'Cross-Origin-Resource-Policy: cross-origin',
936 comment: i18nLazyString(UIStrings.onlyChooseThisOptionIfAn),
937 },
938 ],
939 link: null,
940 },
941 headerNotSet: null,
942 },
943 ],
944]);