Created
October 9, 2020 10:40
-
-
Save onilton/2b57c363e4e92ef44bc62bfacc0a2d2e to your computer and use it in GitHub Desktop.
Fix open file link in markdown in code-server https://github.com/cdr/code-server/issues/996
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
diff --git a/.gitignore b/.gitignore | |
index e73dd4d9e8..e3192b3a0d 100644 | |
--- a/.gitignore | |
+++ b/.gitignore | |
@@ -24,7 +24,6 @@ out-vscode-reh-web-min/ | |
out-vscode-reh-web-pkg/ | |
out-vscode-web/ | |
out-vscode-web-min/ | |
-src/vs/server | |
resources/server | |
build/node_modules | |
coverage/ | |
diff --git a/extensions/markdown-language-features/src/markdownEngine.ts b/extensions/markdown-language-features/src/markdownEngine.ts | |
index 33cb220b44..ebc6158a3b 100644 | |
--- a/extensions/markdown-language-features/src/markdownEngine.ts | |
+++ b/extensions/markdown-language-features/src/markdownEngine.ts | |
@@ -256,7 +256,11 @@ export class MarkdownEngine { | |
fragment: this.slugifier.fromHeading(uri.fragment).value | |
}); | |
} | |
- return normalizeLink(uri.toString(true).replace(/^markdown-link:/, '')); | |
+ console.log("UUUUUUUUUUUUUUUUUUUUuri"); | |
+ console.log(uri); | |
+ console.log(uri.toString(true).replace(/^markdown-link:/, 'command:workbench.action.files.openFile:')); | |
+ console.log(normalizeLink(uri.toString(true).replace(/^markdown-link:/, 'command:workbench.action.files.openFile:'))); | |
+ return normalizeLink(uri.toString(true).replace(/^markdown-link:/, 'file:')); | |
} | |
} catch (e) { | |
// noop | |
@@ -310,9 +314,18 @@ export class MarkdownEngine { | |
md.renderer.rules.link_open = (tokens: any, idx: number, options: any, env: any, self: any) => { | |
const token = tokens[idx]; | |
const hrefIndex = token.attrIndex('href'); | |
+ console.log(tokens); | |
if (hrefIndex >= 0) { | |
- const href = token.attrs[hrefIndex][1]; | |
- token.attrPush(['data-href', href]); | |
+ const href: string = token.attrs[hrefIndex][1]; | |
+ console.log(href); | |
+ if (href.startsWith("file:")) { | |
+ console.log("FILE!!!!"); | |
+ token.attrs[hrefIndex][1] = "command:workbench.action.files.openFile"; | |
+ token.attrPush(['data-href', href.replace(/^file:/, '')]); | |
+ token.attrPush(['title', href.replace(/^file:/, '')]); | |
+ } else { | |
+ token.attrPush(['data-href', href]); | |
+ } | |
} | |
return old_render(tokens, idx, options, env, self); | |
}; | |
diff --git a/extensions/vscode-api-tests/package.json b/extensions/vscode-api-tests/package.json | |
index 8ac6b2806c..8562a284db 100644 | |
--- a/extensions/vscode-api-tests/package.json | |
+++ b/extensions/vscode-api-tests/package.json | |
@@ -121,7 +121,7 @@ | |
"@types/node": "^12.11.7", | |
"mocha-junit-reporter": "^1.17.0", | |
"mocha-multi-reporters": "^1.1.7", | |
- "typescript": "^1.6.2", | |
+ "typescript": "3.7.2", | |
"vscode": "1.1.5" | |
} | |
} | |
diff --git a/extensions/vscode-api-tests/yarn.lock b/extensions/vscode-api-tests/yarn.lock | |
index 2d8b725ff2..a8d93a17ca 100644 | |
--- a/extensions/vscode-api-tests/yarn.lock | |
+++ b/extensions/vscode-api-tests/yarn.lock | |
@@ -1855,10 +1855,10 @@ tweetnacl@^0.14.3, tweetnacl@~0.14.0: | |
resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" | |
integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= | |
-typescript@^1.6.2: | |
- version "1.8.10" | |
- resolved "https://registry.yarnpkg.com/typescript/-/typescript-1.8.10.tgz#b475d6e0dff0bf50f296e5ca6ef9fbb5c7320f1e" | |
- integrity sha1-tHXW4N/wv1DyluXKbvn7tccyDx4= | |
[email protected]: | |
+ version "3.7.2" | |
+ resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.7.2.tgz#27e489b95fa5909445e9fef5ee48d81697ad18fb" | |
+ integrity sha512-ml7V7JfiN2Xwvcer+XAf2csGO1bPBdRbFCkYBczNZggrBZ9c7G3riSUeJmqEU5uOtXNPMhE3n+R4FA/3YOAWOQ== | |
unique-stream@^2.0.2: | |
version "2.2.1" | |
diff --git a/package.json b/package.json | |
index 6e9b9dc0a0..49b14e536a 100644 | |
--- a/package.json | |
+++ b/package.json | |
@@ -33,6 +33,9 @@ | |
"eslint": "eslint -c .eslintrc.json --rulesdir ./build/lib/eslint --ext .ts --ext .js ./src/vs ./extensions" | |
}, | |
"dependencies": { | |
+ "@coder/logger": "^1.1.12", | |
+ "@coder/node-browser": "^1.0.8", | |
+ "@coder/requirefs": "^1.1.5", | |
"applicationinsights": "1.0.8", | |
"chokidar": "3.2.3", | |
"graceful-fs": "4.2.3", | |
diff --git a/src/vs/base/browser/markdownRenderer.ts b/src/vs/base/browser/markdownRenderer.ts | |
index 64213751cd..441ebe37ec 100644 | |
--- a/src/vs/base/browser/markdownRenderer.ts | |
+++ b/src/vs/base/browser/markdownRenderer.ts | |
@@ -119,7 +119,7 @@ export function renderMarkdown(markdown: IMarkdownString, options: MarkdownRende | |
} | |
}; | |
renderer.paragraph = (text): string => { | |
- return `<p>${markdown.supportThemeIcons ? renderCodicons(text) : text}</p>`; | |
+ return `<p>EEE${markdown.supportThemeIcons ? renderCodicons(text) : text}</p>`; | |
}; | |
if (options.codeBlockRenderer) { | |
@@ -142,7 +142,7 @@ export function renderMarkdown(markdown: IMarkdownString, options: MarkdownRende | |
promise.then(options.codeBlockRenderCallback); | |
} | |
- return `<div class="code" data-code="${id}">${escape(code)}</div>`; | |
+ return `<div class="code" data-code="${id}">AAAA${escape(code)}</div>`; | |
}; | |
} | |
diff --git a/src/vs/base/common/network.ts b/src/vs/base/common/network.ts | |
index a68e020f9f..c31e7befa3 100644 | |
--- a/src/vs/base/common/network.ts | |
+++ b/src/vs/base/common/network.ts | |
@@ -88,16 +88,17 @@ class RemoteAuthoritiesImpl { | |
if (host && host.indexOf(':') !== -1) { | |
host = `[${host}]`; | |
} | |
- const port = this._ports[authority]; | |
+ // const port = this._ports[authority]; | |
const connectionToken = this._connectionTokens[authority]; | |
let query = `path=${encodeURIComponent(uri.path)}`; | |
if (typeof connectionToken === 'string') { | |
query += `&tkn=${encodeURIComponent(connectionToken)}`; | |
} | |
+ // NOTE@coder: Changed this to work against the current path. | |
return URI.from({ | |
scheme: platform.isWeb ? this._preferredWebSchema : Schemas.vscodeRemoteResource, | |
- authority: `${host}:${port}`, | |
- path: `/vscode-remote-resource`, | |
+ authority: window.location.host, | |
+ path: `${window.location.pathname.replace(/\/+$/, '')}/vscode-remote-resource`, | |
query | |
}); | |
} | |
diff --git a/src/vs/base/common/platform.ts b/src/vs/base/common/platform.ts | |
index 5a631e0b39..4114bd9287 100644 | |
--- a/src/vs/base/common/platform.ts | |
+++ b/src/vs/base/common/platform.ts | |
@@ -59,6 +59,17 @@ if (typeof navigator === 'object' && !isElectronRenderer) { | |
_isWeb = true; | |
_locale = navigator.language; | |
_language = _locale; | |
+ // NOTE@coder: Make languages work. | |
+ const el = typeof document !== 'undefined' && document.getElementById('vscode-remote-nls-configuration'); | |
+ const rawNlsConfig = el && el.getAttribute('data-settings'); | |
+ if (rawNlsConfig) { | |
+ try { | |
+ const nlsConfig: NLSConfig = JSON.parse(rawNlsConfig); | |
+ _locale = nlsConfig.locale; | |
+ _translationsConfigFile = nlsConfig._translationsConfigFile; | |
+ _language = nlsConfig.availableLanguages['*'] || LANGUAGE_DEFAULT; | |
+ } catch (error) { /* Oh well. */ } | |
+ } | |
} else if (typeof process === 'object') { | |
_isWindows = (process.platform === 'win32'); | |
_isMacintosh = (process.platform === 'darwin'); | |
diff --git a/src/vs/base/common/processes.ts b/src/vs/base/common/processes.ts | |
index c52f7b3774..08a87fa970 100644 | |
--- a/src/vs/base/common/processes.ts | |
+++ b/src/vs/base/common/processes.ts | |
@@ -110,7 +110,8 @@ export function sanitizeProcessEnvironment(env: IProcessEnvironment, ...preserve | |
/^ELECTRON_.+$/, | |
/^GOOGLE_API_KEY$/, | |
/^VSCODE_.+$/, | |
- /^SNAP(|_.*)$/ | |
+ /^SNAP(|_.*)$/, | |
+ /^CODE_SERVER_.+$/, | |
]; | |
const envKeys = Object.keys(env); | |
envKeys | |
diff --git a/src/vs/base/node/languagePacks.js b/src/vs/base/node/languagePacks.js | |
index 2c64061da7..c0ef8faedd 100644 | |
--- a/src/vs/base/node/languagePacks.js | |
+++ b/src/vs/base/node/languagePacks.js | |
@@ -128,7 +128,10 @@ function factory(nodeRequire, path, fs, perf) { | |
function getLanguagePackConfigurations(userDataPath) { | |
const configFile = path.join(userDataPath, 'languagepacks.json'); | |
try { | |
- return nodeRequire(configFile); | |
+ // NOTE@coder: Swapped require with readFile since require is cached and | |
+ // we don't restart the server-side portion of code-server when the | |
+ // language changes. | |
+ return JSON.parse(fs.readFileSync(configFile, "utf8")); | |
} catch (err) { | |
// 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 45f6f17ce0..79fde0b92c 100644 | |
--- a/src/vs/code/browser/workbench/workbench.ts | |
+++ b/src/vs/code/browser/workbench/workbench.ts | |
@@ -246,12 +246,18 @@ class WorkspaceProvider implements IWorkspaceProvider { | |
// Folder | |
else if (isFolderToOpen(workspace)) { | |
- targetHref = `${document.location.origin}${document.location.pathname}?${WorkspaceProvider.QUERY_PARAM_FOLDER}=${encodeURIComponent(workspace.folderUri.toString())}`; | |
+ const target = workspace.folderUri.scheme === Schemas.vscodeRemote | |
+ ? encodeURIComponent(workspace.folderUri.path).replace(/%2F/g, "/") | |
+ : encodeURIComponent(workspace.folderUri.toString()); | |
+ targetHref = `${document.location.origin}${document.location.pathname}?${WorkspaceProvider.QUERY_PARAM_FOLDER}=${target}`; | |
} | |
// Workspace | |
else if (isWorkspaceToOpen(workspace)) { | |
- targetHref = `${document.location.origin}${document.location.pathname}?${WorkspaceProvider.QUERY_PARAM_WORKSPACE}=${encodeURIComponent(workspace.workspaceUri.toString())}`; | |
+ const target = workspace.workspaceUri.scheme === Schemas.vscodeRemote | |
+ ? encodeURIComponent(workspace.workspaceUri.path).replace(/%2F/g, "/") | |
+ : encodeURIComponent(workspace.workspaceUri.toString()); | |
+ targetHref = `${document.location.origin}${document.location.pathname}?${WorkspaceProvider.QUERY_PARAM_WORKSPACE}=${target}`; | |
} | |
// Append payload if any | |
@@ -302,35 +308,6 @@ class WorkspaceProvider implements IWorkspaceProvider { | |
let workspace: IWorkspace; | |
let payload = Object.create(null); | |
- const query = new URL(document.location.href).searchParams; | |
- query.forEach((value, key) => { | |
- switch (key) { | |
- | |
- // Folder | |
- case WorkspaceProvider.QUERY_PARAM_FOLDER: | |
- workspace = { folderUri: URI.parse(value) }; | |
- foundWorkspace = true; | |
- break; | |
- | |
- // Workspace | |
- case WorkspaceProvider.QUERY_PARAM_WORKSPACE: | |
- workspace = { workspaceUri: URI.parse(value) }; | |
- foundWorkspace = true; | |
- break; | |
- | |
- // Empty | |
- case WorkspaceProvider.QUERY_PARAM_EMPTY_WINDOW: | |
- workspace = undefined; | |
- foundWorkspace = true; | |
- break; | |
- | |
- // Payload | |
- case WorkspaceProvider.QUERY_PARAM_PAYLOAD: | |
- payload = JSON.parse(value); | |
- break; | |
- } | |
- }); | |
- | |
// If no workspace is provided through the URL, check for config attribute from server | |
if (!foundWorkspace) { | |
if (config.folderUri) { | |
diff --git a/src/vs/platform/environment/common/environment.ts b/src/vs/platform/environment/common/environment.ts | |
index abd1e33b18..bf75952ce1 100644 | |
--- a/src/vs/platform/environment/common/environment.ts | |
+++ b/src/vs/platform/environment/common/environment.ts | |
@@ -37,6 +37,8 @@ export interface ParsedArgs { | |
logExtensionHostCommunication?: boolean; | |
'extensions-dir'?: string; | |
'builtin-extensions-dir'?: string; | |
+ 'extra-extensions-dir'?: string[]; | |
+ 'extra-builtin-extensions-dir'?: string[]; | |
extensionDevelopmentPath?: string[]; // // undefined or array of 1 or more local paths or URIs | |
extensionTestsPath?: string; // either a local path or a URI | |
'extension-development-confirm-save'?: boolean; | |
@@ -147,6 +149,8 @@ export interface IEnvironmentService extends IUserHomeProvider { | |
disableExtensions: boolean | string[]; | |
builtinExtensionsPath: string; | |
extensionsPath?: string; | |
+ extraExtensionPaths: string[]; | |
+ extraBuiltinExtensionPaths: string[]; | |
extensionDevelopmentLocationURI?: URI[]; | |
extensionTestsLocationURI?: URI; | |
logExtensionHostCommunication?: boolean; | |
diff --git a/src/vs/platform/environment/node/argv.ts b/src/vs/platform/environment/node/argv.ts | |
index e68e0647c3..49a5aae2fa 100644 | |
--- a/src/vs/platform/environment/node/argv.ts | |
+++ b/src/vs/platform/environment/node/argv.ts | |
@@ -55,6 +55,8 @@ export const OPTIONS: OptionDescriptions<Required<ParsedArgs>> = { | |
'extensions-dir': { type: 'string', deprecates: 'extensionHomePath', cat: 'e', args: 'dir', description: localize('extensionHomePath', "Set the root path for extensions.") }, | |
'builtin-extensions-dir': { type: 'string' }, | |
+ 'extra-builtin-extensions-dir': { type: 'string[]', cat: 'o', description: 'Path to an extra builtin extension directory.' }, | |
+ 'extra-extensions-dir': { type: 'string[]', cat: 'o', description: 'Path to an extra user extension directory.' }, | |
'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.") }, | |
@@ -310,4 +312,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 15b5c20cbb..a95f1cd7b5 100644 | |
--- a/src/vs/platform/environment/node/environmentService.ts | |
+++ b/src/vs/platform/environment/node/environmentService.ts | |
@@ -197,6 +197,13 @@ export class EnvironmentService implements IEnvironmentService { | |
return path.join(this.userHome, product.dataFolderName, 'extensions'); | |
} | |
+ @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)); | |
+ } | |
+ | |
@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 5b05650591..aa8712d8fb 100644 | |
--- a/src/vs/platform/extensionManagement/node/extensionManagementService.ts | |
+++ b/src/vs/platform/extensionManagement/node/extensionManagementService.ts | |
@@ -743,11 +743,15 @@ export class ExtensionManagementService extends Disposable implements IExtension | |
private scanSystemExtensions(): Promise<ILocalExtension[]> { | |
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; | |
} | |
@@ -769,9 +773,16 @@ export class ExtensionManagementService extends Disposable implements IExtension | |
.then(([systemExtensions, devSystemExtensions]) => [...systemExtensions, ...devSystemExtensions]); | |
} | |
+ private scanAllUserExtensions(folderName: string, type: ExtensionType): Promise<ILocalExtension[]> { | |
+ 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<ILocalExtension[]> { | |
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) { | |
@@ -786,6 +797,12 @@ export class ExtensionManagementService extends Disposable implements IExtension | |
private scanExtensions(root: string, type: ExtensionType): Promise<ILocalExtension[]> { | |
const limiter = new Limiter<any>(10); | |
return pfs.readdir(root) | |
+ .catch((error) => { | |
+ if (error.code !== 'ENOENT') { | |
+ throw error; | |
+ } | |
+ return <string[]>[]; | |
+ }) | |
.then(extensionsFolders => Promise.all<ILocalExtension>(extensionsFolders.map(extensionFolder => limiter.queue(() => this.scanExtension(extensionFolder, root, type))))) | |
.then(extensions => extensions.filter(e => e && e.identifier)); | |
} | |
@@ -824,7 +841,7 @@ export class ExtensionManagementService extends Disposable implements IExtension | |
private async removeUninstalledExtensions(): Promise<void> { | |
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<string> = new Set<string>(); | |
for (const e of extensions) { | |
if (!uninstalled[new ExtensionIdentifierWithVersion(e.identifier, e.manifest.version).key()]) { | |
@@ -843,7 +860,7 @@ export class ExtensionManagementService extends Disposable implements IExtension | |
} | |
private removeOutdatedExtensions(): Promise<void> { | |
- 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/product/common/product.ts b/src/vs/platform/product/common/product.ts | |
index da88376513..5bab4bd49c 100644 | |
--- a/src/vs/platform/product/common/product.ts | |
+++ b/src/vs/platform/product/common/product.ts | |
@@ -27,6 +27,12 @@ if (isWeb) { | |
urlProtocol: 'code-oss' | |
}); | |
} | |
+ // NOTE@coder: Add the ability to inject settings from the server. | |
+ const el = document.getElementById('vscode-remote-product-configuration'); | |
+ const rawProductConfiguration = el && el.getAttribute('data-settings'); | |
+ if (rawProductConfiguration) { | |
+ assign(product, JSON.parse(rawProductConfiguration)); | |
+ } | |
} | |
// Node: AMD loader | |
diff --git a/src/vs/platform/remote/browser/browserSocketFactory.ts b/src/vs/platform/remote/browser/browserSocketFactory.ts | |
index d0f6e6b18a..1966fd297d 100644 | |
--- a/src/vs/platform/remote/browser/browserSocketFactory.ts | |
+++ b/src/vs/platform/remote/browser/browserSocketFactory.ts | |
@@ -205,7 +205,8 @@ export class BrowserSocketFactory implements ISocketFactory { | |
} | |
connect(host: string, port: number, query: string, callback: IConnectCallback): void { | |
- const socket = this._webSocketFactory.create(`ws://${host}:${port}/?${query}&skipWebSocketFrames=false`); | |
+ // NOTE@coder: Modified to work against the current path. | |
+ const socket = this._webSocketFactory.create(`${window.location.protocol === 'https:' ? 'wss' : 'ws'}://${window.location.host}${window.location.pathname}?${query}&skipWebSocketFrames=false`); | |
const errorListener = socket.onError((err) => callback(err, undefined)); | |
socket.onOpen(() => { | |
errorListener.dispose(); | |
@@ -213,6 +214,3 @@ export class BrowserSocketFactory implements ISocketFactory { | |
}); | |
} | |
} | |
- | |
- | |
- | |
diff --git a/src/vs/platform/remote/common/remoteAgentConnection.ts b/src/vs/platform/remote/common/remoteAgentConnection.ts | |
index eab8591492..26668701f7 100644 | |
--- a/src/vs/platform/remote/common/remoteAgentConnection.ts | |
+++ b/src/vs/platform/remote/common/remoteAgentConnection.ts | |
@@ -88,7 +88,7 @@ async function connectToRemoteExtensionHostAgent(options: ISimpleConnectionOptio | |
options.socketFactory.connect( | |
options.host, | |
options.port, | |
- `reconnectionToken=${options.reconnectionToken}&reconnection=${options.reconnectionProtocol ? 'true' : 'false'}`, | |
+ `type=${connectionTypeToString(connectionType)}&reconnectionToken=${options.reconnectionToken}&reconnection=${options.reconnectionProtocol ? 'true' : 'false'}`, | |
(err: any, socket: ISocket | undefined) => { | |
if (err || !socket) { | |
options.logService.error(`${logPrefix} socketFactory.connect() failed. Error:`); | |
diff --git a/src/vs/workbench/api/browser/extensionHost.contribution.ts b/src/vs/workbench/api/browser/extensionHost.contribution.ts | |
index e69aa80159..71a899d37b 100644 | |
--- a/src/vs/workbench/api/browser/extensionHost.contribution.ts | |
+++ b/src/vs/workbench/api/browser/extensionHost.contribution.ts | |
@@ -58,6 +58,7 @@ import './mainThreadWorkspace'; | |
import './mainThreadComments'; | |
import './mainThreadTask'; | |
import './mainThreadLabelService'; | |
+import 'vs/server/browser/mainThreadNodeProxy'; | |
import './mainThreadTunnelService'; | |
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 cb57cc8227..9da59c028e 100644 | |
--- a/src/vs/workbench/api/common/extHost.api.impl.ts | |
+++ b/src/vs/workbench/api/common/extHost.api.impl.ts | |
@@ -67,6 +67,7 @@ import { ILogService } from 'vs/platform/log/common/log'; | |
import { IURITransformerService } from 'vs/workbench/api/common/extHostUriTransformerService'; | |
import { IExtHostRpcService } from 'vs/workbench/api/common/extHostRpcService'; | |
import { IExtHostInitDataService } from 'vs/workbench/api/common/extHostInitDataService'; | |
+import { IExtHostNodeProxy } from 'vs/server/browser/extHostNodeProxy'; | |
import { ExtHostTheming } from 'vs/workbench/api/common/extHostTheming'; | |
import { IExtHostTunnelService } from 'vs/workbench/api/common/extHostTunnelService'; | |
import { IExtHostApiDeprecationService } from 'vs/workbench/api/common/extHostApiDeprecationService'; | |
@@ -91,6 +92,7 @@ export function createApiFactoryAndRegisterActors(accessor: ServicesAccessor): I | |
const rpcProtocol = accessor.get(IExtHostRpcService); | |
const extHostStorage = accessor.get(IExtHostStorage); | |
const extHostLogService = accessor.get(ILogService); | |
+ const extHostNodeProxy = accessor.get(IExtHostNodeProxy); | |
const extHostTunnelService = accessor.get(IExtHostTunnelService); | |
const extHostApiDeprecation = accessor.get(IExtHostApiDeprecationService); | |
@@ -100,6 +102,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); | |
// 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 10f51d2354..8dd34dffa9 100644 | |
--- a/src/vs/workbench/api/common/extHost.protocol.ts | |
+++ b/src/vs/workbench/api/common/extHost.protocol.ts | |
@@ -671,6 +671,16 @@ export interface MainThreadLabelServiceShape extends IDisposable { | |
$unregisterResourceLabelFormatter(handle: number): void; | |
} | |
+export interface MainThreadNodeProxyShape extends IDisposable { | |
+ $send(message: string): void; | |
+} | |
+export interface ExtHostNodeProxyShape { | |
+ $onMessage(message: string): void; | |
+ $onClose(): void; | |
+ $onDown(): void; | |
+ $onUp(): void; | |
+} | |
+ | |
export interface MainThreadSearchShape extends IDisposable { | |
$registerFileSearchProvider(handle: number, scheme: string): void; | |
$registerTextSearchProvider(handle: number, scheme: string): void; | |
@@ -1513,6 +1523,7 @@ export const MainContext = { | |
MainThreadTask: createMainId<MainThreadTaskShape>('MainThreadTask'), | |
MainThreadWindow: createMainId<MainThreadWindowShape>('MainThreadWindow'), | |
MainThreadLabelService: createMainId<MainThreadLabelServiceShape>('MainThreadLabelService'), | |
+ MainThreadNodeProxy: createMainId<MainThreadNodeProxyShape>('MainThreadNodeProxy'), | |
MainThreadTheming: createMainId<MainThreadThemingShape>('MainThreadTheming'), | |
MainThreadTunnelService: createMainId<MainThreadTunnelServiceShape>('MainThreadTunnelService'), | |
MainThreadTimeline: createMainId<MainThreadTimelineShape>('MainThreadTimeline') | |
@@ -1550,6 +1561,7 @@ export const ExtHostContext = { | |
ExtHostUrls: createExtId<ExtHostUrlsShape>('ExtHostUrls'), | |
ExtHostOutputService: createMainId<ExtHostOutputServiceShape>('ExtHostOutputService'), | |
ExtHostLabelService: createMainId<ExtHostLabelServiceShape>('ExtHostLabelService'), | |
+ ExtHostNodeProxy: createMainId<ExtHostNodeProxyShape>('ExtHostNodeProxy'), | |
ExtHostTheming: createMainId<ExtHostThemingShape>('ExtHostTheming'), | |
ExtHostTunnelService: createMainId<ExtHostTunnelServiceShape>('ExtHostTunnelService'), | |
ExtHostAuthentication: createMainId<ExtHostAuthenticationShape>('ExtHostAuthentication'), | |
diff --git a/src/vs/workbench/api/common/extHostExtensionService.ts b/src/vs/workbench/api/common/extHostExtensionService.ts | |
index 197aa88c85..1c337cdc39 100644 | |
--- a/src/vs/workbench/api/common/extHostExtensionService.ts | |
+++ b/src/vs/workbench/api/common/extHostExtensionService.ts | |
@@ -32,6 +32,7 @@ import { IExtHostInitDataService } from 'vs/workbench/api/common/extHostInitData | |
import { IExtensionStoragePaths } from 'vs/workbench/api/common/extHostStoragePaths'; | |
import { IExtHostRpcService } from 'vs/workbench/api/common/extHostRpcService'; | |
import { ServiceCollection } from 'vs/platform/instantiation/common/serviceCollection'; | |
+import { IExtHostNodeProxy } from 'vs/server/browser/extHostNodeProxy'; | |
import { IExtHostTunnelService } from 'vs/workbench/api/common/extHostTunnelService'; | |
interface ITestRunner { | |
@@ -77,6 +78,7 @@ export abstract class AbstractExtHostExtensionService implements ExtHostExtensio | |
protected readonly _extHostWorkspace: ExtHostWorkspace; | |
protected readonly _extHostConfiguration: ExtHostConfiguration; | |
protected readonly _logService: ILogService; | |
+ protected readonly _nodeProxy: IExtHostNodeProxy; | |
protected readonly _extHostTunnelService: IExtHostTunnelService; | |
protected readonly _mainThreadWorkspaceProxy: MainThreadWorkspaceShape; | |
@@ -107,7 +109,8 @@ export abstract class AbstractExtHostExtensionService implements ExtHostExtensio | |
@ILogService logService: ILogService, | |
@IExtHostInitDataService initData: IExtHostInitDataService, | |
@IExtensionStoragePaths storagePath: IExtensionStoragePaths, | |
- @IExtHostTunnelService extHostTunnelService: IExtHostTunnelService | |
+ @IExtHostNodeProxy nodeProxy: IExtHostNodeProxy, | |
+ @IExtHostTunnelService extHostTunnelService: IExtHostTunnelService, | |
) { | |
this._hostUtils = hostUtils; | |
this._extHostContext = extHostContext; | |
@@ -116,6 +119,7 @@ export abstract class AbstractExtHostExtensionService implements ExtHostExtensio | |
this._extHostWorkspace = extHostWorkspace; | |
this._extHostConfiguration = extHostConfiguration; | |
this._logService = logService; | |
+ this._nodeProxy = nodeProxy; | |
this._extHostTunnelService = extHostTunnelService; | |
this._disposables = new DisposableStore(); | |
@@ -341,14 +345,14 @@ export abstract class AbstractExtHostExtensionService implements ExtHostExtensio | |
const activationTimesBuilder = new ExtensionActivationTimesBuilder(reason.startup); | |
return Promise.all([ | |
- this._loadCommonJSModule<IExtensionModule>(joinPath(extensionDescription.extensionLocation, extensionDescription.main), activationTimesBuilder), | |
+ this._loadCommonJSModule<IExtensionModule>(extensionDescription, activationTimesBuilder), | |
this._loadExtensionContext(extensionDescription) | |
]).then(values => { | |
return AbstractExtHostExtensionService._callActivate(this._logService, extensionDescription.identifier, values[0], values[1], activationTimesBuilder); | |
}); | |
} | |
- protected abstract _loadCommonJSModule<T>(module: URI, activationTimesBuilder: ExtensionActivationTimesBuilder): Promise<T>; | |
+ protected abstract _loadCommonJSModule<T>(module: URI | IExtensionDescription, activationTimesBuilder: ExtensionActivationTimesBuilder): Promise<T>; | |
private _loadExtensionContext(extensionDescription: IExtensionDescription): Promise<vscode.ExtensionContext> { | |
diff --git a/src/vs/workbench/api/node/extHost.services.ts b/src/vs/workbench/api/node/extHost.services.ts | |
index 72ad75d63e..07b8a3f20c 100644 | |
--- a/src/vs/workbench/api/node/extHost.services.ts | |
+++ b/src/vs/workbench/api/node/extHost.services.ts | |
@@ -24,6 +24,8 @@ 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'; | |
+import { ServiceIdentifier } from 'vs/platform/instantiation/common/instantiation'; | |
+import { IExtHostNodeProxy } from 'vs/server/browser/extHostNodeProxy'; | |
import { ILogService } from 'vs/platform/log/common/log'; | |
import { ExtHostLogService } from 'vs/workbench/api/node/extHostLogService'; | |
import { IExtHostTunnelService } from 'vs/workbench/api/common/extHostTunnelService'; | |
@@ -47,3 +49,19 @@ registerSingleton(IExtensionStoragePaths, ExtensionStoragePaths); | |
registerSingleton(IExtHostExtensionService, ExtHostExtensionService); | |
registerSingleton(IExtHostStorage, ExtHostStorage); | |
registerSingleton(IExtHostTunnelService, ExtHostTunnelService); | |
+ | |
+function NotImplementedProxy<T>(name: ServiceIdentifier<T>): { new(): T } { | |
+ return <any>class { | |
+ constructor() { | |
+ return new Proxy({}, { | |
+ get(target: any, prop: string | number) { | |
+ if (target[prop]) { | |
+ return target[prop]; | |
+ } | |
+ throw new Error(`Not Implemented: ${name}->${String(prop)}`); | |
+ } | |
+ }); | |
+ } | |
+ }; | |
+} | |
+registerSingleton(IExtHostNodeProxy, class extends NotImplementedProxy(IExtHostNodeProxy) {}); | |
diff --git a/src/vs/workbench/api/node/extHostExtensionService.ts b/src/vs/workbench/api/node/extHostExtensionService.ts | |
index 79189ba670..216f29b587 100644 | |
--- a/src/vs/workbench/api/node/extHostExtensionService.ts | |
+++ b/src/vs/workbench/api/node/extHostExtensionService.ts | |
@@ -13,6 +13,8 @@ import { ExtHostDownloadService } from 'vs/workbench/api/node/extHostDownloadSer | |
import { CLIServer } from 'vs/workbench/api/node/extHostCLIServer'; | |
import { URI } from 'vs/base/common/uri'; | |
import { Schemas } from 'vs/base/common/network'; | |
+import { IExtensionDescription } from 'vs/platform/extensions/common/extensions'; | |
+import { joinPath } from 'vs/base/common/resources'; | |
class NodeModuleRequireInterceptor extends RequireInterceptor { | |
@@ -76,7 +78,10 @@ export class ExtHostExtensionService extends AbstractExtHostExtensionService { | |
}; | |
} | |
- protected _loadCommonJSModule<T>(module: URI, activationTimesBuilder: ExtensionActivationTimesBuilder): Promise<T> { | |
+ protected _loadCommonJSModule<T>(module: URI | IExtensionDescription, activationTimesBuilder: ExtensionActivationTimesBuilder): Promise<T> { | |
+ if (!URI.isUri(module)) { | |
+ module = joinPath(module.extensionLocation, module.main!); | |
+ } | |
if (module.scheme !== Schemas.file) { | |
throw new Error(`Cannot load URI: '${module}', must be of file-scheme`); | |
} | |
diff --git a/src/vs/workbench/api/node/extHostStoragePaths.ts b/src/vs/workbench/api/node/extHostStoragePaths.ts | |
index afdd6bf398..1633daf93d 100644 | |
--- a/src/vs/workbench/api/node/extHostStoragePaths.ts | |
+++ b/src/vs/workbench/api/node/extHostStoragePaths.ts | |
@@ -5,13 +5,14 @@ | |
import * as path from 'vs/base/common/path'; | |
import { URI } from 'vs/base/common/uri'; | |
-import * as pfs from 'vs/base/node/pfs'; | |
-import { IEnvironment, IStaticWorkspaceData } from 'vs/workbench/api/common/extHost.protocol'; | |
+import { IEnvironment, IStaticWorkspaceData, MainContext } from 'vs/workbench/api/common/extHost.protocol'; | |
import { IExtensionDescription } from 'vs/platform/extensions/common/extensions'; | |
import { IExtensionStoragePaths } from 'vs/workbench/api/common/extHostStoragePaths'; | |
import { IExtHostInitDataService } from 'vs/workbench/api/common/extHostInitDataService'; | |
import { withNullAsUndefined } from 'vs/base/common/types'; | |
import { ILogService } from 'vs/platform/log/common/log'; | |
+import { IExtHostRpcService } from '../common/extHostRpcService'; | |
+import { VSBuffer } from 'vs/base/common/buffer'; | |
export class ExtensionStoragePaths implements IExtensionStoragePaths { | |
@@ -26,6 +27,7 @@ export class ExtensionStoragePaths implements IExtensionStoragePaths { | |
constructor( | |
@IExtHostInitDataService initData: IExtHostInitDataService, | |
@ILogService private readonly _logService: ILogService, | |
+ @IExtHostRpcService private readonly _extHostRpc: IExtHostRpcService, | |
) { | |
this._workspace = withNullAsUndefined(initData.workspace); | |
this._environment = initData.environment; | |
@@ -54,21 +56,26 @@ export class ExtensionStoragePaths implements IExtensionStoragePaths { | |
const storageName = this._workspace.id; | |
const storagePath = path.join(this._environment.appSettingsHome.fsPath, 'workspaceStorage', storageName); | |
- const exists = await pfs.dirExists(storagePath); | |
- | |
- if (exists) { | |
+ // NOTE@coder: Use the file system proxy so this will work in the browser. | |
+ const fileSystem = this._extHostRpc.getProxy(MainContext.MainThreadFileSystem); | |
+ try { | |
+ await fileSystem.$stat(URI.file(storagePath)); | |
return storagePath; | |
+ } catch (error) { | |
+ // Doesn't exist. | |
} | |
try { | |
- await pfs.mkdirp(storagePath); | |
- await pfs.writeFile( | |
- path.join(storagePath, 'meta.json'), | |
- JSON.stringify({ | |
- id: this._workspace.id, | |
- configuration: this._workspace.configuration && URI.revive(this._workspace.configuration).toString(), | |
- name: this._workspace.name | |
- }, undefined, 2) | |
+ // NOTE@coder: $writeFile performs a mkdirp. | |
+ await fileSystem.$writeFile( | |
+ URI.file(path.join(storagePath, 'meta.json')), | |
+ VSBuffer.fromString( | |
+ JSON.stringify({ | |
+ id: this._workspace.id, | |
+ configuration: this._workspace.configuration && URI.revive(this._workspace.configuration).toString(), | |
+ name: this._workspace.name | |
+ }, undefined, 2) | |
+ ) | |
); | |
return storagePath; | |
diff --git a/src/vs/workbench/api/worker/extHostExtensionService.ts b/src/vs/workbench/api/worker/extHostExtensionService.ts | |
index 4781f22676..86c9246f51 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'; | |
import { URI } from 'vs/base/common/uri'; | |
import { RequireInterceptor } from 'vs/workbench/api/common/extHostRequireInterceptor'; | |
+import { joinPath } from 'vs/base/common/resources'; | |
+import { IExtensionDescription } from 'vs/platform/extensions/common/extensions'; | |
+import { loadCommonJSModule } from 'vs/server/browser/worker'; | |
class WorkerRequireInterceptor extends RequireInterceptor { | |
@@ -41,7 +44,14 @@ export class ExtHostExtensionService extends AbstractExtHostExtensionService { | |
await this._fakeModules.install(); | |
} | |
- protected async _loadCommonJSModule<T>(module: URI, activationTimesBuilder: ExtensionActivationTimesBuilder): Promise<T> { | |
+ protected async _loadCommonJSModule<T>(module: URI | IExtensionDescription, activationTimesBuilder: ExtensionActivationTimesBuilder): Promise<T> { | |
+ if (!URI.isUri(module) && module.extensionKind !== 'web') { | |
+ return loadCommonJSModule(module, activationTimesBuilder, this._nodeProxy, this._logService, this._fakeModules!.getModule('vscode', module.extensionLocation)); | |
+ } | |
+ | |
+ if (!URI.isUri(module)) { | |
+ module = joinPath(module.extensionLocation, module.main!); | |
+ } | |
module = module.with({ path: ensureSuffix(module.path, '.js') }); | |
const response = await fetch(module.toString(true)); | |
@@ -57,7 +67,7 @@ export class ExtHostExtensionService extends AbstractExtHostExtensionService { | |
const _exports = {}; | |
const _module = { exports: _exports }; | |
const _require = (request: string) => { | |
- const result = this._fakeModules!.getModule(request, module); | |
+ const result = this._fakeModules!.getModule(request, <URI>module); | |
if (result === undefined) { | |
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 8973e3fc36..7e3286bd37 100644 | |
--- a/src/vs/workbench/browser/web.main.ts | |
+++ b/src/vs/workbench/browser/web.main.ts | |
@@ -49,6 +49,7 @@ import { IndexedDBLogProvider } from 'vs/workbench/services/log/browser/indexedD | |
import { InMemoryLogProvider } from 'vs/workbench/services/log/common/inMemoryLogProvider'; | |
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'; | |
@@ -87,6 +88,7 @@ class BrowserMain extends Disposable { | |
// Startup | |
workbench.startup(); | |
+ await initialize(services.serviceCollection); | |
} | |
private registerListeners(workbench: Workbench, storageService: BrowserStorageService): void { | |
diff --git a/src/vs/workbench/common/resources.ts b/src/vs/workbench/common/resources.ts | |
index 597dd5d96f..9041a1e81b 100644 | |
--- a/src/vs/workbench/common/resources.ts | |
+++ b/src/vs/workbench/common/resources.ts | |
@@ -15,6 +15,7 @@ import { ParsedExpression, IExpression, parse } from 'vs/base/common/glob'; | |
import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; | |
import { IConfigurationService, IConfigurationChangeEvent } from 'vs/platform/configuration/common/configuration'; | |
import { withNullAsUndefined } from 'vs/base/common/types'; | |
+import { Schemas } from 'vs/base/common/network'; | |
export class ResourceContextKey extends Disposable implements IContextKey<URI> { | |
@@ -67,7 +68,8 @@ export class ResourceContextKey extends Disposable implements IContextKey<URI> { | |
set(value: URI | null) { | |
if (!ResourceContextKey._uriEquals(this._resourceKey.get(), value)) { | |
this._resourceKey.set(value); | |
- this._schemeKey.set(value ? value.scheme : null); | |
+ // NOTE@coder: Fixes extensions matching against file schemas. | |
+ this._schemeKey.set(value ? (value.scheme === Schemas.vscodeRemote ? Schemas.file : value.scheme) : null); | |
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/webview/browser/pre/main.js b/src/vs/workbench/contrib/webview/browser/pre/main.js | |
index 3fed6a33da..45baca0ad2 100644 | |
--- a/src/vs/workbench/contrib/webview/browser/pre/main.js | |
+++ b/src/vs/workbench/contrib/webview/browser/pre/main.js | |
@@ -346,7 +346,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'); | |
} | |
diff --git a/src/vs/workbench/services/environment/browser/environmentService.ts b/src/vs/workbench/services/environment/browser/environmentService.ts | |
index c94ee4e88c..cce3cf6f13 100644 | |
--- a/src/vs/workbench/services/environment/browser/environmentService.ts | |
+++ b/src/vs/workbench/services/environment/browser/environmentService.ts | |
@@ -195,8 +195,8 @@ export class BrowserWorkbenchEnvironmentService implements IWorkbenchEnvironment | |
@memoize | |
get webviewExternalEndpoint(): string { | |
- // TODO: get fallback from product.json | |
- return (this.options.webviewEndpoint || 'https://{{uuid}}.vscode-webview-test.com/{{commit}}').replace('{{commit}}', product.commit || '0d728c31ebdf03869d2687d9be0b017667c9ff37'); | |
+ // NOTE@coder: Modified to work against the current URL. | |
+ return `${window.location.origin}${window.location.pathname.replace(/\/+$/, '')}/webview/`; | |
} | |
@memoize | |
@@ -249,6 +249,8 @@ export class BrowserWorkbenchEnvironmentService implements IWorkbenchEnvironment | |
installSourcePath!: string; | |
builtinExtensionsPath!: string; | |
+ extraExtensionPaths!: string[]; | |
+ extraBuiltinExtensionPaths!: string[]; | |
globalStorageHome!: string; | |
workspaceStorageHome!: string; | |
diff --git a/src/vs/workbench/services/extensions/browser/extensionService.ts b/src/vs/workbench/services/extensions/browser/extensionService.ts | |
index 5b6a15e820..0f93c896e2 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 | |
} else { | |
// remote: only enabled and none-web'ish extension | |
+ localExtensions.push(...remoteEnv.extensions.filter(extension => this._isEnabled(extension) && canExecuteOnWeb(extension, this._productService, this._configService))); | |
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/common/extensionsUtil.ts b/src/vs/workbench/services/extensions/common/extensionsUtil.ts | |
index 9e8352ac88..22a2d296f9 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 | |
export function canExecuteOnWeb(manifest: IExtensionManifest, productService: IProductService, configurationService: IConfigurationService): boolean { | |
const extensionKind = getExtensionKind(manifest, productService, configurationService); | |
- return extensionKind.some(kind => kind === 'web'); | |
+ // NOTE@coder: Hardcode vim for now. | |
+ return extensionKind.some(kind => kind === 'web') || manifest.name === 'vim'; | |
} | |
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 0f35c54431..32fff09b18 100644 | |
--- a/src/vs/workbench/services/extensions/node/extensionHostProcessSetup.ts | |
+++ b/src/vs/workbench/services/extensions/node/extensionHostProcessSetup.ts | |
@@ -53,12 +53,13 @@ const args = minimist(process.argv.slice(2), { | |
const Module = require.__$__nodeRequire('module') as any; | |
const originalLoad = Module._load; | |
- Module._load = function (request: string) { | |
+ Module._load = function (request: string, parent: object, isMain: boolean) { | |
if (request === 'natives') { | |
throw new Error('Either the extension or a NPM dependency is using the "natives" node module which is unsupported as it can cause a crash of the extension host. Click [here](https://go.microsoft.com/fwlink/?linkid=871887) to find out more'); | |
} | |
- return originalLoad.apply(this, arguments); | |
+ // NOTE@coder: Map node_module.asar requests to regular node_modules. | |
+ return originalLoad.apply(this, [request.replace(/node_modules\.asar(\.unpacked)?/, 'node_modules'), parent, isMain]); | |
}; | |
})(); | |
@@ -131,8 +132,11 @@ function _createExtHostProtocol(): Promise<IMessagePassingProtocol> { | |
// Wait for rich client to reconnect | |
protocol.onSocketClose(() => { | |
- // The socket has closed, let's give the renderer a certain amount of time to reconnect | |
- disconnectRunner1.schedule(); | |
+ // NOTE@coder: Inform the server so we can manage offline | |
+ // connections there instead. Our goal is to persist connections | |
+ // forever (to a reasonable point) to account for things like | |
+ // hibernating overnight. | |
+ process.send!({ type: 'VSCODE_EXTHOST_DISCONNECTED' }); | |
}); | |
} | |
} | |
diff --git a/src/vs/workbench/services/extensions/worker/extHost.services.ts b/src/vs/workbench/services/extensions/worker/extHost.services.ts | |
index 9056862945..0785d3391d 100644 | |
--- a/src/vs/workbench/services/extensions/worker/extHost.services.ts | |
+++ b/src/vs/workbench/services/extensions/worker/extHost.services.ts | |
@@ -18,9 +18,10 @@ import { IExtensionStoragePaths } from 'vs/workbench/api/common/extHostStoragePa | |
import { IExtHostExtensionService } from 'vs/workbench/api/common/extHostExtensionService'; | |
import { IExtHostStorage, ExtHostStorage } from 'vs/workbench/api/common/extHostStorage'; | |
import { ExtHostExtensionService } from 'vs/workbench/api/worker/extHostExtensionService'; | |
-import { ServiceIdentifier } from 'vs/platform/instantiation/common/instantiation'; | |
import { ILogService } from 'vs/platform/log/common/log'; | |
import { ExtHostLogService } from 'vs/workbench/api/worker/extHostLogService'; | |
+import { ExtHostNodeProxy, IExtHostNodeProxy } from 'vs/server/browser/extHostNodeProxy'; | |
+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'; | |
@@ -36,24 +37,10 @@ registerSingleton(IExtHostDocumentsAndEditors, ExtHostDocumentsAndEditors); | |
registerSingleton(IExtHostStorage, ExtHostStorage); | |
registerSingleton(IExtHostExtensionService, ExtHostExtensionService); | |
registerSingleton(IExtHostSearch, ExtHostSearch); | |
+registerSingleton(IExtHostNodeProxy, ExtHostNodeProxy); | |
registerSingleton(IExtHostTunnelService, ExtHostTunnelService); | |
-// register services that only throw errors | |
-function NotImplementedProxy<T>(name: ServiceIdentifier<T>): { new(): T } { | |
- return <any>class { | |
- constructor() { | |
- return new Proxy({}, { | |
- get(target: any, prop: PropertyKey) { | |
- if (target[prop]) { | |
- return target[prop]; | |
- } | |
- throw new Error(`Not Implemented: ${name}->${String(prop)}`); | |
- } | |
- }); | |
- } | |
- }; | |
-} | |
registerSingleton(IExtHostTerminalService, WorkerExtHostTerminalService); | |
registerSingleton(IExtHostTask, WorkerExtHostTask); | |
registerSingleton(IExtHostDebugService, WorkerExtHostDebugService); | |
-registerSingleton(IExtensionStoragePaths, class extends NotImplementedProxy(IExtensionStoragePaths) { whenReady = Promise.resolve(); }); | |
+registerSingleton(IExtensionStoragePaths, ExtensionStoragePaths); | |
diff --git a/src/vs/workbench/services/extensions/worker/extensionHostWorkerMain.ts b/src/vs/workbench/services/extensions/worker/extensionHostWorkerMain.ts | |
index 79455414c0..a407593b4d 100644 | |
--- a/src/vs/workbench/services/extensions/worker/extensionHostWorkerMain.ts | |
+++ b/src/vs/workbench/services/extensions/worker/extensionHostWorkerMain.ts | |
@@ -14,7 +14,11 @@ | |
require.config({ | |
baseUrl: monacoBaseUrl, | |
- catchError: true | |
+ catchError: true, | |
+ paths: { | |
+ '@coder/node-browser': `../node_modules/@coder/node-browser/out/client/client.js`, | |
+ '@coder/requirefs': `../node_modules/@coder/requirefs/out/requirefs.js`, | |
+ } | |
}); | |
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 | |
--- 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 { ILocalizationsService } from 'vs/platform/localizations/common/localizations'; | |
-import { ISharedProcessService } from 'vs/platform/ipc/electron-browser/sharedProcessService'; | |
import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; | |
+import { IRemoteAgentService } from 'vs/workbench/services/remote/common/remoteAgentService'; | |
export class LocalizationsService { | |
_serviceBrand: undefined; | |
constructor( | |
- @ISharedProcessService sharedProcessService: ISharedProcessService, | |
+ @IRemoteAgentService remoteAgentService: IRemoteAgentService, | |
) { | |
- return createChannelSender<ILocalizationsService>(sharedProcessService.getChannel('localizations')); | |
+ return createChannelSender<ILocalizationsService>(remoteAgentService.getConnection()!.getChannel('localizations')); | |
} | |
} | |
diff --git a/src/vs/workbench/workbench.web.main.ts b/src/vs/workbench/workbench.web.main.ts | |
index a73f3a3e53..7c4ce1acb8 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'; | |
import 'vs/workbench/services/keybinding/browser/keymapService'; | |
import 'vs/workbench/services/extensions/browser/extensionService'; | |
import 'vs/workbench/services/extensionManagement/common/extensionManagementServerService'; | |
-import 'vs/workbench/services/telemetry/browser/telemetryService'; | |
+// NOTE@coder: We send it all to the server side to be processed there instead. | |
+// import 'vs/workbench/services/telemetry/browser/telemetryService'; | |
import 'vs/workbench/services/configurationResolver/browser/configurationResolverService'; | |
import 'vs/workbench/services/credentials/browser/credentialsService'; | |
import 'vs/workbench/services/url/browser/urlService'; | |
@@ -119,7 +120,7 @@ import 'vs/workbench/contrib/welcome/telemetryOptOut/browser/telemetryOptOut.con | |
// Issues | |
import 'vs/workbench/contrib/issue/browser/issue.contribution'; | |
-// Open In Desktop | |
-import 'vs/workbench/contrib/openInDesktop/browser/openInDesktop.web.contribution'; | |
+// Open In Desktop NOTE@coder: remove | |
+// import 'vs/workbench/contrib/openInDesktop/browser/openInDesktop.web.contribution'; | |
//#endregion | |
diff --git a/yarn.lock b/yarn.lock | |
index a820c6344a..7e4f410db9 100644 | |
--- a/yarn.lock | |
+++ b/yarn.lock | |
@@ -140,6 +140,23 @@ | |
lodash "^4.17.13" | |
to-fast-properties "^2.0.0" | |
+"@coder/logger@^1.1.12": | |
+ version "1.1.12" | |
+ resolved "https://registry.yarnpkg.com/@coder/logger/-/logger-1.1.12.tgz#def113b7183abc35a8da2b57f0929f7e9626f4e0" | |
+ integrity sha512-oM0j3lTVPqApUm3e0bKKcXpfAiJEys31fgEfQlHmvEA13ujsC4zDuXnt0uzDtph48eMoNRLOF/EE4mNShVJKVw== | |
+ | |
+"@coder/node-browser@^1.0.8": | |
+ version "1.0.8" | |
+ resolved "https://registry.yarnpkg.com/@coder/node-browser/-/node-browser-1.0.8.tgz#c22f581b089ad7d95ad1362fd351c57b7fbc6e70" | |
+ integrity sha512-NLF9sYMRCN9WK1C224pHax1Cay3qKypg25BhVg7VfNbo3Cpa3daata8RF/rT8JK3lPsu8PmFgDRQjzGC9X1Lrw== | |
+ | |
+"@coder/requirefs@^1.1.5": | |
+ version "1.1.5" | |
+ resolved "https://registry.yarnpkg.com/@coder/requirefs/-/requirefs-1.1.5.tgz#259db370d563a79a96fb150bc9d69c7db6edc9fb" | |
+ integrity sha512-3jB47OFCql9+9FI6Vc4YX0cfFnG5rxBfrZUH45S4XYtYGOz+/Xl4h4d2iMk50b7veHkeSWGlB4VHC3UZ16zuYQ== | |
+ optionalDependencies: | |
+ jszip "2.6.0" | |
+ | |
"@electron/get@^1.0.1": | |
version "1.7.2" | |
resolved "https://registry.yarnpkg.com/@electron/get/-/get-1.7.2.tgz#286436a9fb56ff1a1fcdf0e80131fd65f4d1e0fd" | |
@@ -5371,6 +5388,13 @@ jsprim@^1.2.2: | |
json-schema "0.2.3" | |
verror "1.10.0" | |
[email protected]: | |
+ version "2.6.0" | |
+ resolved "https://registry.yarnpkg.com/jszip/-/jszip-2.6.0.tgz#7fb3e9c2f11c8a9840612db5dabbc8cf3a7534b7" | |
+ integrity sha1-f7PpwvEciphAYS212rvIzzp1NLc= | |
+ dependencies: | |
+ pako "~1.0.0" | |
+ | |
just-debounce@^1.0.0: | |
version "1.0.0" | |
resolved "https://registry.yarnpkg.com/just-debounce/-/just-debounce-1.0.0.tgz#87fccfaeffc0b68cd19d55f6722943f929ea35ea" | |
@@ -6729,6 +6753,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== | |
+pako@~1.0.0: | |
+ version "1.0.11" | |
+ resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" | |
+ integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw== | |
+ | |
pako@~1.0.5: | |
version "1.0.6" | |
resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.6.tgz#0101211baa70c4bca4a0f63f2206e97b7dfaf258" |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment