Revert "Revert "[canvaskit] Use FontCollection API from CanvasKit to mitigate caching issues (#40673)" (#40705)" (#40740)

Reland "[canvaskit] Use FontCollection API from CanvasKit to mitigate caching issues"
diff --git a/lib/web_ui/lib/src/engine/canvaskit/canvaskit_api.dart b/lib/web_ui/lib/src/engine/canvaskit/canvaskit_api.dart
index 125c42c..6d70ee2 100644
--- a/lib/web_ui/lib/src/engine/canvaskit/canvaskit_api.dart
+++ b/lib/web_ui/lib/src/engine/canvaskit/canvaskit_api.dart
@@ -153,6 +153,7 @@
 
   external SkFontMgrNamespace get FontMgr;
   external TypefaceFontProviderNamespace get TypefaceFontProvider;
+  external FontCollectionNamespace get FontCollection;
   external SkTypefaceFactory get Typeface;
 
   @JS('GetWebGLContext')
@@ -2603,9 +2604,9 @@
 class SkParagraphBuilderNamespace {}
 
 extension SkParagraphBuilderNamespaceExtension on SkParagraphBuilderNamespace {
-  external SkParagraphBuilder MakeFromFontProvider(
+  external SkParagraphBuilder MakeFromFontCollection(
     SkParagraphStyle paragraphStyle,
-    TypefaceFontProvider? fontManager,
+    SkFontCollection? fontCollection,
   );
 
   bool RequiresClientICU() {
@@ -3074,7 +3075,6 @@
 @JS('window.flutterCanvasKit.TypefaceFontProvider')
 @staticInterop
 class TypefaceFontProvider extends SkFontMgr {
-  external factory TypefaceFontProvider();
 }
 
 extension TypefaceFontProviderExtension on TypefaceFontProvider {
@@ -3087,6 +3087,17 @@
 @JS()
 @anonymous
 @staticInterop
+class SkFontCollection {}
+
+extension SkFontCollectionExtension on SkFontCollection {
+  external void enableFontFallback();
+  external void setDefaultFontManager(TypefaceFontProvider? fontManager);
+  external void delete();
+}
+
+@JS()
+@anonymous
+@staticInterop
 class SkLineMetrics {}
 
 extension SkLineMetricsExtension on SkLineMetrics {
@@ -3320,6 +3331,14 @@
 }
 
 @JS()
+@staticInterop
+class FontCollectionNamespace{}
+
+extension FontCollectionNamespaceExtension on FontCollectionNamespace {
+  external SkFontCollection Make();
+}
+
+@JS()
 @anonymous
 @staticInterop
 class SkTypefaceFactory {}
diff --git a/lib/web_ui/lib/src/engine/canvaskit/fonts.dart b/lib/web_ui/lib/src/engine/canvaskit/fonts.dart
index cc3acca..86c5ab5 100644
--- a/lib/web_ui/lib/src/engine/canvaskit/fonts.dart
+++ b/lib/web_ui/lib/src/engine/canvaskit/fonts.dart
@@ -48,15 +48,20 @@
   final Map<String, List<SkFont>> familyToFontMap = <String, List<SkFont>>{};
 
   void _registerWithFontProvider() {
-    if (fontProvider != null) {
-      fontProvider!.delete();
-      fontProvider = null;
+    if (_fontProvider != null) {
+      _fontProvider!.delete();
+      _fontProvider = null;
+      skFontCollection?.delete();
+      skFontCollection = null;
     }
-    fontProvider = canvasKit.TypefaceFontProvider.Make();
+    _fontProvider = canvasKit.TypefaceFontProvider.Make();
+    skFontCollection = canvasKit.FontCollection.Make();
+    skFontCollection!.enableFontFallback();
+    skFontCollection!.setDefaultFontManager(_fontProvider);
     familyToFontMap.clear();
 
     for (final RegisteredFont font in _registeredFonts) {
-      fontProvider!.registerFont(font.bytes, font.family);
+      _fontProvider!.registerFont(font.bytes, font.family);
       familyToFontMap
           .putIfAbsent(font.family, () => <SkFont>[])
           .add(SkFont(font.typeface));
@@ -64,7 +69,7 @@
 
     for (final RegisteredFont font
         in FontFallbackData.instance.registeredFallbackFonts) {
-      fontProvider!.registerFont(font.bytes, font.family);
+      _fontProvider!.registerFont(font.bytes, font.family);
       familyToFontMap
           .putIfAbsent(font.family, () => <SkFont>[])
           .add(SkFont(font.typeface));
@@ -230,7 +235,8 @@
     return actualFamily;
   }
 
-  TypefaceFontProvider? fontProvider;
+  TypefaceFontProvider? _fontProvider;
+  SkFontCollection? skFontCollection;
 
   @override
   void clear() {}
diff --git a/lib/web_ui/lib/src/engine/canvaskit/text.dart b/lib/web_ui/lib/src/engine/canvaskit/text.dart
index 94a5544..4c47223 100644
--- a/lib/web_ui/lib/src/engine/canvaskit/text.dart
+++ b/lib/web_ui/lib/src/engine/canvaskit/text.dart
@@ -880,9 +880,9 @@
         _placeholderCount = 0,
         _placeholderScales = <double>[],
         _styleStack = <CkTextStyle>[],
-        _paragraphBuilder = canvasKit.ParagraphBuilder.MakeFromFontProvider(
+        _paragraphBuilder = canvasKit.ParagraphBuilder.MakeFromFontCollection(
           style.skParagraphStyle,
-          CanvasKitRenderer.instance.fontCollection.fontProvider,
+          CanvasKitRenderer.instance.fontCollection.skFontCollection,
         ) {
     _styleStack.add(_style.getTextStyle());
   }
diff --git a/lib/web_ui/test/canvaskit/canvaskit_api_test.dart b/lib/web_ui/test/canvaskit/canvaskit_api_test.dart
index 0861290..6920f5e 100644
--- a/lib/web_ui/test/canvaskit/canvaskit_api_test.dart
+++ b/lib/web_ui/test/canvaskit/canvaskit_api_test.dart
@@ -1591,9 +1591,9 @@
       ..forceStrutHeight = false;
 
     final SkParagraphStyle paragraphStyle = canvasKit.ParagraphStyle(props);
-    final SkParagraphBuilder builder = canvasKit.ParagraphBuilder.MakeFromFontProvider(
+    final SkParagraphBuilder builder = canvasKit.ParagraphBuilder.MakeFromFontCollection(
       paragraphStyle,
-      CanvasKitRenderer.instance.fontCollection.fontProvider,
+      CanvasKitRenderer.instance.fontCollection.skFontCollection,
     );
 
     builder.addText('Hello');
@@ -1737,9 +1737,9 @@
       ..fontStyle = (SkFontStyle()..weight = canvasKit.FontWeight.Normal);
     final SkParagraphStyle paragraphStyle = canvasKit.ParagraphStyle(props);
     final SkParagraphBuilder builder =
-        canvasKit.ParagraphBuilder.MakeFromFontProvider(
+        canvasKit.ParagraphBuilder.MakeFromFontCollection(
       paragraphStyle,
-      CanvasKitRenderer.instance.fontCollection.fontProvider,
+      CanvasKitRenderer.instance.fontCollection.skFontCollection,
     );
     builder.addText('hello');