From 36a5a0f55f2a71eeac9f91dcafe497e99fd6fc6b Mon Sep 17 00:00:00 2001 From: Dan Field Date: Mon, 19 Sep 2022 13:11:47 -0700 Subject: [PATCH] Avoid sending zero transform semantic nodes to the engine (#111843) --- .../flutter/lib/src/rendering/object.dart | 2 +- .../flutter/test/widgets/semantics_test.dart | 27 +++++++++++++++++++ 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/packages/flutter/lib/src/rendering/object.dart b/packages/flutter/lib/src/rendering/object.dart index 7f9dda15a55..f61aeb21fcf 100644 --- a/packages/flutter/lib/src/rendering/object.dart +++ b/packages/flutter/lib/src/rendering/object.dart @@ -4433,7 +4433,7 @@ class _SemanticsGeometry { /// by this object can be dropped from the semantics tree without losing /// semantics information. bool get dropFromTree { - return _rect.isEmpty; + return _rect.isEmpty || _transform.isZero(); } /// Whether the [SemanticsNode] annotated with the geometric information diff --git a/packages/flutter/test/widgets/semantics_test.dart b/packages/flutter/test/widgets/semantics_test.dart index bdadfee6b96..fa84dce6849 100644 --- a/packages/flutter/test/widgets/semantics_test.dart +++ b/packages/flutter/test/widgets/semantics_test.dart @@ -1632,6 +1632,33 @@ void main() { textDirection: TextDirection.ltr, )); }); + + testWidgets('Semantics with zero transform gets dropped', (WidgetTester tester) async { + // Regression test for https://github.com/flutter/flutter/issues/110671. + // Construct a widget tree that will end up with a fitted box that applies + // a zero transform because it does not actually draw its children. + // Assert that this subtree gets dropped (the root node has no children). + await tester.pumpWidget(Column( + children: [ + SizedBox( + height: 0, + width: 500, + child: FittedBox( + child: SizedBox( + height: 55, + width: 266, + child: SingleChildScrollView(child: Column()), + ), + ), + ), + ], + )); + + final SemanticsNode node = RendererBinding.instance.renderView.debugSemantics!; + + expect(node.transform, null); // Make sure the zero transform didn't end up on the root somehow. + expect(node.childrenCount, 0); + }); } class CustomSortKey extends OrdinalSortKey {