diff --git a/engine/src/flutter/lib/web_ui/lib/src/engine/text/canvas_paragraph.dart b/engine/src/flutter/lib/web_ui/lib/src/engine/text/canvas_paragraph.dart index df3680ad0c..b0de4f8611 100644 --- a/engine/src/flutter/lib/web_ui/lib/src/engine/text/canvas_paragraph.dart +++ b/engine/src/flutter/lib/web_ui/lib/src/engine/text/canvas_paragraph.dart @@ -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); } diff --git a/engine/src/flutter/lib/web_ui/test/text/canvas_paragraph_test.dart b/engine/src/flutter/lib/web_ui/test/text/canvas_paragraph_test.dart index 9262f0b2d7..6a7caaaf01 100644 --- a/engine/src/flutter/lib/web_ui/test/text/canvas_paragraph_test.dart +++ b/engine/src/flutter/lib/web_ui/test/text/canvas_paragraph_test.dart @@ -767,6 +767,14 @@ Future 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));