diff --git a/src/vs/workbench/services/configurationResolver/node/configurationResolverService.ts b/src/vs/workbench/services/configurationResolver/node/configurationResolverService.ts index c236c89233e..5ecb4450e89 100644 --- a/src/vs/workbench/services/configurationResolver/node/configurationResolverService.ts +++ b/src/vs/workbench/services/configurationResolver/node/configurationResolverService.ts @@ -147,7 +147,7 @@ export class ConfigurationResolverService implements IConfigurationResolverServi } config = config[key]; } - newValue = config ? config[keys[0]] : ''; + newValue = config && config.hasOwnProperty(keys[0]) ? config[keys[0]] : ''; } catch (e) { return ''; } diff --git a/src/vs/workbench/services/configurationResolver/test/node/configurationResolverService.test.ts b/src/vs/workbench/services/configurationResolver/test/node/configurationResolverService.test.ts index 09de8c8f3e8..c3cb269d392 100644 --- a/src/vs/workbench/services/configurationResolver/test/node/configurationResolverService.test.ts +++ b/src/vs/workbench/services/configurationResolver/test/node/configurationResolverService.test.ts @@ -244,12 +244,36 @@ suite('Configuration Resolver Service', () => { let configurationService: IConfigurationService; configurationService = new MockConfigurationService({ editor: { - a: 'foo' + abc: 'foo' } }); let service = new ConfigurationResolverService(uri.parse('file:///VSCode/workspaceLocation'), envVariables, new TestEditorService(), TestEnvironmentService, configurationService, mockCommandService); - assert.strictEqual(service.resolve("abc ${config.editor['abc'.substr(0)]} xyz"), 'abc undefined xyz'); + assert.strictEqual(service.resolve("abc ${config.editor['abc'.substr(0)]} xyz"), 'abc xyz'); + }); + + test('uses empty string as fallback', () => { + let configurationService: IConfigurationService; + configurationService = new MockConfigurationService({ + editor: {} + }); + + let service = new ConfigurationResolverService(uri.parse('file:///VSCode/workspaceLocation'), envVariables, new TestEditorService(), TestEnvironmentService, configurationService, mockCommandService); + assert.strictEqual(service.resolve("abc ${config.editor.abc} xyz"), 'abc xyz'); + assert.strictEqual(service.resolve("abc ${config.editor.abc.def} xyz"), 'abc xyz'); + assert.strictEqual(service.resolve("abc ${config.panel} xyz"), 'abc xyz'); + assert.strictEqual(service.resolve("abc ${config.panel.abc} xyz"), 'abc xyz'); + }); + + test('is restricted to own properties', () => { + let configurationService: IConfigurationService; + configurationService = new MockConfigurationService({ + editor: {} + }); + + let service = new ConfigurationResolverService(uri.parse('file:///VSCode/workspaceLocation'), envVariables, new TestEditorService(), TestEnvironmentService, configurationService, mockCommandService); + assert.strictEqual(service.resolve("abc ${config.editor.__proto__} xyz"), 'abc xyz'); + assert.strictEqual(service.resolve("abc ${config.editor.toString} xyz"), 'abc xyz'); }); test('interactive variable simple', () => {