From da0fa2dc8fc8f5ae6ea878a9c449e0eb930b510d Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Fri, 17 Sep 2021 12:30:07 +0200 Subject: [PATCH] Fix #120940 --- .../common/configurationRegistry.ts | 80 +++++++++++++------ src/vs/platform/request/common/request.ts | 6 +- .../common/terminalPlatformConfiguration.ts | 10 +-- .../parts/editor/editorConfiguration.ts | 14 ++-- .../browser/gettingStarted.contribution.ts | 6 +- 5 files changed, 67 insertions(+), 49 deletions(-) diff --git a/src/vs/platform/configuration/common/configurationRegistry.ts b/src/vs/platform/configuration/common/configurationRegistry.ts index c159c345056..9a8a259e797 100644 --- a/src/vs/platform/configuration/common/configurationRegistry.ts +++ b/src/vs/platform/configuration/common/configurationRegistry.ts @@ -3,6 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ +import { distinct } from 'vs/base/common/arrays'; import { IStringDictionary } from 'vs/base/common/collections'; import { Emitter, Event } from 'vs/base/common/event'; import { IJSONSchema } from 'vs/base/common/jsonSchema'; @@ -37,6 +38,13 @@ export interface IConfigurationRegistry { */ deregisterConfigurations(configurations: IConfigurationNode[]): void; + /** + * update the configuration registry by + * - registering the configurations to add + * - dereigstering the configurations to remove + */ + updateConfigurations(configurations: { add: IConfigurationNode[], remove: IConfigurationNode[] }): void; + /** * Register multiple default configurations to the registry. */ @@ -210,12 +218,7 @@ class ConfigurationRegistry implements IConfigurationRegistry { } public registerConfigurations(configurations: IConfigurationNode[], validate: boolean = true): void { - const properties: string[] = []; - configurations.forEach(configuration => { - properties.push(...this.validateAndRegisterProperties(configuration, validate, configuration.extensionInfo)); // fills in defaults - this.configurationContributors.push(configuration); - this.registerJSONConfiguration(configuration); - }); + const properties = this.doRegisterConfigurations(configurations, validate); contributionRegistry.registerSchema(resourceLanguageSettingsSchemaId, this.resourceLanguageSettingsSchema); this._onDidSchemaChange.fire(); @@ -223,32 +226,23 @@ class ConfigurationRegistry implements IConfigurationRegistry { } public deregisterConfigurations(configurations: IConfigurationNode[]): void { - const properties: string[] = []; - const deregisterConfiguration = (configuration: IConfigurationNode) => { - if (configuration.properties) { - for (const key in configuration.properties) { - properties.push(key); - delete this.configurationProperties[key]; - this.removeFromSchema(key, configuration.properties[key]); - } - } - if (configuration.allOf) { - configuration.allOf.forEach(node => deregisterConfiguration(node)); - } - }; - for (const configuration of configurations) { - deregisterConfiguration(configuration); - const index = this.configurationContributors.indexOf(configuration); - if (index !== -1) { - this.configurationContributors.splice(index, 1); - } - } + const properties = this.doDeregisterConfigurations(configurations); contributionRegistry.registerSchema(resourceLanguageSettingsSchemaId, this.resourceLanguageSettingsSchema); this._onDidSchemaChange.fire(); this._onDidUpdateConfiguration.fire(properties); } + public updateConfigurations({ add, remove }: { add: IConfigurationNode[], remove: IConfigurationNode[] }): void { + const properties = []; + properties.push(...this.doDeregisterConfigurations(remove)); + properties.push(...this.doRegisterConfigurations(add, false)); + + contributionRegistry.registerSchema(resourceLanguageSettingsSchemaId, this.resourceLanguageSettingsSchema); + this._onDidSchemaChange.fire(); + this._onDidUpdateConfiguration.fire(distinct(properties)); + } + public registerDefaultConfigurations(defaultConfigurations: IStringDictionary[]): void { const properties: string[] = []; const overrideIdentifiers: string[] = []; @@ -319,6 +313,40 @@ class ConfigurationRegistry implements IConfigurationRegistry { this.updateOverridePropertyPatternKey(); } + private doRegisterConfigurations(configurations: IConfigurationNode[], validate: boolean): string[] { + const properties: string[] = []; + configurations.forEach(configuration => { + properties.push(...this.validateAndRegisterProperties(configuration, validate, configuration.extensionInfo)); // fills in defaults + this.configurationContributors.push(configuration); + this.registerJSONConfiguration(configuration); + }); + return properties; + } + + private doDeregisterConfigurations(configurations: IConfigurationNode[]): string[] { + const properties: string[] = []; + const deregisterConfiguration = (configuration: IConfigurationNode) => { + if (configuration.properties) { + for (const key in configuration.properties) { + properties.push(key); + delete this.configurationProperties[key]; + this.removeFromSchema(key, configuration.properties[key]); + } + } + if (configuration.allOf) { + configuration.allOf.forEach(node => deregisterConfiguration(node)); + } + }; + for (const configuration of configurations) { + deregisterConfiguration(configuration); + const index = this.configurationContributors.indexOf(configuration); + if (index !== -1) { + this.configurationContributors.splice(index, 1); + } + } + return properties; + } + private validateAndRegisterProperties(configuration: IConfigurationNode, validate: boolean = true, extensionInfo?: IConfigurationExtensionInfo, scope: ConfigurationScope = ConfigurationScope.WINDOW): string[] { scope = types.isUndefinedOrNull(configuration.scope) ? scope : configuration.scope; let propertyKeys: string[] = []; diff --git a/src/vs/platform/request/common/request.ts b/src/vs/platform/request/common/request.ts index 4d63fdca707..d217ccb1f67 100644 --- a/src/vs/platform/request/common/request.ts +++ b/src/vs/platform/request/common/request.ts @@ -73,9 +73,7 @@ export function updateProxyConfigurationsScope(scope: ConfigurationScope): void let proxyConfiguration: IConfigurationNode | undefined; function registerProxyConfigurations(scope: ConfigurationScope): void { const configurationRegistry = Registry.as(Extensions.Configuration); - if (proxyConfiguration) { - configurationRegistry.deregisterConfigurations([proxyConfiguration]); - } + const oldProxyConfiguration = proxyConfiguration; proxyConfiguration = { id: 'http', order: 15, @@ -122,7 +120,7 @@ function registerProxyConfigurations(scope: ConfigurationScope): void { } } }; - configurationRegistry.registerConfiguration(proxyConfiguration); + configurationRegistry.updateConfigurations({ add: [proxyConfiguration], remove: oldProxyConfiguration ? [oldProxyConfiguration] : [] }); } registerProxyConfigurations(ConfigurationScope.MACHINE); diff --git a/src/vs/platform/terminal/common/terminalPlatformConfiguration.ts b/src/vs/platform/terminal/common/terminalPlatformConfiguration.ts index 5531d4036a9..bbb7a4bfd43 100644 --- a/src/vs/platform/terminal/common/terminalPlatformConfiguration.ts +++ b/src/vs/platform/terminal/common/terminalPlatformConfiguration.ts @@ -389,17 +389,15 @@ export function registerTerminalPlatformConfiguration() { registerTerminalDefaultProfileConfiguration(); } -let lastDefaultProfilesConfiguration: IConfigurationNode | undefined; +let defaultProfilesConfiguration: IConfigurationNode | undefined; export function registerTerminalDefaultProfileConfiguration(detectedProfiles?: { os: OperatingSystem, profiles: ITerminalProfile[] }, extensionContributedProfiles?: readonly IExtensionTerminalProfile[]) { const registry = Registry.as(Extensions.Configuration); - if (lastDefaultProfilesConfiguration) { - registry.deregisterConfigurations([lastDefaultProfilesConfiguration]); - } let profileEnum; if (detectedProfiles) { profileEnum = createProfileSchemaEnums(detectedProfiles?.profiles, extensionContributedProfiles); } - lastDefaultProfilesConfiguration = { + const oldDefaultProfilesConfiguration = defaultProfilesConfiguration; + defaultProfilesConfiguration = { id: 'terminal', order: 100, title: localize('terminalIntegratedConfigurationTitle', "Integrated Terminal"), @@ -431,5 +429,5 @@ export function registerTerminalDefaultProfileConfiguration(detectedProfiles?: { }, } }; - registry.registerConfiguration(lastDefaultProfilesConfiguration); + registry.updateConfigurations({ add: [defaultProfilesConfiguration], remove: oldDefaultProfilesConfiguration ? [oldDefaultProfilesConfiguration] : [] }); } diff --git a/src/vs/workbench/browser/parts/editor/editorConfiguration.ts b/src/vs/workbench/browser/parts/editor/editorConfiguration.ts index 312f28decec..e452fbb1a54 100644 --- a/src/vs/workbench/browser/parts/editor/editorConfiguration.ts +++ b/src/vs/workbench/browser/parts/editor/editorConfiguration.ts @@ -6,7 +6,7 @@ import { localize } from 'vs/nls'; import { Registry } from 'vs/platform/registry/common/platform'; import { IWorkbenchContribution } from 'vs/workbench/common/contributions'; -import { Disposable, MutableDisposable, toDisposable } from 'vs/base/common/lifecycle'; +import { Disposable } from 'vs/base/common/lifecycle'; import { IConfigurationRegistry, Extensions as ConfigurationExtensions, IConfigurationNode } from 'vs/platform/configuration/common/configurationRegistry'; import { workbenchConfigurationNodeBase } from 'vs/workbench/common/configuration'; import { IEditorResolverService, RegisteredEditorInfo, RegisteredEditorPriority } from 'vs/workbench/services/editor/common/editorResolverService'; @@ -29,7 +29,7 @@ export class DynamicEditorGroupAutoLockConfiguration extends Disposable implemen ]; private configurationRegistry = Registry.as(ConfigurationExtensions.Configuration); - private configurationDisposable = this._register(new MutableDisposable()); + private configurationNode: IConfigurationNode | undefined; constructor( @IEditorResolverService private readonly editorResolverService: IEditorResolverService @@ -65,7 +65,8 @@ export class DynamicEditorGroupAutoLockConfiguration extends Disposable implemen defaultAutoLockGroupConfiguration[editor.id] = DynamicEditorGroupAutoLockConfiguration.AUTO_LOCK_DEFAULT_ENABLED.has(editor.id); } - const configurationNode: IConfigurationNode = { + const oldConfigurationNode = this.configurationNode; + this.configurationNode = { ...workbenchConfigurationNodeBase, properties: { 'workbench.editor.autoLockGroups': { @@ -78,11 +79,6 @@ export class DynamicEditorGroupAutoLockConfiguration extends Disposable implemen } }; - // Register configuration disposing any previous registration - this.configurationDisposable.value = (() => { - this.configurationRegistry.registerConfiguration(configurationNode); - - return toDisposable(() => this.configurationRegistry.deregisterConfigurations([configurationNode])); - })(); + this.configurationRegistry.updateConfigurations({ add: [this.configurationNode], remove: oldConfigurationNode ? [oldConfigurationNode] : [] }); } } diff --git a/src/vs/workbench/contrib/welcome/gettingStarted/browser/gettingStarted.contribution.ts b/src/vs/workbench/contrib/welcome/gettingStarted/browser/gettingStarted.contribution.ts index abc6c637e09..a71f0ae47fe 100644 --- a/src/vs/workbench/contrib/welcome/gettingStarted/browser/gettingStarted.contribution.ts +++ b/src/vs/workbench/contrib/welcome/gettingStarted/browser/gettingStarted.contribution.ts @@ -235,12 +235,10 @@ class WorkbenchConfigurationContribution { private async registerConfigs(_experimentSevice: ITASExperimentService) { const preferReduced = await _experimentSevice.getTreatment('welcomePage.preferReducedMotion').catch(e => false); if (preferReduced) { - configurationRegistry.deregisterConfigurations([prefersStandardMotionConfig]); - configurationRegistry.registerConfiguration(prefersReducedMotionConfig); + configurationRegistry.updateConfigurations({ add: [prefersReducedMotionConfig], remove: [prefersStandardMotionConfig] }); } else { - configurationRegistry.deregisterConfigurations([prefersReducedMotionConfig]); - configurationRegistry.registerConfiguration(prefersStandardMotionConfig); + configurationRegistry.updateConfigurations({ add: [prefersStandardMotionConfig], remove: [prefersReducedMotionConfig] }); } } }