Skip to content

Commit a8789f3

Browse files
authored
During hot-restart, wait to run main when pause_isolates_on_start is true (#2378)
1 parent 0a2d0bb commit a8789f3

File tree

10 files changed

+1438
-1091
lines changed

10 files changed

+1438
-1091
lines changed

dwds/CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
- Rename `dart_library.js` to `ddc_module_loader.js` to match SDK naming changes. - [#2360](https://github.com/dart-lang/webdev/pull/2360)
44
- Implement `setFlag` when it is called with `pause_isolates_on_start`. - [#2373](https://github.com/dart-lang/webdev/pull/2373)
55
- Do not persist breakpoints across hot restarts or page reloads. - [#2371](https://github.com/dart-lang/webdev/pull/2371)
6+
- If `pause_isolates_on_start` is `true`, wait for `resume` to run the app's `main` method. - [#2378](https://github.com/dart-lang/webdev/pull/2378)
67

78
## 23.3.0
89

dwds/lib/src/dwds_vm_client.dart

Lines changed: 31 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import 'package:dwds/src/events.dart';
99
import 'package:dwds/src/services/chrome_debug_exception.dart';
1010
import 'package:dwds/src/services/chrome_proxy_service.dart';
1111
import 'package:dwds/src/services/debug_service.dart';
12+
import 'package:dwds/src/utilities/shared.dart';
1213
import 'package:dwds/src/utilities/synchronized.dart';
1314
import 'package:logging/logging.dart';
1415
import 'package:uuid/uuid.dart';
@@ -252,11 +253,19 @@ Future<Map<String, dynamic>> _hotRestart(
252253
// restart. Only return success after the isolate has fully started.
253254
final stream = chromeProxyService.onEvent('Isolate');
254255
try {
256+
// If we should pause isolates on start, then only run main once we get a
257+
// resume event.
258+
final pauseIsolatesOnStart = chromeProxyService.pauseIsolatesOnStart;
259+
if (pauseIsolatesOnStart) {
260+
_waitForResumeEventToRunMain(chromeProxyService);
261+
}
255262
// Generate run id to hot restart all apps loaded into the tab.
256263
final runId = const Uuid().v4().toString();
257264
_logger.info('Issuing \$dartHotRestartDwds request');
258-
await chromeProxyService.inspector
259-
.jsEvaluate('\$dartHotRestartDwds(\'$runId\');', awaitPromise: true);
265+
await chromeProxyService.inspector.jsEvaluate(
266+
'\$dartHotRestartDwds(\'$runId\', $pauseIsolatesOnStart);',
267+
awaitPromise: true,
268+
);
260269
_logger.info('\$dartHotRestartDwds request complete.');
261270
} on WipError catch (exception) {
262271
final code = exception.error?['code'];
@@ -289,6 +298,26 @@ Future<Map<String, dynamic>> _hotRestart(
289298
return {'result': Success().toJson()};
290299
}
291300

301+
void _waitForResumeEventToRunMain(
302+
ChromeProxyService chromeProxyService,
303+
) {
304+
final issuedReadyToRunMainCompleter = Completer<void>();
305+
306+
final resumeEventsSubscription =
307+
chromeProxyService.resumeAfterHotRestartEventsStream.listen((_) async {
308+
await chromeProxyService.inspector.jsEvaluate('\$dartReadyToRunMain();');
309+
if (!issuedReadyToRunMainCompleter.isCompleted) {
310+
issuedReadyToRunMainCompleter.complete();
311+
}
312+
});
313+
314+
safeUnawaited(
315+
issuedReadyToRunMainCompleter.future.then((_) {
316+
resumeEventsSubscription.cancel();
317+
}),
318+
);
319+
}
320+
292321
Future<Map<String, dynamic>> _fullReload(
293322
ChromeProxyService chromeProxyService,
294323
) async {

0 commit comments

Comments
 (0)