chrome-devtools-frontend 1.0.1669021 → 1.0.1672388

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 (208) hide show
  1. package/.agents/skills/fixing-skipped-tests/SKILL.md +6 -6
  2. package/.agents/skills/gerrit-cli/SKILL.md +4 -10
  3. package/.agents/skills/gerrit-cli/references/commands.md +45 -2
  4. package/.agents/skills/gerrit-cli/references/workflows.md +7 -0
  5. package/.agents/skills/gerrit-cli/scripts/import_upstream.py +34 -152
  6. package/config/typescript/tsconfig.eslint.json +1 -1
  7. package/docs/contributing/settings-experiments-features.md +2 -8
  8. package/docs/ecosystem/automatic_workspace_folders.md +0 -19
  9. package/eslint.config.mjs +2 -2
  10. package/front_end/core/common/Lazy.ts +3 -3
  11. package/front_end/core/common/SettingRegistration.ts +0 -7
  12. package/front_end/core/common/Settings.ts +0 -38
  13. package/front_end/core/host/UserMetrics.ts +187 -953
  14. package/front_end/core/host/UserMetricsEnums.d.ts +949 -0
  15. package/front_end/core/root/Runtime.ts +21 -133
  16. package/front_end/core/sdk/CSSMetadata.ts +70 -65
  17. package/front_end/core/sdk/CategorizedBreakpoint.ts +0 -1
  18. package/front_end/core/sdk/ChildTargetManager.ts +0 -2
  19. package/front_end/core/sdk/EmulationModel.ts +0 -2
  20. package/front_end/core/sdk/EventBreakpointsModel.ts +0 -4
  21. package/front_end/core/sdk/NetworkManager.ts +0 -3
  22. package/front_end/core/sdk/PageResourceLoader.ts +9 -9
  23. package/front_end/core/sdk/RehydratingConnection.ts +52 -4
  24. package/front_end/core/sdk/Target.ts +0 -4
  25. package/front_end/devtools_compatibility.js +886 -0
  26. package/front_end/entrypoints/inspector_main/RenderingOptions.ts +7 -6
  27. package/front_end/entrypoints/main/ExecutionContextSelector.ts +0 -1
  28. package/front_end/entrypoints/main/MainImpl.ts +18 -22
  29. package/front_end/foundation/Universe.ts +7 -2
  30. package/front_end/generated/InspectorBackendCommands.ts +3 -10
  31. package/front_end/generated/protocol-mapping.d.ts +0 -42
  32. package/front_end/generated/protocol-proxy-api.d.ts +0 -38
  33. package/front_end/generated/protocol.ts +9 -169
  34. package/front_end/models/ai_assistance/AiAgent2.ts +11 -3
  35. package/front_end/models/ai_assistance/AiConversation.ts +1 -0
  36. package/front_end/models/ai_assistance/AiHistoryStorage.ts +8 -5
  37. package/front_end/models/ai_assistance/AiSetting.ts +108 -0
  38. package/front_end/models/ai_assistance/AiUtils.ts +47 -0
  39. package/front_end/models/ai_assistance/ChangeManager.ts +1 -0
  40. package/front_end/models/ai_assistance/ExtensionScope.ts +3 -12
  41. package/front_end/models/ai_assistance/agents/AiAgent.ts +11 -18
  42. package/front_end/models/ai_assistance/agents/ContextSelectionAgent.ts +3 -0
  43. package/front_end/models/ai_assistance/agents/ExecuteJavascript.ts +42 -17
  44. package/front_end/models/ai_assistance/agents/PerformanceAgent.ts +3 -2
  45. package/front_end/models/ai_assistance/agents/StorageAgent.ts +253 -155
  46. package/front_end/models/ai_assistance/agents/StylingAgent.snapshot.txt +2 -2
  47. package/front_end/models/ai_assistance/ai_assistance.ts +4 -0
  48. package/front_end/models/ai_assistance/contexts/PerformanceTraceContext.ts +12 -6
  49. package/front_end/models/ai_assistance/data_formatters/FileFormatter.ts +3 -1
  50. package/front_end/models/ai_assistance/data_formatters/NetworkRequestFormatter.ts +1 -0
  51. package/front_end/models/ai_assistance/data_formatters/PerformanceTraceFormatter.ts +1 -0
  52. package/front_end/models/ai_assistance/injected.ts +1 -0
  53. package/front_end/models/ai_assistance/performance/AICallTree.ts +1 -0
  54. package/front_end/models/ai_assistance/skills/Skill.ts +1 -1
  55. package/front_end/models/ai_assistance/skills/SkillRegistry.ts +2 -0
  56. package/front_end/models/ai_assistance/skills/performance.md +10 -0
  57. package/front_end/models/ai_assistance/tools/ExecuteJavaScript.ts +52 -5
  58. package/front_end/models/ai_assistance/tools/GetElementAccessibilityDetails.ts +4 -4
  59. package/front_end/models/ai_assistance/tools/GetLighthouseAudits.ts +4 -4
  60. package/front_end/models/ai_assistance/tools/GetNetworkRequestDetails.ts +5 -4
  61. package/front_end/models/ai_assistance/tools/GetStyles.ts +5 -4
  62. package/front_end/models/ai_assistance/tools/ListNetworkRequests.ts +5 -4
  63. package/front_end/models/ai_assistance/tools/README.md +1 -1
  64. package/front_end/models/ai_assistance/tools/RecordPerformanceTrace.ts +63 -0
  65. package/front_end/models/ai_assistance/tools/ResolveDevtoolsNodePath.ts +5 -5
  66. package/front_end/models/ai_assistance/tools/Tool.ts +118 -24
  67. package/front_end/models/ai_assistance/tools/ToolRegistry.ts +2 -0
  68. package/front_end/models/badges/UserBadges.ts +2 -0
  69. package/front_end/models/bindings/NetworkProject.ts +5 -0
  70. package/front_end/models/bindings/ResourceScriptMapping.ts +2 -0
  71. package/front_end/models/bindings/ResourceUtils.ts +3 -0
  72. package/front_end/models/crux-manager/CrUXManager.ts +1 -0
  73. package/front_end/models/emulation/DeviceModeModel.ts +140 -7
  74. package/front_end/models/emulation/EmulatedDevices.ts +246 -793
  75. package/front_end/models/issues_manager/IssuesManager.ts +10 -2
  76. package/front_end/models/live-metrics/LiveMetrics.ts +41 -9
  77. package/front_end/models/logs/LogManager.ts +8 -5
  78. package/front_end/models/logs/NetworkLog.ts +1 -0
  79. package/front_end/models/persistence/IsolatedFileSystemManager.ts +21 -3
  80. package/front_end/models/persistence/NetworkPersistenceManager.ts +6 -0
  81. package/front_end/models/project_settings/ProjectSettingsModel.ts +8 -12
  82. package/front_end/models/trace_source_maps_resolver/SourceMapsResolver.ts +3 -1
  83. package/front_end/models/workspace/IgnoreListManager.ts +2 -0
  84. package/front_end/models/workspace/UISourceCode.ts +2 -0
  85. package/front_end/models/workspace_diff/WorkspaceDiff.ts +4 -0
  86. package/front_end/panels/ai_assistance/AiAssistancePanel.ts +22 -22
  87. package/front_end/panels/ai_assistance/ai_assistance-meta.ts +0 -7
  88. package/front_end/panels/ai_assistance/components/ChatInput.ts +4 -0
  89. package/front_end/panels/ai_assistance/components/ChatMessage.ts +79 -34
  90. package/front_end/panels/ai_assistance/components/WalkthroughView.ts +1 -2
  91. package/front_end/panels/ai_assistance/components/walkthroughView.css +1 -1
  92. package/front_end/panels/application/ApplicationPanelSidebar.ts +9 -106
  93. package/front_end/panels/application/ApplicationPanelTreeElement.ts +1 -1
  94. package/front_end/panels/application/application.ts +0 -10
  95. package/front_end/panels/application/components/components.ts +0 -4
  96. package/front_end/panels/browser_debugger/CategorizedBreakpointsSidebarPane.ts +0 -5
  97. package/front_end/panels/browser_debugger/EventListenerBreakpointsSidebarPane.ts +6 -12
  98. package/front_end/panels/browser_debugger/browser_debugger-meta.ts +5 -3
  99. package/front_end/panels/console/ConsoleFormat.ts +2 -62
  100. package/front_end/panels/console/ConsoleViewMessage.ts +14 -7
  101. package/front_end/panels/emulation/AdvancedApp.ts +1 -2
  102. package/front_end/panels/emulation/DeviceModeToolbar.ts +83 -69
  103. package/front_end/panels/emulation/DeviceModeView.ts +4 -134
  104. package/front_end/panels/emulation/DeviceModeWrapper.ts +52 -69
  105. package/front_end/panels/emulation/MediaQueryInspector.ts +2 -2
  106. package/front_end/panels/emulation/emulation-meta.ts +12 -12
  107. package/front_end/panels/issues/IssuesPane.ts +3 -1
  108. package/front_end/panels/lighthouse/LighthouseController.ts +6 -0
  109. package/front_end/panels/linear_memory_inspector/components/LinearMemoryInspector.ts +17 -21
  110. package/front_end/panels/linear_memory_inspector/components/LinearMemoryNavigator.ts +206 -126
  111. package/front_end/panels/linear_memory_inspector/components/linearMemoryInspector.css +1 -1
  112. package/front_end/panels/mobile_throttling/CalibrationController.ts +1 -1
  113. package/front_end/panels/mobile_throttling/MobileThrottlingSelector.ts +3 -3
  114. package/front_end/panels/mobile_throttling/NetworkPanelIndicator.ts +6 -6
  115. package/front_end/panels/mobile_throttling/NetworkThrottlingSelector.ts +11 -11
  116. package/front_end/panels/mobile_throttling/ThrottlingManager.ts +13 -13
  117. package/front_end/panels/mobile_throttling/ThrottlingPresets.ts +10 -10
  118. package/front_end/panels/mobile_throttling/ThrottlingSettingsTab.ts +28 -28
  119. package/front_end/panels/mobile_throttling/mobile_throttling-meta.ts +6 -6
  120. package/front_end/panels/network/RequestHeadersView.ts +1 -1
  121. package/front_end/panels/network/ResourceChunkView.ts +243 -144
  122. package/front_end/panels/network/ResourceDirectSocketChunkView.ts +52 -29
  123. package/front_end/panels/network/ResourceWebSocketFrameView.ts +21 -35
  124. package/front_end/panels/network/resourceChunkView.css +41 -36
  125. package/front_end/panels/profiler/HeapDetachedElementsDataGrid.ts +21 -12
  126. package/front_end/panels/profiler/profiler.ts +4 -0
  127. package/front_end/panels/recorder/RecorderPanel.ts +6 -14
  128. package/front_end/panels/sensors/LocationsSettingsTab.ts +7 -7
  129. package/front_end/panels/settings/AISettingsTab.ts +75 -31
  130. package/front_end/panels/settings/SettingsScreen.ts +8 -13
  131. package/front_end/panels/settings/components/SyncSection.ts +3 -4
  132. package/front_end/panels/settings/emulation/DevicesSettingsTab.ts +200 -18
  133. package/front_end/panels/settings/emulation/devicesSettingsTab.css +18 -0
  134. package/front_end/panels/settings/settings-meta.ts +0 -1
  135. package/front_end/panels/sources/CategorizedBreakpointL10n.ts +0 -2
  136. package/front_end/panels/sources/DebuggerPausedMessage.ts +11 -5
  137. package/front_end/panels/sources/DebuggerPlugin.ts +1 -1
  138. package/front_end/panels/sources/EditingLocationHistoryManager.ts +12 -9
  139. package/front_end/panels/sources/SourcesPanel.ts +19 -17
  140. package/front_end/panels/sources/SourcesView.ts +191 -96
  141. package/front_end/panels/sources/TabbedEditorContainer.ts +3 -4
  142. package/front_end/panels/sources/WatchExpressionsSidebarPane.ts +2 -5
  143. package/front_end/panels/timeline/TimelineUIUtils.ts +15 -0
  144. package/front_end/panels/timeline/timeline-meta.ts +3 -5
  145. package/front_end/third_party/chromium/README.chromium +1 -1
  146. package/front_end/third_party/codemirror.next/chunk/angular.js +1 -1
  147. package/front_end/third_party/codemirror.next/chunk/codemirror.js +1 -1
  148. package/front_end/third_party/codemirror.next/chunk/codemirror.js.map +1 -1
  149. package/front_end/third_party/codemirror.next/chunk/cpp.js +1 -1
  150. package/front_end/third_party/codemirror.next/chunk/cpp.js.map +1 -1
  151. package/front_end/third_party/codemirror.next/chunk/java.js +1 -1
  152. package/front_end/third_party/codemirror.next/chunk/java.js.map +1 -1
  153. package/front_end/third_party/codemirror.next/chunk/legacy.js +1 -1
  154. package/front_end/third_party/codemirror.next/chunk/less.js +1 -1
  155. package/front_end/third_party/codemirror.next/chunk/less.js.map +1 -1
  156. package/front_end/third_party/codemirror.next/chunk/markdown.js +1 -1
  157. package/front_end/third_party/codemirror.next/chunk/markdown.js.map +1 -1
  158. package/front_end/third_party/codemirror.next/chunk/php.js +1 -1
  159. package/front_end/third_party/codemirror.next/chunk/php.js.map +1 -1
  160. package/front_end/third_party/codemirror.next/chunk/python.js +1 -1
  161. package/front_end/third_party/codemirror.next/chunk/python.js.map +1 -1
  162. package/front_end/third_party/codemirror.next/chunk/sass.js +1 -1
  163. package/front_end/third_party/codemirror.next/chunk/sass.js.map +1 -1
  164. package/front_end/third_party/codemirror.next/chunk/svelte.js +1 -1
  165. package/front_end/third_party/codemirror.next/chunk/svelte.js.map +1 -1
  166. package/front_end/third_party/codemirror.next/chunk/vue.js +1 -1
  167. package/front_end/third_party/codemirror.next/chunk/wast.js +1 -1
  168. package/front_end/third_party/codemirror.next/chunk/wast.js.map +1 -1
  169. package/front_end/third_party/codemirror.next/chunk/xml.js +1 -1
  170. package/front_end/third_party/codemirror.next/chunk/xml.js.map +1 -1
  171. package/front_end/third_party/codemirror.next/codemirror.next.d.ts +1332 -193
  172. package/front_end/third_party/codemirror.next/codemirror.next.js +1 -1
  173. package/front_end/third_party/codemirror.next/rebuild.sh +1 -1
  174. package/front_end/tsconfig.compatibility.json +2 -1
  175. package/front_end/tsconfig.json +1 -1
  176. package/front_end/ui/components/icon_button/IconButton.ts +1 -1
  177. package/front_end/ui/components/issue_counter/IssueCounter.ts +1 -1
  178. package/front_end/ui/components/settings/SettingCheckbox.ts +4 -7
  179. package/front_end/ui/components/settings/settings.ts +1 -2
  180. package/front_end/ui/legacy/Treeoutline.ts +52 -30
  181. package/front_end/ui/legacy/components/object_ui/CSSStyleSanitizer.ts +74 -0
  182. package/front_end/ui/legacy/components/object_ui/CustomPreviewComponent.ts +6 -1
  183. package/front_end/ui/legacy/components/object_ui/ObjectPropertiesSection.ts +47 -54
  184. package/front_end/ui/legacy/components/object_ui/object_ui.ts +2 -0
  185. package/front_end/ui/legacy/components/quick_open/CommandMenu.ts +5 -27
  186. package/front_end/ui/legacy/components/settings_ui/SettingsUI.ts +10 -12
  187. package/front_end/ui/settings/SettingUIRegistration.ts +0 -8
  188. package/front_end/ui/visual_logging/KnownContextValues.ts +21 -0
  189. package/inspector_overlay/tsconfig.json +8 -2
  190. package/package.json +3 -2
  191. package/.agents/skills/gerrit-cli/scripts/gerrit_client_wrapper.py +0 -47
  192. package/front_end/core/sdk/CSSModel.test.api.ts +0 -102
  193. package/front_end/core/sdk/DOMModel.test.api.ts +0 -104
  194. package/front_end/foundation/Universe.test.api.ts +0 -73
  195. package/front_end/panels/application/SharedStorageEventsView.ts +0 -128
  196. package/front_end/panels/application/SharedStorageItemsView.ts +0 -179
  197. package/front_end/panels/application/SharedStorageListTreeElement.ts +0 -65
  198. package/front_end/panels/application/SharedStorageModel.ts +0 -249
  199. package/front_end/panels/application/SharedStorageTreeElement.ts +0 -40
  200. package/front_end/panels/application/components/SharedStorageAccessGrid.ts +0 -191
  201. package/front_end/panels/application/components/SharedStorageMetadataView.ts +0 -133
  202. package/front_end/panels/application/components/sharedStorageAccessGrid.css +0 -29
  203. package/front_end/panels/application/components/sharedStorageMetadataView.css +0 -29
  204. package/front_end/panels/application/sharedStorageEventsView.css +0 -9
  205. package/front_end/panels/network/OriginalResourceChunkView.ts +0 -340
  206. package/front_end/panels/network/originalResourceChunkView.css +0 -49
  207. package/front_end/ui/components/settings/SettingDeprecationWarning.ts +0 -47
  208. package/front_end/ui/components/settings/settingDeprecationWarning.css +0 -14
