Skip to content

Commit

Permalink
add debug console accessible view (#221398)
Browse files Browse the repository at this point in the history
  • Loading branch information
meganrogge authored Jul 11, 2024
1 parent a3064fa commit 4dc29b5
Show file tree
Hide file tree
Showing 26 changed files with 367 additions and 221 deletions.
41 changes: 12 additions & 29 deletions src/vs/editor/contrib/hover/browser/hoverAccessibleViews.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
import { localize } from 'vs/nls';
import { EditorContextKeys } from 'vs/editor/common/editorContextKeys';
import { HoverController } from 'vs/editor/contrib/hover/browser/hoverController';
import { AccessibleViewType, AccessibleViewProviderId, AdvancedContentProvider, IAccessibleViewContentProvider, IAccessibleViewOptions } from 'vs/platform/accessibility/browser/accessibleView';
import { AccessibleViewType, AccessibleViewProviderId, AccessibleContentProvider, IAccessibleViewContentProvider, IAccessibleViewOptions } from 'vs/platform/accessibility/browser/accessibleView';
import { IAccessibleViewImplentation } from 'vs/platform/accessibility/browser/accessibleViewRegistry';
import { IContextViewService } from 'vs/platform/contextview/browser/contextView';
import { IHoverService } from 'vs/platform/hover/browser/hover';
Expand Down Expand Up @@ -36,9 +36,7 @@ export class HoverAccessibleView implements IAccessibleViewImplentation {
public readonly name = 'hover';
public readonly when = EditorContextKeys.hoverFocused;

private _provider: HoverAccessibleViewProvider | undefined;

getProvider(accessor: ServicesAccessor): AdvancedContentProvider | undefined {
getProvider(accessor: ServicesAccessor): AccessibleContentProvider | undefined {
const codeEditorService = accessor.get(ICodeEditorService);
const codeEditor = codeEditorService.getActiveCodeEditor() || codeEditorService.getFocusedCodeEditor();
if (!codeEditor) {
Expand All @@ -49,12 +47,7 @@ export class HoverAccessibleView implements IAccessibleViewImplentation {
return;
}
const keybindingService = accessor.get(IKeybindingService);
this._provider = accessor.get(IInstantiationService).createInstance(HoverAccessibleViewProvider, keybindingService, codeEditor, hoverController);
return this._provider;
}

dispose(): void {
this._provider?.dispose();
return accessor.get(IInstantiationService).createInstance(HoverAccessibleViewProvider, keybindingService, codeEditor, hoverController);
}
}

Expand All @@ -65,9 +58,7 @@ export class HoverAccessibilityHelp implements IAccessibleViewImplentation {
public readonly type = AccessibleViewType.Help;
public readonly when = EditorContextKeys.hoverVisible;

private _provider: HoverAccessibleViewProvider | undefined;

getProvider(accessor: ServicesAccessor): AdvancedContentProvider | undefined {
getProvider(accessor: ServicesAccessor): AccessibleContentProvider | undefined {
const codeEditorService = accessor.get(ICodeEditorService);
const codeEditor = codeEditorService.getActiveCodeEditor() || codeEditorService.getFocusedCodeEditor();
if (!codeEditor) {
Expand All @@ -79,10 +70,6 @@ export class HoverAccessibilityHelp implements IAccessibleViewImplentation {
}
return accessor.get(IInstantiationService).createInstance(HoverAccessibilityHelpProvider, hoverController);
}

dispose(): void {
this._provider?.dispose();
}
}

abstract class BaseHoverAccessibleViewProvider extends Disposable implements IAccessibleViewContentProvider {
Expand Down Expand Up @@ -124,7 +111,6 @@ abstract class BaseHoverAccessibleViewProvider extends Disposable implements IAc
}
this._focusedHoverPartIndex = -1;
this._hoverController.shouldKeepOpenOnEditorMouseMoveOrLeave = false;
this.dispose();
}

provideContentAtIndex(focusedHoverIndex: number, includeVerbosityActions: boolean): string {
Expand Down Expand Up @@ -247,12 +233,11 @@ export class HoverAccessibleViewProvider extends BaseHoverAccessibleViewProvider
}

export class ExtHoverAccessibleView implements IAccessibleViewImplentation {

public readonly type = AccessibleViewType.View;
public readonly priority = 90;
public readonly name = 'extension-hover';

getProvider(accessor: ServicesAccessor): AdvancedContentProvider | undefined {
getProvider(accessor: ServicesAccessor): AccessibleContentProvider | undefined {
const contextViewService = accessor.get(IContextViewService);
const contextViewElement = contextViewService.getContextViewElement();
const extensionHoverContent = contextViewElement?.textContent ?? undefined;
Expand All @@ -262,16 +247,14 @@ export class ExtHoverAccessibleView implements IAccessibleViewImplentation {
// The accessible view, itself, uses the context view service to display the text. We don't want to read that.
return;
}
return {
id: AccessibleViewProviderId.Hover,
verbositySettingKey: 'accessibility.verbosity.hover',
provideContent() { return extensionHoverContent; },
onClose() {
return new AccessibleContentProvider(
AccessibleViewProviderId.Hover,
{ language: 'typescript', type: AccessibleViewType.View },
() => { return extensionHoverContent; },
() => {
hoverService.showAndFocusLastHover();
},
options: { language: 'typescript', type: AccessibleViewType.View }
};
'accessibility.verbosity.hover',
);
}

dispose() { }
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,16 +3,15 @@
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/

import { Disposable } from 'vs/base/common/lifecycle';
import { ICodeEditorService } from 'vs/editor/browser/services/codeEditorService';
import { InlineCompletionContextKeys } from 'vs/editor/contrib/inlineCompletions/browser/inlineCompletionContextKeys';
import { InlineCompletionsController } from 'vs/editor/contrib/inlineCompletions/browser/inlineCompletionsController';
import { AccessibleViewType, AccessibleViewProviderId } from 'vs/platform/accessibility/browser/accessibleView';
import { AccessibleViewType, AccessibleViewProviderId, AccessibleContentProvider } from 'vs/platform/accessibility/browser/accessibleView';
import { IAccessibleViewImplentation } from 'vs/platform/accessibility/browser/accessibleViewRegistry';
import { ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey';
import { ServicesAccessor } from 'vs/platform/instantiation/common/instantiation';

export class InlineCompletionsAccessibleView extends Disposable implements IAccessibleViewImplentation {
export class InlineCompletionsAccessibleView implements IAccessibleViewImplentation {
readonly type = AccessibleViewType.View;
readonly priority = 95;
readonly name = 'inline-completions';
Expand All @@ -35,28 +34,28 @@ export class InlineCompletionsAccessibleView extends Disposable implements IAcce
return;
}
const language = editor.getModel()?.getLanguageId() ?? undefined;
return {
id: AccessibleViewProviderId.InlineCompletions,
verbositySettingKey: 'accessibility.verbosity.inlineCompletions',
provideContent() { return lineText + ghostText; },
onClose() {
return new AccessibleContentProvider(
AccessibleViewProviderId.InlineCompletions,
{ language, type: AccessibleViewType.View },
() => lineText + ghostText,

() => {
model.stop();
editor.focus();
},
next() {
'accessibility.verbosity.inlineCompletions',
undefined,
undefined,
() => {
model.next();
setTimeout(() => resolveProvider(), 50);
},
previous() {
() => {
model.previous();
setTimeout(() => resolveProvider(), 50);
},
options: { language, type: AccessibleViewType.View }
};
);
}
return resolveProvider();
}
constructor() {
super();
}
}
23 changes: 15 additions & 8 deletions src/vs/platform/accessibility/browser/accessibleView.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import { IPickerQuickAccessItem } from 'vs/platform/quickinput/browser/pickerQui
import { Event } from 'vs/base/common/event';
import { IAction } from 'vs/base/common/actions';
import { IQuickPickItem } from 'vs/platform/quickinput/common/quickInput';
import { IDisposable, Disposable } from 'vs/base/common/lifecycle';

export const IAccessibleViewService = createDecorator<IAccessibleViewService>('accessibleViewService');

Expand All @@ -26,7 +27,8 @@ export const enum AccessibleViewProviderId {
Hover = 'hover',
Notification = 'notification',
EmptyEditorHint = 'emptyEditorHint',
Comments = 'comments'
Comments = 'comments',
DebugConsole = 'debugConsole',
}

export const enum AccessibleViewType {
Expand Down Expand Up @@ -69,7 +71,7 @@ export interface IAccessibleViewOptions {
}


export interface IAccessibleViewContentProvider extends IBasicContentProvider {
export interface IAccessibleViewContentProvider extends IBasicContentProvider, IDisposable {
id: AccessibleViewProviderId;
verbositySettingKey: string;
/**
Expand Down Expand Up @@ -102,6 +104,7 @@ export interface IPosition {

export interface IAccessibleViewService {
readonly _serviceBrand: undefined;
// The provider will be disposed when the view is closed
show(provider: AccesibleViewContentProvider, position?: IPosition): void;
showLastProvider(id: AccessibleViewProviderId): void;
showAccessibleViewHelp(): void;
Expand Down Expand Up @@ -131,9 +134,9 @@ export interface ICodeBlockActionContext {
element: unknown;
}

export type AccesibleViewContentProvider = AdvancedContentProvider | ExtensionContentProvider;
export type AccesibleViewContentProvider = AccessibleContentProvider | ExtensionContentProvider;

export class AdvancedContentProvider implements IAccessibleViewContentProvider {
export class AccessibleContentProvider extends Disposable implements IAccessibleViewContentProvider {

constructor(
public id: AccessibleViewProviderId,
Expand All @@ -149,10 +152,12 @@ export class AdvancedContentProvider implements IAccessibleViewContentProvider {
public onKeyDown?: (e: IKeyboardEvent) => void,
public getSymbols?: () => IAccessibleViewSymbol[],
public onDidRequestClearLastProvider?: Event<AccessibleViewProviderId>,
) { }
) {
super();
}
}

export class ExtensionContentProvider implements IBasicContentProvider {
export class ExtensionContentProvider extends Disposable implements IBasicContentProvider {

constructor(
public readonly id: string,
Expand All @@ -164,10 +169,12 @@ export class ExtensionContentProvider implements IBasicContentProvider {
public previous?: () => void,
public actions?: IAction[],
public onDidChangeContent?: Event<void>,
) { }
) {
super();
}
}

export interface IBasicContentProvider {
export interface IBasicContentProvider extends IDisposable {
id: string;
options: IAccessibleViewOptions;
onClose(): void;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,19 +4,19 @@
*--------------------------------------------------------------------------------------------*/

import { IDisposable } from 'vs/base/common/lifecycle';
import { AccessibleViewType, AdvancedContentProvider, ExtensionContentProvider } from 'vs/platform/accessibility/browser/accessibleView';
import { AccessibleViewType, AccessibleContentProvider, ExtensionContentProvider } from 'vs/platform/accessibility/browser/accessibleView';
import { ContextKeyExpression } from 'vs/platform/contextkey/common/contextkey';
import { ServicesAccessor } from 'vs/platform/instantiation/common/instantiation';
import { alert } from 'vs/base/browser/ui/aria/aria';

export interface IAccessibleViewImplentation extends IDisposable {
export interface IAccessibleViewImplentation {
type: AccessibleViewType;
priority: number;
name: string;
/**
* @returns the provider or undefined if the view should not be shown
*/
getProvider: (accessor: ServicesAccessor) => AdvancedContentProvider | ExtensionContentProvider | undefined;
getProvider: (accessor: ServicesAccessor) => AccessibleContentProvider | ExtensionContentProvider | undefined;
when?: ContextKeyExpression | undefined;
}

Expand All @@ -31,7 +31,6 @@ export const AccessibleViewRegistry = new class AccessibleViewRegistry {
if (idx !== -1) {
this._implementations.splice(idx, 1);
}
implementation.dispose();
}
};
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,8 @@ import { IAction } from 'vs/base/common/actions';
import { Codicon } from 'vs/base/common/codicons';
import { ThemeIcon } from 'vs/base/common/themables';
import { localize } from 'vs/nls';
import { IAccessibleViewService, AccessibleViewProviderId, AccessibleViewType } from 'vs/platform/accessibility/browser/accessibleView';
import { IAccessibleViewImplentation, alertAccessibleViewFocusChange } from 'vs/platform/accessibility/browser/accessibleViewRegistry';
import { IAccessibleViewService, AccessibleViewProviderId, AccessibleViewType, AccessibleContentProvider } from 'vs/platform/accessibility/browser/accessibleView';
import { alertAccessibleViewFocusChange, IAccessibleViewImplentation } from 'vs/platform/accessibility/browser/accessibleViewRegistry';
import { IAccessibilitySignalService, AccessibilitySignal } from 'vs/platform/accessibilitySignal/browser/accessibilitySignalService';
import { ICommandService } from 'vs/platform/commands/common/commands';
import { ServicesAccessor } from 'vs/platform/instantiation/common/instantiation';
Expand Down Expand Up @@ -59,15 +59,17 @@ export class NotificationAccessibleView implements IAccessibleViewImplentation {
return;
}
notification.onDidClose(() => accessibleViewService.next());
return {
id: AccessibleViewProviderId.Notification,
provideContent: () => {
return new AccessibleContentProvider(
AccessibleViewProviderId.Notification,
{ type: AccessibleViewType.View },
() => {
return notification.source ? localize('notification.accessibleViewSrc', '{0} Source: {1}', message, notification.source) : localize('notification.accessibleView', '{0}', message);
},
onClose(): void {
focusList();
},
next(): void {
() => focusList(),
'accessibility.verbosity.notification',
undefined,
getActionsFromNotification(notification, accessibilitySignalService),
() => {
if (!list) {
return;
}
Expand All @@ -76,7 +78,7 @@ export class NotificationAccessibleView implements IAccessibleViewImplentation {
alertAccessibleViewFocusChange(notificationIndex, length, 'next');
getProvider();
},
previous(): void {
() => {
if (!list) {
return;
}
Expand All @@ -85,14 +87,10 @@ export class NotificationAccessibleView implements IAccessibleViewImplentation {
alertAccessibleViewFocusChange(notificationIndex, length, 'previous');
getProvider();
},
verbositySettingKey: 'accessibility.verbosity.notification',
options: { type: AccessibleViewType.View },
actions: getActionsFromNotification(notification, accessibilitySignalService)
};
);
}
return getProvider();
}
dispose() { }
}


Expand Down
4 changes: 2 additions & 2 deletions src/vs/workbench/browser/parts/views/viewPane.ts
Original file line number Diff line number Diff line change
Expand Up @@ -376,7 +376,7 @@ export abstract class ViewPane extends Pane implements IView {
@IThemeService protected themeService: IThemeService,
@ITelemetryService protected telemetryService: ITelemetryService,
@IHoverService protected readonly hoverService: IHoverService,
protected readonly accessibleViewService?: IAccessibleViewInformationService
protected readonly accessibleViewInformationService?: IAccessibleViewInformationService
) {
super({ ...options, ...{ orientation: viewDescriptorService.getViewLocationById(options.id) === ViewContainerLocation.Panel ? Orientation.HORIZONTAL : Orientation.VERTICAL } });

Expand Down Expand Up @@ -553,7 +553,7 @@ export abstract class ViewPane extends Pane implements IView {

private _getAriaLabel(title: string): string {
const viewHasAccessibilityHelpContent = this.viewDescriptorService.getViewDescriptorById(this.id)?.accessibilityHelpContent;
const accessibleViewHasShownForView = this.accessibleViewService?.hasShownAccessibleView(this.id);
const accessibleViewHasShownForView = this.accessibleViewInformationService?.hasShownAccessibleView(this.id);
if (!viewHasAccessibilityHelpContent || accessibleViewHasShownForView) {
return title;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,8 @@ export const enum AccessibilityVerbositySettingId {
EmptyEditorHint = 'accessibility.verbosity.emptyEditorHint',
ReplInputHint = 'accessibility.verbosity.replInputHint',
Comments = 'accessibility.verbosity.comments',
DiffEditorActive = 'accessibility.verbosity.diffEditorActive'
DiffEditorActive = 'accessibility.verbosity.diffEditorActive',
DebugConsole = 'accessibility.verbosity.debugConsole',
}

const baseVerbosityProperty: IConfigurationPropertySchema = {
Expand Down
Loading

0 comments on commit 4dc29b5

Please sign in to comment.