Skip to content

Commit acd3f9f

Browse files
authored
Can debug with the MV3 Dart Debug Extension (#1802)
1 parent 1258510 commit acd3f9f

File tree

9 files changed

+478
-39
lines changed

9 files changed

+478
-39
lines changed

dwds/debug_extension_mv3/pubspec.yaml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,15 +10,20 @@ environment:
1010

1111
dependencies:
1212
built_value: ^8.3.0
13+
collection: ^1.15.0
1314
js: ^0.6.1+1
1415

1516
dev_dependencies:
1617
build: ^2.0.0
1718
build_runner: ^2.0.6
19+
built_collection: ^5.0.0
1820
built_value_generator: ^8.3.0
1921
build_web_compilers: ^3.0.0
2022
dwds: ^16.0.0
2123

2224
dependency_overrides:
2325
dwds:
2426
path: ..
27+
# TODO(elliette): Remove override once package:sse is published.
28+
sse:
29+
path: /Users/elliottbrooks/dev/sse

dwds/debug_extension_mv3/web/background.dart

Lines changed: 4 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@ import 'package:dwds/data/debug_info.dart';
1212
import 'package:dwds/data/extension_request.dart';
1313
import 'package:js/js.dart';
1414

15+
import 'debug_session.dart';
1516
import 'chrome_api.dart';
16-
import 'data_types.dart';
1717
import 'lifeline_ports.dart';
1818
import 'logger.dart';
1919
import 'messaging.dart';
@@ -59,10 +59,8 @@ Future<void> _startDebugSession(Tab currentTab) async {
5959
if (!isAuthenticated) return;
6060

6161
maybeCreateLifelinePort(currentTab.id);
62-
final devToolsOpener = await fetchStorageObject<DevToolsOpener>(
63-
type: StorageObject.devToolsOpener);
64-
await _createTab('https://dart.dev/',
65-
inNewWindow: devToolsOpener?.newWindow ?? false);
62+
registerDebugEventListeners();
63+
attachDebugger(tabId);
6664
}
6765

6866
Future<bool> _authenticateUser(String extensionUrl, int tabId) async {
@@ -73,7 +71,7 @@ Future<bool> _authenticateUser(String extensionUrl, int tabId) async {
7371
debugError('Not authenticated: ${response.status} / $responseBody',
7472
verbose: true);
7573
_showWarningNotification('Please re-authenticate and try again.');
76-
await _createTab(authUrl, inNewWindow: false);
74+
await createTab(authUrl, inNewWindow: false);
7775
return false;
7876
}
7977
return true;
@@ -159,18 +157,3 @@ Future<Tab?> _getTab() async {
159157
final tabs = List<Tab>.from(await promiseToFuture(chrome.tabs.query(query)));
160158
return tabs.isNotEmpty ? tabs.first : null;
161159
}
162-
163-
Future<Tab> _createTab(String url, {bool inNewWindow = false}) async {
164-
if (inNewWindow) {
165-
final windowPromise = chrome.windows.create(
166-
WindowInfo(focused: true, url: url),
167-
);
168-
final windowObj = await promiseToFuture<WindowObj>(windowPromise);
169-
return windowObj.tabs.first;
170-
}
171-
final tabPromise = chrome.tabs.create(TabInfo(
172-
active: true,
173-
url: url,
174-
));
175-
return promiseToFuture<Tab>(tabPromise);
176-
}

dwds/debug_extension_mv3/web/chrome_api.dart

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ external Chrome get chrome;
1111
@anonymous
1212
class Chrome {
1313
external Action get action;
14+
external Debugger get debugger;
1415
external Notifications get notifications;
1516
external Runtime get runtime;
1617
external Scripting get scripting;
@@ -43,6 +44,48 @@ class IconInfo {
4344
external factory IconInfo({String path});
4445
}
4546

47+
/// chrome.debugger APIs:
48+
/// https://developer.chrome.com/docs/extensions/reference/debugger
49+
50+
@JS()
51+
@anonymous
52+
class Debugger {
53+
external void attach(
54+
Debuggee target, String requiredVersion, Function? callback);
55+
56+
external void detach(Debuggee target, Function? callback);
57+
58+
external void sendCommand(Debuggee target, String method,
59+
Object? commandParams, Function? callback);
60+
61+
external OnDetachHandler get onDetach;
62+
63+
external OnEventHandler get onEvent;
64+
}
65+
66+
@JS()
67+
@anonymous
68+
class OnDetachHandler {
69+
external void addListener(
70+
void Function(Debuggee source, String reason) callback);
71+
}
72+
73+
@JS()
74+
@anonymous
75+
class OnEventHandler {
76+
external void addListener(
77+
void Function(Debuggee source, String method, Object? params) callback);
78+
}
79+
80+
@JS()
81+
@anonymous
82+
class Debuggee {
83+
external int get tabId;
84+
external String get extensionId;
85+
external String get targetId;
86+
external factory Debuggee({int tabId, String? extensionId, String? targetId});
87+
}
88+
4689
/// chrome.notification APIs:
4790
/// https://developer.chrome.com/docs/extensions/reference/notifications
4891
@@ -77,11 +120,19 @@ class Runtime {
77120

78121
external Object getManifest();
79122

123+
// Note: Not checking the lastError when one occurs throws a runtime exception.
124+
external ChromeError? get lastError;
125+
80126
external ConnectionHandler get onConnect;
81127

82128
external OnMessageHandler get onMessage;
83129
}
84130

131+
@JS()
132+
class ChromeError {
133+
external String get message;
134+
}
135+
85136
@JS()
86137
@anonymous
87138
class ConnectInfo {
@@ -179,6 +230,10 @@ class Tabs {
179230

180231
external Object create(TabInfo tabInfo);
181232

233+
external Object get(int tabId);
234+
235+
external Object remove(int tabId);
236+
182237
external OnActivatedHandler get onActivated;
183238

184239
external OnRemovedHandler get onRemoved;

dwds/debug_extension_mv3/web/data_serializers.dart

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,24 @@
22
// for details. All rights reserved. Use of this source code is governed by a
33
// BSD-style license that can be found in the LICENSE file.
44

5+
import 'package:built_collection/built_collection.dart';
56
import 'package:built_value/serializer.dart';
67
import 'package:dwds/data/debug_info.dart';
8+
import 'package:dwds/data/devtools_request.dart';
9+
import 'package:dwds/data/extension_request.dart';
710

811
import 'data_types.dart';
912

1013
part 'data_serializers.g.dart';
1114

1215
/// Serializers for all the data types used in the Dart Debug Extension.
1316
@SerializersFor([
17+
BatchedEvents,
1418
DebugInfo,
1519
DevToolsOpener,
20+
DevToolsRequest,
21+
ExtensionEvent,
22+
ExtensionRequest,
23+
ExtensionResponse,
1624
])
1725
final Serializers serializers = _$serializers;

dwds/debug_extension_mv3/web/data_serializers.g.dart

Lines changed: 9 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)