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.
Files changed (25) hide show
  1. package/.vscode/devtools-workspace-launch.json +1 -1
  2. package/config/gni/devtools_grd_files.gni +0 -1
  3. package/extension-api/ExtensionAPI.d.ts +4 -2
  4. package/front_end/core/sdk/Target.ts +2 -2
  5. package/front_end/legacy_test_runner/elements_test_runner/ElementsTestRunner.js +8 -8
  6. package/front_end/models/bindings/ResourceMapping.ts +43 -10
  7. package/front_end/models/extensions/ExtensionAPI.ts +4 -2
  8. package/front_end/models/extensions/ExtensionServer.ts +3 -3
  9. package/front_end/models/extensions/RecorderExtensionEndpoint.ts +7 -1
  10. package/front_end/models/logs/NetworkLog.ts +18 -8
  11. package/front_end/models/source_map_scopes/NamesResolver.ts +7 -2
  12. package/front_end/panels/elements/ComputedStyleWidget.ts +190 -221
  13. package/front_end/panels/elements/ElementsTreeElement.ts +101 -90
  14. package/front_end/panels/elements/StylePropertyTreeElement.ts +1 -1
  15. package/front_end/panels/elements/components/ComputedStyleProperty.ts +14 -2
  16. package/front_end/panels/elements/components/ComputedStyleTrace.ts +4 -1
  17. package/front_end/panels/elements/components/computedStyleProperty.css +15 -6
  18. package/front_end/panels/elements/components/computedStyleTrace.css +12 -1
  19. package/front_end/panels/elements/computedStyleSidebarPane.css +0 -5
  20. package/front_end/panels/network/NetworkSearchScope.ts +1 -1
  21. package/front_end/ui/components/docs/computed_style_property/basic.ts +12 -10
  22. package/front_end/ui/components/docs/computed_style_property/traceable.ts +13 -10
  23. package/front_end/ui/legacy/components/data_grid/DataGrid.ts +3 -5
  24. package/package.json +1 -1
  25. package/front_end/panels/elements/computedStyleWidgetTree.css +0 -66
@@ -8,7 +8,7 @@
8
8
  "preLaunchTask": "1-build_Debug",
9
9
  "runtimeExecutable": "/usr/bin/npm",
10
10
  "runtimeArgs": ["run", "unittest"],
11
- "port": 9222,
11
+ "port": 7722,
12
12
  "timeout": 30000,
13
13
  "browserLaunchLocation": "workspace",
14
14
  "outputCapture": "std",
@@ -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(obj: Record<string, any>): Promise<string>;
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): Promise<void>;
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.JS | Capability.Log | Capability.Network | Capability.Target | Capability.IO | Capability.Media;
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.rootElement().children();
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 = computed.propertyByTreeElement.get(treeElement);
191
- if (!property || property.name === 'width' || property.name === 'height') {
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.expanded) {
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('[slot="trace-link"]');
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 uiSourceCode = info.getProject().uiSourceCodeForURL(script.sourceURL);
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
- const lineNumber = jsLocation.lineNumber + offset.startLine - script.lineOffset;
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 location = debuggerModel.createRawLocationByURL(uiSourceCode.url(), lineNumber, columnNumber);
128
- if (location) {
129
- const script = location.script();
130
- if (script && script.containsLocation(lineNumber, columnNumber)) {
131
- return [location];
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.scriptsForSourceURL(this.#uiSourceCode.url());
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
- pluginName: string): Promise<void> {
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.Subscribe}`);
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): InitiatorInfo {
200
- const initiatorInfo = this.initializeInitiatorSymbolIfNeeded(request);
201
- if (initiatorInfo.info) {
202
- return initiatorInfo.info;
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
- const prefix = 'function fui';
55
- const scopeTree = await Formatter.FormatterWorkerPool.formatterWorkerPool().javaScriptScopeTree(prefix + scopeText);
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
  }