From 8b33827556403cb4e4b8062d4d8e7444bbd62899 Mon Sep 17 00:00:00 2001 From: Anna Gringauze Date: Fri, 6 Jan 2023 16:23:49 -0800 Subject: [PATCH 1/2] Fix chrash on processing devtools event --- analysis_options.yaml | 2 -- dwds/CHANGELOG.md | 2 ++ dwds/lib/src/dwds_vm_client.dart | 24 ++++++++++++++---------- dwds/lib/src/events.dart | 8 ++++---- 4 files changed, 20 insertions(+), 16 deletions(-) diff --git a/analysis_options.yaml b/analysis_options.yaml index 2faf8a31f..e2a0d98b8 100644 --- a/analysis_options.yaml +++ b/analysis_options.yaml @@ -1,6 +1,4 @@ analyzer: - strong-mode: - implicit-casts: false errors: dead_code: error unused_element: error 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..4f94d6cea 100644 --- a/dwds/lib/src/dwds_vm_client.dart +++ b/dwds/lib/src/dwds_vm_client.dart @@ -152,18 +152,22 @@ void _processSendEvent(Map event, _logger.finest('Received DevTools event: $event'); final action = payload?['action'] as String?; final screen = payload?['screen'] as String?; + final devToolsStart = dwdsStats.devToolsStart; + final debuggerStart = dwdsStats.debuggerStart; 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'); + if (devToolsStart != null) { + final debuggerReadyTime = + DateTime.now().difference(devToolsStart).inMilliseconds; + emitEvent(DwdsEvent.devToolsLoad(debuggerReadyTime, screen)); + _logger.fine('DevTools load time: $debuggerReadyTime ms'); + } + if (debuggerStart != null) { + final debuggerStartTime = + DateTime.now().difference(debuggerStart).inMilliseconds; + emitEvent(DwdsEvent.debuggerReady(debuggerStartTime, screen)); + _logger.fine('Debugger ready time: $debuggerStartTime ms'); + } } else { _logger .finest('Debugger and DevTools startup times already recorded.' 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; From 433180aff64657787231a7b58b92300b094bd538 Mon Sep 17 00:00:00 2001 From: Anna Gringauze Date: Mon, 9 Jan 2023 14:27:53 -0800 Subject: [PATCH 2/2] Address CR comments --- dwds/lib/src/dwds_vm_client.dart | 42 +++++++++++++++++--------------- 1 file changed, 22 insertions(+), 20 deletions(-) diff --git a/dwds/lib/src/dwds_vm_client.dart b/dwds/lib/src/dwds_vm_client.dart index 4f94d6cea..f030e5545 100644 --- a/dwds/lib/src/dwds_vm_client.dart +++ b/dwds/lib/src/dwds_vm_client.dart @@ -152,27 +152,8 @@ void _processSendEvent(Map event, _logger.finest('Received DevTools event: $event'); final action = payload?['action'] as String?; final screen = payload?['screen'] as String?; - final devToolsStart = dwdsStats.devToolsStart; - final debuggerStart = dwdsStats.debuggerStart; if (screen != null && action == 'pageReady') { - if (dwdsStats.isFirstDebuggerReady) { - if (devToolsStart != null) { - final debuggerReadyTime = - DateTime.now().difference(devToolsStart).inMilliseconds; - emitEvent(DwdsEvent.devToolsLoad(debuggerReadyTime, screen)); - _logger.fine('DevTools load time: $debuggerReadyTime ms'); - } - if (debuggerStart != null) { - final debuggerStartTime = - DateTime.now().difference(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'); } @@ -180,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');