From cadb264d2612a372652022caaf06ab8fee434e7c Mon Sep 17 00:00:00 2001 From: Christopher Fujino Date: Wed, 13 Jul 2022 15:38:07 -0700 Subject: [PATCH] [flutter_tools] Catch more general XmlException rather than XmlParserException (#107574) --- .../lib/src/android/application_package.dart | 2 +- ...ferred_components_gen_snapshot_validator.dart | 2 +- .../deferred_components_prebuild_validator.dart | 2 +- .../flutter_tools/lib/src/android/gradle.dart | 2 +- .../flutter_tools/lib/src/android/multidex.dart | 4 +--- packages/flutter_tools/lib/src/project.dart | 2 +- .../test/general.shard/project_test.dart | 16 ++++++++++++++-- 7 files changed, 20 insertions(+), 10 deletions(-) diff --git a/packages/flutter_tools/lib/src/android/application_package.dart b/packages/flutter_tools/lib/src/android/application_package.dart index 236e71efdd..25c2cc3086 100644 --- a/packages/flutter_tools/lib/src/android/application_package.dart +++ b/packages/flutter_tools/lib/src/android/application_package.dart @@ -139,7 +139,7 @@ class AndroidApk extends ApplicationPackage implements PrebuiltApplicationPackag XmlDocument document; try { document = XmlDocument.parse(manifestString); - } on XmlParserException catch (exception) { + } on XmlException catch (exception) { String manifestLocation; if (androidProject.isUsingGradle) { manifestLocation = fileSystem.path.join(androidProject.hostAppGradleRoot.path, 'app', 'src', 'main', 'AndroidManifest.xml'); diff --git a/packages/flutter_tools/lib/src/android/deferred_components_gen_snapshot_validator.dart b/packages/flutter_tools/lib/src/android/deferred_components_gen_snapshot_validator.dart index 4d08cce0de..90acc22bc4 100644 --- a/packages/flutter_tools/lib/src/android/deferred_components_gen_snapshot_validator.dart +++ b/packages/flutter_tools/lib/src/android/deferred_components_gen_snapshot_validator.dart @@ -84,7 +84,7 @@ class DeferredComponentsGenSnapshotValidator extends DeferredComponentsValidator XmlDocument document; try { document = XmlDocument.parse(appManifestFile.readAsStringSync()); - } on XmlParserException { + } on XmlException { invalidFiles[appManifestFile.path] = 'Error parsing $appManifestFile ' 'Please ensure that the android manifest is a valid XML document and ' 'try again.'; diff --git a/packages/flutter_tools/lib/src/android/deferred_components_prebuild_validator.dart b/packages/flutter_tools/lib/src/android/deferred_components_prebuild_validator.dart index eef9f46146..4d14e4b3bd 100644 --- a/packages/flutter_tools/lib/src/android/deferred_components_prebuild_validator.dart +++ b/packages/flutter_tools/lib/src/android/deferred_components_prebuild_validator.dart @@ -136,7 +136,7 @@ class DeferredComponentsPrebuildValidator extends DeferredComponentsValidator { XmlDocument document; try { document = XmlDocument.parse(stringRes.readAsStringSync()); - } on XmlParserException { + } on XmlException { invalidFiles[stringRes.path] = 'Error parsing $stringRes ' 'Please ensure that the strings.xml is a valid XML document and ' 'try again.'; diff --git a/packages/flutter_tools/lib/src/android/gradle.dart b/packages/flutter_tools/lib/src/android/gradle.dart index fddbe1d4e0..547a921057 100644 --- a/packages/flutter_tools/lib/src/android/gradle.dart +++ b/packages/flutter_tools/lib/src/android/gradle.dart @@ -958,7 +958,7 @@ String _getLocalArtifactVersion(String pomPath, FileSystem fileSystem) { XmlDocument document; try { document = XmlDocument.parse(pomFile.readAsStringSync()); - } on XmlParserException { + } on XmlException { throwToolExit( 'Error parsing $pomPath. Please ensure that this is a valid XML document.' ); diff --git a/packages/flutter_tools/lib/src/android/multidex.dart b/packages/flutter_tools/lib/src/android/multidex.dart index 2f2264c66c..821f912785 100644 --- a/packages/flutter_tools/lib/src/android/multidex.dart +++ b/packages/flutter_tools/lib/src/android/multidex.dart @@ -93,9 +93,7 @@ bool androidManifestHasNameVariable(final Directory projectDir) { XmlDocument document; try { document = XmlDocument.parse(manifestFile.readAsStringSync()); - } on XmlParserException { - return false; - } on XmlTagException { + } on XmlException { return false; } on FileSystemException { return false; diff --git a/packages/flutter_tools/lib/src/project.dart b/packages/flutter_tools/lib/src/project.dart index 09fbd6bb3a..03b01604a5 100644 --- a/packages/flutter_tools/lib/src/project.dart +++ b/packages/flutter_tools/lib/src/project.dart @@ -647,7 +647,7 @@ The detected reason was: XmlDocument document; try { document = XmlDocument.parse(appManifestFile.readAsStringSync()); - } on XmlParserException { + } on XmlException { throwToolExit('Error parsing $appManifestFile ' 'Please ensure that the android manifest is a valid XML document and try again.'); } on FileSystemException { diff --git a/packages/flutter_tools/test/general.shard/project_test.dart b/packages/flutter_tools/test/general.shard/project_test.dart index a4bd7bbf53..a336d8cc74 100644 --- a/packages/flutter_tools/test/general.shard/project_test.dart +++ b/packages/flutter_tools/test/general.shard/project_test.dart @@ -188,6 +188,16 @@ void main() { await project.regeneratePlatformSpecificTooling(); expectExists(project.android.hostAppGradleRoot.childFile('local.properties')); }); + _testInMemory('checkForDeprecation fails on invalid android app manifest file', () async { + // This is not a valid Xml document + const String invalidManifest = ''; + final FlutterProject project = await someProject(androidManifestOverride: invalidManifest); + + expect( + () => project.checkForDeprecation(deprecationBehavior: DeprecationBehavior.ignore), + throwsToolExit(message: 'Please ensure that the android manifest is a valid XML document and try again.'), + ); + }); _testInMemory('Android project not on v2 embedding shows a warning', () async { final FlutterProject project = await someProject(); // The default someProject with an empty already indicates @@ -769,7 +779,9 @@ apply plugin: 'kotlin-android' }); } -Future someProject() async { +Future someProject({ + String androidManifestOverride, +}) async { final Directory directory = globals.fs.directory('some_project'); directory.childDirectory('.dart_tool') .childFile('package_config.json') @@ -781,7 +793,7 @@ Future someProject() async { ..createSync(recursive: true); androidDirectory .childFile('AndroidManifest.xml') - .writeAsStringSync(''); + .writeAsStringSync(androidManifestOverride ?? ''); return FlutterProject.fromDirectory(directory); }