[web] Make sure to include all split fonts (flutter/engine#56733)

The `csslib` parser was not reliably parsing all URLs in the CSS response. I'm switching to using a RegExp to extract all URLs reliably.

Fixes https://github.com/flutter/flutter/issues/159215
This commit is contained in:
Mouad Debbar 2024-11-21 09:35:18 -05:00 committed by GitHub
parent 3e281cda44
commit b56fac41f9
5 changed files with 32757 additions and 32720 deletions

2
DEPS
View File

@ -925,7 +925,7 @@ deps = {
'packages': [
{
'package': 'flutter/flutter_font_fallbacks',
'version': '8a753fd2150c398a5777a7fdb24fc9d4d5fe8015088c5237b61cf0ff26653fd0'
'version': '44bd38be0bc8c189a397ca6dd6f737746a9e0c6117b96a8f84f1edf6acd1206b'
}
],
'dep_type': 'cipd',

View File

@ -9,8 +9,6 @@ import 'dart:typed_data';
import 'package:args/command_runner.dart';
import 'package:convert/convert.dart';
import 'package:crypto/crypto.dart' as crypto;
import 'package:csslib/parser.dart' as csslib;
import 'package:csslib/visitor.dart' show StyleSheet, UriTerm, Visitor;
import 'package:http/http.dart' as http;
import 'package:path/path.dart' as path;
@ -346,13 +344,14 @@ OTHER DEALINGS IN THE FONT SOFTWARE.
'Chrome/112.0.0.0 Safari/537.36'
});
final String cssString = response.body;
final StyleSheet stylesheet = csslib.parse(cssString);
final UriCollector uriCollector = UriCollector();
stylesheet.visit(uriCollector);
// Match the patterns that look like:
// `src: url(...some url...)`
final r = RegExp(r'src:\s*url\((https?://[^)]+?\.woff2)\)');
int familyCount = 0;
// Give each font shard a unique family name.
for (final Uri uri in uriCollector.uris) {
for (final match in r.allMatches(cssString)) {
final String family = '$font $familyCount';
final Uri uri = Uri.parse(match.group(1)!);
processedFonts.add((
family: family,
uri: uri,
@ -364,15 +363,6 @@ OTHER DEALINGS IN THE FONT SOFTWARE.
}
}
class UriCollector extends Visitor {
final List<Uri> uris = <Uri>[];
@override
void visitUriTerm(UriTerm uriTerm) {
uris.add(Uri.parse(uriTerm.value as String));
}
}
/// Fonts that should be downloaded directly from the Google Fonts API.
const List<String> apiFallbackFonts = <String>[
'Noto Sans',

File diff suppressed because one or more lines are too long

View File

@ -21,7 +21,6 @@ dev_dependencies:
archive: 3.6.1
args: any
async: any
csslib: 1.0.0
convert: any
crypto: any
html: 0.15.4

View File

@ -384,11 +384,11 @@ void testMain() {
...[for (int i = 0; i <= 2; i++) 'Noto Sans Cuneiform $i'],
...[for (int i = 0; i <= 2; i++) 'Noto Sans Duployan $i'],
...[for (int i = 0; i <= 2; i++) 'Noto Sans Egyptian Hieroglyphs $i'],
...[for (int i = 0; i <= 103; i++) 'Noto Sans HK $i'],
...[for (int i = 0; i <= 108; i++) 'Noto Sans HK $i'],
...[for (int i = 0; i <= 123; i++) 'Noto Sans JP $i'],
...[for (int i = 0; i <= 117; i++) 'Noto Sans KR $i'],
...[for (int i = 0; i <= 95; i++) 'Noto Sans SC $i'],
...[for (int i = 0; i <= 99; i++) 'Noto Sans TC $i'],
...[for (int i = 0; i <= 123; i++) 'Noto Sans KR $i'],
...[for (int i = 0; i <= 100; i++) 'Noto Sans SC $i'],
...[for (int i = 0; i <= 104; i++) 'Noto Sans TC $i'],
'Noto Music',
'Noto Sans',
'Noto Sans Symbols',