diff --git a/lib/web_ui/lib/src/engine/platform_dispatcher/view_focus_binding.dart b/lib/web_ui/lib/src/engine/platform_dispatcher/view_focus_binding.dart index 4ec158546337b..3a10c4ab723c9 100644 --- a/lib/web_ui/lib/src/engine/platform_dispatcher/view_focus_binding.dart +++ b/lib/web_ui/lib/src/engine/platform_dispatcher/view_focus_binding.dart @@ -3,6 +3,7 @@ // found in the LICENSE file. import 'dart:async'; +import 'package:meta/meta.dart'; import 'package:ui/src/engine.dart'; import 'package:ui/ui.dart' as ui; @@ -10,6 +11,13 @@ import 'package:ui/ui.dart' as ui; final class ViewFocusBinding { ViewFocusBinding(this._viewManager, this._onViewFocusChange); + + /// Wether [FlutterView] focus changes will be reported and performed. + /// + /// DO NOT rely on this bit as it will go away soon. You're warned :)! + @visibleForTesting + static bool isEnabled = false; + final FlutterViewManager _viewManager; final ui.ViewFocusChangeCallback _onViewFocusChange; @@ -35,6 +43,9 @@ final class ViewFocusBinding { } void changeViewFocus(int viewId, ui.ViewFocusState state) { + if (!isEnabled) { + return; + } final DomElement? viewElement = _viewManager[viewId]?.dom.rootElement; if (state == ui.ViewFocusState.focused) { @@ -69,6 +80,10 @@ final class ViewFocusBinding { }); void _handleFocusChange(DomElement? focusedElement) { + if (!isEnabled) { + return; + } + final int? viewId = _viewId(focusedElement); if (viewId == _lastViewId) { return; diff --git a/lib/web_ui/test/engine/platform_dispatcher/view_focus_binding_test.dart b/lib/web_ui/test/engine/platform_dispatcher/view_focus_binding_test.dart index 419de687ac66e..b2f947bd7c8e8 100644 --- a/lib/web_ui/test/engine/platform_dispatcher/view_focus_binding_test.dart +++ b/lib/web_ui/test/engine/platform_dispatcher/view_focus_binding_test.dart @@ -17,14 +17,18 @@ void testMain() { late EnginePlatformDispatcher dispatcher; setUp(() { - domDocument.activeElement?.blur(); - EngineSemantics.instance.semanticsEnabled = false; + ViewFocusBinding.isEnabled = true; dispatcher = EnginePlatformDispatcher.instance; dispatchedViewFocusEvents = []; dispatcher.onViewFocusChange = dispatchedViewFocusEvents.add; }); + tearDown(() { + ViewFocusBinding.isEnabled = false; + EngineSemantics.instance.semanticsEnabled = false; + }); + test('The view is focusable and reachable by keyboard when registered', () async { final EngineFlutterView view = createAndRegisterView(dispatcher);