From 1bb3cf150edea145e1eadee45ca89b916275048e Mon Sep 17 00:00:00 2001 From: Gary Roumanis Date: Mon, 15 Jul 2019 11:23:26 -0700 Subject: [PATCH] Breakpoint with script uri --- dwds/lib/src/debugging/debugger.dart | 6 +++--- dwds/lib/src/debugging/inspector.dart | 8 +++++++- dwds/lib/src/services/chrome_proxy_service.dart | 7 +++++-- dwds/test/chrome_proxy_service_test.dart | 16 ++++++++++------ dwds/test/fakes.dart | 2 +- 5 files changed, 26 insertions(+), 13 deletions(-) diff --git a/dwds/lib/src/debugging/debugger.dart b/dwds/lib/src/debugging/debugger.dart index ae879f020..6c5ee2aad 100644 --- a/dwds/lib/src/debugging/debugger.dart +++ b/dwds/lib/src/debugging/debugger.dart @@ -280,7 +280,7 @@ class Debugger extends Domain { // Chrome is 0 based. Account for this. var jsLocation = JsLocation.fromZeroBased(location['scriptId'] as String, location['lineNumber'] as int, location['columnNumber'] as int); - var dartFrame = _frameFor(jsLocation); + var dartFrame = await _frameFor(jsLocation); if (dartFrame != null) { dartFrame.code.name = functionName.isEmpty ? '' : functionName; dartFrame.index = index++; @@ -331,7 +331,7 @@ class Debugger extends Domain { } /// Returns a Dart [Frame] for a [JsLocation]. - Frame _frameFor(JsLocation jsLocation) { + Future _frameFor(JsLocation jsLocation) async { // TODO(sdk/issues/37240) - ideally we look for an exact location instead // of the closest location on a given line. Location bestLocation; @@ -346,7 +346,7 @@ class Debugger extends Domain { } if (bestLocation == null) return null; var script = - inspector?.scriptRefFor(bestLocation.dartLocation.uri.serverPath); + await inspector?.scriptRefFor(bestLocation.dartLocation.uri.serverPath); return Frame() ..code = (CodeRef()..kind = CodeKind.kDart) ..location = (SourceLocation() diff --git a/dwds/lib/src/debugging/inspector.dart b/dwds/lib/src/debugging/inspector.dart index 24e626431..fb53579ec 100644 --- a/dwds/lib/src/debugging/inspector.dart +++ b/dwds/lib/src/debugging/inspector.dart @@ -367,7 +367,13 @@ function($argsString) { } /// Returns the [ScriptRef] for the provided Dart server path [uri]. - ScriptRef scriptRefFor(String uri) => _serverPathToScriptRef[uri]; + Future scriptRefFor(String uri) async { + if (_serverPathToScriptRef.isEmpty) { + // TODO(grouma) - populate the server path cache a better way. + await getScripts(isolate.id); + } + return _serverPathToScriptRef[uri]; + } Future getScripts(String isolateId) async { var scripts = await scriptRefs(isolateId); diff --git a/dwds/lib/src/services/chrome_proxy_service.dart b/dwds/lib/src/services/chrome_proxy_service.dart index e7de89c41..269fe260c 100644 --- a/dwds/lib/src/services/chrome_proxy_service.dart +++ b/dwds/lib/src/services/chrome_proxy_service.dart @@ -6,6 +6,7 @@ import 'dart:async'; import 'dart:convert'; import 'dart:io'; +import 'package:dwds/src/utilities/dart_uri.dart'; import 'package:pedantic/pedantic.dart'; import 'package:pub_semver/pub_semver.dart' as semver; import 'package:vm_service_lib/vm_service_lib.dart'; @@ -187,8 +188,10 @@ class ChromeProxyService implements VmServiceInterface { @override Future addBreakpointWithScriptUri( String isolateId, String scriptUri, int line, - {int column}) { - throw UnimplementedError(); + {int column}) async { + var dartUri = DartUri(scriptUri, uri); + var ref = await _inspector.scriptRefFor(dartUri.serverPath); + return _debugger.addBreakpoint(isolateId, ref.id, line, column: column); } @override diff --git a/dwds/test/chrome_proxy_service_test.dart b/dwds/test/chrome_proxy_service_test.dart index e55ecddb1..75fe0ca68 100644 --- a/dwds/test/chrome_proxy_service_test.dart +++ b/dwds/test/chrome_proxy_service_test.dart @@ -49,7 +49,7 @@ void main() { var bp = await service.addBreakpoint(isolate.id, mainScript.id, 23); // Remove breakpoint so it doesn't impact other tests. await service.removeBreakpoint(isolate.id, bp.id); - expect(bp.id, '1'); + expect(bp.id, isNotNull); }); test('addBreakpoint on a part file', () async { @@ -58,16 +58,20 @@ void main() { var bp = await service.addBreakpoint(isolate.id, partScript.id, 10); // Remove breakpoint so it doesn't impact other tests. await service.removeBreakpoint(isolate.id, bp.id); - expect(bp.id, '2'); + expect(bp.id, isNotNull); }); test('addBreakpointAtEntry', () { expect(() => service.addBreakpointAtEntry(null, null), throwsUnimplementedError); }); - test('addBreakpointWithScriptUri', () { - expect(() => service.addBreakpointWithScriptUri(null, null, null), - throwsUnimplementedError); + + test('addBreakpointWithScriptUri', () async { + var bp = await service.addBreakpointWithScriptUri( + isolate.id, mainScript.uri, 23); + // Remove breakpoint so it doesn't impact other tests. + await service.removeBreakpoint(isolate.id, bp.id); + expect(bp.id, isNotNull); }); test('removeBreakpoint null arguments', () { @@ -95,7 +99,7 @@ void main() { .lastWhere((each) => each.uri.contains('main.dart')); var bp = await service.addBreakpoint(isolate.id, refreshedMain.id, 23); expect(isolate.breakpoints, [bp]); - expect(bp.id, '4'); + expect(bp.id, isNotNull); await service.removeBreakpoint(isolate.id, bp.id); expect(isolate.breakpoints, isEmpty); }); diff --git a/dwds/test/fakes.dart b/dwds/test/fakes.dart index abe3e0c7c..5fa63fba7 100644 --- a/dwds/test/fakes.dart +++ b/dwds/test/fakes.dart @@ -58,7 +58,7 @@ class FakeInspector extends Domain implements AppInspector { @override Future instanceRefFor(RemoteObject remoteObject) => null; @override - ScriptRef scriptRefFor(String uri) => null; + Future scriptRefFor(String uri) => null; @override Future> scriptRefs(String isolateId) => null; @override