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.
- package/.agents/skills/fixing-skipped-tests/SKILL.md +6 -6
- package/.agents/skills/gerrit-cli/SKILL.md +4 -10
- package/.agents/skills/gerrit-cli/references/commands.md +45 -2
- package/.agents/skills/gerrit-cli/references/workflows.md +7 -0
- package/.agents/skills/gerrit-cli/scripts/import_upstream.py +34 -152
- package/config/typescript/tsconfig.eslint.json +1 -1
- package/docs/contributing/settings-experiments-features.md +2 -8
- package/docs/ecosystem/automatic_workspace_folders.md +0 -19
- package/eslint.config.mjs +2 -2
- package/front_end/core/common/Lazy.ts +3 -3
- package/front_end/core/common/SettingRegistration.ts +0 -7
- package/front_end/core/common/Settings.ts +0 -38
- package/front_end/core/host/UserMetrics.ts +187 -953
- package/front_end/core/host/UserMetricsEnums.d.ts +949 -0
- package/front_end/core/root/Runtime.ts +21 -133
- package/front_end/core/sdk/CSSMetadata.ts +70 -65
- package/front_end/core/sdk/CategorizedBreakpoint.ts +0 -1
- package/front_end/core/sdk/ChildTargetManager.ts +0 -2
- package/front_end/core/sdk/EmulationModel.ts +0 -2
- package/front_end/core/sdk/EventBreakpointsModel.ts +0 -4
- package/front_end/core/sdk/NetworkManager.ts +0 -3
- package/front_end/core/sdk/PageResourceLoader.ts +9 -9
- package/front_end/core/sdk/RehydratingConnection.ts +52 -4
- package/front_end/core/sdk/Target.ts +0 -4
- package/front_end/devtools_compatibility.js +886 -0
- package/front_end/entrypoints/inspector_main/RenderingOptions.ts +7 -6
- package/front_end/entrypoints/main/ExecutionContextSelector.ts +0 -1
- package/front_end/entrypoints/main/MainImpl.ts +18 -22
- package/front_end/foundation/Universe.ts +7 -2
- package/front_end/generated/InspectorBackendCommands.ts +3 -10
- package/front_end/generated/protocol-mapping.d.ts +0 -42
- package/front_end/generated/protocol-proxy-api.d.ts +0 -38
- package/front_end/generated/protocol.ts +9 -169
- package/front_end/models/ai_assistance/AiAgent2.ts +11 -3
- package/front_end/models/ai_assistance/AiConversation.ts +1 -0
- package/front_end/models/ai_assistance/AiHistoryStorage.ts +8 -5
- package/front_end/models/ai_assistance/AiSetting.ts +108 -0
- package/front_end/models/ai_assistance/AiUtils.ts +47 -0
- package/front_end/models/ai_assistance/ChangeManager.ts +1 -0
- package/front_end/models/ai_assistance/ExtensionScope.ts +3 -12
- package/front_end/models/ai_assistance/agents/AiAgent.ts +11 -18
- package/front_end/models/ai_assistance/agents/ContextSelectionAgent.ts +3 -0
- package/front_end/models/ai_assistance/agents/ExecuteJavascript.ts +42 -17
- package/front_end/models/ai_assistance/agents/PerformanceAgent.ts +3 -2
- package/front_end/models/ai_assistance/agents/StorageAgent.ts +253 -155
- package/front_end/models/ai_assistance/agents/StylingAgent.snapshot.txt +2 -2
- package/front_end/models/ai_assistance/ai_assistance.ts +4 -0
- package/front_end/models/ai_assistance/contexts/PerformanceTraceContext.ts +12 -6
- package/front_end/models/ai_assistance/data_formatters/FileFormatter.ts +3 -1
- package/front_end/models/ai_assistance/data_formatters/NetworkRequestFormatter.ts +1 -0
- package/front_end/models/ai_assistance/data_formatters/PerformanceTraceFormatter.ts +1 -0
- package/front_end/models/ai_assistance/injected.ts +1 -0
- package/front_end/models/ai_assistance/performance/AICallTree.ts +1 -0
- package/front_end/models/ai_assistance/skills/Skill.ts +1 -1
- package/front_end/models/ai_assistance/skills/SkillRegistry.ts +2 -0
- package/front_end/models/ai_assistance/skills/performance.md +10 -0
- package/front_end/models/ai_assistance/tools/ExecuteJavaScript.ts +52 -5
- package/front_end/models/ai_assistance/tools/GetElementAccessibilityDetails.ts +4 -4
- package/front_end/models/ai_assistance/tools/GetLighthouseAudits.ts +4 -4
- package/front_end/models/ai_assistance/tools/GetNetworkRequestDetails.ts +5 -4
- package/front_end/models/ai_assistance/tools/GetStyles.ts +5 -4
- package/front_end/models/ai_assistance/tools/ListNetworkRequests.ts +5 -4
- package/front_end/models/ai_assistance/tools/README.md +1 -1
- package/front_end/models/ai_assistance/tools/RecordPerformanceTrace.ts +63 -0
- package/front_end/models/ai_assistance/tools/ResolveDevtoolsNodePath.ts +5 -5
- package/front_end/models/ai_assistance/tools/Tool.ts +118 -24
- package/front_end/models/ai_assistance/tools/ToolRegistry.ts +2 -0
- package/front_end/models/badges/UserBadges.ts +2 -0
- package/front_end/models/bindings/NetworkProject.ts +5 -0
- package/front_end/models/bindings/ResourceScriptMapping.ts +2 -0
- package/front_end/models/bindings/ResourceUtils.ts +3 -0
- package/front_end/models/crux-manager/CrUXManager.ts +1 -0
- package/front_end/models/emulation/DeviceModeModel.ts +140 -7
- package/front_end/models/emulation/EmulatedDevices.ts +246 -793
- package/front_end/models/issues_manager/IssuesManager.ts +10 -2
- package/front_end/models/live-metrics/LiveMetrics.ts +41 -9
- package/front_end/models/logs/LogManager.ts +8 -5
- package/front_end/models/logs/NetworkLog.ts +1 -0
- package/front_end/models/persistence/IsolatedFileSystemManager.ts +21 -3
- package/front_end/models/persistence/NetworkPersistenceManager.ts +6 -0
- package/front_end/models/project_settings/ProjectSettingsModel.ts +8 -12
- package/front_end/models/trace_source_maps_resolver/SourceMapsResolver.ts +3 -1
- package/front_end/models/workspace/IgnoreListManager.ts +2 -0
- package/front_end/models/workspace/UISourceCode.ts +2 -0
- package/front_end/models/workspace_diff/WorkspaceDiff.ts +4 -0
- package/front_end/panels/ai_assistance/AiAssistancePanel.ts +22 -22
- package/front_end/panels/ai_assistance/ai_assistance-meta.ts +0 -7
- package/front_end/panels/ai_assistance/components/ChatInput.ts +4 -0
- package/front_end/panels/ai_assistance/components/ChatMessage.ts +79 -34
- package/front_end/panels/ai_assistance/components/WalkthroughView.ts +1 -2
- package/front_end/panels/ai_assistance/components/walkthroughView.css +1 -1
- package/front_end/panels/application/ApplicationPanelSidebar.ts +9 -106
- package/front_end/panels/application/ApplicationPanelTreeElement.ts +1 -1
- package/front_end/panels/application/application.ts +0 -10
- package/front_end/panels/application/components/components.ts +0 -4
- package/front_end/panels/browser_debugger/CategorizedBreakpointsSidebarPane.ts +0 -5
- package/front_end/panels/browser_debugger/EventListenerBreakpointsSidebarPane.ts +6 -12
- package/front_end/panels/browser_debugger/browser_debugger-meta.ts +5 -3
- package/front_end/panels/console/ConsoleFormat.ts +2 -62
- package/front_end/panels/console/ConsoleViewMessage.ts +14 -7
- package/front_end/panels/emulation/AdvancedApp.ts +1 -2
- package/front_end/panels/emulation/DeviceModeToolbar.ts +83 -69
- package/front_end/panels/emulation/DeviceModeView.ts +4 -134
- package/front_end/panels/emulation/DeviceModeWrapper.ts +52 -69
- package/front_end/panels/emulation/MediaQueryInspector.ts +2 -2
- package/front_end/panels/emulation/emulation-meta.ts +12 -12
- package/front_end/panels/issues/IssuesPane.ts +3 -1
- package/front_end/panels/lighthouse/LighthouseController.ts +6 -0
- package/front_end/panels/linear_memory_inspector/components/LinearMemoryInspector.ts +17 -21
- package/front_end/panels/linear_memory_inspector/components/LinearMemoryNavigator.ts +206 -126
- package/front_end/panels/linear_memory_inspector/components/linearMemoryInspector.css +1 -1
- package/front_end/panels/mobile_throttling/CalibrationController.ts +1 -1
- package/front_end/panels/mobile_throttling/MobileThrottlingSelector.ts +3 -3
- package/front_end/panels/mobile_throttling/NetworkPanelIndicator.ts +6 -6
- package/front_end/panels/mobile_throttling/NetworkThrottlingSelector.ts +11 -11
- package/front_end/panels/mobile_throttling/ThrottlingManager.ts +13 -13
- package/front_end/panels/mobile_throttling/ThrottlingPresets.ts +10 -10
- package/front_end/panels/mobile_throttling/ThrottlingSettingsTab.ts +28 -28
- package/front_end/panels/mobile_throttling/mobile_throttling-meta.ts +6 -6
- package/front_end/panels/network/RequestHeadersView.ts +1 -1
- package/front_end/panels/network/ResourceChunkView.ts +243 -144
- package/front_end/panels/network/ResourceDirectSocketChunkView.ts +52 -29
- package/front_end/panels/network/ResourceWebSocketFrameView.ts +21 -35
- package/front_end/panels/network/resourceChunkView.css +41 -36
- package/front_end/panels/profiler/HeapDetachedElementsDataGrid.ts +21 -12
- package/front_end/panels/profiler/profiler.ts +4 -0
- package/front_end/panels/recorder/RecorderPanel.ts +6 -14
- package/front_end/panels/sensors/LocationsSettingsTab.ts +7 -7
- package/front_end/panels/settings/AISettingsTab.ts +75 -31
- package/front_end/panels/settings/SettingsScreen.ts +8 -13
- package/front_end/panels/settings/components/SyncSection.ts +3 -4
- package/front_end/panels/settings/emulation/DevicesSettingsTab.ts +200 -18
- package/front_end/panels/settings/emulation/devicesSettingsTab.css +18 -0
- package/front_end/panels/settings/settings-meta.ts +0 -1
- package/front_end/panels/sources/CategorizedBreakpointL10n.ts +0 -2
- package/front_end/panels/sources/DebuggerPausedMessage.ts +11 -5
- package/front_end/panels/sources/DebuggerPlugin.ts +1 -1
- package/front_end/panels/sources/EditingLocationHistoryManager.ts +12 -9
- package/front_end/panels/sources/SourcesPanel.ts +19 -17
- package/front_end/panels/sources/SourcesView.ts +191 -96
- package/front_end/panels/sources/TabbedEditorContainer.ts +3 -4
- package/front_end/panels/sources/WatchExpressionsSidebarPane.ts +2 -5
- package/front_end/panels/timeline/TimelineUIUtils.ts +15 -0
- package/front_end/panels/timeline/timeline-meta.ts +3 -5
- package/front_end/third_party/chromium/README.chromium +1 -1
- package/front_end/third_party/codemirror.next/chunk/angular.js +1 -1
- package/front_end/third_party/codemirror.next/chunk/codemirror.js +1 -1
- package/front_end/third_party/codemirror.next/chunk/codemirror.js.map +1 -1
- package/front_end/third_party/codemirror.next/chunk/cpp.js +1 -1
- package/front_end/third_party/codemirror.next/chunk/cpp.js.map +1 -1
- package/front_end/third_party/codemirror.next/chunk/java.js +1 -1
- package/front_end/third_party/codemirror.next/chunk/java.js.map +1 -1
- package/front_end/third_party/codemirror.next/chunk/legacy.js +1 -1
- package/front_end/third_party/codemirror.next/chunk/less.js +1 -1
- package/front_end/third_party/codemirror.next/chunk/less.js.map +1 -1
- package/front_end/third_party/codemirror.next/chunk/markdown.js +1 -1
- package/front_end/third_party/codemirror.next/chunk/markdown.js.map +1 -1
- package/front_end/third_party/codemirror.next/chunk/php.js +1 -1
- package/front_end/third_party/codemirror.next/chunk/php.js.map +1 -1
- package/front_end/third_party/codemirror.next/chunk/python.js +1 -1
- package/front_end/third_party/codemirror.next/chunk/python.js.map +1 -1
- package/front_end/third_party/codemirror.next/chunk/sass.js +1 -1
- package/front_end/third_party/codemirror.next/chunk/sass.js.map +1 -1
- package/front_end/third_party/codemirror.next/chunk/svelte.js +1 -1
- package/front_end/third_party/codemirror.next/chunk/svelte.js.map +1 -1
- package/front_end/third_party/codemirror.next/chunk/vue.js +1 -1
- package/front_end/third_party/codemirror.next/chunk/wast.js +1 -1
- package/front_end/third_party/codemirror.next/chunk/wast.js.map +1 -1
- package/front_end/third_party/codemirror.next/chunk/xml.js +1 -1
- package/front_end/third_party/codemirror.next/chunk/xml.js.map +1 -1
- package/front_end/third_party/codemirror.next/codemirror.next.d.ts +1332 -193
- package/front_end/third_party/codemirror.next/codemirror.next.js +1 -1
- package/front_end/third_party/codemirror.next/rebuild.sh +1 -1
- package/front_end/tsconfig.compatibility.json +2 -1
- package/front_end/tsconfig.json +1 -1
- package/front_end/ui/components/icon_button/IconButton.ts +1 -1
- package/front_end/ui/components/issue_counter/IssueCounter.ts +1 -1
- package/front_end/ui/components/settings/SettingCheckbox.ts +4 -7
- package/front_end/ui/components/settings/settings.ts +1 -2
- package/front_end/ui/legacy/Treeoutline.ts +52 -30
- package/front_end/ui/legacy/components/object_ui/CSSStyleSanitizer.ts +74 -0
- package/front_end/ui/legacy/components/object_ui/CustomPreviewComponent.ts +6 -1
- package/front_end/ui/legacy/components/object_ui/ObjectPropertiesSection.ts +47 -54
- package/front_end/ui/legacy/components/object_ui/object_ui.ts +2 -0
- package/front_end/ui/legacy/components/quick_open/CommandMenu.ts +5 -27
- package/front_end/ui/legacy/components/settings_ui/SettingsUI.ts +10 -12
- package/front_end/ui/settings/SettingUIRegistration.ts +0 -8
- package/front_end/ui/visual_logging/KnownContextValues.ts +21 -0
- package/inspector_overlay/tsconfig.json +8 -2
- package/package.json +3 -2
- package/.agents/skills/gerrit-cli/scripts/gerrit_client_wrapper.py +0 -47
- package/front_end/core/sdk/CSSModel.test.api.ts +0 -102
- package/front_end/core/sdk/DOMModel.test.api.ts +0 -104
- package/front_end/foundation/Universe.test.api.ts +0 -73
- package/front_end/panels/application/SharedStorageEventsView.ts +0 -128
- package/front_end/panels/application/SharedStorageItemsView.ts +0 -179
- package/front_end/panels/application/SharedStorageListTreeElement.ts +0 -65
- package/front_end/panels/application/SharedStorageModel.ts +0 -249
- package/front_end/panels/application/SharedStorageTreeElement.ts +0 -40
- package/front_end/panels/application/components/SharedStorageAccessGrid.ts +0 -191
- package/front_end/panels/application/components/SharedStorageMetadataView.ts +0 -133
- package/front_end/panels/application/components/sharedStorageAccessGrid.css +0 -29
- package/front_end/panels/application/components/sharedStorageMetadataView.css +0 -29
- package/front_end/panels/application/sharedStorageEventsView.css +0 -9
- package/front_end/panels/network/OriginalResourceChunkView.ts +0 -340
- package/front_end/panels/network/originalResourceChunkView.css +0 -49
- package/front_end/ui/components/settings/SettingDeprecationWarning.ts +0 -47
- 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
|
-
|
|
247
|
+
// eslint-disable-next-line @devtools/no-instance-of-migrated-singletons
|
|
248
|
+
Bindings.DebuggerWorkspaceBinding.DebuggerWorkspaceBinding.instance(),
|
|
243
249
|
cssWorkspaceBinding: Bindings.CSSWorkspaceBinding.CSSWorkspaceBinding =
|
|
244
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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 ${
|
|
183
|
-
|
|
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
|
-
|
|
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(
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
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,
|
|
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
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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 = {
|
|
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 = {
|
|
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.
|
|
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.
|
|
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.
|
|
1843
|
-
|
|
1844
|
-
|
|
1845
|
-
data.
|
|
1846
|
-
|
|
1847
|
-
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
1908
|
+
lastStep.state = {type: 'canceled'};
|
|
1909
1909
|
// If error happens while the step is still loading remove it.
|
|
1910
|
-
} else if (lastStep.
|
|
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.
|
|
1926
|
+
step.state = {type: 'completed'};
|
|
1927
1927
|
step.widgets = data.widgets;
|
|
1928
1928
|
commitStep();
|
|
1929
|
-
step = {
|
|
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;
|