diff --git a/packages/flutter/lib/src/rendering/paragraph.dart b/packages/flutter/lib/src/rendering/paragraph.dart index 1742c190fa..cc3407fa3f 100644 --- a/packages/flutter/lib/src/rendering/paragraph.dart +++ b/packages/flutter/lib/src/rendering/paragraph.dart @@ -281,15 +281,16 @@ class RenderParagraph extends RenderBox { @override void performLayout() { _layoutTextWithConstraints(constraints); - // We grab _textPainter.size here because assigning to `size` will trigger - // us to validate our intrinsic sizes, which will change _textPainter's - // layout because the intrinsic size calculations are destructive. - // Other _textPainter state like didExceedMaxLines will also be affected. - // See also RenderEditable which has a similar issue. + // We grab _textPainter.size and _textPainter.didExceedMaxLines here because + // assigning to `size` will trigger us to validate our intrinsic sizes, + // which will change _textPainter's layout because the intrinsic size + // calculations are destructive. Other _textPainter state will also be + // affected. See also RenderEditable which has a similar issue. final Size textSize = _textPainter.size; - final bool didOverflowHeight = _textPainter.didExceedMaxLines; + final bool textDidExceedMaxLines = _textPainter.didExceedMaxLines; size = constraints.constrain(textSize); + final bool didOverflowHeight = size.height < textSize.height || textDidExceedMaxLines; final bool didOverflowWidth = size.width < textSize.width; // TODO(abarth): We're only measuring the sizes of the line boxes here. If // the glyphs draw outside the line boxes, we might think that there isn't diff --git a/packages/flutter/test/widgets/text_test.dart b/packages/flutter/test/widgets/text_test.dart index 550a70f9a1..a519c84a4b 100644 --- a/packages/flutter/test/widgets/text_test.dart +++ b/packages/flutter/test/widgets/text_test.dart @@ -7,6 +7,7 @@ import 'package:flutter_test/flutter_test.dart'; import 'package:flutter/widgets.dart'; import 'package:flutter/foundation.dart'; +import '../rendering/mock_canvas.dart'; import 'semantics_tester.dart'; void main() { @@ -246,4 +247,73 @@ void main() { expect(semantics, hasSemantics(expectedSemantics, ignoreTransform: true, ignoreId: true)); semantics.dispose(); }, skip: true); // TODO(jonahwilliams): correct once https://github.com/flutter/flutter/issues/20891 is resolved. + + + testWidgets('Overflow is clipping correctly - short text with overflow: clip', (WidgetTester tester) async { + await _pumpTextWidget( + tester: tester, + overflow: TextOverflow.clip, + text: 'Hi', + ); + + expect(find.byType(Text), isNot(paints..clipRect())); + }); + + testWidgets('Overflow is clipping correctly - long text with overflow: ellipsis', (WidgetTester tester) async { + await _pumpTextWidget( + tester: tester, + overflow: TextOverflow.ellipsis, + text: 'a long long long long text, should be clip', + ); + + expect(find.byType(Text), paints..clipRect(rect: Rect.fromLTWH(0, 0, 50, 50))); + }); + + testWidgets('Overflow is clipping correctly - short text with overflow: ellipsis', (WidgetTester tester) async { + await _pumpTextWidget( + tester: tester, + overflow: TextOverflow.ellipsis, + text: 'Hi', + ); + + expect(find.byType(Text), isNot(paints..clipRect())); + }); + + testWidgets('Overflow is clipping correctly - long text with overflow: fade', (WidgetTester tester) async { + await _pumpTextWidget( + tester: tester, + overflow: TextOverflow.fade, + text: 'a long long long long text, should be clip', + ); + + expect(find.byType(Text), paints..clipRect(rect: Rect.fromLTWH(0, 0, 50, 50))); + }); + + testWidgets('Overflow is clipping correctly - short text with overflow: fade', (WidgetTester tester) async { + await _pumpTextWidget( + tester: tester, + overflow: TextOverflow.fade, + text: 'Hi', + ); + + expect(find.byType(Text), isNot(paints..clipRect())); + }); +} + +Future _pumpTextWidget({ WidgetTester tester, String text, TextOverflow overflow }) { + return tester.pumpWidget( + Directionality( + textDirection: TextDirection.ltr, + child: Center( + child: Container( + width: 50.0, + height: 50.0, + child: Text( + text, + overflow: overflow, + ), + ), + ), + ), + ); }