Skip to content

Commit 9bc723b

Browse files
author
Harry Terkelsen
authored
[canvaskit] Correctly get the directionality of the text boxes (flutter#34264)
1 parent 544bf7b commit 9bc723b

File tree

2 files changed

+20
-3
lines changed

2 files changed

+20
-3
lines changed

lib/web_ui/lib/src/engine/canvaskit/text.dart

+4-3
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import 'dart:typed_data';
77
import 'package:meta/meta.dart';
88
import 'package:ui/ui.dart' as ui;
99

10+
import '../safe_browser_api.dart';
1011
import '../util.dart';
1112
import 'canvaskit_api.dart';
1213
import 'font_fallbacks.dart';
@@ -44,7 +45,6 @@ class CkParagraphStyle implements ui.ParagraphStyle {
4445
ellipsis,
4546
locale,
4647
),
47-
_textDirection = textDirection ?? ui.TextDirection.ltr,
4848
_fontFamily = ui.debugEmulateFlutterTesterEnvironment ? 'Ahem' : fontFamily,
4949
_fontSize = fontSize,
5050
_height = height,
@@ -53,7 +53,6 @@ class CkParagraphStyle implements ui.ParagraphStyle {
5353
_fontStyle = fontStyle;
5454

5555
final SkParagraphStyle skParagraphStyle;
56-
final ui.TextDirection? _textDirection;
5756
final String? _fontFamily;
5857
final double? _fontSize;
5958
final double? _height;
@@ -729,12 +728,14 @@ class CkParagraph extends SkiaObject<SkParagraph> implements ui.Paragraph {
729728

730729
for (int i = 0; i < skRects.length; i++) {
731730
final Float32List rect = skRects[i];
731+
final int skTextDirection =
732+
getJsProperty(getJsProperty(rect, 'direction'), 'value');
732733
result.add(ui.TextBox.fromLTRBD(
733734
rect[0],
734735
rect[1],
735736
rect[2],
736737
rect[3],
737-
_paragraphStyle._textDirection!,
738+
ui.TextDirection.values[skTextDirection],
738739
));
739740
}
740741

lib/web_ui/test/canvaskit/text_test.dart

+16
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,22 @@ void testMain() {
5454
expect(paragraph, isNotNull);
5555
}
5656
});
57+
58+
// Regression test for https://github.com/flutter/flutter/issues/78550
59+
test('getBoxesForRange works for LTR text in an RTL paragraph', () {
60+
// Create builder for an RTL paragraph.
61+
final ui.ParagraphBuilder builder = ui.ParagraphBuilder(
62+
ui.ParagraphStyle(fontSize: 16, textDirection: ui.TextDirection.rtl));
63+
builder.addText('hello');
64+
final ui.Paragraph paragraph = builder.build();
65+
paragraph.layout(const ui.ParagraphConstraints(width: 100));
66+
expect(paragraph, isNotNull);
67+
final List<ui.TextBox> boxes = paragraph.getBoxesForRange(0, 1);
68+
expect(boxes, hasLength(1));
69+
// The direction for this span is LTR even though the paragraph is RTL
70+
// because the directionality of the 'h' is LTR.
71+
expect(boxes.single.direction, equals(ui.TextDirection.ltr));
72+
});
5773
// TODO(hterkelsen): https://github.com/flutter/flutter/issues/60040
5874
}, skip: isIosSafari);
5975
}

0 commit comments

Comments
 (0)