Change:
Testing Repro: some notifications and focus one. You should hear a hint about opening the notification in the accessible view. !
Oh, this is because it's not focused. I found this a little confusing as the info message doesn't say it's a notification or anything so how would a new user know how to answer the question?
I'm still hitting this sometimes when the notification is focused as well No verbosity settings are set here: !
When this happens alt+f2 doesn't work It might be something off with context keys?
Proof: !
I was also going to report this - I triggered this notification and selected it to focus it, but I didn't get a hint: !
I have occasionally found that this does not work when I have the screen reader text view open. Can you try with that closed and speech on / volume up?
Is that the speech viewer / text box shows in his screenshots? I didn't have that open in my flow afaik.
I need to add to the aria label - currently, it's just to the free floating notification element
It's better now, but the hint still doesn't show up if the notification appears and the user tabs to it. The hint shows up if the user tabs to the button, but then Alt+F2 doesn't work while the user is on the button. Good: the screen reader optimized button. the notification. the show notification command. is properly displayed. Bad notifications from the notifications center. the screen reader optimized button. tab until the focus is on the notification. Enable tab moves focus mode if needed. :bug: The hint doesn't show up, and pressing Alt+F2 doesn't work. tab until the focus is on the Yes button. :bug: The hint shows up, but pressing Alt+F2 doesn't work. Let me know if you're able to reproduce the issue and whether it's worth reopening.
Thanks I'll probably wait to see if this is an issue screen reader users encounter.

Discussion:
import { isAncestor, trackFocus } from 'vs/base/browser/dom'; import { WorkbenchList } from 'vs/platform/list/browser/listService'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; <del> import { IListOptions } from 'vs/base/browser/ui/list/listWidget'; </del> <ins> import { IListAccessibilityProvider, IListOptions } from 'vs/base/browser/ui/list/listWidget'; </ins> import { NOTIFICATIONS_BACKGROUND } from 'vs/workbench/common/theme'; import { INotificationViewItem } from 'vs/workbench/common/notifications'; import { NotificationsListDelegate, NotificationRenderer } from 'vs/workbench/browser/parts/notifications/notificationsViewer';

import { Disposable } from 'vs/base/common/lifecycle'; import { AriaRole } from 'vs/base/browser/ui/aria/aria'; import { NotificationActionRunner } from 'vs/workbench/browser/parts/notifications/notificationsCommands'; <ins> import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; </ins> export interface INotificationsListOptions extends IListOptions<INotificationViewItem> { readonly widgetAriaLabel?: string;

overrideStyles: { listBackground: NOTIFICATIONS_BACKGROUND }, <del> accessibilityProvider: { getAriaLabel(element: INotificationViewItem): string { if (!element.source) { return localize('notificationAriaLabel', "{0}, notification", element.message.raw); } return localize('notificationWithSourceAriaLabel', "{0}, source: {1}, notification", element.message.raw, element.source); }, getWidgetAriaLabel(): string { return options.widgetAriaLabel ?? localize('notificationsList', "Notifications List"); }, getRole(): AriaRole { return 'dialog'; // https://github.com/microsoft/vscode/issues/82728 } } </del> <ins> accessibilityProvider: this.instantiationService.createInstance(NotificationAccessibilityProvider, options) </ins> } ));

super.dispose(); } } <ins> class NotificationAccessibilityProvider implements IListAccessibilityProvider<INotificationViewItem> { constructor( private readonly _options: INotificationsListOptions, @IKeybindingService private readonly _keybindingService: IKeybindingService, @IConfigurationService private readonly _configurationService: IConfigurationService ) { } getAriaLabel(element: INotificationViewItem): string { let accessibleViewHint: string | undefined; const keybinding = this._keybindingService.lookupKeybinding('editor.action.accessibleView')?.getAriaLabel(); if (this._configurationService.getValue('accessibility.verbosity.notification')) { accessibleViewHint = keybinding ? localize('notificationAccessibleViewHint', "Inspect the response in the accessible view with {0}", keybinding) : localize('notificationAccessibleViewHintNoKb', "Inspect the response in the accessible view via the command Open Accessible View which is currently not triggerable via keybinding"); } if (!element.source) { return accessibleViewHint ? localize('notificationAriaLabelHint', "{0}, notification, {1}", element.message.raw, accessibleViewHint) : localize('notificationAriaLabel', "{0}, notification", element.message.raw); } return accessibleViewHint ? localize('notificationWithSourceAriaLabelHint', "{0}, source: {1}, notification, {2}", element.message.raw, element.source, accessibleViewHint) : localize('notificationWithSourceAriaLabel', "{0}, source: {1}, notification", element.message.raw, element.source); } getWidgetAriaLabel(): string { return this._options.widgetAriaLabel ?? localize('notificationsList', "Notifications List"); } getRole(): AriaRole { return 'dialog'; // https://github.com/microsoft/vscode/issues/82728 } } </ins>

import { IntervalCounter } from 'vs/base/common/async'; import { assertIsDefined } from 'vs/base/common/types'; import { NotificationsToastsVisibleContext } from 'vs/workbench/common/contextkeys'; <del> import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; </del> interface INotificationToast { readonly item: INotificationViewItem;

@IEditorGroupsService private readonly editorGroupService: IEditorGroupsService, @IContextKeyService private readonly contextKeyService: IContextKeyService, @ILifecycleService private readonly lifecycleService: ILifecycleService, <del> @IHostService private readonly hostService: IHostService, @IKeybindingService private readonly _keybindingService: IKeybindingService, @IConfigurationService private readonly _configurationService: IConfigurationService </del> <ins> @IHostService private readonly hostService: IHostService </ins> ) { super(themeService);

const notificationList = this.instantiationService.createInstance(NotificationsList, notificationToast, { verticalScrollMode: ScrollbarVisibility.Hidden, widgetAriaLabel: (() => { <del> let accessibleViewHint: string | undefined; const keybinding = this._keybindingService.lookupKeybinding('editor.action.accessibleView')?.getAriaLabel(); if (this._configurationService.getValue('accessibility.verbosity.notification')) { accessibleViewHint = keybinding ? localize('chatAccessibleViewHint', "Inspect the response in the accessible view with {0}", keybinding) : localize('chatAccessibleViewHintNoKb', "Inspect the response in the accessible view via the command Open Accessible View which is currently not triggerable via keybinding"); } </del> if (!item.source) { <del> if (accessibleViewHint) { return localize('notificationAriaLabelViewHint', "{0}, notification {1}", item.message.raw, accessibleViewHint); } else { return localize('notificationAriaLabel', "{0}, notification", item.message.raw); } } if (accessibleViewHint) { return localize('notificationWithSourceAriaLabelViewHint', "{0}, source: {1}, notification {2}", item.message.raw, item.source, accessibleViewHint); } else { return localize('notificationWithSourceAriaLabel', "{0}, source: {1}, notification", item.message.raw, item.source); </del> <ins> return localize('notificationAriaLabel', "{0}, notification", item.message.raw); </ins> } <ins> return localize('notificationWithSourceAriaLabel', "{0}, source: {1}, notification", item.message.raw, item.source); </ins> })() }); itemDisposables.add(notificationList);