未验证 提交 ab7a507c 编写于 作者: I Isidor Nikolic 提交者: GitHub

Merge pull request #59236 from Microsoft/isidorn/listAriaRole

Introduce aria role to tree and list
......@@ -672,6 +672,7 @@ export class DefaultStyleController implements IStyleController {
export interface IListOptions<T> extends IListViewOptions, IListStyles {
identityProvider?: IIdentityProvider<T>;
ariaLabel?: string;
ariaRole?: string;
mouseSupport?: boolean;
selectOnMouseDown?: boolean;
focusOnMouseDown?: boolean;
......@@ -949,6 +950,9 @@ export class List<T> implements ISpliceable<T>, IDisposable {
if (options.ariaLabel) {
this.view.domNode.setAttribute('aria-label', localize('aria list', "{0}. Use the navigation keys to navigate.", options.ariaLabel));
}
if (options.ariaRole) {
this.view.domNode.setAttribute('role', options.ariaRole);
}
this.style(options);
}
......
......@@ -56,6 +56,10 @@ export class AccessibilityProvider implements IAccessibilityProvider {
return model.accessibilityProvider && model.accessibilityProvider.getAriaLabel(element);
}
public getAriaRole(tree: ITree, element: any): string {
return 'listitem';
}
getPosInSet(tree: ITree, element: any): string {
const model = this.modelProvider.getModel();
let i = 0;
......@@ -140,4 +144,4 @@ export class Renderer implements IRenderer {
const model = this.modelProvider.getModel();
model.renderer.disposeTemplate(templateId, templateData);
}
}
\ No newline at end of file
}
......@@ -446,6 +446,13 @@ export interface IAccessibilityProvider {
*/
getAriaLabel(tree: ITree, element: any): string;
/**
* Given an element in the tree, return the ARIA role that should be associated with the
* item. This helps screen readers to provide a meaningful role for the currently focused
* tree element.
*/
getAriaRole(tree: ITree, element: any): string;
/**
* Given an element in the tree return its aria-posinset. Should be between 1 and aria-setsize
* https://www.w3.org/TR/wai-aria/states_and_properties#aria-posinset
......
......@@ -467,6 +467,10 @@ export class DefaultAccessibilityProvider implements _.IAccessibilityProvider {
getAriaLabel(tree: _.ITree, element: any): string {
return null;
}
getAriaRole(tree: _.ITree, element: any): string {
return null;
}
}
export class DefaultTreestyler implements _.ITreeStyler {
......
......@@ -208,12 +208,17 @@ export class ViewItem implements IViewItem {
this.element.style.height = this.height + 'px';
// ARIA
this.element.setAttribute('role', 'treeitem');
const accessibility = this.context.accessibilityProvider;
const ariaLabel = accessibility.getAriaLabel(this.context.tree, this.model.getElement());
if (ariaLabel) {
this.element.setAttribute('aria-label', ariaLabel);
}
const ariaRole = accessibility.getAriaRole(this.context.tree, this.model.getElement());
if (ariaRole) {
this.element.setAttribute('role', ariaRole);
}
if (accessibility.getPosInSet && accessibility.getSetSize) {
this.element.setAttribute('aria-setsize', accessibility.getSetSize());
this.element.setAttribute('aria-posinset', accessibility.getPosInSet(this.context.tree, this.model.getElement()));
......
......@@ -422,6 +422,10 @@ class AriaProvider implements tree.IAccessibilityProvider {
return undefined;
}
}
public getAriaRole(tree: tree.ITree, element: any): string {
return 'treeitem';
}
}
class VSash {
......
......@@ -79,7 +79,8 @@ export class BreakpointsView extends ViewletPanel {
new FunctionBreakpointInputRenderer(this.debugService, this.contextViewService, this.themeService)
], {
identityProvider: element => element.getId(),
multipleSelectionSupport: false
multipleSelectionSupport: false,
ariaRole: 'checkbox'
}) as WorkbenchList<IEnablement>;
CONTEXT_BREAKPOINTS_FOCUSED.bindTo(this.list.contextKeyService);
......
......@@ -592,4 +592,8 @@ class LoadedSciptsAccessibilityProvider implements IAccessibilityProvider {
}
return null;
}
public getAriaRole(tree: ITree, element: any): string {
return 'treeitem';
}
}
......@@ -556,4 +556,8 @@ class CallstackAccessibilityProvider implements IAccessibilityProvider {
return null;
}
public getAriaRole(tree: ITree, element: any): string {
return 'treeitem';
}
}
......@@ -312,6 +312,10 @@ export class ReplExpressionsAccessibilityProvider implements IAccessibilityProvi
return null;
}
public getAriaRole(tree: ITree, element: any): string {
return 'treeitem';
}
}
export class ReplExpressionsActionProvider implements IActionProvider {
......
......@@ -310,6 +310,10 @@ class VariablesAccessibilityProvider implements IAccessibilityProvider {
return null;
}
public getAriaRole(tree: ITree, element: any): string {
return 'treeitem';
}
}
class VariablesController extends BaseDebugController {
......
......@@ -334,6 +334,10 @@ class WatchExpressionsAccessibilityProvider implements IAccessibilityProvider {
return null;
}
public getAriaRole(tree: ITree, element: any): string {
return 'treeitem';
}
}
class WatchExpressionsController extends BaseDebugController {
......
......@@ -391,6 +391,10 @@ export class FileAccessibilityProvider implements IAccessibilityProvider {
public getAriaLabel(tree: ITree, stat: ExplorerItem): string {
return stat.name;
}
public getAriaRole(tree: ITree, element: any): string {
return 'treeitem';
}
}
// Explorer Controller
......
......@@ -311,4 +311,8 @@ export class MarkersTreeAccessibilityProvider implements IAccessibilityProvider
}
return null;
}
public getAriaRole(tree: ITree, element: any): string {
return 'treeitem';
}
}
......@@ -1396,6 +1396,10 @@ export class SettingsAccessibilityProvider implements IAccessibilityProvider {
return '';
}
public getAriaRole(tree: ITree, element: any): string {
return 'treeitem';
}
}
class NonExpandableOrSelectableTree extends Tree {
......@@ -1614,4 +1618,4 @@ class CopySettingAsJSONAction extends Action {
return TPromise.as(null);
}
}
\ No newline at end of file
}
......@@ -361,6 +361,10 @@ export class SearchAccessibilityProvider implements IAccessibilityProvider {
}
return undefined;
}
public getAriaRole(tree: ITree, element: any): string {
return 'treeitem';
}
}
export class SearchFilter implements IFilter {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册