Apply text affinity fix to html rendering (flutter/engine#36699)

This commit is contained in:
chunhtai
2022-10-10 15:45:31 -07:00
committed by GitHub
parent 0faaa9756f
commit c8e3e7e9bd
2 changed files with 19 additions and 3 deletions

View File

@@ -229,9 +229,17 @@ class CanvasParagraph implements ui.Paragraph {
@override
ui.TextRange getWordBoundary(ui.TextPosition position) {
final String text = toPlainText();
final int start = WordBreaker.prevBreakIndex(text, position.offset + 1);
final int end = WordBreaker.nextBreakIndex(text, position.offset);
final int characterPosition;
switch (position.affinity) {
case ui.TextAffinity.upstream:
characterPosition = position.offset - 1;
break;
case ui.TextAffinity.downstream:
characterPosition = position.offset;
break;
}
final int start = WordBreaker.prevBreakIndex(text, characterPosition + 1);
final int end = WordBreaker.nextBreakIndex(text, characterPosition);
return ui.TextRange(start: start, end: end);
}

View File

@@ -767,6 +767,14 @@ Future<void> testMain() async {
expect(paragraph.getWordBoundary(const ui.TextPosition(offset: 17)), endRange);
});
test('$CanvasParagraph.getWordBoundary can handle text affinity', () {
final ui.Paragraph paragraph = plain(ahemStyle, 'Lorem ipsum dolor');
const ui.TextRange loremRange = ui.TextRange(start: 0, end: 5);
expect(paragraph.getWordBoundary(const ui.TextPosition(offset: 4)), loremRange);
expect(paragraph.getWordBoundary(const ui.TextPosition(offset: 5, affinity: ui.TextAffinity.upstream)), loremRange);
});
test('$CanvasParagraph.longestLine', () {
final ui.Paragraph paragraph = plain(ahemStyle, 'abcd\nabcde abc');
paragraph.layout(const ui.ParagraphConstraints(width: 80.0));