diff --git a/webdev/CHANGELOG.md b/webdev/CHANGELOG.md index c89a3d0d9..6e484f0a6 100644 --- a/webdev/CHANGELOG.md +++ b/webdev/CHANGELOG.md @@ -1,6 +1,7 @@ ## 2.0.0-dev - Fix an NPE is the reload logic. +- Shutdown the daemon process when the corresponding application is closed. ## 2.0.0-alpha.3 diff --git a/webdev/lib/src/daemon/app_domain.dart b/webdev/lib/src/daemon/app_domain.dart index 3f2d8b896..42959c091 100644 --- a/webdev/lib/src/daemon/app_domain.dart +++ b/webdev/lib/src/daemon/app_domain.dart @@ -8,9 +8,9 @@ import 'dart:io'; import 'package:build_daemon/data/build_status.dart'; import 'package:dwds/service.dart'; +import 'package:pedantic/pedantic.dart'; import 'package:vm_service_lib/vm_service_lib.dart'; -import '../serve/chrome.dart'; import '../serve/debugger/app_debug_services.dart'; import '../serve/server_manager.dart'; import 'daemon.dart'; @@ -70,6 +70,18 @@ class AppDomain extends Domain { _appDebugServices = await devHandler.loadAppServices( connection.request.appId, connection.request.instanceId); _appId = connection.request.appId; + unawaited(_appDebugServices + .debugService.chromeProxyService.tabConnection.onClose.first + .then((_) { + sendEvent('app.log', { + 'appId': _appId, + 'log': 'Lost connection to device.', + }); + sendEvent('app.stop', { + 'appId': _appId, + }); + daemon.shutdown(); + })); sendEvent('app.start', { 'appId': _appId, 'directory': Directory.current.path, @@ -165,8 +177,8 @@ class AppDomain extends Domain { Future _stop(Map args) async { var appId = getStringArg(args, 'appId', required: true); if (_appId != appId) throw ArgumentError.value(appId, 'appId', 'Not found'); - var chrome = await Chrome.connectedInstance; - await chrome.close(); + await _appDebugServices.debugService.chromeProxyService.tabConnection + .close(); return true; } diff --git a/webdev/test/daemon/app_domain_test.dart b/webdev/test/daemon/app_domain_test.dart index cbe3db75c..131066239 100644 --- a/webdev/test/daemon/app_domain_test.dart +++ b/webdev/test/daemon/app_domain_test.dart @@ -111,6 +111,21 @@ void main() { ]))); await exitWebdev(webdev); }); + + test('.stop', () async { + var webdev = + await runWebDev(['daemon'], workingDirectory: exampleDirectory); + var appId = await _getAppId(webdev); + var stopCall = '[{"method":"app.stop","id":0,' + '"params" : { "appId" : "$appId"}}]'; + webdev.stdin.add(utf8.encode('$stopCall\n')); + await expectLater( + webdev.stdout, + emitsThrough(startsWith( + '[{"event":"app.stop","params":{"appId":"$appId"}}'))); + // This should cause webdev to exit. + expect(await webdev.exitCode, equals(0)); + }); }); }, tags: ['webdriver']); }