chrome-devtools-frontend 1.0.1586699 → 1.0.1587905

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/front_end/core/sdk/ScopeTreeCache.ts +4 -0
  2. package/front_end/entrypoint_template.html +5 -1
  3. package/front_end/generated/Deprecation.ts +21 -0
  4. package/front_end/generated/InspectorBackendCommands.ts +1 -1
  5. package/front_end/generated/protocol.ts +2 -0
  6. package/front_end/models/ai_assistance/AiConversation.ts +5 -1
  7. package/front_end/models/ai_assistance/agents/AiAgent.ts +16 -4
  8. package/front_end/models/ai_assistance/agents/ContextSelectionAgent.ts +7 -1
  9. package/front_end/panels/ai_assistance/AiAssistancePanel.ts +0 -2
  10. package/front_end/panels/ai_assistance/components/ChatInput.ts +36 -31
  11. package/front_end/panels/ai_assistance/components/chatInput.css +6 -9
  12. package/front_end/panels/application/ServiceWorkerCacheViews.ts +3 -6
  13. package/front_end/panels/browser_debugger/CategorizedBreakpointsSidebarPane.ts +11 -3
  14. package/front_end/panels/common/DOMLinkifier.ts +6 -1
  15. package/front_end/panels/elements/ComputedStyleWidget.ts +25 -2
  16. package/front_end/panels/elements/ElementsPanel.ts +114 -15
  17. package/front_end/panels/elements/PropertiesWidget.ts +40 -2
  18. package/front_end/panels/elements/StylesSidebarPane.ts +26 -3
  19. package/front_end/panels/network/NetworkDataGridNode.ts +4 -0
  20. package/front_end/panels/network/NetworkItemView.ts +6 -44
  21. package/front_end/panels/network/RequestHeadersView.ts +499 -0
  22. package/front_end/panels/network/components/RequestHeaderSection.ts +3 -0
  23. package/front_end/panels/network/components/components.ts +0 -2
  24. package/front_end/panels/network/network.ts +3 -0
  25. package/front_end/third_party/chromium/README.chromium +1 -1
  26. package/front_end/third_party/puppeteer/README.chromium +2 -2
  27. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/revisions.d.ts +2 -2
  28. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/revisions.js +2 -2
  29. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/util/version.d.ts +1 -1
  30. package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/util/version.js +1 -1
  31. package/front_end/third_party/puppeteer/package/lib/es5-iife/puppeteer-core-browser.js +3 -3
  32. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/revisions.d.ts +2 -2
  33. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/revisions.js +2 -2
  34. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/util/version.d.ts +1 -1
  35. package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/util/version.js +1 -1
  36. package/front_end/third_party/puppeteer/package/package.json +1 -1
  37. package/front_end/third_party/puppeteer/package/src/revisions.ts +2 -2
  38. package/front_end/third_party/puppeteer/package/src/util/version.ts +1 -1
  39. package/front_end/ui/legacy/Toolbar.ts +37 -5
  40. package/front_end/ui/legacy/UIUtils.ts +35 -5
  41. package/front_end/ui/legacy/components/utils/JSPresentationUtils.ts +113 -133
  42. package/package.json +1 -1
  43. package/front_end/panels/network/components/RequestHeadersView.ts +0 -569
