Merge pull request #180365 from microsoft/merogge/acc

add accessibility verbosity settings for terminal and diff editor aria hints
This commit is contained in:
Megan Rogge
2023-04-20 15:03:38 -07:00
committed by GitHub
9 changed files with 79 additions and 11 deletions
+4
View File
@@ -513,6 +513,10 @@
{
"name": "vs/workbench/services/localization",
"project": "vscode-workbench"
},
{
"name": "vs/workbench/contrib/accessibility",
"project": "vscode-workbench"
}
]
}
@@ -58,6 +58,7 @@ import { defaultInsertColor, defaultRemoveColor, diffDiagonalFill, diffInserted,
import { registerIcon } from 'vs/platform/theme/common/iconRegistry';
import { getThemeTypeSelector, IColorTheme, IThemeService, registerThemingParticipant } from 'vs/platform/theme/common/themeService';
import { ThemeIcon } from 'vs/base/common/themables';
import { IConfigurationService } from 'vs/platform/configuration/common/configuration';
export interface IDiffCodeEditorWidgetOptions {
originalEditor?: ICodeEditorWidgetOptions;
@@ -249,11 +250,16 @@ export class DiffEditorWidget extends Disposable implements editorBrowser.IDiffE
@IThemeService themeService: IThemeService,
@INotificationService notificationService: INotificationService,
@IContextMenuService contextMenuService: IContextMenuService,
@IEditorProgressService private readonly _editorProgressService: IEditorProgressService
@IEditorProgressService private readonly _editorProgressService: IEditorProgressService,
@IConfigurationService private readonly _configurationService: IConfigurationService
) {
super();
codeEditorService.willCreateDiffEditor();
this._register(this._configurationService.onDidChangeConfiguration(e => {
if (e.affectsConfiguration('accessibility.verbosity.diff-editor')) {
this.updateOptions(this._options);
}
}));
this._documentDiffProvider = this._register(instantiationService.createInstance(WorkerBasedDocumentDiffProvider, options));
this._register(this._documentDiffProvider.onDidChange(e => this._beginUpdateDecorationsSoon()));
@@ -1272,7 +1278,7 @@ export class DiffEditorWidget extends Disposable implements editorBrowser.IDiffE
if (options.originalAriaLabel) {
result.ariaLabel = options.originalAriaLabel;
}
result.ariaLabel += ariaNavigationTip;
this._updateAriaLabel(result);
result.readOnly = !this._options.originalEditable;
result.dropIntoEditor = { enabled: !result.readOnly };
result.extraEditorClassName = 'original-in-monaco-diff-editor';
@@ -1285,12 +1291,22 @@ export class DiffEditorWidget extends Disposable implements editorBrowser.IDiffE
};
}
private _updateAriaLabel(options: IEditorConstructionOptions): void {
let ariaLabel = options.ariaLabel;
if (this._configurationService.getValue('accessibility.verbosity.diff-editor')) {
ariaLabel += ariaNavigationTip;
} else if (ariaLabel) {
ariaLabel = ariaLabel.replaceAll(ariaNavigationTip, '');
}
options.ariaLabel = ariaLabel;
}
private _adjustOptionsForRightHandSide(options: Readonly<editorBrowser.IDiffEditorConstructionOptions>): IEditorConstructionOptions {
const result = this._adjustOptionsForSubEditor(options);
if (options.modifiedAriaLabel) {
result.ariaLabel = options.modifiedAriaLabel;
}
result.ariaLabel += ariaNavigationTip;
this._updateAriaLabel(result);
result.wordWrapOverride1 = this._options.diffWordWrap;
result.revealHorizontalRightPadding = EditorOptions.revealHorizontalRightPadding.defaultValue + DiffEditorWidget.ENTIRE_DIFF_OVERVIEW_WIDTH;
result.scrollbar!.verticalHasArrows = false;
@@ -20,6 +20,7 @@ import { IClipboardService } from 'vs/platform/clipboard/common/clipboardService
import { IEditorProgressService } from 'vs/platform/progress/common/progress';
import { ILanguageConfigurationService } from 'vs/editor/common/languages/languageConfigurationRegistry';
import { ILanguageFeaturesService } from 'vs/editor/common/services/languageFeatures';
import { IConfigurationService } from 'vs/platform/configuration/common/configuration';
export class EmbeddedCodeEditorWidget extends CodeEditorWidget {
@@ -85,8 +86,9 @@ export class EmbeddedDiffEditorWidget extends DiffEditorWidget {
@IContextMenuService contextMenuService: IContextMenuService,
@IClipboardService clipboardService: IClipboardService,
@IEditorProgressService editorProgressService: IEditorProgressService,
@IConfigurationService configurationService: IConfigurationService
) {
super(domElement, parentEditor.getRawOptions(), codeEditorWidgetOptions, clipboardService, contextKeyService, instantiationService, codeEditorService, themeService, notificationService, contextMenuService, editorProgressService);
super(domElement, parentEditor.getRawOptions(), codeEditorWidgetOptions, clipboardService, contextKeyService, instantiationService, codeEditorService, themeService, notificationService, contextMenuService, editorProgressService, configurationService);
this._parentEditor = parentEditor;
this._overwriteOptions = options;
@@ -481,7 +481,7 @@ export class StandaloneEditor extends StandaloneCodeEditor implements IStandalon
export class StandaloneDiffEditor extends DiffEditorWidget implements IStandaloneDiffEditor {
private readonly _configurationService: IConfigurationService;
private readonly _updatedConfigurationService: IConfigurationService;
private readonly _standaloneThemeService: IStandaloneThemeService;
constructor(
@@ -507,9 +507,9 @@ export class StandaloneDiffEditor extends DiffEditorWidget implements IStandalon
themeService.setAutoDetectHighContrast(Boolean(options.autoDetectHighContrast));
}
super(domElement, options, {}, clipboardService, contextKeyService, instantiationService, codeEditorService, themeService, notificationService, contextMenuService, editorProgressService);
super(domElement, options, {}, clipboardService, contextKeyService, instantiationService, codeEditorService, themeService, notificationService, contextMenuService, editorProgressService, configurationService);
this._configurationService = configurationService;
this._updatedConfigurationService = configurationService;
this._standaloneThemeService = themeService;
this._register(themeDomRegistration);
@@ -520,7 +520,7 @@ export class StandaloneDiffEditor extends DiffEditorWidget implements IStandalon
}
public override updateOptions(newOptions: Readonly<IDiffEditorOptions & IGlobalEditorOptions>): void {
updateConfigurationService(this._configurationService, newOptions, true);
updateConfigurationService(this._updatedConfigurationService, newOptions, true);
if (typeof newOptions.theme === 'string') {
this._standaloneThemeService.setTheme(newOptions.theme);
}
@@ -463,7 +463,6 @@ class ConfigurationRegistry implements IConfigurationRegistry {
}
private doRegisterConfigurations(configurations: IConfigurationNode[], validate: boolean, bucket: Set<string>): void {
configurations.forEach(configuration => {
this.validateAndRegisterProperties(configuration, validate, configuration.extensionInfo, configuration.restrictedProperties, undefined, bucket);
@@ -0,0 +1,8 @@
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
import { registerAccessibilityConfiguration } from 'vs/workbench/contrib/accessibility/browser/accessibilityContribution';
registerAccessibilityConfiguration();
@@ -0,0 +1,33 @@
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
import { localize } from 'vs/nls';
import { Extensions, IConfigurationNode, IConfigurationRegistry } from 'vs/platform/configuration/common/configurationRegistry';
import { Registry } from 'vs/platform/registry/common/platform';
const configuration: IConfigurationNode = {
id: 'accessibility',
title: localize('accessibilityConfigurationTitle', "Accessibility"),
type: 'object',
properties: {
'accessibility.verbosity.terminal': {
description: localize('verbosity.terminal.description', 'Provide information about how to access the terminal accessibility help menu when the terminal is focused'),
type: 'boolean',
default: true,
tags: ['accessibility']
},
'accessibility.verbosity.diff-editor': {
description: localize('verbosity.diff-editor.description', 'Provide information about how to navigate changes in the diff editor when it is focused'),
type: 'boolean',
default: true,
tags: ['accessibility']
}
}
};
export function registerAccessibilityConfiguration() {
const configurationRegistry = Registry.as<IConfigurationRegistry>(Extensions.Configuration);
configurationRegistry.registerConfiguration(configuration);
}
@@ -524,6 +524,9 @@ export class TerminalInstance extends Disposable implements ITerminalInstance {
});
this._register(this._configurationService.onDidChangeConfiguration(async e => {
if (e.affectsConfiguration('accessibility.verbosity.terminal')) {
this._setAriaLabel(this.xterm?.raw, this._instanceId, this.title);
}
if (e.affectsConfiguration('terminal.integrated')) {
this.updateConfig();
this.setVisible(this._isVisible);
@@ -1942,7 +1945,7 @@ export class TerminalInstance extends Disposable implements ITerminalInstance {
labelParts.push(nls.localize('terminalScreenReaderMode', "Run the command: Toggle Screen Reader Accessibility Mode for an optimized screen reader experience"));
}
const accessibilityHelpKeybinding = this._keybindingService.lookupKeybinding(TerminalCommandId.ShowTerminalAccessibilityHelp)?.getLabel();
if (accessibilityHelpKeybinding) {
if (this._configurationService.getValue('accessibility.verbosity.terminal') && accessibilityHelpKeybinding) {
labelParts.push(nls.localize('terminalHelpAriaLabel', "Use {0} for terminal accessibility help", accessibilityHelpKeybinding));
}
xterm.textarea.setAttribute('aria-label', labelParts.join('\n'));
@@ -362,4 +362,7 @@ import 'vs/workbench/contrib/deprecatedExtensionMigrator/browser/deprecatedExten
// Bracket Pair Colorizer 2 Telemetry
import 'vs/workbench/contrib/bracketPairColorizer2Telemetry/browser/bracketPairColorizer2Telemetry.contribution';
// Accessibility
import 'vs/workbench/contrib/accessibility/browser/accessibility.contribution';
//#endregion