Skip to content

Commit

Permalink
[web] Fix exception when getting boxes for rich text range (flutter#1…
Browse files Browse the repository at this point in the history
  • Loading branch information
mdebbar authored Apr 24, 2020
1 parent cade0e9 commit d132ac5
Show file tree
Hide file tree
Showing 2 changed files with 31 additions and 2 deletions.
14 changes: 12 additions & 2 deletions lib/web_ui/lib/src/engine/text/paragraph.dart
Original file line number Diff line number Diff line change
Expand Up @@ -359,13 +359,23 @@ class EngineParagraph implements ui.Paragraph {
}) {
assert(boxHeightStyle != null);
assert(boxWidthStyle != null);
if (_plainText == null || start == end) {
// Zero-length ranges and invalid ranges return an empty list.
if (start == end || start < 0 || end < 0) {
return <ui.TextBox>[];
}

// For rich text, we can't measure the boxes. So for now, we'll just return
// a placeholder box to stop exceptions from being thrown in the framework.
// https://github.com/flutter/flutter/issues/55587
if (_plainText == null) {
return <ui.TextBox>[
ui.TextBox.fromLTRBD(0, 0, 0, _lineHeight, _textDirection)
];
}

final int length = _plainText.length;
// Ranges that are out of bounds should return an empty list.
if (start < 0 || end < 0 || start > length || end > length) {
if (start > length || end > length) {
return <ui.TextBox>[];
}

Expand Down
19 changes: 19 additions & 0 deletions lib/web_ui/test/paragraph_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -415,6 +415,25 @@ void main() async {
);
});

testEachMeasurement('getBoxesForRange returns a box for rich text', () {
final ParagraphBuilder builder = ParagraphBuilder(ParagraphStyle(
fontFamily: 'Ahem',
fontStyle: FontStyle.normal,
fontWeight: FontWeight.normal,
fontSize: 10,
textDirection: TextDirection.ltr,
));
builder.addText('abcd');
builder.pushStyle(TextStyle(fontWeight: FontWeight.bold));
builder.addText('xyz');
final Paragraph paragraph = builder.build();
paragraph.layout(const ParagraphConstraints(width: 1000));
expect(
paragraph.getBoxesForRange(1, 2).single,
const TextBox.fromLTRBD(0, 0, 0, 10, TextDirection.ltr),
);
});

testEachMeasurement(
'getBoxesForRange return empty list for zero-length range', () {
final ParagraphBuilder builder = ParagraphBuilder(ParagraphStyle(
Expand Down

0 comments on commit d132ac5

Please sign in to comment.