chrome-devtools-frontend 1.0.1008646 → 1.0.1009515
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/.vscode/devtools-workspace-launch.json +1 -1
- package/config/gni/devtools_grd_files.gni +0 -1
- package/extension-api/ExtensionAPI.d.ts +4 -2
- package/front_end/core/sdk/Target.ts +2 -2
- package/front_end/legacy_test_runner/elements_test_runner/ElementsTestRunner.js +8 -8
- package/front_end/models/bindings/ResourceMapping.ts +43 -10
- package/front_end/models/extensions/ExtensionAPI.ts +4 -2
- package/front_end/models/extensions/ExtensionServer.ts +3 -3
- package/front_end/models/extensions/RecorderExtensionEndpoint.ts +7 -1
- package/front_end/models/logs/NetworkLog.ts +18 -8
- package/front_end/models/source_map_scopes/NamesResolver.ts +7 -2
- package/front_end/panels/elements/ComputedStyleWidget.ts +190 -221
- package/front_end/panels/elements/ElementsTreeElement.ts +101 -90
- package/front_end/panels/elements/StylePropertyTreeElement.ts +1 -1
- package/front_end/panels/elements/components/ComputedStyleProperty.ts +14 -2
- package/front_end/panels/elements/components/ComputedStyleTrace.ts +4 -1
- package/front_end/panels/elements/components/computedStyleProperty.css +15 -6
- package/front_end/panels/elements/components/computedStyleTrace.css +12 -1
- package/front_end/panels/elements/computedStyleSidebarPane.css +0 -5
- package/front_end/panels/network/NetworkSearchScope.ts +1 -1
- package/front_end/ui/components/docs/computed_style_property/basic.ts +12 -10
- package/front_end/ui/components/docs/computed_style_property/traceable.ts +13 -10
- package/front_end/ui/legacy/components/data_grid/DataGrid.ts +3 -5
- package/package.json +1 -1
- package/front_end/panels/elements/computedStyleWidgetTree.css +0 -66
@@ -984,7 +984,6 @@ grd_files_debug_sources = [
|
|
984
984
|
"front_end/panels/elements/components/queryContainer.css.js",
|
985
985
|
"front_end/panels/elements/components/stylePropertyEditor.css.js",
|
986
986
|
"front_end/panels/elements/computedStyleSidebarPane.css.js",
|
987
|
-
"front_end/panels/elements/computedStyleWidgetTree.css.js",
|
988
987
|
"front_end/panels/elements/domLinkifier.css.js",
|
989
988
|
"front_end/panels/elements/elementStatePaneWidget.css.js",
|
990
989
|
"front_end/panels/elements/elementsPanel.css.js",
|
@@ -172,7 +172,8 @@ export namespace Chrome {
|
|
172
172
|
}
|
173
173
|
|
174
174
|
export interface RecorderExtensionPlugin {
|
175
|
-
stringify(
|
175
|
+
stringify(recording: Record<string, any>): Promise<string>;
|
176
|
+
stringifyStep(step: Record<string, any>): Promise<string>;
|
176
177
|
}
|
177
178
|
|
178
179
|
export interface LanguageExtensionPlugin {
|
@@ -278,7 +279,8 @@ export namespace Chrome {
|
|
278
279
|
}
|
279
280
|
|
280
281
|
export interface RecorderExtensions {
|
281
|
-
registerRecorderExtensionPlugin(plugin: RecorderExtensionPlugin, pluginName: string):
|
282
|
+
registerRecorderExtensionPlugin(plugin: RecorderExtensionPlugin, pluginName: string, mimeType: string):
|
283
|
+
Promise<void>;
|
282
284
|
unregisterRecorderExtensionPlugin(plugin: RecorderExtensionPlugin): Promise<void>;
|
283
285
|
}
|
284
286
|
|
@@ -61,8 +61,8 @@ export class Target extends ProtocolClient.InspectorBackend.TargetBase {
|
|
61
61
|
Capability.IO | Capability.Media | Capability.Inspector;
|
62
62
|
break;
|
63
63
|
case Type.Worker:
|
64
|
-
this.#capabilitiesMask =
|
65
|
-
Capability.
|
64
|
+
this.#capabilitiesMask = Capability.JS | Capability.Log | Capability.Network | Capability.Target |
|
65
|
+
Capability.IO | Capability.Media | Capability.Emulation;
|
66
66
|
break;
|
67
67
|
case Type.Node:
|
68
68
|
this.#capabilitiesMask = Capability.JS;
|
@@ -183,20 +183,20 @@ ElementsTestRunner.computedStyleWidget = function() {
|
|
183
183
|
|
184
184
|
ElementsTestRunner.dumpComputedStyle = async function(doNotAutoExpand, printInnerText) {
|
185
185
|
const computed = ElementsTestRunner.computedStyleWidget();
|
186
|
-
const treeOutline = computed.propertiesOutline;
|
187
|
-
const children = treeOutline.
|
186
|
+
const treeOutline = computed.propertiesOutline.querySelector('devtools-tree-outline');
|
187
|
+
const children = treeOutline.shadowRoot.querySelector('[role="treeitem"]');
|
188
188
|
|
189
189
|
for (const treeElement of children) {
|
190
|
-
const property =
|
191
|
-
|
190
|
+
const property = treeElement.querySelector('devtools-computed-style-property')?.shadowRoot;
|
191
|
+
const propertyName = text(property?.querySelector('.webkit-css-property'));
|
192
|
+
const propertyValue = text(property?.querySelector('.value'));
|
193
|
+
if (!property || propertyName === 'width' || propertyName === 'height') {
|
192
194
|
continue;
|
193
195
|
}
|
194
196
|
|
195
|
-
const propertyName = text(treeElement.title.querySelector('.webkit-css-property'));
|
196
|
-
const propertyValue = text(treeElement.title.querySelector('.value'));
|
197
197
|
TestRunner.addResult(`${propertyName}: ${propertyValue};`);
|
198
198
|
|
199
|
-
if (doNotAutoExpand && !treeElement.
|
199
|
+
if (doNotAutoExpand && !treeElement.ariaExpanded) {
|
200
200
|
continue;
|
201
201
|
}
|
202
202
|
|
@@ -211,7 +211,7 @@ ElementsTestRunner.dumpComputedStyle = async function(doNotAutoExpand, printInne
|
|
211
211
|
dumpText += text(trace.querySelector('.value'));
|
212
212
|
dumpText += ' - ';
|
213
213
|
dumpText += text(trace.shadowRoot.querySelector('.trace-selector'));
|
214
|
-
const link = trace.querySelector('
|
214
|
+
const link = trace.shadowRoot.querySelector('.trace-link');
|
215
215
|
|
216
216
|
if (link) {
|
217
217
|
dumpText += ' ' + await extractLinkText(link);
|
@@ -14,7 +14,7 @@ import {DebuggerWorkspaceBinding} from './DebuggerWorkspaceBinding.js';
|
|
14
14
|
import {NetworkProject} from './NetworkProject.js';
|
15
15
|
import {resourceMetadata} from './ResourceUtils.js';
|
16
16
|
|
17
|
-
let resourceMappingInstance: ResourceMapping;
|
17
|
+
let resourceMappingInstance: ResourceMapping|undefined;
|
18
18
|
|
19
19
|
const styleSheetOffsetMap = new WeakMap<SDK.CSSStyleSheetHeader.CSSStyleSheetHeader, TextUtils.TextRange.TextRange>();
|
20
20
|
const scriptOffsetMap = new WeakMap<SDK.Script.Script, TextUtils.TextRange.TextRange>();
|
@@ -47,6 +47,10 @@ export class ResourceMapping implements SDK.TargetManager.SDKModelObserver<SDK.R
|
|
47
47
|
return resourceMappingInstance;
|
48
48
|
}
|
49
49
|
|
50
|
+
static removeInstance(): void {
|
51
|
+
resourceMappingInstance = undefined;
|
52
|
+
}
|
53
|
+
|
50
54
|
modelAdded(resourceTreeModel: SDK.ResourceTreeModel.ResourceTreeModel): void {
|
51
55
|
const info = new ModelInfo(this.#workspace, resourceTreeModel);
|
52
56
|
this.#modelToInfo.set(resourceTreeModel, info);
|
@@ -97,17 +101,27 @@ export class ResourceMapping implements SDK.TargetManager.SDKModelObserver<SDK.R
|
|
97
101
|
if (!info) {
|
98
102
|
return null;
|
99
103
|
}
|
100
|
-
const
|
104
|
+
const embedderName = script.embedderName();
|
105
|
+
if (!embedderName) {
|
106
|
+
return null;
|
107
|
+
}
|
108
|
+
const uiSourceCode = info.getProject().uiSourceCodeForURL(embedderName);
|
101
109
|
if (!uiSourceCode) {
|
102
110
|
return null;
|
103
111
|
}
|
104
112
|
const offset = scriptOffsetMap.get(script) ||
|
105
113
|
TextUtils.TextRange.TextRange.createFromLocation(script.lineOffset, script.columnOffset);
|
106
|
-
|
114
|
+
let lineNumber = jsLocation.lineNumber + offset.startLine - script.lineOffset;
|
107
115
|
let columnNumber = jsLocation.columnNumber;
|
108
116
|
if (jsLocation.lineNumber === script.lineOffset) {
|
109
117
|
columnNumber += offset.startColumn - script.columnOffset;
|
110
118
|
}
|
119
|
+
if (script.hasSourceURL) {
|
120
|
+
if (lineNumber === 0) {
|
121
|
+
columnNumber += script.columnOffset;
|
122
|
+
}
|
123
|
+
lineNumber += script.lineOffset;
|
124
|
+
}
|
111
125
|
return uiSourceCode.uiLocation(lineNumber, columnNumber);
|
112
126
|
}
|
113
127
|
|
@@ -124,14 +138,33 @@ export class ResourceMapping implements SDK.TargetManager.SDKModelObserver<SDK.R
|
|
124
138
|
if (!debuggerModel) {
|
125
139
|
return [];
|
126
140
|
}
|
127
|
-
const
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
141
|
+
const locations = [];
|
142
|
+
for (const script of debuggerModel.scripts()) {
|
143
|
+
if (script.embedderName() !== uiSourceCode.url()) {
|
144
|
+
continue;
|
145
|
+
}
|
146
|
+
const {startLine, startColumn} = scriptOffsetMap.get(script) ||
|
147
|
+
TextUtils.TextRange.TextRange.createFromLocation(script.lineOffset, script.columnOffset);
|
148
|
+
if (lineNumber < startLine || (lineNumber === startLine && columnNumber < startColumn)) {
|
149
|
+
continue;
|
150
|
+
}
|
151
|
+
const endLine = startLine + (script.endLine - script.lineOffset);
|
152
|
+
const endColumn =
|
153
|
+
startLine === endLine ? startColumn + (script.endColumn - script.columnOffset) : script.endColumn;
|
154
|
+
if (lineNumber > endLine || (lineNumber === endLine && columnNumber > endColumn)) {
|
155
|
+
continue;
|
156
|
+
}
|
157
|
+
let scriptLineNumber = lineNumber;
|
158
|
+
let scriptColumnNumber = columnNumber;
|
159
|
+
if (script.hasSourceURL) {
|
160
|
+
scriptLineNumber -= startLine;
|
161
|
+
if (scriptLineNumber === 0) {
|
162
|
+
scriptColumnNumber -= startColumn;
|
163
|
+
}
|
132
164
|
}
|
165
|
+
locations.push(debuggerModel.createRawLocation(script, scriptLineNumber, scriptColumnNumber));
|
133
166
|
}
|
134
|
-
return
|
167
|
+
return locations;
|
135
168
|
}
|
136
169
|
|
137
170
|
uiLocationToCSSLocations(uiLocation: Workspace.UISourceCode.UILocation): SDK.CSSModel.CSSLocation[] {
|
@@ -341,7 +374,7 @@ class Binding implements TextUtils.ContentProvider.ContentProvider {
|
|
341
374
|
if (!debuggerModel) {
|
342
375
|
return [];
|
343
376
|
}
|
344
|
-
return debuggerModel.
|
377
|
+
return debuggerModel.scripts().filter(script => script.embedderName() === this.#uiSourceCode.url());
|
345
378
|
}
|
346
379
|
|
347
380
|
async styleSheetChanged(stylesheet: SDK.CSSStyleSheetHeader.CSSStyleSheetHeader, edit: SDK.CSSModel.Edit|null):
|
@@ -132,6 +132,7 @@ export namespace PrivateAPI {
|
|
132
132
|
type RegisterRecorderExtensionPluginRequest = {
|
133
133
|
command: Commands.RegisterRecorderExtensionPlugin,
|
134
134
|
pluginName: string,
|
135
|
+
mimeType: string,
|
135
136
|
port: MessagePort,
|
136
137
|
};
|
137
138
|
type SubscribeRequest = {command: Commands.Subscribe, type: string};
|
@@ -705,8 +706,8 @@ self.injectedExtensionAPI = function(
|
|
705
706
|
(RecorderServicesAPIImpl.prototype as
|
706
707
|
Pick<APIImpl.RecorderExtensions, 'registerRecorderExtensionPlugin'|'unregisterRecorderExtensionPlugin'>) = {
|
707
708
|
registerRecorderExtensionPlugin: async function(
|
708
|
-
this: APIImpl.RecorderExtensions, plugin: PublicAPI.Chrome.DevTools.RecorderExtensionPlugin,
|
709
|
-
|
709
|
+
this: APIImpl.RecorderExtensions, plugin: PublicAPI.Chrome.DevTools.RecorderExtensionPlugin, pluginName: string,
|
710
|
+
mimeType: string): Promise<void> {
|
710
711
|
if (this._plugins.has(plugin)) {
|
711
712
|
throw new Error(`Tried to register plugin '${pluginName}' twice`);
|
712
713
|
}
|
@@ -734,6 +735,7 @@ self.injectedExtensionAPI = function(
|
|
734
735
|
{
|
735
736
|
command: PrivateAPI.Commands.RegisterRecorderExtensionPlugin,
|
736
737
|
pluginName,
|
738
|
+
mimeType,
|
737
739
|
port: channel.port2,
|
738
740
|
},
|
739
741
|
() => resolve(), [channel.port2]);
|
@@ -222,10 +222,10 @@ export class ExtensionServer extends Common.ObjectWrapper.ObjectWrapper<EventTyp
|
|
222
222
|
private registerRecorderExtensionEndpoint(
|
223
223
|
message: PrivateAPI.ExtensionServerRequestMessage, _shared_port: MessagePort): Record {
|
224
224
|
if (message.command !== PrivateAPI.Commands.RegisterRecorderExtensionPlugin) {
|
225
|
-
return this.status.E_BADARG('command', `expected ${PrivateAPI.Commands.
|
225
|
+
return this.status.E_BADARG('command', `expected ${PrivateAPI.Commands.RegisterRecorderExtensionPlugin}`);
|
226
226
|
}
|
227
|
-
const {pluginName, port} = message;
|
228
|
-
RecorderPluginManager.instance().addPlugin(new RecorderExtensionEndpoint(pluginName, port));
|
227
|
+
const {pluginName, mimeType, port} = message;
|
228
|
+
RecorderPluginManager.instance().addPlugin(new RecorderExtensionEndpoint(pluginName, mimeType, port));
|
229
229
|
return this.status.OK();
|
230
230
|
}
|
231
231
|
|
@@ -8,16 +8,22 @@ import {RecorderPluginManager} from './RecorderPluginManager.js';
|
|
8
8
|
|
9
9
|
export class RecorderExtensionEndpoint extends ExtensionEndpoint {
|
10
10
|
private readonly name: string;
|
11
|
+
private readonly mimeType: string;
|
11
12
|
|
12
|
-
constructor(name: string, port: MessagePort) {
|
13
|
+
constructor(name: string, mimeType: string, port: MessagePort) {
|
13
14
|
super(port);
|
14
15
|
this.name = name;
|
16
|
+
this.mimeType = mimeType;
|
15
17
|
}
|
16
18
|
|
17
19
|
getName(): string {
|
18
20
|
return this.name;
|
19
21
|
}
|
20
22
|
|
23
|
+
getMimeType(): string {
|
24
|
+
return this.mimeType;
|
25
|
+
}
|
26
|
+
|
21
27
|
protected handleEvent({event}: {event: string}): void {
|
22
28
|
switch (event) {
|
23
29
|
case PrivateAPI.RecorderExtensionPluginEvents.UnregisteredRecorderExtensionPlugin: {
|
@@ -196,11 +196,13 @@ export class NetworkLog extends Common.ObjectWrapper.ObjectWrapper<EventTypes> i
|
|
196
196
|
return initiatorInfo;
|
197
197
|
}
|
198
198
|
|
199
|
-
initiatorInfoForRequest(request: SDK.NetworkRequest.NetworkRequest):
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
199
|
+
static initiatorInfoForRequest(request: SDK.NetworkRequest.NetworkRequest, existingInitiatorData?: InitiatorData):
|
200
|
+
InitiatorInfo {
|
201
|
+
const initiatorInfo: InitiatorData = existingInitiatorData || {
|
202
|
+
info: null,
|
203
|
+
chain: null,
|
204
|
+
request: undefined,
|
205
|
+
};
|
204
206
|
|
205
207
|
let type = SDK.NetworkRequest.InitiatorType.Other;
|
206
208
|
let url = Platform.DevToolsPath.EmptyUrlString;
|
@@ -253,11 +255,19 @@ export class NetworkLog extends Common.ObjectWrapper.ObjectWrapper<EventTypes> i
|
|
253
255
|
url = initiator.url as Platform.DevToolsPath.UrlString || Platform.DevToolsPath.EmptyUrlString;
|
254
256
|
}
|
255
257
|
}
|
256
|
-
|
257
258
|
initiatorInfo.info = {type, url, lineNumber, columnNumber, scriptId, stack: initiatorStack, initiatorRequest};
|
258
259
|
return initiatorInfo.info;
|
259
260
|
}
|
260
261
|
|
262
|
+
initiatorInfoForRequest(request: SDK.NetworkRequest.NetworkRequest): InitiatorInfo {
|
263
|
+
const initiatorInfo = this.initializeInitiatorSymbolIfNeeded(request);
|
264
|
+
if (initiatorInfo.info) {
|
265
|
+
return initiatorInfo.info;
|
266
|
+
}
|
267
|
+
|
268
|
+
return NetworkLog.initiatorInfoForRequest(request, initiatorInfo);
|
269
|
+
}
|
270
|
+
|
261
271
|
initiatorGraphForRequest(request: SDK.NetworkRequest.NetworkRequest): InitiatorGraph {
|
262
272
|
const initiated = new Map<SDK.NetworkRequest.NetworkRequest, SDK.NetworkRequest.NetworkRequest>();
|
263
273
|
const networkManager = SDK.NetworkManager.NetworkManager.forRequest(request);
|
@@ -584,7 +594,7 @@ export type EventTypes = {
|
|
584
594
|
[Events.RequestUpdated]: SDK.NetworkRequest.NetworkRequest,
|
585
595
|
};
|
586
596
|
|
587
|
-
interface InitiatorData {
|
597
|
+
export interface InitiatorData {
|
588
598
|
info: InitiatorInfo|null;
|
589
599
|
chain: Set<SDK.NetworkRequest.NetworkRequest>|null;
|
590
600
|
request?: SDK.NetworkRequest.NetworkRequest|null;
|
@@ -595,7 +605,7 @@ export interface InitiatorGraph {
|
|
595
605
|
initiated: Map<SDK.NetworkRequest.NetworkRequest, SDK.NetworkRequest.NetworkRequest>;
|
596
606
|
}
|
597
607
|
|
598
|
-
interface InitiatorInfo {
|
608
|
+
export interface InitiatorInfo {
|
599
609
|
type: SDK.NetworkRequest.InitiatorType;
|
600
610
|
// generally this is a url but can also contain "<anonymous>"
|
601
611
|
url: Platform.DevToolsPath.UrlString;
|
@@ -51,8 +51,13 @@ const computeScopeTree = async function(functionScope: SDK.DebuggerModel.ScopeCh
|
|
51
51
|
functionEndLocation.columnNumber);
|
52
52
|
const scopeText = text.extract(scopeRange);
|
53
53
|
const scopeStart = text.toSourceRange(scopeRange).offset;
|
54
|
-
|
55
|
-
|
54
|
+
let prefix = 'function fui';
|
55
|
+
let scopeTree = await Formatter.FormatterWorkerPool.formatterWorkerPool().javaScriptScopeTree(prefix + scopeText);
|
56
|
+
if (!scopeTree) {
|
57
|
+
// Try to parse the function as an arrow function.
|
58
|
+
prefix = 'let fui = ';
|
59
|
+
scopeTree = await Formatter.FormatterWorkerPool.formatterWorkerPool().javaScriptScopeTree(prefix + scopeText);
|
60
|
+
}
|
56
61
|
if (!scopeTree) {
|
57
62
|
return null;
|
58
63
|
}
|