未验证 提交 26b228d3 编写于 作者: C Christopher Leidigh 提交者: GitHub

Settings: Add aria-label for context menu shortcut. Fixes #57378 (#58482)

* More actions label exp1

* Settings: Add aria-label for context menu shortcut. Fixes #57378
上级 31bf4cca
......@@ -503,3 +503,7 @@
padding: 10px;
border-radius: 5px;
}
.settings-editor.search-mode > .settings-body .settings-toc-container .monaco-tree-row .settings-toc-count {
display: block;
}
......@@ -41,11 +41,11 @@ import { ISettingLinkClickEvent, resolveExtensionsSettings, resolveSettingsTree,
import { ISettingsEditorViewState, MODIFIED_SETTING_TAG, ONLINE_SERVICES_SETTING_TAG, parseQuery, SearchResultIdx, SearchResultModel, SettingsTreeGroupElement, SettingsTreeModel, SettingsTreeSettingElement } from 'vs/workbench/parts/preferences/browser/settingsTreeModels';
import { settingsTextInputBorder } from 'vs/workbench/parts/preferences/browser/settingsWidgets';
import { TOCRenderer, TOCTree, TOCTreeModel } from 'vs/workbench/parts/preferences/browser/tocTree';
import { CONTEXT_SETTINGS_EDITOR, CONTEXT_SETTINGS_SEARCH_FOCUS, CONTEXT_TOC_ROW_FOCUS, IPreferencesSearchService, ISearchProvider } from 'vs/workbench/parts/preferences/common/preferences';
import { SETTINGS_EDITOR_COMMAND_SHOW_CONTEXT_MENU, CONTEXT_SETTINGS_EDITOR, CONTEXT_SETTINGS_SEARCH_FOCUS, CONTEXT_TOC_ROW_FOCUS, IPreferencesSearchService, ISearchProvider } from 'vs/workbench/parts/preferences/common/preferences';
import { IPreferencesService, ISearchResult, ISettingsEditorModel, SettingsEditorOptions, ISettingsEditorOptions } from 'vs/workbench/services/preferences/common/preferences';
import { SettingsEditor2Input } from 'vs/workbench/services/preferences/common/preferencesEditorInput';
import { Settings2EditorModel } from 'vs/workbench/services/preferences/common/preferencesModels';
import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding';
const $ = DOM.$;
export class SettingsEditor2 extends BaseEditor {
......@@ -77,6 +77,8 @@ export class SettingsEditor2 extends BaseEditor {
private tocTreeContainer: HTMLElement;
private tocTree: WorkbenchTree;
private settingsAriaExtraLabelsContainer: HTMLElement;
private delayedFilterLogging: Delayer<void>;
private localSearchDelayer: Delayer<void>;
private remoteSearchThrottle: ThrottledDelayer<void>;
......@@ -112,7 +114,8 @@ export class SettingsEditor2 extends BaseEditor {
@IContextKeyService contextKeyService: IContextKeyService,
@IContextMenuService private contextMenuService: IContextMenuService,
@IStorageService private storageService: IStorageService,
@INotificationService private notificationService: INotificationService
@INotificationService private notificationService: INotificationService,
@IKeybindingService private keybindingService: IKeybindingService
) {
super(SettingsEditor2.ID, telemetryService, themeService);
this.delayedFilterLogging = new Delayer<void>(1000);
......@@ -150,6 +153,10 @@ export class SettingsEditor2 extends BaseEditor {
DOM.toggleClass(this.rootElement, 'search-mode', !!this._searchResultModel);
}
private get currentSettingsContextMenuKeyBindingLabel() {
return this.keybindingService.lookupKeybinding(SETTINGS_EDITOR_COMMAND_SHOW_CONTEXT_MENU).getLabel();
}
createEditor(parent: HTMLElement): void {
parent.setAttribute('tabindex', '-1');
this.rootElement = DOM.append(parent, $('.settings-editor'));
......@@ -236,6 +243,16 @@ export class SettingsEditor2 extends BaseEditor {
}
focusSettings(): void {
// Update ARIA global labels
const labelElement = this.settingsAriaExtraLabelsContainer.querySelector('#settings_aria_more_actions_shortcut_label');
if (labelElement) {
const settingsContextMenuShortcut = this.currentSettingsContextMenuKeyBindingLabel;
if (settingsContextMenuShortcut) {
const settingsMoreActionsLabel = localize('settingsContextMenuAriaShortcut', "For more actions, Press ");
labelElement.setAttribute('aria-label', settingsMoreActionsLabel + settingsContextMenuShortcut);
}
}
const firstFocusable = this.settingsTree.getHTMLElement().querySelector(SettingsRenderer.CONTROL_SELECTOR);
if (firstFocusable) {
(<HTMLElement>firstFocusable).focus();
......@@ -503,6 +520,14 @@ export class SettingsEditor2 extends BaseEditor {
private createSettingsTree(parent: HTMLElement): void {
this.settingsTreeContainer = DOM.append(parent, $('.settings-tree-container'));
// Add ARIA extra labels div
this.settingsAriaExtraLabelsContainer = DOM.append(this.settingsTreeContainer, $('.settings-aria-extra-labels'));
this.settingsAriaExtraLabelsContainer.id = 'settings_aria_extra_labels';
// Add global labels here
const labelDiv = DOM.append(this.settingsAriaExtraLabelsContainer, $('.settings-aria-extra-label'));
labelDiv.id = 'settings_aria_more_actions_shortcut_label';
labelDiv.setAttribute('aria-label', '');
this.settingsTreeRenderer = this.instantiationService.createInstance(SettingsRenderer, this.settingsTreeContainer);
this._register(this.settingsTreeRenderer.onDidChangeSetting(e => this.onDidChangeSetting(e.key, e.value)));
this._register(this.settingsTreeRenderer.onDidOpenSettings(settingKey => {
......
......@@ -393,6 +393,7 @@ export class SettingsRenderer implements ITreeRenderer {
this.instantiationService.createInstance(CopySettingIdAction),
this.instantiationService.createInstance(CopySettingAsJSONAction),
];
}
showContextMenu(element: SettingsTreeSettingElement, settingDOMElement: HTMLElement): void {
......@@ -1152,7 +1153,8 @@ export class SettingsRenderer implements ITreeRenderer {
}));
const modifiedText = dataElement.isConfigured ? 'Modified' : '';
const label = dataElement.displayCategory + ' ' + dataElement.displayLabel + ' ' + modifiedText;
// Use ',.' as reader pause
const label = dataElement.displayCategory + ' ' + dataElement.displayLabel + ',. ' + modifiedText;
const baseId = (dataElement.displayCategory + '_' + dataElement.displayLabel).replace(/ /g, '_').toLowerCase();
template.selectBox.setAriaLabel(label);
......@@ -1165,7 +1167,7 @@ export class SettingsRenderer implements ITreeRenderer {
if (template.controlElement.firstElementChild) {
// SelectBox needs to have treeitem changed to combobox to read correctly within tree
template.controlElement.firstElementChild.setAttribute('role', 'combobox');
template.controlElement.firstElementChild.setAttribute('aria-describedby', baseId + '_setting_description');
template.controlElement.firstElementChild.setAttribute('aria-describedby', baseId + '_setting_description settings_aria_more_actions_shortcut_label');
}
template.enumDescriptionElement.innerHTML = '';
......@@ -1173,7 +1175,10 @@ export class SettingsRenderer implements ITreeRenderer {
private renderText(dataElement: SettingsTreeSettingElement, template: ISettingTextItemTemplate, onChange: (value: string) => void): void {
const modifiedText = dataElement.isConfigured ? 'Modified' : '';
const label = dataElement.displayCategory + ' ' + dataElement.displayLabel + ' ' + modifiedText; template.onChange = null;
// Use ',.' as reader pause
const label = dataElement.displayCategory + ' ' + dataElement.displayLabel + ',. ' + modifiedText;
template.onChange = null;
template.inputBox.value = dataElement.value;
template.onChange = value => { renderValidations(dataElement, template, false, label); onChange(value); };
......@@ -1191,7 +1196,7 @@ export class SettingsRenderer implements ITreeRenderer {
template.inputBox.inputElement.id = baseId + '_setting_item';
template.inputBox.inputElement.setAttribute('role', 'textbox');
template.inputBox.inputElement.setAttribute('aria-labelledby', baseId + '_setting_label');
template.inputBox.inputElement.setAttribute('aria-describedby', baseId + '_setting_description');
template.inputBox.inputElement.setAttribute('aria-describedby', baseId + '_setting_description settings_aria_more_actions_shortcut_label');
renderValidations(dataElement, template, true, label);
}
......@@ -1199,7 +1204,8 @@ export class SettingsRenderer implements ITreeRenderer {
private renderNumber(dataElement: SettingsTreeSettingElement, template: ISettingTextItemTemplate, onChange: (value: number) => void): void {
const modifiedText = dataElement.isConfigured ? 'Modified' : '';
const label = dataElement.displayCategory + ' ' + dataElement.displayLabel + ' number ' + modifiedText; const numParseFn = (dataElement.valueType === 'integer' || dataElement.valueType === 'nullable-integer')
// Use ',.' as reader pause
const label = dataElement.displayCategory + ' ' + dataElement.displayLabel + ' number,. ' + modifiedText; const numParseFn = (dataElement.valueType === 'integer' || dataElement.valueType === 'nullable-integer')
? parseInt : parseFloat;
const nullNumParseFn = (dataElement.valueType === 'nullable-integer' || dataElement.valueType === 'nullable-number')
......@@ -1223,7 +1229,7 @@ export class SettingsRenderer implements ITreeRenderer {
template.inputBox.inputElement.id = baseId + '_setting_item';
template.inputBox.inputElement.setAttribute('role', 'textbox');
template.inputBox.inputElement.setAttribute('aria-labelledby', baseId + '_setting_label');
template.inputBox.inputElement.setAttribute('aria-describedby', baseId + '_setting_description');
template.inputBox.inputElement.setAttribute('aria-describedby', baseId + '_setting_description settings_aria_more_actions_shortcut_label');
renderValidations(dataElement, template, true, label);
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册