From 2affc5230f8fb46f2981f7e7ff48b9c592c842c3 Mon Sep 17 00:00:00 2001 From: Yegor Date: Wed, 17 Apr 2024 09:49:07 -0700 Subject: [PATCH] [web] move AccessibilityAnnouncements into SemanticsOwner (flutter/engine#52138) Move `AccessibilityAnnouncements` into `SemanticsOwner`, effectively making it a singleton (because `SemanticsOwner` is). Fixes https://github.com/flutter/flutter/issues/139272 --- .../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 | 6 ++--- 7 files changed, 45 insertions(+), 26 deletions(-) diff --git a/engine/src/flutter/lib/web_ui/lib/src/engine/platform_dispatcher.dart b/engine/src/flutter/lib/web_ui/lib/src/engine/platform_dispatcher.dart index 868ceab4c8d..8cdb6d19bdd 100644 --- a/engine/src/flutter/lib/web_ui/lib/src/engine/platform_dispatcher.dart +++ b/engine/src/flutter/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/engine/src/flutter/lib/web_ui/lib/src/engine/semantics/live_region.dart b/engine/src/flutter/lib/web_ui/lib/src/engine/semantics/live_region.dart index cd0002f49b5..9669f72d8f1 100644 --- a/engine/src/flutter/lib/web_ui/lib/src/engine/semantics/live_region.dart +++ b/engine/src/flutter/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/engine/src/flutter/lib/web_ui/lib/src/engine/semantics/semantics.dart b/engine/src/flutter/lib/web_ui/lib/src/engine/semantics/semantics.dart index 3d10056c20f..a62f99eef1e 100644 --- a/engine/src/flutter/lib/web_ui/lib/src/engine/semantics/semantics.dart +++ b/engine/src/flutter/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/engine/src/flutter/lib/web_ui/lib/src/engine/view_embedder/dom_manager.dart b/engine/src/flutter/lib/web_ui/lib/src/engine/view_embedder/dom_manager.dart index 22d7cb372d1..52de171182e 100644 --- a/engine/src/flutter/lib/web_ui/lib/src/engine/view_embedder/dom_manager.dart +++ b/engine/src/flutter/lib/web_ui/lib/src/engine/view_embedder/dom_manager.dart @@ -26,8 +26,6 @@ import 'style_manager.dart'; /// | | | | /// | | | +- /// | | | -/// | | +- [announcementsHost] -/// | | | /// | | +-