chrome-devtools-frontend 1.0.1587572 → 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.
@@ -1,7 +1,6 @@
1
1
  // Copyright 2022 The Chromium Authors
2
2
  // Use of this source code is governed by a BSD-style license that can be
3
3
  // found in the LICENSE file.
4
- /* eslint-disable @devtools/no-lit-render-outside-of-view */
5
4
  import '../../ui/kit/kit.js';
6
5
 
7
6
  import * as Common from '../../core/common/common.js';
@@ -12,18 +11,15 @@ import * as SDK from '../../core/sdk/sdk.js';
12
11
  import * as Persistence from '../../models/persistence/persistence.js';
13
12
  import * as Workspace from '../../models/workspace/workspace.js';
14
13
  import * as NetworkForward from '../../panels/network/forward/forward.js';
15
- import * as Buttons from '../../ui/components/buttons/buttons.js';
16
14
  import * as Input from '../../ui/components/input/input.js';
17
- import * as LegacyWrapper from '../../ui/components/legacy_wrapper/legacy_wrapper.js';
18
- import * as RenderCoordinator from '../../ui/components/render_coordinator/render_coordinator.js';
19
15
  import * as UI from '../../ui/legacy/legacy.js';
20
16
  import * as Lit from '../../ui/lit/lit.js';
21
17
  import * as VisualLogging from '../../ui/visual_logging/visual_logging.js';
22
18
  import * as Sources from '../sources/sources.js';
23
19
 
24
20
  import * as NetworkComponents from './components/components.js';
21
+ import {ShowMoreDetailsWidget} from './ShowMoreDetailsWidget.js';
25
22
 
26
- const RAW_HEADER_CUTOFF = 3000;
27
23
  const {render, html} = Lit;
28
24
 
29
25
  const UIStrings = {
@@ -91,10 +87,6 @@ const UIStrings = {
91
87
  * @description Title text for a link to the Sources panel to the file containing the header override definitions
92
88
  */
93
89
  revealHeaderOverrides: 'Reveal header override definitions',
94
- /**
95
- * @description Text to show more content
96
- */
97
- showMore: 'Show more',
98
90
  /**
99
91
  * @description HTTP response code
100
92
  */
@@ -103,189 +95,224 @@ const UIStrings = {
103
95
  const str_ = i18n.i18n.registerUIStrings('panels/network/RequestHeadersView.ts', UIStrings);
104
96
  const i18nString = i18n.i18n.getLocalizedString.bind(undefined, str_);
105
97
 
106
- export class RequestHeadersView extends LegacyWrapper.LegacyWrapper.WrappableComponent {
107
- #request: Readonly<SDK.NetworkRequest.NetworkRequest>;
108
- readonly #shadow = this.attachShadow({mode: 'open'});
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;
109
123
  #showResponseHeadersText = false;
110
124
  #showRequestHeadersText = false;
111
- #showResponseHeadersTextFull = false;
112
- #showRequestHeadersTextFull = false;
113
125
  #toReveal?: {section: NetworkForward.UIRequestLocation.UIHeaderSection, header?: string} = undefined;
114
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
+ }
115
137
 
116
- constructor(request: SDK.NetworkRequest.NetworkRequest) {
117
- super();
118
- this.#request = request;
119
- this.setAttribute('jslog', `${VisualLogging.pane('headers').track({resize: true})}`);
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);
120
156
  }
121
157
 
122
158
  override wasShown(): void {
123
159
  super.wasShown();
124
- this.#request.addEventListener(SDK.NetworkRequest.Events.REMOTE_ADDRESS_CHANGED, this.#refreshHeadersView, this);
125
- this.#request.addEventListener(SDK.NetworkRequest.Events.FINISHED_LOADING, this.#refreshHeadersView, this);
126
- this.#request.addEventListener(SDK.NetworkRequest.Events.REQUEST_HEADERS_CHANGED, this.#refreshHeadersView, this);
127
- this.#request.addEventListener(
128
- SDK.NetworkRequest.Events.RESPONSE_HEADERS_CHANGED, this.#resetAndRefreshHeadersView, this);
160
+ this.#addEventListeners();
129
161
  this.#toReveal = undefined;
130
162
  this.#refreshHeadersView();
131
163
  }
132
164
 
133
165
  override willHide(): void {
134
166
  super.willHide();
135
- this.#request.removeEventListener(SDK.NetworkRequest.Events.REMOTE_ADDRESS_CHANGED, this.#refreshHeadersView, this);
136
- this.#request.removeEventListener(SDK.NetworkRequest.Events.FINISHED_LOADING, this.#refreshHeadersView, this);
137
- this.#request.removeEventListener(
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(
138
175
  SDK.NetworkRequest.Events.REQUEST_HEADERS_CHANGED, this.#refreshHeadersView, this);
139
- this.#request.removeEventListener(
176
+ this.#request?.removeEventListener(
140
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);
141
185
  }
142
186
 
143
187
  #resetAndRefreshHeadersView(): void {
144
- this.#request.deleteAssociatedData(NetworkComponents.ResponseHeaderSection.RESPONSE_HEADER_SECTION_DATA_KEY);
145
- void this.render();
188
+ this.#request?.deleteAssociatedData(NetworkComponents.ResponseHeaderSection.RESPONSE_HEADER_SECTION_DATA_KEY);
189
+ this.requestUpdate();
146
190
  }
147
191
 
148
192
  #refreshHeadersView(): void {
149
- void this.render();
193
+ this.requestUpdate();
150
194
  }
