Skip to content

Commit faa697f

Browse files
authored
Set current update lane priority for user blocking events (facebook#19342)
* Set current update lane priority for user blocking events * Update to use LanePriority and not use runWithPriority * Remove unused imports * Fix tests, and I missed ReactDOMEventListener * Fix more tests * Add try/finally and hardcode lane priorities instead * Also hard code InputContinuousLanePriority in tests * Remove un-needed exports * Comment rollbacks
1 parent 4c8c98a commit faa697f

10 files changed

+106
-104
lines changed

packages/react-dom/src/client/ReactDOM.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ import {
3636
attemptContinuousHydration,
3737
attemptHydrationAtCurrentPriority,
3838
runWithPriority,
39-
getCurrentUpdatePriority,
39+
getCurrentUpdateLanePriority,
4040
} from 'react-reconciler/src/ReactFiberReconciler';
4141
import {createPortal as createPortalImpl} from 'react-reconciler/src/ReactPortal';
4242
import {canUseDOM} from 'shared/ExecutionEnvironment';
@@ -74,7 +74,7 @@ setAttemptSynchronousHydration(attemptSynchronousHydration);
7474
setAttemptUserBlockingHydration(attemptUserBlockingHydration);
7575
setAttemptContinuousHydration(attemptContinuousHydration);
7676
setAttemptHydrationAtCurrentPriority(attemptHydrationAtCurrentPriority);
77-
setGetCurrentUpdatePriority(getCurrentUpdatePriority);
77+
setGetCurrentUpdatePriority(getCurrentUpdateLanePriority);
7878
setAttemptHydrationAtPriority(runWithPriority);
7979

8080
let didWarnAboutUnstableCreatePortal = false;

packages/react-dom/src/events/DeprecatedDOMEventResponderSystem.js

+16-3
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,13 @@ import {
5656
// Intentionally not named imports because Rollup would use dynamic dispatch for
5757
// CommonJS interop named imports.
5858
import * as Scheduler from 'scheduler';
59+
60+
import {
61+
InputContinuousLanePriority,
62+
getCurrentUpdateLanePriority,
63+
setCurrentUpdateLanePriority,
64+
} from 'react-reconciler/src/ReactFiberLane';
65+
5966
const {
6067
unstable_UserBlockingPriority: UserBlockingPriority,
6168
unstable_runWithPriority: runWithPriority,
@@ -101,9 +108,15 @@ const eventResponderContext: ReactDOMResponderContext = {
101108
break;
102109
}
103110
case UserBlockingEvent: {
104-
runWithPriority(UserBlockingPriority, () =>
105-
executeUserEventHandler(eventListener, eventValue),
106-
);
111+
const previousPriority = getCurrentUpdateLanePriority();
112+
try {
113+
setCurrentUpdateLanePriority(InputContinuousLanePriority);
114+
runWithPriority(UserBlockingPriority, () =>
115+
executeUserEventHandler(eventListener, eventValue),
116+
);
117+
} finally {
118+
setCurrentUpdateLanePriority(previousPriority);
119+
}
107120
break;
108121
}
109122
case ContinuousEvent: {

packages/react-dom/src/events/ReactDOMEventListener.js

+22-10
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,11 @@ import {
5656
flushDiscreteUpdatesIfNeeded,
5757
discreteUpdates,
5858
} from './ReactDOMUpdateBatching';
59+
import {
60+
InputContinuousLanePriority,
61+
getCurrentUpdateLanePriority,
62+
setCurrentUpdateLanePriority,
63+
} from 'react-reconciler/src/ReactFiberLane';
5964

6065
const {
6166
unstable_UserBlockingPriority: UserBlockingPriority,
@@ -148,16 +153,23 @@ function dispatchUserBlockingUpdate(
148153
container,
149154
nativeEvent,
150155
) {
151-
runWithPriority(
152-
UserBlockingPriority,
153-
dispatchEvent.bind(
154-
null,
155-
topLevelType,
156-
eventSystemFlags,
157-
container,
158-
nativeEvent,
159-
),
160-
);
156+
// TODO: Double wrapping is necessary while we decouple Scheduler priority.
157+
const previousPriority = getCurrentUpdateLanePriority();
158+
try {
159+
setCurrentUpdateLanePriority(InputContinuousLanePriority);
160+
runWithPriority(
161+
UserBlockingPriority,
162+
dispatchEvent.bind(
163+
null,
164+
topLevelType,
165+
eventSystemFlags,
166+
container,
167+
nativeEvent,
168+
),
169+
);
170+
} finally {
171+
setCurrentUpdateLanePriority(previousPriority);
172+
}
161173
}
162174

163175
export function dispatchEvent(

packages/react-dom/src/events/ReactDOMEventReplaying.js

+7-12
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,8 @@ import type {Container, SuspenseInstance} from '../client/ReactDOMHostConfig';
1212
import type {DOMTopLevelEventType} from '../events/TopLevelEventTypes';
1313
import type {ElementListenerMap} from '../client/ReactDOMComponentTree';
1414
import type {EventSystemFlags} from './EventSystemFlags';
15-
import type {
16-
FiberRoot,
17-
ReactPriorityLevel,
18-
} from 'react-reconciler/src/ReactInternalTypes';
15+
import type {FiberRoot} from 'react-reconciler/src/ReactInternalTypes';
16+
import type {LanePriority} from 'react-reconciler/src/ReactFiberLane';
1917

2018
import {
2119
enableDeprecatedFlareAPI,
@@ -67,19 +65,16 @@ export function setAttemptHydrationAtCurrentPriority(
6765
attemptHydrationAtCurrentPriority = fn;
6866
}
6967

70-
let getCurrentUpdatePriority: () => ReactPriorityLevel;
68+
let getCurrentUpdatePriority: () => LanePriority;
7169

72-
export function setGetCurrentUpdatePriority(fn: () => ReactPriorityLevel) {
70+
export function setGetCurrentUpdatePriority(fn: () => LanePriority) {
7371
getCurrentUpdatePriority = fn;
7472
}
7573

76-
let attemptHydrationAtPriority: <T>(
77-
priority: ReactPriorityLevel,
78-
fn: () => T,
79-
) => T;
74+
let attemptHydrationAtPriority: <T>(priority: LanePriority, fn: () => T) => T;
8075

8176
export function setAttemptHydrationAtPriority(
82-
fn: <T>(priority: ReactPriorityLevel, fn: () => T) => T,
77+
fn: <T>(priority: LanePriority, fn: () => T) => T,
8378
) {
8479
attemptHydrationAtPriority = fn;
8580
}
@@ -170,7 +165,7 @@ type QueuedHydrationTarget = {|
170165
blockedOn: null | Container | SuspenseInstance,
171166
target: Node,
172167
priority: number,
173-
lanePriority: ReactPriorityLevel,
168+
lanePriority: LanePriority,
174169
|};
175170
const queuedExplicitHydrationTargets: Array<QueuedHydrationTarget> = [];
176171

packages/react-noop-renderer/src/ReactNoop.js

+1-2
Original file line numberDiff line numberDiff line change
@@ -47,8 +47,7 @@ export const {
4747
act,
4848
dumpTree,
4949
getRoot,
50-
// TODO: Remove this once callers migrate to alternatives.
51-
// This should only be used by React internals.
50+
// TODO: Remove this after callers migrate to alternatives.
5251
unstable_runWithPriority,
5352
} = createReactNoop(
5453
ReactFiberReconciler, // reconciler

packages/react-reconciler/src/ReactFiberReconciler.js

+5-6
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ import {
5151
observeVisibleRects as observeVisibleRects_old,
5252
registerMutableSourceForHydration as registerMutableSourceForHydration_old,
5353
runWithPriority as runWithPriority_old,
54-
getCurrentUpdatePriority as getCurrentUpdatePriority_old,
54+
getCurrentUpdateLanePriority as getCurrentUpdateLanePriority_old,
5555
} from './ReactFiberReconciler.old';
5656

5757
import {
@@ -91,7 +91,7 @@ import {
9191
observeVisibleRects as observeVisibleRects_new,
9292
registerMutableSourceForHydration as registerMutableSourceForHydration_new,
9393
runWithPriority as runWithPriority_new,
94-
getCurrentUpdatePriority as getCurrentUpdatePriority_new,
94+
getCurrentUpdateLanePriority as getCurrentUpdateLanePriority_new,
9595
} from './ReactFiberReconciler.new';
9696

9797
export const createContainer = enableNewReconciler
@@ -143,9 +143,9 @@ export const attemptContinuousHydration = enableNewReconciler
143143
export const attemptHydrationAtCurrentPriority = enableNewReconciler
144144
? attemptHydrationAtCurrentPriority_new
145145
: attemptHydrationAtCurrentPriority_old;
146-
export const getCurrentUpdatePriority = enableNewReconciler
147-
? getCurrentUpdatePriority_new
148-
: getCurrentUpdatePriority_old;
146+
export const getCurrentUpdateLanePriority = enableNewReconciler
147+
? getCurrentUpdateLanePriority_new
148+
: getCurrentUpdateLanePriority_old;
149149
export const findHostInstance = enableNewReconciler
150150
? findHostInstance_new
151151
: findHostInstance_old;
@@ -197,7 +197,6 @@ export const focusWithin = enableNewReconciler
197197
export const observeVisibleRects = enableNewReconciler
198198
? observeVisibleRects_new
199199
: observeVisibleRects_old;
200-
201200
export const registerMutableSourceForHydration = enableNewReconciler
202201
? registerMutableSourceForHydration_new
203202
: registerMutableSourceForHydration_old;

packages/react-reconciler/src/ReactFiberReconciler.new.js

+5-13
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,7 @@
77
* @flow
88
*/
99

10-
import type {
11-
Fiber,
12-
ReactPriorityLevel,
13-
SuspenseHydrationCallbacks,
14-
} from './ReactInternalTypes';
10+
import type {Fiber, SuspenseHydrationCallbacks} from './ReactInternalTypes';
1511
import type {FiberRoot} from './ReactInternalTypes';
1612
import type {RootTag} from './ReactRootTags';
1713
import type {
@@ -23,7 +19,7 @@ import type {
2319
import type {RendererInspectionConfig} from './ReactFiberHostConfig';
2420
import {FundamentalComponent} from './ReactWorkTags';
2521
import type {ReactNodeList} from 'shared/ReactTypes';
26-
import type {Lane} from './ReactFiberLane';
22+
import type {Lane, LanePriority} from './ReactFiberLane';
2723
import type {SuspenseState} from './ReactFiberSuspenseComponent.new';
2824

2925
import {
@@ -86,8 +82,6 @@ import {
8682
higherPriorityLane,
8783
getCurrentUpdateLanePriority,
8884
setCurrentUpdateLanePriority,
89-
schedulerPriorityToLanePriority,
90-
lanePriorityToSchedulerPriority,
9185
} from './ReactFiberLane';
9286
import {requestCurrentSuspenseConfig} from './ReactFiberSuspenseConfig';
9387
import {
@@ -438,19 +432,17 @@ export function attemptHydrationAtCurrentPriority(fiber: Fiber): void {
438432
markRetryLaneIfNotHydrated(fiber, lane);
439433
}
440434

441-
export function runWithPriority<T>(priority: ReactPriorityLevel, fn: () => T) {
435+
export function runWithPriority<T>(priority: LanePriority, fn: () => T) {
442436
const previousPriority = getCurrentUpdateLanePriority();
443437
try {
444-
setCurrentUpdateLanePriority(schedulerPriorityToLanePriority(priority));
438+
setCurrentUpdateLanePriority(priority);
445439
return fn();
446440
} finally {
447441
setCurrentUpdateLanePriority(previousPriority);
448442
}
449443
}
450444

451-
export function getCurrentUpdatePriority(): ReactPriorityLevel {
452-
return lanePriorityToSchedulerPriority(getCurrentUpdateLanePriority());
453-
}
445+
export {getCurrentUpdateLanePriority};
454446

455447
export {findHostInstance};
456448

packages/react-reconciler/src/ReactFiberReconciler.old.js

+5-13
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,7 @@
77
* @flow
88
*/
99

10-
import type {
11-
Fiber,
12-
ReactPriorityLevel,
13-
SuspenseHydrationCallbacks,
14-
} from './ReactInternalTypes';
10+
import type {Fiber, SuspenseHydrationCallbacks} from './ReactInternalTypes';
1511
import type {FiberRoot} from './ReactInternalTypes';
1612
import type {RootTag} from './ReactRootTags';
1713
import type {
@@ -23,7 +19,7 @@ import type {
2319
import type {RendererInspectionConfig} from './ReactFiberHostConfig';
2420
import {FundamentalComponent} from './ReactWorkTags';
2521
import type {ReactNodeList} from 'shared/ReactTypes';
26-
import type {Lane} from './ReactFiberLane';
22+
import type {Lane, LanePriority} from './ReactFiberLane';
2723
import type {SuspenseState} from './ReactFiberSuspenseComponent.old';
2824

2925
import {
@@ -86,8 +82,6 @@ import {
8682
higherPriorityLane,
8783
getCurrentUpdateLanePriority,
8884
setCurrentUpdateLanePriority,
89-
schedulerPriorityToLanePriority,
90-
lanePriorityToSchedulerPriority,
9185
} from './ReactFiberLane';
9286
import {requestCurrentSuspenseConfig} from './ReactFiberSuspenseConfig';
9387
import {
@@ -438,19 +432,17 @@ export function attemptHydrationAtCurrentPriority(fiber: Fiber): void {
438432
markRetryLaneIfNotHydrated(fiber, lane);
439433
}
440434

441-
export function runWithPriority<T>(priority: ReactPriorityLevel, fn: () => T) {
435+
export function runWithPriority<T>(priority: LanePriority, fn: () => T) {
442436
const previousPriority = getCurrentUpdateLanePriority();
443437
try {
444-
setCurrentUpdateLanePriority(schedulerPriorityToLanePriority(priority));
438+
setCurrentUpdateLanePriority(priority);
445439
return fn();
446440
} finally {
447441
setCurrentUpdateLanePriority(previousPriority);
448442
}
449443
}
450444

451-
export function getCurrentUpdatePriority(): ReactPriorityLevel {
452-
return lanePriorityToSchedulerPriority(getCurrentUpdateLanePriority());
453-
}
445+
export {getCurrentUpdateLanePriority};
454446

455447
export {findHostInstance};
456448

0 commit comments

Comments
 (0)