@@ -0,0 +1,499 @@
1
+ // Copyright 2022 The Chromium Authors
2
+ // Use of this source code is governed by a BSD-style license that can be
3
+ // found in the LICENSE file.
4
+ import '../../ui/kit/kit.js';
5
+
6
+ import * as Common from '../../core/common/common.js';
7
+ import * as Host from '../../core/host/host.js';
8
+ import * as i18n from '../../core/i18n/i18n.js';
9
+ import * as Platform from '../../core/platform/platform.js';
10
+ import * as SDK from '../../core/sdk/sdk.js';
11
+ import * as Persistence from '../../models/persistence/persistence.js';
12
+ import * as Workspace from '../../models/workspace/workspace.js';
13
+ import * as NetworkForward from '../../panels/network/forward/forward.js';
14
+ import * as Input from '../../ui/components/input/input.js';
15
+ import * as UI from '../../ui/legacy/legacy.js';
16
+ import * as Lit from '../../ui/lit/lit.js';
17
+ import * as VisualLogging from '../../ui/visual_logging/visual_logging.js';
18
+ import * as Sources from '../sources/sources.js';
19
+
20
+ import * as NetworkComponents from './components/components.js';
21
+ import {ShowMoreDetailsWidget} from './ShowMoreDetailsWidget.js';
22
+
23
+ const {render, html} = Lit;
24
+
25
+ const UIStrings = {
26
+ /**
27
+ * @description Text in Request Headers View of the Network panel
28
+ */
29
+ fromDiskCache: '(from disk cache)',
30
+ /**
31
+ * @description Text in Request Headers View of the Network panel
32
+ */
33
+ fromMemoryCache: '(from memory cache)',
34
+ /**
35
+ * @description Text in Request Headers View of the Network panel
36
+ */
37
+ fromEarlyHints: '(from early hints)',
38
+ /**
39
+ * @description Text in Request Headers View of the Network panel
40
+ */
41
+ fromPrefetchCache: '(from prefetch cache)',
42
+ /**
43
+ * @description Text in Request Headers View of the Network panel
44
+ */
45
+ fromServiceWorker: '(from `service worker`)',
46
+ /**
47
+ * @description Text in Request Headers View of the Network panel
48
+ */
49
+ fromSignedexchange: '(from signed-exchange)',
50
+ /**
51
+ * @description Section header for a list of the main aspects of a http request
52
+ */
53
+ general: 'General',
54
+ /**
55
+ * @description Label for a checkbox to switch between raw and parsed headers
56
+ */
57
+ raw: 'Raw',
58
+ /**
59
+ * @description Text in Request Headers View of the Network panel
60
+ */
61
+ referrerPolicy: 'Referrer Policy',
62
+ /**
63
+ * @description Text in Network Log View Columns of the Network panel
64
+ */
65
+ remoteAddress: 'Remote Address',
66
+ /**
67
+ * @description Text in Request Headers View of the Network panel
68
+ */
69
+ requestHeaders: 'Request Headers',
70
+ /**
71
+ * @description The HTTP method of a request
72
+ */
73
+ requestMethod: 'Request Method',
74
+ /**
75
+ * @description The URL of a request
76
+ */
77
+ requestUrl: 'Request URL',
78
+ /**
79
+ * @description A context menu item in the Network Log View Columns of the Network panel
80
+ */
81
+ responseHeaders: 'Response headers',
82
+ /**
83
+ * @description A context menu item in the Network Log View Columns of the Network panel
84
+ */
85
+ earlyHintsHeaders: 'Early hints headers',
86
+ /**
87
+ * @description Title text for a link to the Sources panel to the file containing the header override definitions
88
+ */
89
+ revealHeaderOverrides: 'Reveal header override definitions',
90
+ /**
91
+ * @description HTTP response code
92
+ */
93
+ statusCode: 'Status Code',
94
+ } as const;
95
+ const str_ = i18n.i18n.registerUIStrings('panels/network/RequestHeadersView.ts', UIStrings);
96
+ const i18nString = i18n.i18n.getLocalizedString.bind(undefined, str_);
97
+
98
+ interface ViewInput {
99
+ showRequestHeadersText: boolean;
100
+ showResponseHeadersText: boolean;
101
+ request: SDK.NetworkRequest.NetworkRequest;
102
+ toggleShowRawResponseHeaders: () => void;
103
+ toggleShowRawRequestHeaders: () => void;
104
+ revealHeadersFile?: () => void;
105
+ toReveal?: {section: NetworkForward.UIRequestLocation.UIHeaderSection, header?: string};
106
+ }
107
+ type View = (input: ViewInput, output: object, target: HTMLElement) => void;
108
+ export const DEFAULT_VIEW: View = (input, output, target) => {
109
+ render(
110
+ html`
111
+ <style>${NetworkComponents.RequestHeaderSection.requestHeadersViewStyles}</style>
112
+ <style>${Input.checkboxStyles}</style>
113
+ ${renderGeneralSection(input)}
114
+ ${renderEarlyHintsHeaders(input)}
115
+ ${renderResponseHeaders(input)}
116
+ ${renderRequestHeaders(input)}
117
+ `,
118
+ target);
119
+ };
120
+
121
+ export class RequestHeadersView extends UI.Widget.Widget {
122
+ #request?: SDK.NetworkRequest.NetworkRequest;
123
+ #showResponseHeadersText = false;
124
+ #showRequestHeadersText = false;
125
+ #toReveal?: {section: NetworkForward.UIRequestLocation.UIHeaderSection, header?: string} = undefined;
126
+ readonly #workspace = Workspace.Workspace.WorkspaceImpl.instance();
127
+ #view: View;
128
+ get request(): SDK.NetworkRequest.NetworkRequest|undefined {
129
+ return this.#request;
130
+ }
131
+
132
+ set request(val) {
133
+ this.#removeEventListeners();
134
+ this.#request = val;
135
+ this.#addEventListeners();
136
+ }
137
+
138
+ constructor(target?: HTMLElement, view = DEFAULT_VIEW) {
139
+ super({jslog: `${VisualLogging.pane('headers').track({resize: true})}`});
140
+ this.#view = view;
141
+ }
142
+
143
+ #addEventListeners(): void {
144
+ this.#request?.addEventListener(SDK.NetworkRequest.Events.REMOTE_ADDRESS_CHANGED, this.#refreshHeadersView, this);
145
+ this.#request?.addEventListener(SDK.NetworkRequest.Events.FINISHED_LOADING, this.#refreshHeadersView, this);
146
+ this.#request?.addEventListener(SDK.NetworkRequest.Events.REQUEST_HEADERS_CHANGED, this.#refreshHeadersView, this);
147
+ this.#request?.addEventListener(
148
+ SDK.NetworkRequest.Events.RESPONSE_HEADERS_CHANGED, this.#resetAndRefreshHeadersView, this);
149
+ this.#workspace.addEventListener(
150
+ Workspace.Workspace.Events.UISourceCodeAdded, this.#uiSourceCodeAddedOrRemoved, this);
151
+ this.#workspace.addEventListener(
152
+ Workspace.Workspace.Events.UISourceCodeRemoved, this.#uiSourceCodeAddedOrRemoved, this);
153
+ Common.Settings.Settings.instance()
154
+ .moduleSetting('persistence-network-overrides-enabled')
155
+ .addChangeListener(this.requestUpdate, this);
156
+ }
157
+
158
+ override wasShown(): void {
159
+ super.wasShown();
160
+ this.#addEventListeners();
161
+ this.#toReveal = undefined;
162
+ this.#refreshHeadersView();
163
+ }
164
+
165
+ override willHide(): void {
166
+ super.willHide();
167
+ this.#removeEventListeners();
168
+ }
169
+
170
+ #removeEventListeners(): void {
171
+ this.#request?.removeEventListener(
172
+ SDK.NetworkRequest.Events.REMOTE_ADDRESS_CHANGED, this.#refreshHeadersView, this);
173
+ this.#request?.removeEventListener(SDK.NetworkRequest.Events.FINISHED_LOADING, this.#refreshHeadersView, this);
174
+ this.#request?.removeEventListener(
175
+ SDK.NetworkRequest.Events.REQUEST_HEADERS_CHANGED, this.#refreshHeadersView, this);
176
+ this.#request?.removeEventListener(
177
+ SDK.NetworkRequest.Events.RESPONSE_HEADERS_CHANGED, this.#resetAndRefreshHeadersView, this);
178
+ this.#workspace.removeEventListener(
179
+ Workspace.Workspace.Events.UISourceCodeAdded, this.#uiSourceCodeAddedOrRemoved, this);
180
+ this.#workspace.removeEventListener(
181
+ Workspace.Workspace.Events.UISourceCodeRemoved, this.#uiSourceCodeAddedOrRemoved, this);
182
+ Common.Settings.Settings.instance()
183
+ .moduleSetting('persistence-network-overrides-enabled')
184
+ .removeChangeListener(this.requestUpdate, this);
185
+ }
186
+
187
+ #resetAndRefreshHeadersView(): void {
188
+ this.#request?.deleteAssociatedData(NetworkComponents.ResponseHeaderSection.RESPONSE_HEADER_SECTION_DATA_KEY);
189
+ this.requestUpdate();
190
+ }
191
+
192
+ #refreshHeadersView(): void {
193
+ this.requestUpdate();
194
+ }
195
+
196
+ revealHeader(section: NetworkForward.UIRequestLocation.UIHeaderSection, header?: string): void {
197
+ this.#toReveal = {section, header};
198
+ this.requestUpdate();
199
+ }
200
+
201
+ #uiSourceCodeAddedOrRemoved(event: Common.EventTarget.EventTargetEvent<Workspace.UISourceCode.UISourceCode>): void {
202
+ if (this.#getHeaderOverridesFileUrl() === event.data.url()) {
203
+ this.requestUpdate();
204
+ }
205
+ }
206
+
207
+ override performUpdate(): void {
208
+ if (!this.#request) {
209
+ return;
210
+ }
211
+
212
+ let revealHeadersFile;
213
+ const uiSourceCode = this.#workspace.uiSourceCodeForURL(this.#getHeaderOverridesFileUrl());
214
+ if (uiSourceCode) {
215
+ revealHeadersFile = (): void => {
216
+ Sources.SourcesPanel.SourcesPanel.instance().showUISourceCode(uiSourceCode);
217
+ void Sources.SourcesPanel.SourcesPanel.instance().revealInNavigator(uiSourceCode);
218
+ };
219
+ }
220
+ const input: ViewInput = {
221
+ toggleShowRawResponseHeaders: (): void => {
222
+ this.#showResponseHeadersText = !this.#showResponseHeadersText;
223
+ this.requestUpdate();
224
+ },
225
+ toggleShowRawRequestHeaders: (): void => {
226
+ this.#showRequestHeadersText = !this.#showRequestHeadersText;
227
+ this.requestUpdate();
228
+ },
229
+ revealHeadersFile,
230
+ request: this.#request,
231
+ toReveal: this.#toReveal,
232
+ showResponseHeadersText: this.#showResponseHeadersText,
233
+ showRequestHeadersText: this.#showRequestHeadersText,
234
+ };
235
+
236
+ this.#view(input, {}, this.contentElement);
237
+ }
238
+
239
+ #getHeaderOverridesFileUrl(): Platform.DevToolsPath.UrlString {
240
+ if (!this.#request) {
241
+ return Platform.DevToolsPath.EmptyUrlString;
242
+ }
243
+ const fileUrl = Persistence.NetworkPersistenceManager.NetworkPersistenceManager.instance().fileUrlFromNetworkUrl(
244
+ this.#request.url(), /* ignoreInactive */ true);
245
+ return fileUrl.substring(0, fileUrl.lastIndexOf('/')) + '/' +
246
+ Persistence.NetworkPersistenceManager.HEADERS_FILENAME as Platform.DevToolsPath.UrlString;
247
+ }
248
+ }
249
+
250
+ function renderEarlyHintsHeaders(input: ViewInput): Lit.LitTemplate {
251
+ if (!input.request?.earlyHintsHeaders || input.request.earlyHintsHeaders.length === 0) {
252
+ return Lit.nothing;
253
+ }
254
+
255
+ // Disabled until https://crbug.com/1079231 is fixed.
256
+ return renderCategory({
257
+ onToggleRawHeaders: input.toggleShowRawResponseHeaders,
258
+ name: 'early-hints-headers',
259
+ title: i18nString(UIStrings.earlyHintsHeaders),
260
+ headerCount: input.request.earlyHintsHeaders.length,
261
+ checked: undefined,
262
+ additionalContent: undefined,
263
+ forceOpen: input.toReveal?.section === NetworkForward.UIRequestLocation.UIHeaderSection.EARLY_HINTS,
264
+ loggingContext: 'early-hints-headers',
265
+ contents: input.showResponseHeadersText ? renderRawHeaders(input.request.responseHeadersText) : html`
266
+ <devtools-early-hints-header-section .data=${{
267
+ request: input.request,
268
+ toReveal: input.toReveal,
269
+ } as NetworkComponents.ResponseHeaderSection.ResponseHeaderSectionData}></devtools-early-hints-header-section>
270
+ `
271
+ });
272
+ }
273
+
274
+ function renderResponseHeaders(input: ViewInput): Lit.LitTemplate {
275
+ return renderCategory({
276
+ onToggleRawHeaders: input.toggleShowRawResponseHeaders,
277
+ name: 'response-headers',
278
+ title: i18nString(UIStrings.responseHeaders),
279
+ headerCount: input.request.sortedResponseHeaders.length,
280
+ checked: input.request.responseHeadersText ? input.showResponseHeadersText : undefined,
281
+ additionalContent: renderHeaderOverridesLink(input),
282
+ forceOpen: input.toReveal?.section === NetworkForward.UIRequestLocation.UIHeaderSection.RESPONSE,
283
+ loggingContext: 'response-headers',
284
+ contents: input.showResponseHeadersText ?
285
+ renderRawHeaders(input.request.responseHeadersText) :
286
+ html`
287
+ <devtools-response-header-section .data=${{
288
+ request: input.request,
289
+ toReveal: input.toReveal,
290
+ } as NetworkComponents.ResponseHeaderSection.ResponseHeaderSectionData} jslog=${
291
+ VisualLogging.section('response-headers')}></devtools-response-header-section>
292
+ `
293
+ });
294
+ }
295
+
296
+ function renderHeaderOverridesLink(input: ViewInput): Lit.LitTemplate {
297
+ if (!input.revealHeadersFile) {
298
+ return Lit.nothing;
299
+ }
300
+
301
+ const revealHeadersFile = (event: Event): void => {
302
+ event.preventDefault();
303
+ input.revealHeadersFile?.();
304
+ };
305
+ const overridesSetting: Common.Settings.Setting<boolean> =
306
+ Common.Settings.Settings.instance().moduleSetting('persistence-network-overrides-enabled');
307
+ // Disabled until https://crbug.com/1079231 is fixed.
308
+ // clang-format off
309
+ const fileIcon = html`
310
+ <devtools-icon name="document" class=${'medium' + overridesSetting.get() ? 'inline-icon dot purple': 'inline-icon'}>
311
+ </devtools-icon>`;
312
+ // clang-format on
313
+
314
+ // Disabled until https://crbug.com/1079231 is fixed.
315
+ // clang-format off
316
+ return html`
317
+ <devtools-link
318
+ href="https://goo.gle/devtools-override"
319
+ class="link devtools-link"
320
+ jslogcontext="devtools-override"
321
+ >
322
+ <devtools-icon name="help" class="inline-icon medium">
323
+ </devtools-icon>
324
+ </devtools-link>
325
+ <devtools-link
326
+ @click=${revealHeadersFile}
327
+ class="link devtools-link"
328
+ title=${UIStrings.revealHeaderOverrides}
329
+ jslogcontext="reveal-header-overrides"
330
+ >
331
+ ${fileIcon}${Persistence.NetworkPersistenceManager.HEADERS_FILENAME}
332
+ </devtools-link>
333
+ `;
334
+ // clang-format on
335
+ }
336
+
337
+ function renderRequestHeaders(input: ViewInput): Lit.LitTemplate {
338
+ const requestHeadersText = input.request.requestHeadersText();
339
+
340
+ return renderCategory({
341
+ onToggleRawHeaders: input.toggleShowRawRequestHeaders,
342
+ name: 'request-headers',
343
+ title: i18nString(UIStrings.requestHeaders),
344
+ headerCount: input.request.requestHeaders().length,
345
+ checked: requestHeadersText ? input.showRequestHeadersText : undefined,
346
+ forceOpen: input.toReveal?.section === NetworkForward.UIRequestLocation.UIHeaderSection.REQUEST,
347
+ loggingContext: 'request-headers',
348
+ contents: (input.showRequestHeadersText && requestHeadersText) ?
349
+ renderRawHeaders(requestHeadersText) :
350
+ html`
351
+ <devtools-widget .widgetConfig=${
352
+ UI.Widget.widgetConfig(NetworkComponents.RequestHeaderSection.RequestHeaderSection, {
353
+ request: input.request,
354
+ toReveal: input.toReveal,
355
+ })} jslog=${VisualLogging.section('request-headers')}></devtools-widget>`
356
+ });
357
+ }
358
+
359
+ function renderRawHeaders(text: string): Lit.TemplateResult {
360
+ return html`<div class="row raw-headers-row"><devtools-widget class=raw-headers .widgetConfig=${
361
+ UI.Widget.widgetConfig(ShowMoreDetailsWidget, {text})}></devtools-widget></div>`;
362
+ }
363
+
364
+ function renderGeneralSection(input: ViewInput): Lit.LitTemplate {
365
+ const statusClasses = ['status'];
366
+ if (input.request.statusCode < 300 || input.request.statusCode === 304) {
367
+ statusClasses.push('green-circle');
368
+ } else if (input.request.statusCode < 400) {
369
+ statusClasses.push('yellow-circle');
370
+ } else {
371
+ statusClasses.push('red-circle');
372
+ }
373
+
374
+ let comment = '';
375
+ if (input.request.cachedInMemory()) {
376
+ comment = i18nString(UIStrings.fromMemoryCache);
377
+ } else if (input.request.fromEarlyHints()) {
378
+ comment = i18nString(UIStrings.fromEarlyHints);
379
+ } else if (input.request.fetchedViaServiceWorker) {
380
+ comment = i18nString(UIStrings.fromServiceWorker);
381
+ } else if (input.request.redirectSourceSignedExchangeInfoHasNoErrors()) {
382
+ comment = i18nString(UIStrings.fromSignedexchange);
383
+ } else if (input.request.fromPrefetchCache()) {
384
+ comment = i18nString(UIStrings.fromPrefetchCache);
385
+ } else if (input.request.cached()) {
386
+ comment = i18nString(UIStrings.fromDiskCache);
387
+ }
388
+
389
+ if (comment) {
390
+ statusClasses.push('status-with-comment');
391
+ }
392
+
393
+ const statusText = [input.request.statusCode, input.request.getInferredStatusText(), comment].join(' ');
394
+
395
+ return renderCategory({
396
+ name: 'general',
397
+ title: i18nString(UIStrings.general),
398
+ forceOpen: input.toReveal?.section === NetworkForward.UIRequestLocation.UIHeaderSection.GENERAL,
399
+ loggingContext: 'general',
400
+ // clang-format off
401
+ contents: html`<div jslog=${VisualLogging.section('general')}>
402
+ ${renderGeneralRow(i18nString(UIStrings.requestUrl), input.request.url(), 'request-url')}
403
+ ${input.request.statusCode? renderGeneralRow(i18nString(UIStrings.requestMethod),
404
+ input.request.requestMethod, 'request-method') : Lit.nothing}
405
+ ${input.request.statusCode? renderGeneralRow(i18nString(UIStrings.statusCode),
406
+ statusText, 'status-code', statusClasses) : Lit.nothing}
407
+ ${input.request.remoteAddress()? renderGeneralRow(i18nString(UIStrings.remoteAddress),
408
+ input.request.remoteAddress(), 'remote-address') : Lit.nothing}
409
+ ${input.request.referrerPolicy()? renderGeneralRow(i18nString(UIStrings.referrerPolicy),
410
+ String(input.request.referrerPolicy()), 'referrer-policy') : Lit.nothing}
411
+ </div>`});
412
+ // clang-format on
413
+
414
+ function renderGeneralRow(
415
+ name: Common.UIString.LocalizedString, value: string, id: string, classNames?: string[]): Lit.LitTemplate {
416
+ const isHighlighted = input.toReveal?.section === NetworkForward.UIRequestLocation.UIHeaderSection.GENERAL &&
417
+ name.toLowerCase() === input.toReveal?.header?.toLowerCase();
418
+ return html`
419
+ <div class="row ${isHighlighted ? 'header-highlight' : ''}">
420
+ <div class="header-name">${name}</div>
421
+ <div
422
+ id=${id}
423
+ class="header-value ${classNames?.join(' ')}"
424
+ @copy=${() => Host.userMetrics.actionTaken(Host.UserMetrics.Action.NetworkPanelCopyValue)}
425
+ >${value}</div>
426
+ </div>
427
+ `;
428
+ }
429
+ }
430
+
431
+ export function renderCategory(data: {
432
+ name: string,
433
+ title: Common.UIString.LocalizedString,
434
+ contents: Lit.LitTemplate,
435
+ loggingContext: string,
436
+ headerCount?: number,
437
+ checked?: boolean,
438
+ additionalContent?: Lit.LitTemplate,
439
+ forceOpen?: boolean,
440
+ onToggleRawHeaders?: () => void,
441
+ }): Lit.LitTemplate {
442
+ const expandedSetting =
443
+ Common.Settings.Settings.instance().createSetting('request-info-' + data.name + '-category-expanded', true);
444
+
445
+ const isOpen = (expandedSetting ? expandedSetting.get() : true) || data.forceOpen;
446
+ // Disabled until https://crbug.com/1079231 is fixed.
447
+ // clang-format off
448
+ return html`
449
+ <details ?open=${isOpen} @toggle=${onToggle} aria-label=${data.title}>
450
+ <summary
451
+ class="header"
452
+ @keydown=${onSummaryKeyDown}
453
+ jslog=${VisualLogging.sectionHeader().track({click: true}).context(data.loggingContext)}
454
+ >
455
+ <div class="header-grid-container">
456
+ <div>
457
+ ${data.title}${data.headerCount !== undefined ?
458
+ html`<span class="header-count"> (${data.headerCount})</span>` :
459
+ Lit.nothing
460
+ }
461
+ </div>
462
+ <div class="hide-when-closed">
463
+ ${data.checked !== undefined ? html`
464
+ <devtools-checkbox .checked=${data.checked} @change=${data.onToggleRawHeaders}
465
+ jslog=${VisualLogging.toggle('raw-headers').track({change: true})}>
466
+ ${i18nString(UIStrings.raw)}
467
+ </devtools-checkbox>` : Lit.nothing}
468
+ </div>
469
+ <div class="hide-when-closed">${data.additionalContent}</div>
470
+ </div>
471
+ </summary>
472
+ ${data.contents}
473
+ </details>
474
+ `;
475
+ // clang-format on
476
+
477
+ function onSummaryKeyDown(event: KeyboardEvent): void {
478
+ if (!event.target) {
479
+ return;
480
+ }
481
+ const summaryElement = event.target as HTMLElement;
482
+ const detailsElement = summaryElement.parentElement as HTMLDetailsElement;
483
+ if (!detailsElement) {
484
+ throw new Error('<details> element is not found for a <summary> element');
485
+ }
486
+ switch (event.key) {
487
+ case 'ArrowLeft':
488
+ detailsElement.open = false;
489
+ break;
490
+ case 'ArrowRight':
491
+ detailsElement.open = true;
492
+ break;
493
+ }
494
+ }
495
+
496
+ function onToggle(event: Event): void {
497
+ expandedSetting?.set((event.target as HTMLDetailsElement).open);
498
+ }
499
+ }
@@ -14,6 +14,9 @@ import * as NetworkForward from '../forward/forward.js';
14
14
 
