| Index: sdk/lib/_internal/js_runtime/lib/isolate_helper.dart
|
| diff --git a/sdk/lib/_internal/js_runtime/lib/isolate_helper.dart b/sdk/lib/_internal/js_runtime/lib/isolate_helper.dart
|
| index ebe79513d986733fccebc8d742528296905f7210..463858ab2faefed015975c8c52e1110d1f7668ba 100644
|
| --- a/sdk/lib/_internal/js_runtime/lib/isolate_helper.dart
|
| +++ b/sdk/lib/_internal/js_runtime/lib/isolate_helper.dart
|
| @@ -1365,6 +1365,7 @@ class TimerImpl implements Timer {
|
| final bool _once;
|
| bool _inEventLoop = false;
|
| int _handle;
|
| + int _tick = 0;
|
|
|
| TimerImpl(int milliseconds, void callback()) : _once = true {
|
| if (milliseconds == 0 && (!hasTimer() || _globalState.isWorker)) {
|
| @@ -1390,6 +1391,7 @@ class TimerImpl implements Timer {
|
| void internalCallback() {
|
| _handle = null;
|
| leaveJsAsync();
|
| + this._tick = 1;
|
| callback();
|
| }
|
|
|
| @@ -1407,10 +1409,19 @@ class TimerImpl implements Timer {
|
| : _once = false {
|
| if (hasTimer()) {
|
| enterJsAsync();
|
| + int start = JS('int', 'Date.now()');
|
| _handle = JS(
|
| 'int',
|
| 'self.setInterval(#, #)',
|
| convertDartClosureToJS(() {
|
| + int tick = this._tick + 1;
|
| + if (milliseconds > 0) {
|
| + int duration = JS('int', 'Date.now()') - start;
|
| + if (duration > (tick + 1) * milliseconds) {
|
| + tick = duration ~/ milliseconds;
|
| + }
|
| + }
|
| + this._tick = tick;
|
| callback(this);
|
| }, 0),
|
| milliseconds);
|
| @@ -1419,6 +1430,8 @@ class TimerImpl implements Timer {
|
| }
|
| }
|
|
|
| + int get tick => _tick;
|
| +
|
| void cancel() {
|
| if (hasTimer()) {
|
| if (_inEventLoop) {
|
|
|