-
Notifications
You must be signed in to change notification settings - Fork 5.7k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
And fix the workspace bug. It is caused by an issue with how some global variables are being used asynchronously and is exacerbated by the delay reading settings from the remote introduces. 1. The workspace is created and is marked as not initialized. 2. The configuration's change handler is triggered, and now initialization is complete. 3. The handler tries to set the global workspace variable to initialized but the workspace has not been set yet so we get an undefined error. 4. The workspace global is now set, but it is set to the old value with initialized still set to false. 5. Workspace is never marked as initialized until something else triggers the on change handler again. Fixes #3061, and closes #6546. My guess is this logic changed in one of the VS Code updates, introducing this async bug but never getting caught probably because for them the settings are always local thus minimal delay.
- Loading branch information
1 parent
9ba66ec
commit 9cde558
Showing
5 changed files
with
106 additions
and
15 deletions.
There are no files selected for viewing
This file contains 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
This file contains 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
This file contains 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
This file contains 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
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,90 @@ | ||
Make storage local to the remote server | ||
|
||
This makes user settings will be stored in the file system instead of in browser | ||
storage. Using browser storage makes sharing or seeding settings between | ||
browsers difficult and remote settings is not a sufficient replacement because | ||
some settings are only allowed to be set on the user level. | ||
|
||
Unfortunately this does not affect state which uses a separate method with | ||
IndexedDB and does not appear nearly as easy to redirect to disk. | ||
|
||
To test change settings from the UI and on disk while making sure they appear on | ||
the other side. | ||
|
||
This patch also resolves a bug where a global value for workspace initialization | ||
is used in a non async-safe way. | ||
|
||
Index: code-server/lib/vscode/src/vs/server/node/webClientServer.ts | ||
=================================================================== | ||
--- code-server.orig/lib/vscode/src/vs/server/node/webClientServer.ts | ||
+++ code-server/lib/vscode/src/vs/server/node/webClientServer.ts | ||
@@ -327,6 +327,7 @@ export class WebClientServer { | ||
const workbenchWebConfiguration = { | ||
remoteAuthority, | ||
webviewEndpoint: vscodeBase + this._staticRoute + '/out/vs/workbench/contrib/webview/browser/pre', | ||
+ userDataPath: this._environmentService.userDataPath, | ||
_wrapWebWorkerExtHostInIframe, | ||
developmentOptions: { enableSmokeTestDriver: this._environmentService.args['enable-smoke-test-driver'] ? true : undefined, logLevel: this._logService.getLevel() }, | ||
settingsSyncOptions: !this._environmentService.isBuilt && this._environmentService.args['enable-sync'] ? { enabled: true } : undefined, | ||
Index: code-server/lib/vscode/src/vs/workbench/browser/web.api.ts | ||
=================================================================== | ||
--- code-server.orig/lib/vscode/src/vs/workbench/browser/web.api.ts | ||
+++ code-server/lib/vscode/src/vs/workbench/browser/web.api.ts | ||
@@ -276,6 +276,11 @@ export interface IWorkbenchConstructionO | ||
*/ | ||
readonly configurationDefaults?: Record<string, any>; | ||
|
||
+ /** | ||
+ * Path to the user data directory. | ||
+ */ | ||
+ readonly userDataPath?: string | ||
+ | ||
//#endregion | ||
|
||
//#region Profile options | ||
Index: code-server/lib/vscode/src/vs/workbench/services/environment/browser/environmentService.ts | ||
=================================================================== | ||
--- code-server.orig/lib/vscode/src/vs/workbench/services/environment/browser/environmentService.ts | ||
+++ code-server/lib/vscode/src/vs/workbench/services/environment/browser/environmentService.ts | ||
@@ -102,7 +102,14 @@ export class BrowserWorkbenchEnvironment | ||
get logFile(): URI { return joinPath(this.windowLogsPath, 'window.log'); } | ||
|
||
@memoize | ||
- get userRoamingDataHome(): URI { return URI.file('/User').with({ scheme: Schemas.vscodeUserData }); } | ||
+ get userRoamingDataHome(): URI { return joinPath(URI.file(this.userDataPath).with({ scheme: Schemas.vscodeRemote }), 'User'); } | ||
+ | ||
+ get userDataPath(): string { | ||
+ if (!this.options.userDataPath) { | ||
+ throw new Error('userDataPath was not provided to the browser'); | ||
+ } | ||
+ return this.options.userDataPath; | ||
+ } | ||
|
||
@memoize | ||
get argvResource(): URI { return joinPath(this.userRoamingDataHome, 'argv.json'); } | ||
Index: code-server/lib/vscode/src/vs/workbench/services/configuration/browser/configurationService.ts | ||
=================================================================== | ||
--- code-server.orig/lib/vscode/src/vs/workbench/services/configuration/browser/configurationService.ts | ||
+++ code-server/lib/vscode/src/vs/workbench/services/configuration/browser/configurationService.ts | ||
@@ -143,8 +143,10 @@ export class WorkspaceService extends Di | ||
this.workspaceConfiguration = this._register(new WorkspaceConfiguration(configurationCache, fileService, uriIdentityService, logService)); | ||
this._register(this.workspaceConfiguration.onDidUpdateConfiguration(fromCache => { | ||
this.onWorkspaceConfigurationChanged(fromCache).then(() => { | ||
- this.workspace.initialized = this.workspaceConfiguration.initialized; | ||
- this.checkAndMarkWorkspaceComplete(fromCache); | ||
+ if (this.workspace) { // The workspace may not have been created yet. | ||
+ this.workspace.initialized = this.workspaceConfiguration.initialized; | ||
+ this.checkAndMarkWorkspaceComplete(fromCache); | ||
+ } | ||
}); | ||
})); | ||
|
||
@@ -438,6 +440,8 @@ export class WorkspaceService extends Di | ||
const trigger = this.initialized; | ||
this.initialized = false; | ||
const workspace = await this.createWorkspace(arg); | ||
+ // The configuration could have updated before the promise resolved. | ||
+ workspace.initialized = this.workspaceConfiguration.initialized; | ||
await this.updateWorkspaceAndInitializeConfiguration(workspace, trigger); | ||
this.checkAndMarkWorkspaceComplete(false); | ||
|
This file contains 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