From c8e3e7e9bdd21fa24dd540ff43a11891d40ffe01 Mon Sep 17 00:00:00 2001 From: chunhtai <47866232+chunhtai@users.noreply.github.com> Date: Mon, 10 Oct 2022 15:45:31 -0700 Subject: [PATCH] Apply text affinity fix to html rendering (flutter/engine#36699) --- .../lib/src/engine/text/canvas_paragraph.dart | 14 +++++++++++--- .../web_ui/test/text/canvas_paragraph_test.dart | 8 ++++++++ 2 files changed, 19 insertions(+), 3 deletions(-) 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));