Skip to content
This repository was archived by the owner on Feb 22, 2018. It is now read-only.

Commit a8699da

Browse files
committed
fix(VmTurnZone): onScheduleMicrotask behaves correctly with orphaned
scheduleMicrotasks. BREAKING CHANGE: Zone.defaultOnScheduleMicrotask is now named Zone.onScheduleMircotask
1 parent c9776b4 commit a8699da

File tree

2 files changed

+43
-11
lines changed

2 files changed

+43
-11
lines changed

lib/core/zone.dart

+9-7
Original file line numberDiff line numberDiff line change
@@ -60,8 +60,6 @@ class VmTurnZone {
6060
/// an "inner" [Zone], which is a child of the outer [Zone].
6161
async.Zone _innerZone;
6262

63-
ZoneScheduleMicrotask defaultOnScheduleMicrotask;
64-
6563
/**
6664
* Associates with this
6765
*
@@ -82,6 +80,7 @@ class VmTurnZone {
8280
onError = _defaultOnError;
8381
onTurnDone = _defaultOnTurnDone;
8482
onTurnStart = _defaultOnTurnStart;
83+
onScheduleMicrotask = _defaultOnScheduleMicrotask;
8584
}
8685

8786
List _asyncQueue = [];
@@ -115,11 +114,7 @@ class VmTurnZone {
115114

116115
_onScheduleMicrotask(async.Zone self, async.ZoneDelegate delegate,
117116
async.Zone zone, fn()) {
118-
if (defaultOnScheduleMicrotask != null) {
119-
return defaultOnScheduleMicrotask(fn);
120-
}
121-
122-
_asyncQueue.add(() => delegate.run(zone, fn));
117+
onScheduleMicrotask(() => delegate.run(zone, fn));
123118
if (_runningInTurn == 0 && !_inFinishTurn) _finishTurn(zone, delegate);
124119
}
125120

@@ -197,6 +192,13 @@ class VmTurnZone {
197192
ZoneOnTurnDone onTurnDone;
198193
void _defaultOnTurnDone() => null;
199194

195+
/**
196+
* Called any time a microtask is scheduled. If you override [onScheduleMicrotask], you
197+
* are expected to call the function at some point.
198+
*/
199+
ZoneScheduleMicrotask onScheduleMicrotask;
200+
void _defaultOnScheduleMicrotask(fn) => _asyncQueue.add(fn);
201+
200202
LongStackTrace _longStacktrace = null;
201203

202204
LongStackTrace _getLongStacktrace(name) {

test/core/zone_spec.dart

+34-4
Original file line numberDiff line numberDiff line change
@@ -452,7 +452,7 @@ void main() {
452452
});
453453
log('onTurnDone(end)');
454454
};
455-
zone.defaultOnScheduleMicrotask = (microTaskFn) {
455+
zone.onScheduleMicrotask = (microTaskFn) {
456456
log('onScheduleMicrotask(begin)');
457457
microtaskResult = microTaskFn();
458458
log('onScheduleMicrotask(end)');
@@ -478,7 +478,7 @@ void main() {
478478
});
479479
log('onTurnDone(end)');
480480
};
481-
zone.defaultOnScheduleMicrotask = (microTaskFn) {
481+
zone.onScheduleMicrotask = (microTaskFn) {
482482
log('onScheduleMicrotask(begin)');
483483
microTaskFn();
484484
log('onScheduleMicrotask(end)');
@@ -500,7 +500,7 @@ void main() {
500500
zone.onTurnDone = () {
501501
log('onTurnDone');
502502
};
503-
zone.defaultOnScheduleMicrotask = (microTaskFn) {
503+
zone.onScheduleMicrotask = (microTaskFn) {
504504
log('onScheduleMicrotask(begin)');
505505
microTaskFn();
506506
log('onScheduleMicrotask(end)');
@@ -528,7 +528,7 @@ void main() {
528528
zone.onTurnDone = () {
529529
log('onTurnDone');
530530
};
531-
zone.defaultOnScheduleMicrotask = (microTaskFn) {
531+
zone.onScheduleMicrotask = (microTaskFn) {
532532
log('onScheduleMicrotask(begin)');
533533
microTaskFn();
534534
log('onScheduleMicrotask(end)');
@@ -541,6 +541,36 @@ void main() {
541541
' onScheduleMicrotask(end); run; onTurnDone');
542542
}));
543543

544+
iit('should execute microtask scheduled outside the turn', (Logger log) {
545+
zone = new VmTurnZone();
546+
547+
var taskToRun = null;
548+
549+
zone.onTurnDone = () {
550+
if (taskToRun != null) taskToRun();
551+
taskToRun = null;
552+
log('onTurnDone');
553+
};
554+
555+
zone.onScheduleMicrotask = (microTaskFn) {
556+
log('onScheduleMicrotask');
557+
taskToRun = microTaskFn;
558+
};
559+
560+
var completer;
561+
zone.run(() {
562+
completer = new Completer();
563+
completer.future.then((x) => log('future'));
564+
log('first');
565+
});
566+
completer.complete();
567+
568+
expect(log).toEqual([
569+
'first', 'onTurnDone',
570+
'onScheduleMicrotask', 'future', 'onTurnDone'
571+
]);
572+
});
573+
544574
});
545575
});
546576
}

0 commit comments

Comments
 (0)