chrome-devtools-frontend 1.0.1576287 → 1.0.1576915

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 (50) hide show
  1. package/front_end/core/sdk/DebuggerModel.ts +14 -4
  2. package/front_end/generated/SupportedCSSProperties.js +37 -0
  3. package/front_end/models/bindings/DebuggerLanguagePlugins.ts +37 -38
  4. package/front_end/models/javascript_metadata/NativeFunctions.js +8 -0
  5. package/front_end/models/stack_trace/StackTrace.ts +19 -18
  6. package/front_end/panels/accessibility/AXBreadcrumbsPane.ts +5 -3
  7. package/front_end/panels/ai_assistance/components/ChatMessage.ts +5 -1
  8. package/front_end/panels/animation/AnimationGroupPreviewUI.ts +1 -1
  9. package/front_end/panels/application/ServiceWorkerUpdateCycleView.ts +1 -0
  10. package/front_end/panels/application/components/BackForwardCacheView.ts +4 -2
  11. package/front_end/panels/autofill/AutofillView.ts +1 -1
  12. package/front_end/panels/browser_debugger/XHRBreakpointsSidebarPane.ts +1 -0
  13. package/front_end/panels/console/ConsoleViewMessage.ts +1 -0
  14. package/front_end/panels/elements/ElementsTreeElement.ts +1 -0
  15. package/front_end/panels/elements/LayoutPane.ts +8 -7
  16. package/front_end/panels/elements/components/ElementsBreadcrumbs.ts +1 -1
  17. package/front_end/panels/elements/components/StylePropertyEditor.ts +2 -1
  18. package/front_end/panels/lighthouse/LighthouseReportRenderer.ts +1 -1
  19. package/front_end/panels/linear_memory_inspector/components/LinearMemoryValueInterpreter.ts +1 -1
  20. package/front_end/panels/linear_memory_inspector/components/ValueInterpreterDisplay.ts +1 -1
  21. package/front_end/panels/media/PlayerListView.ts +1 -1
  22. package/front_end/panels/network/NetworkLogViewColumns.ts +2 -1
  23. package/front_end/panels/network/RequestPayloadView.ts +42 -91
  24. package/front_end/panels/network/ShowMoreDetailsWidget.ts +96 -0
  25. package/front_end/panels/network/components/RequestHeaderSection.ts +1 -1
  26. package/front_end/panels/network/network.ts +2 -0
  27. package/front_end/panels/protocol_monitor/JSONEditor.ts +1 -1
  28. package/front_end/panels/recorder/components/RecordingListView.ts +1 -1
  29. package/front_end/panels/recorder/components/StepEditor.ts +3 -3
  30. package/front_end/panels/settings/KeybindsSettingsTab.ts +2 -1
  31. package/front_end/panels/sources/CallStackSidebarPane.ts +58 -11
  32. package/front_end/panels/sources/DebuggerPlugin.ts +19 -22
  33. package/front_end/panels/sources/SourcesPanel.ts +6 -24
  34. package/front_end/panels/sources/components/HeadersView.ts +2 -2
  35. package/front_end/panels/timeline/components/BreadcrumbsUI.ts +1 -1
  36. package/front_end/panels/timeline/components/SidebarAnnotationsTab.ts +1 -1
  37. package/front_end/third_party/chromium/README.chromium +1 -1
  38. package/front_end/ui/components/report_view/ReportView.ts +2 -2
  39. package/front_end/ui/components/report_view/report.css +1 -0
  40. package/front_end/ui/components/suggestion_input/SuggestionInput.ts +7 -12
  41. package/front_end/ui/components/tree_outline/TreeOutline.ts +1 -1
  42. package/front_end/ui/legacy/ContextMenu.ts +12 -7
  43. package/front_end/ui/legacy/ListControl.ts +2 -1
  44. package/front_end/ui/legacy/ListWidget.ts +1 -1
  45. package/front_end/ui/legacy/SoftContextMenu.ts +2 -1
  46. package/front_end/ui/legacy/Treeoutline.ts +1 -0
  47. package/front_end/ui/legacy/components/data_grid/DataGrid.ts +4 -2
  48. package/front_end/ui/legacy/components/quick_open/FilteredListWidget.ts +1 -1
  49. package/front_end/ui/visual_logging/KnownContextValues.ts +1 -0
  50. package/package.json +1 -1
