diff --git a/dwds/CHANGELOG.md b/dwds/CHANGELOG.md index f32447dfb..76e2f0504 100644 --- a/dwds/CHANGELOG.md +++ b/dwds/CHANGELOG.md @@ -14,6 +14,8 @@ - Pre-warm expression compiler cache to speed up Flutter Inspector loading. - Remove `ChromeProxyService.setExceptionPauseMode()`. - Display full error on failure to start DDS. +- Fix crash on processing DevTools event when starting DevTools from observatory + uri. ## 16.0.1 diff --git a/dwds/lib/src/dwds_vm_client.dart b/dwds/lib/src/dwds_vm_client.dart index 103dd52ab..f030e5545 100644 --- a/dwds/lib/src/dwds_vm_client.dart +++ b/dwds/lib/src/dwds_vm_client.dart @@ -153,22 +153,7 @@ void _processSendEvent(Map event, final action = payload?['action'] as String?; final screen = payload?['screen'] as String?; if (screen != null && action == 'pageReady') { - if (dwdsStats.isFirstDebuggerReady) { - final debuggerReadyTime = DateTime.now() - .difference(dwdsStats.devToolsStart) - .inMilliseconds; - emitEvent(DwdsEvent.devToolsLoad(debuggerReadyTime, screen)); - _logger.fine('DevTools load time: $debuggerReadyTime ms'); - final debuggerStartTime = DateTime.now() - .difference(dwdsStats.debuggerStart) - .inMilliseconds; - emitEvent(DwdsEvent.debuggerReady(debuggerStartTime, screen)); - _logger.fine('Debugger ready time: $debuggerStartTime ms'); - } else { - _logger - .finest('Debugger and DevTools startup times already recorded.' - ' Ignoring $event.'); - } + _recordDwdsStats(dwdsStats, screen); } else { _logger.finest('Ignoring unknown event: $event'); } @@ -176,6 +161,27 @@ void _processSendEvent(Map event, } } +void _recordDwdsStats(DwdsStats dwdsStats, String screen) { + if (dwdsStats.isFirstDebuggerReady) { + final devToolsStart = dwdsStats.devToolsStart; + final debuggerStart = dwdsStats.debuggerStart; + if (devToolsStart != null) { + final devToolLoadTime = + DateTime.now().difference(devToolsStart).inMilliseconds; + emitEvent(DwdsEvent.devToolsLoad(devToolLoadTime, screen)); + _logger.fine('DevTools load time: $devToolLoadTime ms'); + } + if (debuggerStart != null) { + final debuggerReadyTime = + DateTime.now().difference(debuggerStart).inMilliseconds; + emitEvent(DwdsEvent.debuggerReady(debuggerReadyTime, screen)); + _logger.fine('Debugger ready time: $debuggerReadyTime ms'); + } + } else { + _logger.finest('Debugger and DevTools stats are already recorded.'); + } +} + Future> _hotRestart( ChromeProxyService chromeProxyService, VmService client) async { _logger.info('Attempting a hot restart'); diff --git a/dwds/lib/src/events.dart b/dwds/lib/src/events.dart index 9cdb13bbe..8634a62f5 100644 --- a/dwds/lib/src/events.dart +++ b/dwds/lib/src/events.dart @@ -8,12 +8,12 @@ import 'package:vm_service/vm_service.dart'; class DwdsStats { /// The time when the user starts the debugger. - late DateTime _debuggerStart; - DateTime get debuggerStart => _debuggerStart; + DateTime? _debuggerStart; + DateTime? get debuggerStart => _debuggerStart; /// The time when dwds launches DevTools. - late DateTime _devToolsStart; - DateTime get devToolsStart => _devToolsStart; + DateTime? _devToolsStart; + DateTime? get devToolsStart => _devToolsStart; /// Records and returns weither the debugger is ready. bool _isFirstDebuggerReady = true;