diff --git a/ci/dev/vscode.patch b/ci/dev/vscode.patch index 33762116e..991ca7ce3 100644 --- a/ci/dev/vscode.patch +++ b/ci/dev/vscode.patch @@ -12,49 +12,25 @@ index e73dd4d9e8..e3192b3a0d 100644 coverage/ diff --git a/.yarnrc b/.yarnrc deleted file mode 100644 -index d86b284e83..0000000000 +index 135e10442a..0000000000 --- a/.yarnrc +++ /dev/null @@ -1,3 +0,0 @@ -disturl "https://atom.io/download/electron" --target "7.2.4" +-target "7.3.2" -runtime "electron" diff --git a/build/gulpfile.reh.js b/build/gulpfile.reh.js -index f2ea1bd370..2dc6da34fb 100644 +index f2ea1bd370..3f660f9981 100644 --- a/build/gulpfile.reh.js +++ b/build/gulpfile.reh.js @@ -52,6 +52,7 @@ gulp.task('vscode-reh-web-linux-x64-min', noop); gulp.task('vscode-reh-web-linux-alpine-min', noop); function getNodeVersion() { -+ return process.versions.node ++ return process.versions.node; const yarnrc = fs.readFileSync(path.join(REPO_ROOT, 'remote', '.yarnrc'), 'utf8'); const target = /^target "(.*)"$/m.exec(yarnrc)[1]; return target; -diff --git a/build/lib/electron.js b/build/lib/electron.js -index abf6baab41..8a1d1bad13 100644 ---- a/build/lib/electron.js -+++ b/build/lib/electron.js -@@ -17,6 +17,7 @@ const root = path.dirname(path.dirname(__dirname)); - const product = JSON.parse(fs.readFileSync(path.join(root, 'product.json'), 'utf8')); - const commit = util.getVersion(root); - function getElectronVersion() { -+ return process.versions.node; - const yarnrc = fs.readFileSync(path.join(root, '.yarnrc'), 'utf8'); - const target = /^target "(.*)"$/m.exec(yarnrc)[1]; - return target; -diff --git a/build/lib/electron.ts b/build/lib/electron.ts -index 86c7afcf31..0663b4c28d 100644 ---- a/build/lib/electron.ts -+++ b/build/lib/electron.ts -@@ -20,6 +20,7 @@ const product = JSON.parse(fs.readFileSync(path.join(root, 'product.json'), 'utf - const commit = util.getVersion(root); - - export function getElectronVersion(): string { -+ return process.versions.node - const yarnrc = fs.readFileSync(path.join(root, '.yarnrc'), 'utf8'); - const target = /^target "(.*)"$/m.exec(yarnrc)![1]; - return target; diff --git a/build/lib/node.js b/build/lib/node.js index 403ae3d965..738ee8cee0 100644 --- a/build/lib/node.js @@ -93,23 +69,51 @@ index 6439703446..c53dccf4dc 100644 -console.log(nodePath); \ No newline at end of file +console.log(nodePath); +diff --git a/build/lib/util.js b/build/lib/util.js +index e552a036f8..169e8614b9 100644 +--- a/build/lib/util.js ++++ b/build/lib/util.js +@@ -257,6 +257,7 @@ function streamToPromise(stream) { + } + exports.streamToPromise = streamToPromise; + function getElectronVersion() { ++ return process.versions.node; + const yarnrc = fs.readFileSync(path.join(root, '.yarnrc'), 'utf8'); + const target = /^target "(.*)"$/m.exec(yarnrc)[1]; + return target; +diff --git a/build/lib/util.ts b/build/lib/util.ts +index 035c7e95ea..4ff8dcfe6b 100644 +--- a/build/lib/util.ts ++++ b/build/lib/util.ts +@@ -322,6 +322,7 @@ export function streamToPromise(stream: NodeJS.ReadWriteStream): Promise { + } + + export function getElectronVersion(): string { ++ return process.versions.node; + const yarnrc = fs.readFileSync(path.join(root, '.yarnrc'), 'utf8'); + const target = /^target "(.*)"$/m.exec(yarnrc)![1]; + return target; diff --git a/build/npm/postinstall.js b/build/npm/postinstall.js -index 7a2320d828..5768890636 100644 +index ef8fa4a47f..0866d0dbce 100644 --- a/build/npm/postinstall.js +++ b/build/npm/postinstall.js -@@ -33,9 +33,9 @@ function yarnInstall(location, opts) { +@@ -33,10 +33,11 @@ function yarnInstall(location, opts) { yarnInstall('extensions'); // node modules shared by all extensions --yarnInstall('remote'); // node modules used by vscode server -+// yarnInstall('remote'); // node modules used by vscode server - --yarnInstall('remote/web'); // node modules used by vscode web -+// yarnInstall('remote/web'); // node modules used by vscode web +-if (!(process.platform === 'win32' && process.env['npm_config_arch'] === 'arm64')) { +- yarnInstall('remote'); // node modules used by vscode server +- yarnInstall('remote/web'); // node modules used by vscode web +-} ++// NOTE@coder: Skip these dependencies since we don't use them. ++// if (!(process.platform === 'win32' && process.env['npm_config_arch'] === 'arm64')) { ++// yarnInstall('remote'); // node modules used by vscode server ++// yarnInstall('remote/web'); // node modules used by vscode web ++// } const allExtensionFolders = fs.readdirSync('extensions'); const extensions = allExtensionFolders.filter(e => { -@@ -68,7 +68,7 @@ runtime "${runtime}"`; +@@ -69,9 +70,9 @@ runtime "${runtime}"`; } yarnInstall(`build`); // node modules required for build @@ -120,6 +124,8 @@ index 7a2320d828..5768890636 100644 +// yarnInstall('test/smoke'); // node modules required for smoketest +// yarnInstall('test/integration/browser'); // node modules required for integration yarnInstallBuildDependencies(); // node modules for watching, specific to host node version, not electron + + cp.execSync('git config pull.rebase true'); diff --git a/build/npm/preinstall.js b/build/npm/preinstall.js index cb88d37ade..6b3253af0a 100644 --- a/build/npm/preinstall.js @@ -138,10 +144,10 @@ index cb88d37ade..6b3253af0a 100644 const cp = require('child_process'); diff --git a/coder.js b/coder.js new file mode 100644 -index 0000000000..0170b47241 +index 0000000000..ce7d4f175f --- /dev/null +++ b/coder.js -@@ -0,0 +1,69 @@ +@@ -0,0 +1,68 @@ +// This must be ran from VS Code's root. +const gulp = require("gulp"); +const path = require("path"); @@ -176,8 +182,7 @@ index 0000000000..0170b47241 + '!out-build/vs/code/electron-browser/**', + "out-build/vs/base/common/performance.js", + "out-build/vs/base/node/languagePacks.js", -+ "out-build/vs/base/browser/ui/octiconLabel/octicons/**", -+ "out-build/vs/base/browser/ui/codiconLabel/codicon/**", ++ 'out-build/vs/base/browser/ui/codicons/codicon/**', + "out-build/vs/workbench/browser/media/*-theme.css", + "out-build/vs/workbench/contrib/debug/**/*.json", + "out-build/vs/workbench/contrib/externalTerminal/**/*.scpt", @@ -212,11 +217,11 @@ index 0000000000..0170b47241 + common.minifyTask("out-vscode") +)); diff --git a/package.json b/package.json -index d150d539ae..33078416d9 100644 +index 3729a85589..88742d99fc 100644 --- a/package.json +++ b/package.json -@@ -37,6 +37,9 @@ - "generate-github-config": "node extensions/github-authentication/build/generateconfig.js" +@@ -42,6 +42,9 @@ + "eslint": "eslint -c .eslintrc.json --rulesdir ./build/lib/eslint --ext .ts --ext .js ./src/vs ./extensions" }, "dependencies": { + "@coder/logger": "^1.1.12", @@ -226,10 +231,10 @@ index d150d539ae..33078416d9 100644 "chokidar": "3.2.3", "graceful-fs": "4.2.3", diff --git a/product.json b/product.json -index 335caa71f6..47607a3eb8 100644 +index e20b354974..92f72662c5 100644 --- a/product.json +++ b/product.json -@@ -18,7 +18,7 @@ +@@ -20,7 +20,7 @@ "darwinBundleIdentifier": "com.visualstudio.code.oss", "linuxIconName": "com.visualstudio.code.oss", "licenseFileName": "LICENSE.txt", @@ -237,7 +242,7 @@ index 335caa71f6..47607a3eb8 100644 + "reportIssueUrl": "https://github.com/cdr/code-server/issues/new", "urlProtocol": "code-oss", "extensionAllowedProposedApi": [ - "ms-vscode.vscode-js-profile-table", + "ms-vscode.vscode-js-profile-flame", diff --git a/remote/.yarnrc b/remote/.yarnrc deleted file mode 100644 index 1e16cde724..0000000000 @@ -248,10 +253,10 @@ index 1e16cde724..0000000000 -target "12.4.0" -runtime "node" diff --git a/src/vs/base/common/network.ts b/src/vs/base/common/network.ts -index e4546b2cf6..ad2c544e89 100644 +index 1286c5117a..e60dd11d03 100644 --- a/src/vs/base/common/network.ts +++ b/src/vs/base/common/network.ts -@@ -94,16 +94,17 @@ class RemoteAuthoritiesImpl { +@@ -111,16 +111,17 @@ class RemoteAuthoritiesImpl { if (host && host.indexOf(':') !== -1) { host = `[${host}]`; } @@ -273,7 +278,7 @@ index e4546b2cf6..ad2c544e89 100644 }); } diff --git a/src/vs/base/common/platform.ts b/src/vs/base/common/platform.ts -index 2c30aaa188..a1e89578a8 100644 +index 0bbc5d6ef9..61f139b9c5 100644 --- a/src/vs/base/common/platform.ts +++ b/src/vs/base/common/platform.ts @@ -59,6 +59,17 @@ if (typeof navigator === 'object' && !isElectronRenderer) { @@ -391,7 +396,7 @@ index 2c64061da7..c0ef8faedd 100644 // Do nothing. If we can't read the file we have no // language pack config. diff --git a/src/vs/code/browser/workbench/workbench.ts b/src/vs/code/browser/workbench/workbench.ts -index 556c03a03a..ac5d23ed8e 100644 +index 4bd7368805..da2204af0a 100644 --- a/src/vs/code/browser/workbench/workbench.ts +++ b/src/vs/code/browser/workbench/workbench.ts @@ -12,6 +12,8 @@ import { request } from 'vs/base/parts/request/browser/request'; @@ -424,13 +429,13 @@ index 556c03a03a..ac5d23ed8e 100644 } // Append payload if any -@@ -284,7 +292,22 @@ class WorkspaceProvider implements IWorkspaceProvider { +@@ -287,7 +295,22 @@ class WorkspaceProvider implements IWorkspaceProvider { throw new Error('Missing web configuration element'); } - const config: IWorkbenchConstructionOptions & { folderUri?: UriComponents, workspaceUri?: UriComponents } = JSON.parse(configElementAttribute); + const config: IWorkbenchConstructionOptions & { folderUri?: UriComponents, workspaceUri?: UriComponents } = { -+ webviewEndpoint: `${window.location.origin}${window.location.pathname.replace(/\/+$/, '')}/webview`, ++ webviewEndpoint: `${window.location.origin}${window.location.pathname.replace(/\/+$/, '')}/webview/`, + ...JSON.parse(configElementAttribute), + }; + @@ -448,7 +453,7 @@ index 556c03a03a..ac5d23ed8e 100644 // Revive static extension locations if (Array.isArray(config.staticExtensions)) { -@@ -296,40 +319,7 @@ class WorkspaceProvider implements IWorkspaceProvider { +@@ -299,40 +322,7 @@ class WorkspaceProvider implements IWorkspaceProvider { // Find workspace to open and payload let foundWorkspace = false; let workspace: IWorkspace; @@ -491,7 +496,7 @@ index 556c03a03a..ac5d23ed8e 100644 // If no workspace is provided through the URL, check for config attribute from server if (!foundWorkspace) { diff --git a/src/vs/platform/environment/common/environment.ts b/src/vs/platform/environment/common/environment.ts -index 3627ab2855..fa4f63472d 100644 +index c63cc171cc..125e8a48e3 100644 --- a/src/vs/platform/environment/common/environment.ts +++ b/src/vs/platform/environment/common/environment.ts @@ -65,6 +65,9 @@ export interface IEnvironmentService { @@ -505,11 +510,11 @@ index 3627ab2855..fa4f63472d 100644 // NOTE: DO NOT ADD ANY OTHER PROPERTY INTO THE COLLECTION HERE // UNLESS THIS PROPERTY IS SUPPORTED BOTH IN WEB AND DESKTOP!!!! diff --git a/src/vs/platform/environment/node/argv.ts b/src/vs/platform/environment/node/argv.ts -index f78839981b..9601313d0d 100644 +index 38e7ca5ad3..f0e59e8e63 100644 --- a/src/vs/platform/environment/node/argv.ts +++ b/src/vs/platform/environment/node/argv.ts -@@ -8,6 +8,8 @@ import * as os from 'os'; - import { localize } from 'vs/nls'; +@@ -8,6 +8,8 @@ import { localize } from 'vs/nls'; + import { isWindows } from 'vs/base/common/platform'; export interface ParsedArgs { + 'extra-extensions-dir'?: string[]; @@ -517,7 +522,7 @@ index f78839981b..9601313d0d 100644 _: string[]; 'folder-uri'?: string[]; // undefined or array of 1 or more 'file-uri'?: string[]; // undefined or array of 1 or more -@@ -137,6 +139,8 @@ export const OPTIONS: OptionDescriptions> = { +@@ -139,6 +141,8 @@ export const OPTIONS: OptionDescriptions> = { 'extensions-dir': { type: 'string', deprecates: 'extensionHomePath', cat: 'e', args: 'dir', description: localize('extensionHomePath', "Set the root path for extensions.") }, 'extensions-download-dir': { type: 'string' }, 'builtin-extensions-dir': { type: 'string' }, @@ -526,18 +531,18 @@ index f78839981b..9601313d0d 100644 'list-extensions': { type: 'boolean', cat: 'e', description: localize('listExtensions', "List the installed extensions.") }, 'show-versions': { type: 'boolean', cat: 'e', description: localize('showVersions', "Show versions of installed extensions, when using --list-extension.") }, 'category': { type: 'string', cat: 'e', description: localize('category', "Filters installed extensions by provided category, when using --list-extension.") }, -@@ -395,4 +399,3 @@ export function buildHelpMessage(productName: string, executableName: string, ve +@@ -399,4 +403,3 @@ export function buildHelpMessage(productName: string, executableName: string, ve export function buildVersionMessage(version: string | undefined, commit: string | undefined): string { return `${version || localize('unknownVersion', "Unknown version")}\n${commit || localize('unknownCommit', "Unknown commit")}\n${process.arch}`; } - diff --git a/src/vs/platform/environment/node/environmentService.ts b/src/vs/platform/environment/node/environmentService.ts -index a67032aae3..c7ccee8c65 100644 +index 0d154c16f3..96584ceeaf 100644 --- a/src/vs/platform/environment/node/environmentService.ts +++ b/src/vs/platform/environment/node/environmentService.ts @@ -38,8 +38,9 @@ export interface INativeEnvironmentService extends IEnvironmentService { extensionsPath?: string; - extensionsDownloadPath?: string; + extensionsDownloadPath: string; builtinExtensionsPath: string; + extraExtensionPaths: string[]; + extraBuiltinExtensionPaths: string[]; @@ -546,7 +551,7 @@ index a67032aae3..c7ccee8c65 100644 workspaceStorageHome: string; driverHandle?: string; -@@ -176,6 +177,13 @@ export class EnvironmentService implements INativeEnvironmentService { +@@ -181,6 +182,13 @@ export class EnvironmentService implements INativeEnvironmentService { return resources.joinPath(this.userHome, product.dataFolderName, 'extensions').fsPath; } @@ -560,82 +565,55 @@ index a67032aae3..c7ccee8c65 100644 @memoize get extensionDevelopmentLocationURI(): URI[] | undefined { const s = this._args.extensionDevelopmentPath; -diff --git a/src/vs/platform/extensionManagement/node/extensionManagementService.ts b/src/vs/platform/extensionManagement/node/extensionManagementService.ts -index 7d466be263..b92501a55e 100644 ---- a/src/vs/platform/extensionManagement/node/extensionManagementService.ts -+++ b/src/vs/platform/extensionManagement/node/extensionManagementService.ts -@@ -746,11 +746,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.trace('Scanned system extensions:', result.length); -+ return result; -+ }); - if (this.environmentService.isBuilt) { - return systemExtensionsPromise; - } -@@ -772,9 +776,16 @@ export class ExtensionManagementService extends Disposable implements IExtension - .then(([systemExtensions, devSystemExtensions]) => [...systemExtensions, ...devSystemExtensions]); +diff --git a/src/vs/platform/extensionManagement/node/extensionsScanner.ts b/src/vs/platform/extensionManagement/node/extensionsScanner.ts +index 8a02d58477..929650ece3 100644 +--- a/src/vs/platform/extensionManagement/node/extensionsScanner.ts ++++ b/src/vs/platform/extensionManagement/node/extensionsScanner.ts +@@ -88,7 +88,7 @@ export class ExtensionsScanner extends Disposable { } -+ 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) { -@@ -789,6 +800,12 @@ export class ExtensionManagementService extends Disposable implements IExtension - private scanExtensions(root: string, type: ExtensionType): Promise { + async scanAllUserExtensions(): Promise { +- return this.scanExtensionsInDir(this.extensionsPath, ExtensionType.User); ++ return this.scanExtensionsInDirs(this.extensionsPath, this.environmentService.extraExtensionPaths, ExtensionType.User); + } + + async extractUserExtension(identifierWithVersion: ExtensionIdentifierWithVersion, zipPath: string, token: CancellationToken): Promise { +@@ -214,7 +214,13 @@ export class ExtensionsScanner extends Disposable { + + private async scanExtensionsInDir(dir: string, type: ExtensionType): Promise { const limiter = new Limiter(10); - return pfs.readdir(root) +- const extensionsFolders = await pfs.readdir(dir); ++ const extensionsFolders = await pfs.readdir(dir) + .catch((error) => { + if (error.code !== 'ENOENT') { + throw error; + } + return []; -+ }) - .then(extensionsFolders => Promise.all(extensionsFolders.map(extensionFolder => limiter.queue(() => this.scanExtension(extensionFolder, root, type))))) - .then(extensions => extensions.filter(e => e && e.identifier)); ++ }); + const extensions = await Promise.all(extensionsFolders.map(extensionFolder => limiter.queue(() => this.scanExtension(extensionFolder, dir, type)))); + return extensions.filter(e => e && e.identifier); } -@@ -827,7 +844,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()]) { -@@ -846,7 +863,7 @@ export class ExtensionManagementService extends Disposable implements IExtension +@@ -244,7 +250,7 @@ export class ExtensionsScanner extends Disposable { } - 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[] = []; - + private async scanDefaultSystemExtensions(): Promise { +- const result = await this.scanExtensionsInDir(this.systemExtensionsPath, ExtensionType.System); ++ const result = await this.scanExtensionsInDirs(this.systemExtensionsPath, this.environmentService.extraBuiltinExtensionPaths, ExtensionType.System); + this.logService.trace('Scanned system extensions:', result.length); + return result; + } +@@ -348,4 +354,9 @@ export class ExtensionsScanner extends Disposable { + } + }); + } ++ ++ private async scanExtensionsInDirs(dir: string, dirs: string[], type: ExtensionType): Promise{ ++ const results = await Promise.all([dir, ...dirs].map((path) => this.scanExtensionsInDir(path, type))); ++ return results.reduce((flat, current) => flat.concat(current), []); ++ } + } diff --git a/src/vs/platform/product/common/product.ts b/src/vs/platform/product/common/product.ts -index 87a3b99c70..09e2c93172 100644 +index 057c83ab36..e586f401c2 100644 --- a/src/vs/platform/product/common/product.ts +++ b/src/vs/platform/product/common/product.ts @@ -26,6 +26,12 @@ if (isWeb) { @@ -652,7 +630,7 @@ index 87a3b99c70..09e2c93172 100644 // Node: AMD loader diff --git a/src/vs/platform/product/common/productService.ts b/src/vs/platform/product/common/productService.ts -index 266aa69fc6..e9b51f5fde 100644 +index 7cfc7f1fc3..f8980ea40a 100644 --- a/src/vs/platform/product/common/productService.ts +++ b/src/vs/platform/product/common/productService.ts @@ -25,6 +25,8 @@ export interface IBuiltInExtension { @@ -1181,10 +1159,10 @@ index 0000000000..14b9de879c +} diff --git a/src/vs/server/common/telemetry.ts b/src/vs/server/common/telemetry.ts new file mode 100644 -index 0000000000..ca5a0c6ce4 +index 0000000000..4cd0d91657 --- /dev/null +++ b/src/vs/server/common/telemetry.ts -@@ -0,0 +1,59 @@ +@@ -0,0 +1,60 @@ +import { ITelemetryData } from 'vs/base/common/actions'; +import { Event } from 'vs/base/common/event'; +import { IChannel, IServerChannel } from 'vs/base/parts/ipc/common/ipc'; @@ -1214,6 +1192,11 @@ index 0000000000..ca5a0c6ce4 +export class TelemetryChannelClient implements ITelemetryService { + _serviceBrand: any; + ++ // These don't matter; telemetry is sent to the Node side which decides ++ // whether to send the telemetry event. ++ public isOptedIn = true; ++ public sendErrorTelemetry = true; ++ + constructor(private readonly channel: IChannel) {} + + public publicLog(eventName: string, data?: ITelemetryData, anonymizeFilePaths?: boolean): Promise { @@ -1239,10 +1222,6 @@ index 0000000000..ca5a0c6ce4 + public getTelemetryInfo(): Promise { + return this.channel.call('getTelemetryInfo'); + } -+ -+ public get isOptedIn(): boolean { -+ return true; -+ } +} diff --git a/src/vs/server/entry.ts b/src/vs/server/entry.ts new file mode 100644 @@ -1462,13 +1441,14 @@ index 0000000000..0a9c95d50e +} diff --git a/src/vs/server/node/channel.ts b/src/vs/server/node/channel.ts new file mode 100644 -index 0000000000..1166835371 +index 0000000000..6590636abd --- /dev/null +++ b/src/vs/server/node/channel.ts -@@ -0,0 +1,343 @@ +@@ -0,0 +1,338 @@ +import { Server } from '@coder/node-browser'; +import * as path from 'path'; -+import { VSBuffer, VSBufferReadableStream } from 'vs/base/common/buffer'; ++import { VSBuffer } from 'vs/base/common/buffer'; ++import { CancellationTokenSource } from 'vs/base/common/cancellation'; +import { Emitter, Event } from 'vs/base/common/event'; +import { IDisposable } from 'vs/base/common/lifecycle'; +import { OS } from 'vs/base/common/platform'; @@ -1480,7 +1460,6 @@ index 0000000000..1166835371 +import { INativeEnvironmentService } from 'vs/platform/environment/node/environmentService'; +import { ExtensionIdentifier, IExtensionDescription } from 'vs/platform/extensions/common/extensions'; +import { FileDeleteOptions, FileOpenOptions, FileOverwriteOptions, FileReadStreamOptions, FileType, FileWriteOptions, IStat, IWatchOptions } from 'vs/platform/files/common/files'; -+import { createReadStream } from 'vs/platform/files/common/io'; +import { DiskFileSystemProvider } from 'vs/platform/files/node/diskFileSystemProvider'; +import { ILogService } from 'vs/platform/log/common/log'; +import product from 'vs/platform/product/common/product'; @@ -1558,20 +1537,15 @@ index 0000000000..1166835371 + } + + private readFileStream(resource: UriComponents, opts: FileReadStreamOptions): Event> { -+ let fileStream: VSBufferReadableStream | undefined; ++ const cts = new CancellationTokenSource(); ++ const fileStream = this.provider.readFileStream(this.transform(resource), opts, cts.token); + const emitter = new Emitter>({ + onFirstListenerAdd: () => { -+ if (!fileStream) { -+ fileStream = createReadStream(this.provider, this.transform(resource), { -+ ...opts, -+ bufferSize: 64 * 1024, // From DiskFileSystemProvider -+ }); -+ fileStream.on('data', (data) => emitter.fire(data)); -+ fileStream.on('error', (error) => emitter.fire(error)); -+ fileStream.on('end', () => emitter.fire('end')); -+ } ++ fileStream.on('data', (data) => emitter.fire(VSBuffer.wrap(data))); ++ fileStream.on('error', (error) => emitter.fire(error)); ++ fileStream.on('end', () => emitter.fire('end')); + }, -+ onLastListenerRemove: () => fileStream && fileStream.destroy(), ++ onLastListenerRemove: () => cts.cancel(), + }); + + return emitter.event; @@ -2532,19 +2506,18 @@ index 0000000000..3c74512192 +} diff --git a/src/vs/server/node/server.ts b/src/vs/server/node/server.ts new file mode 100644 -index 0000000000..80616dd11c +index 0000000000..433646424e --- /dev/null +++ b/src/vs/server/node/server.ts -@@ -0,0 +1,281 @@ +@@ -0,0 +1,282 @@ ++import * as fs from 'fs'; +import * as net from 'net'; +import * as path from 'path'; -+import * as fs from 'fs'; +import { Emitter } from 'vs/base/common/event'; +import { Schemas } from 'vs/base/common/network'; +import { URI } from 'vs/base/common/uri'; +import { getMachineId } from 'vs/base/node/id'; -+import { ClientConnectionEvent, IPCServer, IServerChannel } from 'vs/base/parts/ipc/common/ipc'; -+import { createChannelReceiver } from 'vs/base/parts/ipc/node/ipc'; ++import { ClientConnectionEvent, createChannelReceiver, IPCServer, IServerChannel } from 'vs/base/parts/ipc/common/ipc'; +import { LogsDataCleaner } from 'vs/code/electron-browser/sharedProcess/contrib/logsDataCleaner'; +import { main } from "vs/code/node/cliProcessMain"; +import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; @@ -2577,7 +2550,7 @@ index 0000000000..80616dd11c +import { RequestService } from 'vs/platform/request/node/requestService'; +import ErrorTelemetry from 'vs/platform/telemetry/browser/errorTelemetry'; +import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; -+import { ITelemetryServiceConfig, TelemetryService } from 'vs/platform/telemetry/common/telemetryService'; ++import { TelemetryService } from 'vs/platform/telemetry/common/telemetryService'; +import { combinedAppender, LogAppender, NullTelemetryService } from 'vs/platform/telemetry/common/telemetryUtils'; +import { AppInsightsAppender } from 'vs/platform/telemetry/node/appInsightsAppender'; +import { resolveCommonProperties } from 'vs/platform/telemetry/node/commonProperties'; @@ -2747,6 +2720,7 @@ index 0000000000..80616dd11c + + const piiPaths = [ + path.join(environmentService.userDataPath, 'clp'), // Language packs. ++ environmentService.appRoot, + environmentService.extensionsPath, + environmentService.builtinExtensionsPath, + ...environmentService.extraExtensionPaths, @@ -2769,18 +2743,19 @@ index 0000000000..80616dd11c + this.services.set(IExtensionGalleryService, new SyncDescriptor(ExtensionGalleryService)); + this.services.set(IExtensionManagementService, new SyncDescriptor(ExtensionManagementService)); + -+ if (!environmentService.args['disable-telemetry']) { -+ this.services.set(ITelemetryService, new SyncDescriptor(TelemetryService, [{ ++ if (!environmentService.disableTelemetry) { ++ this.services.set(ITelemetryService, new TelemetryService({ + appender: combinedAppender( + new AppInsightsAppender('code-server', null, () => new TelemetryClient() as any, logService), + new LogAppender(logService), + ), ++ sendErrorTelemetry: true, + commonProperties: resolveCommonProperties( + product.commit, product.version, await getMachineId(), + [], environmentService.installSourcePath, 'code-server', + ), + piiPaths, -+ } as ITelemetryServiceConfig])); ++ }, configurationService)); + } else { + this.services.set(ITelemetryService, NullTelemetryService); + } @@ -2837,10 +2812,10 @@ index 0000000000..fa47e993b4 + return path.split("/").map((p) => encodeURIComponent(p)).join("/"); +}; diff --git a/src/vs/workbench/api/browser/extensionHost.contribution.ts b/src/vs/workbench/api/browser/extensionHost.contribution.ts -index 3f2de2c738..a967d8df69 100644 +index 3d77009b90..11deb1b99a 100644 --- a/src/vs/workbench/api/browser/extensionHost.contribution.ts +++ b/src/vs/workbench/api/browser/extensionHost.contribution.ts -@@ -59,6 +59,7 @@ import './mainThreadComments'; +@@ -60,6 +60,7 @@ import './mainThreadComments'; import './mainThreadNotebook'; import './mainThreadTask'; import './mainThreadLabelService'; @@ -2849,7 +2824,7 @@ index 3f2de2c738..a967d8df69 100644 import './mainThreadAuthentication'; import './mainThreadTimeline'; diff --git a/src/vs/workbench/api/common/extHost.api.impl.ts b/src/vs/workbench/api/common/extHost.api.impl.ts -index 260b6468e9..882d3e442f 100644 +index 967b210d0a..2443935f5e 100644 --- a/src/vs/workbench/api/common/extHost.api.impl.ts +++ b/src/vs/workbench/api/common/extHost.api.impl.ts @@ -68,6 +68,7 @@ import { IURITransformerService } from 'vs/workbench/api/common/extHostUriTransf @@ -2867,20 +2842,20 @@ index 260b6468e9..882d3e442f 100644 + const extHostNodeProxy = accessor.get(IExtHostNodeProxy); const extHostTunnelService = accessor.get(IExtHostTunnelService); const extHostApiDeprecation = accessor.get(IExtHostApiDeprecationService); - -@@ -104,6 +106,7 @@ export function createApiFactoryAndRegisterActors(accessor: ServicesAccessor): I + const extHostWindow = accessor.get(IExtHostWindow); +@@ -105,6 +107,7 @@ export function createApiFactoryAndRegisterActors(accessor: ServicesAccessor): I rpcProtocol.set(ExtHostContext.ExtHostConfiguration, extHostConfiguration); rpcProtocol.set(ExtHostContext.ExtHostExtensionService, extensionService); rpcProtocol.set(ExtHostContext.ExtHostStorage, extHostStorage); + rpcProtocol.set(ExtHostContext.ExtHostNodeProxy, extHostNodeProxy); rpcProtocol.set(ExtHostContext.ExtHostTunnelService, extHostTunnelService); + rpcProtocol.set(ExtHostContext.ExtHostWindow, extHostWindow); - // automatically create and register addressable instances diff --git a/src/vs/workbench/api/common/extHost.protocol.ts b/src/vs/workbench/api/common/extHost.protocol.ts -index 7e1233484e..0f36de9496 100644 +index 1b76a15a6c..358728fc2f 100644 --- a/src/vs/workbench/api/common/extHost.protocol.ts +++ b/src/vs/workbench/api/common/extHost.protocol.ts -@@ -748,6 +748,16 @@ export interface MainThreadLabelServiceShape extends IDisposable { +@@ -765,6 +765,16 @@ export interface MainThreadLabelServiceShape extends IDisposable { $unregisterResourceLabelFormatter(handle: number): void; } @@ -2897,7 +2872,7 @@ index 7e1233484e..0f36de9496 100644 export interface MainThreadSearchShape extends IDisposable { $registerFileSearchProvider(handle: number, scheme: string): void; $registerTextSearchProvider(handle: number, scheme: string): void; -@@ -1616,6 +1626,7 @@ export const MainContext = { +@@ -1692,6 +1702,7 @@ export const MainContext = { MainThreadWindow: createMainId('MainThreadWindow'), MainThreadLabelService: createMainId('MainThreadLabelService'), MainThreadNotebook: createMainId('MainThreadNotebook'), @@ -2905,7 +2880,7 @@ index 7e1233484e..0f36de9496 100644 MainThreadTheming: createMainId('MainThreadTheming'), MainThreadTunnelService: createMainId('MainThreadTunnelService'), MainThreadTimeline: createMainId('MainThreadTimeline') -@@ -1654,6 +1665,7 @@ export const ExtHostContext = { +@@ -1730,6 +1741,7 @@ export const ExtHostContext = { ExtHostOutputService: createMainId('ExtHostOutputService'), ExtHosLabelService: createMainId('ExtHostLabelService'), ExtHostNotebook: createMainId('ExtHostNotebook'), @@ -2914,7 +2889,7 @@ index 7e1233484e..0f36de9496 100644 ExtHostTunnelService: createMainId('ExtHostTunnelService'), ExtHostAuthentication: createMainId('ExtHostAuthentication'), diff --git a/src/vs/workbench/api/common/extHostExtensionService.ts b/src/vs/workbench/api/common/extHostExtensionService.ts -index 76ff29d13e..8d60efc289 100644 +index c11e3036ad..f9dd91ca3d 100644 --- a/src/vs/workbench/api/common/extHostExtensionService.ts +++ b/src/vs/workbench/api/common/extHostExtensionService.ts @@ -5,7 +5,7 @@ @@ -2923,8 +2898,8 @@ index 76ff29d13e..8d60efc289 100644 import * as path from 'vs/base/common/path'; -import { originalFSPath, joinPath } from 'vs/base/common/resources'; +import { originalFSPath } from 'vs/base/common/resources'; - import { Barrier } from 'vs/base/common/async'; - import { dispose, toDisposable, DisposableStore } from 'vs/base/common/lifecycle'; + import { Barrier, timeout } from 'vs/base/common/async'; + import { dispose, toDisposable, DisposableStore, Disposable } from 'vs/base/common/lifecycle'; import { TernarySearchTree } from 'vs/base/common/map'; @@ -32,6 +32,7 @@ import { IExtHostInitDataService } from 'vs/workbench/api/common/extHostInitData import { IExtensionStoragePaths } from 'vs/workbench/api/common/extHostStoragePaths'; @@ -2933,8 +2908,8 @@ index 76ff29d13e..8d60efc289 100644 +import { IExtHostNodeProxy } from 'vs/server/browser/extHostNodeProxy'; import { IExtHostTunnelService } from 'vs/workbench/api/common/extHostTunnelService'; import { IExtHostTerminalService } from 'vs/workbench/api/common/extHostTerminalService'; - -@@ -78,6 +79,7 @@ export abstract class AbstractExtHostExtensionService implements ExtHostExtensio + import { Emitter, Event } from 'vs/base/common/event'; +@@ -82,6 +83,7 @@ export abstract class AbstractExtHostExtensionService extends Disposable impleme protected readonly _extHostWorkspace: ExtHostWorkspace; protected readonly _extHostConfiguration: ExtHostConfiguration; protected readonly _logService: ILogService; @@ -2942,7 +2917,7 @@ index 76ff29d13e..8d60efc289 100644 protected readonly _extHostTunnelService: IExtHostTunnelService; protected readonly _extHostTerminalService: IExtHostTerminalService; -@@ -109,6 +111,7 @@ export abstract class AbstractExtHostExtensionService implements ExtHostExtensio +@@ -114,6 +116,7 @@ export abstract class AbstractExtHostExtensionService extends Disposable impleme @ILogService logService: ILogService, @IExtHostInitDataService initData: IExtHostInitDataService, @IExtensionStoragePaths storagePath: IExtensionStoragePaths, @@ -2950,7 +2925,7 @@ index 76ff29d13e..8d60efc289 100644 @IExtHostTunnelService extHostTunnelService: IExtHostTunnelService, @IExtHostTerminalService extHostTerminalService: IExtHostTerminalService ) { -@@ -119,6 +122,7 @@ export abstract class AbstractExtHostExtensionService implements ExtHostExtensio +@@ -125,6 +128,7 @@ export abstract class AbstractExtHostExtensionService extends Disposable impleme this._extHostWorkspace = extHostWorkspace; this._extHostConfiguration = extHostConfiguration; this._logService = logService; @@ -2958,7 +2933,7 @@ index 76ff29d13e..8d60efc289 100644 this._extHostTunnelService = extHostTunnelService; this._extHostTerminalService = extHostTerminalService; this._disposables = new DisposableStore(); -@@ -345,14 +349,14 @@ export abstract class AbstractExtHostExtensionService implements ExtHostExtensio +@@ -356,14 +360,14 @@ export abstract class AbstractExtHostExtensionService extends Disposable impleme const activationTimesBuilder = new ExtensionActivationTimesBuilder(reason.startup); return Promise.all([ @@ -2976,10 +2951,10 @@ index 76ff29d13e..8d60efc289 100644 private _loadExtensionContext(extensionDescription: IExtensionDescription): Promise { diff --git a/src/vs/workbench/api/node/extHost.services.ts b/src/vs/workbench/api/node/extHost.services.ts -index 72ad75d63e..2dbc4a76d9 100644 +index a6c0079600..ee31d4b8e7 100644 --- a/src/vs/workbench/api/node/extHost.services.ts +++ b/src/vs/workbench/api/node/extHost.services.ts -@@ -24,11 +24,13 @@ import { IExtensionStoragePaths } from 'vs/workbench/api/common/extHostStoragePa +@@ -24,12 +24,14 @@ import { IExtensionStoragePaths } from 'vs/workbench/api/common/extHostStoragePa import { IExtHostExtensionService } from 'vs/workbench/api/common/extHostExtensionService'; import { ExtHostExtensionService } from 'vs/workbench/api/node/extHostExtensionService'; import { IExtHostStorage, ExtHostStorage } from 'vs/workbench/api/common/extHostStorage'; @@ -2989,11 +2964,12 @@ index 72ad75d63e..2dbc4a76d9 100644 import { IExtHostTunnelService } from 'vs/workbench/api/common/extHostTunnelService'; import { ExtHostTunnelService } from 'vs/workbench/api/node/extHostTunnelService'; import { IExtHostApiDeprecationService, ExtHostApiDeprecationService } from 'vs/workbench/api/common/extHostApiDeprecationService'; + import { IExtHostWindow, ExtHostWindow } from 'vs/workbench/api/common/extHostWindow'; +import { NotImplementedProxy } from 'vs/base/common/types'; // register singleton services registerSingleton(ILogService, ExtHostLogService); -@@ -47,3 +49,4 @@ registerSingleton(IExtensionStoragePaths, ExtensionStoragePaths); +@@ -49,3 +51,4 @@ registerSingleton(IExtensionStoragePaths, ExtensionStoragePaths); registerSingleton(IExtHostExtensionService, ExtHostExtensionService); registerSingleton(IExtHostStorage, ExtHostStorage); registerSingleton(IExtHostTunnelService, ExtHostTunnelService); @@ -3091,11 +3067,11 @@ index afdd6bf398..1633daf93d 100644 return storagePath; diff --git a/src/vs/workbench/api/worker/extHostExtensionService.ts b/src/vs/workbench/api/worker/extHostExtensionService.ts -index 4781f22676..86c9246f51 100644 +index dd8f4e1fe7..0f4a6ad216 100644 --- a/src/vs/workbench/api/worker/extHostExtensionService.ts +++ b/src/vs/workbench/api/worker/extHostExtensionService.ts -@@ -9,6 +9,9 @@ import { AbstractExtHostExtensionService } from 'vs/workbench/api/common/extHost - import { endsWith } from 'vs/base/common/strings'; +@@ -8,6 +8,9 @@ import { ExtensionActivationTimesBuilder } from 'vs/workbench/api/common/extHost + import { AbstractExtHostExtensionService } from 'vs/workbench/api/common/extHostExtensionService'; import { URI } from 'vs/base/common/uri'; import { RequireInterceptor } from 'vs/workbench/api/common/extHostRequireInterceptor'; +import { joinPath } from 'vs/base/common/resources'; @@ -3104,7 +3080,7 @@ index 4781f22676..86c9246f51 100644 class WorkerRequireInterceptor extends RequireInterceptor { -@@ -41,7 +44,14 @@ export class ExtHostExtensionService extends AbstractExtHostExtensionService { +@@ -40,7 +43,14 @@ export class ExtHostExtensionService extends AbstractExtHostExtensionService { await this._fakeModules.install(); } @@ -3130,18 +3106,18 @@ index 4781f22676..86c9246f51 100644 throw new Error(`Cannot load module '${request}'`); } diff --git a/src/vs/workbench/browser/web.main.ts b/src/vs/workbench/browser/web.main.ts -index d840a20ceb..a9ddc3a0cd 100644 +index 7eba37aa9f..1824a7c8fc 100644 --- a/src/vs/workbench/browser/web.main.ts +++ b/src/vs/workbench/browser/web.main.ts -@@ -48,6 +48,7 @@ import { IndexedDBLogProvider } from 'vs/workbench/services/log/browser/indexedD - import { InMemoryLogProvider } from 'vs/workbench/services/log/common/inMemoryLogProvider'; +@@ -45,6 +45,7 @@ import { FileLogService } from 'vs/platform/log/common/fileLogService'; + import { toLocalISOString } from 'vs/base/common/date'; import { isWorkspaceToOpen, isFolderToOpen } from 'vs/platform/windows/common/windows'; import { getWorkspaceIdentifier } from 'vs/workbench/services/workspaces/browser/workspaces'; +import { initialize } from 'vs/server/browser/client'; import { coalesce } from 'vs/base/common/arrays'; import { InMemoryFileSystemProvider } from 'vs/platform/files/common/inMemoryFilesystemProvider'; import { WebResourceIdentityService, IResourceIdentityService } from 'vs/platform/resource/common/resourceIdentityService'; -@@ -95,6 +96,8 @@ class BrowserMain extends Disposable { +@@ -84,6 +85,8 @@ class BrowserMain extends Disposable { // Startup const instantiationService = workbench.startup(); @@ -3172,41 +3148,27 @@ index 2a7844da48..2812092983 100644 this._filenameKey.set(value ? basename(value) : null); this._langIdKey.set(value ? this._modeService.getModeIdByFilepathOrFirstLine(value) : null); this._extensionKey.set(value ? extname(value) : null); -diff --git a/src/vs/workbench/contrib/scm/browser/media/scmViewlet.css b/src/vs/workbench/contrib/scm/browser/media/scmViewlet.css -index 5ea3fd924b..de61b7fd17 100644 ---- a/src/vs/workbench/contrib/scm/browser/media/scmViewlet.css -+++ b/src/vs/workbench/contrib/scm/browser/media/scmViewlet.css -@@ -120,9 +120,11 @@ +diff --git a/src/vs/workbench/contrib/scm/browser/media/scm.css b/src/vs/workbench/contrib/scm/browser/media/scm.css +index 867f31d6f1..ecd510216f 100644 +--- a/src/vs/workbench/contrib/scm/browser/media/scm.css ++++ b/src/vs/workbench/contrib/scm/browser/media/scm.css +@@ -135,9 +135,11 @@ margin-right: 8px; } --.scm-viewlet .monaco-list .monaco-list-row .resource > .name > .monaco-icon-label > .actions { +-.scm-view .monaco-list .monaco-list-row .resource > .name > .monaco-icon-label > .actions { - flex-grow: 100; -} +/* NOTE@coder: Causes the label to shrink to zero width in Firefox due to + * overflow:hidden. This isn't right anyway, as far as I can tell. */ -+/* .scm-viewlet .monaco-list .monaco-list-row .resource > .name > .monaco-icon-label > .actions { */ ++/* .scm-view .monaco-list .monaco-list-row .resource > .name > .monaco-icon-label > .actions { */ +/* flex-grow: 100; */ +/* } */ - .scm-viewlet .monaco-list .monaco-list-row .resource-group > .actions, - .scm-viewlet .monaco-list .monaco-list-row .resource > .name > .monaco-icon-label > .actions { -diff --git a/src/vs/workbench/contrib/webview/browser/pre/main.js b/src/vs/workbench/contrib/webview/browser/pre/main.js -index e21d86575c..22aa99c0f8 100644 ---- a/src/vs/workbench/contrib/webview/browser/pre/main.js -+++ b/src/vs/workbench/contrib/webview/browser/pre/main.js -@@ -351,7 +351,8 @@ - if (data.endpoint) { - try { - const endpointUrl = new URL(data.endpoint); -- csp.setAttribute('content', csp.getAttribute('content').replace(/vscode-resource:(?=(\s|;|$))/g, endpointUrl.origin)); -+ // NOTE@coder: Add back the trailing slash so it'll work for sub-paths. -+ csp.setAttribute('content', csp.getAttribute('content').replace(/vscode-resource:(?=(\s|;|$))/g, endpointUrl.origin + "/")); - } catch (e) { - console.error('Could not rewrite csp'); - } + .scm-view .monaco-list .monaco-list-row .resource-group > .actions, + .scm-view .monaco-list .monaco-list-row .resource > .name > .monaco-icon-label > .actions { diff --git a/src/vs/workbench/services/dialogs/browser/dialogService.ts b/src/vs/workbench/services/dialogs/browser/dialogService.ts -index 6b42535bff..88b7e3c3ea 100644 +index bf9a892d41..5f0d720dca 100644 --- a/src/vs/workbench/services/dialogs/browser/dialogService.ts +++ b/src/vs/workbench/services/dialogs/browser/dialogService.ts @@ -124,11 +124,12 @@ export class DialogService implements IDialogService { @@ -3225,18 +3187,18 @@ index 6b42535bff..88b7e3c3ea 100644 }; diff --git a/src/vs/workbench/services/environment/browser/environmentService.ts b/src/vs/workbench/services/environment/browser/environmentService.ts -index 7ed6e9e21a..223fa72662 100644 +index 9369ad3a7d..b32102c84f 100644 --- a/src/vs/workbench/services/environment/browser/environmentService.ts +++ b/src/vs/workbench/services/environment/browser/environmentService.ts -@@ -14,6 +14,7 @@ import { IWorkbenchConstructionOptions } from 'vs/workbench/workbench.web.api'; - import product from 'vs/platform/product/common/product'; - import { memoize } from 'vs/base/common/decorators'; +@@ -16,6 +16,7 @@ import { memoize } from 'vs/base/common/decorators'; import { onUnexpectedError } from 'vs/base/common/errors'; + import { LIGHT } from 'vs/platform/theme/common/themeService'; + import { parseLineAndColumnAware } from 'vs/base/common/extpath'; +import * as paths from 'vs/base/common/path'; export class BrowserEnvironmentConfiguration implements IEnvironmentConfiguration { -@@ -205,6 +206,20 @@ export class BrowserWorkbenchEnvironmentService implements IWorkbenchEnvironment +@@ -224,6 +225,20 @@ export class BrowserWorkbenchEnvironmentService implements IWorkbenchEnvironment return this.webviewExternalEndpoint.replace('{{uuid}}', '*'); } @@ -3258,10 +3220,10 @@ index 7ed6e9e21a..223fa72662 100644 get verbose(): boolean { return this.payload?.get('verbose') === 'true'; } diff --git a/src/vs/workbench/services/extensionManagement/common/extensionEnablementService.ts b/src/vs/workbench/services/extensionManagement/common/extensionEnablementService.ts -index cfac383e8a..c535d38296 100644 +index c28b147740..6090200d9c 100644 --- a/src/vs/workbench/services/extensionManagement/common/extensionEnablementService.ts +++ b/src/vs/workbench/services/extensionManagement/common/extensionEnablementService.ts -@@ -153,7 +153,7 @@ export class ExtensionEnablementService extends Disposable implements IWorkbench +@@ -163,7 +163,7 @@ export class ExtensionEnablementService extends Disposable implements IWorkbench } } } @@ -3271,45 +3233,26 @@ index cfac383e8a..c535d38296 100644 return false; } diff --git a/src/vs/workbench/services/extensionManagement/common/extensionManagementService.ts b/src/vs/workbench/services/extensionManagement/common/extensionManagementService.ts -index 9f8c6ac6f5..69b5f36203 100644 +index 5a79d9e39a..ad5bd9674b 100644 --- a/src/vs/workbench/services/extensionManagement/common/extensionManagementService.ts +++ b/src/vs/workbench/services/extensionManagement/common/extensionManagementService.ts -@@ -5,7 +5,7 @@ - - import { Event, EventMultiplexer } from 'vs/base/common/event'; - import { -- IExtensionManagementService, ILocalExtension, IGalleryExtension, InstallExtensionEvent, DidInstallExtensionEvent, IExtensionIdentifier, DidUninstallExtensionEvent, IReportedExtension, IGalleryMetadata, IExtensionGalleryService, INSTALL_ERROR_NOT_SUPPORTED -+ IExtensionManagementService, ILocalExtension, IGalleryExtension, InstallExtensionEvent, DidInstallExtensionEvent, IExtensionIdentifier, DidUninstallExtensionEvent, IReportedExtension, IGalleryMetadata, IExtensionGalleryService - } from 'vs/platform/extensionManagement/common/extensionManagement'; - import { IExtensionManagementServer, IExtensionManagementServerService } from 'vs/workbench/services/extensionManagement/common/extensionManagement'; - import { ExtensionType, isLanguagePackExtension, IExtensionManifest } from 'vs/platform/extensions/common/extensions'; -@@ -15,7 +15,7 @@ import { IConfigurationService } from 'vs/platform/configuration/common/configur - import { CancellationToken } from 'vs/base/common/cancellation'; - import { areSameExtensions } from 'vs/platform/extensionManagement/common/extensionManagementUtil'; - import { localize } from 'vs/nls'; --import { prefersExecuteOnUI, canExecuteOnWorkspace } from 'vs/workbench/services/extensions/common/extensionsUtil'; -+import { prefersExecuteOnUI } from 'vs/workbench/services/extensions/common/extensionsUtil'; - import { IProductService } from 'vs/platform/product/common/productService'; - import { Schemas } from 'vs/base/common/network'; - import { IDownloadService } from 'vs/platform/download/common/download'; -@@ -208,11 +208,7 @@ export class ExtensionManagementService extends Disposable implements IExtension - if (!manifest) { - return Promise.reject(localize('Manifest is not found', "Installing Extension {0} failed: Manifest is not found.", gallery.displayName || gallery.name)); - } -- if (!isLanguagePackExtension(manifest) && !canExecuteOnWorkspace(manifest, this.productService, this.configurationService)) { -- const error = new Error(localize('cannot be installed', "Cannot install '{0}' because this extension has defined that it cannot run on the remote server.", gallery.displayName || gallery.name)); -- error.name = INSTALL_ERROR_NOT_SUPPORTED; -- return Promise.reject(error); -- } -+ // NOTE@coder: Allow extensions of any kind. - return this.extensionManagementServerService.remoteExtensionManagementServer.extensionManagementService.installFromGallery(gallery); +@@ -237,6 +237,11 @@ export class ExtensionManagementService extends Disposable implements IExtension + return this.extensionManagementServerService.webExtensionManagementServer.extensionManagementService.installFromGallery(gallery); } - return Promise.reject('No Servers to Install'); + ++ // NOTE@coder: Fall back to installing on the remote server. ++ if (this.extensionManagementServerService.remoteExtensionManagementServer) { ++ return this.extensionManagementServerService.remoteExtensionManagementServer.extensionManagementService.installFromGallery(gallery); ++ } ++ + if (this.extensionManagementServerService.remoteExtensionManagementServer) { + const error = new Error(localize('cannot be installed', "Cannot install '{0}' because this extension has defined that it cannot run on the remote server.", gallery.displayName || gallery.name)); + error.name = INSTALL_ERROR_NOT_SUPPORTED; diff --git a/src/vs/workbench/services/extensions/browser/extensionService.ts b/src/vs/workbench/services/extensions/browser/extensionService.ts -index 5b6a15e820..0f93c896e2 100644 +index afcf8322e3..ca0d7ed9a8 100644 --- a/src/vs/workbench/services/extensions/browser/extensionService.ts +++ b/src/vs/workbench/services/extensions/browser/extensionService.ts -@@ -119,6 +119,7 @@ export class ExtensionService extends AbstractExtensionService implements IExten +@@ -127,6 +127,7 @@ export class ExtensionService extends AbstractExtensionService implements IExten } else { // remote: only enabled and none-web'ish extension @@ -3317,11 +3260,11 @@ index 5b6a15e820..0f93c896e2 100644 remoteEnv.extensions = remoteEnv.extensions.filter(extension => this._isEnabled(extension) && !canExecuteOnWeb(extension, this._productService, this._configService)); this._checkEnableProposedApi(remoteEnv.extensions); -diff --git a/src/vs/workbench/services/extensions/browser/webWorkerExtensionHostStarter.ts b/src/vs/workbench/services/extensions/browser/webWorkerExtensionHostStarter.ts -index 097a048793..b9f32b032d 100644 ---- a/src/vs/workbench/services/extensions/browser/webWorkerExtensionHostStarter.ts -+++ b/src/vs/workbench/services/extensions/browser/webWorkerExtensionHostStarter.ts -@@ -140,7 +140,7 @@ export class WebWorkerExtensionHostStarter implements IExtensionHostStarter { +diff --git a/src/vs/workbench/services/extensions/browser/webWorkerExtensionHost.ts b/src/vs/workbench/services/extensions/browser/webWorkerExtensionHost.ts +index ad19603078..90df69f4cb 100644 +--- a/src/vs/workbench/services/extensions/browser/webWorkerExtensionHost.ts ++++ b/src/vs/workbench/services/extensions/browser/webWorkerExtensionHost.ts +@@ -152,7 +152,7 @@ export class WebWorkerExtensionHost implements IExtensionHost { appLanguage: platform.language, extensionDevelopmentLocationURI: this._environmentService.extensionDevelopmentLocationURI, extensionTestsLocationURI: this._environmentService.extensionTestsLocationURI, @@ -3331,10 +3274,10 @@ index 097a048793..b9f32b032d 100644 webviewResourceRoot: this._environmentService.webviewResourceRoot, webviewCspSource: this._environmentService.webviewCspSource, diff --git a/src/vs/workbench/services/extensions/common/extensionsUtil.ts b/src/vs/workbench/services/extensions/common/extensionsUtil.ts -index 9e8352ac88..22a2d296f9 100644 +index 93e7069d65..aa9d973b69 100644 --- a/src/vs/workbench/services/extensions/common/extensionsUtil.ts +++ b/src/vs/workbench/services/extensions/common/extensionsUtil.ts -@@ -32,7 +32,8 @@ export function canExecuteOnWorkspace(manifest: IExtensionManifest, productServi +@@ -37,7 +37,8 @@ export function canExecuteOnWorkspace(manifest: IExtensionManifest, productServi export function canExecuteOnWeb(manifest: IExtensionManifest, productService: IProductService, configurationService: IConfigurationService): boolean { const extensionKind = getExtensionKind(manifest, productService, configurationService); @@ -3345,7 +3288,7 @@ index 9e8352ac88..22a2d296f9 100644 export function getExtensionKind(manifest: IExtensionManifest, productService: IProductService, configurationService: IConfigurationService): ExtensionKind[] { diff --git a/src/vs/workbench/services/extensions/node/extensionHostProcessSetup.ts b/src/vs/workbench/services/extensions/node/extensionHostProcessSetup.ts -index 79dd77aeb2..1d93c0f922 100644 +index ae4b2d3122..13d26e73f6 100644 --- a/src/vs/workbench/services/extensions/node/extensionHostProcessSetup.ts +++ b/src/vs/workbench/services/extensions/node/extensionHostProcessSetup.ts @@ -16,7 +16,7 @@ import { IInitData } from 'vs/workbench/api/common/extHost.protocol'; @@ -3402,10 +3345,10 @@ index 79dd77aeb2..1d93c0f922 100644 console.error(e); } diff --git a/src/vs/workbench/services/extensions/worker/extHost.services.ts b/src/vs/workbench/services/extensions/worker/extHost.services.ts -index 100864519d..0785d3391d 100644 +index 564c71149e..900d92afc1 100644 --- a/src/vs/workbench/services/extensions/worker/extHost.services.ts +++ b/src/vs/workbench/services/extensions/worker/extHost.services.ts -@@ -20,9 +20,10 @@ import { IExtHostStorage, ExtHostStorage } from 'vs/workbench/api/common/extHost +@@ -20,10 +20,11 @@ import { IExtHostStorage, ExtHostStorage } from 'vs/workbench/api/common/extHost import { ExtHostExtensionService } from 'vs/workbench/api/worker/extHostExtensionService'; import { ILogService } from 'vs/platform/log/common/log'; import { ExtHostLogService } from 'vs/workbench/api/worker/extHostLogService'; @@ -3413,11 +3356,12 @@ index 100864519d..0785d3391d 100644 +import { ExtensionStoragePaths } from 'vs/workbench/api/node/extHostStoragePaths'; import { IExtHostTunnelService, ExtHostTunnelService } from 'vs/workbench/api/common/extHostTunnelService'; import { IExtHostApiDeprecationService, ExtHostApiDeprecationService, } from 'vs/workbench/api/common/extHostApiDeprecationService'; + import { IExtHostWindow, ExtHostWindow } from 'vs/workbench/api/common/extHostWindow'; -import { NotImplementedProxy } from 'vs/base/common/types'; // register singleton services registerSingleton(ILogService, ExtHostLogService); -@@ -36,9 +37,10 @@ registerSingleton(IExtHostDocumentsAndEditors, ExtHostDocumentsAndEditors); +@@ -38,9 +39,10 @@ registerSingleton(IExtHostDocumentsAndEditors, ExtHostDocumentsAndEditors); registerSingleton(IExtHostStorage, ExtHostStorage); registerSingleton(IExtHostExtensionService, ExtHostExtensionService); registerSingleton(IExtHostSearch, ExtHostSearch); @@ -3447,12 +3391,12 @@ index 79455414c0..a407593b4d 100644 require(['vs/workbench/services/extensions/worker/extensionHostWorker'], () => { }, err => console.error(err)); diff --git a/src/vs/workbench/services/localizations/electron-browser/localizationsService.ts b/src/vs/workbench/services/localizations/electron-browser/localizationsService.ts -index 99394090da..4891e0fece 100644 +index 44999bd842..601b1c5408 100644 --- a/src/vs/workbench/services/localizations/electron-browser/localizationsService.ts +++ b/src/vs/workbench/services/localizations/electron-browser/localizationsService.ts @@ -5,17 +5,17 @@ - import { createChannelSender } from 'vs/base/parts/ipc/node/ipc'; + import { createChannelSender } from 'vs/base/parts/ipc/common/ipc'; import { ILocalizationsService } from 'vs/platform/localizations/common/localizations'; -import { ISharedProcessService } from 'vs/platform/ipc/electron-browser/sharedProcessService'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; @@ -3460,7 +3404,7 @@ index 99394090da..4891e0fece 100644 export class LocalizationsService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; constructor( - @ISharedProcessService sharedProcessService: ISharedProcessService, @@ -3472,10 +3416,10 @@ index 99394090da..4891e0fece 100644 } diff --git a/src/vs/workbench/workbench.web.main.ts b/src/vs/workbench/workbench.web.main.ts -index 2fda5eddd8..721cfdfd3e 100644 +index 153ac595d0..a6eb49c5dd 100644 --- a/src/vs/workbench/workbench.web.main.ts +++ b/src/vs/workbench/workbench.web.main.ts -@@ -34,7 +34,8 @@ import 'vs/workbench/services/textfile/browser/browserTextFileService'; +@@ -35,7 +35,8 @@ import 'vs/workbench/services/textfile/browser/browserTextFileService'; import 'vs/workbench/services/keybinding/browser/keymapService'; import 'vs/workbench/services/extensions/browser/extensionService'; import 'vs/workbench/services/extensionManagement/common/extensionManagementServerService'; @@ -3486,7 +3430,7 @@ index 2fda5eddd8..721cfdfd3e 100644 import 'vs/workbench/services/credentials/browser/credentialsService'; import 'vs/workbench/services/url/browser/urlService'; diff --git a/yarn.lock b/yarn.lock -index 1bc94693ea..afd34e6b80 100644 +index 6bc96e8377..585401f144 100644 --- a/yarn.lock +++ b/yarn.lock @@ -140,6 +140,23 @@ @@ -3513,7 +3457,7 @@ index 1bc94693ea..afd34e6b80 100644 "@electron/get@^1.0.1": version "1.7.2" resolved "https://registry.yarnpkg.com/@electron/get/-/get-1.7.2.tgz#286436a9fb56ff1a1fcdf0e80131fd65f4d1e0fd" -@@ -5410,6 +5427,13 @@ jsprim@^1.2.2: +@@ -5407,6 +5424,13 @@ jsprim@^1.2.2: json-schema "0.2.3" verror "1.10.0" @@ -3527,7 +3471,7 @@ index 1bc94693ea..afd34e6b80 100644 just-debounce@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/just-debounce/-/just-debounce-1.0.0.tgz#87fccfaeffc0b68cd19d55f6722943f929ea35ea" -@@ -6776,6 +6800,11 @@ p-try@^2.0.0: +@@ -6798,6 +6822,11 @@ p-try@^2.0.0: resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.0.0.tgz#85080bb87c64688fa47996fe8f7dfbe8211760b1" integrity sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ== diff --git a/lib/vscode b/lib/vscode index 5763d909d..d5e9aa022 160000 --- a/lib/vscode +++ b/lib/vscode @@ -1 +1 @@ -Subproject commit 5763d909d5f12fe19f215cbfdd29a91c0fa9208a +Subproject commit d5e9aa0227e057a60c82568bf31c04730dc15dcd