chrome-devtools-frontend
Version:
Chrome DevTools UI
313 lines (244 loc) • 14.5 kB
text/typescript
// Copyright 2025 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import * as Common from '../core/common/common.js';
import * as Host from '../core/host/host.js';
import * as Root from '../core/root/root.js';
import * as SDK from '../core/sdk/sdk.js';
import * as AiAssistance from '../models/ai_assistance/ai_assistance.js';
import * as AutofillManager from '../models/autofill_manager/autofill_manager.js';
import * as Badges from '../models/badges/badges.js';
import * as Bindings from '../models/bindings/bindings.js';
import * as Breakpoints from '../models/breakpoints/breakpoints.js';
import * as CrUXManager from '../models/crux-manager/crux-manager.js';
import * as Emulation from '../models/emulation/emulation.js';
import * as JavaScriptMetadata from '../models/javascript_metadata/javascript_metadata.js';
import * as LiveMetrics from '../models/live-metrics/live-metrics.js';
import * as Logs from '../models/logs/logs.js';
import * as Persistence from '../models/persistence/persistence.js';
import * as ProjectSettings from '../models/project_settings/project_settings.js';
import * as Workspace from '../models/workspace/workspace.js';
import * as WorkspaceDiff from '../models/workspace_diff/workspace_diff.js';
export interface CreationOptions {
settingsCreationOptions: Omit<Common.Settings.SettingsCreationOptions, 'console'>;
overrideAutoStartModels?: Set<SDK.SDKModel.SDKModelConstructor>;
hostConfig: Root.Runtime.HostConfig;
inspectorFrontendHost: Host.InspectorFrontendHostAPI.InspectorFrontendHostAPI;
supportsEmulation: boolean;
}
export class Universe {
// TODO(crbug.com/493763857): Once a singleton is no longer a singleton (i.e. it has no 'instance')
// static method, we can move it out of the `DevToolsContext` and store it
// directly on the `Universe`.
readonly context: Root.DevToolsContext.DevToolsContext;
readonly autofillManager: AutofillManager.AutofillManager.AutofillManager;
readonly supportsEmulation: boolean;
readonly fileSystemWorkspaceBinding: Persistence.FileSystemWorkspaceBinding.FileSystemWorkspaceBinding;
constructor(options: CreationOptions) {
const context = new Root.DevToolsContext.WritableDevToolsContext();
this.context = context;
const console = new Common.Console.Console();
context.set(Common.Console.Console, console);
const hostConfigTracker = new Host.AidaClient.HostConfigTracker();
context.set(Host.AidaClient.HostConfigTracker, hostConfigTracker);
const gdpClient = new Host.GdpClient.GdpClient();
context.set(Host.GdpClient.GdpClient, gdpClient);
// TODO(crbug.com/458180550): Store instance only on this.context instead.
// For now the global is required as not everything in foundation cleanly
// reads from the scoped `Settings` instance.
const settings = Common.Settings.Settings.instance({
forceNew: true,
console,
...options.settingsCreationOptions,
});
context.set(Common.Settings.Settings, settings);
const emulatedDevicesList = new Emulation.EmulatedDevices.EmulatedDevicesList(settings);
context.set(Emulation.EmulatedDevices.EmulatedDevicesList, emulatedDevicesList);
const isolatedFileSystemManager =
new Persistence.IsolatedFileSystemManager.IsolatedFileSystemManager(settings, console);
context.set(Persistence.IsolatedFileSystemManager.IsolatedFileSystemManager, isolatedFileSystemManager);
const targetManager = new SDK.TargetManager.TargetManager(context, options.overrideAutoStartModels);
context.set(SDK.TargetManager.TargetManager, targetManager);
const frameManager = new SDK.FrameManager.FrameManager(targetManager);
context.set(SDK.FrameManager.FrameManager, frameManager);
const multitargetNetworkManager = new SDK.NetworkManager.MultitargetNetworkManager(targetManager);
context.set(SDK.NetworkManager.MultitargetNetworkManager, multitargetNetworkManager);
this.supportsEmulation = options.supportsEmulation;
let deviceModeModel = null;
if (options.supportsEmulation) {
deviceModeModel =
new Emulation.DeviceModeModel.DeviceModeModel(targetManager, settings, multitargetNetworkManager);
context.set(Emulation.DeviceModeModel.DeviceModeModel, deviceModeModel);
}
const pageResourceLoader =
new SDK.PageResourceLoader.PageResourceLoader(targetManager, settings, multitargetNetworkManager, null);
context.set(SDK.PageResourceLoader.PageResourceLoader, pageResourceLoader);
const projectSettingsModel = new ProjectSettings.ProjectSettingsModel.ProjectSettingsModel(
options.hostConfig,
pageResourceLoader,
targetManager,
);
context.set(ProjectSettings.ProjectSettingsModel.ProjectSettingsModel, projectSettingsModel);
const automaticFileSystemManager = new Persistence.AutomaticFileSystemManager.AutomaticFileSystemManager(
options.inspectorFrontendHost, projectSettingsModel);
context.set(Persistence.AutomaticFileSystemManager.AutomaticFileSystemManager, automaticFileSystemManager);
const cpuThrottlingManager = new SDK.CPUThrottlingManager.CPUThrottlingManager(settings, targetManager);
context.set(SDK.CPUThrottlingManager.CPUThrottlingManager, cpuThrottlingManager);
const domDebuggerManager = new SDK.DOMDebuggerModel.DOMDebuggerManager(targetManager);
context.set(SDK.DOMDebuggerModel.DOMDebuggerManager, domDebuggerManager);
const cruxManager = new CrUXManager.CrUXManager(targetManager, settings);
context.set(CrUXManager.CrUXManager, cruxManager);
const isolateManager = new SDK.IsolateManager.IsolateManager(targetManager);
context.set(SDK.IsolateManager.IsolateManager, isolateManager);
const eventBreakpointsManager = new SDK.EventBreakpointsModel.EventBreakpointsManager(targetManager);
context.set(SDK.EventBreakpointsModel.EventBreakpointsManager, eventBreakpointsManager);
const domModelUndoStack = new SDK.DOMModel.DOMModelUndoStack();
context.set(SDK.DOMModel.DOMModelUndoStack, domModelUndoStack);
const workspace = new Workspace.Workspace.WorkspaceImpl();
context.set(Workspace.Workspace.WorkspaceImpl, workspace);
const fileManager = new Workspace.FileManager.FileManager();
context.set(Workspace.FileManager.FileManager, fileManager);
const automaticFileSystemWorkspaceBinding =
new Persistence.AutomaticFileSystemWorkspaceBinding.AutomaticFileSystemWorkspaceBinding(
automaticFileSystemManager,
isolatedFileSystemManager,
workspace,
);
context.set(
Persistence.AutomaticFileSystemWorkspaceBinding.AutomaticFileSystemWorkspaceBinding,
automaticFileSystemWorkspaceBinding,
);
this.fileSystemWorkspaceBinding =
new Persistence.FileSystemWorkspaceBinding.FileSystemWorkspaceBinding(isolatedFileSystemManager, workspace);
const ignoreListManager = new Workspace.IgnoreListManager.IgnoreListManager(settings, targetManager);
context.set(Workspace.IgnoreListManager.IgnoreListManager, ignoreListManager);
const resourceMapping = new Bindings.ResourceMapping.ResourceMapping(targetManager, workspace);
const cssWorkspaceBinding = new Bindings.CSSWorkspaceBinding.CSSWorkspaceBinding(resourceMapping, targetManager);
context.set(Bindings.CSSWorkspaceBinding.CSSWorkspaceBinding, cssWorkspaceBinding);
const debuggerWorkspaceBinding = new Bindings.DebuggerWorkspaceBinding.DebuggerWorkspaceBinding(
resourceMapping, targetManager, ignoreListManager, workspace);
context.set(Bindings.DebuggerWorkspaceBinding.DebuggerWorkspaceBinding, debuggerWorkspaceBinding);
const networkProjectManager = new Bindings.NetworkProject.NetworkProjectManager();
context.set(Bindings.NetworkProject.NetworkProjectManager, networkProjectManager);
const breakpointManager = new Breakpoints.BreakpointManager.BreakpointManager(targetManager, workspace,
debuggerWorkspaceBinding, settings);
context.set(Breakpoints.BreakpointManager.BreakpointManager, breakpointManager);
const persistence = new Persistence.Persistence.PersistenceImpl(workspace, breakpointManager);
context.set(Persistence.Persistence.PersistenceImpl, persistence);
const networkPersistenceManager = new Persistence.NetworkPersistenceManager.NetworkPersistenceManager(
workspace,
persistence,
breakpointManager,
targetManager,
settings,
isolatedFileSystemManager,
multitargetNetworkManager,
);
context.set(Persistence.NetworkPersistenceManager.NetworkPersistenceManager, networkPersistenceManager);
const workspaceDiff = new WorkspaceDiff.WorkspaceDiff.WorkspaceDiffImpl(
workspace,
persistence,
networkPersistenceManager,
);
context.set(WorkspaceDiff.WorkspaceDiff.WorkspaceDiffImpl, workspaceDiff);
const networkLog = new Logs.NetworkLog.NetworkLog(targetManager, settings);
context.set(Logs.NetworkLog.NetworkLog, networkLog);
const logManager = new Logs.LogManager.LogManager(targetManager, networkLog);
context.set(Logs.LogManager.LogManager, logManager);
const javaScriptMetadata = new JavaScriptMetadata.JavaScriptMetadata.JavaScriptMetadataImpl();
context.set(JavaScriptMetadata.JavaScriptMetadata.JavaScriptMetadataImpl, javaScriptMetadata);
const liveMetrics = new LiveMetrics.LiveMetrics(targetManager, deviceModeModel);
context.set(LiveMetrics.LiveMetrics, liveMetrics);
const userBadges = new Badges.UserBadges(settings, gdpClient);
context.set(Badges.UserBadges, userBadges);
const aiHistoryStorage = new AiAssistance.AiHistoryStorage.AiHistoryStorage(settings);
context.set(AiAssistance.AiHistoryStorage.AiHistoryStorage, aiHistoryStorage);
this.autofillManager = new AutofillManager.AutofillManager.AutofillManager(targetManager, frameManager);
}
get automaticFileSystemManager(): Persistence.AutomaticFileSystemManager.AutomaticFileSystemManager {
return this.context.get(Persistence.AutomaticFileSystemManager.AutomaticFileSystemManager);
}
get automaticFileSystemWorkspaceBinding():
Persistence.AutomaticFileSystemWorkspaceBinding.AutomaticFileSystemWorkspaceBinding {
return this.context.get(Persistence.AutomaticFileSystemWorkspaceBinding.AutomaticFileSystemWorkspaceBinding);
}
get aiHistoryStorage(): AiAssistance.AiHistoryStorage.AiHistoryStorage {
return this.context.get(AiAssistance.AiHistoryStorage.AiHistoryStorage);
}
get breakpointManager(): Breakpoints.BreakpointManager.BreakpointManager {
return this.context.get(Breakpoints.BreakpointManager.BreakpointManager);
}
get cpuThrottlingManager(): SDK.CPUThrottlingManager.CPUThrottlingManager {
return this.context.get(SDK.CPUThrottlingManager.CPUThrottlingManager);
}
get cruxManager(): CrUXManager.CrUXManager {
return this.context.get(CrUXManager.CrUXManager);
}
// The DeviceModeModel may not be present, as emulation is only present for the `devtools_app` entrypoint, but not for the others.
get deviceModeModel(): Emulation.DeviceModeModel.DeviceModeModel|null {
return this.supportsEmulation ? this.context.get(Emulation.DeviceModeModel.DeviceModeModel) : null;
}
get domDebuggerManager(): SDK.DOMDebuggerModel.DOMDebuggerManager {
return this.context.get(SDK.DOMDebuggerModel.DOMDebuggerManager);
}
get domModelUndoStack(): SDK.DOMModel.DOMModelUndoStack {
return this.context.get(SDK.DOMModel.DOMModelUndoStack);
}
get emulatedDevicesList(): Emulation.EmulatedDevices.EmulatedDevicesList {
return this.context.get(Emulation.EmulatedDevices.EmulatedDevicesList);
}
get eventBreakpointsManager(): SDK.EventBreakpointsModel.EventBreakpointsManager {
return this.context.get(SDK.EventBreakpointsModel.EventBreakpointsManager);
}
get fileManager(): Workspace.FileManager.FileManager {
return this.context.get(Workspace.FileManager.FileManager);
}
get gdpClient(): Host.GdpClient.GdpClient {
return this.context.get(Host.GdpClient.GdpClient);
}
get hostConfigTracker(): Host.AidaClient.HostConfigTracker {
return this.context.get(Host.AidaClient.HostConfigTracker);
}
get isolatedFileSystemManager(): Persistence.IsolatedFileSystemManager.IsolatedFileSystemManager {
return this.context.get(Persistence.IsolatedFileSystemManager.IsolatedFileSystemManager);
}
get isolateManager(): SDK.IsolateManager.IsolateManager {
return this.context.get(SDK.IsolateManager.IsolateManager);
}
get networkPersistenceManager(): Persistence.NetworkPersistenceManager.NetworkPersistenceManager {
return this.context.get(Persistence.NetworkPersistenceManager.NetworkPersistenceManager);
}
get networkProjectManager(): Bindings.NetworkProject.NetworkProjectManager {
return this.context.get(Bindings.NetworkProject.NetworkProjectManager);
}
get liveMetrics(): LiveMetrics.LiveMetrics {
return this.context.get(LiveMetrics.LiveMetrics);
}
get frameManager(): SDK.FrameManager.FrameManager {
return this.context.get(SDK.FrameManager.FrameManager);
}
get pageResourceLoader(): SDK.PageResourceLoader.PageResourceLoader {
return this.context.get(SDK.PageResourceLoader.PageResourceLoader);
}
get persistence(): Persistence.Persistence.PersistenceImpl {
return this.context.get(Persistence.Persistence.PersistenceImpl);
}
get projectSettingsModel(): ProjectSettings.ProjectSettingsModel.ProjectSettingsModel {
return this.context.get(ProjectSettings.ProjectSettingsModel.ProjectSettingsModel);
}
get settings(): Common.Settings.Settings {
return this.context.get(Common.Settings.Settings);
}
get targetManager(): SDK.TargetManager.TargetManager {
return this.context.get(SDK.TargetManager.TargetManager);
}
get userBadges(): Badges.UserBadges {
return this.context.get(Badges.UserBadges);
}
get workspace(): Workspace.Workspace.WorkspaceImpl {
return this.context.get(Workspace.Workspace.WorkspaceImpl);
}
get workspaceDiff(): WorkspaceDiff.WorkspaceDiff.WorkspaceDiffImpl {
return this.context.get(WorkspaceDiff.WorkspaceDiff.WorkspaceDiffImpl);
}
}