From 8d145048fd45e1ec0ebd103170f17594470be2a0 Mon Sep 17 00:00:00 2001 From: nturgut Date: Wed, 9 Dec 2020 11:20:19 -0800 Subject: [PATCH 1/5] fixes voice over for higher ios-safari versions --- lib/web_ui/lib/src/engine/semantics/semantics_helper.dart | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/lib/web_ui/lib/src/engine/semantics/semantics_helper.dart b/lib/web_ui/lib/src/engine/semantics/semantics_helper.dart index 93c086670addd..4f428409ccdd8 100644 --- a/lib/web_ui/lib/src/engine/semantics/semantics_helper.dart +++ b/lib/web_ui/lib/src/engine/semantics/semantics_helper.dart @@ -280,10 +280,15 @@ class MobileSemanticsEnabler extends SemanticsEnabler { return true; } + // ios-safari browsers which starts sending `pointer` events instead of + // `touch` events. (Tested with 12.1 which uses touch events vs 13.5 + // which uses pointer events.) const Set kInterestingEventTypes = { 'click', 'touchstart', 'touchend', + 'pointerdown', + 'pointerup', }; if (!kInterestingEventTypes.contains(event.type)) { From 83e68c61169f83a1197d98e39cfe3e13707f3920 Mon Sep 17 00:00:00 2001 From: nturgut Date: Wed, 9 Dec 2020 12:05:48 -0800 Subject: [PATCH 2/5] change enable conditions for webkit --- .../src/engine/semantics/semantics_helper.dart | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/lib/web_ui/lib/src/engine/semantics/semantics_helper.dart b/lib/web_ui/lib/src/engine/semantics/semantics_helper.dart index 4f428409ccdd8..1fa900a3af681 100644 --- a/lib/web_ui/lib/src/engine/semantics/semantics_helper.dart +++ b/lib/web_ui/lib/src/engine/semantics/semantics_helper.dart @@ -256,8 +256,9 @@ class MobileSemanticsEnabler extends SemanticsEnabler { @override bool tryEnableSemantics(html.Event event) { if (_schedulePlaceholderRemoval) { - final bool removeNow = - (browserEngine != BrowserEngine.webkit || event.type == 'touchend'); + final bool removeNow = (browserEngine != BrowserEngine.webkit || + event.type == 'touchend' || + event.type == 'pointerup'); if (removeNow) { _semanticsPlaceholder!.remove(); _semanticsPlaceholder = null; @@ -288,6 +289,7 @@ class MobileSemanticsEnabler extends SemanticsEnabler { 'touchstart', 'touchend', 'pointerdown', + 'pointermove', 'pointerup', }; @@ -338,6 +340,11 @@ class MobileSemanticsEnabler extends SemanticsEnabler { final html.TouchEvent touch = event as html.TouchEvent; activationPoint = touch.changedTouches!.first.client; break; + case 'pointerdown': + case 'pointerup': + final html.PointerEvent touch = event as html.PointerEvent; + activationPoint = new html.Point(touch.client.x, touch.client.y); + break; default: // The event is not relevant, forward to framework as normal. return true; @@ -346,9 +353,11 @@ class MobileSemanticsEnabler extends SemanticsEnabler { final html.Rectangle activatingElementRect = domRenderer.glassPaneElement!.getBoundingClientRect(); final double midX = (activatingElementRect.left + - (activatingElementRect.right - activatingElementRect.left) / 2).toDouble(); + (activatingElementRect.right - activatingElementRect.left) / 2) + .toDouble(); final double midY = (activatingElementRect.top + - (activatingElementRect.bottom - activatingElementRect.top) / 2).toDouble(); + (activatingElementRect.bottom - activatingElementRect.top) / 2) + .toDouble(); final double deltaX = activationPoint.x.toDouble() - midX; final double deltaY = activationPoint.y.toDouble() - midY; final double deltaSquared = deltaX * deltaX + deltaY * deltaY; From 2f296eeb7267fe4796d9703e1a537f380a2265a3 Mon Sep 17 00:00:00 2001 From: nturgut Date: Wed, 9 Dec 2020 17:43:10 -0800 Subject: [PATCH 3/5] adding click event for removal. adding unit tests --- .../engine/semantics/semantics_helper.dart | 4 ++- .../semantics/semantics_helper_test.dart | 28 +++++++++++++++---- 2 files changed, 26 insertions(+), 6 deletions(-) diff --git a/lib/web_ui/lib/src/engine/semantics/semantics_helper.dart b/lib/web_ui/lib/src/engine/semantics/semantics_helper.dart index 1fa900a3af681..0b9245b922c8d 100644 --- a/lib/web_ui/lib/src/engine/semantics/semantics_helper.dart +++ b/lib/web_ui/lib/src/engine/semantics/semantics_helper.dart @@ -256,9 +256,11 @@ class MobileSemanticsEnabler extends SemanticsEnabler { @override bool tryEnableSemantics(html.Event event) { if (_schedulePlaceholderRemoval) { + // The event type can also be click for VoiceOver. final bool removeNow = (browserEngine != BrowserEngine.webkit || event.type == 'touchend' || - event.type == 'pointerup'); + event.type == 'pointerup' || + event.type == 'click'); if (removeNow) { _semanticsPlaceholder!.remove(); _semanticsPlaceholder = null; diff --git a/lib/web_ui/test/engine/semantics/semantics_helper_test.dart b/lib/web_ui/test/engine/semantics/semantics_helper_test.dart index 137bd2baf8cb0..c732f98829920 100644 --- a/lib/web_ui/test/engine/semantics/semantics_helper_test.dart +++ b/lib/web_ui/test/engine/semantics/semantics_helper_test.dart @@ -9,6 +9,8 @@ import 'package:test/bootstrap/browser.dart'; import 'package:test/test.dart'; import 'package:ui/src/engine.dart'; +const PointerSupportDetector _defaultSupportDetector = PointerSupportDetector(); + void main() { internalBootstrapBrowserTest(() => testMain); } @@ -151,15 +153,31 @@ void testMain() { skip: browserEngine == BrowserEngine.webkit); test('Not relevant events should be forwarded to the framework', () async { - final html.Event event = html.TouchEvent('touchcancel'); + html.Event event; + if (_defaultSupportDetector.hasPointerEvents) { + event = html.PointerEvent('pointerdown'); + } else if(_defaultSupportDetector.hasTouchEvents) { + event = html.TouchEvent('touchcancel'); + } else { + event = html.MouseEvent('mousemove'); + } + bool shouldForwardToFramework = mobileSemanticsEnabler.tryEnableSemantics(event); expect(shouldForwardToFramework, true); }, - // TODO(nurhan): https://github.com/flutter/flutter/issues/50590 - // TODO(nurhan): https://github.com/flutter/flutter/issues/46638 - // TODO(nurhan): https://github.com/flutter/flutter/issues/50754 - skip: browserEngine != BrowserEngine.blink); + skip: browserEngine == BrowserEngine.edge); + + test('Pointer down is relevant event', () async { + expect(mobileSemanticsEnabler.semanticsActivationAttempts, isZero); + + final html.Event event = html.PointerEvent('pointerdown'); + mobileSemanticsEnabler.tryEnableSemantics(event); + + expect(mobileSemanticsEnabler.semanticsActivationAttempts, isNonZero); + }, + skip: browserEngine == BrowserEngine.edge || + browserEngine == BrowserEngine.firefox); }); } From a037395ba74a7b2b15a94a5fe0f2ff92939c0172 Mon Sep 17 00:00:00 2001 From: nturgut Date: Thu, 10 Dec 2020 09:51:39 -0800 Subject: [PATCH 4/5] run the mobile semantics enabler test on mobile browsers --- .../semantics/semantics_helper_test.dart | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/lib/web_ui/test/engine/semantics/semantics_helper_test.dart b/lib/web_ui/test/engine/semantics/semantics_helper_test.dart index c732f98829920..708eb0ecddeff 100644 --- a/lib/web_ui/test/engine/semantics/semantics_helper_test.dart +++ b/lib/web_ui/test/engine/semantics/semantics_helper_test.dart @@ -155,19 +155,18 @@ void testMain() { test('Not relevant events should be forwarded to the framework', () async { html.Event event; if (_defaultSupportDetector.hasPointerEvents) { - event = html.PointerEvent('pointerdown'); - } else if(_defaultSupportDetector.hasTouchEvents) { - event = html.TouchEvent('touchcancel'); + event = html.PointerEvent('pointerdown'); + } else if (_defaultSupportDetector.hasTouchEvents) { + event = html.TouchEvent('touchcancel'); } else { - event = html.MouseEvent('mousemove'); + event = html.MouseEvent('mousemove'); } bool shouldForwardToFramework = mobileSemanticsEnabler.tryEnableSemantics(event); expect(shouldForwardToFramework, true); - }, - skip: browserEngine == BrowserEngine.edge); + }); test('Pointer down is relevant event', () async { expect(mobileSemanticsEnabler.semanticsActivationAttempts, isZero); @@ -176,8 +175,9 @@ void testMain() { mobileSemanticsEnabler.tryEnableSemantics(event); expect(mobileSemanticsEnabler.semanticsActivationAttempts, isNonZero); - }, - skip: browserEngine == BrowserEngine.edge || - browserEngine == BrowserEngine.firefox); - }); + }); + }, // Run the `MobileSemanticsEnabler` only on mobile browsers. + skip: operatingSystem == OperatingSystem.linux || + operatingSystem == OperatingSystem.macOs || + operatingSystem == OperatingSystem.windows); } From d79a3169a54f9e269cc3ecf01640b69a04fd809b Mon Sep 17 00:00:00 2001 From: nturgut Date: Thu, 10 Dec 2020 10:48:41 -0800 Subject: [PATCH 5/5] remove test method that gave different result on LUCI.(further inv. needed) --- .../test/engine/semantics/semantics_helper_test.dart | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/lib/web_ui/test/engine/semantics/semantics_helper_test.dart b/lib/web_ui/test/engine/semantics/semantics_helper_test.dart index 708eb0ecddeff..0df7f7449da3e 100644 --- a/lib/web_ui/test/engine/semantics/semantics_helper_test.dart +++ b/lib/web_ui/test/engine/semantics/semantics_helper_test.dart @@ -155,7 +155,7 @@ void testMain() { test('Not relevant events should be forwarded to the framework', () async { html.Event event; if (_defaultSupportDetector.hasPointerEvents) { - event = html.PointerEvent('pointerdown'); + event = html.PointerEvent('pointermove'); } else if (_defaultSupportDetector.hasTouchEvents) { event = html.TouchEvent('touchcancel'); } else { @@ -167,15 +167,6 @@ void testMain() { expect(shouldForwardToFramework, true); }); - - test('Pointer down is relevant event', () async { - expect(mobileSemanticsEnabler.semanticsActivationAttempts, isZero); - - final html.Event event = html.PointerEvent('pointerdown'); - mobileSemanticsEnabler.tryEnableSemantics(event); - - expect(mobileSemanticsEnabler.semanticsActivationAttempts, isNonZero); - }); }, // Run the `MobileSemanticsEnabler` only on mobile browsers. skip: operatingSystem == OperatingSystem.linux || operatingSystem == OperatingSystem.macOs ||