diff --git a/scripts/vscode.patch b/scripts/vscode.patch index 7c94e305..f1b3b812 100644 --- a/scripts/vscode.patch +++ b/scripts/vscode.patch @@ -583,20 +583,21 @@ index ede771a03e..bb40fcdd6b 100644 if (!userDataProvider) { const remoteUserDataUri = this.getRemoteUserDataUri(); diff --git a/src/vs/workbench/browser/web.simpleservices.ts b/src/vs/workbench/browser/web.simpleservices.ts -index 25414d8733..a0de828393 100644 +index 25414d8733..20b0ad4a49 100644 --- a/src/vs/workbench/browser/web.simpleservices.ts +++ b/src/vs/workbench/browser/web.simpleservices.ts -@@ -38,6 +38,9 @@ import { IRemoteAgentService } from 'vs/workbench/services/remote/common/remoteA +@@ -38,6 +38,10 @@ import { IRemoteAgentService } from 'vs/workbench/services/remote/common/remoteA import { IExperimentService, IExperiment, ExperimentActionType, ExperimentState } from 'vs/workbench/contrib/experiments/common/experimentService'; import { ExtensionHostDebugChannelClient, ExtensionHostDebugBroadcastChannel } from 'vs/platform/debug/common/extensionHostDebugIpc'; import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; +import { ExtensionManagementChannelClient } from 'vs/platform/extensionManagement/common/extensionManagementIpc'; ++import { withQuery } from 'vs/server/src/client'; +import { IUploadService, UploadService } from 'vs/server/src/upload'; +registerSingleton(IUploadService, UploadService, true); //#region Extension Tips -@@ -131,7 +134,15 @@ export class SimpleExtensionManagementService implements IExtensionManagementSer +@@ -131,7 +135,15 @@ export class SimpleExtensionManagementService implements IExtensionManagementSer } } @@ -613,7 +614,7 @@ index 25414d8733..a0de828393 100644 //#endregion -@@ -251,7 +262,7 @@ export class SimpleUpdateService implements IUpdateService { +@@ -251,7 +263,7 @@ export class SimpleUpdateService implements IUpdateService { } } @@ -622,25 +623,32 @@ index 25414d8733..a0de828393 100644 //#endregion -@@ -491,7 +502,7 @@ export class SimpleWindowService extends Disposable implements IWindowService { +@@ -491,7 +503,11 @@ export class SimpleWindowService extends Disposable implements IWindowService { for (let i = 0; i < _uris.length; i++) { const uri = _uris[i]; if ('folderUri' in uri) { - const newAddress = `${document.location.origin}/?folder=${uri.folderUri.path}${this.workbenchEnvironmentService.configuration.connectionToken ? `&tkn=${this.workbenchEnvironmentService.configuration.connectionToken}` : ''}`; -+ const newAddress = `${window.location}?folder=${uri.folderUri.path}${this.workbenchEnvironmentService.configuration.connectionToken ? `&tkn=${this.workbenchEnvironmentService.configuration.connectionToken}` : ''}`; ++ const newAddress = withQuery(window.location.toString(), { ++ folder: uri.folderUri.path, ++ tkn: this.workbenchEnvironmentService.configuration.connectionToken, ++ workspace: undefined, ++ }); if (openFolderInNewWindow) { window.open(newAddress); } else { -@@ -499,7 +510,7 @@ export class SimpleWindowService extends Disposable implements IWindowService { +@@ -499,7 +515,10 @@ export class SimpleWindowService extends Disposable implements IWindowService { } } if ('workspaceUri' in uri) { - const newAddress = `${document.location.origin}/?workspace=${uri.workspaceUri.path}`; -+ const newAddress = `${window.location}?workspace=${uri.workspaceUri.path}`; ++ const newAddress = withQuery(window.location.toString(), { ++ folder: undefined, ++ workspace: uri.workspaceUri.path, ++ }); if (openFolderInNewWindow) { window.open(newAddress); } else { -@@ -718,6 +729,7 @@ export class SimpleWindowsService implements IWindowsService { +@@ -718,6 +737,7 @@ export class SimpleWindowsService implements IWindowsService { } relaunch(_options: { addArgs?: string[], removeArgs?: string[] }): Promise { diff --git a/src/client.ts b/src/client.ts index 505392d1..fe457a53 100644 --- a/src/client.ts +++ b/src/client.ts @@ -1,3 +1,4 @@ +import { URI } from "vs/base/common/uri"; import { registerSingleton } from "vs/platform/instantiation/common/extensions"; import { ServiceCollection } from "vs/platform/instantiation/common/serviceCollection"; import { ITelemetryService } from "vs/platform/telemetry/common/telemetry"; @@ -39,3 +40,28 @@ export const initialize = async (services: ServiceCollection): Promise => (event as any).vscode = target.vscode; window.dispatchEvent(event); }; + +export interface Query { + [key: string]: string | undefined; +} + +/** + * Return the URL modified with the specified query variables. It's pretty + * stupid so it probably doesn't cover any edge cases. Undefined values will + * unset existing values. Doesn't allow duplicates. + */ +export const withQuery = (url: string, replace: Query): string => { + const uri = URI.parse(url); + const query = { ...replace }; + uri.query.split("&").forEach((kv) => { + const [key, value] = kv.split("=", 2); + if (!(key in query)) { + query[key] = value; + } + }); + return uri.with({ + query: Object.keys(query) + .filter((k) => typeof query[k] !== "undefined") + .map((k) => `${k}=${query[k]}`).join("&"), + }).toString(true); +};