Skip to content

Commit 5aa5aba

Browse files
author
Dart CI
committed
Version 2.14.0-107.0.dev
Merge commit '33aa207efd4f51bfa9bf0c355c62a8099a221cf3' into 'dev'
2 parents bc139b2 + 33aa207 commit 5aa5aba

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

68 files changed

+1507
-252
lines changed

.dart_tool/package_config.json

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -252,6 +252,18 @@
252252
"packageUri": "lib/",
253253
"languageVersion": "2.3"
254254
},
255+
{
256+
"name": "devtools_server",
257+
"rootUri": "../third_party/devtools/devtools_server",
258+
"packageUri": "lib/",
259+
"languageVersion": "2.6"
260+
},
261+
{
262+
"name": "devtools_shared",
263+
"rootUri": "../third_party/devtools/devtools_shared",
264+
"packageUri": "lib/",
265+
"languageVersion": "2.3"
266+
},
255267
{
256268
"name": "diagnostic",
257269
"rootUri": "../pkg/diagnostic",

.packages

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ bazel_worker:third_party/pkg/bazel_worker/lib
2121
benchmark_harness:third_party/pkg/benchmark_harness/lib
2222
boolean_selector:third_party/pkg/boolean_selector/lib
2323
build_integration:pkg/build_integration/lib
24+
browser_launcher:third_party/pkg/browser_launcher/lib
2425
charcode:third_party/pkg/charcode/lib
2526
cli_util:third_party/pkg/cli_util/lib
2627
collection:third_party/pkg/collection/lib
@@ -37,6 +38,7 @@ dartdev:pkg/dartdev/lib
3738
dartdoc:third_party/pkg/dartdoc/lib
3839
dds:pkg/dds/lib
3940
dev_compiler:pkg/dev_compiler/lib
41+
devtools_shared:third_party/devtools/devtools_shared/lib
4042
diagnostic:pkg/diagnostic/lib
4143
expect:pkg/expect/lib
4244
ffi:third_party/pkg/ffi/lib

DEPS

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,7 @@ vars = {
8080
"boringssl_gen_rev": "7322fc15cc065d8d2957fccce6b62a509dc4d641",
8181
"boringssl_rev" : "1607f54fed72c6589d560254626909a64124f091",
8282
"browser-compat-data_tag": "v1.0.22",
83+
"browser_launcher_rev": "12ab9f351a44ac803de9bc17bb2180bb312a9dd7",
8384
"charcode_rev": "bcd8a12c315b7a83390e4865ad847ecd9344cba2",
8485
"chrome_rev" : "19997",
8586
"cli_util_rev" : "8c504de5deb08fe32ecf51f9662bb37d8c708e57",
@@ -105,7 +106,6 @@ vars = {
105106
"dart_style_rev": "f17c23e0eea9a870601c19d904e2a9c1a7c81470",
106107

107108
"chromedriver_tag": "83.0.4103.39",
108-
"browser_launcher_rev": "12ab9f351a44ac803de9bc17bb2180bb312a9dd7",
109109
"dartdoc_rev" : "505f163f7cb48e917503e4a23fbff1227e08b263",
110110
"devtools_rev" : "12ad5341ae0a275042c84a4e7be9a6c98db65612",
111111
"jsshell_tag": "version:88.0",
@@ -320,6 +320,9 @@ deps = {
320320
Var('chromium_git') + '/external/github.com/mdn/browser-compat-data' +
321321
"@" + Var("browser-compat-data_tag"),
322322

323+
Var("dart_root") + "/third_party/pkg/browser_launcher":
324+
Var("dart_git") + "browser_launcher.git" + "@" + Var("browser_launcher_rev"),
325+
323326
Var("dart_root") + "/third_party/tcmalloc/gperftools":
324327
Var('chromium_git') + '/external/github.com/gperftools/gperftools.git' +
325328
"@" + Var("gperftools_revision"),
@@ -336,9 +339,6 @@ deps = {
336339
Var("dart_root") + "/third_party/pkg/boolean_selector":
337340
Var("dart_git") + "boolean_selector.git" +
338341
"@" + Var("boolean_selector_rev"),
339-
Var("dart_root") + "/third_party/pkg/browser_launcher":
340-
Var("dart_git") + "browser_launcher.git" +
341-
"@" + Var("browser_launcher_rev"),
342342
Var("dart_root") + "/third_party/pkg/charcode":
343343
Var("dart_git") + "charcode.git" + "@" + Var("charcode_rev"),
344344
Var("dart_root") + "/third_party/pkg/cli_util":

pkg/analyzer/tool/diagnostics/diagnostics.md

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -398,8 +398,7 @@ export 'b.dart' hide C;
398398

399399
### ambiguous_extension_member_access
400400

401-
_A member named '{0}' is defined in extensions {1}, and neither is more
402-
specific._
401+
_A member named '{0}' is defined in extensions {1}, and none are more specific._
403402

404403
#### Description
405404

pkg/dartdev/lib/dartdev.dart

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,8 @@ Future<void> runDartdev(List<String> args, SendPort port) async {
4040
args = args
4141
.where(
4242
(element) => !(element.contains('--observe') ||
43-
element.contains('--enable-vm-service')),
43+
element.contains('--enable-vm-service') ||
44+
element.contains('--devtools')),
4445
)
4546
.toList();
4647
}

pkg/dartdev/lib/src/commands/run.dart

Lines changed: 70 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,10 @@ class RunCommand extends DartdevCommand {
158158
hide: !verbose,
159159
negatable: false,
160160
help: 'Enables tracing of library and script loading.',
161+
)
162+
..addFlag(
163+
'debug-dds',
164+
hide: true,
161165
);
162166
addExperimentalFlags(argParser, verbose);
163167
}
@@ -179,13 +183,18 @@ class RunCommand extends DartdevCommand {
179183
String launchDdsArg = argResults['launch-dds'];
180184
String ddsHost = '';
181185
String ddsPort = '';
186+
187+
// TODO(bkonyi): allow for users to choose not to launch DevTools
188+
// See https://github.com/dart-lang/sdk/issues/45867.
189+
const bool launchDevTools = true;
182190
bool launchDds = false;
183191
if (launchDdsArg != null) {
184192
launchDds = true;
185-
final ddsUrl = launchDdsArg.split(':');
193+
final ddsUrl = launchDdsArg.split('\\:');
186194
ddsHost = ddsUrl[0];
187195
ddsPort = ddsUrl[1];
188196
}
197+
final bool debugDds = argResults['debug-dds'];
189198

190199
bool disableServiceAuthCodes = argResults['disable-service-auth-codes'];
191200

@@ -198,7 +207,12 @@ class RunCommand extends DartdevCommand {
198207
if (launchDds) {
199208
debugSession = _DebuggingSession();
200209
if (!await debugSession.start(
201-
ddsHost, ddsPort, disableServiceAuthCodes)) {
210+
ddsHost,
211+
ddsPort,
212+
disableServiceAuthCodes,
213+
launchDevTools,
214+
debugDds,
215+
)) {
202216
return errorExitCode;
203217
}
204218
}
@@ -242,10 +256,19 @@ String maybeUriToFilename(String maybeUri) {
242256

243257
class _DebuggingSession {
244258
Future<bool> start(
245-
String host, String port, bool disableServiceAuthCodes) async {
246-
final ddsSnapshot = (dirname(sdk.dart).endsWith('bin'))
259+
String host,
260+
String port,
261+
bool disableServiceAuthCodes,
262+
bool enableDevTools,
263+
bool debugDds,
264+
) async {
265+
final sdkDir = dirname(sdk.dart);
266+
final fullSdk = sdkDir.endsWith('bin');
267+
final ddsSnapshot = fullSdk
247268
? sdk.ddsSnapshot
248-
: absolute(dirname(sdk.dart), 'gen', 'dds.dart.snapshot');
269+
: absolute(sdkDir, 'gen', 'dds.dart.snapshot');
270+
final devToolsBinaries =
271+
fullSdk ? sdk.devToolsBinaries : absolute(sdkDir, 'devtools');
249272
if (!Sdk.checkArtifactExists(ddsSnapshot)) {
250273
return false;
251274
}
@@ -256,30 +279,51 @@ class _DebuggingSession {
256279
serviceInfo = await Service.getInfo();
257280
}
258281
final process = await Process.start(
259-
sdk.dart,
260-
[
261-
if (dirname(sdk.dart).endsWith('bin'))
262-
sdk.ddsSnapshot
263-
else
264-
absolute(dirname(sdk.dart), 'gen', 'dds.dart.snapshot'),
265-
serviceInfo.serverUri.toString(),
266-
host,
267-
port,
268-
disableServiceAuthCodes.toString(),
269-
],
270-
mode: ProcessStartMode.detachedWithStdio);
282+
sdk.dart,
283+
[
284+
if (debugDds) '--enable-vm-service=0',
285+
ddsSnapshot,
286+
serviceInfo.serverUri.toString(),
287+
host,
288+
port,
289+
disableServiceAuthCodes.toString(),
290+
enableDevTools.toString(),
291+
devToolsBinaries,
292+
debugDds.toString(),
293+
],
294+
mode: ProcessStartMode.detachedWithStdio,
295+
);
271296
final completer = Completer<void>();
272-
StreamSubscription sub;
273-
sub = process.stderr.transform(utf8.decoder).listen((event) {
274-
if (event == 'DDS started') {
275-
sub.cancel();
297+
const devToolsMessagePrefix =
298+
'The Dart DevTools debugger and profiler is available at:';
299+
if (debugDds) {
300+
StreamSubscription stdoutSub;
301+
stdoutSub = process.stdout.transform(utf8.decoder).listen((event) {
302+
if (event.startsWith(devToolsMessagePrefix)) {
303+
final ddsDebuggingUri = event.split(' ').last;
304+
print(
305+
'A DevTools debugger for DDS is available at: $ddsDebuggingUri',
306+
);
307+
stdoutSub.cancel();
308+
}
309+
});
310+
}
311+
StreamSubscription stderrSub;
312+
stderrSub = process.stderr.transform(utf8.decoder).listen((event) {
313+
final result = json.decode(event) as Map<String, dynamic>;
314+
final state = result['state'];
315+
if (state == 'started') {
316+
if (result.containsKey('devToolsUri')) {
317+
final devToolsUri = result['devToolsUri'];
318+
print('$devToolsMessagePrefix $devToolsUri');
319+
}
320+
stderrSub.cancel();
276321
completer.complete();
277-
} else if (event.contains('Failed to start DDS')) {
278-
sub.cancel();
279-
completer.completeError(event.replaceAll(
280-
'Failed to start DDS',
322+
} else {
323+
stderrSub.cancel();
324+
completer.completeError(
281325
'Could not start Observatory HTTP server',
282-
));
326+
);
283327
}
284328
});
285329
try {

pkg/dartdev/lib/src/sdk.dart

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,13 @@ class Sdk {
6868
'dds.dart.snapshot',
6969
);
7070

71+
String get devToolsBinaries => path.absolute(
72+
sdkPath,
73+
'bin',
74+
'resources',
75+
'devtools',
76+
);
77+
7178
String get pubSnapshot => path.absolute(
7279
sdkPath,
7380
'bin',

pkg/dartdev/test/commands/run_test.dart

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
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 'dart:async';
6+
import 'dart:convert';
57
import 'dart:io';
68

79
import 'package:path/path.dart' as path;
@@ -300,4 +302,61 @@ void main(List<String> args) => print("$b $args");
300302
expect(result.stderr, isEmpty);
301303
expect(result.exitCode, 0);
302304
});
305+
306+
group('DevTools', () {
307+
const devToolsMessagePrefix =
308+
'The Dart DevTools debugger and profiler is available at: http://127.0.0.1:';
309+
310+
test('spawn simple', () async {
311+
p = project(mainSrc: "void main() { print('Hello World'); }");
312+
ProcessResult result = p.runSync([
313+
'run',
314+
'--enable-vm-service',
315+
p.relativeFilePath,
316+
]);
317+
expect(result.stdout, contains(devToolsMessagePrefix));
318+
});
319+
320+
test('implicit spawn', () async {
321+
p = project(mainSrc: "void main() { print('Hello World'); }");
322+
ProcessResult result = p.runSync([
323+
'--enable-vm-service',
324+
p.relativeFilePath,
325+
]);
326+
expect(result.stdout, contains(devToolsMessagePrefix));
327+
});
328+
329+
test(
330+
'spawn via SIGQUIT',
331+
() async {
332+
p = project(
333+
mainSrc:
334+
'void main() { print("ready"); int i = 0; while(true) { i++; } }',
335+
);
336+
Process process = await p.start([
337+
p.relativeFilePath,
338+
]);
339+
340+
final readyCompleter = Completer<void>();
341+
final completer = Completer<void>();
342+
343+
StreamSubscription sub;
344+
sub = process.stdout.transform(utf8.decoder).listen((event) async {
345+
if (event.contains('ready')) {
346+
readyCompleter.complete();
347+
} else if (event.contains(devToolsMessagePrefix)) {
348+
await sub.cancel();
349+
completer.complete();
350+
}
351+
});
352+
// Wait for process to start.
353+
await readyCompleter.future;
354+
process.kill(ProcessSignal.sigquit);
355+
await completer.future;
356+
process.kill();
357+
},
358+
// No support for SIGQUIT on Windows.
359+
skip: Platform.isWindows,
360+
);
361+
});
303362
}

pkg/dds/CHANGELOG.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
# 1.7.7-dev
1+
# 1.8.0-dev
2+
- Add support for launching DevTools from DDS.
23
- Fixed issue where two clients subscribing to the same stream in close succession
34
could result in DDS sending multiple `streamListen` requests to the VM service.
45

pkg/dds/bin/dds.dart

Lines changed: 29 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
// @dart=2.10
66

7+
import 'dart:convert';
78
import 'dart:io';
89

910
import 'package:dds/dds.dart';
@@ -16,6 +17,9 @@ import 'package:dds/dds.dart';
1617
/// - DDS bind address
1718
/// - DDS port
1819
/// - Disable service authentication codes
20+
/// - Start DevTools
21+
/// - DevTools build directory
22+
/// - Enable logging
1923
Future<void> main(List<String> args) async {
2024
if (args.isEmpty) return;
2125

@@ -37,16 +41,37 @@ Future<void> main(List<String> args) async {
3741
port: int.parse(args[2]),
3842
);
3943
final disableServiceAuthCodes = args[3] == 'true';
44+
45+
final startDevTools = args[4] == 'true';
46+
Uri devToolsBuildDirectory;
47+
if (args[5].isNotEmpty) {
48+
devToolsBuildDirectory = Uri.file(args[5]);
49+
}
50+
final logRequests = args[6] == 'true';
4051
try {
4152
// TODO(bkonyi): add retry logic similar to that in vmservice_server.dart
4253
// See https://github.com/dart-lang/sdk/issues/43192.
43-
await DartDevelopmentService.startDartDevelopmentService(
54+
final dds = await DartDevelopmentService.startDartDevelopmentService(
4455
remoteVmServiceUri,
4556
serviceUri: serviceUri,
4657
enableAuthCodes: !disableServiceAuthCodes,
58+
devToolsConfiguration: startDevTools
59+
? DevToolsConfiguration(
60+
enable: startDevTools,
61+
customBuildDirectoryPath: devToolsBuildDirectory,
62+
)
63+
: null,
64+
logRequests: logRequests,
4765
);
48-
stderr.write('DDS started');
49-
} catch (e) {
50-
stderr.writeln('Failed to start DDS:\n$e');
66+
stderr.write(json.encode({
67+
'state': 'started',
68+
if (dds.devToolsUri != null) 'devToolsUri': dds.devToolsUri.toString(),
69+
}));
70+
} catch (e, st) {
71+
stderr.write(json.encode({
72+
'state': 'error',
73+
'error': '$e',
74+
'stacktrace': '$st',
75+
}));
5176
}
5277
}

0 commit comments

Comments
 (0)