From 047ea1efd4e799af617e5f5e5ed1825cde3585ab Mon Sep 17 00:00:00 2001 From: Jackson Gardner Date: Fri, 22 Mar 2024 14:56:53 -0700 Subject: [PATCH] [skwasm] Use test fonts while in debugEmulateFlutterTesterEnvironment mode (flutter/engine#51630) This brings the behavior in line with the other renderers. The framework sets this bit to make sure we render only using the Ahem font. --- .../engine/skwasm/skwasm_impl/paragraph.dart | 12 ++++++++++-- .../lib/web_ui/test/ui/line_metrics_test.dart | 19 +++++++++++++++++++ 2 files changed, 29 insertions(+), 2 deletions(-) diff --git a/engine/src/flutter/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/paragraph.dart b/engine/src/flutter/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/paragraph.dart index 97c5b173b1b..7b036779059 100644 --- a/engine/src/flutter/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/paragraph.dart +++ b/engine/src/flutter/lib/web_ui/lib/src/engine/skwasm/skwasm_impl/paragraph.dart @@ -9,10 +9,18 @@ import 'dart:js_interop'; import 'package:ui/src/engine.dart'; import 'package:ui/src/engine/skwasm/skwasm_impl.dart'; import 'package:ui/ui.dart' as ui; +import 'package:ui/ui_web/src/ui_web.dart' as ui_web; const int _kSoftLineBreak = 0; const int _kHardLineBreak = 100; +final List _testFonts = ['FlutterTest', 'Ahem']; +String _computeEffectiveFontFamily(String fontFamily) { + return ui_web.debugEmulateFlutterTesterEnvironment && !_testFonts.contains(fontFamily) + ? _testFonts.first + : fontFamily; +} + class SkwasmLineMetrics extends SkwasmObjectWrapper implements ui.LineMetrics { factory SkwasmLineMetrics({ required bool hardBreak, @@ -430,8 +438,8 @@ class SkwasmTextStyle implements ui.TextStyle { } List get fontFamilies => [ - if (fontFamily != null) fontFamily!, - if (fontFamilyFallback != null) ...fontFamilyFallback!, + if (fontFamily != null) _computeEffectiveFontFamily(fontFamily!), + if (fontFamilyFallback != null) ...fontFamilyFallback!.map(_computeEffectiveFontFamily), ]; final ui.Color? color; diff --git a/engine/src/flutter/lib/web_ui/test/ui/line_metrics_test.dart b/engine/src/flutter/lib/web_ui/test/ui/line_metrics_test.dart index 9feb049a481..b356c4c8d48 100644 --- a/engine/src/flutter/lib/web_ui/test/ui/line_metrics_test.dart +++ b/engine/src/flutter/lib/web_ui/test/ui/line_metrics_test.dart @@ -116,4 +116,23 @@ Future testMain() async { expect(metrics, hasLength(1)); } }, skip: isHtml); // The rounding hack doesn't apply to the html renderer + + test('uses flutter test fonts when debugEmulateFlutterTesterEnvironment is enabled', () { + final ui.ParagraphBuilder builder = ui.ParagraphBuilder(ui.ParagraphStyle()); + builder.pushStyle(ui.TextStyle( + fontSize: 10.0, + fontFamily: 'SomeOtherFontFamily', + )); + builder.addText('XXXX'); + final ui.Paragraph paragraph = builder.build(); + paragraph.layout(const ui.ParagraphConstraints(width: 400)); + + expect(paragraph.numberOfLines, 1); + + final ui.LineMetrics? metrics = paragraph.getLineMetricsAt(0); + expect(metrics, isNotNull); + + // FlutterTest font's 'X' character is a square, so it's the font size (10.0) * 4 characters. + expect(metrics!.width, 40.0); + }); }