Skip to content

Commit 252ccd1

Browse files
committed
Protect execute from errors caused by 2 interleaved calls.
1 parent 9779041 commit 252ccd1

File tree

1 file changed

+28
-13
lines changed
  • pkgs/dartpad_ui/lib/app/execution/view_factory

1 file changed

+28
-13
lines changed

pkgs/dartpad_ui/lib/app/execution/view_factory/frame.dart

Lines changed: 28 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ class ExecutionServiceImpl implements ExecutionService {
2121

2222
web.HTMLIFrameElement _frame;
2323
late String _frameSrc;
24+
Completer<void>? _activeExecuteCompleter;
2425
Completer<void> _readyCompleter = Completer();
2526

2627
ExecutionServiceImpl(this._frame) {
@@ -37,21 +38,35 @@ class ExecutionServiceImpl implements ExecutionService {
3738
required bool isNewDDC,
3839
required bool isFlutter,
3940
}) async {
40-
if (!reload) {
41-
await _reset();
41+
if (_activeExecuteCompleter != null) {
42+
await _activeExecuteCompleter!.future.timeout(
43+
Duration(seconds: 5),
44+
onTimeout: () {
45+
_activeExecuteCompleter?.complete();
46+
},
47+
);
4248
}
49+
_activeExecuteCompleter = Completer();
50+
try {
51+
if (!reload) {
52+
await _reset();
53+
}
4354

44-
return _send(reload ? 'executeReload' : 'execute', {
45-
'js': _decorateJavaScript(
46-
javaScript,
47-
modulesBaseUrl: modulesBaseUrl,
48-
isNewDDC: isNewDDC,
49-
reload: reload,
50-
isFlutter: isFlutter,
51-
),
52-
if (engineVersion != null)
53-
'canvasKitBaseUrl': _canvasKitUrl(engineVersion),
54-
});
55+
await _send(reload ? 'executeReload' : 'execute', {
56+
'js': _decorateJavaScript(
57+
javaScript,
58+
modulesBaseUrl: modulesBaseUrl,
59+
isNewDDC: isNewDDC,
60+
reload: reload,
61+
isFlutter: isFlutter,
62+
),
63+
if (engineVersion != null)
64+
'canvasKitBaseUrl': _canvasKitUrl(engineVersion),
65+
});
66+
} finally {
67+
_activeExecuteCompleter?.complete();
68+
_activeExecuteCompleter = null;
69+
}
5570
}
5671

5772
@override

0 commit comments

Comments
 (0)