From 9f9d624ea331f015fbf14201d122594f12f17c06 Mon Sep 17 00:00:00 2001 From: ferhatb Date: Mon, 11 Jan 2021 14:06:14 -0800 Subject: [PATCH 1/8] Fix semantic node order for webkit --- .../lib/src/engine/semantics/semantics.dart | 16 +- .../test/engine/semantics/semantics_test.dart | 192 +++++++++++------- 2 files changed, 130 insertions(+), 78 deletions(-) diff --git a/lib/web_ui/lib/src/engine/semantics/semantics.dart b/lib/web_ui/lib/src/engine/semantics/semantics.dart index c9b8b28e945e8..0c796af23f9ce 100644 --- a/lib/web_ui/lib/src/engine/semantics/semantics.dart +++ b/lib/web_ui/lib/src/engine/semantics/semantics.dart @@ -849,8 +849,12 @@ class SemanticsObject { final bool hasIdentityTransform = transform == null || isIdentityFloat32ListTransform(transform); + // On Mac OS and iOS, VoiceOver requires left=0 top=0 value to correctly + // handle order. See https://github.com/flutter/flutter/issues/73347. if (hasZeroRectOffset && hasIdentityTransform && + operatingSystem != OperatingSystem.macOs && + operatingSystem != OperatingSystem.iOs && verticalContainerAdjustment == 0.0 && horizontalContainerAdjustment == 0.0) { if (isDesktop) { @@ -905,11 +909,17 @@ class SemanticsObject { effectiveTransformIsIdentity = false; } - if (!effectiveTransformIsIdentity) { + if (!effectiveTransformIsIdentity || + operatingSystem == OperatingSystem.macOs || + operatingSystem == OperatingSystem.iOs) { + if (effectiveTransformIsIdentity) { + effectiveTransform = Matrix4.identity(); + } if (isDesktop) { element.style ..transformOrigin = '0 0 0' - ..transform = matrix4ToCssTransform(effectiveTransform); + ..transform = (effectiveTransformIsIdentity ? 'translate(0px 0px 0px)' + : matrix4ToCssTransform(effectiveTransform)); } else { // Mobile screen readers observed to have errors while calculating the // semantics focus borders if css `transform` properties are used. @@ -941,6 +951,8 @@ class SemanticsObject { if (containerElement != null) { if (!hasZeroRectOffset || + operatingSystem == OperatingSystem.macOs || + operatingSystem == OperatingSystem.iOs || verticalContainerAdjustment != 0.0 || horizontalContainerAdjustment != 0.0) { final double translateX = -_rect!.left + horizontalContainerAdjustment; diff --git a/lib/web_ui/test/engine/semantics/semantics_test.dart b/lib/web_ui/test/engine/semantics/semantics_test.dart index af671c133bc0a..332df5cc5308f 100644 --- a/lib/web_ui/test/engine/semantics/semantics_test.dart +++ b/lib/web_ui/test/engine/semantics/semantics_test.dart @@ -27,8 +27,13 @@ void main() { internalBootstrapBrowserTest(() => testMain); } +String rootSemanticStyle = ''; + void testMain() { setUp(() { + rootSemanticStyle = browserEngine != BrowserEngine.edge + ? 'filter: opacity(0%); color: rgba(0, 0, 0, 0)' : + 'color: rgba(0, 0, 0, 0); filter: opacity(0%)'; EngineSemanticsOwner.debugResetSemantics(); }); @@ -140,7 +145,7 @@ void _testEngineSemanticsOwner() { expect(tree[1].label, 'Hello'); expectSemanticsTree(''' - + Hello @@ -152,7 +157,7 @@ void _testEngineSemanticsOwner() { renderLabel('World'); expectSemanticsTree(''' - + World @@ -164,16 +169,14 @@ void _testEngineSemanticsOwner() { renderLabel(''); expectSemanticsTree(''' - + '''); semantics().semanticsEnabled = false; - }, - // TODO(nurhan): https://github.com/flutter/flutter/issues/50754 - skip: browserEngine == BrowserEngine.edge); + }); test('clears semantics tree when disabled', () { expect(semantics().debugSemanticsTree, isEmpty); @@ -248,15 +251,13 @@ void _testHeader() { semantics().updateSemantics(builder.build()); expectSemanticsTree(''' - + Header of the page '''); semantics().semanticsEnabled = false; - }, - // TODO(nurhan): https://github.com/flutter/flutter/issues/50754 - skip: browserEngine == BrowserEngine.edge); + }); } void _testLongestIncreasingSubsequence() { @@ -326,7 +327,7 @@ void _testContainer() { semantics().updateSemantics(builder.build()); expectSemanticsTree(''' - + @@ -338,14 +339,19 @@ void _testContainer() { html.document.querySelector('flt-semantics-container'); expect(parentElement.style.transform, ''); - expect(parentElement.style.transformOrigin, ''); - expect(container.style.transform, ''); - expect(container.style.transformOrigin, ''); + if (operatingSystem != OperatingSystem.macOs && + operatingSystem != OperatingSystem.iOs) { + expect(parentElement.style.transformOrigin, '0px 0px 0px'); + expect(container.style.transform, ''); + expect(container.style.transformOrigin, ''); + } else { + expect(parentElement.style.transformOrigin, '0px 0px 0px'); + expect(container.style.transform, 'translate(0px, 0px)'); + expect(container.style.transformOrigin, '0px 0px 0px'); + } semantics().semanticsEnabled = false; - }, - // TODO(nurhan): https://github.com/flutter/flutter/issues/50754 - skip: browserEngine == BrowserEngine.edge); + }); test('container node compensates for rect offset', () async { semantics() @@ -366,7 +372,7 @@ void _testContainer() { semantics().updateSemantics(builder.build()); expectSemanticsTree(''' - + @@ -389,9 +395,61 @@ void _testContainer() { expect(container.style.left, '-10px'); } semantics().semanticsEnabled = false; - }, - // TODO(nurhan): https://github.com/flutter/flutter/issues/50754 - skip: browserEngine == BrowserEngine.edge); + }); + + test('0 offsets are not removed for voiceover', () async { + semantics() + ..debugOverrideTimestampFunction(() => _testTime) + ..semanticsEnabled = true; + + final ui.SemanticsUpdateBuilder builder = ui.SemanticsUpdateBuilder(); + updateNode( + builder, + id: 0, + actions: 0, + flags: 0, + transform: Matrix4.identity().toFloat64(), + rect: const ui.Rect.fromLTRB(0, 0, 20, 20), + childrenInHitTestOrder: Int32List.fromList([1]), + childrenInTraversalOrder: Int32List.fromList([1]), + ); + + semantics().updateSemantics(builder.build()); + if (browserEngine == BrowserEngine.edge) { + expectSemanticsTree(''' + + + + +'''); + } else { + expectSemanticsTree(''' + + + + +'''); + } + final html.Element parentElement = + html.document.querySelector('flt-semantics'); + final html.Element container = + html.document.querySelector('flt-semantics-container'); + if (operatingSystem == OperatingSystem.macOs || + operatingSystem == OperatingSystem.iOs) { + if (isDesktop) { + expect(parentElement.style.transform, ''); + expect(parentElement.style.transformOrigin, '0px 0px 0px'); + expect(container.style.transform, 'translate(0px, 0px)'); + expect(container.style.transformOrigin, '0px 0px 0px'); + } else { + expect(parentElement.style.top, '20px'); + expect(parentElement.style.left, '20px'); + expect(container.style.top, '0px'); + expect(container.style.left, '0px'); + } + } + semantics().semanticsEnabled = false; + }); } void _testVerticalScrolling() { @@ -412,13 +470,11 @@ void _testVerticalScrolling() { semantics().updateSemantics(builder.build()); expectSemanticsTree(''' - + '''); semantics().semanticsEnabled = false; - }, - // TODO(nurhan): https://github.com/flutter/flutter/issues/50754 - skip: browserEngine == BrowserEngine.edge); + }); test('scrollable node with children has a container node', () async { semantics() @@ -439,7 +495,7 @@ void _testVerticalScrolling() { semantics().updateSemantics(builder.build()); expectSemanticsTree(''' - + @@ -453,9 +509,7 @@ void _testVerticalScrolling() { expect(scrollable.scrollTop, 0); semantics().semanticsEnabled = false; - }, - // TODO(nurhan): https://github.com/flutter/flutter/issues/50754 - skip: browserEngine == BrowserEngine.edge); + }); test('scrollable node dispatches scroll events', () async { final StreamController idLogController = StreamController(); @@ -509,7 +563,7 @@ void _testVerticalScrolling() { semantics().updateSemantics(builder.build()); expectSemanticsTree(''' - + @@ -547,9 +601,7 @@ void _testVerticalScrolling() { expect(scrollable.scrollTop >= (10 - browserMaxScrollDiff), isTrue); semantics().semanticsEnabled = false; - }, - // TODO(nurhan): https://github.com/flutter/flutter/issues/50754 - skip: browserEngine == BrowserEngine.edge); + }); } void _testHorizontalScrolling() { @@ -570,13 +622,11 @@ void _testHorizontalScrolling() { semantics().updateSemantics(builder.build()); expectSemanticsTree(''' - + '''); semantics().semanticsEnabled = false; - }, - // TODO(nurhan): https://github.com/flutter/flutter/issues/50754 - skip: browserEngine == BrowserEngine.edge); + }); test('scrollable node with children has a container node', () async { semantics() @@ -597,7 +647,7 @@ void _testHorizontalScrolling() { semantics().updateSemantics(builder.build()); expectSemanticsTree(''' - + @@ -611,9 +661,7 @@ void _testHorizontalScrolling() { expect(scrollable.scrollLeft, 0); semantics().semanticsEnabled = false; - }, - // TODO(nurhan): https://github.com/flutter/flutter/issues/50754 - skip: browserEngine == BrowserEngine.edge); + }); test('scrollable node dispatches scroll events', () async { final SemanticsActionLogger logger = SemanticsActionLogger(); @@ -648,7 +696,7 @@ void _testHorizontalScrolling() { semantics().updateSemantics(builder.build()); expectSemanticsTree(''' - + @@ -685,9 +733,7 @@ void _testHorizontalScrolling() { expect(scrollable.scrollLeft >= (10 - browserMaxScrollDiff), isTrue); semantics().semanticsEnabled = false; - }, - // TODO(nurhan): https://github.com/flutter/flutter/issues/50754 - skip: browserEngine == BrowserEngine.edge); + }); } void _testIncrementables() { @@ -709,14 +755,12 @@ void _testIncrementables() { semantics().updateSemantics(builder.build()); expectSemanticsTree(''' - + '''); semantics().semanticsEnabled = false; - }, - // TODO(nurhan): https://github.com/flutter/flutter/issues/50754 - skip: browserEngine == BrowserEngine.edge); + }); test('increments', () async { final SemanticsActionLogger logger = SemanticsActionLogger(); @@ -738,7 +782,7 @@ void _testIncrementables() { semantics().updateSemantics(builder.build()); expectSemanticsTree(''' - + '''); @@ -751,9 +795,7 @@ void _testIncrementables() { expect(await logger.actionLog.first, ui.SemanticsAction.increase); semantics().semanticsEnabled = false; - }, - // TODO(nurhan): https://github.com/flutter/flutter/issues/50754 - skip: browserEngine == BrowserEngine.edge); + }); test('decrements', () async { final SemanticsActionLogger logger = SemanticsActionLogger(); @@ -775,7 +817,7 @@ void _testIncrementables() { semantics().updateSemantics(builder.build()); expectSemanticsTree(''' - + '''); @@ -814,7 +856,7 @@ void _testIncrementables() { semantics().updateSemantics(builder.build()); expectSemanticsTree(''' - + '''); @@ -843,7 +885,7 @@ void _testTextField() { semantics().updateSemantics(builder.build()); expectSemanticsTree(''' - + '''); @@ -914,7 +956,7 @@ void _testCheckables() { semantics().updateSemantics(builder.build()); expectSemanticsTree(''' - + '''); semantics().semanticsEnabled = false; @@ -942,7 +984,7 @@ void _testCheckables() { semantics().updateSemantics(builder.build()); expectSemanticsTree(''' - + '''); semantics().semanticsEnabled = false; @@ -970,7 +1012,7 @@ void _testCheckables() { semantics().updateSemantics(builder.build()); expectSemanticsTree(''' - + '''); semantics().semanticsEnabled = false; @@ -999,7 +1041,7 @@ void _testCheckables() { semantics().updateSemantics(builder.build()); expectSemanticsTree(''' - + '''); semantics().semanticsEnabled = false; @@ -1027,7 +1069,7 @@ void _testCheckables() { semantics().updateSemantics(builder.build()); expectSemanticsTree(''' - + '''); semantics().semanticsEnabled = false; @@ -1055,7 +1097,7 @@ void _testCheckables() { semantics().updateSemantics(builder.build()); expectSemanticsTree(''' - + '''); semantics().semanticsEnabled = false; @@ -1085,7 +1127,7 @@ void _testCheckables() { semantics().updateSemantics(builder.build()); expectSemanticsTree(''' - + '''); semantics().semanticsEnabled = false; @@ -1114,7 +1156,7 @@ void _testCheckables() { semantics().updateSemantics(builder.build()); expectSemanticsTree(''' - + '''); semantics().semanticsEnabled = false; @@ -1143,7 +1185,7 @@ void _testCheckables() { semantics().updateSemantics(builder.build()); expectSemanticsTree(''' - + '''); semantics().semanticsEnabled = false; @@ -1173,7 +1215,7 @@ void _testTappable() { semantics().updateSemantics(builder.build()); expectSemanticsTree(''' - + '''); semantics().semanticsEnabled = false; @@ -1200,7 +1242,7 @@ void _testTappable() { semantics().updateSemantics(builder.build()); expectSemanticsTree(''' - + '''); semantics().semanticsEnabled = false; @@ -1228,7 +1270,7 @@ void _testImage() { semantics().updateSemantics(builder.build()); expectSemanticsTree(''' - + '''); semantics().semanticsEnabled = false; @@ -1256,7 +1298,7 @@ void _testImage() { semantics().updateSemantics(builder.build()); expectSemanticsTree(''' - + @@ -1286,7 +1328,7 @@ void _testImage() { semantics().updateSemantics(builder.build()); expectSemanticsTree( - ''''''); + ''''''); semantics().semanticsEnabled = false; }, @@ -1312,7 +1354,7 @@ void _testImage() { semantics().updateSemantics(builder.build()); expectSemanticsTree(''' - + @@ -1345,7 +1387,7 @@ void _testLiveRegion() { semantics().updateSemantics(builder.build()); expectSemanticsTree(''' -This is a snackbar +This is a snackbar '''); semantics().semanticsEnabled = false; @@ -1370,13 +1412,11 @@ void _testLiveRegion() { semantics().updateSemantics(builder.build()); expectSemanticsTree(''' - + '''); semantics().semanticsEnabled = false; - }, - // TODO(nurhan): https://github.com/flutter/flutter/issues/50754 - skip: browserEngine == BrowserEngine.edge); + }); } void expectSemanticsTree(String semanticsHtml) { From ad00d018bb085bb66593de3ce57e4c0dd92054b4 Mon Sep 17 00:00:00 2001 From: ferhatb Date: Mon, 11 Jan 2021 15:22:35 -0800 Subject: [PATCH 2/8] update test for ios --- lib/web_ui/test/engine/semantics/semantics_test.dart | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/web_ui/test/engine/semantics/semantics_test.dart b/lib/web_ui/test/engine/semantics/semantics_test.dart index 332df5cc5308f..60d6d569df3c7 100644 --- a/lib/web_ui/test/engine/semantics/semantics_test.dart +++ b/lib/web_ui/test/engine/semantics/semantics_test.dart @@ -442,8 +442,8 @@ void _testContainer() { expect(container.style.transform, 'translate(0px, 0px)'); expect(container.style.transformOrigin, '0px 0px 0px'); } else { - expect(parentElement.style.top, '20px'); - expect(parentElement.style.left, '20px'); + expect(parentElement.style.top, '0px'); + expect(parentElement.style.left, '0px'); expect(container.style.top, '0px'); expect(container.style.left, '0px'); } From c120aaa3712cdcc63f54020208fc655420fb2e44 Mon Sep 17 00:00:00 2001 From: ferhatb Date: Tue, 12 Jan 2021 09:53:36 -0800 Subject: [PATCH 3/8] fix test for non MacOs --- lib/web_ui/test/engine/semantics/semantics_test.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/web_ui/test/engine/semantics/semantics_test.dart b/lib/web_ui/test/engine/semantics/semantics_test.dart index 60d6d569df3c7..c64ccde3ea8e0 100644 --- a/lib/web_ui/test/engine/semantics/semantics_test.dart +++ b/lib/web_ui/test/engine/semantics/semantics_test.dart @@ -341,7 +341,7 @@ void _testContainer() { expect(parentElement.style.transform, ''); if (operatingSystem != OperatingSystem.macOs && operatingSystem != OperatingSystem.iOs) { - expect(parentElement.style.transformOrigin, '0px 0px 0px'); + expect(parentElement.style.transformOrigin, ''); expect(container.style.transform, ''); expect(container.style.transformOrigin, ''); } else { From 54799d2f3853937f597eb66e67eb1333f9380ea1 Mon Sep 17 00:00:00 2001 From: ferhatb Date: Tue, 12 Jan 2021 12:20:07 -0800 Subject: [PATCH 4/8] Cleanup semantics positioning code --- .../lib/src/engine/semantics/semantics.dart | 85 +++++++++++-------- lib/web_ui/lib/src/engine/util.dart | 6 +- .../test/engine/semantics/semantics_test.dart | 18 ++-- 3 files changed, 61 insertions(+), 48 deletions(-) diff --git a/lib/web_ui/lib/src/engine/semantics/semantics.dart b/lib/web_ui/lib/src/engine/semantics/semantics.dart index 0c796af23f9ce..811911413c74a 100644 --- a/lib/web_ui/lib/src/engine/semantics/semantics.dart +++ b/lib/web_ui/lib/src/engine/semantics/semantics.dart @@ -853,30 +853,10 @@ class SemanticsObject { // handle order. See https://github.com/flutter/flutter/issues/73347. if (hasZeroRectOffset && hasIdentityTransform && - operatingSystem != OperatingSystem.macOs && - operatingSystem != OperatingSystem.iOs && verticalContainerAdjustment == 0.0 && horizontalContainerAdjustment == 0.0) { - if (isDesktop) { - element.style - ..removeProperty('transform-origin') - ..removeProperty('transform'); - } else { - element.style - ..removeProperty('top') - ..removeProperty('left'); - } - if (containerElement != null) { - if (isDesktop) { - containerElement.style - ..removeProperty('transform-origin') - ..removeProperty('transform'); - } else { - containerElement.style - ..removeProperty('top') - ..removeProperty('left'); - } - } + _resetElementOffsets(); + _resetContainerOffsets(containerElement); return; } @@ -909,9 +889,7 @@ class SemanticsObject { effectiveTransformIsIdentity = false; } - if (!effectiveTransformIsIdentity || - operatingSystem == OperatingSystem.macOs || - operatingSystem == OperatingSystem.iOs) { + if (!effectiveTransformIsIdentity || isMacOrIOS) { if (effectiveTransformIsIdentity) { effectiveTransform = Matrix4.identity(); } @@ -937,22 +915,13 @@ class SemanticsObject { ..height = '${rect.height}px'; } } else { + _resetElementOffsets(); // TODO: https://github.com/flutter/flutter/issues/73347 - if (isDesktop) { - element.style - ..removeProperty('transform-origin') - ..removeProperty('transform'); - } else { - element.style - ..removeProperty('top') - ..removeProperty('left'); - } } if (containerElement != null) { if (!hasZeroRectOffset || - operatingSystem == OperatingSystem.macOs || - operatingSystem == OperatingSystem.iOs || + isMacOrIOS || verticalContainerAdjustment != 0.0 || horizontalContainerAdjustment != 0.0) { final double translateX = -_rect!.left + horizontalContainerAdjustment; @@ -967,6 +936,26 @@ class SemanticsObject { ..left = '${translateX}px'; } } else { + _resetContainerOffsets(containerElement); + } + } + } + + void _resetContainerOffsets(html.Element? containerElement) { + if (isMacOrIOS) { + if (containerElement != null) { + if (isDesktop) { + containerElement.style + ..transformOrigin = '0 0 0' + ..transform = 'translate(0px, 0px)'; + } else { + containerElement.style + ..top = '0px' + ..left = '0px'; + } + } + } else { + if (containerElement != null) { if (isDesktop) { containerElement.style ..removeProperty('transform-origin') @@ -980,6 +969,30 @@ class SemanticsObject { } } + void _resetElementOffsets() { + if (isMacOrIOS) { + if (isDesktop) { + element.style + ..transformOrigin = '0 0 0' + ..transform = 'translate(0px, 0px)'; + } else { + element.style + ..top = '0px' + ..left = '0px'; + } + } else { + if (isDesktop) { + element.style + ..removeProperty('transform-origin') + ..removeProperty('transform'); + } else { + element.style + ..removeProperty('top') + ..removeProperty('left'); + } + } + } + Int32List? _previousChildrenInTraversalOrder; /// Updates the traversal child list of [object] from the given [update]. diff --git a/lib/web_ui/lib/src/engine/util.dart b/lib/web_ui/lib/src/engine/util.dart index 877bd519f2b23..ada70cd6abcad 100644 --- a/lib/web_ui/lib/src/engine/util.dart +++ b/lib/web_ui/lib/src/engine/util.dart @@ -446,9 +446,9 @@ const Set _genericFontFamilies = { /// For iOS, default to -apple-system, where it should be available, otherwise /// default to Arial. BlinkMacSystemFont is used for Chrome on iOS. final String _fallbackFontFamily = - _isMacOrIOS ? '-apple-system, BlinkMacSystemFont' : 'Arial'; + isMacOrIOS ? '-apple-system, BlinkMacSystemFont' : 'Arial'; -bool get _isMacOrIOS => +bool get isMacOrIOS => operatingSystem == OperatingSystem.iOs || operatingSystem == OperatingSystem.macOs; @@ -460,7 +460,7 @@ String? canonicalizeFontFamily(String? fontFamily) { if (_genericFontFamilies.contains(fontFamily)) { return fontFamily; } - if (_isMacOrIOS) { + if (isMacOrIOS) { // Unlike Safari, Chrome on iOS does not correctly fallback to cupertino // on sans-serif. // Map to San Francisco Text/Display fonts, use -apple-system, diff --git a/lib/web_ui/test/engine/semantics/semantics_test.dart b/lib/web_ui/test/engine/semantics/semantics_test.dart index c64ccde3ea8e0..e2084a94457e4 100644 --- a/lib/web_ui/test/engine/semantics/semantics_test.dart +++ b/lib/web_ui/test/engine/semantics/semantics_test.dart @@ -7,6 +7,7 @@ import 'dart:async'; import 'dart:html' as html; +import 'dart:io'; import 'dart:typed_data'; import 'package:mockito/mockito.dart'; @@ -338,18 +339,17 @@ void _testContainer() { final html.Element container = html.document.querySelector('flt-semantics-container'); - expect(parentElement.style.transform, ''); - if (operatingSystem != OperatingSystem.macOs && - operatingSystem != OperatingSystem.iOs) { - expect(parentElement.style.transformOrigin, ''); - expect(container.style.transform, ''); - expect(container.style.transformOrigin, ''); - } else { + if (operatingSystem == OperatingSystem.macOs) { + expect(parentElement.style.transform, 'translate(0px, 0px)'); expect(parentElement.style.transformOrigin, '0px 0px 0px'); expect(container.style.transform, 'translate(0px, 0px)'); expect(container.style.transformOrigin, '0px 0px 0px'); + } else { + expect(parentElement.style.transform, ''); + expect(parentElement.style.transformOrigin, ''); + expect(container.style.transform, ''); + expect(container.style.transformOrigin, ''); } - semantics().semanticsEnabled = false; }); @@ -437,7 +437,7 @@ void _testContainer() { if (operatingSystem == OperatingSystem.macOs || operatingSystem == OperatingSystem.iOs) { if (isDesktop) { - expect(parentElement.style.transform, ''); + expect(parentElement.style.transform, 'translate(0px, 0px)'); expect(parentElement.style.transformOrigin, '0px 0px 0px'); expect(container.style.transform, 'translate(0px, 0px)'); expect(container.style.transformOrigin, '0px 0px 0px'); From 1cb25d436c05027347a1b29928afc1340b37267f Mon Sep 17 00:00:00 2001 From: ferhatb Date: Tue, 12 Jan 2021 15:01:48 -0800 Subject: [PATCH 5/8] Change comment placement --- lib/web_ui/lib/src/engine/semantics/semantics.dart | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/web_ui/lib/src/engine/semantics/semantics.dart b/lib/web_ui/lib/src/engine/semantics/semantics.dart index 811911413c74a..2f1a1e0b89409 100644 --- a/lib/web_ui/lib/src/engine/semantics/semantics.dart +++ b/lib/web_ui/lib/src/engine/semantics/semantics.dart @@ -849,8 +849,6 @@ class SemanticsObject { final bool hasIdentityTransform = transform == null || isIdentityFloat32ListTransform(transform); - // On Mac OS and iOS, VoiceOver requires left=0 top=0 value to correctly - // handle order. See https://github.com/flutter/flutter/issues/73347. if (hasZeroRectOffset && hasIdentityTransform && verticalContainerAdjustment == 0.0 && @@ -941,6 +939,8 @@ class SemanticsObject { } } + // On Mac OS and iOS, VoiceOver requires left=0 top=0 value to correctly + // handle order. See https://github.com/flutter/flutter/issues/73347. void _resetContainerOffsets(html.Element? containerElement) { if (isMacOrIOS) { if (containerElement != null) { From e394bb4856095d251e85c075556512f41f684392 Mon Sep 17 00:00:00 2001 From: ferhatb Date: Tue, 12 Jan 2021 16:05:16 -0800 Subject: [PATCH 6/8] Remove unused import --- lib/web_ui/test/engine/semantics/semantics_test.dart | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/web_ui/test/engine/semantics/semantics_test.dart b/lib/web_ui/test/engine/semantics/semantics_test.dart index e2084a94457e4..2199bd5fe209a 100644 --- a/lib/web_ui/test/engine/semantics/semantics_test.dart +++ b/lib/web_ui/test/engine/semantics/semantics_test.dart @@ -7,7 +7,6 @@ import 'dart:async'; import 'dart:html' as html; -import 'dart:io'; import 'dart:typed_data'; import 'package:mockito/mockito.dart'; From 1b689f4bf0a0364f555531d9d06642cbbff0cd8c Mon Sep 17 00:00:00 2001 From: ferhatb Date: Wed, 13 Jan 2021 15:35:21 -0800 Subject: [PATCH 7/8] refactor element/container offsets --- .../lib/src/engine/semantics/semantics.dart | 42 ++++--------------- 1 file changed, 9 insertions(+), 33 deletions(-) diff --git a/lib/web_ui/lib/src/engine/semantics/semantics.dart b/lib/web_ui/lib/src/engine/semantics/semantics.dart index 2f1a1e0b89409..77ec389ce7184 100644 --- a/lib/web_ui/lib/src/engine/semantics/semantics.dart +++ b/lib/web_ui/lib/src/engine/semantics/semantics.dart @@ -853,8 +853,10 @@ class SemanticsObject { hasIdentityTransform && verticalContainerAdjustment == 0.0 && horizontalContainerAdjustment == 0.0) { - _resetElementOffsets(); - _resetContainerOffsets(containerElement); + _resetElementOffsets(element); + if (containerElement != null) { + _resetElementOffsets(containerElement); + } return; } @@ -913,7 +915,7 @@ class SemanticsObject { ..height = '${rect.height}px'; } } else { - _resetElementOffsets(); + _resetElementOffsets(element); // TODO: https://github.com/flutter/flutter/issues/73347 } @@ -934,42 +936,16 @@ class SemanticsObject { ..left = '${translateX}px'; } } else { - _resetContainerOffsets(containerElement); + if (containerElement != null) { + _resetElementOffsets(containerElement); + } } } } // On Mac OS and iOS, VoiceOver requires left=0 top=0 value to correctly // handle order. See https://github.com/flutter/flutter/issues/73347. - void _resetContainerOffsets(html.Element? containerElement) { - if (isMacOrIOS) { - if (containerElement != null) { - if (isDesktop) { - containerElement.style - ..transformOrigin = '0 0 0' - ..transform = 'translate(0px, 0px)'; - } else { - containerElement.style - ..top = '0px' - ..left = '0px'; - } - } - } else { - if (containerElement != null) { - if (isDesktop) { - containerElement.style - ..removeProperty('transform-origin') - ..removeProperty('transform'); - } else { - containerElement.style - ..removeProperty('top') - ..removeProperty('left'); - } - } - } - } - - void _resetElementOffsets() { + static void _resetElementOffsets(html.Element element) { if (isMacOrIOS) { if (isDesktop) { element.style From b082026bd436bfbab17b233522dcb49dc28b42b2 Mon Sep 17 00:00:00 2001 From: ferhatb Date: Thu, 14 Jan 2021 08:59:57 -0800 Subject: [PATCH 8/8] Fix analyzer error --- lib/web_ui/lib/src/engine/semantics/semantics.dart | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/lib/web_ui/lib/src/engine/semantics/semantics.dart b/lib/web_ui/lib/src/engine/semantics/semantics.dart index 77ec389ce7184..7a3df9c5b767b 100644 --- a/lib/web_ui/lib/src/engine/semantics/semantics.dart +++ b/lib/web_ui/lib/src/engine/semantics/semantics.dart @@ -936,9 +936,7 @@ class SemanticsObject { ..left = '${translateX}px'; } } else { - if (containerElement != null) { - _resetElementOffsets(containerElement); - } + _resetElementOffsets(containerElement); } } }