151
195
 
152
196
  revealHeader(section: NetworkForward.UIRequestLocation.UIHeaderSection, header?: string): void {
153
197
  this.#toReveal = {section, header};
154
- void this.render();
155
- }
156
-
157
- connectedCallback(): void {
158
- this.#workspace.addEventListener(
159
- Workspace.Workspace.Events.UISourceCodeAdded, this.#uiSourceCodeAddedOrRemoved, this);
160
- this.#workspace.addEventListener(
161
- Workspace.Workspace.Events.UISourceCodeRemoved, this.#uiSourceCodeAddedOrRemoved, this);
162
- Common.Settings.Settings.instance()
163
- .moduleSetting('persistence-network-overrides-enabled')
164
- .addChangeListener(this.render, this);
165
- }
166
-
167
- disconnectedCallback(): void {
168
- this.#workspace.removeEventListener(
169
- Workspace.Workspace.Events.UISourceCodeAdded, this.#uiSourceCodeAddedOrRemoved, this);
170
- this.#workspace.removeEventListener(
171
- Workspace.Workspace.Events.UISourceCodeRemoved, this.#uiSourceCodeAddedOrRemoved, this);
172
- Common.Settings.Settings.instance()
173
- .moduleSetting('persistence-network-overrides-enabled')
174
- .removeChangeListener(this.render, this);
198
+ this.requestUpdate();
175
199
  }
176
200
 
177
201
  #uiSourceCodeAddedOrRemoved(event: Common.EventTarget.EventTargetEvent<Workspace.UISourceCode.UISourceCode>): void {
178
202
  if (this.#getHeaderOverridesFileUrl() === event.data.url()) {
179
- void this.render();
203
+ this.requestUpdate();
180
204
  }
181
205
  }
182
206
 