@@ -173,6 +173,7 @@ export function isIssueCodeSupported(code: Protocol.Audits.InspectorIssueCode):
173
173
  */
174
174
  export function createIssuesFromProtocolIssue(
175
175
  issuesModel: SDK.IssuesModel.IssuesModel|null, inspectorIssue: Protocol.Audits.InspectorIssue,
176
+ // eslint-disable-next-line @devtools/no-instance-of-migrated-singletons
176
177
  frameManager: SDK.FrameManager.FrameManager = SDK.FrameManager.FrameManager.instance()): Issue[] {
177
178
  const handler = issueCodeHandlers.get(inspectorIssue.code);
178
179
  if (handler) {
@@ -203,6 +204,7 @@ export function defaultHideIssueByCodeSetting(): HideIssueMenuSetting {
203
204
  return setting;
204
205
  }
205
206
 
207
+ // eslint-disable-next-line @devtools/no-instance-of-migrated-singletons
206
208
  export function getHideIssueByCodeSetting(settings: Common.Settings.Settings = Common.Settings.Settings.instance()):
207
209
  Common.Settings.Setting<HideIssueMenuSetting> {
208
210
  return settings.createSetting('hide-issue-by-code-setting-experiment-2021', defaultHideIssueByCodeSetting());
@@ -235,13 +237,18 @@ export class IssuesManager extends Common.ObjectWrapper.ObjectWrapper<EventTypes
235
237
  constructor(
236
238
  private readonly showThirdPartyIssuesSetting?: Common.Settings.Setting<boolean>,
237
239
  private readonly hideIssueSetting?: Common.Settings.Setting<HideIssueMenuSetting>,
240
+ // eslint-disable-next-line @devtools/no-instance-of-migrated-singletons
238
241
  frameManager: SDK.FrameManager.FrameManager = SDK.FrameManager.FrameManager.instance(),
242
+ // eslint-disable-next-line @devtools/no-instance-of-migrated-singletons
239
243
  targetManager: SDK.TargetManager.TargetManager = SDK.TargetManager.TargetManager.instance(),
244
+ // eslint-disable-next-line @devtools/no-instance-of-migrated-singletons
240
245
  workspace: Workspace.Workspace.WorkspaceImpl = Workspace.Workspace.WorkspaceImpl.instance(),
241
246
  debuggerWorkspaceBinding: Bindings.DebuggerWorkspaceBinding.DebuggerWorkspaceBinding =
242
- Bindings.DebuggerWorkspaceBinding.DebuggerWorkspaceBinding.instance(),
247
+ // eslint-disable-next-line @devtools/no-instance-of-migrated-singletons
248
+ Bindings.DebuggerWorkspaceBinding.DebuggerWorkspaceBinding.instance(),
243
249
  cssWorkspaceBinding: Bindings.CSSWorkspaceBinding.CSSWorkspaceBinding =
244
- Bindings.CSSWorkspaceBinding.CSSWorkspaceBinding.instance(),
250
+ // eslint-disable-next-line @devtools/no-instance-of-migrated-singletons
251
+ Bindings.CSSWorkspaceBinding.CSSWorkspaceBinding.instance(),
245
252
  ) {
246
253
  super();
247
254
  this.#frameManager = frameManager;
@@ -523,6 +530,7 @@ export interface EventTypes {
523
530
 
524
531
  // @ts-expect-error
525
532
  globalThis.addIssueForTest = (issue: Protocol.Audits.InspectorIssue) => {
533
+ // eslint-disable-next-line @devtools/no-instance-of-migrated-singletons
526
534
  const mainTarget = SDK.TargetManager.TargetManager.instance().primaryPageTarget();
527
535
  const issuesModel = mainTarget?.model(SDK.IssuesModel.IssuesModel);
528
536
  issuesModel?.issueAdded({issue});
@@ -14,6 +14,13 @@ import * as CrUXManager from '../crux-manager/crux-manager.js';
14
14
 
15
15
  import * as Spec from './web-vitals-injected/spec/spec.js';
16
16
 
17
+ export const timelineEnableSoftNavigationsSettingDescriptor: Common.Settings.SettingDescriptor<boolean> = {
18
+ name: 'timeline-enable-soft-navigations',
19
+ type: Common.Settings.SettingType.BOOLEAN,
20
+ storageType: Common.Settings.SettingStorageType.SYNCED,
21
+ defaultValue: true,
22
+ };
23
+
17
24
  const UIStrings = {
18
25
  /**
19
26
  * @description Warning text indicating that the Largest Contentful Paint (LCP) performance metric was affected by the user changing the simulated device.
@@ -61,18 +68,19 @@ export class LiveMetrics extends Common.ObjectWrapper.ObjectWrapper<EventTypes>
61
68
  #mutex = new Common.Mutex.Mutex();
62
69
  readonly #targetManager: SDK.TargetManager.TargetManager;
63
70
  readonly #deviceModeModel: EmulationModel.DeviceModeModel.DeviceModeModel|null;
71
+ readonly #settings: Common.Settings.Settings;
64
72
 
65
- constructor(targetManager: SDK.TargetManager.TargetManager,
73
+ constructor(targetManager: SDK.TargetManager.TargetManager, settings: Common.Settings.Settings,
66
74
  deviceModeModel: EmulationModel.DeviceModeModel.DeviceModeModel|null) {
67
75
  super();
68
76
  this.#targetManager = targetManager;
77
+ this.#settings = settings;
69
78
  this.#deviceModeModel = deviceModeModel;
70
79
  this.#targetManager.observeTargets(this, {scoped: true});
71
80
  this.#targetManager.addModelListener(SDK.ResourceTreeModel.ResourceTreeModel,
72
81
  SDK.ResourceTreeModel.Events.PrimaryPageChanged, this.#onPrimaryPageChanged,
73
82
  this);
74
- Common.Settings.Settings.instance()
75
- .moduleSetting('timeline-enable-soft-navigations')
83
+ this.#settings.resolve(timelineEnableSoftNavigationsSettingDescriptor)
76
84
  .addChangeListener(this.#onSettingChanged, this);
77
85
  }
78
86
 
@@ -104,7 +112,8 @@ export class LiveMetrics extends Common.ObjectWrapper.ObjectWrapper<EventTypes>
104
112
  if (!Root.DevToolsContext.globalInstance().has(LiveMetrics) || forceNew) {
105
113
  Root.DevToolsContext.globalInstance().set(
106
114
  LiveMetrics,
107
- new LiveMetrics(SDK.TargetManager.TargetManager.instance(),
115
+ // eslint-disable-next-line @devtools/no-instance-of-migrated-singletons
116
+ new LiveMetrics(SDK.TargetManager.TargetManager.instance(), Common.Settings.Settings.instance(),
108
117
  EmulationModel.DeviceModeModel.DeviceModeModel.tryInstance()));
109
118
  }
110
119
 
@@ -149,6 +158,19 @@ export class LiveMetrics extends Common.ObjectWrapper.ObjectWrapper<EventTypes>
149
158
  return false;
150
159
  }
151
160
 
161
+ // Validate duration at runtime to prevent code injection via interpolation.
162
+ const duration = Number(interaction.duration);
163
+ if (!Number.isFinite(duration)) {
164
+ return false;
165
+ }
166
+
167
+ // JSON.stringify escapes quotes. We concatenate safeInteractionType (which is
168
+ // wrapped in double quotes) instead of interpolating it directly inside the
169
+ // single-quoted template below. This avoids syntax errors if the value contains
170
+ // single quotes (e.g. "pointer'"), which would otherwise terminate the
171
+ // single-quoted template string.
172
+ const safeInteractionType = JSON.stringify(interaction.interactionType ?? 'unknown');
173
+
152
174
  const scriptsTable = [];
153
175
  for (const loaf of interaction.longAnimationFrameTimings) {
154
176
  for (const script of loaf.scripts) {
@@ -179,8 +201,8 @@ export class LiveMetrics extends Common.ObjectWrapper.ObjectWrapper<EventTypes>
179
201
  '';
180
202
  await this.#target.runtimeAgent().invoke_evaluate({
181
203
  expression: `
182
- console.group('[DevTools] Long animation frames for ${interaction.duration}ms ${
183
- interaction.interactionType} interaction');
204
+ console.group('[DevTools] Long animation frames for ${duration}ms ' + ${
205
+ safeInteractionType} + ' interaction');
184
206
  console.log('Scripts${scriptLimitText}:');
185
207
  console.table(${JSON.stringify(scriptsTable)});
186
208
  console.log('Intersecting long animation frame events${loafLimitText}:', ${
@@ -206,6 +228,12 @@ export class LiveMetrics extends Common.ObjectWrapper.ObjectWrapper<EventTypes>
206
228
  */
207
229
  async #resolveNodeRef(index: number, executionContextId: Protocol.Runtime.ExecutionContextId):
208
230
  Promise<SDK.DOMModel.DOMNode|null> {
231
+ // Validate index at runtime because the payload comes from an untrusted binding
232
+ // and could contain malicious strings if type casted.
233
+ if (!Number.isInteger(index)) {
234
+ return null;
235
+ }
236
+
209
237
  if (!this.#target) {
210
238
  return null;
211
239
  }
@@ -412,7 +440,9 @@ export class LiveMetrics extends Common.ObjectWrapper.ObjectWrapper<EventTypes>
412
440
  this.#clearMetrics();
413
441
  this.#navigationType = webVitalsEvent.navigationType;
414
442
  if (webVitalsEvent.url) {
443
+ // eslint-disable-next-line @devtools/no-instance-of-migrated-singletons
415
444
  CrUXManager.CrUXManager.instance().setMainDocumentURL(webVitalsEvent.url);
445
+ // eslint-disable-next-line @devtools/no-instance-of-migrated-singletons
416
446
  void CrUXManager.CrUXManager.instance().refresh();
417
447
  }
418
448
  break;
@@ -445,7 +475,10 @@ export class LiveMetrics extends Common.ObjectWrapper.ObjectWrapper<EventTypes>
445
475
 
446
476
  const resourceTreeModel = this.#target.model(SDK.ResourceTreeModel.ResourceTreeModel);
447
477
  const primaryFrameId = resourceTreeModel?.mainFrame?.id;
448
- return Boolean(primaryFrameId && executionContext.frameId === primaryFrameId);
478
+ // Ensure the context belongs to our isolated world and is not the default
479
+ // page context, to prevent the page from spoofing events.
480
+ return Boolean(primaryFrameId && executionContext.frameId === primaryFrameId &&
481
+ executionContext.name === LIVE_METRICS_WORLD_NAME && !executionContext.isDefault);
449
482
  }
450
483
 
451
484
  async #onBindingCalled(event: {data: Protocol.Runtime.BindingCalledEvent}): Promise<void> {
@@ -546,8 +579,7 @@ export class LiveMetrics extends Common.ObjectWrapper.ObjectWrapper<EventTypes>
546
579
  });
547
580
  }
548
581
 
549
- const softNavsSettingValue =
550
- Common.Settings.Settings.instance().moduleSetting('timeline-enable-soft-navigations').get();
582
+ const softNavsSettingValue = this.#settings.resolve(timelineEnableSoftNavigationsSettingDescriptor).get();
551
583
  const source = `window.devToolsReportSoftNavs = ${softNavsSettingValue};\n` + await InjectedScript.get();
552
584
 
553
585
  // Inject the script
@@ -27,11 +27,14 @@ export class LogManager implements SDK.TargetManager.SDKModelObserver<SDK.LogMod
27
27
 
28
28
  static instance({forceNew}: {forceNew: boolean} = {forceNew: false}): LogManager {
29
29
  if (!Root.DevToolsContext.globalInstance().has(LogManager) || forceNew) {
30
- Root.DevToolsContext.globalInstance().set(LogManager,
31
- new LogManager(
32
- SDK.TargetManager.TargetManager.instance(),
33
- NetworkLog.instance(),
34
- ));
30
+ Root.DevToolsContext.globalInstance().set(
31
+ LogManager,
32
+ new LogManager(
33
+ // eslint-disable-next-line @devtools/no-instance-of-migrated-singletons
34
+ SDK.TargetManager.TargetManager.instance(),
35
+ // eslint-disable-next-line @devtools/no-instance-of-migrated-singletons
36
+ NetworkLog.instance(),
37
+ ));
35
38
  }
36
39
 
37
40
  return Root.DevToolsContext.globalInstance().get(LogManager);
@@ -56,6 +56,7 @@ export class NetworkLog extends Common.ObjectWrapper.ObjectWrapper<EventTypes> i
56
56
  static instance(): NetworkLog {
57
57
  if (!Root.DevToolsContext.globalInstance().has(NetworkLog)) {
58
58
  Root.DevToolsContext.globalInstance().set(
59
+ // eslint-disable-next-line @devtools/no-instance-of-migrated-singletons
59
60
  NetworkLog, new NetworkLog(SDK.TargetManager.TargetManager.instance(), Common.Settings.Settings.instance()));
60
61
  }
61
62
 
@@ -47,9 +47,7 @@ export class IsolatedFileSystemManager extends Common.ObjectWrapper.ObjectWrappe
47
47
  Host.InspectorFrontendHost.InspectorFrontendHostInstance.events.addEventListener(
48
48
  Host.InspectorFrontendHostAPI.Events.FileSystemRemoved, this.onFileSystemRemoved, this);
49
49
  Host.InspectorFrontendHost.InspectorFrontendHostInstance.events.addEventListener(
50
- Host.InspectorFrontendHostAPI.Events.FileSystemAdded, event => {
51
- this.onFileSystemAdded(event);
52
- }, this);
50
+ Host.InspectorFrontendHostAPI.Events.FileSystemAdded, this.onFileSystemAdded, this);
53
51
  Host.InspectorFrontendHost.InspectorFrontendHostInstance.events.addEventListener(
54
52
  Host.InspectorFrontendHostAPI.Events.FileSystemFilesChangedAddedRemoved, this.onFileSystemFilesChanged, this);
55
53
  Host.InspectorFrontendHost.InspectorFrontendHostInstance.events.addEventListener(
@@ -101,13 +99,33 @@ export class IsolatedFileSystemManager extends Common.ObjectWrapper.ObjectWrappe
101
99
  this.fileSystemsLoadedPromise = this.requestFileSystems();
102
100
  }
103
101
 
102
+ // TODO(crbug.com/542394587): Should be `Symbol.dispsoe`
103
+ dispose(): void {
104
+ Host.InspectorFrontendHost.InspectorFrontendHostInstance.events.removeEventListener(
105
+ Host.InspectorFrontendHostAPI.Events.FileSystemRemoved, this.onFileSystemRemoved, this);
106
+ Host.InspectorFrontendHost.InspectorFrontendHostInstance.events.removeEventListener(
107
+ Host.InspectorFrontendHostAPI.Events.FileSystemAdded, this.onFileSystemAdded, this);
108
+ Host.InspectorFrontendHost.InspectorFrontendHostInstance.events.removeEventListener(
109
+ Host.InspectorFrontendHostAPI.Events.FileSystemFilesChangedAddedRemoved, this.onFileSystemFilesChanged, this);
110
+ Host.InspectorFrontendHost.InspectorFrontendHostInstance.events.removeEventListener(
111
+ Host.InspectorFrontendHostAPI.Events.IndexingTotalWorkCalculated, this.onIndexingTotalWorkCalculated, this);
112
+ Host.InspectorFrontendHost.InspectorFrontendHostInstance.events.removeEventListener(
113
+ Host.InspectorFrontendHostAPI.Events.IndexingWorked, this.onIndexingWorked, this);
114
+ Host.InspectorFrontendHost.InspectorFrontendHostInstance.events.removeEventListener(
115
+ Host.InspectorFrontendHostAPI.Events.IndexingDone, this.onIndexingDone, this);
116
+ Host.InspectorFrontendHost.InspectorFrontendHostInstance.events.removeEventListener(
117
+ Host.InspectorFrontendHostAPI.Events.SearchCompleted, this.onSearchCompleted, this);
118
+ }
119
+
104
120
  static instance(opts: {
105
121
  forceNew?: boolean|null,
106
122
  settings?: Common.Settings.Settings|null,
107
123
  console?: Common.Console.Console|null,
108
124
  } = {}): IsolatedFileSystemManager {
109
125
  const forceNew = opts.forceNew ?? null;
126
+ // eslint-disable-next-line @devtools/no-instance-of-migrated-singletons
110
127
  const settings = opts.settings ?? Common.Settings.Settings.instance();
128
+ // eslint-disable-next-line @devtools/no-instance-of-migrated-singletons
111
129
  const console = opts.console ?? Common.Console.Console.instance();
112
130
  if (!Root.DevToolsContext.globalInstance().has(IsolatedFileSystemManager) || forceNew) {
113
131
  const instance = new IsolatedFileSystemManager(settings, console);
@@ -103,11 +103,17 @@ export class NetworkPersistenceManager extends Common.ObjectWrapper.ObjectWrappe
103
103
  NetworkPersistenceManager,
104
104
  new NetworkPersistenceManager(
105
105
  workspace,
106
+ // eslint-disable-next-line @devtools/no-instance-of-migrated-singletons
106
107
  PersistenceImpl.instance(),
108
+ // eslint-disable-next-line @devtools/no-instance-of-migrated-singletons
107
109
  Breakpoints.BreakpointManager.BreakpointManager.instance(),
110
+ // eslint-disable-next-line @devtools/no-instance-of-migrated-singletons
108
111
  SDK.TargetManager.TargetManager.instance(),
112
+ // eslint-disable-next-line @devtools/no-instance-of-migrated-singletons
109
113
  Common.Settings.Settings.instance(),
114
+ // eslint-disable-next-line @devtools/no-instance-of-migrated-singletons
110
115
  IsolatedFileSystemManager.instance(),
116
+ // eslint-disable-next-line @devtools/no-instance-of-migrated-singletons
111
117
  SDK.NetworkManager.MultitargetNetworkManager.instance(),
112
118
  ),
113
119
  );
@@ -4,7 +4,6 @@
4
4
 
5
5
  import * as Common from '../../core/common/common.js';
6
6
  import * as Platform from '../../core/platform/platform.js';
7
- import type * as Root from '../../core/root/root.js';
8
7
  import * as SDK from '../../core/sdk/sdk.js';
9
8
 
10
9
  /** The security origin for all DevTools (front-end) resources. */
@@ -107,23 +106,20 @@ export class ProjectSettingsModel extends Common.ObjectWrapper.ObjectWrapper<Eve
107
106
  }
108
107
 
109
108
  constructor(
110
- hostConfig: Root.Runtime.HostConfig,
111
109
  pageResourceLoader: SDK.PageResourceLoader.PageResourceLoader,
112
110
  targetManager: SDK.TargetManager.TargetManager,
113
111
  ) {
114
112
  super();
115
113
  this.#pageResourceLoader = pageResourceLoader;
116
114
  this.#targetManager = targetManager;
117
- if (hostConfig.devToolsWellKnown?.enabled) {
118
- this.#targetManager.addEventListener(
119
- SDK.TargetManager.Events.INSPECTED_URL_CHANGED,
120
- this.#inspectedURLChanged,
121
- this,
122
- );
123
- const target = this.#targetManager.primaryPageTarget();
124
- if (target !== null) {
125
- this.#inspectedURLChanged({data: target});
126
- }
115
+ this.#targetManager.addEventListener(
116
+ SDK.TargetManager.Events.INSPECTED_URL_CHANGED,
117
+ this.#inspectedURLChanged,
118
+ this,
119
+ );
120
+ const target = this.#targetManager.primaryPageTarget();
121
+ if (target !== null) {
122
+ this.#inspectedURLChanged({data: target});
127
123
  }
128
124
  }
129
125
 
@@ -46,7 +46,9 @@ export class SourceMapsResolver extends EventTarget {
46
46
  parsedTrace: Trace.TraceModel.ParsedTrace,
47
47
  entityMapper?: Trace.EntityMapper.EntityMapper,
48
48
  debuggerWorkspaceBinding: Bindings.DebuggerWorkspaceBinding.DebuggerWorkspaceBinding =
49
- Bindings.DebuggerWorkspaceBinding.DebuggerWorkspaceBinding.instance(),
49
+ // eslint-disable-next-line @devtools/no-instance-of-migrated-singletons
50
+ Bindings.DebuggerWorkspaceBinding.DebuggerWorkspaceBinding.instance(),
51
+ // eslint-disable-next-line @devtools/no-instance-of-migrated-singletons
50
52
  targetManager: SDK.TargetManager.TargetManager = SDK.TargetManager.TargetManager.instance(),
51
53
  ) {
52
54
  super();
@@ -92,7 +92,9 @@ export class IgnoreListManager extends Common.ObjectWrapper.ObjectWrapper<EventT
92
92
  Root.DevToolsContext.globalInstance().set(
93
93
  IgnoreListManager,
94
94
  new IgnoreListManager(
95
+ // eslint-disable-next-line @devtools/no-instance-of-migrated-singletons
95
96
  opts.settings ?? Common.Settings.Settings.instance(),
97
+ // eslint-disable-next-line @devtools/no-instance-of-migrated-singletons
96
98
  opts.targetManager ?? SDK.TargetManager.TargetManager.instance()));
97
99
  }
98
100
 
@@ -503,6 +503,7 @@ export class UISourceCode extends Common.ObjectWrapper.ObjectWrapper<EventTypes>
503
503
  return this.#disableEdit;
504
504
  }
505
505
 
506
+ // eslint-disable-next-line @devtools/no-instance-of-migrated-singletons
506
507
  isIgnoreListed(ignoreListManager: IgnoreListManager = IgnoreListManager.instance()): boolean {
507
508
  return ignoreListManager.isUserOrSourceMapIgnoreListedUISourceCode(this);
508
509
  }
@@ -608,6 +609,7 @@ export class UILocation {
608
609
  return this.columnNumber - other.columnNumber;
609
610
  }
610
611
 
612
+ // eslint-disable-next-line @devtools/no-instance-of-migrated-singletons
611
613
  isIgnoreListed(ignoreListManager: IgnoreListManager = IgnoreListManager.instance()): boolean {
612
614
  return this.uiSourceCode.isIgnoreListed(ignoreListManager);
613
615
  }
@@ -326,9 +326,13 @@ export function workspaceDiff({forceNew}: {forceNew?: boolean} = {}): WorkspaceD
326
326
  Root.DevToolsContext.globalInstance().set(
327
327
  WorkspaceDiffImpl,
328
328
  new WorkspaceDiffImpl(
329
+ // eslint-disable-next-line @devtools/no-instance-of-migrated-singletons
329
330
  Workspace.Workspace.WorkspaceImpl.instance(),
331
+ // eslint-disable-next-line @devtools/no-instance-of-migrated-singletons
330
332
  Persistence.Persistence.PersistenceImpl.instance(),
333
+ // eslint-disable-next-line @devtools/no-instance-of-migrated-singletons
331
334
  Persistence.NetworkPersistenceManager.NetworkPersistenceManager.instance(),
335
+ // eslint-disable-next-line @devtools/no-instance-of-migrated-singletons
332
336
  Common.Settings.Settings.instance(),
333
337
  ));
334
338
  }
@@ -734,8 +734,8 @@ export class AiAssistancePanel extends UI.Panel.Panel {
734
734
  void this.#startConversation(text, imageInput, multimodalInputType);
735
735
  };
736
736
 
737
- const seenSetting =
738
- Common.Settings.Settings.instance().moduleSetting('ai-assistance-v2-opt-in-change-dialog-seen');
737
+ const seenSetting = Common.Settings.Settings.instance().resolve(
738
+ AiAssistanceModel.AiUtils.aiAssistanceV2OptInChangeDialogSeenSettingDescriptor);
739
739
  if (!seenSetting.get()) {
740
740
  OptInChangeDialog.show({
741
741
  onGotIt: () => {
@@ -1751,7 +1751,7 @@ export class AiAssistancePanel extends UI.Panel.Panel {
1751
1751
  parts: [],
1752
1752
  id: crypto.randomUUID(),
1753
1753
  };
1754
- let step: Step = {isLoading: true};
1754
+ let step: Step = {state: {type: 'in_progress'}};
1755
1755
 
1756
1756
  /**
1757
1757
  * Commits the step to props only if necessary.
@@ -1771,7 +1771,6 @@ export class AiAssistancePanel extends UI.Panel.Panel {
1771
1771
  let announcedAnswerLoading = false;
1772
1772
  let announcedAnswerReady = false;
1773
1773
  for await (const data of items) {
1774
- step.requestApproval = undefined;
1775
1774
  switch (data.type) {
1776
1775
  case AiAssistanceModel.AiAgent.ResponseType.USER_QUERY: {
1777
1776
  this.#messages.push({
@@ -1797,7 +1796,7 @@ export class AiAssistancePanel extends UI.Panel.Panel {
1797
1796
  break;
1798
1797
  }
1799
1798
  case AiAssistanceModel.AiAgent.ResponseType.QUERYING: {
1800
- step = {isLoading: true};
1799
+ step = {state: {type: 'in_progress'}};
1801
1800
  if (!systemMessage.parts.length) {
1802
1801
  commitStep();
1803
1802
  }
@@ -1808,7 +1807,7 @@ export class AiAssistancePanel extends UI.Panel.Panel {
1808
1807
  step.title = lockedString(UIStringsNotTranslate.analyzingData);
1809
1808
  step.contextDetails = data.details;
1810
1809
  step.widgets = data.widgets;
1811
- step.isLoading = false;
1810
+ step.state = {type: 'completed'};
1812
1811
  commitStep();
1813
1812
  break;
1814
1813
  }
@@ -1818,7 +1817,7 @@ export class AiAssistancePanel extends UI.Panel.Panel {
1818
1817
  break;
1819
1818
  }
1820
1819
  case AiAssistanceModel.AiAgent.ResponseType.THOUGHT: {
1821
- step.isLoading = false;
1820
+ step.state = {type: 'completed'};
1822
1821
  step.thought = data.thought;
1823
1822
  commitStep();
1824
1823
  break;
@@ -1837,24 +1836,25 @@ export class AiAssistancePanel extends UI.Panel.Panel {
1837
1836
  break;
1838
1837
  }
1839
1838
  case AiAssistanceModel.AiAgent.ResponseType.SIDE_EFFECT: {
1840
- step.isLoading = false;
1841
1839
  step.code ??= data.code;
1842
- step.requestApproval = {
1843
- description: data.description,
1844
- onAnswer: (result: boolean) => {
1845
- data.confirm(result);
1846
- step.requestApproval = undefined;
1847
- this.requestUpdate();
1840
+ step.state = {
1841
+ type: 'needs_approval',
1842
+ sideEffectDialog: {
1843
+ description: data.description,
1844
+ onAnswer: (result: boolean) => {
1845
+ data.confirm(result);
1846
+ step.state = {type: 'completed'};
1847
+ this.requestUpdate();
1848
+ },
1848
1849
  },
1849
1850
  };
1850
1851
  commitStep();
1851
1852
  break;
1852
1853
  }
1853
1854
  case AiAssistanceModel.AiAgent.ResponseType.ACTION: {
1854
- step.isLoading = false;
1855
+ step.state = data.canceled ? {type: 'canceled'} : {type: 'completed'};
1855
1856
  step.code ??= data.code;
1856
1857
  step.output ??= data.output;
1857
- step.canceled = data.canceled;
1858
1858
  step.widgets ??= data.widgets;
1859
1859
  commitStep();
1860
1860
  break;
@@ -1890,12 +1890,12 @@ export class AiAssistancePanel extends UI.Panel.Panel {
1890
1890
  // TODO(crbug.com/463323934): Remove specially handling this case.
1891
1891
  if (systemMessage.parts.length > 1) {
1892
1892
  const firstPart = systemMessage.parts[0];
1893
- if (firstPart.type === 'step' && firstPart.step.isLoading && !firstPart.step.thought &&
1893
+ if (firstPart.type === 'step' && firstPart.step.state.type === 'in_progress' && !firstPart.step.thought &&
1894
1894
  !firstPart.step.code && !firstPart.step.contextDetails) {
1895
1895
  systemMessage.parts.shift();
1896
1896
  }
1897
1897
  }
1898
- step.isLoading = false;
1898
+ step.state = {type: 'completed'};
1899
1899
  break;
1900
1900
  }
1901
1901
  case AiAssistanceModel.AiAgent.ResponseType.ERROR: {
@@ -1905,9 +1905,9 @@ export class AiAssistancePanel extends UI.Panel.Panel {
1905
1905
  const lastStep = lastPart.step;
1906
1906
  // Mark the last step as cancelled to make the UI feel better.
1907
1907
  if (data.error === AiAssistanceModel.AiAgent.ErrorType.ABORT) {
1908
- lastStep.canceled = true;
1908
+ lastStep.state = {type: 'canceled'};
1909
1909
  // If error happens while the step is still loading remove it.
1910
- } else if (lastStep.isLoading) {
1910
+ } else if (lastStep.state.type === 'in_progress') {
1911
1911
  systemMessage.parts.pop();
1912
1912
  }
1913
1913
  }
@@ -1923,10 +1923,10 @@ export class AiAssistancePanel extends UI.Panel.Panel {
1923
1923
 
1924
1924
  case AiAssistanceModel.AiAgent.ResponseType.CONTEXT_CHANGE: {
1925
1925
  this.#handleConversationContextChange(data.context);
1926
- step.isLoading = false;
1926
+ step.state = {type: 'completed'};
1927
1927
  step.widgets = data.widgets;
1928
1928
  commitStep();
1929
- step = {isLoading: true};
1929
+ step = {state: {type: 'in_progress'}};
1930
1930
  break;
1931
1931
  }
1932
1932
  }
@@ -166,13 +166,6 @@ Common.Settings.registerSettingExtension({
166
166
  },
167
167
  });
168
168
 
169
- Common.Settings.registerSettingExtension({
170
- category: Common.Settings.SettingCategory.AI,
171
- settingName: 'ai-assistance-v2-opt-in-change-dialog-seen',
172
- settingType: Common.Settings.SettingType.BOOLEAN,
173
- defaultValue: false,
174
- });
175
-
176
169
  UI.ActionRegistration.registerActionExtension({
177
170
  actionId: 'freestyler.main-menu',
178
171
  contextTypes(): [] {
@@ -802,6 +802,10 @@ export class ChatInput extends UI.Widget.Widget implements SDK.TargetManager.Obs
802
802
  const imageInput = !this.#imageInput?.isLoading && this.#imageInput?.data ?
803
803
  {inlineData: {data: this.#imageInput.data, mimeType: this.#imageInput.mimeType}} :
804
804
  undefined;
805
+ const text = this.#textAreaRef.value?.value?.trim() ?? '';
806
+ if (!text && !imageInput) {
807
+ return;
808
+ }
805
809
  this.onTextSubmit(this.#textAreaRef.value?.value ?? '', imageInput, this.#imageInput?.inputType);
806
810
  this.#imageInput = undefined;
807
811
  this.#historyOffset = -1;