From 6933e849bdb704b267aa1f6de51659cf66715822 Mon Sep 17 00:00:00 2001 From: Elliott Brooks <21270878+elliette@users.noreply.github.com> Date: Tue, 24 Oct 2023 16:18:40 -0700 Subject: [PATCH 01/11] wip --- dwds/debug_extension_mv3/web/background.dart | 11 ++++++++ dwds/debug_extension_mv3/web/chrome_api.dart | 15 +++++++++++ dwds/debug_extension_mv3/web/copier.dart | 25 +++++++++++++++++++ .../debug_extension_mv3/web/manifest_mv2.json | 9 +++++++ 4 files changed, 60 insertions(+) create mode 100644 dwds/debug_extension_mv3/web/copier.dart diff --git a/dwds/debug_extension_mv3/web/background.dart b/dwds/debug_extension_mv3/web/background.dart index b24d44629..cf1e30d2e 100644 --- a/dwds/debug_extension_mv3/web/background.dart +++ b/dwds/debug_extension_mv3/web/background.dart @@ -53,6 +53,8 @@ void _registerListeners() { chrome.webNavigation.onCommitted .addListener(allowInterop(_detectNavigationAwayFromDartApp)); + chrome.commands.onCommand.addListener(allowInterop(_maybeCopyAppId)); + // Detect clicks on the Dart Debug Extension icon. onExtensionIconClicked( allowInterop( @@ -206,6 +208,15 @@ DebugInfo _addTabInfo(DebugInfo debugInfo, {required Tab tab}) { ); } +Future _maybeCopyAppId(String command, [Tab? tab]) async { + final currentTab = tab ?? await activeTab; + if (currentTab == null) return; + final debugInfo = await _fetchDebugInfo(currentTab.id); + final workspaceName = debugInfo?.workspaceName; + if (workspaceName == null) return; + // Send message to the copier. +} + Future _updateIcon(int activeTabId) async { final debugInfo = await _fetchDebugInfo(activeTabId); if (debugInfo == null) { diff --git a/dwds/debug_extension_mv3/web/chrome_api.dart b/dwds/debug_extension_mv3/web/chrome_api.dart index 937d1d9f7..ccea3d271 100644 --- a/dwds/debug_extension_mv3/web/chrome_api.dart +++ b/dwds/debug_extension_mv3/web/chrome_api.dart @@ -12,6 +12,7 @@ external Chrome get chrome; @JS() @anonymous class Chrome { + external Commands get commands; external Debugger get debugger; external Devtools get devtools; external Notifications get notifications; @@ -25,6 +26,20 @@ class Chrome { /// chrome.debugger APIs: /// https://developer.chrome.com/docs/extensions/reference/debugger +@JS() +@anonymous +class Commands { + external OnCommandHandler get onCommand; +} + +@JS() +@anonymous +class OnCommandHandler { + external void addListener( + void Function(String commandName, [Tab? tab]) callback, + ); +} + @JS() @anonymous class Debugger { diff --git a/dwds/debug_extension_mv3/web/copier.dart b/dwds/debug_extension_mv3/web/copier.dart new file mode 100644 index 000000000..be289cbbc --- /dev/null +++ b/dwds/debug_extension_mv3/web/copier.dart @@ -0,0 +1,25 @@ +// Copyright (c) 2023, the Dart project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +@JS() +library copier; + +import 'dart:html'; + +import 'package:js/js.dart'; + +void main() { + _registerListeners(); +} + +void _registerListeners() {} + +void _copyAppId(String appId) { + final clipboard = window.navigator.clipboard; + if (clipboard == null) return; + clipboard.writeText(appId); + _showCopiedMessage(appId); +} + +void _showCopiedMessage(String appId) {} diff --git a/dwds/debug_extension_mv3/web/manifest_mv2.json b/dwds/debug_extension_mv3/web/manifest_mv2.json index 1fba9c10c..988d8b51a 100644 --- a/dwds/debug_extension_mv3/web/manifest_mv2.json +++ b/dwds/debug_extension_mv3/web/manifest_mv2.json @@ -28,6 +28,15 @@ "run_at": "document_end" } ], + "commands": { + "copyAppId": { + "suggestedKey": { + "default": "Alt+D", + "mac": "Option+D" + }, + "description": "Copies the app ID to the clipboard." + } + }, "web_accessible_resources": ["debug_info.dart.js"], "options_page": "static_assets/settings.html" } From f2a134265bfc54056f099277df19b641535be328 Mon Sep 17 00:00:00 2001 From: Elliott Brooks <21270878+elliette@users.noreply.github.com> Date: Tue, 24 Oct 2023 16:20:03 -0700 Subject: [PATCH 02/11] Add chrome.tabs.sendMessage --- dwds/debug_extension_mv3/web/chrome_api.dart | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/dwds/debug_extension_mv3/web/chrome_api.dart b/dwds/debug_extension_mv3/web/chrome_api.dart index ccea3d271..b98c5a9dc 100644 --- a/dwds/debug_extension_mv3/web/chrome_api.dart +++ b/dwds/debug_extension_mv3/web/chrome_api.dart @@ -314,6 +314,13 @@ class Tabs { external dynamic remove(int tabId, void Function()? callback); + external Object sendMessage( + int tabId, + Object? message, + Object? options, + void Function() callback, + ); + external OnActivatedHandler get onActivated; external OnRemovedHandler get onRemoved; From f248f56c04bc4af2c717768c6c5d6e34b23aa3f5 Mon Sep 17 00:00:00 2001 From: Elliott Brooks <21270878+elliette@users.noreply.github.com> Date: Tue, 24 Oct 2023 16:48:29 -0700 Subject: [PATCH 03/11] I believe we need to send response back --- dwds/debug_extension_mv3/web/background.dart | 25 +++++++++---- dwds/debug_extension_mv3/web/copier.dart | 33 +++++++++++++++-- .../debug_extension_mv3/web/manifest_mv2.json | 2 +- dwds/debug_extension_mv3/web/messaging.dart | 35 +++++++++++++++++++ 4 files changed, 85 insertions(+), 10 deletions(-) diff --git a/dwds/debug_extension_mv3/web/background.dart b/dwds/debug_extension_mv3/web/background.dart index cf1e30d2e..a2dd70b0c 100644 --- a/dwds/debug_extension_mv3/web/background.dart +++ b/dwds/debug_extension_mv3/web/background.dart @@ -53,7 +53,9 @@ void _registerListeners() { chrome.webNavigation.onCommitted .addListener(allowInterop(_detectNavigationAwayFromDartApp)); - chrome.commands.onCommand.addListener(allowInterop(_maybeCopyAppId)); + debugLog('listening for commands...'); + chrome.commands.onCommand + .addListener(allowInterop(_maybeSendCopyAppIdRequest)); // Detect clicks on the Dart Debug Extension icon. onExtensionIconClicked( @@ -208,13 +210,22 @@ DebugInfo _addTabInfo(DebugInfo debugInfo, {required Tab tab}) { ); } -Future _maybeCopyAppId(String command, [Tab? tab]) async { - final currentTab = tab ?? await activeTab; - if (currentTab == null) return; - final debugInfo = await _fetchDebugInfo(currentTab.id); +Future _maybeSendCopyAppIdRequest(String command, [Tab? tab]) async { + debugLog('==== Received $command command'); + if (command != 'copyAppId') return false; + final tabId = (tab ?? await activeTab)?.id; + if (tabId == null) return false; + final debugInfo = await _fetchDebugInfo(tabId); final workspaceName = debugInfo?.workspaceName; - if (workspaceName == null) return; - // Send message to the copier. + if (workspaceName == null) return false; + final appId = '$workspaceName-$tabId'; + return sendTabsMessage( + tabId: tabId, + type: MessageType.appId, + body: appId, + sender: Script.background, + recipient: Script.copier, + ); } Future _updateIcon(int activeTabId) async { diff --git a/dwds/debug_extension_mv3/web/copier.dart b/dwds/debug_extension_mv3/web/copier.dart index be289cbbc..348d6e2c9 100644 --- a/dwds/debug_extension_mv3/web/copier.dart +++ b/dwds/debug_extension_mv3/web/copier.dart @@ -9,11 +9,33 @@ import 'dart:html'; import 'package:js/js.dart'; +import 'chrome_api.dart'; +import 'messaging.dart'; + void main() { _registerListeners(); } -void _registerListeners() {} +void _registerListeners() { + chrome.runtime.onMessage.addListener( + allowInterop(_handleRuntimeMessages), + ); +} + +void _handleRuntimeMessages( + dynamic jsRequest, + MessageSender sender, + // ignore: avoid-unused-parameters + Function sendResponse, +) { + interceptMessage( + message: jsRequest, + expectedType: MessageType.appId, + expectedSender: Script.background, + expectedRecipient: Script.copier, + messageHandler: _copyAppId, + ); +} void _copyAppId(String appId) { final clipboard = window.navigator.clipboard; @@ -22,4 +44,11 @@ void _copyAppId(String appId) { _showCopiedMessage(appId); } -void _showCopiedMessage(String appId) {} +Future _showCopiedMessage(String appId) async { + final snackbar = document.createElement('div'); + snackbar.setInnerHtml('Copied $appId!'); + snackbar.classes.add('snackbar snackbar--info show'); + document.body?.append(snackbar); + await Future.delayed(Duration(seconds: 2)); + snackbar.remove(); +} diff --git a/dwds/debug_extension_mv3/web/manifest_mv2.json b/dwds/debug_extension_mv3/web/manifest_mv2.json index 988d8b51a..0e739d3ec 100644 --- a/dwds/debug_extension_mv3/web/manifest_mv2.json +++ b/dwds/debug_extension_mv3/web/manifest_mv2.json @@ -24,7 +24,7 @@ "content_scripts": [ { "matches": [""], - "js": ["detector.dart.js"], + "js": ["detector.dart.js", "copier.dart.js"], "run_at": "document_end" } ], diff --git a/dwds/debug_extension_mv3/web/messaging.dart b/dwds/debug_extension_mv3/web/messaging.dart index 95f27deae..b667a9653 100644 --- a/dwds/debug_extension_mv3/web/messaging.dart +++ b/dwds/debug_extension_mv3/web/messaging.dart @@ -16,6 +16,7 @@ import 'logger.dart'; enum Script { background, + copier, debuggerPanel, detector; @@ -27,6 +28,7 @@ enum Script { enum MessageType { isAuthenticated, connectFailure, + appId, debugInfo, debugStateChange, devToolsUrl, @@ -135,3 +137,36 @@ Future sendRuntimeMessage({ ); return completer.future; } + +/// Send a message using the chrome.tabs.sendMessage API. +Future sendTabsMessage({ + required int tabId, + required MessageType type, + required String body, + required Script sender, + required Script recipient, +}) { + final message = Message( + to: recipient, + from: sender, + type: type, + body: body, + ); + final completer = Completer(); + debugLog('sending tabs message'); + chrome.tabs.sendMessage( + tabId, + message.toJSON(), + null, + allowInterop(() { + final error = chrome.runtime.lastError; + if (error != null) { + debugError( + 'Error sending $type to $recipient from $sender: ${error.message}', + ); + } + completer.complete(error != null); + }), + ); + return completer.future; +} From 0e04bca545031915517231d1329db5070f799848 Mon Sep 17 00:00:00 2001 From: Elliott Brooks <21270878+elliette@users.noreply.github.com> Date: Thu, 26 Oct 2023 13:06:40 -0700 Subject: [PATCH 04/11] Working for MV2 --- dwds/debug_extension_mv3/web/background.dart | 10 ++++++++-- dwds/debug_extension_mv3/web/chrome_api.dart | 2 +- dwds/debug_extension_mv3/web/copier.dart | 12 ++++++++++-- dwds/debug_extension_mv3/web/manifest_mv2.json | 1 + dwds/debug_extension_mv3/web/messaging.dart | 4 ++-- 5 files changed, 22 insertions(+), 7 deletions(-) diff --git a/dwds/debug_extension_mv3/web/background.dart b/dwds/debug_extension_mv3/web/background.dart index a2dd70b0c..e9431a24a 100644 --- a/dwds/debug_extension_mv3/web/background.dart +++ b/dwds/debug_extension_mv3/web/background.dart @@ -5,6 +5,8 @@ @JS() library background; +import 'dart:js_util'; + import 'package:dwds/data/debug_info.dart'; import 'package:js/js.dart'; @@ -159,6 +161,10 @@ Future _handleRuntimeMessages( _setWarningIcon(); }, ); + + final response = {'response': 'received'}; + debugLog('sending back response'); + sendResponse(jsify(response)); } Future _detectNavigationAwayFromDartApp( @@ -216,8 +222,8 @@ Future _maybeSendCopyAppIdRequest(String command, [Tab? tab]) async { final tabId = (tab ?? await activeTab)?.id; if (tabId == null) return false; final debugInfo = await _fetchDebugInfo(tabId); - final workspaceName = debugInfo?.workspaceName; - if (workspaceName == null) return false; + final workspaceName = debugInfo?.workspaceName ?? 'fake-workspace'; + // if (workspaceName == null) return false; final appId = '$workspaceName-$tabId'; return sendTabsMessage( tabId: tabId, diff --git a/dwds/debug_extension_mv3/web/chrome_api.dart b/dwds/debug_extension_mv3/web/chrome_api.dart index b98c5a9dc..a7e9db0c9 100644 --- a/dwds/debug_extension_mv3/web/chrome_api.dart +++ b/dwds/debug_extension_mv3/web/chrome_api.dart @@ -243,7 +243,7 @@ class ConnectionHandler { @anonymous class OnMessageHandler { external void addListener( - void Function(dynamic, MessageSender, Function) callback, + dynamic Function(dynamic, MessageSender, Function) callback, ); } diff --git a/dwds/debug_extension_mv3/web/copier.dart b/dwds/debug_extension_mv3/web/copier.dart index 348d6e2c9..6a816bb28 100644 --- a/dwds/debug_extension_mv3/web/copier.dart +++ b/dwds/debug_extension_mv3/web/copier.dart @@ -6,10 +6,12 @@ library copier; import 'dart:html'; +import 'dart:js_util'; import 'package:js/js.dart'; import 'chrome_api.dart'; +import 'logger.dart'; import 'messaging.dart'; void main() { @@ -21,7 +23,6 @@ void _registerListeners() { allowInterop(_handleRuntimeMessages), ); } - void _handleRuntimeMessages( dynamic jsRequest, MessageSender sender, @@ -35,19 +36,26 @@ void _handleRuntimeMessages( expectedRecipient: Script.copier, messageHandler: _copyAppId, ); + + final response = {'response': 'received'}; + debugLog('sending back response'); + sendResponse(jsify(response)); } void _copyAppId(String appId) { + debugLog('RECEIVED $appId'); final clipboard = window.navigator.clipboard; + debugLog('CLIPBOARD IS $clipboard'); if (clipboard == null) return; clipboard.writeText(appId); + debugLog('WROTE TEXT'); _showCopiedMessage(appId); } Future _showCopiedMessage(String appId) async { final snackbar = document.createElement('div'); snackbar.setInnerHtml('Copied $appId!'); - snackbar.classes.add('snackbar snackbar--info show'); + snackbar.classes.addAll(['snackbar', 'snackbar--info', 'show']); document.body?.append(snackbar); await Future.delayed(Duration(seconds: 2)); snackbar.remove(); diff --git a/dwds/debug_extension_mv3/web/manifest_mv2.json b/dwds/debug_extension_mv3/web/manifest_mv2.json index 0e739d3ec..bfb8fb8cb 100644 --- a/dwds/debug_extension_mv3/web/manifest_mv2.json +++ b/dwds/debug_extension_mv3/web/manifest_mv2.json @@ -25,6 +25,7 @@ { "matches": [""], "js": ["detector.dart.js", "copier.dart.js"], + "css": ["static_assets/styles.css"], "run_at": "document_end" } ], diff --git a/dwds/debug_extension_mv3/web/messaging.dart b/dwds/debug_extension_mv3/web/messaging.dart index b667a9653..5417607bf 100644 --- a/dwds/debug_extension_mv3/web/messaging.dart +++ b/dwds/debug_extension_mv3/web/messaging.dart @@ -125,7 +125,7 @@ Future sendRuntimeMessage({ message.toJSON(), // options null, - allowInterop(() { + allowInterop(([dynamic response]) { final error = chrome.runtime.lastError; if (error != null) { debugError( @@ -158,7 +158,7 @@ Future sendTabsMessage({ tabId, message.toJSON(), null, - allowInterop(() { + allowInterop(([dynamic response]) { final error = chrome.runtime.lastError; if (error != null) { debugError( From f31e71f5f48e3bbdc699db8d1a5c07034a01264d Mon Sep 17 00:00:00 2001 From: Elliott Brooks <21270878+elliette@users.noreply.github.com> Date: Thu, 26 Oct 2023 16:16:31 -0700 Subject: [PATCH 05/11] Update manifests --- dwds/debug_extension_mv3/web/manifest_mv2.json | 6 +++--- dwds/debug_extension_mv3/web/manifest_mv3.json | 12 +++++++++++- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/dwds/debug_extension_mv3/web/manifest_mv2.json b/dwds/debug_extension_mv3/web/manifest_mv2.json index bfb8fb8cb..9217a67da 100644 --- a/dwds/debug_extension_mv3/web/manifest_mv2.json +++ b/dwds/debug_extension_mv3/web/manifest_mv2.json @@ -32,10 +32,10 @@ "commands": { "copyAppId": { "suggestedKey": { - "default": "Alt+D", - "mac": "Option+D" + "default": "Ctrl+Shift+7", + "mac": "Command+Shift+7" }, - "description": "Copies the app ID to the clipboard." + "description": "Copy the app ID" } }, "web_accessible_resources": ["debug_info.dart.js"], diff --git a/dwds/debug_extension_mv3/web/manifest_mv3.json b/dwds/debug_extension_mv3/web/manifest_mv3.json index c0b2960e2..1f92152a4 100644 --- a/dwds/debug_extension_mv3/web/manifest_mv3.json +++ b/dwds/debug_extension_mv3/web/manifest_mv3.json @@ -31,10 +31,20 @@ "content_scripts": [ { "matches": [""], - "js": ["detector.dart.js"], + "js": ["detector.dart.js", "copier.dart.js"], + "css": ["static_assets/styles.css"], "run_at": "document_end" } ], + "commands": { + "copyAppId": { + "suggestedKey": { + "default": "Ctrl+Shift+7", + "mac": "Command+Shift+7" + }, + "description": "Copy the app ID" + } + }, "web_accessible_resources": [ { "matches": [""], From ce5609c4b9de13be00db55fbff091d2b76903853 Mon Sep 17 00:00:00 2001 From: Elliott Brooks <21270878+elliette@users.noreply.github.com> Date: Fri, 27 Oct 2023 09:59:33 -0700 Subject: [PATCH 06/11] Polish --- dwds/debug_extension_mv3/web/copier.dart | 10 ++-------- dwds/debug_extension_mv3/web/static_assets/styles.css | 10 ++++++---- 2 files changed, 8 insertions(+), 12 deletions(-) diff --git a/dwds/debug_extension_mv3/web/copier.dart b/dwds/debug_extension_mv3/web/copier.dart index 6a816bb28..55b2e12d6 100644 --- a/dwds/debug_extension_mv3/web/copier.dart +++ b/dwds/debug_extension_mv3/web/copier.dart @@ -11,7 +11,6 @@ import 'dart:js_util'; import 'package:js/js.dart'; import 'chrome_api.dart'; -import 'logger.dart'; import 'messaging.dart'; void main() { @@ -26,7 +25,6 @@ void _registerListeners() { void _handleRuntimeMessages( dynamic jsRequest, MessageSender sender, - // ignore: avoid-unused-parameters Function sendResponse, ) { interceptMessage( @@ -38,25 +36,21 @@ void _handleRuntimeMessages( ); final response = {'response': 'received'}; - debugLog('sending back response'); sendResponse(jsify(response)); } void _copyAppId(String appId) { - debugLog('RECEIVED $appId'); final clipboard = window.navigator.clipboard; - debugLog('CLIPBOARD IS $clipboard'); if (clipboard == null) return; clipboard.writeText(appId); - debugLog('WROTE TEXT'); _showCopiedMessage(appId); } Future _showCopiedMessage(String appId) async { final snackbar = document.createElement('div'); - snackbar.setInnerHtml('Copied $appId!'); + snackbar.setInnerHtml('Copied app ID: $appId'); snackbar.classes.addAll(['snackbar', 'snackbar--info', 'show']); document.body?.append(snackbar); - await Future.delayed(Duration(seconds: 2)); + await Future.delayed(Duration(seconds: 4)); snackbar.remove(); } diff --git a/dwds/debug_extension_mv3/web/static_assets/styles.css b/dwds/debug_extension_mv3/web/static_assets/styles.css index f5da6a7f6..55a0b4c5e 100644 --- a/dwds/debug_extension_mv3/web/static_assets/styles.css +++ b/dwds/debug_extension_mv3/web/static_assets/styles.css @@ -57,16 +57,16 @@ iframe { } .debugger-card > .mdl-card__title { + background: url("debugger_settings.png"); background-position: center; background-repeat: no-repeat; - background: url("debugger_settings.png"); height: 200px; } .inspector-card > .mdl-card__title { + background: url("inspect_widget.png"); background-position: center; background-repeat: no-repeat; - background: url("inspect_widget.png"); height: 300px; } @@ -75,11 +75,13 @@ h6 { } .snackbar { - border-radius: 2px; bottom: 0px; color: #eeeeee; + font-family: Roboto, 'Helvetica Neue', sans-serif; + left: 0px; padding: 16px; position: fixed; + right: 0px; text-align: center; visibility: hidden; width: 100%; @@ -87,8 +89,8 @@ h6 { } .snackbar > a { - font-weight: bold; color: #eeeeee; + font-weight: bold; } .snackbar--info { From fdd210c4015a0e230afcf92890a5055c26c98adc Mon Sep 17 00:00:00 2001 From: Elliott Brooks <21270878+elliette@users.noreply.github.com> Date: Fri, 27 Oct 2023 10:12:07 -0700 Subject: [PATCH 07/11] More polish --- dwds/debug_extension_mv3/web/background.dart | 11 +++-------- dwds/debug_extension_mv3/web/messaging.dart | 8 +++++++- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/dwds/debug_extension_mv3/web/background.dart b/dwds/debug_extension_mv3/web/background.dart index e9431a24a..2c6e25351 100644 --- a/dwds/debug_extension_mv3/web/background.dart +++ b/dwds/debug_extension_mv3/web/background.dart @@ -55,7 +55,6 @@ void _registerListeners() { chrome.webNavigation.onCommitted .addListener(allowInterop(_detectNavigationAwayFromDartApp)); - debugLog('listening for commands...'); chrome.commands.onCommand .addListener(allowInterop(_maybeSendCopyAppIdRequest)); @@ -73,7 +72,6 @@ void _registerListeners() { Future _handleRuntimeMessages( dynamic jsRequest, MessageSender sender, - // ignore: avoid-unused-parameters Function sendResponse, ) async { if (jsRequest is! String) return; @@ -162,9 +160,7 @@ Future _handleRuntimeMessages( }, ); - final response = {'response': 'received'}; - debugLog('sending back response'); - sendResponse(jsify(response)); + sendResponse(defaultResponse); } Future _detectNavigationAwayFromDartApp( @@ -217,13 +213,12 @@ DebugInfo _addTabInfo(DebugInfo debugInfo, {required Tab tab}) { } Future _maybeSendCopyAppIdRequest(String command, [Tab? tab]) async { - debugLog('==== Received $command command'); if (command != 'copyAppId') return false; final tabId = (tab ?? await activeTab)?.id; if (tabId == null) return false; final debugInfo = await _fetchDebugInfo(tabId); - final workspaceName = debugInfo?.workspaceName ?? 'fake-workspace'; - // if (workspaceName == null) return false; + final workspaceName = debugInfo?.workspaceName; + if (workspaceName == null) return false; final appId = '$workspaceName-$tabId'; return sendTabsMessage( tabId: tabId, diff --git a/dwds/debug_extension_mv3/web/messaging.dart b/dwds/debug_extension_mv3/web/messaging.dart index 5417607bf..b4fb9cc7c 100644 --- a/dwds/debug_extension_mv3/web/messaging.dart +++ b/dwds/debug_extension_mv3/web/messaging.dart @@ -7,6 +7,7 @@ library messaging; import 'dart:async'; import 'dart:convert'; +import 'dart:js_util'; import 'package:js/js.dart'; @@ -14,6 +15,12 @@ import 'chrome_api.dart'; import 'data_serializers.dart'; import 'logger.dart'; +// A default response to for the sendResponse callback. +// +// Prevents the message port from closing. See: +// https://developer.chrome.com/docs/extensions/mv3/messaging/#simple +final defaultResponse = jsify({'response': 'received'}); + enum Script { background, copier, @@ -153,7 +160,6 @@ Future sendTabsMessage({ body: body, ); final completer = Completer(); - debugLog('sending tabs message'); chrome.tabs.sendMessage( tabId, message.toJSON(), From 39d08dea63c120c020a651a8c030126095a8e01b Mon Sep 17 00:00:00 2001 From: Elliott Brooks <21270878+elliette@users.noreply.github.com> Date: Fri, 27 Oct 2023 10:27:02 -0700 Subject: [PATCH 08/11] Combine sendTabsMessage and sendRuntimeMessage --- dwds/debug_extension_mv3/web/copier.dart | 4 +- dwds/debug_extension_mv3/web/messaging.dart | 92 ++++++++++++--------- 2 files changed, 52 insertions(+), 44 deletions(-) diff --git a/dwds/debug_extension_mv3/web/copier.dart b/dwds/debug_extension_mv3/web/copier.dart index 55b2e12d6..30be2e347 100644 --- a/dwds/debug_extension_mv3/web/copier.dart +++ b/dwds/debug_extension_mv3/web/copier.dart @@ -6,7 +6,6 @@ library copier; import 'dart:html'; -import 'dart:js_util'; import 'package:js/js.dart'; @@ -35,8 +34,7 @@ void _handleRuntimeMessages( messageHandler: _copyAppId, ); - final response = {'response': 'received'}; - sendResponse(jsify(response)); + sendResponse(defaultResponse); } void _copyAppId(String appId) { diff --git a/dwds/debug_extension_mv3/web/messaging.dart b/dwds/debug_extension_mv3/web/messaging.dart index b4fb9cc7c..4979d8c95 100644 --- a/dwds/debug_extension_mv3/web/messaging.dart +++ b/dwds/debug_extension_mv3/web/messaging.dart @@ -113,37 +113,19 @@ void interceptMessage({ } } +/// Send a message using the chrome.runtime.sendMessage API. Future sendRuntimeMessage({ required MessageType type, required String body, required Script sender, required Script recipient, -}) { - final message = Message( - to: recipient, - from: sender, - type: type, - body: body, - ); - final completer = Completer(); - chrome.runtime.sendMessage( - // id - null, - message.toJSON(), - // options - null, - allowInterop(([dynamic response]) { - final error = chrome.runtime.lastError; - if (error != null) { - debugError( - 'Error sending $type to $recipient from $sender: ${error.message}', - ); - } - completer.complete(error != null); - }), - ); - return completer.future; -} +}) => + _sendMessage( + type: type, + body: body, + sender: sender, + recipient: recipient, + ); /// Send a message using the chrome.tabs.sendMessage API. Future sendTabsMessage({ @@ -152,27 +134,55 @@ Future sendTabsMessage({ required String body, required Script sender, required Script recipient, +}) => + _sendMessage( + tabId: tabId, + type: type, + body: body, + sender: sender, + recipient: recipient, + ); + +Future _sendMessage({ + required MessageType type, + required String body, + required Script sender, + required Script recipient, + int? tabId, }) { final message = Message( to: recipient, from: sender, type: type, body: body, - ); + ).toJSON(); final completer = Completer(); - chrome.tabs.sendMessage( - tabId, - message.toJSON(), - null, - allowInterop(([dynamic response]) { - final error = chrome.runtime.lastError; - if (error != null) { - debugError( - 'Error sending $type to $recipient from $sender: ${error.message}', - ); - } - completer.complete(error != null); - }), - ); + final responseHandler = ([dynamic response]) { + final error = chrome.runtime.lastError; + if (error != null) { + debugError( + 'Error sending $type to $recipient from $sender: ${error.message}', + ); + } + completer.complete(error != null); + }; + if (tabId != null) { + chrome.tabs.sendMessage( + tabId, + message, + // options + null, + allowInterop(responseHandler), + ); + } else { + chrome.runtime.sendMessage( + // id + null, + message, + // options + null, + allowInterop(responseHandler), + ); + } return completer.future; } From aa343b887392ddf233f610412f8d6d32ad933898 Mon Sep 17 00:00:00 2001 From: Elliott Brooks <21270878+elliette@users.noreply.github.com> Date: Fri, 27 Oct 2023 10:40:12 -0700 Subject: [PATCH 09/11] Fix analyzer errors --- dwds/debug_extension_mv3/web/background.dart | 2 -- dwds/debug_extension_mv3/web/messaging.dart | 4 ++-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/dwds/debug_extension_mv3/web/background.dart b/dwds/debug_extension_mv3/web/background.dart index 2c6e25351..03f914369 100644 --- a/dwds/debug_extension_mv3/web/background.dart +++ b/dwds/debug_extension_mv3/web/background.dart @@ -5,8 +5,6 @@ @JS() library background; -import 'dart:js_util'; - import 'package:dwds/data/debug_info.dart'; import 'package:js/js.dart'; diff --git a/dwds/debug_extension_mv3/web/messaging.dart b/dwds/debug_extension_mv3/web/messaging.dart index 4979d8c95..8172f7a6d 100644 --- a/dwds/debug_extension_mv3/web/messaging.dart +++ b/dwds/debug_extension_mv3/web/messaging.dart @@ -157,7 +157,7 @@ Future _sendMessage({ body: body, ).toJSON(); final completer = Completer(); - final responseHandler = ([dynamic response]) { + void responseHandler([dynamic _]) { final error = chrome.runtime.lastError; if (error != null) { debugError( @@ -165,7 +165,7 @@ Future _sendMessage({ ); } completer.complete(error != null); - }; + } if (tabId != null) { chrome.tabs.sendMessage( tabId, From 98313ed65c103c763d0bcf8cc41a30a451dc0959 Mon Sep 17 00:00:00 2001 From: Elliott Brooks <21270878+elliette@users.noreply.github.com> Date: Fri, 27 Oct 2023 10:41:09 -0700 Subject: [PATCH 10/11] Update comment --- dwds/debug_extension_mv3/web/messaging.dart | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/dwds/debug_extension_mv3/web/messaging.dart b/dwds/debug_extension_mv3/web/messaging.dart index 8172f7a6d..f2993014e 100644 --- a/dwds/debug_extension_mv3/web/messaging.dart +++ b/dwds/debug_extension_mv3/web/messaging.dart @@ -15,7 +15,7 @@ import 'chrome_api.dart'; import 'data_serializers.dart'; import 'logger.dart'; -// A default response to for the sendResponse callback. +// A default response for the sendResponse callback. // // Prevents the message port from closing. See: // https://developer.chrome.com/docs/extensions/mv3/messaging/#simple @@ -166,6 +166,7 @@ Future _sendMessage({ } completer.complete(error != null); } + if (tabId != null) { chrome.tabs.sendMessage( tabId, From fc0c07e46270a81f0993b16d1cb3bfcf9615edd0 Mon Sep 17 00:00:00 2001 From: Elliott Brooks <21270878+elliette@users.noreply.github.com> Date: Fri, 27 Oct 2023 10:46:59 -0700 Subject: [PATCH 11/11] Run the formatter --- dwds/debug_extension_mv3/web/copier.dart | 1 + 1 file changed, 1 insertion(+) diff --git a/dwds/debug_extension_mv3/web/copier.dart b/dwds/debug_extension_mv3/web/copier.dart index 30be2e347..79ce3aeaf 100644 --- a/dwds/debug_extension_mv3/web/copier.dart +++ b/dwds/debug_extension_mv3/web/copier.dart @@ -21,6 +21,7 @@ void _registerListeners() { allowInterop(_handleRuntimeMessages), ); } + void _handleRuntimeMessages( dynamic jsRequest, MessageSender sender,