diff --git a/src/typings/require.d.ts b/src/typings/require.d.ts index 618861a5be..9d4fdea14e 100644 --- a/src/typings/require.d.ts +++ b/src/typings/require.d.ts @@ -46,5 +46,7 @@ interface NodeRequire { config(data: any): any; onError: Function; __$__nodeRequire(moduleName: string): T; - getStats(): ReadonlyArray + getStats(): ReadonlyArray; + withBase(path: string ): string; + withBase(resource: { path: string }): { toString: (skipEncoding?: boolean) => string }; } diff --git a/src/vs/base/common/buffer.ts b/src/vs/base/common/buffer.ts index 7b4e9cc8d6..7722cb12c6 100644 --- a/src/vs/base/common/buffer.ts +++ b/src/vs/base/common/buffer.ts @@ -138,7 +138,7 @@ export interface VSBufferReadable { * Read data from the underlying source. Will return * null to indicate that no more data can be read. */ - read(): VSBuffer | null; + read(): VSBuffer | null | Promise; } /** @@ -185,11 +185,11 @@ export interface VSBufferReadableStream { /** * Helper to fully read a VSBuffer readable into a single buffer. */ -export function readableToBuffer(readable: VSBufferReadable): VSBuffer { +export async function readableToBuffer(readable: VSBufferReadable): Promise { const chunks: VSBuffer[] = []; let chunk: VSBuffer | null; - while (chunk = readable.read()) { + while (chunk = await readable.read()) { chunks.push(chunk); } diff --git a/src/vs/base/common/network.ts b/src/vs/base/common/network.ts index a7466e641a..6d91e66ad3 100644 --- a/src/vs/base/common/network.ts +++ b/src/vs/base/common/network.ts @@ -46,4 +46,6 @@ export namespace Schemas { export const command: string = 'command'; export const vscodeRemote: string = 'vscode-remote'; + + export const codeServer: string = 'code-server'; } diff --git a/src/vs/code/browser/workbench/workbench.html b/src/vs/code/browser/workbench/workbench.html index ff62e0a65a..21cd50eaf9 100644 --- a/src/vs/code/browser/workbench/workbench.html +++ b/src/vs/code/browser/workbench/workbench.html @@ -4,6 +4,8 @@ + + diff --git a/src/vs/code/browser/workbench/workbench.js b/src/vs/code/browser/workbench/workbench.js index 34f321f90d..b1bd6a4ac9 100644 --- a/src/vs/code/browser/workbench/workbench.js +++ b/src/vs/code/browser/workbench/workbench.js @@ -7,14 +7,19 @@ (function () { + const basePath = window.location.pathname.replace(/\/+$/, ''); + const base = window.location.origin + basePath; require.config({ - baseUrl: `${window.location.origin}/out`, + baseUrl: `${base}/out`, + baseScheme: window.location.protocol.replace(/:$/, ''), + basePath: basePath, + baseAuthority: window.location.host, paths: { - 'vscode-textmate': `${window.location.origin}/node_modules/vscode-textmate/release/main`, - 'onigasm-umd': `${window.location.origin}/node_modules/onigasm-umd/release/main`, - 'xterm': `${window.location.origin}/node_modules/xterm/lib/xterm.js`, - 'xterm-addon-search': `${window.location.origin}/node_modules/xterm-addon-search/lib/xterm-addon-search.js`, - 'xterm-addon-web-links': `${window.location.origin}/node_modules/xterm-addon-web-links/lib/xterm-addon-web-links.js`, + 'vscode-textmate': `${base}/node_modules/vscode-textmate/release/main`, + 'onigasm-umd': `${base}/node_modules/onigasm-umd/release/main`, + 'xterm': `${base}/node_modules/xterm/lib/xterm.js`, + 'xterm-addon-search': `${base}/node_modules/xterm-addon-search/lib/xterm-addon-search.js`, + 'xterm-addon-web-links': `${base}/node_modules/xterm-addon-web-links/lib/xterm-addon-web-links.js`, } }); diff --git a/src/vs/loader.js b/src/vs/loader.js index 40b6d2aa32..f64b7e70d8 100644 --- a/src/vs/loader.js +++ b/src/vs/loader.js @@ -497,6 +497,29 @@ var AMDLoader; } return this._addUrlArgsIfNecessaryToUrl(result); }; + /** + * Transform a code-server:// URI, file:// URI, or plain path to use + * the site base. + */ + Configuration.prototype.requireWithBase = function (resource) { + if (typeof this.options.basePath === "undefined" || typeof this.options.baseAuthority === "undefined" || typeof this.options.baseScheme === "undefined") { + return resource; + } + if (typeof resource === "string") { + const base = `${this.options.baseScheme}://${this.options.baseAuthority}${this.options.basePath}`; + return resource.indexOf("/") !== 0 + ? resource.replace(/^(code-server|file):\/\/[^/]*/, `${base}/resources`) + : `${base}${resource}`; + } + if (resource.scheme !== "code-server" && resource.scheme !== "file") { + return resource; + } + return resource.with({ + authority: this.options.baseAuthority, + scheme: this.options.baseScheme, + path: `${this.options.basePath}/resources${resource.path}`, + }); + }; /** * Flag to indicate if current execution is as part of a build. */ @@ -1427,6 +1450,9 @@ var AMDLoader; result.getStats = function () { return _this.getLoaderEvents(); }; + result.withBase = function (resource) { + return _this._config.requireWithBase(resource); + }; result.__$__nodeRequire = AMDLoader.global.nodeRequire; return result; }; diff --git a/src/vs/platform/actions/browser/menuEntryActionViewItem.ts b/src/vs/platform/actions/browser/menuEntryActionViewItem.ts index 2dae143385..3fa8ac96d1 100644 --- a/src/vs/platform/actions/browser/menuEntryActionViewItem.ts +++ b/src/vs/platform/actions/browser/menuEntryActionViewItem.ts @@ -244,8 +244,8 @@ export class MenuEntryActionViewItem extends ActionViewItem { iconClass = MenuEntryActionViewItem.ICON_PATH_TO_CSS_RULES.get(iconPathMapKey)!; } else { iconClass = ids.nextId(); - createCSSRule(`.icon.${iconClass}`, `background-image: url("${(item.iconLocation.light || item.iconLocation.dark).toString()}")`); - createCSSRule(`.vs-dark .icon.${iconClass}, .hc-black .icon.${iconClass}`, `background-image: url("${item.iconLocation.dark.toString()}")`); + createCSSRule(`.icon.${iconClass}`, `background-image: url("${require.withBase(item.iconLocation.light || item.iconLocation.dark).toString()}")`); + createCSSRule(`.vs-dark .icon.${iconClass}, .hc-black .icon.${iconClass}`, `background-image: url("${require.withBase(item.iconLocation.dark).toString()}")`); MenuEntryActionViewItem.ICON_PATH_TO_CSS_RULES.set(iconPathMapKey, iconClass); } diff --git a/src/vs/platform/environment/common/environment.ts b/src/vs/platform/environment/common/environment.ts index 443e430fcd..fdd9900598 100644 --- a/src/vs/platform/environment/common/environment.ts +++ b/src/vs/platform/environment/common/environment.ts @@ -156,4 +156,7 @@ export interface IEnvironmentService { webviewEndpoint?: string; readonly webviewResourceRoot: string; + + extraExtensionPaths: string[]; + extraBuiltinExtensionPaths: string[]; } diff --git a/src/vs/platform/environment/node/environmentService.ts b/src/vs/platform/environment/node/environmentService.ts index 55c3d8302a..b8568fa785 100644 --- a/src/vs/platform/environment/node/environmentService.ts +++ b/src/vs/platform/environment/node/environmentService.ts @@ -276,6 +276,16 @@ export class EnvironmentService implements IEnvironmentService { return 'vscode-resource:'; } + @memoize + get extraExtensionPaths(): string[] { + return (this._args['extra-extensions-dir'] || []).map((p: string) => parsePathArg(p, process)); + } + + @memoize + get extraBuiltinExtensionPaths(): string[] { + return (this._args['extra-builtin-extensions-dir'] || []).map((p: string) => parsePathArg(p, process)); + } + constructor(private _args: ParsedArgs, private _execPath: string) { if (!process.env['VSCODE_LOGS']) { const key = toLocalISOString(new Date()).replace(/-|:|\.\d+Z$/g, ''); diff --git a/src/vs/platform/extensionManagement/node/extensionGalleryIpc.ts b/src/vs/platform/extensionManagement/node/extensionGalleryIpc.ts new file mode 100644 index 0000000000..ef1db87989 --- /dev/null +++ b/src/vs/platform/extensionManagement/node/extensionGalleryIpc.ts @@ -0,0 +1,96 @@ +import { IChannel, IServerChannel } from 'vs/base/parts/ipc/common/ipc'; +import { IGalleryExtension, IReportedExtension, IExtensionGalleryService, IQueryOptions, InstallOperation, StatisticType, IGalleryExtensionVersion, ITranslation } from 'vs/platform/extensionManagement/common/extensionManagement'; +import { Event } from 'vs/base/common/event'; +import { IExtensionManifest, IExtensionIdentifier } from 'vs/platform/extensions/common/extensions'; +import { IPager } from 'vs/base/common/paging'; +import { CancellationToken } from 'vs/base/common/cancellation'; +import { IProductService } from 'vs/platform/product/common/product'; + +export class ExtensionGalleryChannel implements IServerChannel { + + constructor(private service: IExtensionGalleryService) {} + + listen(_: unknown, _event: string): Event { + throw new Error('Invalid listen'); + } + + call(_: unknown, command: string, args?: any, cancellationToken?: CancellationToken): Promise { + switch (command) { + case 'query': return args.length > 0 ? this.service.query(args[0], cancellationToken!) : this.service.query(cancellationToken!); + case 'download': return this.service.download(args[0], args[1]); + case 'reportStatistic': return this.service.reportStatistic(args[0], args[1], args[2], args[3]); + case 'getReadme': return this.service.getReadme(args[0], cancellationToken!); + case 'getManifest': return this.service.getManifest(args[0], cancellationToken!); + case 'getChangelog': return this.service.getChangelog(args[0], cancellationToken!); + case 'getCoreTranslation': return this.service.getCoreTranslation(args[0], args[1]); + case 'getAllVersions': return this.service.getAllVersions(args[0], args[1]); + case 'getExtensionsReport': return this.service.getExtensionsReport(); + case 'getCompatibleExtension': return this.service.getCompatibleExtension(args[0], args[1]); + } + + throw new Error(`Invalid call: ${command}`); + } +} + +export class ExtensionGalleryChannelClient implements IExtensionGalleryService { + + _serviceBrand: any; + + private extensionsGalleryUrl: string | undefined; + + constructor( + private readonly channel: IChannel, + productService: IProductService, + ) { + const config = productService.extensionsGallery; + this.extensionsGalleryUrl = config && config.serviceUrl; + } + + isEnabled(): boolean { + return !!this.extensionsGalleryUrl; + } + + query(token: CancellationToken): Promise>; + query(options: IQueryOptions, token: CancellationToken): Promise>; + query(options: IQueryOptions | CancellationToken, token?: CancellationToken): Promise> { + return this.channel.call('query', CancellationToken.isCancellationToken(options) ? [] : [ options ], token); + } + + download(extension: IGalleryExtension, operation: InstallOperation): Promise { + return this.channel.call('download', [ extension, operation ]); + } + + reportStatistic(publisher: string, name: string, version: string, type: StatisticType): Promise { + return this.channel.call('reportStatistic', [ publisher, name, version, type ]); + } + + getReadme(extension: IGalleryExtension, token: CancellationToken): Promise { + return this.channel.call('getReadme', [ extension ], token); + } + + getManifest(extension: IGalleryExtension, token: CancellationToken): Promise { + return this.channel.call('getManifest', [ extension ], token); + } + + getChangelog(extension: IGalleryExtension, token: CancellationToken): Promise { + return this.channel.call('getChangelog', [ extension ], token); + } + + getCoreTranslation(extension: IGalleryExtension, languageId: string): Promise { + return this.channel.call('getCoreTranslation', [ extension, languageId ]); + } + + getAllVersions(extension: IGalleryExtension, compatible: boolean): Promise { + return this.channel.call('getAllVersions', [ extension, compatible ]); + } + + getExtensionsReport(): Promise { + return this.channel.call('getExtensionsReport'); + } + + getCompatibleExtension(extension: IGalleryExtension): Promise; + getCompatibleExtension(id: IExtensionIdentifier, version?: string): Promise; + getCompatibleExtension(id: IExtensionIdentifier | IGalleryExtension, version?: string): Promise { + return this.channel.call('getCompatibleExtension', [ id, version ]); + } +} diff --git a/src/vs/platform/extensionManagement/node/extensionManagementService.ts b/src/vs/platform/extensionManagement/node/extensionManagementService.ts index e09049c5b9..7af2c20efd 100644 --- a/src/vs/platform/extensionManagement/node/extensionManagementService.ts +++ b/src/vs/platform/extensionManagement/node/extensionManagementService.ts @@ -724,11 +724,15 @@ export class ExtensionManagementService extends Disposable implements IExtension private scanSystemExtensions(): Promise { this.logService.trace('Started scanning system extensions'); - const systemExtensionsPromise = this.scanExtensions(this.systemExtensionsPath, ExtensionType.System) - .then(result => { - this.logService.trace('Scanned system extensions:', result.length); - return result; - }); + const systemExtensionsPromise = Promise.all([ + this.scanExtensions(this.systemExtensionsPath, ExtensionType.System), + ...this.environmentService.extraBuiltinExtensionPaths + .map((path) => this.scanExtensions(path, ExtensionType.System)) + ]).then((results) => { + const result = results.reduce((flat, current) => flat.concat(current), []); + this.logService.info('Scanned system extensions:', result.length); + return result; + }); if (this.environmentService.isBuilt) { return systemExtensionsPromise; } @@ -750,9 +754,16 @@ export class ExtensionManagementService extends Disposable implements IExtension .then(([systemExtensions, devSystemExtensions]) => [...systemExtensions, ...devSystemExtensions]); } + private scanAllUserExtensions(folderName: string, type: ExtensionType): Promise { + return Promise.all([ + this.scanExtensions(folderName, type), + ...this.environmentService.extraExtensionPaths.map((p) => this.scanExtensions(p, ExtensionType.User)) + ]).then((results) => results.reduce((flat, current) => flat.concat(current), [])); + } + private scanUserExtensions(excludeOutdated: boolean): Promise { this.logService.trace('Started scanning user extensions'); - return Promise.all([this.getUninstalledExtensions(), this.scanExtensions(this.extensionsPath, ExtensionType.User)]) + return Promise.all([this.getUninstalledExtensions(), this.scanAllUserExtensions(this.extensionsPath, ExtensionType.User)]) .then(([uninstalled, extensions]) => { extensions = extensions.filter(e => !uninstalled[new ExtensionIdentifierWithVersion(e.identifier, e.manifest.version).key()]); if (excludeOutdated) { @@ -805,7 +816,7 @@ export class ExtensionManagementService extends Disposable implements IExtension private async removeUninstalledExtensions(): Promise { const uninstalled = await this.getUninstalledExtensions(); - const extensions = await this.scanExtensions(this.extensionsPath, ExtensionType.User); // All user extensions + const extensions = await this.scanAllUserExtensions(this.extensionsPath, ExtensionType.User); // All user extensions const installed: Set = new Set(); for (const e of extensions) { if (!uninstalled[new ExtensionIdentifierWithVersion(e.identifier, e.manifest.version).key()]) { @@ -824,7 +835,7 @@ export class ExtensionManagementService extends Disposable implements IExtension } private removeOutdatedExtensions(): Promise { - return this.scanExtensions(this.extensionsPath, ExtensionType.User) // All user extensions + return this.scanAllUserExtensions(this.extensionsPath, ExtensionType.User) // All user extensions .then(extensions => { const toRemove: ILocalExtension[] = []; diff --git a/src/vs/platform/log/common/logIpc.ts b/src/vs/platform/log/common/logIpc.ts index 9f68b645b6..f0cae7111d 100644 --- a/src/vs/platform/log/common/logIpc.ts +++ b/src/vs/platform/log/common/logIpc.ts @@ -26,6 +26,7 @@ export class LogLevelSetterChannel implements IServerChannel { call(_: unknown, command: string, arg?: any): Promise { switch (command) { case 'setLevel': this.service.setLevel(arg); return Promise.resolve(); + case 'getLevel': return Promise.resolve(this.service.getLevel()); } throw new Error(`Call not found: ${command}`); @@ -40,6 +41,10 @@ export class LogLevelSetterChannelClient { return this.channel.listen('onDidChangeLogLevel'); } + getLevel(): Promise { + return this.channel.call('getLevel'); + } + setLevel(level: LogLevel): void { this.channel.call('setLevel', level); } diff --git a/src/vs/platform/remote/browser/browserWebSocketFactory.ts b/src/vs/platform/remote/browser/browserWebSocketFactory.ts index 6d9ecbcf5a..1b3499dddf 100644 --- a/src/vs/platform/remote/browser/browserWebSocketFactory.ts +++ b/src/vs/platform/remote/browser/browserWebSocketFactory.ts @@ -79,7 +79,7 @@ class BrowserSocket implements ISocket { export const browserWebSocketFactory = new class implements IWebSocketFactory { connect(host: string, port: number, query: string, callback: IConnectCallback): void { const errorListener = (err: any) => callback(err, undefined); - const socket = new WebSocket(`ws://${host}:${port}/?${query}&skipWebSocketFrames=false`); + const socket = new WebSocket(`${window.location.protocol === 'https:' ? 'wss' : 'ws'}://${host}:${port}${window.location.pathname.replace(/\/+$/, '')}/?${query}&skipWebSocketFrames=false`); socket.onopen = function (event) { socket.removeEventListener('error', errorListener); callback(undefined, new BrowserSocket(socket)); diff --git a/src/vs/platform/telemetry/node/telemetryIpc.ts b/src/vs/platform/telemetry/node/telemetryIpc.ts index 8e1b68eb36..2b6a0d5b15 100644 --- a/src/vs/platform/telemetry/node/telemetryIpc.ts +++ b/src/vs/platform/telemetry/node/telemetryIpc.ts @@ -6,6 +6,9 @@ import { IChannel, IServerChannel } from 'vs/base/parts/ipc/common/ipc'; import { ITelemetryAppender } from 'vs/platform/telemetry/common/telemetryUtils'; import { Event } from 'vs/base/common/event'; +import { ITelemetryService, ITelemetryInfo } from 'vs/platform/telemetry/common/telemetry'; +import { ITelemetryData } from 'vs/base/common/actions'; +import { ClassifiedEvent, GDPRClassification, StrictPropertyCheck } from 'vs/platform/telemetry/common/gdprTypings'; export interface ITelemetryLog { eventName: string; @@ -41,3 +44,52 @@ export class TelemetryAppenderClient implements ITelemetryAppender { // TODO } } + +export class TelemetryChannel implements IServerChannel { + + constructor(private service: ITelemetryService) {} + + listen(_: unknown, event: string): Event { + throw new Error(`Invalid listen ${event}`); + } + + call(_: unknown, command: string, args?: any): Promise { + switch (command) { + case 'publicLog': return this.service.publicLog(args[0], args[1], args[2]); + case 'publicLog2': return this.service.publicLog2(args[0], args[1], args[2]); + case 'setEnabled': return Promise.resolve(this.service.setEnabled(args[0])); + case 'getTelemetryInfo': return this.service.getTelemetryInfo(); + } + + throw new Error(`Invalid call ${command}`); + } +} + +export class TelemetryChannelClient implements ITelemetryService { + + _serviceBrand: any; + + constructor( + private readonly channel: IChannel, + ) { } + + public publicLog(eventName: string, data?: ITelemetryData, anonymizeFilePaths?: boolean): Promise { + return this.channel.call('publicLog', [eventName, data, anonymizeFilePaths]); + } + + public publicLog2 = never, T extends GDPRClassification = never>(eventName: string, data?: StrictPropertyCheck, anonymizeFilePaths?: boolean): Promise { + return this.channel.call('publicLog2', [eventName, data, anonymizeFilePaths]); + } + + public setEnabled(value: boolean): void { + this.channel.call('setEnable', [value]); + } + + public getTelemetryInfo(): Promise { + return this.channel.call('getTelemetryInfo'); + } + + public get isOptedIn(): boolean { + return true; + } +} diff --git a/src/vs/workbench/api/browser/viewsExtensionPoint.ts b/src/vs/workbench/api/browser/viewsExtensionPoint.ts index 8bace46843..b261f40493 100644 --- a/src/vs/workbench/api/browser/viewsExtensionPoint.ts +++ b/src/vs/workbench/api/browser/viewsExtensionPoint.ts @@ -327,7 +327,7 @@ class ViewsExtensionHandler implements IWorkbenchContribution { // Generate CSS to show the icon in the activity bar const iconClass = `.monaco-workbench .activitybar .monaco-action-bar .action-label.${cssClass}`; - createCSSRule(iconClass, `-webkit-mask: url('${icon}') no-repeat 50% 50%`); + createCSSRule(iconClass, `-webkit-mask: url('${require.withBase(icon)}') no-repeat 50% 50%`); } return viewContainer; diff --git a/src/vs/workbench/browser/dnd.ts b/src/vs/workbench/browser/dnd.ts index 2054ceece3..f99dfd0b73 100644 --- a/src/vs/workbench/browser/dnd.ts +++ b/src/vs/workbench/browser/dnd.ts @@ -31,6 +31,7 @@ import { IEditorGroup } from 'vs/workbench/services/editor/common/editorGroupsSe import { IRecentFile } from 'vs/platform/history/common/history'; import { IWorkspaceEditingService } from 'vs/workbench/services/workspace/common/workspaceEditing'; import { withNullAsUndefined } from 'vs/base/common/types'; +import { IUploadService } from 'vs/server/src/upload'; export interface IDraggedResource { resource: URI; @@ -166,14 +167,15 @@ export class ResourcesDropHandler { @IUntitledEditorService private readonly untitledEditorService: IUntitledEditorService, @IEditorService private readonly editorService: IEditorService, @IConfigurationService private readonly configurationService: IConfigurationService, - @IWorkspaceEditingService private readonly workspaceEditingService: IWorkspaceEditingService + @IWorkspaceEditingService private readonly workspaceEditingService: IWorkspaceEditingService, + @IUploadService private readonly uploadService: IUploadService, ) { } async handleDrop(event: DragEvent, resolveTargetGroup: () => IEditorGroup | undefined, afterDrop: (targetGroup: IEditorGroup | undefined) => void, targetIndex?: number): Promise { const untitledOrFileResources = extractResources(event).filter(r => this.fileService.canHandleResource(r.resource) || r.resource.scheme === Schemas.untitled); if (!untitledOrFileResources.length) { - return; + return this.uploadService.handleDrop(event, resolveTargetGroup, afterDrop, targetIndex); } // Make the window active to handle the drop properly within diff --git a/src/vs/workbench/browser/parts/activitybar/activitybarActions.ts b/src/vs/workbench/browser/parts/activitybar/activitybarActions.ts index 24d8fe70c7..0670ebb774 100644 --- a/src/vs/workbench/browser/parts/activitybar/activitybarActions.ts +++ b/src/vs/workbench/browser/parts/activitybar/activitybarActions.ts @@ -173,7 +173,7 @@ export class PlaceHolderViewletActivityAction extends ViewletActivityAction { super({ id, name: id, cssClass: `extensionViewlet-placeholder-${id.replace(/\./g, '-')}` }, viewletService, layoutService, telemetryService); const iconClass = `.monaco-workbench .activitybar .monaco-action-bar .action-label.${this.class}`; // Generate Placeholder CSS to show the icon in the activity bar - DOM.createCSSRule(iconClass, `-webkit-mask: url('${iconUrl || ''}') no-repeat 50% 50%`); + DOM.createCSSRule(iconClass, `-webkit-mask: url('${iconUrl ? require.withBase(iconUrl) : ''}') no-repeat 50% 50%`); } setActivity(activity: IActivity): void { diff --git a/src/vs/workbench/browser/parts/editor/resourceViewer.ts b/src/vs/workbench/browser/parts/editor/resourceViewer.ts index a5e644112b..99f8271a59 100644 --- a/src/vs/workbench/browser/parts/editor/resourceViewer.ts +++ b/src/vs/workbench/browser/parts/editor/resourceViewer.ts @@ -548,7 +548,7 @@ class InlineImageView { const img = container.querySelector('img'); if (img) { if (typeof src === 'string') { - img.src = src; + img.src = require.withBase(src); } else { const url = URL.createObjectURL(src); disposables.add(toDisposable(() => URL.revokeObjectURL(url))); diff --git a/src/vs/workbench/browser/parts/quickinput/quickInputUtils.ts b/src/vs/workbench/browser/parts/quickinput/quickInputUtils.ts index babe949511..7bce969709 100644 --- a/src/vs/workbench/browser/parts/quickinput/quickInputUtils.ts +++ b/src/vs/workbench/browser/parts/quickinput/quickInputUtils.ts @@ -22,8 +22,8 @@ export function getIconClass(iconPath: { dark: URI; light?: URI; } | undefined): iconClass = iconPathToClass[key]; } else { iconClass = iconClassGenerator.nextId(); - dom.createCSSRule(`.${iconClass}`, `background-image: url("${(iconPath.light || iconPath.dark).toString()}")`); - dom.createCSSRule(`.vs-dark .${iconClass}, .hc-black .${iconClass}`, `background-image: url("${iconPath.dark.toString()}")`); + dom.createCSSRule(`.${iconClass}`, `background-image: url("${require.withBase(iconPath.light || iconPath.dark).toString()}")`); + dom.createCSSRule(`.vs-dark .${iconClass}, .hc-black .${iconClass}`, `background-image: url("${require.withBase(iconPath.dark).toString()}")`); iconPathToClass[key] = iconClass; } diff --git a/src/vs/workbench/browser/parts/views/customView.ts b/src/vs/workbench/browser/parts/views/customView.ts index 5a758eb786..7fcacb5ca7 100644 --- a/src/vs/workbench/browser/parts/views/customView.ts +++ b/src/vs/workbench/browser/parts/views/customView.ts @@ -674,7 +674,7 @@ class TreeRenderer implements IRenderer { templateData.resourceLabel.setResource({ name: label, description }, { title, hideIcon: true, extraClasses: ['custom-view-tree-node-item-resourceLabel'], matches }); } - templateData.icon.style.backgroundImage = iconUrl ? `url('${iconUrl.toString(true)}')` : ''; + templateData.icon.style.backgroundImage = iconUrl ? `url('${require.withBase(iconUrl).toString(true)}')` : ''; DOM.toggleClass(templateData.icon, 'custom-view-tree-node-item-icon', !!iconUrl); templateData.actionBar.context = ({ $treeViewId: this.treeViewId, $treeItemHandle: node.handle }); templateData.actionBar.push(this.menus.getResourceActions(node), { icon: true, label: false }); diff --git a/src/vs/workbench/browser/web.main.ts b/src/vs/workbench/browser/web.main.ts index 1986fb6642..a3e4cbdb56 100644 --- a/src/vs/workbench/browser/web.main.ts +++ b/src/vs/workbench/browser/web.main.ts @@ -35,6 +35,7 @@ import { SignService } from 'vs/platform/sign/browser/signService'; import { hash } from 'vs/base/common/hash'; import { IWorkbenchConstructionOptions } from 'vs/workbench/workbench.web.api'; import { ProductService } from 'vs/platform/product/browser/productService'; +import { coderApi, vscodeApi } from 'vs/server/src/api'; class CodeRendererMain extends Disposable { @@ -71,6 +72,15 @@ class CodeRendererMain extends Disposable { // Startup this.workbench.startup(); + + const target = window as any; + target.ide = coderApi(services.serviceCollection); + target.vscode = vscodeApi(services.serviceCollection); + + const event = new CustomEvent('ide-ready'); + (event as any).ide = target.ide; + (event as any).vscode = target.vscode; + window.dispatchEvent(event); } private async initServices(): Promise<{ serviceCollection: ServiceCollection, logService: ILogService }> { @@ -114,7 +124,8 @@ class CodeRendererMain extends Disposable { const channel = connection.getChannel(REMOTE_FILE_SYSTEM_CHANNEL_NAME); const remoteFileSystemProvider = this._register(new RemoteExtensionsFileSystemProvider(channel, remoteAgentService.getEnvironment())); - fileService.registerProvider(Schemas.vscodeRemote, remoteFileSystemProvider); + fileService.registerProvider(Schemas.codeServer, remoteFileSystemProvider); + fileService.registerProvider(Schemas.file, remoteFileSystemProvider); } const payload = await this.resolveWorkspaceInitializationPayload(); diff --git a/src/vs/workbench/browser/web.simpleservices.ts b/src/vs/workbench/browser/web.simpleservices.ts index b253e573ae..7a230fa3bd 100644 --- a/src/vs/workbench/browser/web.simpleservices.ts +++ b/src/vs/workbench/browser/web.simpleservices.ts @@ -53,6 +53,14 @@ import { IConfigurationService } from 'vs/platform/configuration/common/configur import { ParsedArgs } from 'vs/platform/environment/common/environment'; import { ClassifiedEvent, StrictPropertyCheck, GDPRClassification } from 'vs/platform/telemetry/common/gdprTypings'; import { IProcessEnvironment } from 'vs/base/common/platform'; +import { IRemoteAgentService } from 'vs/workbench/services/remote/common/remoteAgentService'; +import { ExtensionManagementChannelClient } from 'vs/platform/extensionManagement/node/extensionManagementIpc'; +import { ExtensionGalleryChannelClient } from 'vs/platform/extensionManagement/node/extensionGalleryIpc'; +import { TelemetryChannelClient } from 'vs/platform/telemetry/node/telemetryIpc'; +import { IProductService } from 'vs/platform/product/common/product'; +import { IUploadService, UploadService } from 'vs/server/src/upload'; + +registerSingleton(IUploadService, UploadService, true); //#region Backup File @@ -125,13 +133,11 @@ export class SimpleClipboardService implements IClipboardService { writeText(text: string, type?: string): void { } readText(type?: string): string { - // @ts-ignore - return undefined; + throw new Error('not implemented'); } readFindText(): string { - // @ts-ignore - return undefined; + throw new Error('not implemented'); } writeFindText(text: string): void { } @@ -239,7 +245,17 @@ export class SimpleExtensionGalleryService implements IExtensionGalleryService { } } -registerSingleton(IExtensionGalleryService, SimpleExtensionGalleryService, true); +// registerSingleton(IExtensionGalleryService, SimpleExtensionGalleryService, true); + +class ExtensionGalleryService extends ExtensionGalleryChannelClient { + public constructor( + @IRemoteAgentService remoteAgentService: IRemoteAgentService, + @IProductService productService: IProductService, + ) { + super(remoteAgentService.getConnection()!.getChannel('gallery'), productService); + } +} +registerSingleton(IExtensionGalleryService, ExtensionGalleryService, true); //#endregion @@ -262,7 +278,7 @@ export class SimpleExtensionsWorkbenchService implements IExtensionsWorkbenchSer checkForUpdates: any; allowedBadgeProviders: string[]; } -registerSingleton(IExtensionsWorkbenchService, SimpleExtensionsWorkbenchService, true); +// registerSingleton(IExtensionsWorkbenchService, SimpleExtensionsWorkbenchService, true); //#endregion //#region ICommentService @@ -375,7 +391,10 @@ export class SimpleExtensionTipsService implements IExtensionTipsService { } getAllIgnoredRecommendations(): { global: string[]; workspace: string[]; } { - return Object.create(null); + return { + global: [], + workspace: [], + }; } } @@ -436,7 +455,16 @@ export class SimpleExtensionManagementService implements IExtensionManagementSer } } -registerSingleton(IExtensionManagementService, SimpleExtensionManagementService); +// registerSingleton(IExtensionManagementService, SimpleExtensionManagementService); + +class LocalExtensionManagementService extends ExtensionManagementChannelClient { + public constructor( + @IRemoteAgentService remoteAgentService: IRemoteAgentService, + ) { + super(remoteAgentService.getConnection()!.getChannel('extensions')); + } +} +registerSingleton(IExtensionManagementService, LocalExtensionManagementService); //#endregion @@ -680,7 +708,15 @@ export class SimpleTelemetryService implements ITelemetryService { } } -registerSingleton(ITelemetryService, SimpleTelemetryService); +// registerSingleton(ITelemetryService, SimpleTelemetryService); +class TelemetryService extends TelemetryChannelClient { + public constructor( + @IRemoteAgentService remoteAgentService: IRemoteAgentService, + ) { + super(remoteAgentService.getConnection()!.getChannel('telemetry')); + } +} +registerSingleton(ITelemetryService, TelemetryService); //#endregion @@ -888,7 +924,7 @@ export class SimpleWindowService extends Disposable implements IWindowService { for (let i = 0; i < _uris.length; i++) { const uri = _uris[i]; if ('folderUri' in uri) { - const newAddress = `${document.location.origin}/?folder=${uri.folderUri.path}`; + const newAddress = require.withBase(`/?folder=${uri.folderUri.path}`); if (openFolderInNewWindow) { window.open(newAddress); } else { @@ -896,7 +932,7 @@ export class SimpleWindowService extends Disposable implements IWindowService { } } if ('workspaceUri' in uri) { - const newAddress = `${document.location.origin}/?workspace=${uri.workspaceUri.path}`; + const newAddress = require.withBase(`/?workspace=${uri.workspaceUri.path}`); if (openFolderInNewWindow) { window.open(newAddress); } else { diff --git a/src/vs/workbench/contrib/comments/browser/commentNode.ts b/src/vs/workbench/contrib/comments/browser/commentNode.ts index f4ac3fe8dd..3a3616b39e 100644 --- a/src/vs/workbench/contrib/comments/browser/commentNode.ts +++ b/src/vs/workbench/contrib/comments/browser/commentNode.ts @@ -108,7 +108,7 @@ export class CommentNode extends Disposable { const avatar = dom.append(this._domNode, dom.$('div.avatar-container')); if (comment.userIconPath) { const img = dom.append(avatar, dom.$('img.avatar')); - img.src = comment.userIconPath.toString(); + img.src = require.withBase(comment.userIconPath).toString(); img.onerror = _ => img.remove(); } this._commentDetailsContainer = dom.append(this._domNode, dom.$('.review-comment-contents')); diff --git a/src/vs/workbench/contrib/comments/browser/reactionsAction.ts b/src/vs/workbench/contrib/comments/browser/reactionsAction.ts index c14030dab8..42b666446d 100644 --- a/src/vs/workbench/contrib/comments/browser/reactionsAction.ts +++ b/src/vs/workbench/contrib/comments/browser/reactionsAction.ts @@ -46,7 +46,7 @@ export class ReactionActionViewItem extends ActionViewItem { let reactionIcon = dom.append(this.label, dom.$('.reaction-icon')); reactionIcon.style.display = ''; let uri = URI.revive(action.icon); - reactionIcon.style.backgroundImage = `url('${uri}')`; + reactionIcon.style.backgroundImage = `url('${require.withBase(uri)}')`; reactionIcon.title = action.label; } if (action.count) { diff --git a/src/vs/workbench/contrib/extensions/browser/extensionsViewer.ts b/src/vs/workbench/contrib/extensions/browser/extensionsViewer.ts index 31b80683ee..720b649c01 100644 --- a/src/vs/workbench/contrib/extensions/browser/extensionsViewer.ts +++ b/src/vs/workbench/contrib/extensions/browser/extensionsViewer.ts @@ -108,8 +108,8 @@ export class ExtensionRenderer implements IListRenderer, index: number, data: IExtensionTemplateData): void { const extension = node.element.extension; const onError = Event.once(domEvent(data.icon, 'error')); - onError(() => data.icon.src = extension.iconUrlFallback, null, data.extensionDisposables); - data.icon.src = extension.iconUrl; + onError(() => data.icon.src = require.withBase(extension.iconUrlFallback), null, data.extensionDisposables); + data.icon.src = require.withBase(extension.iconUrl); if (!data.icon.complete) { data.icon.style.visibility = 'hidden'; diff --git a/src/vs/workbench/contrib/extensions/electron-browser/extensionEditor.ts b/src/vs/workbench/contrib/extensions/electron-browser/extensionEditor.ts index 86949eb39a..b7d04352ce 100644 --- a/src/vs/workbench/contrib/extensions/electron-browser/extensionEditor.ts +++ b/src/vs/workbench/contrib/extensions/electron-browser/extensionEditor.ts @@ -3,6 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ +import * as process from 'vs/base/common/process'; import 'vs/css!./media/extensionEditor'; import { localize } from 'vs/nls'; import * as marked from 'vs/base/common/marked/marked'; @@ -28,8 +29,8 @@ import { IExtensionsWorkbenchService, IExtensionsViewlet, VIEWLET_ID, IExtension import { RatingsWidget, InstallCountWidget, RemoteBadgeWidget } from 'vs/workbench/contrib/extensions/electron-browser/extensionsWidgets'; import { EditorOptions } from 'vs/workbench/common/editor'; import { ActionBar } from 'vs/base/browser/ui/actionbar/actionbar'; -import { CombinedInstallAction, UpdateAction, ExtensionEditorDropDownAction, ReloadAction, MaliciousStatusLabelAction, IgnoreExtensionRecommendationAction, UndoIgnoreExtensionRecommendationAction, EnableDropDownAction, DisableDropDownAction, StatusLabelAction, SetFileIconThemeAction, SetColorThemeAction, RemoteInstallAction, DisabledLabelAction, SystemDisabledWarningAction, LocalInstallAction } from 'vs/workbench/contrib/extensions/electron-browser/extensionsActions'; -import { WebviewElement } from 'vs/workbench/contrib/webview/electron-browser/webviewElement'; +import { CombinedInstallAction, UpdateAction, ExtensionEditorDropDownAction, ReloadAction, MaliciousStatusLabelAction, IgnoreExtensionRecommendationAction, UndoIgnoreExtensionRecommendationAction, EnableDropDownAction, DisableDropDownAction, StatusLabelAction, SetFileIconThemeAction, SetColorThemeAction, /*RemoteInstallAction, */DisabledLabelAction, SystemDisabledWarningAction, LocalInstallAction } from 'vs/workbench/contrib/extensions/electron-browser/extensionsActions'; +import { IFrameWebview as WebviewElement } from 'vs/workbench/contrib/webview/browser/webviewElement'; import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { DomScrollableElement } from 'vs/base/browser/ui/scrollbar/scrollableElement'; import { IOpenerService } from 'vs/platform/opener/common/opener'; @@ -44,7 +45,7 @@ import { assign } from 'vs/base/common/objects'; import { INotificationService } from 'vs/platform/notification/common/notification'; import { CancellationToken } from 'vs/base/common/cancellation'; import { ExtensionsTree, ExtensionData } from 'vs/workbench/contrib/extensions/browser/extensionsViewer'; -import { ShowCurrentReleaseNotesAction } from 'vs/workbench/contrib/update/electron-browser/update'; +// import { ShowCurrentReleaseNotesAction } from 'vs/workbench/contrib/update/electron-browser/update'; import { KeybindingParser } from 'vs/base/common/keybindingParser'; import { IStorageService } from 'vs/platform/storage/common/storage'; import { IExtensionService } from 'vs/workbench/services/extensions/common/extensions'; @@ -54,12 +55,12 @@ import { IWorkbenchThemeService } from 'vs/workbench/services/themes/common/work import { URI } from 'vs/base/common/uri'; function renderBody(body: string): string { - const styleSheetPath = require.toUrl('./media/markdown.css').replace('file://', 'vscode-resource://'); + const styleSheetPath = require.toUrl('./media/markdown.css'); return ` - + @@ -291,8 +292,8 @@ export class ExtensionEditor extends BaseEditor { const remoteBadge = this.instantiationService.createInstance(RemoteBadgeWidget, this.iconContainer, true); const onError = Event.once(domEvent(this.icon, 'error')); - onError(() => this.icon.src = extension.iconUrlFallback, null, this.transientDisposables); - this.icon.src = extension.iconUrl; + onError(() => this.icon.src = require.withBase(extension.iconUrlFallback), null, this.transientDisposables); + this.icon.src = require.withBase(extension.iconUrl); this.name.textContent = extension.displayName; this.identifier.textContent = extension.identifier.id; @@ -370,7 +371,7 @@ export class ExtensionEditor extends BaseEditor { this.instantiationService.createInstance(SetFileIconThemeAction, fileIconThemes), this.instantiationService.createInstance(EnableDropDownAction), this.instantiationService.createInstance(DisableDropDownAction, runningExtensions), - this.instantiationService.createInstance(RemoteInstallAction), + // this.instantiationService.createInstance(RemoteInstallAction), this.instantiationService.createInstance(LocalInstallAction), combinedInstallAction, systemDisabledWarningAction, @@ -556,7 +557,7 @@ export class ExtensionEditor extends BaseEditor { return; } // Whitelist supported schemes for links - if (['http', 'https', 'mailto'].indexOf(link.scheme) >= 0 || (link.scheme === 'command' && link.path === ShowCurrentReleaseNotesAction.ID)) { + if (['http', 'https', 'mailto'].indexOf(link.scheme) >= 0 /*|| (link.scheme === 'command' && link.path === ShowCurrentReleaseNotesAction.ID)*/) { this.openerService.open(link); } }, null, this.contentDisposables)); diff --git a/src/vs/workbench/contrib/extensions/electron-browser/extensions.contribution.ts b/src/vs/workbench/contrib/extensions/electron-browser/extensions.contribution.ts index aa632ac96e..94ab4c042e 100644 --- a/src/vs/workbench/contrib/extensions/electron-browser/extensions.contribution.ts +++ b/src/vs/workbench/contrib/extensions/electron-browser/extensions.contribution.ts @@ -9,10 +9,10 @@ import { KeyMod, KeyChord, KeyCode } from 'vs/base/common/keyCodes'; import { Registry } from 'vs/platform/registry/common/platform'; import { SyncActionDescriptor, MenuRegistry, MenuId } from 'vs/platform/actions/common/actions'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; -import { IExtensionTipsService, ExtensionsLabel, ExtensionsChannelId, PreferencesLabel, IExtensionManagementService, IExtensionGalleryService } from 'vs/platform/extensionManagement/common/extensionManagement'; +import { /*IExtensionTipsService, */ExtensionsLabel, ExtensionsChannelId, PreferencesLabel, IExtensionManagementService, IExtensionGalleryService } from 'vs/platform/extensionManagement/common/extensionManagement'; import { IWorkbenchActionRegistry, Extensions as WorkbenchActionExtensions } from 'vs/workbench/common/actions'; -import { ExtensionTipsService } from 'vs/workbench/contrib/extensions/electron-browser/extensionTipsService'; +// import { ExtensionTipsService } from 'vs/workbench/contrib/extensions/electron-browser/extensionTipsService'; import { IWorkbenchContributionsRegistry, Extensions as WorkbenchExtensions } from 'vs/workbench/common/contributions'; import { IOutputChannelRegistry, Extensions as OutputExtensions } from 'vs/workbench/contrib/output/common/output'; import { SyncDescriptor } from 'vs/platform/instantiation/common/descriptors'; @@ -38,14 +38,14 @@ import { areSameExtensions } from 'vs/platform/extensionManagement/common/extens import { GalleryExtensionsHandler, ExtensionsHandler } from 'vs/workbench/contrib/extensions/browser/extensionsQuickOpen'; import { EditorDescriptor, IEditorRegistry, Extensions as EditorExtensions } from 'vs/workbench/browser/editor'; import { LifecyclePhase } from 'vs/platform/lifecycle/common/lifecycle'; -import { RuntimeExtensionsEditor, ShowRuntimeExtensionsAction, IExtensionHostProfileService, DebugExtensionHostAction, StartExtensionHostProfileAction, StopExtensionHostProfileAction, CONTEXT_PROFILE_SESSION_STATE, SaveExtensionHostProfileAction, CONTEXT_EXTENSION_HOST_PROFILE_RECORDED } from 'vs/workbench/contrib/extensions/electron-browser/runtimeExtensionsEditor'; -import { EditorInput, IEditorInputFactory, IEditorInputFactoryRegistry, Extensions as EditorInputExtensions, ActiveEditorContext } from 'vs/workbench/common/editor'; -import { ExtensionHostProfileService } from 'vs/workbench/contrib/extensions/electron-browser/extensionProfileService'; +// import { RuntimeExtensionsEditor, ShowRuntimeExtensionsAction, IExtensionHostProfileService, DebugExtensionHostAction, StartExtensionHostProfileAction, StopExtensionHostProfileAction, CONTEXT_PROFILE_SESSION_STATE, SaveExtensionHostProfileAction, CONTEXT_EXTENSION_HOST_PROFILE_RECORDED } from 'vs/workbench/contrib/extensions/electron-browser/runtimeExtensionsEditor'; +import { EditorInput, IEditorInputFactory, IEditorInputFactoryRegistry, Extensions as EditorInputExtensions/*, ActiveEditorContext*/ } from 'vs/workbench/common/editor'; +// import { ExtensionHostProfileService } from 'vs/workbench/contrib/extensions/electron-browser/extensionProfileService'; import { RuntimeExtensionsInput } from 'vs/workbench/contrib/extensions/electron-browser/runtimeExtensionsInput'; import { URI, UriComponents } from 'vs/base/common/uri'; -import { ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; +// import { ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; import { ExtensionActivationProgress } from 'vs/workbench/contrib/extensions/browser/extensionsActivationProgress'; -import { ExtensionsAutoProfiler } from 'vs/workbench/contrib/extensions/electron-browser/extensionsAutoProfiler'; +// import { ExtensionsAutoProfiler } from 'vs/workbench/contrib/extensions/electron-browser/extensionsAutoProfiler'; import { onUnexpectedError } from 'vs/base/common/errors'; import { ExtensionDependencyChecker } from 'vs/workbench/contrib/extensions/electron-browser/extensionsDependencyChecker'; import { CancellationToken } from 'vs/base/common/cancellation'; @@ -53,8 +53,8 @@ import { ExtensionType } from 'vs/platform/extensions/common/extensions'; // Singletons registerSingleton(IExtensionsWorkbenchService, ExtensionsWorkbenchService); -registerSingleton(IExtensionTipsService, ExtensionTipsService); -registerSingleton(IExtensionHostProfileService, ExtensionHostProfileService, true); +// registerSingleton(IExtensionTipsService, ExtensionTipsService); +// registerSingleton(IExtensionHostProfileService, ExtensionHostProfileService, true); const workbenchRegistry = Registry.as(WorkbenchExtensions.Workbench); workbenchRegistry.registerWorkbenchContribution(StatusUpdater, LifecyclePhase.Restored); @@ -63,7 +63,7 @@ workbenchRegistry.registerWorkbenchContribution(ConfigureRecommendedExtensionsCo workbenchRegistry.registerWorkbenchContribution(KeymapExtensions, LifecyclePhase.Restored); workbenchRegistry.registerWorkbenchContribution(ExtensionsViewletViewsContribution, LifecyclePhase.Starting); workbenchRegistry.registerWorkbenchContribution(ExtensionActivationProgress, LifecyclePhase.Eventually); -workbenchRegistry.registerWorkbenchContribution(ExtensionsAutoProfiler, LifecyclePhase.Eventually); +// workbenchRegistry.registerWorkbenchContribution(ExtensionsAutoProfiler, LifecyclePhase.Eventually); workbenchRegistry.registerWorkbenchContribution(ExtensionDependencyChecker, LifecyclePhase.Eventually); Registry.as(OutputExtensions.OutputChannels) @@ -104,14 +104,14 @@ Registry.as(EditorExtensions.Editors) // Running Extensions Editor -const runtimeExtensionsEditorDescriptor = new EditorDescriptor( +/*const runtimeExtensionsEditorDescriptor = new EditorDescriptor( RuntimeExtensionsEditor, RuntimeExtensionsEditor.ID, localize('runtimeExtension', "Running Extensions") ); Registry.as(EditorExtensions.Editors) - .registerEditor(runtimeExtensionsEditorDescriptor, [new SyncDescriptor(RuntimeExtensionsInput)]); + .registerEditor(runtimeExtensionsEditorDescriptor, [new SyncDescriptor(RuntimeExtensionsInput)]);*/ class RuntimeExtensionsInputFactory implements IEditorInputFactory { serialize(editorInput: EditorInput): string { @@ -203,7 +203,7 @@ actionRegistry.registerWorkbenchAction(checkForUpdatesAction, `Extensions: Check actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(EnableAutoUpdateAction, EnableAutoUpdateAction.ID, EnableAutoUpdateAction.LABEL), `Extensions: Enable Auto Updating Extensions`, ExtensionsLabel); actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(DisableAutoUpdateAction, DisableAutoUpdateAction.ID, DisableAutoUpdateAction.LABEL), `Extensions: Disable Auto Updating Extensions`, ExtensionsLabel); actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(InstallSpecificVersionOfExtensionAction, InstallSpecificVersionOfExtensionAction.ID, InstallSpecificVersionOfExtensionAction.LABEL), 'Install Specific Version of Extension...', ExtensionsLabel); -actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(ShowRuntimeExtensionsAction, ShowRuntimeExtensionsAction.ID, ShowRuntimeExtensionsAction.LABEL), 'Show Running Extensions', localize('developer', "Developer")); +// actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(ShowRuntimeExtensionsAction, ShowRuntimeExtensionsAction.ID, ShowRuntimeExtensionsAction.LABEL), 'Show Running Extensions', localize('developer', "Developer")); actionRegistry.registerWorkbenchAction(new SyncActionDescriptor(ReinstallAction, ReinstallAction.ID, ReinstallAction.LABEL), 'Reinstall Extension...', localize('developer', "Developer")); Registry.as(ConfigurationExtensions.Configuration) @@ -270,7 +270,7 @@ CommandsRegistry.registerCommand('extension.open', (accessor: ServicesAccessor, }); }); -CommandsRegistry.registerCommand(DebugExtensionHostAction.ID, (accessor: ServicesAccessor) => { +/*CommandsRegistry.registerCommand(DebugExtensionHostAction.ID, (accessor: ServicesAccessor) => { const instantiationService = accessor.get(IInstantiationService); instantiationService.createInstance(DebugExtensionHostAction).run(); }); @@ -288,7 +288,7 @@ CommandsRegistry.registerCommand(StopExtensionHostProfileAction.ID, (accessor: S CommandsRegistry.registerCommand(SaveExtensionHostProfileAction.ID, (accessor: ServicesAccessor) => { const instantiationService = accessor.get(IInstantiationService); instantiationService.createInstance(SaveExtensionHostProfileAction, SaveExtensionHostProfileAction.ID, SaveExtensionHostProfileAction.LABEL).run(); -}); +});*/ // File menu registration @@ -332,7 +332,7 @@ MenuRegistry.appendMenuItem(MenuId.MenubarViewMenu, { // Running extensions -MenuRegistry.appendMenuItem(MenuId.EditorTitle, { +/*MenuRegistry.appendMenuItem(MenuId.EditorTitle, { command: { id: DebugExtensionHostAction.ID, title: DebugExtensionHostAction.LABEL, @@ -383,7 +383,7 @@ MenuRegistry.appendMenuItem(MenuId.EditorTitle, { }, group: 'navigation', when: ContextKeyExpr.and(ActiveEditorContext.isEqualTo(RuntimeExtensionsEditor.ID)) -}); +}); */ CommandsRegistry.registerCommand({ id: 'workbench.extensions.installExtension', diff --git a/src/vs/workbench/contrib/extensions/electron-browser/extensionsList.ts b/src/vs/workbench/contrib/extensions/electron-browser/extensionsList.ts index 3f6427704d..8d2d78f537 100644 --- a/src/vs/workbench/contrib/extensions/electron-browser/extensionsList.ts +++ b/src/vs/workbench/contrib/extensions/electron-browser/extensionsList.ts @@ -13,7 +13,7 @@ import { IPagedRenderer } from 'vs/base/browser/ui/list/listPaging'; import { Event } from 'vs/base/common/event'; import { domEvent } from 'vs/base/browser/event'; import { IExtension, ExtensionContainers, ExtensionState, IExtensionsWorkbenchService } from 'vs/workbench/contrib/extensions/common/extensions'; -import { InstallAction, UpdateAction, ManageExtensionAction, ReloadAction, MaliciousStatusLabelAction, ExtensionActionViewItem, StatusLabelAction, RemoteInstallAction, SystemDisabledWarningAction, DisabledLabelAction, LocalInstallAction } from 'vs/workbench/contrib/extensions/electron-browser/extensionsActions'; +import { InstallAction, UpdateAction, ManageExtensionAction, ReloadAction, MaliciousStatusLabelAction, ExtensionActionViewItem, StatusLabelAction, /*RemoteInstallAction, */SystemDisabledWarningAction, DisabledLabelAction, LocalInstallAction } from 'vs/workbench/contrib/extensions/electron-browser/extensionsActions'; import { areSameExtensions } from 'vs/platform/extensionManagement/common/extensionManagementUtil'; import { Label, RatingsWidget, InstallCountWidget, RecommendationWidget, RemoteBadgeWidget, TooltipWidget } from 'vs/workbench/contrib/extensions/electron-browser/extensionsWidgets'; import { IExtensionService } from 'vs/workbench/services/extensions/common/extensions'; @@ -96,7 +96,7 @@ export class Renderer implements IPagedRenderer { this.instantiationService.createInstance(UpdateAction), reloadAction, this.instantiationService.createInstance(InstallAction), - this.instantiationService.createInstance(RemoteInstallAction), + // this.instantiationService.createInstance(RemoteInstallAction), this.instantiationService.createInstance(LocalInstallAction), this.instantiationService.createInstance(MaliciousStatusLabelAction, false), systemDisabledWarningAction, @@ -165,8 +165,8 @@ export class Renderer implements IPagedRenderer { this.extensionService.onDidChangeExtensions(() => updateEnablement(), this, data.extensionDisposables); const onError = Event.once(domEvent(data.icon, 'error')); - onError(() => data.icon.src = extension.iconUrlFallback, null, data.extensionDisposables); - data.icon.src = extension.iconUrl; + onError(() => data.icon.src = require.withBase(extension.iconUrlFallback), null, data.extensionDisposables); + data.icon.src = require.withBase(extension.iconUrl); if (!data.icon.complete) { data.icon.style.visibility = 'hidden'; diff --git a/src/vs/workbench/contrib/extensions/electron-browser/extensionsViews.ts b/src/vs/workbench/contrib/extensions/electron-browser/extensionsViews.ts index 6dad2fb580..04e5d2a62b 100644 --- a/src/vs/workbench/contrib/extensions/electron-browser/extensionsViews.ts +++ b/src/vs/workbench/contrib/extensions/electron-browser/extensionsViews.ts @@ -34,7 +34,7 @@ import { INotificationService, Severity } from 'vs/platform/notification/common/ import { ViewletPanel, IViewletPanelOptions } from 'vs/workbench/browser/parts/views/panelViewlet'; import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; import { distinct, coalesce } from 'vs/base/common/arrays'; -import { IExperimentService, IExperiment, ExperimentActionType } from 'vs/workbench/contrib/experiments/electron-browser/experimentService'; +import { /*IExperimentService, */IExperiment/*, ExperimentActionType*/ } from 'vs/workbench/contrib/experiments/electron-browser/experimentService'; import { alert } from 'vs/base/browser/ui/aria/aria'; import { IListContextMenuEvent } from 'vs/base/browser/ui/list/list'; import { createErrorWithActions } from 'vs/base/common/errorsWithActions'; @@ -96,7 +96,7 @@ export class ExtensionsListView extends ViewletPanel { @ITelemetryService private readonly telemetryService: ITelemetryService, @IConfigurationService configurationService: IConfigurationService, @IWorkspaceContextService protected contextService: IWorkspaceContextService, - @IExperimentService private readonly experimentService: IExperimentService, + // @IExperimentService private readonly experimentService: IExperimentService, @IWorkbenchThemeService private readonly workbenchThemeService: IWorkbenchThemeService, @IExtensionManagementServerService protected readonly extensionManagementServerService: IExtensionManagementServerService, @IProductService protected readonly productService: IProductService, @@ -483,7 +483,7 @@ export class ExtensionsListView extends ViewletPanel { private _searchExperiments: Promise; private getSearchExperiments(): Promise { if (!this._searchExperiments) { - this._searchExperiments = this.experimentService.getExperimentsByType(ExperimentActionType.ExtensionSearchResults); + this._searchExperiments = Promise.resolve([]); // this.experimentService.getExperimentsByType(ExperimentActionType.ExtensionSearchResults); } return this._searchExperiments; } @@ -552,7 +552,7 @@ export class ExtensionsListView extends ViewletPanel { private async getCuratedModel(query: Query, options: IQueryOptions, token: CancellationToken): Promise> { const value = query.value.replace(/curated:/g, '').trim(); - const names = await this.experimentService.getCuratedExtensionsList(value); + const names = []; // await this.experimentService.getCuratedExtensionsList(value); if (Array.isArray(names) && names.length) { options.source = `curated:${value}`; const pager = await this.extensionsWorkbenchService.queryGallery(assign(options, { names, pageSize: names.length }), token); @@ -843,14 +843,14 @@ export class ServerExtensionsView extends ExtensionsListView { @ITelemetryService telemetryService: ITelemetryService, @IConfigurationService configurationService: IConfigurationService, @IWorkspaceContextService contextService: IWorkspaceContextService, - @IExperimentService experimentService: IExperimentService, + // @IExperimentService experimentService: IExperimentService, @IWorkbenchThemeService workbenchThemeService: IWorkbenchThemeService, @IExtensionsWorkbenchService extensionsWorkbenchService: IExtensionsWorkbenchService, @IExtensionManagementServerService extensionManagementServerService: IExtensionManagementServerService, @IProductService productService: IProductService, ) { options.server = server; - super(options, notificationService, keybindingService, contextMenuService, instantiationService, themeService, extensionService, extensionsWorkbenchService, editorService, tipsService, telemetryService, configurationService, contextService, experimentService, workbenchThemeService, extensionManagementServerService, productService); + super(options, notificationService, keybindingService, contextMenuService, instantiationService, themeService, extensionService, extensionsWorkbenchService, editorService, tipsService, telemetryService, configurationService, contextService, /*experimentService,*/ workbenchThemeService, extensionManagementServerService, productService); this._register(onDidChangeTitle(title => this.updateTitle(title))); } diff --git a/src/vs/workbench/contrib/extensions/node/extensionsWorkbenchService.ts b/src/vs/workbench/contrib/extensions/node/extensionsWorkbenchService.ts index c08a6e37c1..2e1deb01e6 100644 --- a/src/vs/workbench/contrib/extensions/node/extensionsWorkbenchService.ts +++ b/src/vs/workbench/contrib/extensions/node/extensionsWorkbenchService.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import * as nls from 'vs/nls'; -import * as semver from 'semver'; +// import * as semver from 'semver'; import { Event, Emitter } from 'vs/base/common/event'; import { index, distinct } from 'vs/base/common/arrays'; import { ThrottledDelayer } from 'vs/base/common/async'; @@ -26,7 +26,7 @@ import { IExtension, ExtensionState, IExtensionsWorkbenchService, AutoUpdateConf import { IEditorService, SIDE_GROUP, ACTIVE_GROUP } from 'vs/workbench/services/editor/common/editorService'; import { IURLService, IURLHandler } from 'vs/platform/url/common/url'; import { ExtensionsInput } from 'vs/workbench/contrib/extensions/common/extensionsInput'; -import product from 'vs/platform/product/node/product'; +import { IProductService } from 'vs/platform/product/common/product'; // import product from 'vs/platform/product/node/product'; import { ILogService } from 'vs/platform/log/common/log'; import { IProgressService, ProgressLocation } from 'vs/platform/progress/common/progress'; import { INotificationService } from 'vs/platform/notification/common/notification'; @@ -53,7 +53,8 @@ class Extension implements IExtension { public gallery: IGalleryExtension | undefined, private telemetryService: ITelemetryService, private logService: ILogService, - private fileService: IFileService + private fileService: IFileService, + private productService: IProductService, ) { } get type(): ExtensionType | undefined { @@ -112,11 +113,11 @@ class Extension implements IExtension { } get url(): string | undefined { - if (!product.extensionsGallery || !this.gallery) { + if (!this.productService.extensionsGallery || !this.gallery) { return undefined; } - return `${product.extensionsGallery.itemUrl}?itemName=${this.publisher}.${this.name}`; + return `${this.productService.extensionsGallery.itemUrl}?itemName=${this.publisher}.${this.name}`; } get iconUrl(): string { @@ -183,7 +184,7 @@ class Extension implements IExtension { } get outdated(): boolean { - return !!this.gallery && this.type === ExtensionType.User && semver.gt(this.latestVersion, this.version); + return !!this.gallery && this.type === ExtensionType.User && this.latestVersion !== this.version; } get telemetryData(): any { @@ -201,7 +202,7 @@ class Extension implements IExtension { } private isGalleryOutdated(): boolean { - return this.local && this.gallery ? semver.gt(this.local.manifest.version, this.gallery.version) : false; + return this.local && this.gallery ? this.local.manifest.version !== this.gallery.version : false; } getManifest(token: CancellationToken): Promise { @@ -320,7 +321,8 @@ class Extensions extends Disposable { @ITelemetryService private readonly telemetryService: ITelemetryService, @ILogService private readonly logService: ILogService, @IFileService private readonly fileService: IFileService, - @IExtensionEnablementService private readonly extensionEnablementService: IExtensionEnablementService + @IExtensionEnablementService private readonly extensionEnablementService: IExtensionEnablementService, + @IProductService private readonly productService: IProductService ) { super(); this._register(server.extensionManagementService.onInstallExtension(e => this.onInstallExtension(e))); @@ -342,7 +344,7 @@ class Extensions extends Disposable { const installed = await this.server.extensionManagementService.getInstalled(); const byId = index(this.installed, e => e.local ? e.local.identifier.id : e.identifier.id); this.installed = installed.map(local => { - const extension = byId[local.identifier.id] || new Extension(this.galleryService, this.stateProvider, this.server, local, undefined, this.telemetryService, this.logService, this.fileService); + const extension = byId[local.identifier.id] || new Extension(this.galleryService, this.stateProvider, this.server, local, undefined, this.telemetryService, this.logService, this.fileService, this.productService); extension.local = local; extension.enablementState = this.extensionEnablementService.getEnablementState(local); return extension; @@ -395,7 +397,7 @@ class Extensions extends Disposable { const { gallery } = event; if (gallery) { const extension = this.installed.filter(e => areSameExtensions(e.identifier, gallery.identifier))[0] - || new Extension(this.galleryService, this.stateProvider, this.server, undefined, gallery, this.telemetryService, this.logService, this.fileService); + || new Extension(this.galleryService, this.stateProvider, this.server, undefined, gallery, this.telemetryService, this.logService, this.fileService, this.productService); this.installing.push(extension); this._onChange.fire(extension); } @@ -406,7 +408,7 @@ class Extensions extends Disposable { const installingExtension = gallery ? this.installing.filter(e => areSameExtensions(e.identifier, gallery.identifier))[0] : null; this.installing = installingExtension ? this.installing.filter(e => e !== installingExtension) : this.installing; - let extension: Extension | undefined = installingExtension ? installingExtension : zipPath ? new Extension(this.galleryService, this.stateProvider, this.server, local, undefined, this.telemetryService, this.logService, this.fileService) : undefined; + let extension: Extension | undefined = installingExtension ? installingExtension : zipPath ? new Extension(this.galleryService, this.stateProvider, this.server, local, undefined, this.telemetryService, this.logService, this.fileService, this.productService) : undefined; if (extension) { if (local) { const installed = this.installed.filter(e => areSameExtensions(e.identifier, extension!.identifier))[0]; @@ -501,7 +503,8 @@ export class ExtensionsWorkbenchService extends Disposable implements IExtension @IExtensionManagementServerService private readonly extensionManagementServerService: IExtensionManagementServerService, @IStorageService private readonly storageService: IStorageService, @IFileService private readonly fileService: IFileService, - @IModeService private readonly modeService: IModeService + @IModeService private readonly modeService: IModeService, + @IProductService private readonly productService: IProductService ) { super(); this.localExtensions = this._register(instantiationService.createInstance(Extensions, extensionManagementServerService.localExtensionManagementServer, ext => this.getExtensionState(ext))); @@ -606,7 +609,7 @@ export class ExtensionsWorkbenchService extends Disposable implements IExtension text = text.replace(extensionRegex, (m, ext) => { // Get curated keywords - const lookup = product.extensionKeywords || {}; + const lookup: {[extension: string]: string[]} = /*this.productService.extensionKeywords || */{}; const keywords = lookup[ext] || []; // Get mode name @@ -649,7 +652,7 @@ export class ExtensionsWorkbenchService extends Disposable implements IExtension if (installed) { return installed; } - const extension = new Extension(this.galleryService, ext => this.getExtensionState(ext), undefined, undefined, gallery, this.telemetryService, this.logService, this.fileService); + const extension = new Extension(this.galleryService, ext => this.getExtensionState(ext), undefined, undefined, gallery, this.telemetryService, this.logService, this.fileService, this.productService); if (maliciousExtensionSet.has(extension.identifier.id)) { extension.isMalicious = true; } @@ -999,7 +1002,7 @@ export class ExtensionsWorkbenchService extends Disposable implements IExtension get allowedBadgeProviders(): string[] { if (!this._extensionAllowedBadgeProviders) { - this._extensionAllowedBadgeProviders = (product.extensionAllowedBadgeProviders || []).map(s => s.toLowerCase()); + this._extensionAllowedBadgeProviders = []; // (product.extensionAllowedBadgeProviders || []).map(s => s.toLowerCase()); } return this._extensionAllowedBadgeProviders; } diff --git a/src/vs/workbench/contrib/files/browser/files.contribution.ts b/src/vs/workbench/contrib/files/browser/files.contribution.ts index 88ad0027e9..17476d5f26 100644 --- a/src/vs/workbench/contrib/files/browser/files.contribution.ts +++ b/src/vs/workbench/contrib/files/browser/files.contribution.ts @@ -200,7 +200,7 @@ configurationRegistry.registerConfiguration({ 'files.exclude': { 'type': 'object', 'markdownDescription': nls.localize('exclude', "Configure glob patterns for excluding files and folders. For example, the files explorer decides which files and folders to show or hide based on this setting. Read more about glob patterns [here](https://code.visualstudio.com/docs/editor/codebasics#_advanced-search-options)."), - 'default': { '**/.git': true, '**/.svn': true, '**/.hg': true, '**/CVS': true, '**/.DS_Store': true }, + 'default': { '**/.git': true, '**/.svn': true, '**/.hg': true, '**/CVS': true, '**/.DS_Store': true, '**/.code-server-partial-upload-*': true }, 'scope': ConfigurationScope.RESOURCE, 'additionalProperties': { 'anyOf': [ diff --git a/src/vs/workbench/contrib/files/browser/views/explorerViewer.ts b/src/vs/workbench/contrib/files/browser/views/explorerViewer.ts index 4592b3918e..346292d086 100644 --- a/src/vs/workbench/contrib/files/browser/views/explorerViewer.ts +++ b/src/vs/workbench/contrib/files/browser/views/explorerViewer.ts @@ -46,6 +46,7 @@ import { IEditorService } from 'vs/workbench/services/editor/common/editorServic import { IWorkspaceFolderCreationData } from 'vs/platform/workspaces/common/workspaces'; import { findValidPasteFileTarget } from 'vs/workbench/contrib/files/browser/fileActions'; import { FuzzyScore, createMatches } from 'vs/base/common/filters'; +import { IUploadService } from 'vs/server/src/upload'; export class ExplorerDelegate implements IListVirtualDelegate { @@ -453,7 +454,8 @@ export class FileDragAndDrop implements ITreeDragAndDrop { @IInstantiationService private instantiationService: IInstantiationService, @ITextFileService private textFileService: ITextFileService, @IWindowService private windowService: IWindowService, - @IWorkspaceEditingService private workspaceEditingService: IWorkspaceEditingService + @IWorkspaceEditingService private workspaceEditingService: IWorkspaceEditingService, + @IUploadService private readonly uploadService: IUploadService, ) { this.toDispose = []; @@ -615,6 +617,7 @@ export class FileDragAndDrop implements ITreeDragAndDrop { private async handleExternalDrop(data: DesktopDragAndDropData, target: ExplorerItem, originalEvent: DragEvent): Promise { + return this.uploadService.handleExternalDrop(data, target, originalEvent); const droppedResources = extractResources(originalEvent, true); // Check for dropped external files to be folders const result = await this.fileService.resolveAll(droppedResources); diff --git a/src/vs/workbench/contrib/remote/common/remote.contribution.ts b/src/vs/workbench/contrib/remote/common/remote.contribution.ts index 9235c739fb..32d203eb32 100644 --- a/src/vs/workbench/contrib/remote/common/remote.contribution.ts +++ b/src/vs/workbench/contrib/remote/common/remote.contribution.ts @@ -55,7 +55,8 @@ class RemoteChannelsContribution extends Disposable implements IWorkbenchContrib const connection = remoteAgentService.getConnection(); if (connection) { const logLevelClient = new LogLevelSetterChannelClient(connection.getChannel('loglevel')); - logLevelClient.setLevel(logService.getLevel()); + logLevelClient.getLevel().then((level) => logService.setLevel(level)); + logLevelClient.onDidChangeLogLevel((level) => logService.setLevel(level)); this._register(logService.onDidChangeLogLevel(level => logLevelClient.setLevel(level))); } } diff --git a/src/vs/workbench/contrib/scm/browser/scmViewlet.ts b/src/vs/workbench/contrib/scm/browser/scmViewlet.ts index 4d8a5d6907..b464d5276f 100644 --- a/src/vs/workbench/contrib/scm/browser/scmViewlet.ts +++ b/src/vs/workbench/contrib/scm/browser/scmViewlet.ts @@ -497,7 +497,7 @@ class ResourceRenderer implements IListRenderer if (icon) { template.decorationIcon.style.display = ''; - template.decorationIcon.style.backgroundImage = `url('${icon}')`; + template.decorationIcon.style.backgroundImage = `url('${require.withBase(icon)}')`; template.decorationIcon.title = resource.decorations.tooltip || ''; } else { template.decorationIcon.style.display = 'none'; diff --git a/src/vs/workbench/contrib/webview/browser/pre/main.js b/src/vs/workbench/contrib/webview/browser/pre/main.js index a6be033e07..a4dcb7357a 100644 --- a/src/vs/workbench/contrib/webview/browser/pre/main.js +++ b/src/vs/workbench/contrib/webview/browser/pre/main.js @@ -355,7 +355,7 @@ // seeing the service worker applying properly. // Fake load an empty on the correct origin and then write real html // into it to get around this. - newFrame.src = `/fake.html?id=${ID}`; + newFrame.src = `fake.html?id=${ID}`; } newFrame.style.cssText = 'display: block; margin: 0; overflow: hidden; position: absolute; width: 100%; height: 100%; visibility: hidden'; document.body.appendChild(newFrame); diff --git a/src/vs/workbench/contrib/webview/browser/webviewEditorInput.ts b/src/vs/workbench/contrib/webview/browser/webviewEditorInput.ts index 6d4d096a9c..bbb7930e7a 100644 --- a/src/vs/workbench/contrib/webview/browser/webviewEditorInput.ts +++ b/src/vs/workbench/contrib/webview/browser/webviewEditorInput.ts @@ -39,10 +39,10 @@ export class WebviewEditorInput extends EditorInput { this._icons.forEach((value, key) => { const webviewSelector = `.show-file-icons .webview-${key}-name-file-icon::before`; if (URI.isUri(value)) { - cssRules.push(`${webviewSelector} { content: ""; background-image: url(${value.toString()}); }`); + cssRules.push(`${webviewSelector} { content: ""; background-image: url(${require.withBase(value).toString()}); }`); } else { - cssRules.push(`.vs ${webviewSelector} { content: ""; background-image: url(${value.light.toString()}); }`); - cssRules.push(`.vs-dark ${webviewSelector} { content: ""; background-image: url(${value.dark.toString()}); }`); + cssRules.push(`.vs ${webviewSelector} { content: ""; background-image: url(${require.withBase(value.light).toString()}); }`); + cssRules.push(`.vs-dark ${webviewSelector} { content: ""; background-image: url(${require.withBase(value.dark).toString()}); }`); } }); this._styleElement.innerHTML = cssRules.join('\n'); diff --git a/src/vs/workbench/services/environment/browser/environmentService.ts b/src/vs/workbench/services/environment/browser/environmentService.ts index 3525569601..a91a5fce7d 100644 --- a/src/vs/workbench/services/environment/browser/environmentService.ts +++ b/src/vs/workbench/services/environment/browser/environmentService.ts @@ -136,6 +136,8 @@ export class BrowserWorkbenchEnvironmentService implements IEnvironmentService { driverHandle?: string; driverVerbose: boolean; webviewEndpoint?: string; + extraExtensionPaths: string[]; + extraBuiltinExtensionPaths: string[]; get webviewResourceRoot(): string { return this.webviewEndpoint ? this.webviewEndpoint + '/vscode-resource' : 'vscode-resource:'; diff --git a/src/vs/workbench/services/extensions/electron-browser/extensionManagementServerService.ts b/src/vs/workbench/services/extensions/electron-browser/extensionManagementServerService.ts index 611ab9aec9..820cc92c73 100644 --- a/src/vs/workbench/services/extensions/electron-browser/extensionManagementServerService.ts +++ b/src/vs/workbench/services/extensions/electron-browser/extensionManagementServerService.ts @@ -6,15 +6,15 @@ import { localize } from 'vs/nls'; import { Schemas } from 'vs/base/common/network'; import { URI } from 'vs/base/common/uri'; -import { IExtensionManagementServer, IExtensionManagementServerService, IExtensionGalleryService } from 'vs/platform/extensionManagement/common/extensionManagement'; -import { ExtensionManagementChannelClient } from 'vs/platform/extensionManagement/node/extensionManagementIpc'; +import { IExtensionManagementServer, IExtensionManagementServerService, IExtensionGalleryService, IExtensionManagementService } from 'vs/platform/extensionManagement/common/extensionManagement'; +// import { ExtensionManagementChannelClient } from 'vs/platform/extensionManagement/node/extensionManagementIpc'; import { IRemoteAgentService } from 'vs/workbench/services/remote/common/remoteAgentService'; import { REMOTE_HOST_SCHEME } from 'vs/platform/remote/common/remoteHosts'; -import { IChannel } from 'vs/base/parts/ipc/common/ipc'; -import { ISharedProcessService } from 'vs/platform/ipc/electron-browser/sharedProcessService'; +// import { IChannel } from 'vs/base/parts/ipc/common/ipc'; +// import { ISharedProcessService } from 'vs/platform/ipc/electron-browser/sharedProcessService'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; import { ILogService } from 'vs/platform/log/common/log'; -import { RemoteExtensionManagementChannelClient } from 'vs/workbench/services/extensions/electron-browser/remoteExtensionManagementIpc'; +// import { RemoteExtensionManagementChannelClient } from 'vs/workbench/services/extensions/electron-browser/remoteExtensionManagementIpc'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { IProductService } from 'vs/platform/product/common/product'; @@ -28,24 +28,26 @@ export class ExtensionManagementServerService implements IExtensionManagementSer readonly remoteExtensionManagementServer: IExtensionManagementServer | null = null; constructor( - @ISharedProcessService sharedProcessService: ISharedProcessService, + // This is set to `any` just to keep the tests from showing errors. + @IExtensionManagementService localExtensionManagementService: any, // @ISharedProcessService sharedProcessService: ISharedProcessService, @IRemoteAgentService remoteAgentService: IRemoteAgentService, @IExtensionGalleryService galleryService: IExtensionGalleryService, @IConfigurationService configurationService: IConfigurationService, @IProductService productService: IProductService, @ILogService logService: ILogService ) { - const localExtensionManagementService = new ExtensionManagementChannelClient(sharedProcessService.getChannel('extensions')); - - this.localExtensionManagementServer = { extensionManagementService: localExtensionManagementService, authority: localExtensionManagementServerAuthority, label: localize('local', "Local") }; - const remoteAgentConnection = remoteAgentService.getConnection(); - if (remoteAgentConnection) { - const extensionManagementService = new RemoteExtensionManagementChannelClient(remoteAgentConnection.getChannel('extensions'), this.localExtensionManagementServer.extensionManagementService, galleryService, logService, configurationService, productService); - this.remoteExtensionManagementServer = { authority: remoteAgentConnection.remoteAuthority, extensionManagementService, label: localize('remote', "Remote") }; - } + // const localExtensionManagementService = new ExtensionManagementChannelClient(sharedProcessService.getChannel('extensions')); + + this.localExtensionManagementServer = { extensionManagementService: localExtensionManagementService!, authority: localExtensionManagementServerAuthority, label: localize('remote', "Remote") }; + // const remoteAgentConnection = remoteAgentService.getConnection(); + // if (remoteAgentConnection) { + // const extensionManagementService = new RemoteExtensionManagementChannelClient(remoteAgentConnection.getChannel('extensions'), this.localExtensionManagementServer.extensionManagementService, galleryService, logService, configurationService, productService); + // this.remoteExtensionManagementServer = { authority: remoteAgentConnection.remoteAuthority, extensionManagementService, label: localize('remote', "Remote") }; + // } } getExtensionManagementServer(location: URI): IExtensionManagementServer | null { + return this.localExtensionManagementServer; if (location.scheme === Schemas.file) { return this.localExtensionManagementServer; } diff --git a/src/vs/workbench/services/files/common/fileService.ts b/src/vs/workbench/services/files/common/fileService.ts index a788aadc1f..bcffa2c60a 100644 --- a/src/vs/workbench/services/files/common/fileService.ts +++ b/src/vs/workbench/services/files/common/fileService.ts @@ -859,7 +859,7 @@ export class FileService extends Disposable implements IFileService { let posInFile = 0; let chunk: VSBuffer | null; - while (chunk = readable.read()) { + while (chunk = await readable.read()) { await this.doWriteBuffer(provider, handle, chunk, chunk.byteLength, posInFile, 0); posInFile += chunk.byteLength; @@ -888,7 +888,7 @@ export class FileService extends Disposable implements IFileService { if (bufferOrReadable instanceof VSBuffer) { buffer = bufferOrReadable; } else { - buffer = readableToBuffer(bufferOrReadable); + buffer = await readableToBuffer(bufferOrReadable); } return provider.writeFile(resource, buffer.buffer, { create: true, overwrite: true }); diff --git a/src/vs/workbench/services/themes/common/fileIconThemeData.ts b/src/vs/workbench/services/themes/common/fileIconThemeData.ts index 306d58f915..58c603ad3d 100644 --- a/src/vs/workbench/services/themes/common/fileIconThemeData.ts +++ b/src/vs/workbench/services/themes/common/fileIconThemeData.ts @@ -331,7 +331,7 @@ function _processIconThemeDocument(id: string, iconThemeDocumentLocation: URI, i let fonts = iconThemeDocument.fonts; if (Array.isArray(fonts)) { fonts.forEach(font => { - let src = font.src.map(l => `url('${resolvePath(l.path)}') format('${l.format}')`).join(', '); + let src = font.src.map(l => `url('${require.withBase(resolvePath(l.path))}') format('${l.format}')`).join(', '); cssRules.push(`@font-face { src: ${src}; font-family: '${font.id}'; font-weight: ${font.weight}; font-style: ${font.style}; }`); }); cssRules.push(`.show-file-icons .file-icon::before, .show-file-icons .folder-icon::before, .show-file-icons .rootfolder-icon::before { font-family: '${fonts[0].id}'; font-size: ${fonts[0].size || '150%'}}`); @@ -342,7 +342,7 @@ function _processIconThemeDocument(id: string, iconThemeDocumentLocation: URI, i let definition = iconThemeDocument.iconDefinitions[defId]; if (definition) { if (definition.iconPath) { - cssRules.push(`${selectors.join(', ')} { content: ' '; background-image: url("${resolvePath(definition.iconPath)}"); }`); + cssRules.push(`${selectors.join(', ')} { content: ' '; background-image: url("${require.withBase(resolvePath(definition.iconPath))}"); }`); } if (definition.fontCharacter || definition.fontColor) { let body = ''; diff --git a/src/vs/workbench/workbench.web.main.ts b/src/vs/workbench/workbench.web.main.ts index c28adc0ad9..3d1adba3d9 100644 --- a/src/vs/workbench/workbench.web.main.ts +++ b/src/vs/workbench/workbench.web.main.ts @@ -128,7 +128,7 @@ import 'vs/workbench/services/extensions/browser/extensionService'; // import 'vs/workbench/services/contextmenu/electron-browser/contextmenuService'; // import 'vs/workbench/services/extensions/node/multiExtensionManagement'; import 'vs/workbench/services/label/common/labelService'; -// import 'vs/workbench/services/extensions/electron-browser/extensionManagementServerService'; +import 'vs/workbench/services/extensions/electron-browser/extensionManagementServerService'; // import 'vs/workbench/services/remote/electron-browser/remoteAgentServiceImpl'; import 'vs/workbench/services/notification/common/notificationService'; // import 'vs/workbench/services/window/electron-browser/windowService'; @@ -260,9 +260,9 @@ registerSingleton(IWebviewService, WebviewService, true); registerSingleton(IWebviewEditorService, WebviewEditorService, true); // Extensions Management -// import 'vs/workbench/contrib/extensions/electron-browser/extensions.contribution'; -// import 'vs/workbench/contrib/extensions/browser/extensionsQuickOpen'; -// import 'vs/workbench/contrib/extensions/electron-browser/extensionsViewlet'; +import 'vs/workbench/contrib/extensions/electron-browser/extensions.contribution'; +import 'vs/workbench/contrib/extensions/browser/extensionsQuickOpen'; +import 'vs/workbench/contrib/extensions/electron-browser/extensionsViewlet'; // Output Panel import 'vs/workbench/contrib/output/browser/output.contribution'; @@ -356,3 +356,5 @@ import 'vs/workbench/contrib/outline/browser/outline.contribution'; // import 'vs/workbench/contrib/issue/electron-browser/issue.contribution'; //#endregion + +import 'vs/server/src/client';