15
15
  import {EditingAllowedStatus, type HeaderDescriptor} from './HeaderSectionRow.js';
16
16
  import requestHeaderSectionStyles from './RequestHeaderSection.css.js';
17
+ import requestHeadersViewStyles from './RequestHeadersView.css.js';
18
+
19
+ export {requestHeadersViewStyles};
17
20
 
18
21
  const {render, html} = Lit;
19
22
 
@@ -6,7 +6,6 @@ import * as DirectSocketConnectionView from './DirectSocketConnectionView.js';
6
6
  import * as EditableSpan from './EditableSpan.js';
7
7
  import * as HeaderSectionRow from './HeaderSectionRow.js';
8
8
  import * as RequestHeaderSection from './RequestHeaderSection.js';
9
- import * as RequestHeadersView from './RequestHeadersView.js';
10
9
  import * as RequestTrustTokensView from './RequestTrustTokensView.js';
11
10
  import * as ResponseHeaderSection from './ResponseHeaderSection.js';
12
11
 
@@ -15,7 +14,6 @@ export {
15
14
  EditableSpan,
16
15
  HeaderSectionRow,
17
16
  RequestHeaderSection,
18
- RequestHeadersView,
19
17
  RequestTrustTokensView,
20
18
  ResponseHeaderSection,
21
19
  };