183
- override async render(): Promise<void> {
207
+ override performUpdate(): void {
184
208
  if (!this.#request) {
185
209
  return;
186
210
  }
187
211
 
188
- return await RenderCoordinator.write(() => {
189
- // Disabled until https://crbug.com/1079231 is fixed.
190
- // clang-format off
191
- render(html`
192
- <style>${NetworkComponents.RequestHeaderSection.requestHeadersViewStyles}</style>
193
- <style>${Input.checkboxStyles}</style>
194
- ${this.#renderGeneralSection()}
195
- ${this.#renderEarlyHintsHeaders()}
196
- ${this.#renderResponseHeaders()}
197
- ${this.#renderRequestHeaders()}
198
- `, this.#shadow, {host: this});
199
-
200
- // clang-format on
201
- });
202
- }
203
-
204
- #renderEarlyHintsHeaders(): Lit.LitTemplate {
205
- if (!this.#request || !this.#request.earlyHintsHeaders || this.#request.earlyHintsHeaders.length === 0) {
206
- return Lit.nothing;
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
+ };
207
219
  }
208
-
209
- const toggleShowRaw = (): void => {
210
- this.#showResponseHeadersText = !this.#showResponseHeadersText;
211
- void this.render();
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,
212
234
  };
213
235
 
214
- // Disabled until https://crbug.com/1079231 is fixed.
215
- return renderCategory({
216
- onToggleRawHeaders: toggleShowRaw,
217
- name: 'early-hints-headers',
218
- title: i18nString(UIStrings.earlyHintsHeaders),
219
- headerCount: this.#request.earlyHintsHeaders.length,
220
- checked: undefined,
221
- additionalContent: undefined,
222
- forceOpen: this.#toReveal?.section === NetworkForward.UIRequestLocation.UIHeaderSection.EARLY_HINTS,
223
- loggingContext: 'early-hints-headers',
224
- contents: this.#showResponseHeadersText ? this.#renderRawHeaders(this.#request.responseHeadersText, true) : html`
225
- <devtools-early-hints-header-section .data=${{
226
- request: this.#request,
227
- toReveal: this.#toReveal,
228
- } as NetworkComponents.ResponseHeaderSection.ResponseHeaderSectionData}></devtools-early-hints-header-section>
229
- `
230
- });
236
+ this.#view(input, {}, this.contentElement);
231
237
  }
232
238
 
233
- #renderResponseHeaders(): Lit.LitTemplate {
239
+ #getHeaderOverridesFileUrl(): Platform.DevToolsPath.UrlString {
234
240
  if (!this.#request) {
235
- return Lit.nothing;
241
+ return Platform.DevToolsPath.EmptyUrlString;
236
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
+ }
237
249
 
238
- const toggleShowRaw = (): void => {
239
- this.#showResponseHeadersText = !this.#showResponseHeadersText;
240
- void this.render();
241
- };
250
+ function renderEarlyHintsHeaders(input: ViewInput): Lit.LitTemplate {
251
+ if (!input.request?.earlyHintsHeaders || input.request.earlyHintsHeaders.length === 0) {
252
+ return Lit.nothing;
253
+ }
242
254
 
243
- return renderCategory({
244
- onToggleRawHeaders: toggleShowRaw,
245
- name: 'response-headers',
246
- title: i18nString(UIStrings.responseHeaders),
247
- headerCount: this.#request.sortedResponseHeaders.length,
248
- checked: this.#request.responseHeadersText ? this.#showResponseHeadersText : undefined,
249
- additionalContent: this.#renderHeaderOverridesLink(),
250
- forceOpen: this.#toReveal?.section === NetworkForward.UIRequestLocation.UIHeaderSection.RESPONSE,
251
- loggingContext: 'response-headers',
252
- contents: this.#showResponseHeadersText ?
253
- this.#renderRawHeaders(this.#request.responseHeadersText, true) :
254
- html`
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`
255
287
  <devtools-response-header-section .data=${{
256
- request: this.#request,
257
- toReveal: this.#toReveal,
258
- } as NetworkComponents.ResponseHeaderSection.ResponseHeaderSectionData} jslog=${
259
- VisualLogging.section('response-headers')}></devtools-response-header-section>
288
+ request: input.request,
289
+ toReveal: input.toReveal,
290
+ } as NetworkComponents.ResponseHeaderSection.ResponseHeaderSectionData} jslog=${
291
+ VisualLogging.section('response-headers')}></devtools-response-header-section>
260
292
  `
261
- });
262
- }
293
+ });
294
+ }
263
295
 
