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
@@ -227,6 +227,7 @@ export class ElementsPanel extends UI.Panel.Panel implements UI.SearchableView.S
227
227
  domTreeButton?: HTMLElement;
228
228
  private selectedNodeOnReset?: SDK.DOMModel.DOMNode;
229
229
  private hasNonDefaultSelectedNode?: boolean;
230
+ #restorationGeneration = 0;
230
231
  private searchConfig?: UI.SearchableView.SearchConfig;
231
232
  private omitDefaultSelection?: boolean;
232
233
  private notFirstInspectElement?: boolean;
@@ -609,6 +610,7 @@ export class ElementsPanel extends UI.Panel.Panel implements UI.SearchableView.S
609
610
  if (focus) {
610
611
  this.selectedNodeOnReset = selectedNode;
611
612
  this.hasNonDefaultSelectedNode = true;
613
+ this.#restorationGeneration++;
612
614
  }
613
615
 
614
616
  const executionContexts = selectedNode.domModel().runtimeModel().executionContexts();
@@ -645,32 +647,128 @@ export class ElementsPanel extends UI.Panel.Panel implements UI.SearchableView.S
645
647
  }
646
648
 
647
649
  const savedSelectedNodeOnReset = this.selectedNodeOnReset;
648
- void restoreNode.call(this, domModel, this.selectedNodeOnReset || null);
650
+ void this.restoreSelectedNodeAfterUpdate(domModel, this.selectedNodeOnReset || null, savedSelectedNodeOnReset);
651
+ }
652
+
653
+ /**
654
+ * Best-effort restoration of the previously focused node after a reload.
655
+ *
656
+ * The CDP path-based mechanism works well for stable DOMs, but can be
657
+ * unreliable for pages that render asynchronously after the initial
658
+ * document update. To improve reliability we retry a few times, and also
659
+ * fall back to evaluating a JS path (document.querySelector(...)) when
660
+ * possible.
661
+ *
662
+ * Node resolution (computation) is separated from view state updates:
663
+ * resolveNode returns a DOMNode|null, and this method handles selection.
664
+ */
665
+ private async restoreSelectedNodeAfterUpdate(
666
+ domModel: SDK.DOMModel.DOMModel, staleNode: SDK.DOMModel.DOMNode|null,
667
+ savedSelectedNodeOnReset: SDK.DOMModel.DOMNode|undefined): Promise<void> {
668
+ // Fast path: no previous node to restore -- just select the fallback
669
+ // synchronously so callers that check selection immediately still work.
670
+ if (!staleNode) {
671
+ this.trySetFallbackSelection(domModel);
672
+ return;
673
+ }
674
+
675
+ const nodePath = staleNode.path();
676
+
677
+ // Keep the panel usable quickly by selecting a reasonable default node as
678
+ // soon as we can, but continue trying to restore the stale node.
679
+ let didSetFallbackSelection = false;
649
680
 
650
- async function restoreNode(
651
- this: ElementsPanel, domModel: SDK.DOMModel.DOMModel, staleNode: SDK.DOMModel.DOMNode|null): Promise<void> {
652
- const nodePath = staleNode ? staleNode.path() : null;
653
- const restoredNodeId = nodePath ? await domModel.pushNodeByPathToFrontend(nodePath) : null;
681
+ // Retry with exponential-ish backoff, capping total wait at ~3s.
682
+ // Most async-rendered pages settle well within this window.
683
+ const attemptDelaysMs = [0, 250, 500, 1000, 1500];
654
684
 
685
+ // Capture the restoration generation so any user interaction (node
686
+ // selection, style editing, node reveal, etc.) cancels pending retries.
687
+ const restorationGeneration = this.#restorationGeneration;
688
+
689
+ for (let attempt = 0; attempt < attemptDelaysMs.length; ++attempt) {
655
690
  if (savedSelectedNodeOnReset !== this.selectedNodeOnReset) {
656
691
  return;
657
692
  }
658
- let node = domModel.nodeForId(restoredNodeId);
659
- if (!node) {
660
- const inspectedDocument = domModel.existingDocument();
661
- node = inspectedDocument ? inspectedDocument.body || inspectedDocument.documentElement : null;
693
+ if (this.hasNonDefaultSelectedNode || this.pendingNodeReveal ||
694
+ restorationGeneration !== this.#restorationGeneration) {
695
+ return;
662
696
  }
663
- // If `node` is null here, the document hasn't been transmitted from the backend yet
664
- // and isn't in a valid state to have a default-selected node. Another document update
665
- // should be forthcoming. In the meantime, don't set the default-selected node or notify
666
- // the test that it's ready, because it isn't.
667
- if (node) {
668
- this.setDefaultSelectedNode(node);
697
+
698
+ if (attemptDelaysMs[attempt]) {
699
+ await new Promise<void>(resolve => window.setTimeout(resolve, attemptDelaysMs[attempt]));
700
+ }
701
+
702
+ if (savedSelectedNodeOnReset !== this.selectedNodeOnReset) {
703
+ return;
704
+ }
705
+ if (this.hasNonDefaultSelectedNode || this.pendingNodeReveal ||
706
+ restorationGeneration !== this.#restorationGeneration) {
707
+ return;
708
+ }
709
+
710
+ // Computation: resolve the node without touching view state.
711
+ const restoredNode = await this.resolveNodeForRestoration(domModel, nodePath);
712
+
713
+ if (restoredNode) {
714
+ this.setDefaultSelectedNode(restoredNode);
669
715
  this.lastSelectedNodeSelectedForTest();
716
+ return;
717
+ }
718
+
719
+ if (!didSetFallbackSelection) {
720
+ // If we cannot compute a fallback selection yet, the document likely
721
+ // has not been transmitted from the backend and isn't in a valid state
722
+ // to have a default-selected node. Another document update should be
723
+ // forthcoming. In the meantime, don't notify tests that selection is
724
+ // ready, because it isn't.
725
+ if (!this.trySetFallbackSelection(domModel)) {
726
+ return;
727
+ }
728
+ didSetFallbackSelection = true;
670
729
  }
671
730
  }
672
731
  }
673
732
 
733
+ /**
734
+ * Attempts to resolve a DOM node by its CDP path.
735
+ * Pure computation -- does not modify view state.
736
+ */
737
+ private async resolveNodeForRestoration(domModel: SDK.DOMModel.DOMModel, nodePath: string|null):
738
+ Promise<SDK.DOMModel.DOMNode|null> {
739
+ try {
740
+ if (nodePath) {
741
+ const restoredNodeId = await domModel.pushNodeByPathToFrontend(nodePath);
742
+ const restoredNode = domModel.nodeForId(restoredNodeId);
743
+ if (restoredNode) {
744
+ return restoredNode;
745
+ }
746
+ }
747
+ } catch {
748
+ // CDP calls (pushNodeByPathToFrontend) can reject when the target or
749
+ // session is closed, e.g. if the page navigates again while we are
750
+ // retrying. Safe to swallow: we either retry on the next iteration or
751
+ // fall through to the fallback node.
752
+ }
753
+ return null;
754
+ }
755
+
756
+ private trySetFallbackSelection(domModel: SDK.DOMModel.DOMModel): boolean {
757
+ const inspectedDocument = domModel.existingDocument();
758
+ const fallbackNode = inspectedDocument ? inspectedDocument.body || inspectedDocument.documentElement : null;
759
+ if (!fallbackNode) {
760
+ return false;
761
+ }
762
+
763
+ this.setDefaultSelectedNode(fallbackNode);
764
+ this.lastSelectedNodeSelectedForTest();
765
+ return true;
766
+ }
767
+
768
+ cancelPendingRestoration(): void {
769
+ this.#restorationGeneration++;
770
+ }
771
+
674
772
  private lastSelectedNodeSelectedForTest(): void {
675
773
  }
676
774
 
@@ -1373,6 +1471,7 @@ export class DOMNodeRevealer implements Common.Revealer.Revealer<
1373
1471
  omitFocus?: boolean): Promise<void> {
1374
1472
  const panel = ElementsPanel.instance();
1375
1473
  panel.pendingNodeReveal = true;
1474
+ panel.cancelPendingRestoration();
1376
1475
 
1377
1476
  return (new Promise<void>(revealPromise)).catch((reason: Error) => {
1378
1477
  let message: string;
@@ -73,6 +73,8 @@ const i18nString = i18n.i18n.getLocalizedString.bind(undefined, str_);
73
73
 
74
74
  interface PropertiesWidgetInput {
75
75
  onFilterChanged: (e: CustomEvent<string>) => void;
76
+ onRegexToggled: () => void;
77
+ isRegex: boolean;
76
78
  treeOutlineElement: HTMLElement;
77
79
  displayNoMatchingPropertyMessage: boolean;
78
80
  }
@@ -85,7 +87,13 @@ export const DEFAULT_VIEW: View = (input, _output, target) => {
85
87
  <div jslog=${VisualLogging.pane('element-properties').track({resize: true})}>
86
88
  <div class="hbox properties-widget-toolbar">
87
89
  <devtools-toolbar class="styles-pane-toolbar" role="presentation">
88
- <devtools-toolbar-input type="filter" @change=${input.onFilterChanged} style="flex-grow:1; flex-shrink:1"></devtools-toolbar-input>
90
+ <devtools-toolbar-input
91
+ type="filter"
92
+ ?regex=${true}
93
+ @change=${input.onFilterChanged}
94
+ @regextoggle=${input.onRegexToggled}
95
+ style="flex-grow:1; flex-shrink:1"
96
+ ></devtools-toolbar-input>
89
97
  <devtools-checkbox title=${i18nString(UIStrings.showAllTooltip)} ${bindToSetting(getShowAllPropertiesSetting())}>
90
98
  ${i18nString(UIStrings.showAll)}
91
99
  </devtools-checkbox>
@@ -110,6 +118,8 @@ export class PropertiesWidget extends UI.Widget.VBox {
110
118
  private lastRequestedNode?: SDK.DOMModel.DOMNode;
111
119
  readonly #view: View;
112
120
  #displayNoMatchingPropertyMessage = false;
121
+ #isRegex = false;
122
+ #filterText = '';
113
123
 
114
124
  constructor(view: View = DEFAULT_VIEW) {
115
125
  super({useShadowDom: true});
@@ -140,11 +150,33 @@ export class PropertiesWidget extends UI.Widget.VBox {
140
150
  void this.performUpdate();
141
151
  }
142
152
 
153
+ #buildFilterRegex(text: string): RegExp|null {
154
+ if (!text) {
155
+ return null;
156
+ }
157
+ if (this.#isRegex) {
158
+ try {
159
+ return new RegExp(text, 'i');
160
+ } catch {
161
+ // Invalid regex: fall through to plain-text matching.
162
+ }
163
+ }
164
+ return new RegExp(Platform.StringUtilities.escapeForRegExp(text), 'i');
165
+ }
166
+
143
167
  private onFilterChanged(event: CustomEvent<string>): void {
144
- this.filterRegex = event.detail ? new RegExp(Platform.StringUtilities.escapeForRegExp(event.detail), 'i') : null;
168
+ this.#filterText = event.detail;
169
+ this.filterRegex = this.#buildFilterRegex(event.detail);
145
170
  this.filterAndScheduleUpdate();
146
171
  }
147
172
 
173
+ private onRegexToggled(): void {
174
+ this.#isRegex = !this.#isRegex;
175
+ this.filterRegex = this.#buildFilterRegex(this.#filterText);
176
+ this.internalFilterProperties();
177
+ this.#renderView();
178
+ }
179
+
148
180
  private filterAndScheduleUpdate(): void {
149
181
  const previousDisplay = this.#displayNoMatchingPropertyMessage;
150
182
  this.internalFilterProperties();
@@ -195,9 +227,15 @@ export class PropertiesWidget extends UI.Widget.VBox {
195
227
  treeElement, await root.populateChildrenIfNeeded(), true /* skipProto */, true /* skipGettersAndSetters */);
196
228
  this.internalFilterProperties();
197
229
  }
230
+ this.#renderView();
231
+ }
232
+
233
+ #renderView(): void {
198
234
  this.#view(
199
235
  {
200
236
  onFilterChanged: this.onFilterChanged.bind(this),
237
+ onRegexToggled: this.onRegexToggled.bind(this),
238
+ isRegex: this.#isRegex,
201
239
  treeOutlineElement: this.treeOutline.element,
202
240
  displayNoMatchingPropertyMessage: this.#displayNoMatchingPropertyMessage,
203
241
  },
@@ -184,6 +184,8 @@ export class StylesSidebarPane extends Common.ObjectWrapper.eventMixin<EventType
184
184
  private userOperation = false;
185
185
  isEditingStyle = false;
186
186
  #filterRegex: RegExp|null = null;
187
+ #isRegex = false;
188
+ #filterText = '';
187
189
  private isActivePropertyHighlighted = false;
188
190
  private initialUpdateCompleted = false;
189
191
  hasMatchedStyles = false;
@@ -486,9 +488,28 @@ export class StylesSidebarPane extends Common.ObjectWrapper.eventMixin<EventType
486
488
  }
487
489
  }
488
490
 
491
+ #buildFilterRegex(text: string): RegExp|null {
492
+ if (!text) {
493
+ return null;
494
+ }
495
+ if (this.#isRegex) {
496
+ try {
497
+ return new RegExp(text, 'i');
498
+ } catch {
499
+ // Invalid regex: fall through to plain-text matching.
500
+ }
501
+ }
502
+ return new RegExp(Platform.StringUtilities.escapeForRegExp(text), 'i');
503
+ }
504
+
489
505
  private onFilterChanged(event: Common.EventTarget.EventTargetEvent<string>): void {
490
- const regex = event.data ? new RegExp(Platform.StringUtilities.escapeForRegExp(event.data), 'i') : null;
491
- this.setFilter(regex);
506
+ this.#filterText = event.data;
507
+ this.setFilter(this.#buildFilterRegex(event.data));
508
+ }
509
+
510
+ private onRegexToggled(): void {
511
+ this.#isRegex = !this.#isRegex;
512
+ this.setFilter(this.#buildFilterRegex(this.#filterText));
492
513
  }
493
514
 
494
515
  setFilter(regex: RegExp|null): void {
@@ -1392,7 +1413,9 @@ export class StylesSidebarPane extends Common.ObjectWrapper.eventMixin<EventType
1392
1413
  const hbox = container.createChild('div', 'hbox styles-sidebar-pane-toolbar');
1393
1414
  const toolbar = hbox.createChild('devtools-toolbar', 'styles-pane-toolbar');
1394
1415
  toolbar.role = 'presentation';
1395
- const filterInput = new UI.Toolbar.ToolbarFilter(undefined, 1, 1, undefined, undefined, false);
1416
+ const filterInput = new UI.Toolbar.ToolbarFilter(
1417
+ undefined, 1, 1, undefined, undefined, false, undefined, undefined, /* showRegexToggle=*/ true,
1418
+ this.onRegexToggled.bind(this));
1396
1419
  filterInput.addEventListener(UI.Toolbar.ToolbarInput.Event.TEXT_CHANGED, this.onFilterChanged, this);
1397
1420
  toolbar.appendToolbarItem(filterInput);
1398
1421
  void toolbar.appendItemsAtLocation('styles-sidebarpane-toolbar');
@@ -1621,6 +1621,10 @@ export class NetworkRequestNode extends NetworkNode {
1621
1621
  this.select();
1622
1622
  void action.execute();
1623
1623
  }, {capture: true});
1624
+ // We need this as else the images get open under it.
1625
+ floatingButton.addEventListener('dblclick', ev => {
1626
+ ev.stopPropagation();
1627
+ }, {capture: true});
1624
1628
  floatingButton.addEventListener('mousedown', ev => {
1625
1629
  ev.stopPropagation();
1626
1630
  }, {capture: true});
@@ -8,11 +8,8 @@ import * as Common from '../../core/common/common.js';
8
8
  import * as i18n from '../../core/i18n/i18n.js';
9
9
  import * as Platform from '../../core/platform/platform.js';
10
10
  import * as SDK from '../../core/sdk/sdk.js';
11
- import * as Annotations from '../../models/annotations/annotations.js';
12
11
  import type * as NetworkTimeCalculator from '../../models/network_time_calculator/network_time_calculator.js';
13
- import * as PanelCommon from '../../panels/common/common.js';
14
12
  import * as NetworkForward from '../../panels/network/forward/forward.js';
15
- import * as LegacyWrapper from '../../ui/components/legacy_wrapper/legacy_wrapper.js';
16
13
  import {Icon} from '../../ui/kit/kit.js';
17
14
  import type * as SourceFrame from '../../ui/legacy/components/source_frame/source_frame.js';
18
15
  import * as UI from '../../ui/legacy/legacy.js';
@@ -22,6 +19,7 @@ import * as NetworkComponents from './components/components.js';
22
19
  import {EventSourceMessagesView} from './EventSourceMessagesView.js';
23
20
  import {RequestCookiesView} from './RequestCookiesView.js';
24
21
  import {RequestDeviceBoundSessionsView} from './RequestDeviceBoundSessionsView.js';
22
+ import {RequestHeadersView} from './RequestHeadersView.js';
25
23
  import {RequestInitiatorView} from './RequestInitiatorView.js';
26
24
  import {RequestPayloadView} from './RequestPayloadView.js';
27
25
  import {RequestPreviewView} from './RequestPreviewView.js';
@@ -148,7 +146,7 @@ const requestToPreviewView = new WeakMap<SDK.NetworkRequest.NetworkRequest, Requ
148
146
  export class NetworkItemView extends UI.TabbedPane.TabbedPane {
149
147
  #request: SDK.NetworkRequest.NetworkRequest;
150
148
  readonly #resourceViewTabSetting: Common.Settings.Setting<NetworkForward.UIRequestLocation.UIRequestTabs>;
151
- readonly #headersViewComponent: NetworkComponents.RequestHeadersView.RequestHeadersView|undefined;
149
+ readonly #headersViewComponent: RequestHeadersView|undefined;
152
150
  #payloadView: RequestPayloadView|null = null;
153
151
  readonly #responseView: RequestResponseView|undefined;
154
152
  #cookiesView: RequestCookiesView|null = null;
@@ -174,11 +172,11 @@ export class NetworkItemView extends UI.TabbedPane.TabbedPane {
174
172
  i18nString(UIStrings.headers));
175
173
  } else {
176
174
  this.#firstTab = NetworkForward.UIRequestLocation.UIRequestTabs.HEADERS_COMPONENT;
177
- this.#headersViewComponent = new NetworkComponents.RequestHeadersView.RequestHeadersView(request);
175
+ this.#headersViewComponent = new RequestHeadersView();
176
+ this.#headersViewComponent.request = request;
178
177
  this.appendTab(
179
178
  NetworkForward.UIRequestLocation.UIRequestTabs.HEADERS_COMPONENT, i18nString(UIStrings.headers),
180
- LegacyWrapper.LegacyWrapper.legacyWrapper(UI.Widget.VBox, this.#headersViewComponent),
181
- i18nString(UIStrings.headers));
179
+ this.#headersViewComponent, i18nString(UIStrings.headers));
182
180
  }
183
181
 
184
182
  this.#resourceViewTabSetting =
@@ -281,14 +279,6 @@ export class NetworkItemView extends UI.TabbedPane.TabbedPane {
281
279
  this.#initialTab = undefined;
282
280
  }
283
281
 
284
- if (Annotations.AnnotationRepository.annotationsEnabled()) {
285
- PanelCommon.AnnotationManager.instance().initializePlacementForAnnotationType(
286
- Annotations.AnnotationType.NETWORK_REQUEST_SUBPANEL_HEADERS, this.resolveInitialState.bind(this),
287
- this.element);
288
-
289
- void PanelCommon.AnnotationManager.instance().resolveAnnotationsOfType(
290
- Annotations.AnnotationType.NETWORK_REQUEST_SUBPANEL_HEADERS);
291
- }
292
282
  }
293
283
 
294
284
  override willHide(): void {
@@ -377,34 +367,6 @@ export class NetworkItemView extends UI.TabbedPane.TabbedPane {
377
367
  }
378
368
  }
379
369
 
380
- async resolveInitialState(
381
- parentElement: Element, reveal: boolean, lookupId: string,
382
- anchor?: SDK.DOMModel.DOMNode|SDK.NetworkRequest.NetworkRequest): Promise<{x: number, y: number}|null> {
383
- const request = anchor as SDK.NetworkRequest.NetworkRequest;
384
- if ((request && request !== this.request()) || (lookupId !== this.request().requestId())) {
385
- return null;
386
- }
387
-
388
- if (!this.#headersViewComponent) {
389
- return null;
390
- }
391
- await this.#headersViewComponent.render();
392
-
393
- const element = this.#headersViewComponent.getHeaderElementById('request-url');
394
- if (!element) {
395
- return null;
396
- }
397
-
398
- const targetRect = element.getBoundingClientRect();
399
- const parentRect = parentElement.getBoundingClientRect();
400
- // Adjust the anchor position slightly.
401
- const adjustX = 15;
402
- const adjustY = -19;
403
- const relativeX = targetRect.x - parentRect.x + adjustX;
404
- const relativeY = targetRect.y - parentRect.y + adjustY;
405
- return {x: relativeX, y: relativeY};
406
- }
407
-
408
370
  private tabSelected(event: Common.EventTarget.EventTargetEvent<UI.TabbedPane.EventData>): void {
409
371
  if (!event.data.isUserGesture) {
410
372
  return;
@@ -426,7 +388,7 @@ export class NetworkItemView extends UI.TabbedPane.TabbedPane {
426
388
  this.#headersViewComponent?.revealHeader(section, header);
427
389
  }
428
390
 
429
- getHeadersViewComponent(): NetworkComponents.RequestHeadersView.RequestHeadersView|undefined {
391
+ getHeadersViewComponent(): RequestHeadersView|undefined {
430
392
  return this.#headersViewComponent;
431
393
  }
432
394
  }