From 744fb055e54587d9a5b58513f7cd550dfb68cf32 Mon Sep 17 00:00:00 2001 From: Yegor Jbanov Date: Mon, 15 Apr 2024 15:08:59 -0700 Subject: [PATCH 1/2] [web] move AccessibilityAnnouncements into SemanticsOwner --- .../lib/src/engine/platform_dispatcher.dart | 7 +++--- .../lib/src/engine/semantics/live_region.dart | 3 +-- .../lib/src/engine/semantics/semantics.dart | 14 +++++++++++ .../src/engine/view_embedder/dom_manager.dart | 12 ---------- lib/web_ui/lib/src/engine/window.dart | 5 ---- .../test/engine/semantics/semantics_test.dart | 24 +++++++++++++++++++ .../view_embedder/dom_manager_test.dart | 2 -- 7 files changed, 43 insertions(+), 24 deletions(-) diff --git a/lib/web_ui/lib/src/engine/platform_dispatcher.dart b/lib/web_ui/lib/src/engine/platform_dispatcher.dart index 868ceab4c8dcd..8cdb6d19bddbc 100644 --- a/lib/web_ui/lib/src/engine/platform_dispatcher.dart +++ b/lib/web_ui/lib/src/engine/platform_dispatcher.dart @@ -688,9 +688,10 @@ class EnginePlatformDispatcher extends ui.PlatformDispatcher { case 'flutter/accessibility': // In widget tests we want to bypass processing of platform messages. const StandardMessageCodec codec = StandardMessageCodec(); - // TODO(yjbanov): Dispatch the announcement to the correct view? - // https://github.com/flutter/flutter/issues/137445 - implicitView?.accessibilityAnnouncements.handleMessage(codec, data); + final EngineSemantics semantics = EngineSemantics.instance; + if (semantics.semanticsEnabled) { + semantics.accessibilityAnnouncements.handleMessage(codec, data); + } replyToPlatformMessage(callback, codec.encodeMessage(true)); return; diff --git a/lib/web_ui/lib/src/engine/semantics/live_region.dart b/lib/web_ui/lib/src/engine/semantics/live_region.dart index cd0002f49b575..9669f72d8f1dc 100644 --- a/lib/web_ui/lib/src/engine/semantics/live_region.dart +++ b/lib/web_ui/lib/src/engine/semantics/live_region.dart @@ -4,7 +4,6 @@ import 'package:meta/meta.dart'; -import '../platform_dispatcher.dart'; import 'accessibility.dart'; import 'label_and_value.dart'; import 'semantics.dart'; @@ -32,7 +31,7 @@ class LiveRegion extends RoleManager { AccessibilityAnnouncements get _accessibilityAnnouncements => _accessibilityAnnouncementsOverride ?? - EnginePlatformDispatcher.instance.implicitView!.accessibilityAnnouncements; + EngineSemantics.instance.accessibilityAnnouncements; @override void update() { diff --git a/lib/web_ui/lib/src/engine/semantics/semantics.dart b/lib/web_ui/lib/src/engine/semantics/semantics.dart index 3d10056c20fa6..a62f99eef1e41 100644 --- a/lib/web_ui/lib/src/engine/semantics/semantics.dart +++ b/lib/web_ui/lib/src/engine/semantics/semantics.dart @@ -18,6 +18,7 @@ import '../platform_dispatcher.dart'; import '../util.dart'; import '../vector_math.dart'; import '../window.dart'; +import 'accessibility.dart'; import 'checkable.dart'; import 'dialog.dart'; import 'focusable.dart'; @@ -1938,6 +1939,19 @@ class EngineSemantics { static EngineSemantics? _instance; + /// The tag name for the accessibility announcements host. + static const String announcementsHostTagName = 'flt-announcement-host'; + + /// Implements verbal accessibility announcements. + final AccessibilityAnnouncements accessibilityAnnouncements = + AccessibilityAnnouncements(hostElement: _initializeAccessibilityAnnouncementHost()); + + static DomElement _initializeAccessibilityAnnouncementHost() { + final DomElement host = createDomElement(announcementsHostTagName); + domDocument.body!.append(host); + return host; + } + /// Disables semantics and uninitializes the singleton [instance]. /// /// Instances of [EngineSemanticsOwner] are no longer valid after calling this diff --git a/lib/web_ui/lib/src/engine/view_embedder/dom_manager.dart b/lib/web_ui/lib/src/engine/view_embedder/dom_manager.dart index 22d7cb372d106..52de171182e71 100644 --- a/lib/web_ui/lib/src/engine/view_embedder/dom_manager.dart +++ b/lib/web_ui/lib/src/engine/view_embedder/dom_manager.dart @@ -26,8 +26,6 @@ import 'style_manager.dart'; /// | | | | /// | | | +- /// | | | -/// | | +- [announcementsHost] -/// | | | /// | | +-