264
- #renderHeaderOverridesLink(): Lit.LitTemplate {
265
- if (!this.#workspace.uiSourceCodeForURL(this.#getHeaderOverridesFileUrl())) {
266
- return Lit.nothing;
267
- }
296
+ function renderHeaderOverridesLink(input: ViewInput): Lit.LitTemplate {
297
+ if (!input.revealHeadersFile) {
298
+ return Lit.nothing;
299
+ }
268
300
 
269
- const overridesSetting: Common.Settings.Setting<boolean> =
270
- Common.Settings.Settings.instance().moduleSetting('persistence-network-overrides-enabled');
271
- // Disabled until https://crbug.com/1079231 is fixed.
272
- // clang-format off
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
273
309
  const fileIcon = html`
274
310
  <devtools-icon name="document" class=${'medium' + overridesSetting.get() ? 'inline-icon dot purple': 'inline-icon'}>
275
311
  </devtools-icon>`;
276
- // clang-format on
277
-
278
- const revealHeadersFile = (event: Event): void => {
279
- event.preventDefault();
280
- const uiSourceCode = this.#workspace.uiSourceCodeForURL(this.#getHeaderOverridesFileUrl());
281
- if (uiSourceCode) {
282
- Sources.SourcesPanel.SourcesPanel.instance().showUISourceCode(uiSourceCode);
283
- void Sources.SourcesPanel.SourcesPanel.instance().revealInNavigator(uiSourceCode);
284
- }
285
- };
312
+ // clang-format on
286
313
 
287
- // Disabled until https://crbug.com/1079231 is fixed.
288
- // clang-format off
314
+ // Disabled until https://crbug.com/1079231 is fixed.
315
+ // clang-format off
289
316
  return html`
290
317
  <devtools-link
291
318
  href="https://goo.gle/devtools-override"
@@ -304,164 +331,90 @@ export class RequestHeadersView extends LegacyWrapper.LegacyWrapper.WrappableCom
304
331
  ${fileIcon}${Persistence.NetworkPersistenceManager.HEADERS_FILENAME}
305
332
  </devtools-link>
306
333
  `;
307
- // clang-format on
308
- }
309
-
310
- #getHeaderOverridesFileUrl(): Platform.DevToolsPath.UrlString {
311
- if (!this.#request) {
312
- return Platform.DevToolsPath.EmptyUrlString;
313
- }
314
- const fileUrl = Persistence.NetworkPersistenceManager.NetworkPersistenceManager.instance().fileUrlFromNetworkUrl(
315
- this.#request.url(), /* ignoreInactive */ true);
316
- return fileUrl.substring(0, fileUrl.lastIndexOf('/')) + '/' +
317
- Persistence.NetworkPersistenceManager.HEADERS_FILENAME as Platform.DevToolsPath.UrlString;
318
- }
319
-
320
- #renderRequestHeaders(): Lit.LitTemplate {
321
- if (!this.#request) {
322
- return Lit.nothing;
323
- }
324
- const requestHeadersText = this.#request.requestHeadersText();
325
-
326
- const toggleShowRaw = (): void => {
327
- this.#showRequestHeadersText = !this.#showRequestHeadersText;
328
- void this.render();
329
- };
334
+ // clang-format on
335
+ }
330
336
 
