From e0a7603f233a6a535e24de298208af2dcdca3acb Mon Sep 17 00:00:00 2001 From: Rob Lourens Date: Wed, 3 Jun 2020 10:17:43 -0500 Subject: [PATCH] Don't write setting value that doesn't pass validation for simple settings. Can't do this for array types, it could prevent someone from fixing a setting that's already invalid Fix #99268 --- .../preferences/browser/settingsTree.ts | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/src/vs/workbench/contrib/preferences/browser/settingsTree.ts b/src/vs/workbench/contrib/preferences/browser/settingsTree.ts index 495a328ae6f..6c2b705040f 100644 --- a/src/vs/workbench/contrib/preferences/browser/settingsTree.ts +++ b/src/vs/workbench/contrib/preferences/browser/settingsTree.ts @@ -979,7 +979,11 @@ export class SettingTextRenderer extends AbstractSettingRenderer implements ITre template.onChange = undefined; template.inputBox.value = dataElement.value; - template.onChange = value => { renderValidations(dataElement, template, false, label); onChange(value); }; + template.onChange = value => { + if (!renderValidations(dataElement, template, false, label)) { + onChange(value); + } + }; renderValidations(dataElement, template, true, label); } @@ -1126,8 +1130,9 @@ export class SettingNumberRenderer extends AbstractSettingRenderer implements IT template.onChange = undefined; template.inputBox.value = dataElement.value; template.onChange = value => { - renderValidations(dataElement, template, false, label); - onChange(nullNumParseFn(value)); + if (!renderValidations(dataElement, template, false, label)) { + onChange(nullNumParseFn(value)); + } }; renderValidations(dataElement, template, true, label); @@ -1348,7 +1353,10 @@ export class SettingTreeRenderers { } } -function renderValidations(dataElement: SettingsTreeSettingElement, template: ISettingTextItemTemplate, calledOnStartup: boolean, originalAriaLabel: string) { +/** + * Validate and render any error message. Returns true if the value is invalid. + */ +function renderValidations(dataElement: SettingsTreeSettingElement, template: ISettingTextItemTemplate, calledOnStartup: boolean, originalAriaLabel: string): boolean { if (dataElement.setting.validator) { const errMsg = dataElement.setting.validator(template.inputBox.value); if (errMsg) { @@ -1357,12 +1365,13 @@ function renderValidations(dataElement: SettingsTreeSettingElement, template: IS const validationError = localize('validationError', "Validation Error."); template.inputBox.inputElement.parentElement!.setAttribute('aria-label', [originalAriaLabel, validationError, errMsg].join(' ')); if (!calledOnStartup) { ariaAlert(validationError + ' ' + errMsg); } - return; + return true; } else { template.inputBox.inputElement.parentElement!.setAttribute('aria-label', originalAriaLabel); } } DOM.removeClass(template.containerElement, 'invalid-input'); + return false; } function renderArrayValidations(