Unverified Commit 0af2a84c authored by Jonah Williams's avatar Jonah Williams Committed by GitHub

Handle empty entry in asset list and add more explicit validation (#41735)

parent b1a6aa3a
...@@ -186,16 +186,27 @@ class FlutterManifest { ...@@ -186,16 +186,27 @@ class FlutterManifest {
: fontList.map<Map<String, dynamic>>(castStringKeyedMap).toList(); : fontList.map<Map<String, dynamic>>(castStringKeyedMap).toList();
} }
List<Uri> get assets { List<Uri> get assets => _assets ??= _computeAssets();
List<Uri> _assets;
List<Uri> _computeAssets() {
final List<dynamic> assets = _flutterDescriptor['assets']; final List<dynamic> assets = _flutterDescriptor['assets'];
if (assets == null) { if (assets == null) {
return const <Uri>[]; return const <Uri>[];
} }
return assets final List<Uri> results = <Uri>[];
.cast<String>() for (Object asset in assets) {
.map<String>(Uri.encodeFull) if (asset is! String || asset == null || asset == '') {
?.map<Uri>(Uri.parse) printError('Asset manifest contains a null or empty uri.');
?.toList(); continue;
}
final String stringAsset = asset;
try {
results.add(Uri.parse(Uri.encodeFull(stringAsset)));
} on FormatException {
printError('Asset manifest contains invalid uri: $asset.');
}
}
return results;
} }
List<Font> _fonts; List<Font> _fonts;
......
...@@ -572,6 +572,26 @@ flutter: ...@@ -572,6 +572,26 @@ flutter:
expect(flutterManifest, null); expect(flutterManifest, null);
expect(logger.errorText, contains('Expected a map.')); expect(logger.errorText, contains('Expected a map.'));
}); });
testUsingContext('Does not crash on empty entry', () async {
final BufferLogger logger = context.get<Logger>();
const String manifest = '''
name: test
dependencies:
flutter:
sdk: flutter
flutter:
uses-material-design: true
assets:
- lib/gallery/example_code.dart
-
''';
final FlutterManifest flutterManifest = FlutterManifest.createFromString(manifest);
final List<Uri> assets = flutterManifest.assets;
expect(logger.errorText, contains('Asset manifest contains a null or empty uri.'));
expect(assets.length, 1);
});
}); });
group('FlutterManifest with MemoryFileSystem', () { group('FlutterManifest with MemoryFileSystem', () {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment