diff --git a/packages/_flutterfire_internals/lib/_flutterfire_internals.dart b/packages/_flutterfire_internals/lib/_flutterfire_internals.dart index 649dabb767a2..b4c6b6c905fd 100644 --- a/packages/_flutterfire_internals/lib/_flutterfire_internals.dart +++ b/packages/_flutterfire_internals/lib/_flutterfire_internals.dart @@ -91,12 +91,14 @@ FirebaseException _firebaseExceptionFromCoreFirebaseError( /// /// See also https://github.com/dart-lang/sdk/issues/30741 bool _testException(Object? objectException) { - final exception = objectException! as core_interop.JSError; + if (objectException is! core_interop.JSError) { + return false; + } - final message = _safeConvertFromPossibleJSObject(exception.message); + final message = _safeConvertFromPossibleJSObject(objectException.message); // Firestore web does not contain `Firebase` in the message so we check the exception itself. return message.contains('Firebase') || - exception.toString().contains('FirebaseError'); + objectException.toString().contains('FirebaseError'); } /// Transforms internal errors in something more readable for end-users. diff --git a/packages/_flutterfire_internals/test/guard_test.dart b/packages/_flutterfire_internals/test/guard_test.dart index 40df9658bf6e..7e8332d6e74f 100644 --- a/packages/_flutterfire_internals/test/guard_test.dart +++ b/packages/_flutterfire_internals/test/guard_test.dart @@ -52,6 +52,19 @@ void main() { expect(stack, current); } }); + + test( + 'propagates plain Dart errors from Futures (e.g. ArgumentError on web)', + () async { + await expectLater( + guardWebExceptions( + () => Future.error(ArgumentError('test')), + plugin: 'test', + codeParser: (c) => c, + ), + throwsA(isA()), + ); + }); }); }