@@ -171,8 +171,13 @@ class BenchmarkServer {
171171 json.decode (await request.readAsString ());
172172 server.close ();
173173 // Keep the stack trace as a string. It's thrown in the browser, not this Dart VM.
174- profileData.completeError (
175- '${errorDetails ['error' ]}\n ${errorDetails ['stackTrace' ]}' );
174+ final String errorMessage =
175+ 'Caught browser-side error: ${errorDetails ['error' ]}\n ${errorDetails ['stackTrace' ]}' ;
176+ if (! profileData.isCompleted) {
177+ profileData.completeError (errorMessage);
178+ } else {
179+ io.stderr.writeln (errorMessage);
180+ }
176181 return Response .ok ('' );
177182 } else if (request.requestedUri.path.endsWith ('/next-benchmark' )) {
178183 if (benchmarks == null ) {
@@ -196,11 +201,18 @@ class BenchmarkServer {
196201 print ('[Gallery] $message ' );
197202 return Response .ok ('Reported.' );
198203 } else {
204+ io.stderr
205+ .writeln ('Unrecognized URL path: ${request .requestedUri .path }' );
199206 return Response .notFound (
200207 'This request is not handled by the profile-data handler.' );
201208 }
202209 } catch (error, stackTrace) {
203- profileData.completeError (error, stackTrace);
210+ if (! profileData.isCompleted) {
211+ profileData.completeError (error, stackTrace);
212+ } else {
213+ io.stderr.writeln ('Caught error: $error ' );
214+ io.stderr.writeln ('$stackTrace ' );
215+ }
204216 return Response .internalServerError (body: '$error ' );
205217 }
206218 }).add (createStaticHandler (
@@ -230,7 +242,11 @@ class BenchmarkServer {
230242 whenChromeIsReady = Chrome .launch (
231243 options,
232244 onError: (String error) {
233- profileData.completeError (Exception (error));
245+ if (! profileData.isCompleted) {
246+ profileData.completeError (Exception (error));
247+ } else {
248+ io.stderr.writeln ('Chrome error: $error ' );
249+ }
234250 },
235251 workingDirectory: benchmarkAppDirectory.path,
236252 );
@@ -272,8 +288,18 @@ class BenchmarkServer {
272288 }
273289 return BenchmarkResults (results);
274290 } finally {
291+ if (headless) {
292+ chrome? .stop ();
293+ } else {
294+ // In non-headless mode wait for the developer to close Chrome
295+ // manually. Otherwise, they won't get a chance to debug anything.
296+ print (
297+ 'Benchmark finished. Chrome running in windowed mode. Close '
298+ 'Chrome manually to continue.' ,
299+ );
300+ await chrome? .whenExits;
301+ }
275302 server? .close ();
276- chrome? .stop ();
277303 }
278304 }
279305}
0 commit comments