From e689699e2aaa7d64c235014474046a613180032c Mon Sep 17 00:00:00 2001 From: Mouad Debbar Date: Wed, 8 Mar 2023 17:21:17 -0500 Subject: [PATCH] [web] Fix SkParagraphBuilder tests for the chromium variant (flutter/engine#40152) [web] Fix SkParagraphBuilder tests for the chromium variant --- .../web_ui/lib/src/engine/canvaskit/text.dart | 9 +------- .../src/engine/canvaskit/text_fragmenter.dart | 21 +++++++++++++++++++ .../test/canvaskit/canvaskit_api_test.dart | 7 +++++++ 3 files changed, 29 insertions(+), 8 deletions(-) diff --git a/engine/src/flutter/lib/web_ui/lib/src/engine/canvaskit/text.dart b/engine/src/flutter/lib/web_ui/lib/src/engine/canvaskit/text.dart index b0dcf96d519..dfd272ca3bf 100644 --- a/engine/src/flutter/lib/web_ui/lib/src/engine/canvaskit/text.dart +++ b/engine/src/flutter/lib/web_ui/lib/src/engine/canvaskit/text.dart @@ -985,14 +985,7 @@ class CkParagraphBuilder implements ui.ParagraphBuilder { /// Builds the CkParagraph with the builder and deletes the builder. SkParagraph _buildSkParagraph() { if (canvasKitVariant == CanvasKitVariant.chromium) { - final String text = _paragraphBuilder.getText(); - _paragraphBuilder.setWordsUtf16( - fragmentUsingIntlSegmenter(text, IntlSegmenterGranularity.word), - ); - _paragraphBuilder.setGraphemeBreaksUtf16( - fragmentUsingIntlSegmenter(text, IntlSegmenterGranularity.grapheme), - ); - _paragraphBuilder.setLineBreaksUtf16(fragmentUsingV8LineBreaker(text)); + injectClientICU(_paragraphBuilder); } final SkParagraph result = _paragraphBuilder.build(); _paragraphBuilder.delete(); diff --git a/engine/src/flutter/lib/web_ui/lib/src/engine/canvaskit/text_fragmenter.dart b/engine/src/flutter/lib/web_ui/lib/src/engine/canvaskit/text_fragmenter.dart index e133da30e47..ef55f170a21 100644 --- a/engine/src/flutter/lib/web_ui/lib/src/engine/canvaskit/text_fragmenter.dart +++ b/engine/src/flutter/lib/web_ui/lib/src/engine/canvaskit/text_fragmenter.dart @@ -7,6 +7,27 @@ import 'dart:typed_data'; import '../dom.dart'; import '../text/line_breaker.dart'; import 'canvaskit_api.dart'; +import 'renderer.dart'; + +/// Injects required ICU data into the [builder]. +/// +/// This should only be used with the CanvasKit Chromium variant that's compiled +/// without ICU data. +void injectClientICU(SkParagraphBuilder builder) { + assert( + canvasKitVariant == CanvasKitVariant.chromium, + 'This method should only be used with the CanvasKit Chromium variant.', + ); + + final String text = builder.getText(); + builder.setWordsUtf16( + fragmentUsingIntlSegmenter(text, IntlSegmenterGranularity.word), + ); + builder.setGraphemeBreaksUtf16( + fragmentUsingIntlSegmenter(text, IntlSegmenterGranularity.grapheme), + ); + builder.setLineBreaksUtf16(fragmentUsingV8LineBreaker(text)); +} /// The granularity at which to segment text. /// diff --git a/engine/src/flutter/lib/web_ui/test/canvaskit/canvaskit_api_test.dart b/engine/src/flutter/lib/web_ui/test/canvaskit/canvaskit_api_test.dart index add81a14cff..82602bd87c0 100644 --- a/engine/src/flutter/lib/web_ui/test/canvaskit/canvaskit_api_test.dart +++ b/engine/src/flutter/lib/web_ui/test/canvaskit/canvaskit_api_test.dart @@ -1624,6 +1624,9 @@ void _paragraphTests() { builder.pushStyle( canvasKit.TextStyle(SkTextStyleProperties()..halfLeading = true)); builder.pop(); + if (canvasKitVariant == CanvasKitVariant.chromium) { + injectClientICU(builder); + } final SkParagraph paragraph = builder.build(); paragraph.layout(500); @@ -1739,6 +1742,10 @@ void _paragraphTests() { ); builder.addText('hello'); + if (canvasKitVariant == CanvasKitVariant.chromium) { + injectClientICU(builder); + } + final SkParagraph paragraph = builder.build(); paragraph.layout(500);