Skip to content

Commit 454c221

Browse files
authoredNov 2, 2020
Refactor SchedulerHostConfigs (#20025)
* Remove SchedulerHostConfigs * Fix builds * Fix forks * Move SchedulerNoDom check to npm/index.js * Fix tests * Add @GATE source * Gate build-only test to build test runs
1 parent 56e9fee commit 454c221

28 files changed

+1365
-548
lines changed
 

‎packages/react-dom/src/__tests__/ReactTestUtilsActUnmockedScheduler-test.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,9 @@ function unmount(dom) {
3333

3434
beforeEach(() => {
3535
jest.resetModules();
36-
jest.unmock('scheduler');
36+
jest.mock('scheduler', () =>
37+
require.requireActual('scheduler/unstable_no_dom'),
38+
);
3739
yields = [];
3840
React = require('react');
3941
ReactDOM = require('react-dom');

‎packages/react-dom/src/__tests__/ReactUnmockedSchedulerWarning-test.internal.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ function App() {
1717

1818
beforeEach(() => {
1919
jest.resetModules();
20-
jest.unmock('scheduler');
20+
jest.mock('scheduler', () => require('scheduler/unstable_no_dom'));
2121
React = require('react');
2222
ReactDOM = require('react-dom');
2323
ReactFeatureFlags = require('shared/ReactFeatureFlags');

‎packages/react-dom/src/__tests__/ReactUnmockedSchedulerWarning-test.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,9 @@ function App() {
1616

1717
beforeEach(() => {
1818
jest.resetModules();
19-
jest.unmock('scheduler');
19+
jest.mock('scheduler', () =>
20+
require.requireActual('scheduler/unstable_no_dom'),
21+
);
2022
React = require('react');
2123
ReactDOM = require('react-dom');
2224
});

‎packages/scheduler/index.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,4 +7,4 @@
77

88
'use strict';
99

10-
export * from './src/Scheduler';
10+
export * from './src/forks/SchedulerDOM';

‎packages/scheduler/npm/index.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
'use strict';
22

3-
if (process.env.NODE_ENV === 'production') {
3+
if (typeof window === 'undefined' || typeof MessageChannel !== 'function') {
4+
module.exports = require('./unstable_no_dom');
5+
} else if (process.env.NODE_ENV === 'production') {
46
module.exports = require('./cjs/scheduler.production.min.js');
57
} else {
68
module.exports = require('./cjs/scheduler.development.js');
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
'use strict';
2+
3+
if (process.env.NODE_ENV === 'production') {
4+
module.exports = require('./cjs/scheduler-unstable_no_dom.production.min.js');
5+
} else {
6+
module.exports = require('./cjs/scheduler-unstable_no_dom.development.js');
7+
}

‎packages/scheduler/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
"tracing.js",
2929
"tracing-profiling.js",
3030
"unstable_mock.js",
31+
"unstable_no_dom.js",
3132
"unstable_post_task.js",
3233
"cjs/",
3334
"umd/"

‎packages/scheduler/src/__tests__/SchedulerBrowser-test.js renamed to ‎packages/scheduler/src/__tests__/SchedulerDOM-test.js

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -35,11 +35,6 @@ describe('SchedulerBrowser', () => {
3535

3636
// Un-mock scheduler
3737
jest.mock('scheduler', () => require.requireActual('scheduler'));
38-
jest.mock('scheduler/src/SchedulerHostConfig', () =>
39-
require.requireActual(
40-
'scheduler/src/forks/SchedulerHostConfig.default.js',
41-
),
42-
);
4338

4439
runtime = installMockBrowserRuntime();
4540
performance = global.performance;

‎packages/scheduler/src/__tests__/SchedulerNoDOM-test.js

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -24,11 +24,8 @@ describe('SchedulerNoDOM', () => {
2424
jest.useFakeTimers();
2525

2626
// Un-mock scheduler
27-
jest.mock('scheduler', () => require.requireActual('scheduler'));
28-
jest.mock('scheduler/src/SchedulerHostConfig', () =>
29-
require.requireActual(
30-
'scheduler/src/forks/SchedulerHostConfig.default.js',
31-
),
27+
jest.mock('scheduler', () =>
28+
require.requireActual('scheduler/unstable_no_dom'),
3229
);
3330

3431
Scheduler = require('scheduler');

‎packages/scheduler/src/__tests__/SchedulerUMDBundle-test.internal.js

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,13 @@
88
*/
99
'use strict';
1010

11+
class MockMessageChannel {
12+
constructor() {
13+
this.port1 = jest.fn();
14+
this.port2 = jest.fn();
15+
}
16+
}
17+
1118
describe('Scheduling UMD bundle', () => {
1219
beforeEach(() => {
1320
// Fool SECRET_INTERNALS object into including UMD forwarding methods.
@@ -16,11 +23,18 @@ describe('Scheduling UMD bundle', () => {
1623
jest.resetModules();
1724

1825
jest.mock('scheduler', () => require.requireActual('scheduler'));
19-
jest.mock('scheduler/src/SchedulerHostConfig', () =>
20-
require.requireActual(
21-
'scheduler/src/forks/SchedulerHostConfig.default.js',
22-
),
23-
);
26+
27+
// Mock a browser environment since we're testing UMD modules.
28+
global.window = {
29+
requestAnimationFrame: jest.fn(),
30+
cancelAnimationFrame: jest.fn(),
31+
};
32+
global.MessageChannel = MockMessageChannel;
33+
});
34+
35+
afterEach(() => {
36+
global.window = undefined;
37+
global.MessageChannel = undefined;
2438
});
2539

2640
function filterPrivateKeys(name) {

‎packages/scheduler/src/forks/SchedulerDOM.js

Lines changed: 598 additions & 0 deletions
Large diffs are not rendered by default.

‎packages/scheduler/src/forks/SchedulerFeatureFlags.www.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,6 @@ export const {
1010
enableIsInputPending,
1111
enableSchedulerDebugging,
1212
enableProfiling: enableProfilingFeatureFlag,
13-
} = require('SchedulerFeatureFlags');
13+
} = require('packages/scheduler/src/SchedulerFeatureFlags');
1414

1515
export const enableProfiling = __PROFILE__ && enableProfilingFeatureFlag;

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

Lines changed: 0 additions & 246 deletions
This file was deleted.

‎packages/scheduler/src/forks/SchedulerHostConfig.mock.js

Lines changed: 0 additions & 225 deletions
This file was deleted.

‎packages/scheduler/src/forks/SchedulerMock.js

Lines changed: 636 additions & 0 deletions
Large diffs are not rendered by default.

‎packages/scheduler/src/Scheduler.js renamed to ‎packages/scheduler/src/forks/SchedulerNoDOM.js

Lines changed: 61 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -11,17 +11,8 @@
1111
import {
1212
enableSchedulerDebugging,
1313
enableProfiling,
14-
} from './SchedulerFeatureFlags';
15-
import {
16-
requestHostCallback,
17-
requestHostTimeout,
18-
cancelHostTimeout,
19-
shouldYieldToHost,
20-
getCurrentTime,
21-
forceFrameRate,
22-
requestPaint,
23-
} from './SchedulerHostConfig';
24-
import {push, pop, peek} from './SchedulerMinHeap';
14+
} from '../SchedulerFeatureFlags';
15+
import {push, pop, peek} from '../SchedulerMinHeap';
2516

2617
// TODO: Use symbols?
2718
import {
@@ -30,7 +21,7 @@ import {
3021
NormalPriority,
3122
LowPriority,
3223
IdlePriority,
33-
} from './SchedulerPriorities';
24+
} from '../SchedulerPriorities';
3425
import {
3526
sharedProfilingBuffer,
3627
markTaskRun,
@@ -43,7 +34,7 @@ import {
4334
markTaskStart,
4435
stopLoggingProfilingEvents,
4536
startLoggingProfilingEvents,
46-
} from './SchedulerProfiling';
37+
} from '../SchedulerProfiling';
4738

4839
// Max 31 bit integer. The max integer size in V8 for 32-bit systems.
4940
// Math.pow(2, 30) - 1
@@ -78,6 +69,19 @@ var isPerformingWork = false;
7869
var isHostCallbackScheduled = false;
7970
var isHostTimeoutScheduled = false;
8071

72+
let getCurrentTime;
73+
const hasPerformanceNow =
74+
typeof performance === 'object' && typeof performance.now === 'function';
75+
76+
if (hasPerformanceNow) {
77+
const localPerformance = performance;
78+
getCurrentTime = () => localPerformance.now();
79+
} else {
80+
const localDate = Date;
81+
const initialTime = localDate.now();
82+
getCurrentTime = () => localDate.now() - initialTime;
83+
}
84+
8185
function advanceTimers(currentTime) {
8286
// Check for tasks that are no longer delayed and add them to the queue.
8387
let timer = peek(timerQueue);
@@ -393,7 +397,49 @@ function unstable_getCurrentPriorityLevel() {
393397
return currentPriorityLevel;
394398
}
395399

396-
const unstable_requestPaint = requestPaint;
400+
// If this accidentally gets imported in a non-browser environment, e.g. JavaScriptCore,
401+
// fallback to a naive implementation.
402+
let _callback = null;
403+
let _timeoutID = null;
404+
const _flushCallback = function() {
405+
if (_callback !== null) {
406+
try {
407+
const currentTime = getCurrentTime();
408+
const hasRemainingTime = true;
409+
_callback(hasRemainingTime, currentTime);
410+
_callback = null;
411+
} catch (e) {
412+
setTimeout(_flushCallback, 0);
413+
throw e;
414+
}
415+
}
416+
};
417+
418+
function requestHostCallback(cb) {
419+
if (_callback !== null) {
420+
// Protect against re-entrancy.
421+
setTimeout(requestHostCallback, 0, cb);
422+
} else {
423+
_callback = cb;
424+
setTimeout(_flushCallback, 0);
425+
}
426+
}
427+
428+
function requestHostTimeout(cb, ms) {
429+
_timeoutID = setTimeout(cb, ms);
430+
}
431+
432+
function cancelHostTimeout() {
433+
clearTimeout(_timeoutID);
434+
}
435+
436+
function shouldYieldToHost() {
437+
return false;
438+
}
439+
440+
function forceFrameRate() {}
441+
442+
function requestPaint() {}
397443

398444
export {
399445
ImmediatePriority as unstable_ImmediatePriority,
@@ -408,7 +454,7 @@ export {
408454
unstable_wrapCallback,
409455
unstable_getCurrentPriorityLevel,
410456
shouldYieldToHost as unstable_shouldYield,
411-
unstable_requestPaint,
457+
requestPaint as unstable_requestPaint,
412458
unstable_continueExecution,
413459
unstable_pauseExecution,
414460
unstable_getFirstCallbackNode,

‎packages/scheduler/src/SchedulerPostTask.js renamed to ‎packages/scheduler/src/forks/SchedulerPostTask.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
* @flow
88
*/
99

10-
import type {PriorityLevel} from './SchedulerPriorities';
10+
import type {PriorityLevel} from '../SchedulerPriorities';
1111

1212
declare class TaskController {
1313
constructor(priority?: string): TaskController;
@@ -27,7 +27,7 @@ import {
2727
NormalPriority,
2828
LowPriority,
2929
IdlePriority,
30-
} from './SchedulerPriorities';
30+
} from '../SchedulerPriorities';
3131

3232
export {
3333
ImmediatePriority as unstable_ImmediatePriority,

‎packages/scheduler/unstable_mock.js

Lines changed: 1 addition & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,4 @@
77

88
'use strict';
99

10-
export * from './src/Scheduler';
11-
12-
export {
13-
unstable_flushAllWithoutAsserting,
14-
unstable_flushNumberOfYields,
15-
unstable_flushExpired,
16-
unstable_clearYields,
17-
unstable_flushUntilNextPaint,
18-
unstable_flushAll,
19-
unstable_yieldValue,
20-
unstable_advanceTime,
21-
} from './src/SchedulerHostConfig.js';
10+
export * from './src/forks/SchedulerMock';

‎packages/scheduler/src/SchedulerHostConfig.js renamed to ‎packages/scheduler/unstable_no_dom.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@
33
*
44
* This source code is licensed under the MIT license found in the
55
* LICENSE file in the root directory of this source tree.
6-
*
7-
* @flow
86
*/
97

10-
throw new Error('This module must be shimmed by a specific build.');
8+
'use strict';
9+
10+
export * from './src/forks/SchedulerNoDOM';

‎packages/scheduler/unstable_post_task.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,4 +7,4 @@
77

88
'use strict';
99

10-
export * from './src/SchedulerPostTask';
10+
export * from './src/forks/SchedulerPostTask';

‎packages/shared/__tests__/ReactDOMFrameScheduling-test.js

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,6 @@ describe('ReactDOMFrameScheduling', () => {
1515

1616
// Un-mock scheduler
1717
jest.mock('scheduler', () => require.requireActual('scheduler'));
18-
jest.mock('scheduler/src/SchedulerHostConfig', () =>
19-
require.requireActual(
20-
'scheduler/src/forks/SchedulerHostConfig.default.js',
21-
),
22-
);
2318
});
2419

2520
it('warns when requestAnimationFrame is not polyfilled in the browser', () => {
@@ -47,6 +42,7 @@ describe('ReactDOMFrameScheduling', () => {
4742

4843
// We're just testing importing, not using it.
4944
// It is important because even isomorphic components may import it.
45+
// @gate !source
5046
it('can import findDOMNode in Node environment', () => {
5147
const previousRAF = global.requestAnimationFrame;
5248
const previousRIC = global.requestIdleCallback;

‎scripts/jest/TestFlags.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ function getTestFlags() {
7474
channel: releaseChannel,
7575
modern: releaseChannel === 'modern',
7676
classic: releaseChannel === 'classic',
77+
source: !process.env.IS_BUILD,
7778
www,
7879

7980
...featureFlags,

‎scripts/jest/config.build.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ const {readdirSync, statSync} = require('fs');
44
const {join} = require('path');
55
const baseConfig = require('./config.base');
66

7+
process.env.IS_BUILD = true;
8+
79
// Find all folders in packages/* with package.json
810
const packagesRoot = join(__dirname, '..', '..', 'packages');
911
const packages = readdirSync(packagesRoot).filter(dir => {

‎scripts/jest/setupHostConfigs.js

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,3 @@ jest.mock('shared/ReactSharedInternals', () =>
9696
);
9797

9898
jest.mock('scheduler', () => require.requireActual('scheduler/unstable_mock'));
99-
jest.mock('scheduler/src/SchedulerHostConfig', () =>
100-
require.requireActual('scheduler/src/forks/SchedulerHostConfig.mock.js')
101-
);

‎scripts/jest/setupTests.build.js

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,3 @@
11
'use strict';
22

33
jest.mock('scheduler', () => require.requireActual('scheduler/unstable_mock'));
4-
jest.mock('scheduler/src/SchedulerHostConfig', () =>
5-
require.requireActual('scheduler/src/forks/SchedulerHostConfig.mock.js')
6-
);

‎scripts/rollup/bundles.js

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -633,6 +633,24 @@ const bundles = [
633633
externals: [],
634634
},
635635

636+
/******* React Scheduler No DOM (experimental) *******/
637+
{
638+
bundleTypes: [
639+
NODE_DEV,
640+
NODE_PROD,
641+
FB_WWW_DEV,
642+
FB_WWW_PROD,
643+
FB_WWW_PROFILING,
644+
RN_FB_DEV,
645+
RN_FB_PROD,
646+
RN_FB_PROFILING,
647+
],
648+
moduleType: ISOMORPHIC,
649+
entry: 'scheduler/unstable_no_dom',
650+
global: 'SchedulerNoDOM',
651+
externals: [],
652+
},
653+
636654
/******* Jest React (experimental) *******/
637655
{
638656
bundleTypes: [NODE_DEV, NODE_PROD],

‎scripts/rollup/forks.js

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -201,18 +201,6 @@ const forks = Object.freeze({
201201
return 'scheduler/src/SchedulerFeatureFlags';
202202
},
203203

204-
'scheduler/src/SchedulerHostConfig': (bundleType, entry, dependencies) => {
205-
if (
206-
entry === 'scheduler/unstable_mock' ||
207-
entry === 'react-noop-renderer' ||
208-
entry === 'react-noop-renderer/persistent' ||
209-
entry === 'react-test-renderer'
210-
) {
211-
return 'scheduler/src/forks/SchedulerHostConfig.mock';
212-
}
213-
return 'scheduler/src/forks/SchedulerHostConfig.default';
214-
},
215-
216204
'shared/consoleWithStackDev': (bundleType, entry) => {
217205
switch (bundleType) {
218206
case FB_WWW_DEV:

0 commit comments

Comments
 (0)
Please sign in to comment.