Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.

Commit e55ca3b

Browse files
committed
Move the accesibility placeholder to the platform dispatcher.
1 parent a190775 commit e55ca3b

File tree

6 files changed

+39
-29
lines changed

6 files changed

+39
-29
lines changed

lib/web_ui/lib/src/engine/platform_dispatcher.dart

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import 'dart:convert';
77
import 'dart:js_interop';
88
import 'dart:typed_data';
99

10+
import 'package:meta/meta.dart';
1011
import 'package:ui/ui.dart' as ui;
1112
import 'package:ui/ui_web/src/ui_web.dart' as ui_web;
1213

@@ -79,6 +80,7 @@ class EnginePlatformDispatcher extends ui.PlatformDispatcher {
7980
registerHotRestartListener(dispose);
8081
AppLifecycleState.instance.addListener(_setAppLifecycleState);
8182
ViewFocusBinding.instance.addListener(invokeOnViewFocusChange);
83+
domDocument.body?.append(accessibilityPlaceholder);
8284
_onViewDisposedListener = viewManager.onViewDisposed.listen((_) {
8385
// Send a metrics changed event to the framework when a view is disposed.
8486
// View creation/resize is handled by the `_didResize` handler in the
@@ -93,6 +95,12 @@ class EnginePlatformDispatcher extends ui.PlatformDispatcher {
9395
static EnginePlatformDispatcher get instance => _instance;
9496
static final EnginePlatformDispatcher _instance = EnginePlatformDispatcher();
9597

98+
@visibleForTesting
99+
final DomElement accessibilityPlaceholder = EngineSemantics
100+
.instance
101+
.semanticsHelper
102+
.prepareAccessibilityPlaceholder();
103+
96104
PlatformConfiguration configuration = PlatformConfiguration(
97105
locales: parseBrowserLanguages(),
98106
textScaleFactor: findBrowserTextScaleFactor(),
@@ -116,6 +124,7 @@ class EnginePlatformDispatcher extends ui.PlatformDispatcher {
116124
HighContrastSupport.instance.removeListener(_updateHighContrast);
117125
AppLifecycleState.instance.removeListener(_setAppLifecycleState);
118126
ViewFocusBinding.instance.removeListener(invokeOnViewFocusChange);
127+
accessibilityPlaceholder.remove();
119128
_onViewDisposedListener.cancel();
120129
viewManager.dispose();
121130
}

lib/web_ui/lib/src/engine/view_embedder/dom_manager.dart

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ import '../configuration.dart';
88
import '../dom.dart';
99
import '../platform_views/content_manager.dart';
1010
import '../safe_browser_api.dart';
11-
import '../semantics/semantics.dart';
1211
import 'style_manager.dart';
1312

1413
/// Manages DOM elements and the DOM structure for a [ui.FlutterView].
@@ -71,11 +70,6 @@ class DomManager {
7170

7271
// Rendering host (shadow root) children.
7372

74-
final DomElement accessibilityPlaceholder = EngineSemantics
75-
.instance.semanticsHelper
76-
.prepareAccessibilityPlaceholder();
77-
78-
renderingHost.append(accessibilityPlaceholder);
7973
renderingHost.append(sceneHost);
8074
renderingHost.append(announcementsHost);
8175

lib/web_ui/test/engine/platform_dispatcher/platform_dispatcher_test.dart

Lines changed: 24 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,16 @@ void testMain() {
2222
});
2323

2424
group('PlatformDispatcher', () {
25+
late EnginePlatformDispatcher dispatcher;
26+
27+
setUp(() {
28+
dispatcher = EnginePlatformDispatcher();
29+
});
30+
31+
tearDown(() {
32+
dispatcher.dispose();
33+
});
34+
2535
test('reports at least one display', () {
2636
expect(ui.PlatformDispatcher.instance.displays.length, greaterThan(0));
2737
});
@@ -30,15 +40,16 @@ void testMain() {
3040
final MockHighContrastSupport mockHighContrast =
3141
MockHighContrastSupport();
3242
HighContrastSupport.instance = mockHighContrast;
33-
final EnginePlatformDispatcher engineDispatcher =
43+
44+
final EnginePlatformDispatcher dispatcher =
3445
EnginePlatformDispatcher();
3546

36-
expect(engineDispatcher.accessibilityFeatures.highContrast, isTrue);
47+
expect(dispatcher.accessibilityFeatures.highContrast, isTrue);
3748
mockHighContrast.isEnabled = false;
3849
mockHighContrast.invokeListeners(mockHighContrast.isEnabled);
39-
expect(engineDispatcher.accessibilityFeatures.highContrast, isFalse);
50+
expect(dispatcher.accessibilityFeatures.highContrast, isFalse);
4051

41-
engineDispatcher.dispose();
52+
dispatcher.dispose();
4253
});
4354

4455
test('AppLifecycleState transitions through all states', () {
@@ -295,7 +306,6 @@ void testMain() {
295306
});
296307

297308
test('disposes all its views', () {
298-
final EnginePlatformDispatcher dispatcher = EnginePlatformDispatcher();
299309
final EngineFlutterView view1 =
300310
EngineFlutterView(dispatcher, createDomHTMLDivElement());
301311
final EngineFlutterView view2 =
@@ -319,7 +329,6 @@ void testMain() {
319329
});
320330

321331
test('connects view disposal to metrics changed event', () {
322-
final EnginePlatformDispatcher dispatcher = EnginePlatformDispatcher();
323332
final EngineFlutterView view1 =
324333
EngineFlutterView(dispatcher, createDomHTMLDivElement());
325334
final EngineFlutterView view2 =
@@ -347,7 +356,6 @@ void testMain() {
347356
});
348357

349358
test('disconnects view disposal event on dispose', () {
350-
final EnginePlatformDispatcher dispatcher = EnginePlatformDispatcher();
351359
final EngineFlutterView view1 =
352360
EngineFlutterView(dispatcher, createDomHTMLDivElement());
353361

@@ -367,7 +375,6 @@ void testMain() {
367375
});
368376

369377
test('invokeOnViewFocusChange calls onViewFocusChange', () {
370-
final EnginePlatformDispatcher dispatcher = EnginePlatformDispatcher();
371378
final List<ui.ViewFocusEvent> dispatchedViewFocusEvents = <ui.ViewFocusEvent>[];
372379
const ui.ViewFocusEvent viewFocusEvent = ui.ViewFocusEvent(
373380
viewId: 0,
@@ -383,7 +390,6 @@ void testMain() {
383390
});
384391

385392
test('invokeOnViewFocusChange preserves the zone', () {
386-
final EnginePlatformDispatcher dispatcher = EnginePlatformDispatcher();
387393
final Zone zone1 = Zone.current.fork();
388394
final Zone zone2 = Zone.current.fork();
389395
const ui.ViewFocusEvent viewFocusEvent = ui.ViewFocusEvent(
@@ -402,6 +408,15 @@ void testMain() {
402408
dispatcher.invokeOnViewFocusChange(viewFocusEvent);
403409
});
404410
});
411+
412+
test('appends an accesibility placeholder', () {
413+
expect(dispatcher.accessibilityPlaceholder.isConnected, isTrue);
414+
});
415+
416+
test('removes the accesibility placeholder', () {
417+
dispatcher.dispose();
418+
expect(dispatcher.accessibilityPlaceholder.isConnected, isFalse);
419+
});
405420
});
406421
}
407422

lib/web_ui/test/engine/semantics/semantics_auto_enable_test.dart

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -31,11 +31,7 @@ Future<void> testMain() async {
3131
.instance.accessibilityFeatures.accessibleNavigation,
3232
isFalse);
3333

34-
final DomShadowRoot renderingHost =
35-
EnginePlatformDispatcher.instance.implicitView!.dom.renderingHost;
36-
37-
final DomElement placeholder =
38-
renderingHost.querySelector('flt-semantics-placeholder')!;
34+
final DomElement placeholder = domDocument.querySelector('flt-semantics-placeholder')!;
3935

4036
expect(placeholder.isConnected, isTrue);
4137

lib/web_ui/test/engine/semantics/semantics_placeholder_enable_test.dart

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,7 @@ Future<void> testMain() async {
2626
expect(semantics().semanticsEnabled, isFalse);
2727

2828
// Synthesize a click on the placeholder.
29-
final DomShadowRoot renderingHost =
30-
EnginePlatformDispatcher.instance.implicitView!.dom.renderingHost;
31-
final DomElement placeholder =
32-
renderingHost.querySelector('flt-semantics-placeholder')!;
29+
final DomElement placeholder = domDocument.querySelector('flt-semantics-placeholder')!;
3330

3431
expect(placeholder.isConnected, isTrue);
3532

lib/web_ui/test/engine/view_embedder/dom_manager_test.dart

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -39,11 +39,10 @@ void doTests() {
3939
expect(rootChildren[3].tagName, equalsIgnoringCase('style'));
4040

4141
final List<DomElement> shadowChildren = domManager.renderingHost.childNodes.cast<DomElement>().toList();
42-
expect(shadowChildren.length, 4);
43-
expect(shadowChildren[0].tagName, equalsIgnoringCase('flt-semantics-placeholder'));
44-
expect(shadowChildren[1], domManager.sceneHost);
45-
expect(shadowChildren[2], domManager.announcementsHost);
46-
expect(shadowChildren[3].tagName, equalsIgnoringCase('style'));
42+
expect(shadowChildren.length, 3);
43+
expect(shadowChildren[0], domManager.sceneHost);
44+
expect(shadowChildren[1], domManager.announcementsHost);
45+
expect(shadowChildren[2].tagName, equalsIgnoringCase('style'));
4746
});
4847

4948
test('hide placeholder text for textfield', () {

0 commit comments

Comments
 (0)