From 144f16c81acdae2651606ad829aaea070b37f8f1 Mon Sep 17 00:00:00 2001 From: Mouad Debbar Date: Wed, 21 Jun 2023 11:30:22 -0400 Subject: [PATCH 1/2] [web] Don't get break type from v8BreakIterator --- .../lib/src/engine/text/line_breaker.dart | 25 +++++------- .../test/html/text/line_breaker_test.dart | 40 +++++++++++++++++++ 2 files changed, 49 insertions(+), 16 deletions(-) diff --git a/lib/web_ui/lib/src/engine/text/line_breaker.dart b/lib/web_ui/lib/src/engine/text/line_breaker.dart index c6d95c95c556b..98b02aa73af40 100644 --- a/lib/web_ui/lib/src/engine/text/line_breaker.dart +++ b/lib/web_ui/lib/src/engine/text/line_breaker.dart @@ -84,8 +84,6 @@ List breakLinesUsingV8BreakIterator(String text, JSString jsT iterator.adoptText(jsText); iterator.first(); while (iterator.next() != -1) { - final LineBreakType type = _getV8BreakType(text, iterator); - final int fragmentEnd = iterator.current().toInt(); int trailingNewlines = 0; int trailingSpaces = 0; @@ -115,6 +113,15 @@ List breakLinesUsingV8BreakIterator(String text, JSString jsT } } + final LineBreakType type; + if (trailingNewlines > 0) { + type = LineBreakType.mandatory; + } else if (fragmentEnd == text.length) { + type = LineBreakType.endOfText; + } else { + type = LineBreakType.opportunity; + } + breaks.add(LineBreakFragment( fragmentStart, fragmentEnd, @@ -132,20 +139,6 @@ List breakLinesUsingV8BreakIterator(String text, JSString jsT return breaks; } -/// Gets break type from v8BreakIterator. -LineBreakType _getV8BreakType(String text, DomV8BreakIterator iterator) { - final int fragmentEnd = iterator.current().toInt(); - - // I don't know why v8BreakIterator uses the type "none" to mean "soft break". - if (iterator.breakType() != 'none') { - return LineBreakType.mandatory; - } - if (fragmentEnd == text.length) { - return LineBreakType.endOfText; - } - return LineBreakType.opportunity; -} - class LineBreakFragment extends TextFragment { const LineBreakFragment(super.start, super.end, this.type, { required this.trailingNewlines, diff --git a/lib/web_ui/test/html/text/line_breaker_test.dart b/lib/web_ui/test/html/text/line_breaker_test.dart index 2bd99fcc20e4d..245261f72f8be 100644 --- a/lib/web_ui/test/html/text/line_breaker_test.dart +++ b/lib/web_ui/test/html/text/line_breaker_test.dart @@ -410,6 +410,46 @@ void testMain() { } }); }); + + group('v8BreakIterator hard line breaks', () { + List split(String text) { + return V8LineBreakFragmenter(text) + .fragment() + .map((LineBreakFragment fragment) => Line.fromLineBreakFragment(text, fragment)) + .toList(); + } + + test('thai text with hard line breaks', () { + const String thaiText = '\u0E1A\u0E38\u0E1C\u0E25\u0E01\u0E32\u0E23'; + expect(split(thaiText), [ + Line('\u0E1A\u0E38', opportunity), + Line('\u0E1C\u0E25', opportunity), + Line('\u0E01\u0E32\u0E23', endOfText), + ]); + expect(split('$thaiText\n'), [ + Line('\u0E1A\u0E38', opportunity), + Line('\u0E1C\u0E25', opportunity), + Line('\u0E01\u0E32\u0E23\n', mandatory, nl: 1, sp: 1), + Line('', endOfText), + ]); + }); + + test('khmer text with hard line breaks', () { + const String khmerText = + '\u179B\u1792\u17D2\u179C\u17BE\u17B2\u17D2\u1799'; + expect(split(khmerText), [ + Line('\u179B', opportunity), + Line('\u1792\u17D2\u179C\u17BE', opportunity), + Line('\u17B2\u17D2\u1799', endOfText), + ]); + expect(split('$khmerText\n'), [ + Line('\u179B', opportunity), + Line('\u1792\u17D2\u179C\u17BE', opportunity), + Line('\u17B2\u17D2\u1799\n', mandatory, nl: 1, sp: 1), + Line('', endOfText), + ]); + }); + }); } typedef CreateLineBreakFragmenter = LineBreakFragmenter Function(String text); From e0c00910c5fac696b638bcfc9fb046c24f87a3fe Mon Sep 17 00:00:00 2001 From: Mouad Debbar Date: Thu, 22 Jun 2023 10:20:13 -0400 Subject: [PATCH 2/2] skip new tests on non-Chromium browsers --- lib/web_ui/test/html/text/line_breaker_test.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/web_ui/test/html/text/line_breaker_test.dart b/lib/web_ui/test/html/text/line_breaker_test.dart index 245261f72f8be..9bb3db9e62ac9 100644 --- a/lib/web_ui/test/html/text/line_breaker_test.dart +++ b/lib/web_ui/test/html/text/line_breaker_test.dart @@ -449,7 +449,7 @@ void testMain() { Line('', endOfText), ]); }); - }); + }, skip: domIntl.v8BreakIterator == null); } typedef CreateLineBreakFragmenter = LineBreakFragmenter Function(String text);