From ecbc70579aa39f758d85ccf5ad2ebbe29d5a039e Mon Sep 17 00:00:00 2001 From: Nurhan Turgut <50856934+nturgut@users.noreply.github.com> Date: Wed, 27 Nov 2019 14:53:48 -0800 Subject: [PATCH] more tests for enabling semantics (flutter/engine#14060) * more tests for enabling semantics * addressing pr comments --- .../web_ui/lib/src/engine/dom_renderer.dart | 2 +- .../lib/src/engine/semantics/semantics.dart | 4 ++-- .../engine/semantics/semantics_helper.dart | 18 ++++++++++----- engine/src/flutter/lib/web_ui/pubspec.yaml | 1 + .../test/engine/semantics/semantics_test.dart | 23 +++++++++++++++++++ 5 files changed, 39 insertions(+), 9 deletions(-) diff --git a/engine/src/flutter/lib/web_ui/lib/src/engine/dom_renderer.dart b/engine/src/flutter/lib/web_ui/lib/src/engine/dom_renderer.dart index 90c10b40d55..a7f6ac1d4cc 100644 --- a/engine/src/flutter/lib/web_ui/lib/src/engine/dom_renderer.dart +++ b/engine/src/flutter/lib/web_ui/lib/src/engine/dom_renderer.dart @@ -390,7 +390,7 @@ flt-glass-pane * { _glassPaneElement.append(_sceneHostElement); final html.Element _accesibilityPlaceholder = EngineSemanticsOwner - .instance.enableSemantics + .instance.semanticsHelper .prepareAccesibilityPlaceholder(); // Insert the semantics placeholder after the scene host. For all widgets 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 17f30262939..f1f55f0c719 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 @@ -1198,7 +1198,7 @@ class EngineSemanticsOwner { _now = () => DateTime.now(); } - final SemanticsHelper enableSemantics = SemanticsHelper(); + final SemanticsHelper semanticsHelper = SemanticsHelper(); /// Whether the user has requested that [updateSemantics] be called when /// the semantic contents of window changes. @@ -1346,7 +1346,7 @@ class EngineSemanticsOwner { _temporarilyDisableBrowserGestureMode(); } - return enableSemantics.shouldEnableSemantics(event); + return semanticsHelper.shouldEnableSemantics(event); } /// Callbacks called when the [GestureMode] changes. diff --git a/engine/src/flutter/lib/web_ui/lib/src/engine/semantics/semantics_helper.dart b/engine/src/flutter/lib/web_ui/lib/src/engine/semantics/semantics_helper.dart index bdcc87f05ac..d7ce9ae9c65 100644 --- a/engine/src/flutter/lib/web_ui/lib/src/engine/semantics/semantics_helper.dart +++ b/engine/src/flutter/lib/web_ui/lib/src/engine/semantics/semantics_helper.dart @@ -36,19 +36,25 @@ String placeholderMessage = 'Enable accessibility'; /// /// See [DesktopSemanticsEnabler], [MobileSemanticsEnabler]. class SemanticsHelper { - final _SemanticsEnabler _enableSemantics = + SemanticsEnabler _semanticsEnabler = isDesktop ? DesktopSemanticsEnabler() : MobileSemanticsEnabler(); + @visibleForTesting + set semanticsEnabler(SemanticsEnabler semanticsEnabler) { + this._semanticsEnabler = semanticsEnabler; + } + bool shouldEnableSemantics(html.Event event) { - return _enableSemantics.shouldEnableSemantics(event); + return _semanticsEnabler.shouldEnableSemantics(event); } html.Element prepareAccesibilityPlaceholder() { - return _enableSemantics.prepareAccesibilityPlaceholder(); + return _semanticsEnabler.prepareAccesibilityPlaceholder(); } } -abstract class _SemanticsEnabler { +@visibleForTesting +abstract class SemanticsEnabler { /// Whether to enable semantics. /// /// Semantics should be enabled if the web engine is no longer waiting for @@ -89,7 +95,7 @@ abstract class _SemanticsEnabler { } @visibleForTesting -class DesktopSemanticsEnabler extends _SemanticsEnabler { +class DesktopSemanticsEnabler extends SemanticsEnabler { /// We do not immediately enable semantics when the user requests it, but /// instead wait for a short period of time before doing it. This is because /// the request comes as an event targeted on the [_semanticsPlaceholder]. @@ -212,7 +218,7 @@ class DesktopSemanticsEnabler extends _SemanticsEnabler { } @visibleForTesting -class MobileSemanticsEnabler extends _SemanticsEnabler { +class MobileSemanticsEnabler extends SemanticsEnabler { /// We do not immediately enable semantics when the user requests it, but /// instead wait for a short period of time before doing it. This is because /// the request comes as an event targeted on the [_semanticsPlaceholder]. diff --git a/engine/src/flutter/lib/web_ui/pubspec.yaml b/engine/src/flutter/lib/web_ui/pubspec.yaml index 15c6e879055..b74bacbf809 100644 --- a/engine/src/flutter/lib/web_ui/pubspec.yaml +++ b/engine/src/flutter/lib/web_ui/pubspec.yaml @@ -10,6 +10,7 @@ dependencies: dev_dependencies: http: 0.12.0+2 image: 2.1.4 + mockito: 4.1.1 path: 1.6.4 test: 1.6.5 quiver: 2.0.5 diff --git a/engine/src/flutter/lib/web_ui/test/engine/semantics/semantics_test.dart b/engine/src/flutter/lib/web_ui/test/engine/semantics/semantics_test.dart index c2c2395b7fe..892e19b247f 100644 --- a/engine/src/flutter/lib/web_ui/test/engine/semantics/semantics_test.dart +++ b/engine/src/flutter/lib/web_ui/test/engine/semantics/semantics_test.dart @@ -6,6 +6,7 @@ import 'dart:async'; import 'dart:html' as html; import 'dart:typed_data'; +import 'package:mockito/mockito.dart'; import 'package:quiver/testing/async.dart'; import 'package:test/test.dart'; @@ -190,8 +191,30 @@ void _testEngineSemanticsOwner() { semantics().semanticsEnabled = false; }); }); + test('checks shouldEnableSemantics for every global event', () { + final MockSemanticsEnabler mockSemanticsEnabler = MockSemanticsEnabler(); + semantics().semanticsHelper.semanticsEnabler = mockSemanticsEnabler; + final html.Event pointerEvent = html.Event('pointermove'); + + semantics().receiveGlobalEvent(pointerEvent); + + // Verify the interactions. + verify(mockSemanticsEnabler.shouldEnableSemantics(pointerEvent)); + }); + + test('Forward events to framewors if shouldEnableSemantics', () { + final MockSemanticsEnabler mockSemanticsEnabler = MockSemanticsEnabler(); + semantics().semanticsHelper.semanticsEnabler = mockSemanticsEnabler; + final html.Event pointerEvent = html.Event('pointermove'); + when(mockSemanticsEnabler.shouldEnableSemantics(pointerEvent)) + .thenReturn(true); + + expect(semantics().receiveGlobalEvent(pointerEvent), isTrue); + }); } +class MockSemanticsEnabler extends Mock implements SemanticsEnabler {} + void _testHeader() { test('renders heading role for headers', () { semantics()