@@ -18,6 +18,7 @@ import './NetworkSearchScope.js';
18
18
  import './NetworkWaterfallColumn.js';
19
19
  import './RequestCookiesView.js';
20
20
  import './RequestHTMLView.js';
21
+ import './RequestHeadersView.js';
21
22
  import './RequestInitiatorView.js';
22
23
  import './RequestResponseView.js';
23
24
  import './RequestPreviewView.js';
@@ -44,6 +45,7 @@ import * as NetworkWaterfallColumn from './NetworkWaterfallColumn.js';
44
45
  import * as RequestConditionsDrawer from './RequestConditionsDrawer.js';
45
46
  import * as RequestCookiesView from './RequestCookiesView.js';
46
47
  import * as RequestDeviceBoundSessionsView from './RequestDeviceBoundSessionsView.js';
48
+ import * as RequestHeadersView from './RequestHeadersView.js';
47
49
  import * as RequestHTMLView from './RequestHTMLView.js';
48
50
  import * as RequestInitiatorView from './RequestInitiatorView.js';
49
51
  import * as RequestPayloadView from './RequestPayloadView.js';
@@ -72,6 +74,7 @@ export {
72
74
  RequestConditionsDrawer,
73
75
  RequestCookiesView,
74
76
  RequestDeviceBoundSessionsView,
77
+ RequestHeadersView,
75
78
  RequestHTMLView,
76
79
  RequestInitiatorView,
77
80
  RequestPayloadView,
@@ -1,7 +1,7 @@
1
1
  Name: Dependencies sourced from the upstream `chromium` repository
2
2
  URL: https://chromium.googlesource.com/chromium/src
3
3
  Version: N/A
4
- Revision: 649f914735bb39cbd9bfe68673921ced1cc2e71f
4
+ Revision: e991bb058bdc3021ea1576fee0a80a7ecd0ef566
5
5
  Update Mechanism: Manual (https://crbug.com/428069060)
6
6
  License: BSD-3-Clause
7
7
  License File: LICENSE
@@ -1,10 +1,10 @@
1
1
  Name: Puppeteer Core
2
2
  Short Name: Puppeteer Core
3
3
  URL: https://github.com/puppeteer/puppeteer/tree/main/packages/puppeteer-core
4
- Version: 24.37.4
4
+ Version: 24.37.5
5
5
  License: Apache-2.0
6
6
  License File: LICENSE
7
- Revision: c771d9cc0c6c3611532e18d89291c2d734f736ab
7
+ Revision: fcb37e3b3a4f6b55b6f81a40811243260bcea16f
8
8
  Security Critical: no
9
9
  Shipped: yes
10
10
  Update Mechanism: Autoroll
@@ -7,8 +7,8 @@
7
7
  * @internal
8
8
  */
9
9
  export declare const PUPPETEER_REVISIONS: Readonly<{
10
- chrome: "145.0.7632.76";
11
- 'chrome-headless-shell': "145.0.7632.76";
10
+ chrome: "145.0.7632.77";
11
+ 'chrome-headless-shell': "145.0.7632.77";
12
12
  firefox: "stable_147.0.4";
13
13
  }>;
14
14
  //# sourceMappingURL=revisions.d.ts.map
@@ -10,8 +10,8 @@ exports.PUPPETEER_REVISIONS = void 0;
10
10
  * @internal
11
11
  */
12
12
  exports.PUPPETEER_REVISIONS = Object.freeze({
13
- chrome: '145.0.7632.76',
14
- 'chrome-headless-shell': '145.0.7632.76',
13
+ chrome: '145.0.7632.77',
14
+ 'chrome-headless-shell': '145.0.7632.77',
15
15
  firefox: 'stable_147.0.4',
16
16
  });
17
17
  //# sourceMappingURL=revisions.js.map
@@ -3,5 +3,5 @@
3
3
  * Copyright 2025 Google Inc.
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
- export declare const packageVersion = "24.37.4";
6
+ export declare const packageVersion = "24.37.5";
7
7
  //# sourceMappingURL=version.d.ts.map
@@ -8,6 +8,6 @@ Object.defineProperty(exports, "__esModule", { value: true });
8
8
  exports.packageVersion = void 0;
9
9
  // If moved update release-please config
10
10
  // x-release-please-start-version
11
- exports.packageVersion = '24.37.4';
11
+ exports.packageVersion = '24.37.5';
12
12
  // x-release-please-end
13
13
  //# sourceMappingURL=version.js.map
@@ -3050,7 +3050,7 @@ var Puppeteer = function (exports, _PuppeteerURL, _LazyArg, _ARIAQueryHandler, _
3050
3050
  */
3051
3051
  // If moved update release-please config
3052
3052
  // x-release-please-start-version
3053
- const packageVersion = '24.37.4';
3053
+ const packageVersion = '24.37.5';
3054
3054
  // x-release-please-end
3055
3055
 
3056
3056
  /**
@@ -25247,8 +25247,8 @@ var Puppeteer = function (exports, _PuppeteerURL, _LazyArg, _ARIAQueryHandler, _
25247
25247
  * @internal
25248
25248
  */
25249
25249
  const PUPPETEER_REVISIONS = Object.freeze({
25250
- chrome: '145.0.7632.76',
25251
- 'chrome-headless-shell': '145.0.7632.76',
25250
+ chrome: '145.0.7632.77',
25251
+ 'chrome-headless-shell': '145.0.7632.77',
25252
25252
  firefox: 'stable_147.0.4'
25253
25253
  });
25254
25254
 
@@ -7,8 +7,8 @@
7
7
  * @internal
8
8
  */
9
9
  export declare const PUPPETEER_REVISIONS: Readonly<{
10
- chrome: "145.0.7632.76";
11
- 'chrome-headless-shell': "145.0.7632.76";
10
+ chrome: "145.0.7632.77";
11
+ 'chrome-headless-shell': "145.0.7632.77";
12
12
  firefox: "stable_147.0.4";
13
13
  }>;
14
14
  //# sourceMappingURL=revisions.d.ts.map
@@ -7,8 +7,8 @@
7
7
  * @internal
8
8
  */
9
9
  export const PUPPETEER_REVISIONS = Object.freeze({
10
- chrome: '145.0.7632.76',
11
- 'chrome-headless-shell': '145.0.7632.76',
10
+ chrome: '145.0.7632.77',
11
+ 'chrome-headless-shell': '145.0.7632.77',
12
12
  firefox: 'stable_147.0.4',
13
13
  });
14
14
  //# sourceMappingURL=revisions.js.map
@@ -3,5 +3,5 @@
3
3
  * Copyright 2025 Google Inc.
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
- export declare const packageVersion = "24.37.4";
6
+ export declare const packageVersion = "24.37.5";
7
7
  //# sourceMappingURL=version.d.ts.map
@@ -5,6 +5,6 @@
5
5
  */
6
6
  // If moved update release-please config
7
7
  // x-release-please-start-version
8
- export const packageVersion = '24.37.4';
8
+ export const packageVersion = '24.37.5';
9
9
  // x-release-please-end
10
10
  //# sourceMappingURL=version.js.map