Skip to content

Commit 18ac556

Browse files
committed
Don't crash for undefined globals + tests
1 parent 4f97ead commit 18ac556

File tree

3 files changed

+48
-2
lines changed

3 files changed

+48
-2
lines changed

packages/scheduler/src/__tests__/SchedulerSetImmediate-test.js

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -287,3 +287,17 @@ describe('SchedulerDOMSetImmediate', () => {
287287
runtime.assertLog(['setImmediate Callback', 'B']);
288288
});
289289
});
290+
291+
it('does not crash if setImmediate is undefined', () => {
292+
jest.resetModules();
293+
const originalSetImmediate = global.setImmediate;
294+
try {
295+
delete global.setImmediate;
296+
jest.unmock('scheduler');
297+
expect(() => {
298+
require('scheduler');
299+
}).not.toThrow();
300+
} finally {
301+
global.setImmediate = originalSetImmediate;
302+
}
303+
});

packages/scheduler/src/__tests__/SchedulerSetTimeout-test.js

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,3 +95,34 @@ describe('SchedulerNoDOM', () => {
9595
expect(log).toEqual(['B', 'C']);
9696
});
9797
});
98+
99+
// See: https://github.com/facebook/react/pull/13088
100+
describe('does not crash non-node SSR environments', () => {
101+
it('if setTimeout is undefined', () => {
102+
jest.resetModules();
103+
const originalSetTimeout = global.setTimeout;
104+
try {
105+
delete global.setTimeout;
106+
jest.unmock('scheduler');
107+
expect(() => {
108+
require('scheduler');
109+
}).not.toThrow();
110+
} finally {
111+
global.setTimeout = originalSetTimeout;
112+
}
113+
});
114+
115+
it('if clearTimeout is undefined', () => {
116+
jest.resetModules();
117+
const originalClearTimeout = global.clearTimeout;
118+
try {
119+
delete global.clearTimeout;
120+
jest.unmock('scheduler');
121+
expect(() => {
122+
require('scheduler');
123+
}).not.toThrow();
124+
} finally {
125+
global.clearTimeout = originalClearTimeout;
126+
}
127+
});
128+
});

packages/scheduler/src/forks/Scheduler.js

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -85,8 +85,9 @@ var isHostCallbackScheduled = false;
8585
var isHostTimeoutScheduled = false;
8686

8787
// Capture local references to native APIs, in case a polyfill overrides them.
88-
const localSetTimeout = setTimeout;
89-
const localClearTimeout = clearTimeout;
88+
const localSetTimeout = typeof setTimeout === 'function' ? setTimeout : null;
89+
const localClearTimeout =
90+
typeof clearTimeout === 'function' ? clearTimeout : null;
9091
const localSetImmediate =
9192
typeof setImmediate !== 'undefined' ? setImmediate : null; // IE and Node.js + jsdom
9293

0 commit comments

Comments
 (0)