Skip to content

Commit 7c096a2

Browse files
authored
Fetch full developer.log messages (#2333)
1 parent 6cad2b0 commit 7c096a2

File tree

3 files changed

+82
-25
lines changed

3 files changed

+82
-25
lines changed

dwds/CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
## 23.2.0-wip
22

3+
- Send untruncated `dart:developer` logs to debugging clients. - [#2333](https://github.com/dart-lang/webdev/pull/2333)
4+
35
## 23.1.1
46

57
- Loosen `package:vm_service` constraints to allow `>=13.0.0 <15.0.0`. - [#2329](https://github.com/dart-lang/webdev/pull/2329)

dwds/lib/src/services/chrome_proxy_service.dart

Lines changed: 45 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1363,8 +1363,6 @@ ${globalToolConfiguration.loadStrategy.loadModuleSnippet}("dart_sdk").developer.
13631363

13641364
final args = event.args;
13651365
final firstArgValue = (args.isNotEmpty ? args[0].value : null) as String?;
1366-
// TODO(nshahan) - Migrate 'inspect' and 'log' events to the injected
1367-
// client communication approach as well?
13681366
switch (firstArgValue) {
13691367
case 'dart.developer.inspect':
13701368
// All inspected objects should be real objects.
@@ -1383,7 +1381,13 @@ ${globalToolConfiguration.loadStrategy.loadModuleSnippet}("dart_sdk").developer.
13831381
);
13841382
break;
13851383
case 'dart.developer.log':
1386-
await _handleDeveloperLog(isolateRef, event);
1384+
await _handleDeveloperLog(isolateRef, event).catchError(
1385+
(error, stackTrace) => _logger.warning(
1386+
'Error handling developer log:',
1387+
error,
1388+
stackTrace,
1389+
),
1390+
);
13871391
break;
13881392
default:
13891393
break;
@@ -1402,12 +1406,13 @@ ${globalToolConfiguration.loadStrategy.loadModuleSnippet}("dart_sdk").developer.
14021406
ConsoleAPIEvent event,
14031407
) async {
14041408
final logObject = event.params?['args'][1] as Map?;
1405-
final logParams = <String, RemoteObject>{};
1406-
for (dynamic obj in logObject?['preview']?['properties'] ?? {}) {
1407-
if (obj['name'] != null && obj is Map<String, dynamic>) {
1408-
logParams[obj['name'] as String] = RemoteObject(obj);
1409-
}
1410-
}
1409+
final objectId = logObject?['objectId'];
1410+
// Always attempt to fetch the full properties instead of relying on
1411+
// `RemoteObject.preview` which only has truncated log messages:
1412+
// https://chromedevtools.github.io/devtools-protocol/tot/Runtime/#type-RemoteObject
1413+
final logParams = objectId != null
1414+
? await _fetchFullLogParams(objectId, logObject: logObject)
1415+
: _fetchAbbreviatedLogParams(logObject);
14111416

14121417
final logRecord = LogRecord(
14131418
message: await _instanceRef(logParams['message']),
@@ -1436,6 +1441,37 @@ ${globalToolConfiguration.loadStrategy.loadModuleSnippet}("dart_sdk").developer.
14361441
);
14371442
}
14381443

1444+
Future<Map<String, RemoteObject>> _fetchFullLogParams(
1445+
String objectId, {
1446+
required Map? logObject,
1447+
}) async {
1448+
final logParams = <String, RemoteObject>{};
1449+
for (final property in await inspector.getProperties(objectId)) {
1450+
final name = property.name;
1451+
final value = property.value;
1452+
if (name != null && value != null) {
1453+
logParams[name] = value;
1454+
}
1455+
}
1456+
1457+
// If for some reason we don't get the full log params, then return the
1458+
// abbreviated version instead:
1459+
if (logParams.isEmpty) {
1460+
return _fetchAbbreviatedLogParams(logObject);
1461+
}
1462+
return logParams;
1463+
}
1464+
1465+
Map<String, RemoteObject> _fetchAbbreviatedLogParams(Map? logObject) {
1466+
final logParams = <String, RemoteObject>{};
1467+
for (dynamic property in logObject?['preview']?['properties'] ?? []) {
1468+
if (property is Map<String, dynamic> && property['name'] != null) {
1469+
logParams[property['name'] as String] = RemoteObject(property);
1470+
}
1471+
}
1472+
return logParams;
1473+
}
1474+
14391475
@override
14401476
Future<Timestamp> getVMTimelineMicros() {
14411477
return _rpcNotSupportedFuture('getVMTimelineMicros');

dwds/test/chrome_proxy_service_test.dart

Lines changed: 35 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2370,25 +2370,44 @@ void main() {
23702370
});
23712371
});
23722372

2373-
test('Logging', () async {
2374-
final service = context.service;
2375-
expect(
2376-
service.streamListen(EventStreams.kLogging),
2377-
completion(_isSuccess),
2378-
);
2379-
final stream = service.onEvent(EventStreams.kLogging);
2380-
final message = 'myMessage';
2373+
group('Logging |', () {
2374+
test('logging stream is registered', () {
2375+
final service = context.service;
2376+
expect(
2377+
service.streamListen(EventStreams.kLogging),
2378+
completion(_isSuccess),
2379+
);
2380+
});
23812381

2382-
safeUnawaited(
2383-
context.tabConnection.runtime.evaluate("sendLog('$message');"),
2384-
);
2382+
test('dart:developer logs are correctly converted to log records',
2383+
() async {
2384+
final logStream = context.service.onEvent(EventStreams.kLogging);
2385+
final message = 'myMessage';
2386+
2387+
safeUnawaited(
2388+
context.tabConnection.runtime.evaluate("sendLog('$message');"),
2389+
);
2390+
2391+
final event = await logStream.first;
2392+
expect(event.kind, EventKind.kLogging);
23852393

2386-
final event = await stream.first;
2387-
expect(event.kind, EventKind.kLogging);
2394+
final logRecord = event.logRecord!;
2395+
expect(logRecord.message!.valueAsString, message);
2396+
expect(logRecord.loggerName!.valueAsString, 'testLogCategory');
2397+
});
2398+
2399+
test('long dart:developer log messages are not truncated', () async {
2400+
final logStream = context.service.onEvent(EventStreams.kLogging);
2401+
final longMessage =
2402+
'A very long log message that Chrome truncates by default and '
2403+
'requires users to expand in order to see the entire message.';
2404+
safeUnawaited(
2405+
context.tabConnection.runtime.evaluate("sendLog('$longMessage');"),
2406+
);
23882407

2389-
final logRecord = event.logRecord!;
2390-
expect(logRecord.message!.valueAsString, message);
2391-
expect(logRecord.loggerName!.valueAsString, 'testLogCategory');
2408+
final event = await logStream.first;
2409+
expect(event.logRecord!.message!.valueAsString, longMessage);
2410+
});
23922411
});
23932412
});
23942413
}

0 commit comments

Comments
 (0)