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.
- package/front_end/core/sdk/ScopeTreeCache.ts +4 -0
- package/front_end/entrypoint_template.html +5 -1
- package/front_end/generated/Deprecation.ts +21 -0
- package/front_end/generated/InspectorBackendCommands.ts +1 -1
- package/front_end/generated/protocol.ts +2 -0
- package/front_end/models/ai_assistance/AiConversation.ts +5 -1
- package/front_end/models/ai_assistance/agents/AiAgent.ts +16 -4
- package/front_end/models/ai_assistance/agents/ContextSelectionAgent.ts +7 -1
- package/front_end/panels/ai_assistance/AiAssistancePanel.ts +0 -2
- package/front_end/panels/ai_assistance/components/ChatInput.ts +36 -31
- package/front_end/panels/ai_assistance/components/chatInput.css +6 -9
- package/front_end/panels/application/ServiceWorkerCacheViews.ts +3 -6
- package/front_end/panels/browser_debugger/CategorizedBreakpointsSidebarPane.ts +11 -3
- package/front_end/panels/common/DOMLinkifier.ts +6 -1
- package/front_end/panels/elements/ComputedStyleWidget.ts +25 -2
- package/front_end/panels/elements/ElementsPanel.ts +114 -15
- package/front_end/panels/elements/PropertiesWidget.ts +40 -2
- package/front_end/panels/elements/StylesSidebarPane.ts +26 -3
- package/front_end/panels/network/NetworkDataGridNode.ts +4 -0
- package/front_end/panels/network/NetworkItemView.ts +6 -44
- package/front_end/panels/network/RequestHeadersView.ts +499 -0
- package/front_end/panels/network/components/RequestHeaderSection.ts +3 -0
- package/front_end/panels/network/components/components.ts +0 -2
- package/front_end/panels/network/network.ts +3 -0
- package/front_end/third_party/chromium/README.chromium +1 -1
- package/front_end/third_party/puppeteer/README.chromium +2 -2
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/revisions.d.ts +2 -2
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/revisions.js +2 -2
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/util/version.d.ts +1 -1
- package/front_end/third_party/puppeteer/package/lib/cjs/puppeteer/util/version.js +1 -1
- package/front_end/third_party/puppeteer/package/lib/es5-iife/puppeteer-core-browser.js +3 -3
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/revisions.d.ts +2 -2
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/revisions.js +2 -2
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/util/version.d.ts +1 -1
- package/front_end/third_party/puppeteer/package/lib/esm/puppeteer/util/version.js +1 -1
- package/front_end/third_party/puppeteer/package/package.json +1 -1
- package/front_end/third_party/puppeteer/package/src/revisions.ts +2 -2
- package/front_end/third_party/puppeteer/package/src/util/version.ts +1 -1
- package/front_end/ui/legacy/Toolbar.ts +37 -5
- package/front_end/ui/legacy/UIUtils.ts +35 -5
- package/front_end/ui/legacy/components/utils/JSPresentationUtils.ts +113 -133
- package/package.json +1 -1
- 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
|
|
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
|
-
|
|
651
|
-
|
|
652
|
-
|
|
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
|
-
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
node = inspectedDocument ? inspectedDocument.body || inspectedDocument.documentElement : null;
|
|
693
|
+
if (this.hasNonDefaultSelectedNode || this.pendingNodeReveal ||
|
|
694
|
+
restorationGeneration !== this.#restorationGeneration) {
|
|
695
|
+
return;
|
|
662
696
|
}
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
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
|
|
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
|
|
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
|
-
|
|
491
|
-
this.setFilter(
|
|
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(
|
|
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:
|
|
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
|
|
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
|
-
|
|
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():
|
|
391
|
+
getHeadersViewComponent(): RequestHeadersView|undefined {
|
|
430
392
|
return this.#headersViewComponent;
|
|
431
393
|
}
|
|
432
394
|
}
|