Skip to content

Commit 0af2a84

Browse files
author
Jonah Williams
authored
Handle empty entry in asset list and add more explicit validation (#41735)
1 parent b1a6aa3 commit 0af2a84

2 files changed

Lines changed: 37 additions & 6 deletions

File tree

‎packages/flutter_tools/lib/src/flutter_manifest.dart‎

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -186,16 +186,27 @@ class FlutterManifest {
186186
: fontList.map<Map<String, dynamic>>(castStringKeyedMap).toList();
187187
}
188188

189-
List<Uri> get assets {
189+
List<Uri> get assets => _assets ??= _computeAssets();
190+
List<Uri> _assets;
191+
List<Uri> _computeAssets() {
190192
final List<dynamic> assets = _flutterDescriptor['assets'];
191193
if (assets == null) {
192194
return const <Uri>[];
193195
}
194-
return assets
195-
.cast<String>()
196-
.map<String>(Uri.encodeFull)
197-
?.map<Uri>(Uri.parse)
198-
?.toList();
196+
final List<Uri> results = <Uri>[];
197+
for (Object asset in assets) {
198+
if (asset is! String || asset == null || asset == '') {
199+
printError('Asset manifest contains a null or empty uri.');
200+
continue;
201+
}
202+
final String stringAsset = asset;
203+
try {
204+
results.add(Uri.parse(Uri.encodeFull(stringAsset)));
205+
} on FormatException {
206+
printError('Asset manifest contains invalid uri: $asset.');
207+
}
208+
}
209+
return results;
199210
}
200211

201212
List<Font> _fonts;

‎packages/flutter_tools/test/general.shard/flutter_manifest_test.dart‎

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -572,6 +572,26 @@ flutter:
572572
expect(flutterManifest, null);
573573
expect(logger.errorText, contains('Expected a map.'));
574574
});
575+
576+
testUsingContext('Does not crash on empty entry', () async {
577+
final BufferLogger logger = context.get<Logger>();
578+
const String manifest = '''
579+
name: test
580+
dependencies:
581+
flutter:
582+
sdk: flutter
583+
flutter:
584+
uses-material-design: true
585+
assets:
586+
- lib/gallery/example_code.dart
587+
-
588+
''';
589+
final FlutterManifest flutterManifest = FlutterManifest.createFromString(manifest);
590+
final List<Uri> assets = flutterManifest.assets;
591+
592+
expect(logger.errorText, contains('Asset manifest contains a null or empty uri.'));
593+
expect(assets.length, 1);
594+
});
575595
});
576596

577597
group('FlutterManifest with MemoryFileSystem', () {

0 commit comments

Comments
 (0)