From 20983656a7b0806bf14187eddf2c8ba852ce4fa9 Mon Sep 17 00:00:00 2001 From: Parker Lougheed Date: Fri, 4 Oct 2024 14:51:54 -0500 Subject: [PATCH 1/2] [Debug extension] Minor dep updates and cleanup --- dwds/debug_extension/pubspec.yaml | 30 +++--- dwds/debug_extension/web/chrome_api.dart | 3 +- .../debug_extension/web/cider_connection.dart | 4 +- dwds/debug_extension/web/data_types.dart | 9 +- dwds/debug_extension/web/debug_info.dart | 12 +-- dwds/debug_extension/web/debug_session.dart | 98 +++++++------------ dwds/debug_extension/web/logger.dart | 2 - dwds/debug_extension/web/messaging.dart | 3 +- dwds/debug_extension/web/panel.dart | 12 +-- dwds/debug_extension/web/storage.dart | 36 +++---- dwds/debug_extension/web/utils.dart | 10 +- dwds/debug_extension/web/web_api.dart | 9 +- 12 files changed, 95 insertions(+), 133 deletions(-) diff --git a/dwds/debug_extension/pubspec.yaml b/dwds/debug_extension/pubspec.yaml index 9a161c40d..2e97d3e10 100644 --- a/dwds/debug_extension/pubspec.yaml +++ b/dwds/debug_extension/pubspec.yaml @@ -1,29 +1,29 @@ name: mv3_extension publish_to: none -version: 2.1.4 +version: 2.1.5-wip homepage: https://github.com/dart-lang/webdev description: >- A Chrome extension for Dart debugging. environment: - sdk: ^3.2.0 + sdk: ^3.5.0 dependencies: - built_value: ^8.3.0 - collection: ^1.15.0 - js: ^0.6.1+1 + built_value: ^8.9.0 + collection: ^1.19.0 + js: ^0.7.1 dev_dependencies: - args: ^2.3.1 - build: ^2.0.0 - build_runner: ^2.4.0 - built_collection: ^5.0.0 - built_value_generator: ^8.3.0 - build_web_compilers: ^4.0.4 - dwds: ^16.0.0 - path: ^1.8.1 - sse: ^4.1.2 - web_socket_channel: '>=2.2.0 <4.0.0' + args: ^2.5.0 + build: ^2.4.1 + build_runner: ^2.4.12 + build_web_compilers: ^4.0.11 + built_collection: ^5.1.1 + built_value_generator: ^8.9.2 + dwds: ^24.1.0 + path: ^1.9.0 + sse: ^4.1.6 + web_socket_channel: ^3.0.1 dependency_overrides: dwds: diff --git a/dwds/debug_extension/web/chrome_api.dart b/dwds/debug_extension/web/chrome_api.dart index bb085cf8e..e15e92537 100644 --- a/dwds/debug_extension/web/chrome_api.dart +++ b/dwds/debug_extension/web/chrome_api.dart @@ -193,7 +193,8 @@ class Runtime { external String get id; - // Note: Not checking the lastError when one occurs throws a runtime exception. + // Note: Not checking the lastError when one occurs + // throws a runtime exception. external ChromeError? get lastError; external ConnectionHandler get onConnect; diff --git a/dwds/debug_extension/web/cider_connection.dart b/dwds/debug_extension/web/cider_connection.dart index 46760c0b4..8d64a1544 100644 --- a/dwds/debug_extension/web/cider_connection.dart +++ b/dwds/debug_extension/web/cider_connection.dart @@ -175,8 +175,8 @@ Future _sendInspectorUrl({String? appId}) async { if (!alreadyDebugging) { sendErrorMessageToCider( errorType: CiderErrorType.invalidRequest, - errorDetails: - 'Cannot send the inspector URL before the debugger has been attached.', + errorDetails: 'Cannot send the inspector URL before ' + 'the debugger has been attached.', ); return; } diff --git a/dwds/debug_extension/web/data_types.dart b/dwds/debug_extension/web/data_types.dart index eb22eb4e7..038e47b4a 100644 --- a/dwds/debug_extension/web/data_types.dart +++ b/dwds/debug_extension/web/data_types.dart @@ -12,7 +12,7 @@ abstract class ConnectFailure static Serializer get serializer => _$connectFailureSerializer; - factory ConnectFailure([Function(ConnectFailureBuilder) updates]) = + factory ConnectFailure([void Function(ConnectFailureBuilder) updates]) = _$ConnectFailure; ConnectFailure._(); @@ -27,7 +27,7 @@ abstract class DevToolsOpener static Serializer get serializer => _$devToolsOpenerSerializer; - factory DevToolsOpener([Function(DevToolsOpenerBuilder) updates]) = + factory DevToolsOpener([void Function(DevToolsOpenerBuilder) updates]) = _$DevToolsOpener; DevToolsOpener._(); @@ -38,7 +38,8 @@ abstract class DevToolsOpener abstract class DevToolsUrl implements Built { static Serializer get serializer => _$devToolsUrlSerializer; - factory DevToolsUrl([Function(DevToolsUrlBuilder) updates]) = _$DevToolsUrl; + factory DevToolsUrl([void Function(DevToolsUrlBuilder) updates]) = + _$DevToolsUrl; DevToolsUrl._(); @@ -56,7 +57,7 @@ abstract class DebugStateChange static Serializer get serializer => _$debugStateChangeSerializer; - factory DebugStateChange([Function(DebugStateChangeBuilder) updates]) = + factory DebugStateChange([void Function(DebugStateChangeBuilder) updates]) = _$DebugStateChange; DebugStateChange._(); diff --git a/dwds/debug_extension/web/debug_info.dart b/dwds/debug_extension/web/debug_info.dart index da671caa4..9f2f3142a 100644 --- a/dwds/debug_extension/web/debug_info.dart +++ b/dwds/debug_extension/web/debug_info.dart @@ -25,14 +25,14 @@ String _readDartDebugInfo() { serializers.serialize( DebugInfo( (b) => b - ..appEntrypointPath = windowContext['\$dartEntrypointPath'] - ..appId = windowContext['\$dartAppId'] - ..appInstanceId = windowContext['\$dartAppInstanceId'] + ..appEntrypointPath = windowContext['\$dartEntrypointPath'] as String? + ..appId = windowContext['\$dartAppId'] as String? + ..appInstanceId = windowContext['\$dartAppInstanceId'] as String? ..appOrigin = window.location.origin ..appUrl = window.location.href - ..extensionUrl = windowContext['\$dartExtensionUri'] - ..isInternalBuild = windowContext['\$isInternalBuild'] - ..isFlutterApp = windowContext['\$isFlutterApp'], + ..extensionUrl = windowContext['\$dartExtensionUri'] as String? + ..isInternalBuild = windowContext['\$isInternalBuild'] as bool? + ..isFlutterApp = windowContext['\$isFlutterApp'] as bool?, ), ), ); diff --git a/dwds/debug_extension/web/debug_session.dart b/dwds/debug_extension/web/debug_session.dart index 4da1146b3..625d14ee9 100644 --- a/dwds/debug_extension/web/debug_session.dart +++ b/dwds/debug_extension/web/debug_session.dart @@ -79,18 +79,12 @@ enum Trigger { extensionPanel, extensionIcon; - String get clientName { - switch (this) { - case Trigger.angularDartDevTools: - return 'acx-devtools'; - case Trigger.cider: - return 'cider'; - case Trigger.extensionPanel: - return 'embedded-devtools'; - case Trigger.extensionIcon: - return 'devtools'; - } - } + String get clientName => switch (this) { + Trigger.angularDartDevTools => 'acx-devtools', + Trigger.cider => 'cider', + Trigger.extensionPanel => 'embedded-devtools', + Trigger.extensionIcon => 'devtools' + }; } enum DebuggerLocation { @@ -99,18 +93,12 @@ enum DebuggerLocation { dartDevTools, ide; - String get displayName { - switch (this) { - case DebuggerLocation.angularDartDevTools: - return 'AngularDart DevTools'; - case DebuggerLocation.chromeDevTools: - return 'Chrome DevTools'; - case DebuggerLocation.dartDevTools: - return 'a Dart DevTools tab'; - case DebuggerLocation.ide: - return 'an IDE'; - } - } + String get displayName => switch (this) { + DebuggerLocation.angularDartDevTools => 'AngularDart DevTools', + DebuggerLocation.chromeDevTools => 'Chrome DevTools', + DebuggerLocation.dartDevTools => 'a Dart DevTools tab', + DebuggerLocation.ide => 'an IDE' + }; } bool get existsActiveDebugSession => _debugSessions.isNotEmpty; @@ -331,8 +319,9 @@ Future _isDartFrame({required int tabId, required int contextId}) { Debuggee(tabId: tabId), 'Runtime.evaluate', _InjectedParams( - expression: - '[window.\$dartAppId, window.\$dartAppInstanceId, window.\$dwdsVersion]', + expression: '[window.\$dartAppId, ' + 'window.\$dartAppInstanceId, ' + 'window.\$dwdsVersion]', returnByValue: true, contextId: contextId, ), @@ -497,7 +486,8 @@ void _forwardDwdsEventToChromeDebugger( ); } catch (error) { debugError( - 'Error forwarding ${message.command} with ${message.commandParams} to chrome.debugger: $error', + 'Error forwarding ${message.command} with ${message.commandParams} to ' + 'chrome.debugger: $error', ); } } @@ -660,16 +650,13 @@ Future _sendStopDebuggingMessage( ); } -_DebugSession? _debugSessionForTab(tabId, {required TabType type}) { - switch (type) { - case TabType.dartApp: - return _debugSessions - .firstWhereOrNull((session) => session.appTabId == tabId); - case TabType.devTools: - return _debugSessions - .firstWhereOrNull((session) => session.devToolsTabId == tabId); - } -} +_DebugSession? _debugSessionForTab(int tabId, {required TabType type}) => + switch (type) { + TabType.dartApp => + _debugSessions.firstWhereOrNull((session) => session.appTabId == tabId), + TabType.devTools => _debugSessions + .firstWhereOrNull((session) => session.devToolsTabId == tabId) + }; Future _authenticateUser(int tabId) async { final isAlreadyAuthenticated = await _fetchIsAuthenticated(tabId); @@ -746,20 +733,14 @@ DebuggerLocation? _debuggerLocation(int dartAppTabId) { final trigger = _tabIdToTrigger[dartAppTabId]; if (debugSession == null || trigger == null) return null; - switch (trigger) { - case Trigger.extensionIcon: - if (debugSession.devToolsTabId != null) { - return DebuggerLocation.dartDevTools; - } else { - return DebuggerLocation.ide; - } - case Trigger.angularDartDevTools: - return DebuggerLocation.angularDartDevTools; - case Trigger.extensionPanel: - return DebuggerLocation.chromeDevTools; - case Trigger.cider: - return DebuggerLocation.ide; - } + return switch (trigger) { + Trigger.angularDartDevTools => DebuggerLocation.angularDartDevTools, + Trigger.cider => DebuggerLocation.ide, + Trigger.extensionPanel => DebuggerLocation.chromeDevTools, + Trigger.extensionIcon => debugSession.devToolsTabId != null + ? DebuggerLocation.dartDevTools + : DebuggerLocation.ide, + }; } /// Construct an [ExtensionEvent] from [method] and [params]. @@ -804,7 +785,7 @@ class _DebugSession { late final StreamSubscription> _batchSubscription; _DebugSession({ - required client, + required SocketClient client, required this.appTabId, required this.trigger, required void Function(String data) onIncoming, @@ -888,14 +869,11 @@ class _DebugSession { String? _authUrl(String? extensionUrl) { if (extensionUrl == null) return null; final authUrl = Uri.parse(extensionUrl).replace(path: authenticationPath); - switch (authUrl.scheme) { - case 'ws': - return authUrl.replace(scheme: 'http').toString(); - case 'wss': - return authUrl.replace(scheme: 'https').toString(); - default: - return authUrl.toString(); - } + return switch (authUrl.scheme) { + 'ws' => authUrl.replace(scheme: 'http').toString(), + 'wss' => authUrl.replace(scheme: 'https').toString(), + _ => authUrl.toString() + }; } @JS() diff --git a/dwds/debug_extension/web/logger.dart b/dwds/debug_extension/web/logger.dart index fdb708267..69e02190f 100644 --- a/dwds/debug_extension/web/logger.dart +++ b/dwds/debug_extension/web/logger.dart @@ -51,10 +51,8 @@ void _log( switch (logLevel) { case _LogLevel.error: _console.error(logMsg); - break; case _LogLevel.warn: _console.warn(logMsg); - break; case _LogLevel.info: _console.log(logMsg); } diff --git a/dwds/debug_extension/web/messaging.dart b/dwds/debug_extension/web/messaging.dart index 92e08293f..68bba19eb 100644 --- a/dwds/debug_extension/web/messaging.dart +++ b/dwds/debug_extension/web/messaging.dart @@ -113,7 +113,8 @@ void interceptMessage({ } } catch (error) { debugError( - 'Error intercepting $expectedType from $expectedSender to $expectedRecipient: $error', + 'Error intercepting $expectedType from ' + '$expectedSender to $expectedRecipient: $error', ); } } diff --git a/dwds/debug_extension/web/panel.dart b/dwds/debug_extension/web/panel.dart index 54cdaf052..039a3f649 100644 --- a/dwds/debug_extension/web/panel.dart +++ b/dwds/debug_extension/web/panel.dart @@ -52,7 +52,7 @@ int get _tabId => chrome.devtools.inspectedWindow.tabId; Future main() async { unawaited( - _registerListeners().catchError((error) { + _registerListeners().catchError((Object? error) { debugWarn('Error registering listeners in panel: $error'); }), ); @@ -93,7 +93,8 @@ void _handleRuntimeMessages( messageHandler: (DebugStateChange debugStateChange) async { if (debugStateChange.tabId != _tabId) { debugWarn( - 'Received debug state change request, but Dart app tab does not match current tab.', + 'Received debug state change request, but ' + 'Dart app tab does not match current tab.', ); return; } @@ -227,10 +228,8 @@ void _handleDebugConnectionLost(String? reason) { case DetachReason.staleDebugSession: case DetachReason.navigatedAwayFromApp: _showWarningBanner(_noAppDetectedMsg); - break; default: _showWarningBanner(_lostConnectionMsg); - break; } } @@ -238,13 +237,10 @@ void _handleConnectFailure(ConnectFailureReason reason) { switch (reason) { case ConnectFailureReason.authentication: _showWarningBanner(_pleaseAuthenticateMsg); - break; case ConnectFailureReason.noDartApp: _showWarningBanner(_noAppDetectedMsg); - break; case ConnectFailureReason.timeout: _showWarningBanner(_connectionTimeoutMsg); - break; default: _showWarningBanner(_failedToConnectMsg); } @@ -296,7 +292,7 @@ Future _launchDebugConnection(Event _) async { Future _maybeHandleConnectionTimeout() async { _connecting = true; - await Future.delayed(Duration(seconds: 10)); + await Future.delayed(const Duration(seconds: 10)); if (_connecting) { _handleConnectFailure(ConnectFailureReason.timeout); } diff --git a/dwds/debug_extension/web/storage.dart b/dwds/debug_extension/web/storage.dart index 2df7fa588..13855560f 100644 --- a/dwds/debug_extension/web/storage.dart +++ b/dwds/debug_extension/web/storage.dart @@ -24,22 +24,14 @@ enum StorageObject { isAuthenticated, multipleAppsDetected; - Persistence get persistence { - switch (this) { - case StorageObject.debugInfo: - return Persistence.sessionOnly; - case StorageObject.devToolsOpener: - return Persistence.acrossSessions; - case StorageObject.devToolsUri: - return Persistence.sessionOnly; - case StorageObject.encodedUri: - return Persistence.sessionOnly; - case StorageObject.isAuthenticated: - return Persistence.sessionOnly; - case StorageObject.multipleAppsDetected: - return Persistence.sessionOnly; - } - } + Persistence get persistence => switch (this) { + StorageObject.debugInfo => Persistence.sessionOnly, + StorageObject.devToolsOpener => Persistence.acrossSessions, + StorageObject.devToolsUri => Persistence.sessionOnly, + StorageObject.encodedUri => Persistence.sessionOnly, + StorageObject.isAuthenticated => Persistence.sessionOnly, + StorageObject.multipleAppsDetected => Persistence.sessionOnly + }; } enum Persistence { @@ -132,7 +124,7 @@ Future> fetchAllStorageObjectsOfType({required StorageObject type}) { return completer.future; } -Future removeStorageObject({required StorageObject type, int? tabId}) { +Future removeStorageObject({required StorageObject type, int? tabId}) { final storageKey = _createStorageKey(type, tabId); final completer = Completer(); final storageArea = _getStorageArea(type.persistence); @@ -178,12 +170,10 @@ StorageArea _getStorageArea(Persistence persistence) { // MV2 extensions don't have access to session storage: if (!isMV3) return chrome.storage.local; - switch (persistence) { - case Persistence.acrossSessions: - return chrome.storage.local; - case Persistence.sessionOnly: - return chrome.storage.session; - } + return switch (persistence) { + Persistence.acrossSessions => chrome.storage.local, + Persistence.sessionOnly => chrome.storage.session + }; } String _createStorageKey(StorageObject type, int? tabId) { diff --git a/dwds/debug_extension/web/utils.dart b/dwds/debug_extension/web/utils.dart index e86378731..7bca22258 100644 --- a/dwds/debug_extension/web/utils.dart +++ b/dwds/debug_extension/web/utils.dart @@ -46,12 +46,8 @@ Future get activeTab { final query = QueryInfo(active: true, currentWindow: true); chrome.tabs.query( query, - allowInterop((List tabs) { - if (tabs.isNotEmpty) { - completer.complete(tabs.first as Tab); - } else { - completer.complete(null); - } + allowInterop((List tabs) { + completer.complete(tabs.firstOrNull); }), ); return completer.future; @@ -126,7 +122,7 @@ bool get isDevMode { return _isDevMode!; } final extensionManifest = chrome.runtime.getManifest(); - final extensionName = getProperty(extensionManifest, 'name') ?? ''; + final extensionName = getProperty(extensionManifest, 'name') ?? ''; final isDevMode = extensionName.contains('DEV'); _isDevMode = isDevMode; return isDevMode; diff --git a/dwds/debug_extension/web/web_api.dart b/dwds/debug_extension/web/web_api.dart index 1a5134475..97c4f13c7 100644 --- a/dwds/debug_extension/web/web_api.dart +++ b/dwds/debug_extension/web/web_api.dart @@ -13,8 +13,8 @@ external Json get JSON; @JS() @anonymous class Json { -// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify - external String stringify(o); + // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify + external String stringify(Object? o); } // Custom implementation of Fetch API until the Dart implementation supports @@ -30,8 +30,9 @@ Future fetchRequest(String resourceUrl) async { ); final response = await promiseToFuture(_nativeJsFetch(resourceUrl, options)); - final body = - await promiseToFuture(js_util.callMethod(response, 'text', [])); + final body = await promiseToFuture( + js_util.callMethod(response, 'text', []), + ); final ok = js_util.getProperty(response, 'ok'); final status = js_util.getProperty(response, 'status'); return FetchResponse(status: status, ok: ok, body: body); From e34700dc48c988b03ee8d8c2228ad677946df9be Mon Sep 17 00:00:00 2001 From: Parker Lougheed Date: Fri, 4 Oct 2024 14:58:02 -0500 Subject: [PATCH 2/2] Avoid a few non-null assertions --- dwds/debug_extension/web/background.dart | 4 ++-- dwds/debug_extension/web/debug_session.dart | 5 ++-- dwds/debug_extension/web/popup.dart | 5 ++-- dwds/debug_extension/web/utils.dart | 26 +++++---------------- 4 files changed, 14 insertions(+), 26 deletions(-) diff --git a/dwds/debug_extension/web/background.dart b/dwds/debug_extension/web/background.dart index baea3dab4..fe421352c 100644 --- a/dwds/debug_extension/web/background.dart +++ b/dwds/debug_extension/web/background.dart @@ -45,8 +45,8 @@ void _registerListeners() { chrome.windows.onFocusChanged.addListener( allowInterop((_) async { final currentTab = await activeTab; - if (currentTab?.id != null) { - await _updateIcon(currentTab!.id); + if (currentTab?.id case final tabId?) { + await _updateIcon(tabId); } }), ); diff --git a/dwds/debug_extension/web/debug_session.dart b/dwds/debug_extension/web/debug_session.dart index 625d14ee9..2bd998f28 100644 --- a/dwds/debug_extension/web/debug_session.dart +++ b/dwds/debug_extension/web/debug_session.dart @@ -349,11 +349,12 @@ Future _connectToDwds({ required int dartAppTabId, required DebugInfo debugInfo, }) async { - if (debugInfo.extensionUrl == null) { + final extensionUrl = debugInfo.extensionUrl; + if (extensionUrl == null) { debugWarn('Can\'t connect to DWDS without an extension URL.'); return false; } - final uri = Uri.parse(debugInfo.extensionUrl!); + final uri = Uri.parse(extensionUrl); // Start the client connection with DWDS: final client = uri.isScheme('ws') || uri.isScheme('wss') ? WebSocketClient(WebSocketChannel.connect(uri)) diff --git a/dwds/debug_extension/web/popup.dart b/dwds/debug_extension/web/popup.dart index fb40cc75a..747886ab2 100644 --- a/dwds/debug_extension/web/popup.dart +++ b/dwds/debug_extension/web/popup.dart @@ -131,10 +131,11 @@ Future _launchDevTools(Event _) async { } void _copyAppId(Event _) { - if (_appId == null) return; + final appId = _appId; + if (appId == null) return; final clipboard = window.navigator.clipboard; if (clipboard == null) return; - clipboard.writeText(_appId!); + clipboard.writeText(appId); _updateElementVisibility(_copiedSuccessId, visible: true); } diff --git a/dwds/debug_extension/web/utils.dart b/dwds/debug_extension/web/utils.dart index 7bca22258..589a870d3 100644 --- a/dwds/debug_extension/web/utils.dart +++ b/dwds/debug_extension/web/utils.dart @@ -115,32 +115,18 @@ void setExtensionPopup(PopupDetails details) { } } -bool? _isDevMode; - -bool get isDevMode { - if (_isDevMode != null) { - return _isDevMode!; - } +final bool isDevMode = () { final extensionManifest = chrome.runtime.getManifest(); final extensionName = getProperty(extensionManifest, 'name') ?? ''; - final isDevMode = extensionName.contains('DEV'); - _isDevMode = isDevMode; - return isDevMode; -} + return extensionName.contains('DEV'); +}(); -bool? _isMV3; - -bool get isMV3 { - if (_isMV3 != null) { - return _isMV3!; - } +final bool isMV3 = () { final extensionManifest = chrome.runtime.getManifest(); final manifestVersion = getProperty(extensionManifest, 'manifest_version') ?? 2; - final isMV3 = manifestVersion == 3; - _isMV3 = isMV3; - return isMV3; -} + return manifestVersion == 3; +}(); String addQueryParameters( String uri, {