chrome-devtools-frontend 1.0.1004171 → 1.0.1005672
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/config/gni/devtools_grd_files.gni +2 -0
- package/front_end/core/common/ParsedURL.ts +3 -3
- package/front_end/core/i18n/locales/en-US.json +41 -8
- package/front_end/core/i18n/locales/en-XL.json +41 -8
- package/front_end/core/sdk/DOMModel.ts +15 -0
- package/front_end/core/sdk/DebuggerModel.ts +12 -0
- package/front_end/core/sdk/RuntimeModel.ts +5 -3
- package/front_end/generated/InspectorBackendCommands.js +0 -2
- package/front_end/generated/protocol.ts +1 -2
- package/front_end/models/extensions/ExtensionPanel.ts +1 -1
- package/front_end/models/extensions/ExtensionServer.ts +11 -10
- package/front_end/models/har/Log.ts +4 -3
- package/front_end/models/issues_manager/DeprecationIssue.ts +5 -23
- package/front_end/panels/elements/ComputedStyleWidget.ts +6 -5
- package/front_end/panels/elements/ElementsTreeElement.ts +41 -0
- package/front_end/panels/elements/ElementsTreeOutline.ts +5 -0
- package/front_end/panels/elements/components/AdornerManager.ts +7 -0
- package/front_end/panels/elements/elementsTreeOutline.css +9 -0
- package/front_end/panels/network/NetworkItemView.ts +10 -1
- package/front_end/panels/network/RequestHeadersView.ts +1 -1
- package/front_end/panels/network/components/RequestHeadersView.css +78 -0
- package/front_end/panels/network/components/RequestHeadersView.ts +262 -0
- package/front_end/panels/network/components/components.ts +2 -0
- package/front_end/panels/network/forward/UIRequestLocation.ts +1 -0
- package/front_end/panels/network/networkLogView.css +3 -3
- package/front_end/panels/network/requestHeadersTree.css +6 -0
- package/front_end/panels/sources/CallStackSidebarPane.ts +13 -0
- package/front_end/panels/sources/ScopeChainSidebarPane.ts +4 -3
- package/front_end/panels/sources/sourcesView.css +4 -0
- package/front_end/ui/components/text_editor/config.ts +0 -1
- package/front_end/ui/legacy/components/data_grid/DataGrid.ts +16 -2
- package/front_end/ui/legacy/components/data_grid/ViewportDataGrid.ts +2 -2
- package/front_end/ui/legacy/components/inline_editor/ColorSwatch.ts +4 -0
- package/package.json +1 -1
@@ -41,6 +41,7 @@ import * as TextUtils from '../../models/text_utils/text_utils.js';
|
|
41
41
|
import * as CodeMirror from '../../third_party/codemirror.next/codemirror.next.js';
|
42
42
|
import * as Adorners from '../../ui/components/adorners/adorners.js';
|
43
43
|
import * as CodeHighlighter from '../../ui/components/code_highlighter/code_highlighter.js';
|
44
|
+
import * as IconButton from '../../ui/components/icon_button/icon_button.js';
|
44
45
|
import * as TextEditor from '../../ui/components/text_editor/text_editor.js';
|
45
46
|
import * as Components from '../../ui/legacy/components/utils/utils.js';
|
46
47
|
import * as UI from '../../ui/legacy/legacy.js';
|
@@ -237,6 +238,7 @@ export class ElementsTreeElement extends UI.TreeOutline.TreeElement {
|
|
237
238
|
private searchHighlightsVisible?: boolean;
|
238
239
|
selectionElement?: HTMLDivElement;
|
239
240
|
private hintElement?: HTMLElement;
|
241
|
+
#slot?: Adorners.Adorner.Adorner;
|
240
242
|
private contentElement: HTMLElement;
|
241
243
|
|
242
244
|
constructor(node: SDK.DOMModel.DOMNode, isClosingTag?: boolean) {
|
@@ -422,6 +424,21 @@ export class ElementsTreeElement extends UI.TreeOutline.TreeElement {
|
|
422
424
|
this.expandedChildrenLimitInternal = expandedChildrenLimit;
|
423
425
|
}
|
424
426
|
|
427
|
+
createSlotLink(nodeShortcut: SDK.DOMModel.DOMNodeShortcut|null): void {
|
428
|
+
if (nodeShortcut) {
|
429
|
+
const config = ElementsComponents.AdornerManager.getRegisteredAdorner(
|
430
|
+
ElementsComponents.AdornerManager.RegisteredAdorners.SLOT);
|
431
|
+
this.#slot = this.adornSlot(config);
|
432
|
+
const deferredNode = nodeShortcut.deferredNode;
|
433
|
+
this.#slot.addEventListener('click', () => {
|
434
|
+
deferredNode.resolve(node => {
|
435
|
+
void Common.Revealer.reveal(node);
|
436
|
+
});
|
437
|
+
});
|
438
|
+
this.#slot.addEventListener('mousedown', e => e.consume(), false);
|
439
|
+
}
|
440
|
+
}
|
441
|
+
|
425
442
|
private createSelection(): void {
|
426
443
|
const contentElement = this.contentElement;
|
427
444
|
if (!contentElement) {
|
@@ -1314,6 +1331,9 @@ export class ElementsTreeElement extends UI.TreeOutline.TreeElement {
|
|
1314
1331
|
if (!this.isClosingTagInternal && this.adornerContainer) {
|
1315
1332
|
this.contentElement.append(this.adornerContainer);
|
1316
1333
|
}
|
1334
|
+
if (this.#slot) {
|
1335
|
+
this.contentElement.append(this.#slot);
|
1336
|
+
}
|
1317
1337
|
this.highlightResult = [];
|
1318
1338
|
delete this.selectionElement;
|
1319
1339
|
delete this.hintElement;
|
@@ -1936,6 +1956,27 @@ export class ElementsTreeElement extends UI.TreeOutline.TreeElement {
|
|
1936
1956
|
return adorner;
|
1937
1957
|
}
|
1938
1958
|
|
1959
|
+
adornSlot({name}: {name: string}): Adorners.Adorner.Adorner {
|
1960
|
+
const linkIcon = new IconButton.Icon.Icon();
|
1961
|
+
linkIcon
|
1962
|
+
.data = {iconName: 'ic_show_node_16x16', color: 'var(--color-text-disabled)', width: '12px', height: '12px'};
|
1963
|
+
const slotText = document.createElement('span');
|
1964
|
+
slotText.textContent = name;
|
1965
|
+
const adornerContent = document.createElement('span');
|
1966
|
+
adornerContent.append(linkIcon);
|
1967
|
+
adornerContent.append(slotText);
|
1968
|
+
adornerContent.classList.add('adorner-with-icon');
|
1969
|
+
const adorner = new Adorners.Adorner.Adorner();
|
1970
|
+
adorner.data = {
|
1971
|
+
name,
|
1972
|
+
content: adornerContent,
|
1973
|
+
};
|
1974
|
+
this.adorners.push(adorner);
|
1975
|
+
ElementsPanel.instance().registerAdorner(adorner);
|
1976
|
+
this.updateAdorners();
|
1977
|
+
return adorner;
|
1978
|
+
}
|
1979
|
+
|
1939
1980
|
removeAdorner(adornerToRemove: Adorners.Adorner.Adorner): void {
|
1940
1981
|
const adorners = this.adorners;
|
1941
1982
|
ElementsPanel.instance().deregisterAdorner(adornerToRemove);
|
@@ -1180,6 +1180,11 @@ export class ElementsTreeOutline extends
|
|
1180
1180
|
!node.parentNode.parentNode) {
|
1181
1181
|
treeElement.setCollapsible(false);
|
1182
1182
|
}
|
1183
|
+
|
1184
|
+
if (node.hasAssignedSlot()) {
|
1185
|
+
treeElement.createSlotLink(node.assignedSlot);
|
1186
|
+
}
|
1187
|
+
|
1183
1188
|
treeElement.selectable = Boolean(this.selectEnabled);
|
1184
1189
|
return treeElement;
|
1185
1190
|
}
|
@@ -29,6 +29,7 @@ export enum RegisteredAdorners {
|
|
29
29
|
AD = 'ad',
|
30
30
|
SCROLL_SNAP = 'scroll-snap',
|
31
31
|
CONTAINER = 'container',
|
32
|
+
SLOT = 'slot',
|
32
33
|
}
|
33
34
|
|
34
35
|
// This enum-like const object serves as the authoritative registry for all the
|
@@ -65,6 +66,12 @@ export function getRegisteredAdorner(which: RegisteredAdorners): RegisteredAdorn
|
|
65
66
|
category: AdornerCategories.LAYOUT,
|
66
67
|
enabledByDefault: true,
|
67
68
|
};
|
69
|
+
case RegisteredAdorners.SLOT:
|
70
|
+
return {
|
71
|
+
name: 'slot',
|
72
|
+
category: AdornerCategories.LAYOUT,
|
73
|
+
enabledByDefault: true,
|
74
|
+
};
|
68
75
|
}
|
69
76
|
}
|
70
77
|
|
@@ -30,12 +30,14 @@
|
|
30
30
|
|
31
31
|
import * as Common from '../../core/common/common.js';
|
32
32
|
import * as i18n from '../../core/i18n/i18n.js';
|
33
|
+
import * as Root from '../../core/root/root.js';
|
33
34
|
import * as SDK from '../../core/sdk/sdk.js';
|
34
35
|
import * as NetworkForward from '../../panels/network/forward/forward.js';
|
35
36
|
import * as UI from '../../ui/legacy/legacy.js';
|
36
|
-
import * as NetworkComponents from './components/components.js';
|
37
37
|
|
38
|
+
import * as NetworkComponents from './components/components.js';
|
38
39
|
import {EventSourceMessagesView} from './EventSourceMessagesView.js';
|
40
|
+
|
39
41
|
import type {NetworkTimeCalculator} from './NetworkTimeCalculator.js';
|
40
42
|
import {RequestCookiesView} from './RequestCookiesView.js';
|
41
43
|
import {RequestHeadersView} from './RequestHeadersView.js';
|
@@ -130,6 +132,7 @@ export class NetworkItemView extends UI.TabbedPane.TabbedPane {
|
|
130
132
|
private requestInternal: SDK.NetworkRequest.NetworkRequest;
|
131
133
|
private readonly resourceViewTabSetting: Common.Settings.Setting<NetworkForward.UIRequestLocation.UIRequestTabs>;
|
132
134
|
private readonly headersView: RequestHeadersView;
|
135
|
+
private readonly headersViewComponent: NetworkComponents.RequestHeadersView.RequestHeadersView;
|
133
136
|
private payloadView: RequestPayloadView|null;
|
134
137
|
private readonly responseView: RequestResponseView|undefined;
|
135
138
|
private cookiesView: RequestCookiesView|null;
|
@@ -149,6 +152,12 @@ export class NetworkItemView extends UI.TabbedPane.TabbedPane {
|
|
149
152
|
this.appendTab(
|
150
153
|
NetworkForward.UIRequestLocation.UIRequestTabs.Headers, i18nString(UIStrings.headers), this.headersView,
|
151
154
|
i18nString(UIStrings.headers));
|
155
|
+
this.headersViewComponent = new NetworkComponents.RequestHeadersView.RequestHeadersView(request);
|
156
|
+
if (Root.Runtime.experiments.isEnabled(Root.Runtime.ExperimentName.HEADER_OVERRIDES)) {
|
157
|
+
this.appendTab(
|
158
|
+
NetworkForward.UIRequestLocation.UIRequestTabs.HeadersComponent, i18nString(UIStrings.headers),
|
159
|
+
this.headersViewComponent, i18nString(UIStrings.headers));
|
160
|
+
}
|
152
161
|
|
153
162
|
this.payloadView = null;
|
154
163
|
void this.maybeAppendPayloadPanel();
|
@@ -451,7 +451,7 @@ export class RequestHeadersView extends UI.Widget.VBox {
|
|
451
451
|
if (headersText) {
|
452
452
|
const toggleButton = this.createHeadersToggleButton(this.showRequestHeadersText);
|
453
453
|
toggleButton.addEventListener('click', this.toggleRequestHeadersText.bind(this), false);
|
454
|
-
treeElement.listItemElement.appendChild(toggleButton);
|
454
|
+
treeElement.listItemElement.querySelector('.headers-title-left')?.appendChild(toggleButton);
|
455
455
|
}
|
456
456
|
}
|
457
457
|
|
@@ -0,0 +1,78 @@
|
|
1
|
+
/*
|
2
|
+
* Copyright 2022 The Chromium Authors. All rights reserved.
|
3
|
+
* Use of this source code is governed by a BSD-style license that can be
|
4
|
+
* found in the LICENSE file.
|
5
|
+
*/
|
6
|
+
|
7
|
+
.header {
|
8
|
+
background-color: var(--color-background-elevation-1);
|
9
|
+
border-bottom: var(--legacy-divider-border);
|
10
|
+
border-top: var(--legacy-divider-border);
|
11
|
+
line-height: 25px;
|
12
|
+
padding: 0 5px;
|
13
|
+
}
|
14
|
+
|
15
|
+
.header::marker {
|
16
|
+
color: rgb(110 110 110); /* stylelint-disable-line plugin/use_theme_colors */
|
17
|
+
/* See: crbug.com/1152736 for color variable migration. */
|
18
|
+
font-size: 11px;
|
19
|
+
line-height: 1;
|
20
|
+
}
|
21
|
+
|
22
|
+
.header:focus {
|
23
|
+
background-color: var(--legacy-focus-bg-color);
|
24
|
+
}
|
25
|
+
|
26
|
+
.row {
|
27
|
+
display: flex;
|
28
|
+
line-height: 20px;
|
29
|
+
padding-left: 25px;
|
30
|
+
}
|
31
|
+
|
32
|
+
.row:first-of-type {
|
33
|
+
margin-top: 2px;
|
34
|
+
}
|
35
|
+
|
36
|
+
.row:last-child {
|
37
|
+
margin-bottom: 10px;
|
38
|
+
}
|
39
|
+
|
40
|
+
.header-name {
|
41
|
+
color: var(--color-primary);
|
42
|
+
font-weight: bold;
|
43
|
+
width: 160px;
|
44
|
+
flex-shrink: 0;
|
45
|
+
}
|
46
|
+
|
47
|
+
.header-value {
|
48
|
+
word-break: break-all;
|
49
|
+
user-select: text;
|
50
|
+
}
|
51
|
+
|
52
|
+
.green-circle::before,
|
53
|
+
.red-circle::before,
|
54
|
+
.yellow-circle::before {
|
55
|
+
content: "";
|
56
|
+
display: inline-block;
|
57
|
+
width: 12px;
|
58
|
+
height: 12px;
|
59
|
+
border-radius: 6px;
|
60
|
+
vertical-align: text-top;
|
61
|
+
margin-right: 2px;
|
62
|
+
}
|
63
|
+
|
64
|
+
.green-circle::before {
|
65
|
+
background-color: var(--color-accent-green);
|
66
|
+
}
|
67
|
+
|
68
|
+
.red-circle::before {
|
69
|
+
background-color: var(--color-accent-red);
|
70
|
+
}
|
71
|
+
|
72
|
+
.yellow-circle::before {
|
73
|
+
background-color: var(--issue-color-yellow);
|
74
|
+
}
|
75
|
+
|
76
|
+
.status-with-comment {
|
77
|
+
color: var(--color-text-secondary);
|
78
|
+
}
|
@@ -0,0 +1,262 @@
|
|
1
|
+
// Copyright 2022 The Chromium Authors. All rights reserved.
|
2
|
+
// Use of this source code is governed by a BSD-style license that can be
|
3
|
+
// found in the LICENSE file.
|
4
|
+
|
5
|
+
import * as Common from '../../../core/common/common.js';
|
6
|
+
import * as i18n from '../../../core/i18n/i18n.js';
|
7
|
+
import {assertNotNullOrUndefined} from '../../../core/platform/platform.js';
|
8
|
+
import * as SDK from '../../../core/sdk/sdk.js';
|
9
|
+
import * as ComponentHelpers from '../../../ui/components/helpers/helpers.js';
|
10
|
+
import * as UI from '../../../ui/legacy/legacy.js';
|
11
|
+
import * as LitHtml from '../../../ui/lit-html/lit-html.js';
|
12
|
+
|
13
|
+
import requestHeadersViewStyles from './RequestHeadersView.css.js';
|
14
|
+
|
15
|
+
const {render, html} = LitHtml;
|
16
|
+
|
17
|
+
const UIStrings = {
|
18
|
+
/**
|
19
|
+
*@description Text in Request Headers View of the Network panel
|
20
|
+
*/
|
21
|
+
fromMemoryCache: '(from memory cache)',
|
22
|
+
/**
|
23
|
+
*@description Text in Request Headers View of the Network panel
|
24
|
+
*/
|
25
|
+
fromServiceWorker: '(from `service worker`)',
|
26
|
+
/**
|
27
|
+
*@description Text in Request Headers View of the Network panel
|
28
|
+
*/
|
29
|
+
fromSignedexchange: '(from signed-exchange)',
|
30
|
+
/**
|
31
|
+
*@description Text in Request Headers View of the Network panel
|
32
|
+
*/
|
33
|
+
fromPrefetchCache: '(from prefetch cache)',
|
34
|
+
/**
|
35
|
+
*@description Text in Request Headers View of the Network panel
|
36
|
+
*/
|
37
|
+
fromDiskCache: '(from disk cache)',
|
38
|
+
/**
|
39
|
+
*@description Text in Request Headers View of the Network panel
|
40
|
+
*/
|
41
|
+
fromWebBundle: '(from Web Bundle)',
|
42
|
+
/**
|
43
|
+
*@description Section header for a list of the main aspects of a http request
|
44
|
+
*/
|
45
|
+
general: 'General',
|
46
|
+
/**
|
47
|
+
*@description The URL of a request
|
48
|
+
*/
|
49
|
+
requestUrl: 'Request URL',
|
50
|
+
/**
|
51
|
+
*@description The HTTP method of a request
|
52
|
+
*/
|
53
|
+
requestMethod: 'Request Method',
|
54
|
+
/**
|
55
|
+
*@description HTTP response code
|
56
|
+
*/
|
57
|
+
statusCode: 'Status Code',
|
58
|
+
/**
|
59
|
+
*@description Text in Network Log View Columns of the Network panel
|
60
|
+
*/
|
61
|
+
remoteAddress: 'Remote Address',
|
62
|
+
/**
|
63
|
+
*@description Text in Request Headers View of the Network panel
|
64
|
+
*/
|
65
|
+
referrerPolicy: 'Referrer Policy',
|
66
|
+
};
|
67
|
+
const str_ = i18n.i18n.registerUIStrings('panels/network/components/RequestHeadersView.ts', UIStrings);
|
68
|
+
const i18nString = i18n.i18n.getLocalizedString.bind(undefined, str_);
|
69
|
+
|
70
|
+
export class RequestHeadersView extends UI.Widget.VBox {
|
71
|
+
readonly #headersView = new RequestHeadersComponent();
|
72
|
+
readonly #request: SDK.NetworkRequest.NetworkRequest;
|
73
|
+
|
74
|
+
constructor(request: SDK.NetworkRequest.NetworkRequest) {
|
75
|
+
super();
|
76
|
+
this.#request = request;
|
77
|
+
this.contentElement.appendChild(this.#headersView);
|
78
|
+
}
|
79
|
+
|
80
|
+
wasShown(): void {
|
81
|
+
this.#request.addEventListener(SDK.NetworkRequest.Events.RemoteAddressChanged, this.#refreshHeadersView, this);
|
82
|
+
this.#request.addEventListener(SDK.NetworkRequest.Events.FinishedLoading, this.#refreshHeadersView, this);
|
83
|
+
this.#refreshHeadersView();
|
84
|
+
}
|
85
|
+
|
86
|
+
willHide(): void {
|
87
|
+
this.#request.removeEventListener(SDK.NetworkRequest.Events.RemoteAddressChanged, this.#refreshHeadersView, this);
|
88
|
+
this.#request.removeEventListener(SDK.NetworkRequest.Events.FinishedLoading, this.#refreshHeadersView, this);
|
89
|
+
}
|
90
|
+
|
91
|
+
#refreshHeadersView(): void {
|
92
|
+
this.#headersView.data = {
|
93
|
+
request: this.#request,
|
94
|
+
};
|
95
|
+
}
|
96
|
+
}
|
97
|
+
|
98
|
+
export interface RequestHeadersComponentData {
|
99
|
+
request: SDK.NetworkRequest.NetworkRequest;
|
100
|
+
}
|
101
|
+
|
102
|
+
export class RequestHeadersComponent extends HTMLElement {
|
103
|
+
static readonly litTagName = LitHtml.literal`devtools-request-headers`;
|
104
|
+
readonly #shadow = this.attachShadow({mode: 'open'});
|
105
|
+
#request?: Readonly<SDK.NetworkRequest.NetworkRequest>;
|
106
|
+
|
107
|
+
set data(data: RequestHeadersComponentData) {
|
108
|
+
this.#request = data.request;
|
109
|
+
this.#render();
|
110
|
+
}
|
111
|
+
|
112
|
+
connectedCallback(): void {
|
113
|
+
this.#shadow.adoptedStyleSheets = [requestHeadersViewStyles];
|
114
|
+
}
|
115
|
+
|
116
|
+
#render(): void {
|
117
|
+
assertNotNullOrUndefined(this.#request);
|
118
|
+
|
119
|
+
// Disabled until https://crbug.com/1079231 is fixed.
|
120
|
+
// clang-format off
|
121
|
+
render(html`
|
122
|
+
${this.#renderGeneralSection()}
|
123
|
+
`, this.#shadow, {host: this});
|
124
|
+
// clang-format on
|
125
|
+
}
|
126
|
+
|
127
|
+
#renderGeneralSection(): LitHtml.TemplateResult {
|
128
|
+
assertNotNullOrUndefined(this.#request);
|
129
|
+
|
130
|
+
let coloredCircleClassName = 'red-circle';
|
131
|
+
if (this.#request.statusCode < 300 || this.#request.statusCode === 304) {
|
132
|
+
coloredCircleClassName = 'green-circle';
|
133
|
+
} else if (this.#request.statusCode < 400) {
|
134
|
+
coloredCircleClassName = 'yellow-circle';
|
135
|
+
}
|
136
|
+
|
137
|
+
let statusText = this.#request.statusCode + ' ' + this.#request.statusText;
|
138
|
+
let statusTextHasComment = false;
|
139
|
+
if (this.#request.cachedInMemory()) {
|
140
|
+
statusText += ' ' + i18nString(UIStrings.fromMemoryCache);
|
141
|
+
statusTextHasComment = true;
|
142
|
+
} else if (this.#request.fetchedViaServiceWorker) {
|
143
|
+
statusText += ' ' + i18nString(UIStrings.fromServiceWorker);
|
144
|
+
statusTextHasComment = true;
|
145
|
+
} else if (this.#request.redirectSourceSignedExchangeInfoHasNoErrors()) {
|
146
|
+
statusText += ' ' + i18nString(UIStrings.fromSignedexchange);
|
147
|
+
statusTextHasComment = true;
|
148
|
+
} else if (this.#request.webBundleInnerRequestInfo()) {
|
149
|
+
statusText += ' ' + i18nString(UIStrings.fromWebBundle);
|
150
|
+
statusTextHasComment = true;
|
151
|
+
} else if (this.#request.fromPrefetchCache()) {
|
152
|
+
statusText += ' ' + i18nString(UIStrings.fromPrefetchCache);
|
153
|
+
statusTextHasComment = true;
|
154
|
+
} else if (this.#request.cached()) {
|
155
|
+
statusText += ' ' + i18nString(UIStrings.fromDiskCache);
|
156
|
+
statusTextHasComment = true;
|
157
|
+
}
|
158
|
+
|
159
|
+
// Disabled until https://crbug.com/1079231 is fixed.
|
160
|
+
// clang-format off
|
161
|
+
return html`
|
162
|
+
<${Category.litTagName} .data=${{name: 'general', title: i18nString(UIStrings.general)} as CategoryData}>
|
163
|
+
<div class="row">
|
164
|
+
<div class="header-name">${i18nString(UIStrings.requestUrl)}:</div>
|
165
|
+
<div class="header-value">${this.#request.url()}</div>
|
166
|
+
</div>
|
167
|
+
${this.#request.statusCode? html`
|
168
|
+
<div class="row">
|
169
|
+
<div class="header-name">${i18nString(UIStrings.requestMethod)}:</div>
|
170
|
+
<div class="header-value">${this.#request.requestMethod}</div>
|
171
|
+
</div>
|
172
|
+
<div class="row">
|
173
|
+
<div class="header-name">${i18nString(UIStrings.statusCode)}:</div>
|
174
|
+
<div class="header-value ${coloredCircleClassName} ${statusTextHasComment ? 'status-with-comment' : ''}">${statusText}</div>
|
175
|
+
</div>
|
176
|
+
` : ''}
|
177
|
+
${this.#request.remoteAddress()? html`
|
178
|
+
<div class="row">
|
179
|
+
<div class="header-name">${i18nString(UIStrings.remoteAddress)}:</div>
|
180
|
+
<div class="header-value">${this.#request.remoteAddress()}</div>
|
181
|
+
</div>
|
182
|
+
` : ''}
|
183
|
+
${this.#request.referrerPolicy()? html`
|
184
|
+
<div class="row">
|
185
|
+
<div class="header-name">${i18nString(UIStrings.referrerPolicy)}:</div>
|
186
|
+
<div class="header-value">${this.#request.referrerPolicy()}</div>
|
187
|
+
</div>
|
188
|
+
` : ''}
|
189
|
+
</${Category.litTagName}>
|
190
|
+
`;
|
191
|
+
// clang-format on
|
192
|
+
}
|
193
|
+
}
|
194
|
+
|
195
|
+
export interface CategoryData {
|
196
|
+
name: string;
|
197
|
+
title: Common.UIString.LocalizedString;
|
198
|
+
}
|
199
|
+
|
200
|
+
export class Category extends HTMLElement {
|
201
|
+
static readonly litTagName = LitHtml.literal`devtools-request-headers-category`;
|
202
|
+
readonly #shadow = this.attachShadow({mode: 'open'});
|
203
|
+
#expandedSetting?: Common.Settings.Setting<boolean>;
|
204
|
+
#title: Common.UIString.LocalizedString = Common.UIString.LocalizedEmptyString;
|
205
|
+
|
206
|
+
connectedCallback(): void {
|
207
|
+
this.#shadow.adoptedStyleSheets = [requestHeadersViewStyles];
|
208
|
+
}
|
209
|
+
|
210
|
+
set data(data: CategoryData) {
|
211
|
+
this.#title = data.title;
|
212
|
+
this.#expandedSetting =
|
213
|
+
Common.Settings.Settings.instance().createSetting('request-info-' + data.name + '-category-expanded', true);
|
214
|
+
this.#render();
|
215
|
+
}
|
216
|
+
|
217
|
+
#render(): void {
|
218
|
+
// Disabled until https://crbug.com/1079231 is fixed.
|
219
|
+
// clang-format off
|
220
|
+
render(html`
|
221
|
+
<details ?open=${this.#expandedSetting ? this.#expandedSetting.get() : true} @toggle=${this.#onToggle}>
|
222
|
+
<summary class="header" @keydown=${this.#onSummaryKeyDown}>${this.#title}</summary>
|
223
|
+
<slot></slot>
|
224
|
+
</details>
|
225
|
+
`, this.#shadow, {host: this});
|
226
|
+
// clang-format on
|
227
|
+
}
|
228
|
+
|
229
|
+
#onSummaryKeyDown(event: KeyboardEvent): void {
|
230
|
+
if (!event.target) {
|
231
|
+
return;
|
232
|
+
}
|
233
|
+
const summaryElement = event.target as HTMLElement;
|
234
|
+
const detailsElement = summaryElement.parentElement as HTMLDetailsElement;
|
235
|
+
if (!detailsElement) {
|
236
|
+
throw new Error('<details> element is not found for a <summary> element');
|
237
|
+
}
|
238
|
+
switch (event.key) {
|
239
|
+
case 'ArrowLeft':
|
240
|
+
detailsElement.open = false;
|
241
|
+
break;
|
242
|
+
case 'ArrowRight':
|
243
|
+
detailsElement.open = true;
|
244
|
+
break;
|
245
|
+
}
|
246
|
+
}
|
247
|
+
|
248
|
+
#onToggle(event: Event): void {
|
249
|
+
this.#expandedSetting?.set((event.target as HTMLDetailsElement).open);
|
250
|
+
}
|
251
|
+
}
|
252
|
+
|
253
|
+
ComponentHelpers.CustomElements.defineComponent('devtools-request-headers', RequestHeadersComponent);
|
254
|
+
ComponentHelpers.CustomElements.defineComponent('devtools-request-headers-category', Category);
|
255
|
+
|
256
|
+
declare global {
|
257
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
258
|
+
interface HTMLElementTagNameMap {
|
259
|
+
'devtools-request-headers': RequestHeadersComponent;
|
260
|
+
'devtools-request-headers-category': Category;
|
261
|
+
}
|
262
|
+
}
|
@@ -2,8 +2,10 @@
|
|
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
4
|
|
5
|
+
import * as RequestHeadersView from './RequestHeadersView.js';
|
5
6
|
import * as RequestTrustTokensView from './RequestTrustTokensView.js';
|
6
7
|
|
7
8
|
export {
|
9
|
+
RequestHeadersView,
|
8
10
|
RequestTrustTokensView,
|
9
11
|
};
|
@@ -70,7 +70,7 @@
|
|
70
70
|
flex: none;
|
71
71
|
}
|
72
72
|
|
73
|
-
.network-log-grid.data-grid
|
73
|
+
.network-log-grid.data-grid tbody {
|
74
74
|
background: transparent;
|
75
75
|
}
|
76
76
|
|
@@ -397,8 +397,8 @@
|
|
397
397
|
/* This is part of the large color block declared above, but should not be
|
398
398
|
extracted out. */
|
399
399
|
/* stylelint-disable no-descending-specificity */
|
400
|
-
.network-log-grid.data-grid
|
401
|
-
.network-log-grid.data-grid:focus
|
400
|
+
.network-log-grid.data-grid tbody tr.revealed.selected,
|
401
|
+
.network-log-grid.data-grid:focus tbody tr.revealed.selected,
|
402
402
|
.network-log-grid.data-grid:focus tr.selected .network-dim-cell,
|
403
403
|
.network-log-grid.data-grid tr.selected .network-dim-cell,
|
404
404
|
.network-log-grid.data-grid:focus tr.selected .initiator-column .devtools-link,
|
@@ -86,6 +86,12 @@ const UIStrings = {
|
|
86
86
|
*@description Text in Call Stack Sidebar Pane of the Sources panel when some call frames have warnings
|
87
87
|
*/
|
88
88
|
callFrameWarnings: 'Some call frames have warnings',
|
89
|
+
/**
|
90
|
+
* @description A contex menu item in the Call Stack Sidebar Pane. "Restart" is a verb and
|
91
|
+
* "frame" is a noun. "Frame" refers to an individual item in the call stack, i.e. a call frame.
|
92
|
+
* The user opens this context menu by selecting a specific call frame in the call stack sidebar pane.
|
93
|
+
*/
|
94
|
+
restartFrame: 'Restart frame',
|
89
95
|
};
|
90
96
|
const str_ = i18n.i18n.registerUIStrings('panels/sources/CallStackSidebarPane.ts', UIStrings);
|
91
97
|
const i18nString = i18n.i18n.getLocalizedString.bind(undefined, str_);
|
@@ -384,6 +390,13 @@ export class CallStackSidebarPane extends UI.View.SimpleView implements UI.Conte
|
|
384
390
|
return;
|
385
391
|
}
|
386
392
|
const contextMenu = new UI.ContextMenu.ContextMenu(event);
|
393
|
+
const debuggerCallFrame = itemToCallFrame.get(item);
|
394
|
+
if (debuggerCallFrame) {
|
395
|
+
contextMenu.defaultSection().appendItem(i18nString(UIStrings.restartFrame), () => {
|
396
|
+
Host.userMetrics.actionTaken(Host.UserMetrics.Action.StackFrameRestarted);
|
397
|
+
void debuggerCallFrame.restart();
|
398
|
+
}, !debuggerCallFrame.canBeRestarted);
|
399
|
+
}
|
387
400
|
contextMenu.defaultSection().appendItem(i18nString(UIStrings.copyStackTrace), this.copyStackTrace.bind(this));
|
388
401
|
if (item.uiLocation) {
|
389
402
|
this.appendIgnoreListURLContextMenuItems(contextMenu, item.uiLocation.uiSourceCode);
|
@@ -311,13 +311,14 @@ export class OpenLinearMemoryInspector extends UI.Widget.VBox implements UI.Cont
|
|
311
311
|
}
|
312
312
|
|
313
313
|
private isMemoryObjectProperty(obj: SDK.RemoteObject.RemoteObject): boolean {
|
314
|
-
const
|
314
|
+
const isWasmOrBuffer = obj.type === 'object' && obj.subtype &&
|
315
315
|
LinearMemoryInspector.LinearMemoryInspectorController.ACCEPTED_MEMORY_TYPES.includes(obj.subtype);
|
316
|
-
if (
|
316
|
+
if (isWasmOrBuffer) {
|
317
317
|
return true;
|
318
318
|
}
|
319
319
|
|
320
|
-
|
320
|
+
const isWasmDWARF = obj instanceof Bindings.DebuggerLanguagePlugins.ValueNode;
|
321
|
+
if (isWasmDWARF) {
|
321
322
|
return obj.inspectableAddress !== undefined;
|
322
323
|
}
|
323
324
|
|
@@ -253,7 +253,6 @@ export function baseConfiguration(text: string): CM.Extension {
|
|
253
253
|
indentUnit.instance(),
|
254
254
|
CM.Prec.lowest(CM.EditorView.contentAttributes.of({'aria-label': i18nString(UIStrings.codeEditor)})),
|
255
255
|
detectLineSeparator(text),
|
256
|
-
autocompletion,
|
257
256
|
CM.tooltips({
|
258
257
|
tooltipSpace: getTooltipSpace,
|
259
258
|
}),
|
@@ -130,6 +130,7 @@ export class DataGridImpl<T> extends Common.ObjectWrapper.ObjectWrapper<EventTyp
|
|
130
130
|
[x: string]: Element,
|
131
131
|
};
|
132
132
|
scrollContainerInternal: Element;
|
133
|
+
private dataContainerInternal: Element;
|
133
134
|
private readonly dataTable: Element;
|
134
135
|
protected inline: boolean;
|
135
136
|
private columnsArray: ColumnDescriptor[];
|
@@ -190,8 +191,9 @@ export class DataGridImpl<T> extends Common.ObjectWrapper.ObjectWrapper<EventTyp
|
|
190
191
|
|
191
192
|
this.dataTableHeaders = {};
|
192
193
|
|
193
|
-
this.
|
194
|
-
this.dataTable = this.
|
194
|
+
this.dataContainerInternal = this.element.createChild('div', 'data-container');
|
195
|
+
this.dataTable = this.dataContainerInternal.createChild('table', 'data');
|
196
|
+
this.scrollContainerInternal = this.dataContainerInternal;
|
195
197
|
|
196
198
|
// FIXME: Add a createCallback which is different from editCallback and has different
|
197
199
|
// behavior when creating a new node.
|
@@ -1539,6 +1541,18 @@ export class DataGridImpl<T> extends Common.ObjectWrapper.ObjectWrapper<EventTyp
|
|
1539
1541
|
return this.topFillerRow;
|
1540
1542
|
}
|
1541
1543
|
|
1544
|
+
// Note on the following methods:
|
1545
|
+
// The header row is a child of the scrollable container, and uses position: sticky
|
1546
|
+
// so it can visually obscure other elements below it in the grid. We need to manually
|
1547
|
+
// subtract the header's height when calculating the actual client area in which
|
1548
|
+
// data rows are visible. However, if a caller has set a different scroll container
|
1549
|
+
// then we report 0 height and the caller is expected to ensure their chosen scroll
|
1550
|
+
// container's height matches the visible scrollable data area as seen by the user.
|
1551
|
+
|
1552
|
+
protected headerHeightInScroller(): number {
|
1553
|
+
return this.scrollContainer === this.dataContainerInternal ? this.headerHeight() : 0;
|
1554
|
+
}
|
1555
|
+
|
1542
1556
|
protected headerHeight(): number {
|
1543
1557
|
return this.dataTableHeadInternal.offsetHeight;
|
1544
1558
|
}
|