From 6b244aba289c306d67f266a6e0e731c4568342de Mon Sep 17 00:00:00 2001 From: Jacob MacDonald Date: Thu, 25 Apr 2019 10:18:43 -0700 Subject: [PATCH 1/2] improve dwds eval error reporting --- dwds/CHANGELOG.md | 5 ++++ dwds/lib/src/chrome_proxy_service.dart | 40 +++++++++++++++++++------- dwds/pubspec.yaml | 2 +- 3 files changed, 35 insertions(+), 12 deletions(-) diff --git a/dwds/CHANGELOG.md b/dwds/CHANGELOG.md index 0a7dbe107..1af0fed73 100644 --- a/dwds/CHANGELOG.md +++ b/dwds/CHANGELOG.md @@ -1,3 +1,8 @@ +## 0.3.1 + +- Improve error reporting for evals, give the full JS eval in the error message + so it can be more easily reproduced. + ## 0.3.0 - Change the exposed type on DebugService to VmServiceInterface diff --git a/dwds/lib/src/chrome_proxy_service.dart b/dwds/lib/src/chrome_proxy_service.dart index fa3a1724b..60db3d7cb 100644 --- a/dwds/lib/src/chrome_proxy_service.dart +++ b/dwds/lib/src/chrome_proxy_service.dart @@ -251,18 +251,27 @@ require("dart_sdk").developer.invokeExtension( throw UnsupportedError( 'Evaluate is only supported when `targetId` is a library.'); } - var result = await tabConnection.runtime.evaluate(''' + var evalExpression = ''' (function() { ${_getLibrarySnippet(library.uri)}; return library.$expression; })(); - '''); + '''; + var result = await tabConnection.runtime.sendCommand('Runtime.evaluate', + params: {'expression': evalExpression, 'returnByValue': true}); + _handleErrorIfPresent(result, + evalContents: evalExpression, + additionalDetails: { + 'Dart expression': expression, + 'scope': scope, + }); + var remoteObject = RemoteObject(result.result); String kind; var classRef = ClassRef() - ..id = 'dart:core:${result.type}' - ..name = result.type; - switch (result.type) { + ..id = 'dart:core:${remoteObject.type}' + ..name = remoteObject.type; + switch (remoteObject.type) { case 'string': kind = InstanceKind.kString; break; @@ -273,11 +282,12 @@ require("dart_sdk").developer.invokeExtension( kind = InstanceKind.kBool; break; default: - throw UnsupportedError('Unsupported response type ${result.type}'); + throw UnsupportedError( + 'Unsupported response type ${remoteObject.type}'); } return InstanceRef() - ..valueAsString = '${result.value}' + ..valueAsString = '${remoteObject.value}' ..classRef = classRef ..kind = kind; } @@ -788,11 +798,13 @@ const _stdoutTypes = ['log', 'info', 'warning']; /// Throws an [ExceptionDetails] object if `exceptionDetails` is present on the /// result. -void _handleErrorIfPresent(WipResponse response, {String evalContents}) { +void _handleErrorIfPresent(WipResponse response, + {String evalContents, Object additionalDetails}) { if (response.result.containsKey('exceptionDetails')) { throw ChromeDebugException( response.result['exceptionDetails'] as Map, - evalContents: evalContents); + evalContents: evalContents, + additionalDetails: additionalDetails); } } @@ -818,11 +830,14 @@ String _getLibrarySnippet(String libraryUri) => ''' '''; class ChromeDebugException extends ExceptionDetails implements Exception { + /// Optional, additional information about the exception. + final Object additionalDetails; + /// Optional, the exact contents of the eval that was attempted. final String evalContents; ChromeDebugException(Map exceptionDetails, - {this.evalContents}) + {this.additionalDetails, this.evalContents}) : super(exceptionDetails); @override @@ -839,7 +854,10 @@ class ChromeDebugException extends ExceptionDetails implements Exception { description.writeln(' value: ${exception.value}'); } if (evalContents != null) { - description.writeln('attempted eval: `$evalContents`'); + description.writeln('attempted JS eval: `$evalContents`'); + } + if (additionalDetails != null) { + description.writeln('additional details:\n $additionalDetails'); } return description.toString(); } diff --git a/dwds/pubspec.yaml b/dwds/pubspec.yaml index f8094d774..6201598dc 100644 --- a/dwds/pubspec.yaml +++ b/dwds/pubspec.yaml @@ -1,5 +1,5 @@ name: dwds -version: 0.3.0 +version: 0.3.1 author: Dart Team homepage: https://github.com/dart-lang/webdev/tree/master/dwds description: >- From 1cf9682940b9eb922b3ad411780dad81d21b20ad Mon Sep 17 00:00:00 2001 From: Jacob MacDonald Date: Thu, 25 Apr 2019 12:28:50 -0700 Subject: [PATCH 2/2] fix remote object handling --- dwds/lib/src/chrome_proxy_service.dart | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/dwds/lib/src/chrome_proxy_service.dart b/dwds/lib/src/chrome_proxy_service.dart index 60db3d7cb..3277a157e 100644 --- a/dwds/lib/src/chrome_proxy_service.dart +++ b/dwds/lib/src/chrome_proxy_service.dart @@ -265,7 +265,8 @@ require("dart_sdk").developer.invokeExtension( 'Dart expression': expression, 'scope': scope, }); - var remoteObject = RemoteObject(result.result); + var remoteObject = + RemoteObject(result.result['result'] as Map); String kind; var classRef = ClassRef()