From e787b5d965cf7408287ae816b785351f0525ea3e Mon Sep 17 00:00:00 2001 From: Jackson Gardner Date: Thu, 28 Mar 2024 10:49:32 -0700 Subject: [PATCH 1/3] [skwasm] Use text position affinity when calculating word boundaries. --- .../engine/skwasm/skwasm_impl/paragraph.dart | 9 ++++++++- .../test/ui/paragraph_builder_test.dart | 19 +++++++++++++++++++ 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/paragraph.dart b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/paragraph.dart index b83233189b55a..01ffdbe613b6e 100644 --- a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/paragraph.dart +++ b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/paragraph.dart @@ -233,7 +233,14 @@ class SkwasmParagraph extends SkwasmObjectWrapper implements ui.Pa @override ui.TextRange getWordBoundary(ui.TextPosition position) => withStackScope((StackScope scope) { final Pointer outRange = scope.allocInt32Array(2); - paragraphGetWordBoundary(handle, position.offset, outRange); + final int characterPosition; + switch (position.affinity) { + case ui.TextAffinity.upstream: + characterPosition = position.offset - 1; + case ui.TextAffinity.downstream: + characterPosition = position.offset; + } + paragraphGetWordBoundary(handle, characterPosition, outRange); return ui.TextRange(start: outRange[0], end: outRange[1]); }); diff --git a/lib/web_ui/test/ui/paragraph_builder_test.dart b/lib/web_ui/test/ui/paragraph_builder_test.dart index 368b653a5e49e..b83d255b0a2de 100644 --- a/lib/web_ui/test/ui/paragraph_builder_test.dart +++ b/lib/web_ui/test/ui/paragraph_builder_test.dart @@ -40,6 +40,25 @@ Future testMain() async { expect(() => builder.build(), returnsNormally); }); + test('getWordBoundary respects position affinity', () { + final ParagraphBuilder builder = ParagraphBuilder(ParagraphStyle()); + builder.addText('hello world'); + + final Paragraph paragraph = builder.build(); + paragraph.layout(const ParagraphConstraints(width: double.infinity)); + + final TextRange downstreamWordBoundary = paragraph.getWordBoundary(const TextPosition( + offset: 5, + )); + expect(downstreamWordBoundary, const TextRange(start: 5, end: 6)); + + final TextRange upstreamWordBoundary = paragraph.getWordBoundary(const TextPosition( + offset: 5, + affinity: TextAffinity.upstream, + )); + expect(upstreamWordBoundary, const TextRange(start: 0, end: 5)); + }); + test('build and layout a paragraph with an empty addText', () { final ParagraphBuilder builder = ParagraphBuilder(ParagraphStyle()); builder.addText(''); From 4f12dc6201756ac1bc5a27421b6e1e375ab57c3d Mon Sep 17 00:00:00 2001 From: Jackson Gardner Date: Thu, 28 Mar 2024 11:34:33 -0700 Subject: [PATCH 2/3] Update lib/web_ui/lib/src/engine/skwasm/skwasm_impl/paragraph.dart Co-authored-by: Mouad Debbar --- .../lib/src/engine/skwasm/skwasm_impl/paragraph.dart | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/paragraph.dart b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/paragraph.dart index 01ffdbe613b6e..dc94d1c2624e4 100644 --- a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/paragraph.dart +++ b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/paragraph.dart @@ -233,12 +233,9 @@ class SkwasmParagraph extends SkwasmObjectWrapper implements ui.Pa @override ui.TextRange getWordBoundary(ui.TextPosition position) => withStackScope((StackScope scope) { final Pointer outRange = scope.allocInt32Array(2); - final int characterPosition; - switch (position.affinity) { - case ui.TextAffinity.upstream: - characterPosition = position.offset - 1; - case ui.TextAffinity.downstream: - characterPosition = position.offset; + final int characterPosition = switch (position.affinity) { + ui.TextAffinity.upstream => position.offset - 1, + ui.TextAffinity.downstream => position.offset, } paragraphGetWordBoundary(handle, characterPosition, outRange); return ui.TextRange(start: outRange[0], end: outRange[1]); From 717b8719c42c4bbc3a7079ae406f707789a32947 Mon Sep 17 00:00:00 2001 From: Jackson Gardner Date: Thu, 28 Mar 2024 12:00:41 -0700 Subject: [PATCH 3/3] Add missing semicolon. --- lib/web_ui/lib/src/engine/skwasm/skwasm_impl/paragraph.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/paragraph.dart b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/paragraph.dart index dc94d1c2624e4..b5d4f2c032849 100644 --- a/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/paragraph.dart +++ b/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/paragraph.dart @@ -236,7 +236,7 @@ class SkwasmParagraph extends SkwasmObjectWrapper implements ui.Pa final int characterPosition = switch (position.affinity) { ui.TextAffinity.upstream => position.offset - 1, ui.TextAffinity.downstream => position.offset, - } + }; paragraphGetWordBoundary(handle, characterPosition, outRange); return ui.TextRange(start: outRange[0], end: outRange[1]); });