@@ -1186,11 +1186,21 @@ export interface MissingDebugFiles {
1186
1186
  initiator: PageResourceLoadInitiator;
1187
1187
  }
1188
1188
 
1189
- export interface MissingDebugInfoDetails {
1190
- details: string;
1191
- resources: MissingDebugFiles[];
1189
+ export const enum MissingDebugInfoType {
1190
+ /** No debug information at all for the call frame */
1191
+ NO_INFO = 'NO_INFO',
1192
+
1193
+ /** Some debug information available, but it references files with debug information we were not able to retrieve */
1194
+ PARTIAL_INFO = 'PARTIAL_INFO',
1192
1195
  }
1193
1196
 
1197
+ export type MissingDebugInfo = {
1198
+ type: MissingDebugInfoType.NO_INFO,
1199
+ }|{
1200
+ type: MissingDebugInfoType.PARTIAL_INFO,
1201
+ missingDebugFiles: MissingDebugFiles[],
1202
+ };
1203
+
1194
1204
  export class CallFrame {
1195
1205
  debuggerModel: DebuggerModel;
1196
1206
  readonly script: Script;
@@ -1202,7 +1212,7 @@ export class CallFrame {
1202
1212
  readonly functionName: string;
1203
1213
  readonly #functionLocation: Location|undefined;
1204
1214
  #returnValue: RemoteObject|null;
1205
- missingDebugInfoDetails: MissingDebugInfoDetails|null;
1215
+ missingDebugInfoDetails: MissingDebugInfo|null;
1206
1216
  readonly exception: RemoteObject|null;
1207
1217
 
1208
1218
  readonly canBeRestarted: boolean;
@@ -499,6 +499,7 @@ export const generatedProperties = [
499
499
  "font-variation-settings",
500
500
  "font-weight",
501
501
  "forced-color-adjust",
502
+ "frame-sizing",
502
503
  "gap-rule-overlap",
503
504
  "grid-auto-columns",
504
505
  "grid-auto-flow",
@@ -518,6 +519,7 @@ export const generatedProperties = [
518
519
  "hyphenate-character",
519
520
  "hyphenate-limit-chars",
520
521
  "hyphens",
522
+ "image-animation",
521
523
  "image-orientation",
522
524
  "image-rendering",
523
525
  "inherits",
@@ -2597,6 +2599,16 @@ export const generatedProperties = [
2597
2599
  ],
2598
2600
  "name": "forced-color-adjust"
2599
2601
  },
2602
+ {
2603
+ "keywords": [
2604
+ "auto",
2605
+ "content-width",
2606
+ "content-height",
2607
+ "content-block-size",
2608
+ "content-inline-size"
2609
+ ],
2610
+ "name": "frame-sizing"
2611
+ },
2600
2612
  {
2601
2613
  "longhands": [
2602
2614
  "row-gap",
@@ -2779,6 +2791,15 @@ export const generatedProperties = [
2779
2791
  ],
2780
2792
  "name": "hyphens"
2781
2793
  },
2794
+ {
2795
+ "inherited": true,
2796
+ "keywords": [
2797
+ "normal",
2798
+ "running",
2799
+ "paused"
2800
+ ],
2801
+ "name": "image-animation"
2802
+ },
2782
2803
  {
2783
2804
  "inherited": true,
2784
2805
  "name": "image-orientation"
@@ -6034,6 +6055,15 @@ export const generatedPropertyValues = {
6034
6055
  "preserve-parent-color"
6035
6056
  ]
6036
6057
  },
6058
+ "frame-sizing": {
6059
+ "values": [
6060
+ "auto",
6061
+ "content-width",
6062
+ "content-height",
6063
+ "content-block-size",
6064
+ "content-inline-size"
6065
+ ]
6066
+ },
6037
6067
  "gap-rule-overlap": {
6038
6068
  "values": [
6039
6069
  "row-over-column",
@@ -6130,6 +6160,13 @@ export const generatedPropertyValues = {
6130
6160
  "auto"
6131
6161
  ]
6132
6162
  },
6163
+ "image-animation": {
6164
+ "values": [
6165
+ "normal",
6166
+ "running",
6167
+ "paused"
6168
+ ]
6169
+ },
6133
6170
  "image-rendering": {
6134
6171
  "values": [
6135
6172
  "auto",
@@ -58,16 +58,6 @@ const UIStrings = {
58
58
  * @example {File not found} PH3
59
59
  */
60
60
  failedToLoadDebugSymbolsFor: '[{PH1}] Failed to load debug symbols for {PH2} ({PH3})',
61
- /**
62
- * @description Error message that is displayed in UI debugging information cannot be found for a call frame
63
- * @example {main} PH1
64
- */
65
- failedToLoadDebugSymbolsForFunction: 'No debug information for function "{PH1}"',
66
- /**
67
- * @description Error message that is displayed in UI when a file needed for debugging information for a call frame is missing
68
- * @example {mainp.debug.wasm.dwp} PH1
69
- */
70
- debugSymbolsIncomplete: 'The debug information for function {PH1} is incomplete',
71
61
  } as const;
72
62
  const str_ = i18n.i18n.registerUIStrings('models/bindings/DebuggerLanguagePlugins.ts', UIStrings);
73
63
  const i18nString = i18n.i18n.getLocalizedString.bind(undefined, str_);
@@ -508,14 +498,12 @@ export class DebuggerLanguagePluginManager implements
508
498
  return functionInfo.frames.map(({name}, index) => callFrame.createVirtualCallFrame(index, name));
509
499
  }
510
500
  if ('missingSymbolFiles' in functionInfo && functionInfo.missingSymbolFiles.length) {
511
- const resources = functionInfo.missingSymbolFiles;
512
- const details = i18nString(UIStrings.debugSymbolsIncomplete, {PH1: callFrame.functionName});
513
- callFrame.missingDebugInfoDetails = {details, resources};
514
- } else {
515
501
  callFrame.missingDebugInfoDetails = {
516
- details: i18nString(UIStrings.failedToLoadDebugSymbolsForFunction, {PH1: callFrame.functionName}),
517
- resources: [],
502
+ type: SDK.DebuggerModel.MissingDebugInfoType.PARTIAL_INFO,
503
+ missingDebugFiles: functionInfo.missingSymbolFiles,
518
504
  };
505
+ } else {
506
+ callFrame.missingDebugInfoDetails = {type: SDK.DebuggerModel.MissingDebugInfoType.NO_INFO};
519
507
  }
520
508
  }
521
509
  return callFrame;
@@ -792,26 +780,18 @@ export class DebuggerLanguagePluginManager implements
792
780
  const rawLocation = new SDK.DebuggerModel.Location(
793
781
  script.debuggerModel, script.scriptId, frame.lineNumber, frame.columnNumber, index);
794
782
  const uiLocation = await this.rawLocationToUILocation(rawLocation);
795
- return {
796
- uiSourceCode: uiLocation?.uiSourceCode,
797
- url: uiLocation ? undefined : frame.url,
798
- name,
799
- line: uiLocation?.lineNumber ?? frame.lineNumber,
800
- column: uiLocation?.columnNumber ?? frame.columnNumber,
801
- };
783
+ return translatedFromUILocation(uiLocation, name, frame);
802
784
  });
803
785
 
804
786
  translatedFrames.push(await Promise.all(framePromises));
805
787
  return true;
806
788
  }
807
789
 
808
- // Identity map the frame, then add the missing debug info details.
809
- const mappedFrame: (typeof translatedFrames)[number][number] = {
810
- url: frame.url,
811
- name: frame.functionName,
812
- line: frame.lineNumber,
813
- column: frame.columnNumber,
814
- };
790
+ // Translate the location only. We go through via "DebuggerWorkspaceBinding". It'll still try the plugin
791
+ // first, but this way, we'll get a UISourceCode for the raw script if the plugin fails to translate.
792
+ const uiLocation = await this.#debuggerWorkspaceBinding.rawLocationToUILocation(
793
+ new SDK.DebuggerModel.Location(script.debuggerModel, script.scriptId, frame.lineNumber, frame.columnNumber));
794
+ const mappedFrame = translatedFromUILocation(uiLocation, frame.functionName, frame);
815
795
 
816
796
  if ('missingSymbolFiles' in functionInfo && functionInfo.missingSymbolFiles.length) {
817
797
  translatedFrames.push([{
@@ -831,6 +811,27 @@ export class DebuggerLanguagePluginManager implements
831
811
  }
832
812
 
833
813
  return true;
814
+
815
+ function translatedFromUILocation(
816
+ uiLocation: Workspace.UISourceCode.UILocation|null, name: string|undefined,
817
+ fallback: StackTraceImpl.Trie.RawFrame): (typeof translatedFrames)[number][number] {
818
+ if (uiLocation) {
819
+ return {
820
+ uiSourceCode: uiLocation.uiSourceCode,
821
+ url: undefined,
822
+ name,
823
+ line: uiLocation.lineNumber,
824
+ column: uiLocation.columnNumber ?? -1,
825
+ };
826
+ }
827
+ return {
828
+ uiSourceCode: undefined,
829
+ url: fallback.url,
830
+ name: fallback.functionName,
831
+ line: fallback.lineNumber,
832
+ column: fallback.columnNumber,
833
+ };
834
+ }
834
835
  }
835
836
 
836
837
  scriptsForUISourceCode(uiSourceCode: Workspace.UISourceCode.UISourceCode): SDK.Script.Script[] {
@@ -920,15 +921,13 @@ export class DebuggerLanguagePluginManager implements
920
921
  // for the DebuggerModel again, which may disappear
921
922
  // in the meantime...
922
923
  void rawModuleHandle.addRawModulePromise.then(sourceFileURLs => {
923
- if (!('missingSymbolFiles' in sourceFileURLs)) {
924
- // The script might have disappeared meanwhile...
925
- if (script.debuggerModel.scriptForId(script.scriptId) === script) {
926
- const modelData = this.#debuggerModelToData.get(script.debuggerModel);
927
- if (modelData) { // The DebuggerModel could have disappeared meanwhile...
928
- modelData.addSourceFiles(script, sourceFileURLs);
929
- void this.#debuggerWorkspaceBinding.updateLocations(script);
930
- }
924
+ // The script might have disappeared meanwhile...
925
+ if (script.debuggerModel.scriptForId(script.scriptId) === script) {
926
+ const modelData = this.#debuggerModelToData.get(script.debuggerModel);
927
+ if (modelData && Array.isArray(sourceFileURLs)) { // The DebuggerModel could have disappeared meanwhile...
928
+ modelData.addSourceFiles(script, sourceFileURLs);
931
929
  }
930
+ void this.#debuggerWorkspaceBinding.updateLocations(script);
932
931
  }
933
932
  });
934
933
  return;
@@ -7137,10 +7137,18 @@ export const NativeFunctions = [
7137
7137
  name: "intercept",
7138
7138
  signatures: [["?options"]]
7139
7139
  },
7140
+ {
7141
+ name: "deferPageSwap",
7142
+ signatures: [["options"]]
7143
+ },
7140
7144
  {
7141
7145
  name: "NavigationCurrentEntryChangeEvent",
7142
7146
  signatures: [["type","eventInit"]]
7143
7147
  },
7148
+ {
7149
+ name: "addRestoreCallback",
7150
+ signatures: [["callback"]]
7151
+ },
7144
7152
  {
7145
7153
  name: "addHandler",
7146
7154
  signatures: [["handler"]]
@@ -65,29 +65,29 @@ export interface EventTypes {
65
65
 
66
66
  /**
67
67
  * A small wrapper around a DebuggableFrame usable as a UI.Context flavor.
68
- * This is necessary as Frame and DebuggableFrame are updated in place, but
69
- * for UI.Context we need a new instance.
68
+ * This is necessary as DebuggableFrame are just interfaces and the impl classes are hidden.
69
+ *
70
+ * Moreover, re-translation creates a new DebuggableFrame instance even though the
71
+ * translation result stays the same, in which case we don't need a new instance for the flavor.
70
72
  */
71
- export class DebuggableFrameFlavor implements DebuggableFrame {
73
+ export class DebuggableFrameFlavor {
72
74
  static #last?: DebuggableFrameFlavor;
73
75
 
74
- readonly url?: string;
75
- readonly uiSourceCode?: Workspace.UISourceCode.UISourceCode;
76
- readonly name?: string;
77
- readonly line: number;
78
- readonly column: number;
79
- readonly missingDebugInfo?: MissingDebugInfo;
80
- readonly sdkFrame: SDK.DebuggerModel.CallFrame;
76
+ readonly frame: DebuggableFrame;
77
+
78
+ // TODO(crbug.com/465879478): Remove once this is no longer part of SDK.CallFrame.
79
+ // We need to stash this separately because DebuggerModel sets this on CallFrame after the
80
+ // fact so we can't just check it in the `equals` below.
81
+ readonly #missingDebugInfo: SDK.DebuggerModel.MissingDebugInfo|null;
81
82
 
82
83
  /** Use the static {@link for}. Only public to satisfy the `setFlavor` Ctor type */
83
84
  constructor(frame: DebuggableFrame) {
84
- this.url = frame.url;
85
- this.uiSourceCode = frame.uiSourceCode;
86
- this.name = frame.name;
87
- this.line = frame.line;
88
- this.column = frame.column;
89
- this.missingDebugInfo = frame.missingDebugInfo;
90
- this.sdkFrame = frame.sdkFrame;
85
+ this.frame = frame;
86
+ this.#missingDebugInfo = frame.sdkFrame.missingDebugInfoDetails;
87
+ }
88
+
89
+ get sdkFrame(): SDK.DebuggerModel.CallFrame {
90
+ return this.frame.sdkFrame;
91
91
  }
92
92
 
93
93
  /** @returns the same instance of DebuggableFrameFlavor for repeated calls with the same (i.e. deep equal) DebuggableFrame */
@@ -97,7 +97,8 @@ export class DebuggableFrameFlavor implements DebuggableFrame {
97
97
  a.column === b.column && a.sdkFrame === b.sdkFrame;
98
98
  }
99
99
 
100
- if (!DebuggableFrameFlavor.#last || !equals(DebuggableFrameFlavor.#last, frame)) {
100
+ if (!DebuggableFrameFlavor.#last || !equals(DebuggableFrameFlavor.#last.frame, frame) ||
101
+ DebuggableFrameFlavor.#last.#missingDebugInfo !== frame.sdkFrame.missingDebugInfoDetails) {
101
102
  DebuggableFrameFlavor.#last = new DebuggableFrameFlavor(frame);
102
103
  }
103
104
  return DebuggableFrameFlavor.#last;
@@ -452,9 +452,11 @@ export class AXBreadcrumb {
452
452
 
453
453
  this.#element = document.createElement('div');
454
454
  this.#element.classList.add('ax-breadcrumb');
455
- this.#element.setAttribute(
456
- 'jslog',
457
- `${VisualLogging.treeItem().track({click: true, keydown: 'ArrowUp|ArrowDown|ArrowLeft|ArrowRight|Enter'})}`);
455
+ this.#element.setAttribute('jslog', `${VisualLogging.treeItem().track({
456
+ click: true,
457
+ resize: true,
458
+ keydown: 'ArrowUp|ArrowDown|ArrowLeft|ArrowRight|Enter'
459
+ })}`);
458
460
  elementsToAXBreadcrumb.set(this.#element, this);
459
461
 
460
462
  this.#nodeElement = document.createElement('div');
@@ -110,6 +110,10 @@ const UIStringsNotTranslate = {
110
110
  * @description The generic name of the AI agent (do not translate)
111
111
  */
112
112
  ai: 'AI',
113
+ /**
114
+ * @description Gemini (do not translate)
115
+ */
116
+ gemini: 'Gemini',
113
117
  /**
114
118
  * @description The fallback text when we can't find the user full name
115
119
  */
@@ -306,7 +310,7 @@ export const DEFAULT_VIEW = (input: ChatMessageViewInput, output: ViewOutput, ta
306
310
  <div class="message-info">
307
311
  <devtools-icon name=${icon}></devtools-icon>
308
312
  <div class="message-name">
309
- <h2>${lockedString(UIStringsNotTranslate.ai)}</h2>
313
+ <h2>${AiAssistanceModel.AiUtils.isGeminiBranding() ? lockedString(UIStringsNotTranslate.gemini) : lockedString(UIStringsNotTranslate.ai)}</h2>
310
314
  </div>
311
315
  </div>
312
316
  ${Lit.Directives.repeat(
@@ -98,7 +98,7 @@ const DEFAULT_VIEW: View = (input, output, target) => {
98
98
  render(html`
99
99
  <div class="animation-group-preview-ui">
100
100
  <button
101
- jslog=${VisualLogging.item(`animations.buffer-preview${input.isScrollDrivenAnimationGroup ? '-sda' : ''}`).track({click: true})}
101
+ jslog=${VisualLogging.item(`animations.buffer-preview${input.isScrollDrivenAnimationGroup ? '-sda' : ''}`).track({click: true, resize: true})}
102
102
  class=${classes}
103
103
  role="option"
104
104
  aria-label=${input.label}
@@ -180,6 +180,7 @@ export class ServiceWorkerUpdateCycleView {
180
180
  const tr = this.tableElement.createChild('tr', 'service-worker-update-timeline');
181
181
  tr.setAttribute('jslog', `${VisualLogging.treeItem('update-timeline').track({
182
182
  click: true,
183
+ resize: true,
183
184
  keydown: 'ArrowLeft|ArrowRight|ArrowUp|ArrowDown|Enter|Space',
184
185
  })}`);
185
186
  this.rows.push(tr);
@@ -353,7 +353,7 @@ function renderFramesPerReason(frames: string[]|undefined): LitTemplate {
353
353
  }
354
354
  const rows = [html`<div>${i18nString(UIStrings.framesPerIssue, {n: frames.length})}</div>`];
355
355
  rows.push(...frames.map(url => html`<div class="text-ellipsis" title=${url}
356
- jslog=${VisualLogging.treeItem()}>${url}</div>`));
356
+ jslog=${VisualLogging.treeItem().track({resize: true})}>${url}</div>`));
357
357
  return html`
358
358
  <div class="details-list"
359
359
  jslog=${VisualLogging.tree('frames-per-issue')}>
@@ -361,7 +361,9 @@ function renderFramesPerReason(frames: string[]|undefined): LitTemplate {
361
361
  rows,
362
362
  title: i18nString(UIStrings.framesPerIssue, {n: frames.length}),
363
363
  } as ExpandableList.ExpandableList.ExpandableListData}
364
- jslog=${VisualLogging.treeItem()}></devtools-expandable-list>
364
+ jslog=${VisualLogging.treeItem().track({
365
+ resize: true
366
+ })}></devtools-expandable-list>
365
367
  </div>
366
368
  `;
367
369
  }
@@ -144,7 +144,7 @@ const DEFAULT_VIEW: View = (input: ViewInput, _output: ViewOutput, target: HTMLE
144
144
  // clang-format off
145
145
  return html`
146
146
  <span class=${spanClasses}
147
- jslog=${VisualLogging.item('matched-address-item').track({hover: true})}
147
+ jslog=${VisualLogging.item('matched-address-item').track({hover: true, resize: true})}
148
148
  @mouseenter=${() => input.onHighlightMatchesInAddress(startIndex)}
149
149
  @mouseleave=${input.onClearHighlightedMatches}>
150
150
  ${templateLines}
@@ -238,6 +238,7 @@ export class XHRBreakpointsSidebarPane extends UI.Widget.VBox implements UI.Cont
238
238
  listItemElement.setAttribute('jslog', `${VisualLogging.item().track({
239
239
  click: true,
240
240
  dblclick: true,
241
+ resize: true,
241
242
  keydown: 'ArrowUp|ArrowDown|PageUp|PageDown|Enter|Space',
242
243
  })}`);
243
244
  return listItemElement;
@@ -1457,6 +1457,7 @@ export class ConsoleViewMessage implements ConsoleViewportElement {
1457
1457
  this.elementInternal.className = 'console-message-wrapper';
1458
1458
  this.elementInternal.setAttribute('jslog', `${VisualLogging.item('console-message').track({
1459
1459
  click: true,
1460
+ resize: true,
1460
1461
  keydown: 'ArrowUp|ArrowDown|ArrowLeft|ArrowRight|Enter|Space|Home|End',
1461
1462
  })}`);
1462
1463
  this.elementInternal.removeChildren();
@@ -680,6 +680,7 @@ export class ElementsTreeElement extends UI.TreeOutline.TreeElement {
680
680
  this.listItemElement.setAttribute(
681
681
  'jslog', `${VisualLogging.treeItem().parent('elementsTreeOutline').track({
682
682
  keydown: 'ArrowUp|ArrowDown|ArrowLeft|ArrowRight|Backspace|Delete|Enter|Space|Home|End',
683
+ resize: true,
683
684
  drag: true,
684
685
  click: true,
685
686
  })}`);
@@ -228,26 +228,27 @@ const DEFAULT_VIEW: View = (input, output, target) => {
228
228
  event.preventDefault();
229
229
  }
230
230
  };
231
+ // clang-format off
231
232
  const renderElement = (element: LayoutElement): Lit.LitTemplate => html`<div
232
233
  class="element"
233
- jslog=${VisualLogging.item()}>
234
+ jslog=${VisualLogging.item().track({resize: true})}>
234
235
  <devtools-checkbox
235
236
  data-element="true"
236
237
  class="checkbox-label"
237
238
  .checked=${element.enabled}
238
239
  @change=${(e: Event) => input.onElementToggle(element, e)}
239
- jslog=${VisualLogging.toggle().track({
240
- click: true
241
- })}>
240
+ jslog=${VisualLogging.toggle().track({click: true, resize: true })}>
242
241
  <span
243
242
  class="node-text-container"
244
243
  data-label="true"
245
244
  @mouseenter=${(e: MouseEvent) => input.onMouseEnter(element, e)}
246
245
  @mouseleave=${(e: MouseEvent) => input.onMouseLeave(element, e)}>
247
246
  <devtools-node-text .data=${{
248
- nodeId: element.domId, nodeTitle: element.name, nodeClasses: element.domClasses,
249
- }
250
- }></devtools-node-text>
247
+ nodeId: element.domId,
248
+ nodeTitle: element.name,
249
+ nodeClasses: element.domClasses
250
+ }}>
251
+ </devtools-node-text>
251
252
  </span>
252
253
  </devtools-checkbox>
253
254
  <label
@@ -303,7 +303,7 @@ export class ElementsBreadcrumbs extends HTMLElement {
303
303
  data-crumb="true"
304
304
  >
305
305
  <a href="#" draggable=false class="crumb-link"
306
- jslog=${VisualLogging.item().track({click:true})}
306
+ jslog=${VisualLogging.item().track({click:true, resize:true})}
307
307
  @click=${this.#onCrumbClick(crumb.node)}
308
308
  @mousemove=${this.#onCrumbMouseMove(crumb.node)}
309
309
  @mouseleave=${this.#onCrumbMouseLeave(crumb.node)}
@@ -194,7 +194,8 @@ export class StylePropertyEditor extends HTMLElement {
194
194
  return html`
195
195
  <button title=${title}
196
196
  class=${classes}
197
- jslog=${VisualLogging.item().track({click: true}).context(`${propertyName}-${propertyValue}`)}
197
+ jslog=${
198
+ VisualLogging.item().track({click: true, resize: true}).context(`${propertyName}-${propertyValue}`)}
198
199
  @click=${() => this.#onButtonClick(propertyName, propertyValue, selected)}>
199
200
  <devtools-icon style=${transform} name=${iconInfo.iconName}>
200
201
  </devtools-icon>
@@ -197,7 +197,7 @@ export class LighthouseReportRenderer {
197
197
  continue;
198
198
  }
199
199
 
200
- auditEl.setAttribute('jslog', `${VisualLogging.item(`lighthouse.audit.${id}`)}`);
200
+ auditEl.setAttribute('jslog', `${VisualLogging.item(`lighthouse.audit.${id}`).track({resize: true})}`);
201
201
 
202
202
  let state: string|undefined;
203
203
  for (const className of auditEl.classList) {
@@ -60,7 +60,7 @@ function renderEndiannessSetting(
60
60
  data-endianness="true" @change=${(e: Event) => onEndiannessChanged((e.target as HTMLSelectElement).value as Endianness)}>
61
61
  ${[Endianness.LITTLE, Endianness.BIG].map(endianness => {
62
62
  return html`<option value=${endianness} .selected=${currentEndiannes === endianness}
63
- jslog=${VisualLogging.item(Platform.StringUtilities.toKebabCase(endianness)).track({click: true})}>${
63
+ jslog=${VisualLogging.item(Platform.StringUtilities.toKebabCase(endianness)).track({click: true, resize: true})}>${
64
64
  i18n.i18n.lockedString(endianness)}</option>`;
65
65
  })}
66
66
  </select>
@@ -104,7 +104,7 @@ export const DEFAULT_VIEW: View = (input: ViewInput, _output: undefined, target:
104
104
  ${VALUE_TYPE_MODE_LIST.filter(x => isValidMode(type, x)).map(mode => {
105
105
  return html`
106
106
  <option value=${mode} .selected=${input.valueTypeModes.get(type) === mode}
107
- jslog=${VisualLogging.item(mode).track({click: true})}>${
107
+ jslog=${VisualLogging.item(mode).track({click: true, resize: true})}>${
108
108
  i18n.i18n.lockedString(mode)}
109
109
  </option>`;
110
110
  })}
@@ -73,7 +73,7 @@ const DEFAULT_VIEW: View = (input, _output, target) => {
73
73
  })}
74
74
  @click=${() => input.onPlayerClick(player.playerID)}
75
75
  @contextmenu=${(e: Event) => input.onPlayerContextMenu(player.playerID, e)}
76
- jslog=${VisualLogging.item('player').track({click: true})}>
76
+ jslog=${VisualLogging.item('player').track({click: true, resize: true})}>
77
77
  <div class="player-entry-status-icon vbox">
78
78
  <div class="player-entry-status-icon-centering">
79
79
  <devtools-icon name=${player.iconName}></devtools-icon>
@@ -409,7 +409,8 @@ export class NetworkLogViewColumns {
409
409
 
410
410
  private createWaterfallHeader(): void {
411
411
  this.waterfallHeaderElement = this.waterfallColumn.contentElement.createChild('div', 'network-waterfall-header');
412
- this.waterfallHeaderElement.setAttribute('jslog', `${VisualLogging.tableHeader('waterfall').track({click: true})}`);
412
+ this.waterfallHeaderElement.setAttribute(
413
+ 'jslog', `${VisualLogging.tableHeader('waterfall').track({click: true, resize: true})}`);
413
414
  this.waterfallHeaderElement.addEventListener('click', waterfallHeaderClicked.bind(this));
414
415
  this.waterfallHeaderElement.addEventListener('contextmenu', event => {
415
416
  const contextMenu = new UI.ContextMenu.ContextMenu(event);