diff --git a/packages/flutter_tools/lib/src/build_runner/resident_web_runner.dart b/packages/flutter_tools/lib/src/build_runner/resident_web_runner.dart index ec97cb875ca..4905198869b 100644 --- a/packages/flutter_tools/lib/src/build_runner/resident_web_runner.dart +++ b/packages/flutter_tools/lib/src/build_runner/resident_web_runner.dart @@ -5,6 +5,7 @@ import 'dart:async'; import 'package:build_daemon/client.dart'; +import 'package:dwds/dwds.dart'; import 'package:meta/meta.dart'; import 'package:vm_service/vm_service.dart' as vmservice; import 'package:webkit_inspection_protocol/webkit_inspection_protocol.dart' hide StackTrace; @@ -229,6 +230,10 @@ class ResidentWebRunner extends ResidentRunner { throwToolExit('Failed to connect to WebSocket.'); } on BuildException { throwToolExit('Failed to build application for the Web.'); + } on ChromeDebugException catch (err, stackTrace) { + throwToolExit( + 'Failed to establish connection with Chrome. Try running the application again.\n' + 'If this problem persists, please file an issue with the details below:\n$err\n$stackTrace'); } on SocketException catch (err) { throwToolExit(err.toString()); } on StateError catch (err) { diff --git a/packages/flutter_tools/test/general.shard/resident_web_runner_test.dart b/packages/flutter_tools/test/general.shard/resident_web_runner_test.dart index 5a6075cc4c8..0696195eafe 100644 --- a/packages/flutter_tools/test/general.shard/resident_web_runner_test.dart +++ b/packages/flutter_tools/test/general.shard/resident_web_runner_test.dart @@ -584,6 +584,25 @@ void main() { await expectation; })); + test('Successfully turns ChromeDebugError into ToolExit', () => testbed.run(() async { + _setupMocks(); + final Completer connectionInfoCompleter = Completer(); + final Completer unhandledErrorCompleter = Completer(); + when(mockWebFs.connect(any)).thenAnswer((Invocation _) async { + unawaited(unhandledErrorCompleter.future.then((void value) { + throw ChromeDebugException({}); + })); + return ConnectionResult(mockAppConnection, mockDebugConnection); + }); + + final Future expectation = expectLater(() => residentWebRunner.run( + connectionInfoCompleter: connectionInfoCompleter, + ), throwsA(isInstanceOf())); + + unhandledErrorCompleter.complete(); + await expectation; + })); + test('Successfully turns OptionsSkew error into ToolExit', () => testbed.run(() async { _setupMocks(); final Completer connectionInfoCompleter = Completer();