Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 2d68bd0

Browse files
authored
Fix message loop behavior when host callback is cancelled (facebook#16407)
* Add a regression test for cancelCallback with message loop * If there's nothing scheduled, we're not running * Add more tests from facebook#16271
1 parent 96eb703 commit 2d68bd0

File tree

2 files changed

+74
-1
lines changed

2 files changed

+74
-1
lines changed

packages/scheduler/src/__tests__/SchedulerBrowser-test.internal.js

Lines changed: 72 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
let Scheduler;
1616
let runtime;
1717
let performance;
18+
let cancelCallback;
1819
let scheduleCallback;
1920
let NormalPriority;
2021

@@ -52,6 +53,7 @@ describe('SchedulerBrowser', () => {
5253
performance = window.performance;
5354
require('scheduler/src/SchedulerFeatureFlags').enableMessageLoopImplementation = enableMessageLoopImplementation;
5455
Scheduler = require('scheduler');
56+
cancelCallback = Scheduler.unstable_cancelCallback;
5557
scheduleCallback = Scheduler.unstable_scheduleCallback;
5658
NormalPriority = Scheduler.unstable_NormalPriority;
5759
});
@@ -360,6 +362,15 @@ describe('SchedulerBrowser', () => {
360362
const enableMessageLoopImplementation = true;
361363
beforeAndAfterHooks(enableMessageLoopImplementation);
362364

365+
it('task that finishes before deadline', () => {
366+
scheduleCallback(NormalPriority, () => {
367+
runtime.log('Task');
368+
});
369+
runtime.assertLog(['Post Message']);
370+
runtime.fireMessageEvent();
371+
runtime.assertLog(['Message Event', 'Task']);
372+
});
373+
363374
it('task with continutation', () => {
364375
scheduleCallback(NormalPriority, () => {
365376
runtime.log('Task');
@@ -385,7 +396,48 @@ describe('SchedulerBrowser', () => {
385396
runtime.assertLog(['Message Event', 'Continuation']);
386397
});
387398

388-
it('task that throws', () => {
399+
it('multiple tasks', () => {
400+
scheduleCallback(NormalPriority, () => {
401+
runtime.log('A');
402+
});
403+
scheduleCallback(NormalPriority, () => {
404+
runtime.log('B');
405+
});
406+
runtime.assertLog(['Post Message']);
407+
runtime.fireMessageEvent();
408+
runtime.assertLog(['Message Event', 'A', 'B']);
409+
});
410+
411+
it('multiple tasks with a yield in between', () => {
412+
scheduleCallback(NormalPriority, () => {
413+
runtime.log('A');
414+
runtime.advanceTime(4999);
415+
});
416+
scheduleCallback(NormalPriority, () => {
417+
runtime.log('B');
418+
});
419+
runtime.assertLog(['Post Message']);
420+
runtime.fireMessageEvent();
421+
runtime.assertLog([
422+
'Message Event',
423+
'A',
424+
// Ran out of time. Post a continuation event.
425+
'Post Message',
426+
]);
427+
runtime.fireMessageEvent();
428+
runtime.assertLog(['Message Event', 'B']);
429+
});
430+
431+
it('cancels tasks', () => {
432+
const task = scheduleCallback(NormalPriority, () => {
433+
runtime.log('Task');
434+
});
435+
runtime.assertLog(['Post Message']);
436+
cancelCallback(task);
437+
runtime.assertLog([]);
438+
});
439+
440+
it('throws when a task errors then continues in a new event', () => {
389441
scheduleCallback(NormalPriority, () => {
390442
runtime.log('Oops!');
391443
throw Error('Oops!');
@@ -418,5 +470,24 @@ describe('SchedulerBrowser', () => {
418470
runtime.fireMessageEvent();
419471
runtime.assertLog(['Message Event', 'B']);
420472
});
473+
474+
it('schedule new task after a cancellation', () => {
475+
let handle = scheduleCallback(NormalPriority, () => {
476+
runtime.log('A');
477+
});
478+
479+
runtime.assertLog(['Post Message']);
480+
cancelCallback(handle);
481+
482+
runtime.fireMessageEvent();
483+
runtime.assertLog(['Message Event']);
484+
485+
scheduleCallback(NormalPriority, () => {
486+
runtime.log('B');
487+
});
488+
runtime.assertLog(['Post Message']);
489+
runtime.fireMessageEvent();
490+
runtime.assertLog(['Message Event', 'B']);
491+
});
421492
});
422493
});

packages/scheduler/src/forks/SchedulerHostConfig.default.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -235,6 +235,8 @@ if (
235235
port.postMessage(null);
236236
throw error;
237237
}
238+
} else {
239+
isMessageLoopRunning = false;
238240
}
239241
// Yielding to the browser will give it a chance to paint, so we can
240242
// reset this.

0 commit comments

Comments
 (0)