Skip to content

Commit 37edc03

Browse files
committed
editor: introduce setAria api
1 parent 780d875 commit 37edc03

5 files changed

Lines changed: 45 additions & 2 deletions

File tree

src/vs/editor/browser/controller/textAreaHandler.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ import { RenderingContext, RestrictedRenderingContext, HorizontalPosition } from
2929
import { ViewContext } from 'vs/editor/common/view/viewContext';
3030
import * as viewEvents from 'vs/editor/common/view/viewEvents';
3131
import { AccessibilitySupport } from 'vs/platform/accessibility/common/accessibility';
32+
import { IEditorAriaOptions } from 'vs/editor/browser/editorBrowser';
3233

3334
export interface ITextAreaHandlerHelper {
3435
visibleRangeForPositionRelativeToEditor(lineNumber: number, column: number): HorizontalPosition | null;
@@ -424,6 +425,18 @@ export class TextAreaHandler extends ViewPart {
424425
return this._lastRenderPosition;
425426
}
426427

428+
public setAria(options: IEditorAriaOptions): void {
429+
if (options.activeDescendent) {
430+
this.textArea.setAttribute('aria-haspopup', 'true');
431+
this.textArea.setAttribute('aria-autocomplete', 'list');
432+
this.textArea.setAttribute('aria-activedescendant', options.activeDescendent);
433+
} else {
434+
this.textArea.setAttribute('aria-haspopup', 'false');
435+
this.textArea.setAttribute('aria-autocomplete', 'both');
436+
this.textArea.removeAttribute('aria-activedescendant');
437+
}
438+
}
439+
427440
// --- end view API
428441

429442
private _primaryCursorPosition: Position = new Position(1, 1);

src/vs/editor/browser/editorBrowser.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -319,6 +319,13 @@ export interface IOverviewRuler {
319319
setLayout(position: OverviewRulerPosition): void;
320320
}
321321

322+
/**
323+
* Editor aria options.
324+
*/
325+
export interface IEditorAriaOptions {
326+
activeDescendent: string | undefined;
327+
}
328+
322329
/**
323330
* A rich code editor.
324331
*/
@@ -689,6 +696,12 @@ export interface ICodeEditor extends editorCommon.IEditor {
689696
*/
690697
setHiddenAreas(ranges: IRange[]): void;
691698

699+
/**
700+
* Sets the editor aria options, primarily the active descendent.
701+
* @internal
702+
*/
703+
setAria(options: IEditorAriaOptions): void;
704+
692705
/**
693706
* @internal
694707
*/

src/vs/editor/browser/view/viewImpl.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import { IDisposable } from 'vs/base/common/lifecycle';
1111
import { IPointerHandlerHelper } from 'vs/editor/browser/controller/mouseHandler';
1212
import { PointerHandler } from 'vs/editor/browser/controller/pointerHandler';
1313
import { ITextAreaHandlerHelper, TextAreaHandler } from 'vs/editor/browser/controller/textAreaHandler';
14-
import { IContentWidget, IContentWidgetPosition, IOverlayWidget, IOverlayWidgetPosition, IMouseTarget, IViewZoneChangeAccessor } from 'vs/editor/browser/editorBrowser';
14+
import { IContentWidget, IContentWidgetPosition, IOverlayWidget, IOverlayWidgetPosition, IMouseTarget, IViewZoneChangeAccessor, IEditorAriaOptions } from 'vs/editor/browser/editorBrowser';
1515
import { ICommandDelegate, ViewController } from 'vs/editor/browser/view/viewController';
1616
import { ViewOutgoingEvents } from 'vs/editor/browser/view/viewOutgoingEvents';
1717
import { ContentViewOverlays, MarginViewOverlays } from 'vs/editor/browser/view/viewOverlays';
@@ -510,6 +510,10 @@ export class View extends ViewEventHandler {
510510
this._textAreaHandler.refreshFocusState();
511511
}
512512

513+
public setAria(options: IEditorAriaOptions): void {
514+
this._textAreaHandler.setAria(options);
515+
}
516+
513517
public addContentWidget(widgetData: IContentWidgetData): void {
514518
this.contentWidgets.addWidget(widgetData.widget);
515519
this.layoutContentWidget(widgetData);
@@ -559,4 +563,3 @@ function safeInvokeNoArg(func: Function): any {
559563
onUnexpectedError(e);
560564
}
561565
}
562-

src/vs/editor/browser/widget/codeEditorWidget.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1311,6 +1311,13 @@ export class CodeEditorWidget extends Disposable implements editorBrowser.ICodeE
13111311
this._modelData.view.render(true, forceRedraw);
13121312
}
13131313

1314+
public setAria(options: editorBrowser.IEditorAriaOptions): void {
1315+
if (!this._modelData || !this._modelData.hasRealView) {
1316+
return;
1317+
}
1318+
this._modelData.view.setAria(options);
1319+
}
1320+
13141321
public applyFontInfo(target: HTMLElement): void {
13151322
Configuration.applyFontInfoSlow(target, this._configuration.options.get(EditorOption.fontInfo));
13161323
}

src/vs/monaco.d.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3726,6 +3726,13 @@ declare namespace monaco.editor {
37263726
readonly target: IMouseTarget | null;
37273727
}
37283728

3729+
/**
3730+
* Editor aria options.
3731+
*/
3732+
export interface IEditorAriaOptions {
3733+
activeDescendent: string | undefined;
3734+
}
3735+
37293736
/**
37303737
* A rich code editor.
37313738
*/

0 commit comments

Comments
 (0)