From 4ca9e6165c380df55b03f91761cba138782cc354 Mon Sep 17 00:00:00 2001 From: Eugene Olonov Date: Thu, 22 Oct 2026 11:24:13 -0700 Subject: [PATCH 01/10] Add styleOptions.announcementTransport to announce via ariaNotify() In 'aria-notify' mode (and 'auto' when the root element supports ariaNotify()), LiveRegionTwin computes the text of each queued entry with a small walker and calls ariaNotify() on the Web Chat root element once per entry; the twin container has no live semantics then. Default stays 'live-region'. --- .../adaptiveCard.imageAndBlocks.html | 95 ++++++++++++++ ...daptiveCard.imageAndBlocks.html.snap-1.png | Bin 0 -> 19588 bytes .../ariaNotify/adaptiveCard.inputValue.html | 120 ++++++++++++++++++ .../adaptiveCard.inputValue.html.snap-1.png | Bin 0 -> 12704 bytes .../ariaNotify/auto.supported.html | 81 ++++++++++++ .../ariaNotify/auto.supported.html.snap-1.png | Bin 0 -> 4523 bytes .../ariaNotify/auto.unsupported.html | 79 ++++++++++++ .../auto.unsupported.html.snap-1.png | Bin 0 -> 7870 bytes .../accessibility/ariaNotify/message.html | 81 ++++++++++++ .../ariaNotify/message.html.snap-1.png | Bin 0 -> 4523 bytes packages/api/src/StyleOptions.ts | 14 ++ packages/api/src/defaultStyleOptions.ts | 1 + packages/api/src/normalizeStyleOptions.ts | 16 +++ packages/component/src/Composer.tsx | 9 +- .../component/src/Utils/activityAltText.ts | 62 +-------- .../component/src/Utils/htmlInlineTagNames.ts | 60 +++++++++ .../private/LiveRegionTwinContainer.tsx | 84 +++++++++--- .../private/createLiveRegionTwinComposer.tsx | 31 ++++- .../private/getAnnouncementText.ts | 105 +++++++++++++++ 19 files changed, 758 insertions(+), 80 deletions(-) create mode 100644 __tests__/html2/accessibility/ariaNotify/adaptiveCard.imageAndBlocks.html create mode 100644 __tests__/html2/accessibility/ariaNotify/adaptiveCard.imageAndBlocks.html.snap-1.png create mode 100644 __tests__/html2/accessibility/ariaNotify/adaptiveCard.inputValue.html create mode 100644 __tests__/html2/accessibility/ariaNotify/adaptiveCard.inputValue.html.snap-1.png create mode 100644 __tests__/html2/accessibility/ariaNotify/auto.supported.html create mode 100644 __tests__/html2/accessibility/ariaNotify/auto.supported.html.snap-1.png create mode 100644 __tests__/html2/accessibility/ariaNotify/auto.unsupported.html create mode 100644 __tests__/html2/accessibility/ariaNotify/auto.unsupported.html.snap-1.png create mode 100644 __tests__/html2/accessibility/ariaNotify/message.html create mode 100644 __tests__/html2/accessibility/ariaNotify/message.html.snap-1.png create mode 100644 packages/component/src/Utils/htmlInlineTagNames.ts create mode 100644 packages/component/src/providers/LiveRegionTwin/private/getAnnouncementText.ts diff --git a/__tests__/html2/accessibility/ariaNotify/adaptiveCard.imageAndBlocks.html b/__tests__/html2/accessibility/ariaNotify/adaptiveCard.imageAndBlocks.html new file mode 100644 index 0000000000..9533db7366 --- /dev/null +++ b/__tests__/html2/accessibility/ariaNotify/adaptiveCard.imageAndBlocks.html @@ -0,0 +1,95 @@ + + + + + + +
+ + + + diff --git a/__tests__/html2/accessibility/ariaNotify/adaptiveCard.imageAndBlocks.html.snap-1.png b/__tests__/html2/accessibility/ariaNotify/adaptiveCard.imageAndBlocks.html.snap-1.png new file mode 100644 index 0000000000000000000000000000000000000000..b67b13f1778c6182814f292bdd12507a199baeb0 GIT binary patch literal 19588 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 + + + + + +
+ + + + diff --git a/__tests__/html2/accessibility/ariaNotify/adaptiveCard.inputValue.html.snap-1.png b/__tests__/html2/accessibility/ariaNotify/adaptiveCard.inputValue.html.snap-1.png new file mode 100644 index 0000000000000000000000000000000000000000..c8123e24dd1742cbec3e625d67e836435139b2fc GIT binary patch literal 12704 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 + + + + + +
+ + + + diff --git a/__tests__/html2/accessibility/ariaNotify/auto.supported.html.snap-1.png b/__tests__/html2/accessibility/ariaNotify/auto.supported.html.snap-1.png new file mode 100644 index 0000000000000000000000000000000000000000..ef7cdea98cd709c225e50b5a94a8308155c8dd5f GIT binary patch literal 4523 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 + + + + + + + +
+ + + + diff --git a/__tests__/html2/accessibility/ariaNotify/auto.unsupported.html.snap-1.png b/__tests__/html2/accessibility/ariaNotify/auto.unsupported.html.snap-1.png new file mode 100644 index 0000000000000000000000000000000000000000..055f902f1d8242531623a6854213a9969348c99c GIT binary patch literal 7870 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 NytIl`p~Pd~{{oJS2QB~r literal 0 HcmV?d00001 diff --git a/__tests__/html2/accessibility/ariaNotify/message.html b/__tests__/html2/accessibility/ariaNotify/message.html new file mode 100644 index 0000000000..c7c5e47333 --- /dev/null +++ b/__tests__/html2/accessibility/ariaNotify/message.html @@ -0,0 +1,81 @@ + + + + + + +
+ + + + diff --git a/__tests__/html2/accessibility/ariaNotify/message.html.snap-1.png b/__tests__/html2/accessibility/ariaNotify/message.html.snap-1.png new file mode 100644 index 0000000000000000000000000000000000000000..ef7cdea98cd709c225e50b5a94a8308155c8dd5f GIT binary patch literal 4523 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 { - const [{ internalLiveRegionFadeAfter }] = useStyleOptions(); + const [{ announcementTransport, internalLiveRegionFadeAfter }] = useStyleOptions(); const rootClassName = useStyleToEmotionObject()(ROOT_STYLE) + ''; const rootRef = useRef(null); const trackException = useTrackException(); @@ -137,7 +137,12 @@ const ComposerCoreUI = memo(({ children, nonce, storeDebugAPI }: ComposerCoreUIP - + {/* When is finalized, it will be using an independent instance that lives inside . */} diff --git a/packages/component/src/Utils/activityAltText.ts b/packages/component/src/Utils/activityAltText.ts index bb7131f8e2..fca220635a 100644 --- a/packages/component/src/Utils/activityAltText.ts +++ b/packages/component/src/Utils/activityAltText.ts @@ -1,3 +1,4 @@ +import htmlInlineTagNames from './htmlInlineTagNames'; import textFormatToContentType from './textFormatToContentType'; function walk(root: Node, walker: (node: T) => string[]): string[] { @@ -15,65 +16,6 @@ function walk(root: Node, walker: (node: T) => string[]): string return results; } -// From https://developer.mozilla.org/en-US/docs/Web/HTML/Inline_elements -const HTML_INLINE_TAGS = [ - 'A', - 'ABBR', - 'ACRONYM', - 'AUDIO', - 'B', - 'BDI', - 'BDO', - 'BIG', - 'BR', - 'BUTTON', - 'CANVAS', - 'CITE', - 'CODE', - 'DATA', - 'DATALIST', - 'DEL', - 'DFN', - 'EM', - 'EMBED', - 'I', - 'IFRAME', - 'IMG', - 'INPUT', - 'INS', - 'KBD', - 'LABEL', - 'MAP', - 'MARK', - 'METER', - 'NOSCRIPT', - 'OBJECT', - 'OUTPUT', - 'PICTURE', - 'PROGRESS', - 'Q', - 'RUBY', - 'S', - 'SAMP', - 'SCRIPT', - 'SELECT', - 'SLOT', - 'SMALL', - 'SPAN', - 'STRONG', - 'SUB', - 'SUP', - 'SVG', - 'TEMPLATE', - 'TEXTAREA', - 'TIME', - 'U', - 'TT', - 'VAR', - 'VIDEO', - 'WBR' -]; - /** * Computes all text from the descendants of a given HTML node, such as a document, as flattened array. This is best-effort. * @@ -90,7 +32,7 @@ function htmlTextAlternatives(root: Node): string[] { return [textContent]; } else if (tagName === 'IMG') { return [node.getAttribute('alt')]; - } else if (!HTML_INLINE_TAGS.includes(tagName)) { + } else if (!htmlInlineTagNames.includes(tagName)) { return ['\n']; } }); diff --git a/packages/component/src/Utils/htmlInlineTagNames.ts b/packages/component/src/Utils/htmlInlineTagNames.ts new file mode 100644 index 0000000000..d0c7198cbb --- /dev/null +++ b/packages/component/src/Utils/htmlInlineTagNames.ts @@ -0,0 +1,60 @@ +// From https://developer.mozilla.org/en-US/docs/Web/HTML/Inline_elements +const htmlInlineTagNames: readonly string[] = Object.freeze([ + 'A', + 'ABBR', + 'ACRONYM', + 'AUDIO', + 'B', + 'BDI', + 'BDO', + 'BIG', + 'BR', + 'BUTTON', + 'CANVAS', + 'CITE', + 'CODE', + 'DATA', + 'DATALIST', + 'DEL', + 'DFN', + 'EM', + 'EMBED', + 'I', + 'IFRAME', + 'IMG', + 'INPUT', + 'INS', + 'KBD', + 'LABEL', + 'MAP', + 'MARK', + 'METER', + 'NOSCRIPT', + 'OBJECT', + 'OUTPUT', + 'PICTURE', + 'PROGRESS', + 'Q', + 'RUBY', + 'S', + 'SAMP', + 'SCRIPT', + 'SELECT', + 'SLOT', + 'SMALL', + 'SPAN', + 'STRONG', + 'SUB', + 'SUP', + 'SVG', + 'TEMPLATE', + 'TEXTAREA', + 'TIME', + 'U', + 'TT', + 'VAR', + 'VIDEO', + 'WBR' +]); + +export default htmlInlineTagNames; diff --git a/packages/component/src/providers/LiveRegionTwin/private/LiveRegionTwinContainer.tsx b/packages/component/src/providers/LiveRegionTwin/private/LiveRegionTwinContainer.tsx index 9c4f4e887b..101682acbc 100644 --- a/packages/component/src/providers/LiveRegionTwin/private/LiveRegionTwinContainer.tsx +++ b/packages/component/src/providers/LiveRegionTwin/private/LiveRegionTwinContainer.tsx @@ -1,15 +1,35 @@ -import { validateProps } from '@msinternal/botframework-webchat-react-valibot'; -import React, { Fragment } from 'react'; -import { literal, object, optional, pipe, readonly, string, union, type InferInput } from 'valibot'; +import { validateProps, type InferReactProps } from '@msinternal/botframework-webchat-react-valibot'; +import React, { Fragment, useEffect, useRef, useState } from 'react'; +import { + function_, + instance, + is, + literal, + nullable, + object, + optional, + picklist, + pipe, + readonly, + string, + union +} from 'valibot'; +import refObject from '../../../types/internal/refObject'; +import getAnnouncementText from './getAnnouncementText'; import useMarkAllAsRenderedEffect from './useMarkAllAsRenderedEffect'; import useStaticElementEntries from './useStaticElementEntries'; +// `ariaNotify()` is not in the DOM typings of TypeScript yet. +const ariaNotifiableSchema = object({ ariaNotify: function_() }); + const liveRegionTwinContainerPropsSchema = pipe( object({ + announcementTransport: picklist(['auto', 'aria-notify', 'live-region']), 'aria-label': optional(string()), 'aria-live': union([literal('assertive'), literal('polite')]), 'aria-roledescription': optional(string()), + ariaNotifyTargetRef: refObject(nullable(instance(HTMLElement))), className: optional(string()), role: optional(string()), textElementClassName: optional(string()) @@ -17,45 +37,77 @@ const liveRegionTwinContainerPropsSchema = pipe( readonly() ); -type LiveRegionTwinContainerProps = InferInput; +type LiveRegionTwinContainerProps = InferReactProps; // This container is marked as private because we assume there is only one instance under the . function LiveRegionTwinContainer(props: LiveRegionTwinContainerProps) { const { + announcementTransport, 'aria-label': ariaLabel, 'aria-live': ariaLive, 'aria-roledescription': ariaRoleDescription, + ariaNotifyTargetRef, className, role, textElementClassName } = validateProps(liveRegionTwinContainerPropsSchema, props); + const [ariaNotifySupported, setAriaNotifySupported] = useState(false); const [staticElementEntries] = useStaticElementEntries(); + const containerRef = useRef(null); + const lastNotifiedKeyRef = useRef(0); + + const transport = + announcementTransport === 'auto' ? (ariaNotifySupported ? 'aria-notify' : 'live-region') : announcementTransport; // We assume there is only one instance under the . // The assumption made us safe to mark everything is rendered. // In contrary, if we have 0-to-many at different time, we may falsely mark something as rendered. useMarkAllAsRenderedEffect(); + // Detects per instance, on the root element: Web Chat could be rendered in another document, such as an iframe or a popup window. + // React attaches the ref of the root element after layout effects of its descendants, so only passive effects can read it on mount. + useEffect(() => setAriaNotifySupported(is(ariaNotifiableSchema, ariaNotifyTargetRef.current)), [ariaNotifyTargetRef]); + + // Keys are increasing: entries with a key above the last notified one are new, in queue order, and are notified once, also when React runs effects twice. + useEffect(() => { + const { current: target } = ariaNotifyTargetRef; + + transport === 'aria-notify' && + staticElementEntries.forEach(({ key }, index) => { + if (key > lastNotifiedKeyRef.current) { + // When notifying, every entry is rendered in its own element, in queue order. + const text = getAnnouncementText(containerRef.current.children.item(index)); + + lastNotifiedKeyRef.current = key; + + text && is(ariaNotifiableSchema, target) && target.ariaNotify(text, { priority: 'normal' }); + } + }); + }, [ariaNotifyTargetRef, staticElementEntries, transport]); + + // When notifying, entries are only rendered to compute their text: the container has no live semantics and is hidden from screen readers, so each entry is announced once. return (
- {staticElementEntries.map(({ element, key }) => { - if (typeof element === 'string') { - return ( -
- {element} -
- ); - } - - return {element}; - })} + {staticElementEntries.map(({ element, key }) => + transport === 'aria-notify' ? ( +
{element}
+ ) : typeof element === 'string' ? ( +
+ {element} +
+ ) : ( + {element} + ) + )}
); } diff --git a/packages/component/src/providers/LiveRegionTwin/private/createLiveRegionTwinComposer.tsx b/packages/component/src/providers/LiveRegionTwin/private/createLiveRegionTwinComposer.tsx index 7a59585c1f..8d938a60cd 100644 --- a/packages/component/src/providers/LiveRegionTwin/private/createLiveRegionTwinComposer.tsx +++ b/packages/component/src/providers/LiveRegionTwin/private/createLiveRegionTwinComposer.tsx @@ -1,5 +1,15 @@ import { hooks } from 'botframework-webchat-api'; -import React, { memo, useCallback, useEffect, useMemo, useRef, useState, type Context, type ReactNode } from 'react'; +import React, { + memo, + useCallback, + useEffect, + useMemo, + useRef, + useState, + type Context, + type ReactNode, + type RefObject +} from 'react'; import { useRefFrom } from 'use-ref-from'; import { type LiveRegionTwinContextType } from './LiveRegionTwinComposer'; @@ -9,6 +19,7 @@ import type { StaticElement, StaticElementEntry } from './types'; const { usePonyfill } = hooks; +const DEFAULT_ANNOUNCEMENT_TRANSPORT = 'live-region'; const DEFAULT_ARIA_LIVE = 'polite'; const DEFAULT_FADE_AFTER = 1000; @@ -22,6 +33,18 @@ type LiveRegionTwinComposerProps = Readonly<{ /** Optional "aria-roledescription" attribute for the live region twin container. */ 'aria-roledescription'?: string; + /** + * How static elements are announced, defaults to `'live-region'`: + * + * - `'live-region'` - rendered in the container with the `aria-live` attribute + * - `'aria-notify'` - their text is sent via `ariaNotify()` on the element of `ariaNotifyTargetRef`, the container has no live semantics + * - `'auto'` - `'aria-notify'` if the element of `ariaNotifyTargetRef` supports `ariaNotify()`, otherwise `'live-region'` + */ + announcementTransport?: 'auto' | 'aria-notify' | 'live-region' | undefined; + + /** Element to call `ariaNotify()` on, such as the root element of Web Chat. */ + ariaNotifyTargetRef: RefObject; + /** Optional "className" attribute for the live region twin container. */ className?: string; @@ -45,7 +68,7 @@ type LiveRegionTwinComposerProps = Readonly<{ /** * Live region twin is an UI component for queueing texts or elements to the screen reader using - * a container element with `aria-live` attribute set. + * a container element with `aria-live` attribute set, or `ariaNotify()` (see `announcementTransport`). * * After the text is rendered and queued, it will be removed to reduce burden on the DOM tree. * Currently, we assume the assistive technologies should pick up the text within 1 second of rendering. @@ -56,9 +79,11 @@ type LiveRegionTwinComposerProps = Readonly<{ */ const createLiveRegionTwinComposer = ({ Provider }: Context) => { const LiveRegionTwinComposer = ({ + announcementTransport = DEFAULT_ANNOUNCEMENT_TRANSPORT, 'aria-label': ariaLabel, 'aria-live': ariaLive = DEFAULT_ARIA_LIVE, 'aria-roledescription': ariaRoleDescription, + ariaNotifyTargetRef, children, className, fadeAfter = DEFAULT_FADE_AFTER, @@ -135,9 +160,11 @@ const createLiveRegionTwinComposer = ({ Provider }: Context , which is read as text. +const INPUT_TYPES_WITHOUT_TEXT_VALUE: readonly string[] = Object.freeze(['checkbox', 'file', 'radio']); + +// Inline elements that screen readers read as their own items, e.g. buttons next to each other: "USA Japan", not "USAJapan". +const SEPARATED_INLINE_TAG_NAMES: readonly string[] = Object.freeze([ + 'BR', + 'BUTTON', + 'IMG', + 'INPUT', + 'SELECT', + 'TEXTAREA' +]); + +const SKIPPED_TAG_NAMES: readonly string[] = Object.freeze(['NOSCRIPT', 'SCRIPT', 'STYLE', 'TEMPLATE']); + +function isElement(node: Node): node is Element { + return node.nodeType === Node.ELEMENT_NODE; +} + +function isInputElement(element: Element): element is HTMLInputElement { + return element.tagName === 'INPUT'; +} + +function isSelectElement(element: Element): element is HTMLSelectElement { + return element.tagName === 'SELECT'; +} + +function isTextAreaElement(element: Element): element is HTMLTextAreaElement { + return element.tagName === 'TEXTAREA'; +} + +// Name from `aria-labelledby`, then `aria-label`, as screen readers read controls and images in the live region. +function getLabel(element: Element): string { + return ( + (element.getAttribute('aria-labelledby') || '') + .split(/\s+/u) + .map(id => (id && element.ownerDocument.getElementById(id)?.textContent) || '') + .join(' ') + .trim() || + element.getAttribute('aria-label')?.trim() || + '' + ); +} + +function getControlText(element: Element, label: string): string { + const name = label || element.getAttribute('placeholder') || element.getAttribute('title') || ''; + const value = isInputElement(element) + ? INPUT_TYPES_WITHOUT_TEXT_VALUE.includes(element.type) + ? '' + : element.value + : isSelectElement(element) + ? Array.from(element.selectedOptions, ({ text }) => text).join(' ') + : isTextAreaElement(element) + ? element.value + : ''; + + // A