331
- return renderCategory({
332
- onToggleRawHeaders: toggleShowRaw,
333
- name: 'request-headers',
334
- title: i18nString(UIStrings.requestHeaders),
335
- headerCount: this.#request.requestHeaders().length,
336
- checked: requestHeadersText ? this.#showRequestHeadersText : undefined,
337
- forceOpen: this.#toReveal?.section === NetworkForward.UIRequestLocation.UIHeaderSection.REQUEST,
338
- loggingContext: 'request-headers',
339
- contents: (this.#showRequestHeadersText && requestHeadersText) ?
340
- this.#renderRawHeaders(requestHeadersText, false) :
341
- html`
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`
342
351
  <devtools-widget .widgetConfig=${
343
- UI.Widget.widgetConfig(NetworkComponents.RequestHeaderSection.RequestHeaderSection, {
344
- request: this.#request,
345
- toReveal: this.#toReveal,
346
- })} jslog=${VisualLogging.section('request-headers')}></devtools-widget>`
347
- });
348
- }
349
-
350
- #renderRawHeaders(rawHeadersText: string, forResponseHeaders: boolean): Lit.TemplateResult {
351
- const trimmed = rawHeadersText.trim();
352
- const showFull = forResponseHeaders ? this.#showResponseHeadersTextFull : this.#showRequestHeadersTextFull;
353
- const isShortened = !showFull && trimmed.length > RAW_HEADER_CUTOFF;
354
-
355
- const showMore = (): void => {
356
- if (forResponseHeaders) {
357
- this.#showResponseHeadersTextFull = true;
358
- } else {
359
- this.#showRequestHeadersTextFull = true;
360
- }
361
- void this.render();
362
- };
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
+ }
363
358
 
364
- const onContextMenuOpen = (event: Event): void => {
365
- const showFull = forResponseHeaders ? this.#showResponseHeadersTextFull : this.#showRequestHeadersTextFull;
366
- if (!showFull) {
367
- const contextMenu = new UI.ContextMenu.ContextMenu(event);
368
- const section = contextMenu.newSection();
369
- section.appendItem(i18nString(UIStrings.showMore), showMore, {jslogContext: 'show-more'});
370
- void contextMenu.show();
371
- }
372
- };
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
+ }
373
363
 
374
- // Disabled until https://crbug.com/1079231 is fixed.
375
- // clang-format off
376
- return html`
377
- <div
378
- class="row raw-headers-row"
379
- @contextmenu=${(event: Event) => {
380
- if (isShortened) {
381
- onContextMenuOpen(event);
382
- }
383
- }}
384
- >
385
- <div class="raw-headers">
386
- ${isShortened ? trimmed.substring(0, RAW_HEADER_CUTOFF) : trimmed}
387
- </div>
388
- ${isShortened
389
- ? html`
390
- <devtools-button
391
- .size=${Buttons.Button.Size.SMALL}
392
- .variant=${Buttons.Button.Variant.OUTLINED}
393
- @click=${showMore}
394
- jslog=${VisualLogging.action('raw-headers-show-more').track({
395
- click: true,
396
- })}
397
- >${i18nString(UIStrings.showMore)}</devtools-button
398
- >
399
- `
400
- : Lit.nothing}
401
- </div>
402
- `;
403
- // clang-format on
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');
404
372
  }
405
373
 
406
- #renderGeneralSection(): Lit.LitTemplate {
407
- if (!this.#request) {
408
- return Lit.nothing;
409
- }
410
-
411
- const statusClasses = ['status'];
412
- if (this.#request.statusCode < 300 || this.#request.statusCode === 304) {
413
- statusClasses.push('green-circle');
414
- } else if (this.#request.statusCode < 400) {
415
- statusClasses.push('yellow-circle');
416
- } else {
417
- statusClasses.push('red-circle');
418
- }
419
-
420
- let comment = '';
421
- if (this.#request.cachedInMemory()) {
422
- comment = i18nString(UIStrings.fromMemoryCache);
423
- } else if (this.#request.fromEarlyHints()) {
424
- comment = i18nString(UIStrings.fromEarlyHints);
425
- } else if (this.#request.fetchedViaServiceWorker) {
426
- comment = i18nString(UIStrings.fromServiceWorker);
427
- } else if (this.#request.redirectSourceSignedExchangeInfoHasNoErrors()) {
428
- comment = i18nString(UIStrings.fromSignedexchange);
429
- } else if (this.#request.fromPrefetchCache()) {
430
- comment = i18nString(UIStrings.fromPrefetchCache);
431
- } else if (this.#request.cached()) {
432
- comment = i18nString(UIStrings.fromDiskCache);
433
- }
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
+ }
434
388
 
435
- if (comment) {
436
- statusClasses.push('status-with-comment');
437
- }
389
+ if (comment) {
390
+ statusClasses.push('status-with-comment');
391
+ }
438
392
 
439
- const statusText = [this.#request.statusCode, this.#request.getInferredStatusText(), comment].join(' ');
393
+ const statusText = [input.request.statusCode, input.request.getInferredStatusText(), comment].join(' ');
440
394
 
441
- return renderCategory({
442
- name: 'general',
443
- title: i18nString(UIStrings.general),
444
- forceOpen: this.#toReveal?.section === NetworkForward.UIRequestLocation.UIHeaderSection.GENERAL,
445
- loggingContext: 'general',
446
- // clang-format off
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
447
401
  contents: html`<div jslog=${VisualLogging.section('general')}>
448
- ${this.#renderGeneralRow(i18nString(UIStrings.requestUrl), this.#request.url(), 'request-url')}
449
- ${this.#request.statusCode? this.#renderGeneralRow(i18nString(UIStrings.requestMethod),
450
- this.#request.requestMethod, 'request-method') : Lit.nothing}
451
- ${this.#request.statusCode? this.#renderGeneralRow(i18nString(UIStrings.statusCode),
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),
452
406
  statusText, 'status-code', statusClasses) : Lit.nothing}
453
- ${this.#request.remoteAddress()? this.#renderGeneralRow(i18nString(UIStrings.remoteAddress),
454
- this.#request.remoteAddress(), 'remote-address') : Lit.nothing}
455
- ${this.#request.referrerPolicy()? this.#renderGeneralRow(i18nString(UIStrings.referrerPolicy),
456
- String(this.#request.referrerPolicy()), 'referrer-policy') : 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}
457
411
  </div>`});
458
- // clang-format on
459
- }
412
+ // clang-format on
460
413
 
461
- #renderGeneralRow(name: Common.UIString.LocalizedString, value: string, id: string, classNames?: string[]):
462
- Lit.LitTemplate {
463
- const isHighlighted = this.#toReveal?.section === NetworkForward.UIRequestLocation.UIHeaderSection.GENERAL &&
464
- name.toLowerCase() === this.#toReveal?.header?.toLowerCase();
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();
465
418
  return html`
466
419
  <div class="row ${isHighlighted ? 'header-highlight' : ''}">
467
420
  <div class="header-name">${name}</div>
@@ -473,20 +426,9 @@ export class RequestHeadersView extends LegacyWrapper.LegacyWrapper.WrappableCom
473
426
  </div>
474
427
  `;
475
428
  }
476
-
477
- getHeaderElementById(id: string): Element|null {
478
- const categories = this.#shadow.querySelectorAll('devtools-request-headers-category');
479
- for (const category of categories) {
480
- const element = category.querySelector(`#${id}`);
481
- if (element) {
482
- return element;
483
- }
484
- }
485
- return null;
486
- }
487
429
  }
488
430
 
489
- function renderCategory(data: {
431
+ export function renderCategory(data: {
490
432
  name: string,
491
433
  title: Common.UIString.LocalizedString,
492
434
  contents: Lit.LitTemplate,
@@ -555,11 +497,3 @@ function renderCategory(data: {
555
497
  expandedSetting?.set((event.target as HTMLDetailsElement).open);
556
498
  }
557
499
  }
558
-
559
- customElements.define('devtools-request-headers', RequestHeadersView);
560
-
561
- declare global {
562
- interface HTMLElementTagNameMap {
563
- 'devtools-request-headers': RequestHeadersView;
564
- }
565
- }