Unverified Commit f0970365 authored by Polina Cherkasova's avatar Polina Cherkasova Committed by GitHub

RenderEditable should dispose created layers. (#135942)

parent 8796955e
...@@ -391,6 +391,7 @@ class RenderEditable extends RenderBox with RelayoutWhenSystemFontsChangeMixin, ...@@ -391,6 +391,7 @@ class RenderEditable extends RenderBox with RelayoutWhenSystemFontsChangeMixin,
@override @override
void dispose() { void dispose() {
_leaderLayerHandler.layer = null;
_foregroundRenderObject?.dispose(); _foregroundRenderObject?.dispose();
_foregroundRenderObject = null; _foregroundRenderObject = null;
_backgroundRenderObject?.dispose(); _backgroundRenderObject?.dispose();
...@@ -2471,14 +2472,17 @@ class RenderEditable extends RenderBox with RelayoutWhenSystemFontsChangeMixin, ...@@ -2471,14 +2472,17 @@ class RenderEditable extends RenderBox with RelayoutWhenSystemFontsChangeMixin,
} }
} }
final LayerHandle<LeaderLayer> _leaderLayerHandler = LayerHandle<LeaderLayer>();
void _paintHandleLayers(PaintingContext context, List<TextSelectionPoint> endpoints, Offset offset) { void _paintHandleLayers(PaintingContext context, List<TextSelectionPoint> endpoints, Offset offset) {
Offset startPoint = endpoints[0].point; Offset startPoint = endpoints[0].point;
startPoint = Offset( startPoint = Offset(
clampDouble(startPoint.dx, 0.0, size.width), clampDouble(startPoint.dx, 0.0, size.width),
clampDouble(startPoint.dy, 0.0, size.height), clampDouble(startPoint.dy, 0.0, size.height),
); );
_leaderLayerHandler.layer = LeaderLayer(link: startHandleLayerLink, offset: startPoint + offset);
context.pushLayer( context.pushLayer(
LeaderLayer(link: startHandleLayerLink, offset: startPoint + offset), _leaderLayerHandler.layer!,
super.paint, super.paint,
Offset.zero, Offset.zero,
); );
......
...@@ -287,12 +287,7 @@ void main() { ...@@ -287,12 +287,7 @@ void main() {
await tester.pump(const Duration(milliseconds: 500)); await tester.pump(const Duration(milliseconds: 500));
expect(renderEditable.cursorColor!.alpha, 0); expect(renderEditable.cursorColor!.alpha, 0);
expect(renderEditable, paintsExactlyCountTimes(#drawRect, 0)); expect(renderEditable, paintsExactlyCountTimes(#drawRect, 0));
}, });
leakTrackingTestConfig: const LeakTrackingTestConfig(
// TODO(ksokolovskyi): remove after fixing
// https://github.com/flutter/flutter/issues/134386
notDisposedAllowList: <String, int?> {'LeaderLayer': 5},
));
testWidgetsWithLeakTracking('Cursor does not animates when debugDeterministicCursor is set', (WidgetTester tester) async { testWidgetsWithLeakTracking('Cursor does not animates when debugDeterministicCursor is set', (WidgetTester tester) async {
EditableText.debugDeterministicCursor = true; EditableText.debugDeterministicCursor = true;
...@@ -332,11 +327,7 @@ void main() { ...@@ -332,11 +327,7 @@ void main() {
EditableText.debugDeterministicCursor = false; EditableText.debugDeterministicCursor = false;
}, },
variant: const TargetPlatformVariant(<TargetPlatform>{ TargetPlatform.iOS, TargetPlatform.macOS }), variant: const TargetPlatformVariant(<TargetPlatform>{ TargetPlatform.iOS, TargetPlatform.macOS }),
leakTrackingTestConfig: const LeakTrackingTestConfig( );
// TODO(ksokolovskyi): remove after fixing
// https://github.com/flutter/flutter/issues/134386
notDisposedAllowList: <String, int?> {'LeaderLayer': 6},
));
testWidgetsWithLeakTracking('Cursor does not animate on Android when debugDeterministicCursor is set', (WidgetTester tester) async { testWidgetsWithLeakTracking('Cursor does not animate on Android when debugDeterministicCursor is set', (WidgetTester tester) async {
final Color defaultCursorColor = Color(ThemeData.fallback().colorScheme.primary.value); final Color defaultCursorColor = Color(ThemeData.fallback().colorScheme.primary.value);
...@@ -375,12 +366,7 @@ void main() { ...@@ -375,12 +366,7 @@ void main() {
expect(renderEditable, paints..rect(color: defaultCursorColor)); expect(renderEditable, paints..rect(color: defaultCursorColor));
EditableText.debugDeterministicCursor = false; EditableText.debugDeterministicCursor = false;
}, });
leakTrackingTestConfig: const LeakTrackingTestConfig(
// TODO(ksokolovskyi): remove after fixing
// https://github.com/flutter/flutter/issues/134386
notDisposedAllowList: <String, int?> {'LeaderLayer': 4},
));
testWidgetsWithLeakTracking('Cursor animation restarts when it is moved using keys on desktop', (WidgetTester tester) async { testWidgetsWithLeakTracking('Cursor animation restarts when it is moved using keys on desktop', (WidgetTester tester) async {
debugDefaultTargetPlatformOverride = TargetPlatform.macOS; debugDefaultTargetPlatformOverride = TargetPlatform.macOS;
...@@ -460,11 +446,7 @@ void main() { ...@@ -460,11 +446,7 @@ void main() {
debugDefaultTargetPlatformOverride = null; debugDefaultTargetPlatformOverride = null;
}, },
variant: KeySimulatorTransitModeVariant.all(), variant: KeySimulatorTransitModeVariant.all(),
leakTrackingTestConfig: const LeakTrackingTestConfig( );
// TODO(ksokolovskyi): remove after fixing
// https://github.com/flutter/flutter/issues/134386
notDisposedAllowList: <String, int?> {'LeaderLayer': 18},
));
testWidgetsWithLeakTracking('Cursor does not show when showCursor set to false', (WidgetTester tester) async { testWidgetsWithLeakTracking('Cursor does not show when showCursor set to false', (WidgetTester tester) async {
const Widget widget = MaterialApp( const Widget widget = MaterialApp(
...@@ -492,12 +474,7 @@ void main() { ...@@ -492,12 +474,7 @@ void main() {
await tester.pump(const Duration(milliseconds: 200)); await tester.pump(const Duration(milliseconds: 200));
expect(renderEditable, paintsExactlyCountTimes(#drawRect, 0)); expect(renderEditable, paintsExactlyCountTimes(#drawRect, 0));
}, });
leakTrackingTestConfig: const LeakTrackingTestConfig(
// TODO(ksokolovskyi): remove after fixing
// https://github.com/flutter/flutter/issues/134386
notDisposedAllowList: <String, int?> {'LeaderLayer': 3},
));
testWidgetsWithLeakTracking('Cursor does not show when not focused', (WidgetTester tester) async { testWidgetsWithLeakTracking('Cursor does not show when not focused', (WidgetTester tester) async {
// Regression test for https://github.com/flutter/flutter/issues/106512 . // Regression test for https://github.com/flutter/flutter/issues/106512 .
...@@ -527,12 +504,7 @@ void main() { ...@@ -527,12 +504,7 @@ void main() {
await tester.pump(); await tester.pump();
await tester.pump(const Duration(milliseconds: 100)); await tester.pump(const Duration(milliseconds: 100));
expect(renderEditable, isNot(paintsExactlyCountTimes(#drawRect, 0))); expect(renderEditable, isNot(paintsExactlyCountTimes(#drawRect, 0)));
}, });
leakTrackingTestConfig: const LeakTrackingTestConfig(
// TODO(ksokolovskyi): remove after fixing
// https://github.com/flutter/flutter/issues/134386
notDisposedAllowList: <String, int?> {'LeaderLayer': 2},
));
testWidgetsWithLeakTracking('Cursor radius is 2.0', (WidgetTester tester) async { testWidgetsWithLeakTracking('Cursor radius is 2.0', (WidgetTester tester) async {
const Widget widget = MaterialApp( const Widget widget = MaterialApp(
...@@ -1031,11 +1003,7 @@ void main() { ...@@ -1031,11 +1003,7 @@ void main() {
debugDefaultTargetPlatformOverride = null; debugDefaultTargetPlatformOverride = null;
}, },
variant: const TargetPlatformVariant(<TargetPlatform>{ TargetPlatform.iOS, TargetPlatform.macOS }), variant: const TargetPlatformVariant(<TargetPlatform>{ TargetPlatform.iOS, TargetPlatform.macOS }),
leakTrackingTestConfig: const LeakTrackingTestConfig( );
// TODO(ksokolovskyi): remove after fixing
// https://github.com/flutter/flutter/issues/134386
notDisposedAllowList: <String, int?> {'LeaderLayer': 4},
));
testWidgetsWithLeakTracking('cursor layout', (WidgetTester tester) async { testWidgetsWithLeakTracking('cursor layout', (WidgetTester tester) async {
EditableText.debugDeterministicCursor = true; EditableText.debugDeterministicCursor = true;
...@@ -1287,11 +1255,7 @@ void main() { ...@@ -1287,11 +1255,7 @@ void main() {
); );
}, },
skip: isBrowser && !isCanvasKit, // https://github.com/flutter/flutter/issues/56308 skip: isBrowser && !isCanvasKit, // https://github.com/flutter/flutter/issues/56308
leakTrackingTestConfig: const LeakTrackingTestConfig( );
// TODO(ksokolovskyi): remove after fixing
// https://github.com/flutter/flutter/issues/134386
notDisposedAllowList: <String, int?> {'LeaderLayer': 1},
));
testWidgetsWithLeakTracking('getLocalRectForCaret reports the real caret Rect', (WidgetTester tester) async { testWidgetsWithLeakTracking('getLocalRectForCaret reports the real caret Rect', (WidgetTester tester) async {
EditableText.debugDeterministicCursor = true; EditableText.debugDeterministicCursor = true;
...@@ -1337,9 +1301,5 @@ void main() { ...@@ -1337,9 +1301,5 @@ void main() {
} }
}, },
variant: TargetPlatformVariant.all(), variant: TargetPlatformVariant.all(),
leakTrackingTestConfig: const LeakTrackingTestConfig( );
// TODO(ksokolovskyi): remove after fixing
// https://github.com/flutter/flutter/issues/134386
notDisposedAllowList: <String, int?> {'LeaderLayer': 792},
));
} }
...@@ -3780,11 +3780,6 @@ void main() { ...@@ -3780,11 +3780,6 @@ void main() {
verifyAutocorrectionRectVisibility(expectVisible: false); verifyAutocorrectionRectVisibility(expectVisible: false);
}, },
leakTrackingTestConfig: const LeakTrackingTestConfig(
// TODO(ksokolovskyi): remove after fixing
// https://github.com/flutter/flutter/issues/134386
notDisposedAllowList: <String, int?> {'LeaderLayer': 5},
),
); );
testWidgetsWithLeakTracking('Changing controller updates EditableText', (WidgetTester tester) async { testWidgetsWithLeakTracking('Changing controller updates EditableText', (WidgetTester tester) async {
...@@ -12699,12 +12694,7 @@ void main() { ...@@ -12699,12 +12694,7 @@ void main() {
)); ));
EditableText.debugDeterministicCursor = false; EditableText.debugDeterministicCursor = false;
}, });
leakTrackingTestConfig: const LeakTrackingTestConfig(
// TODO(ksokolovskyi): remove after fixing
// https://github.com/flutter/flutter/issues/134386
notDisposedAllowList: <String, int?> {'LeaderLayer': 2},
));
testWidgetsWithLeakTracking('Floating cursor ending with selection', (WidgetTester tester) async { testWidgetsWithLeakTracking('Floating cursor ending with selection', (WidgetTester tester) async {
EditableText.debugDeterministicCursor = true; EditableText.debugDeterministicCursor = true;
...@@ -12884,12 +12874,7 @@ void main() { ...@@ -12884,12 +12874,7 @@ void main() {
lastSelectionChangedCause = null; lastSelectionChangedCause = null;
EditableText.debugDeterministicCursor = false; EditableText.debugDeterministicCursor = false;
}, });
leakTrackingTestConfig: const LeakTrackingTestConfig(
// TODO(ksokolovskyi): remove after fixing
// https://github.com/flutter/flutter/issues/134386
notDisposedAllowList: <String, int?> {'LeaderLayer': 8},
));
group('Selection changed scroll into view', () { group('Selection changed scroll into view', () {
final String text = List<int>.generate(64, (int index) => index).join('\n'); final String text = List<int>.generate(64, (int index) => index).join('\n');
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment