Path: blob/main/src/vs/workbench/browser/web.factory.ts
3294 views
/*---------------------------------------------------------------------------------------------1* Copyright (c) Microsoft Corporation. All rights reserved.2* Licensed under the MIT License. See License.txt in the project root for license information.3*--------------------------------------------------------------------------------------------*/45import { ITunnel, ITunnelOptions, IWorkbench, IWorkbenchConstructionOptions, Menu } from './web.api.js';6import { BrowserMain } from './web.main.js';7import { URI, UriComponents } from '../../base/common/uri.js';8import { IDisposable, toDisposable } from '../../base/common/lifecycle.js';9import { CommandsRegistry } from '../../platform/commands/common/commands.js';10import { mark, PerformanceMark } from '../../base/common/performance.js';11import { MenuId, MenuRegistry } from '../../platform/actions/common/actions.js';12import { DeferredPromise } from '../../base/common/async.js';13import { asArray } from '../../base/common/arrays.js';14import { IProgress, IProgressCompositeOptions, IProgressDialogOptions, IProgressNotificationOptions, IProgressOptions, IProgressStep, IProgressWindowOptions } from '../../platform/progress/common/progress.js';15import { LogLevel } from '../../platform/log/common/log.js';16import { IEmbedderTerminalOptions } from '../services/terminal/common/embedderTerminalService.js';1718let created = false;19const workbenchPromise = new DeferredPromise<IWorkbench>();2021/**22* Creates the workbench with the provided options in the provided container.23*24* @param domElement the container to create the workbench in25* @param options for setting up the workbench26*/27export function create(domElement: HTMLElement, options: IWorkbenchConstructionOptions): IDisposable {2829// Mark start of workbench30mark('code/didLoadWorkbenchMain');3132// Assert that the workbench is not created more than once. We currently33// do not support this and require a full context switch to clean-up.34if (created) {35throw new Error('Unable to create the VSCode workbench more than once.');36} else {37created = true;38}3940// Register commands if any41if (Array.isArray(options.commands)) {42for (const command of options.commands) {4344CommandsRegistry.registerCommand(command.id, (accessor, ...args) => {45// we currently only pass on the arguments but not the accessor46// to the command to reduce our exposure of internal API.47return command.handler(...args);48});4950// Commands with labels appear in the command palette51if (command.label) {52for (const menu of asArray(command.menu ?? Menu.CommandPalette)) {53MenuRegistry.appendMenuItem(asMenuId(menu), { command: { id: command.id, title: command.label } });54}55}56}57}5859// Startup workbench and resolve waiters60let instantiatedWorkbench: IWorkbench | undefined = undefined;61new BrowserMain(domElement, options).open().then(workbench => {62instantiatedWorkbench = workbench;63workbenchPromise.complete(workbench);64});6566return toDisposable(() => {67if (instantiatedWorkbench) {68instantiatedWorkbench.shutdown();69} else {70workbenchPromise.p.then(instantiatedWorkbench => instantiatedWorkbench.shutdown());71}72});73}7475function asMenuId(menu: Menu): MenuId {76switch (menu) {77case Menu.CommandPalette: return MenuId.CommandPalette;78case Menu.StatusBarWindowIndicatorMenu: return MenuId.StatusBarWindowIndicatorMenu;79}80}8182export namespace commands {8384/**85* {@linkcode IWorkbench.commands IWorkbench.commands.executeCommand}86*/87export async function executeCommand(command: string, ...args: any[]): Promise<unknown> {88const workbench = await workbenchPromise.p;8990return workbench.commands.executeCommand(command, ...args);91}92}9394export namespace logger {9596/**97* {@linkcode IWorkbench.logger IWorkbench.logger.log}98*/99export function log(level: LogLevel, message: string) {100workbenchPromise.p.then(workbench => workbench.logger.log(level, message));101}102}103104export namespace env {105106/**107* {@linkcode IWorkbench.env IWorkbench.env.retrievePerformanceMarks}108*/109export async function retrievePerformanceMarks(): Promise<[string, readonly PerformanceMark[]][]> {110const workbench = await workbenchPromise.p;111112return workbench.env.retrievePerformanceMarks();113}114115/**116* {@linkcode IWorkbench.env IWorkbench.env.getUriScheme}117*/118export async function getUriScheme(): Promise<string> {119const workbench = await workbenchPromise.p;120121return workbench.env.getUriScheme();122}123124/**125* {@linkcode IWorkbench.env IWorkbench.env.openUri}126*/127export async function openUri(target: URI | UriComponents): Promise<boolean> {128const workbench = await workbenchPromise.p;129130return workbench.env.openUri(URI.isUri(target) ? target : URI.from(target));131}132}133134export namespace window {135136/**137* {@linkcode IWorkbench.window IWorkbench.window.withProgress}138*/139export async function withProgress<R>(140options: IProgressOptions | IProgressDialogOptions | IProgressNotificationOptions | IProgressWindowOptions | IProgressCompositeOptions,141task: (progress: IProgress<IProgressStep>) => Promise<R>142): Promise<R> {143const workbench = await workbenchPromise.p;144145return workbench.window.withProgress(options, task);146}147148export async function createTerminal(options: IEmbedderTerminalOptions): Promise<void> {149const workbench = await workbenchPromise.p;150workbench.window.createTerminal(options);151}152153export async function showInformationMessage<T extends string>(message: string, ...items: T[]): Promise<T | undefined> {154const workbench = await workbenchPromise.p;155return await workbench.window.showInformationMessage(message, ...items);156}157}158159export namespace workspace {160161/**162* {@linkcode IWorkbench.workspace IWorkbench.workspace.didResolveRemoteAuthority}163*/164export async function didResolveRemoteAuthority() {165const workbench = await workbenchPromise.p;166await workbench.workspace.didResolveRemoteAuthority();167}168169/**170* {@linkcode IWorkbench.workspace IWorkbench.workspace.openTunnel}171*/172export async function openTunnel(tunnelOptions: ITunnelOptions): Promise<ITunnel> {173const workbench = await workbenchPromise.p;174175return workbench.workspace.openTunnel(tunnelOptions);176}177}178179180