Skip to content

Commit a6219fd

Browse files
committed
refactors the currentUpdatePriority apis to more clearly communicate when you are reading a raw value and when you are getting a resolved value. This allows requestUpdateLane to do a single call into the renderer to get the update priority while still making a reasonable stack based updating of update priorities ergonomic. I had to expose a peekCurrentUpdatePriority to satisfy startTransition which needs to set a new priority only if the current one is too low. I tried to stay away from get/set naming to avoid potential issues with whether you are reading the raw value or the derived one that considers window.event
1 parent 2a00183 commit a6219fd

File tree

15 files changed

+129
-108
lines changed

15 files changed

+129
-108
lines changed

packages/react-art/src/ReactFiberConfigART.js

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -343,16 +343,20 @@ export function shouldSetTextContent(type, props) {
343343

344344
let currentUpdatePriority: EventPriority = NoEventPriority;
345345

346-
export function setCurrentUpdatePriority(newPriority: EventPriority) {
346+
export function swapCurrentUpdatePriority(
347+
newPriority: EventPriority,
348+
): EventPriority {
349+
const prevPriority = currentUpdatePriority;
347350
currentUpdatePriority = newPriority;
351+
return prevPriority;
348352
}
349353

350-
export function getCurrentUpdatePriority() {
354+
export function peekCurrentUpdatePriority(): EventPriority {
351355
return currentUpdatePriority;
352356
}
353357

354-
export function getCurrentEventPriority() {
355-
return DefaultEventPriority;
358+
export function resolveUpdatePriority(): EventPriority {
359+
return currentUpdatePriority || DefaultEventPriority;
356360
}
357361

358362
export function shouldAttemptEagerTransition() {

packages/react-dom-bindings/src/client/ReactDOMUpdatePriority.js

Lines changed: 26 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,24 +9,45 @@
99

1010
import type {EventPriority} from 'react-reconciler/src/ReactEventPriorities';
1111

12+
import {getEventPriority} from '../events/ReactDOMEventListener';
13+
import {
14+
NoEventPriority,
15+
DefaultEventPriority,
16+
} from 'react-reconciler/src/ReactEventPriorities';
17+
1218
import ReactDOMSharedInternals from 'shared/ReactDOMSharedInternals';
1319
const ReactDOMCurrentUpdatePriority =
1420
ReactDOMSharedInternals.ReactDOMCurrentUpdatePriority;
1521

16-
export function setCurrentUpdatePriority(newPriority: EventPriority): void {
22+
export function swapCurrentUpdatePriority(
23+
newPriority: EventPriority,
24+
): EventPriority {
25+
const current = ReactDOMCurrentUpdatePriority.current;
1726
ReactDOMCurrentUpdatePriority.current = newPriority;
27+
return current;
1828
}
1929

20-
export function getCurrentUpdatePriority(): EventPriority {
30+
export function peekCurrentUpdatePriority(): EventPriority {
2131
return ReactDOMCurrentUpdatePriority.current;
2232
}
2333

34+
export function resolveUpdatePriority(): EventPriority {
35+
const updatePriority = ReactDOMCurrentUpdatePriority.current;
36+
if (updatePriority !== NoEventPriority) {
37+
return updatePriority;
38+
}
39+
const currentEvent = window.event;
40+
if (currentEvent === undefined) {
41+
return DefaultEventPriority;
42+
}
43+
return getEventPriority(currentEvent.type);
44+
}
45+
2446
export function runWithPriority<T>(priority: EventPriority, fn: () => T): T {
25-
const previousPriority = getCurrentUpdatePriority();
47+
const previousPriority = swapCurrentUpdatePriority(priority);
2648
try {
27-
setCurrentUpdatePriority(priority);
2849
return fn();
2950
} finally {
30-
setCurrentUpdatePriority(previousPriority);
51+
swapCurrentUpdatePriority(previousPriority);
3152
}
3253
}

packages/react-dom-bindings/src/client/ReactFiberConfigDOM.js

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

10-
import type {EventPriority} from 'react-reconciler/src/ReactEventPriorities';
1110
import type {DOMEventName} from '../events/DOMEventNames';
1211
import type {Fiber, FiberRoot} from 'react-reconciler/src/ReactInternalTypes';
1312
import type {
@@ -29,14 +28,14 @@ import type {
2928

3029
import {NotPending} from 'react-dom-bindings/src/shared/ReactDOMFormActions';
3130
import {getCurrentRootHostContainer} from 'react-reconciler/src/ReactFiberHostContext';
32-
import {DefaultEventPriority} from 'react-reconciler/src/ReactEventPriorities';
3331

3432
import hasOwnProperty from 'shared/hasOwnProperty';
3533
import {checkAttributeStringCoercion} from 'shared/CheckStringCoercion';
3634

3735
export {
38-
setCurrentUpdatePriority,
39-
getCurrentUpdatePriority,
36+
peekCurrentUpdatePriority,
37+
swapCurrentUpdatePriority,
38+
resolveUpdatePriority,
4039
} from './ReactDOMUpdatePriority';
4140
import {
4241
precacheFiberNode,
@@ -73,7 +72,6 @@ import {
7372
import {
7473
isEnabled as ReactBrowserEventEmitterIsEnabled,
7574
setEnabled as ReactBrowserEventEmitterSetEnabled,
76-
getEventPriority,
7775
} from '../events/ReactDOMEventListener';
7876
import {SVG_NAMESPACE, MATH_NAMESPACE} from './DOMNamespaces';
7977
import {
@@ -576,14 +574,6 @@ export function createTextInstance(
576574
return textNode;
577575
}
578576

579-
export function getCurrentEventPriority(): EventPriority {
580-
const currentEvent = window.event;
581-
if (currentEvent === undefined) {
582-
return DefaultEventPriority;
583-
}
584-
return getEventPriority(currentEvent.type);
585-
}
586-
587577
let currentPopstateTransitionEvent: Event | null = null;
588578
export function shouldAttemptEagerTransition(): boolean {
589579
const event = window.event;

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

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -34,10 +34,7 @@ import {
3434
} from '../client/ReactDOMComponentTree';
3535

3636
import {dispatchEventForPluginEventSystem} from './DOMPluginEventSystem';
37-
import {
38-
getCurrentUpdatePriority,
39-
setCurrentUpdatePriority,
40-
} from '../client/ReactDOMUpdatePriority';
37+
import {swapCurrentUpdatePriority} from '../client/ReactDOMUpdatePriority';
4138

4239
import {
4340
getCurrentPriorityLevel as getCurrentSchedulerPriorityLevel,
@@ -117,14 +114,13 @@ function dispatchDiscreteEvent(
117114
container: EventTarget,
118115
nativeEvent: AnyNativeEvent,
119116
) {
120-
const previousPriority = getCurrentUpdatePriority();
121117
const prevTransition = ReactCurrentBatchConfig.transition;
122118
ReactCurrentBatchConfig.transition = null;
119+
const previousPriority = swapCurrentUpdatePriority(DiscreteEventPriority);
123120
try {
124-
setCurrentUpdatePriority(DiscreteEventPriority);
125121
dispatchEvent(domEventName, eventSystemFlags, container, nativeEvent);
126122
} finally {
127-
setCurrentUpdatePriority(previousPriority);
123+
swapCurrentUpdatePriority(previousPriority);
128124
ReactCurrentBatchConfig.transition = prevTransition;
129125
}
130126
}
@@ -135,14 +131,13 @@ function dispatchContinuousEvent(
135131
container: EventTarget,
136132
nativeEvent: AnyNativeEvent,
137133
) {
138-
const previousPriority = getCurrentUpdatePriority();
139134
const prevTransition = ReactCurrentBatchConfig.transition;
140135
ReactCurrentBatchConfig.transition = null;
136+
const previousPriority = swapCurrentUpdatePriority(ContinuousEventPriority);
141137
try {
142-
setCurrentUpdatePriority(ContinuousEventPriority);
143138
dispatchEvent(domEventName, eventSystemFlags, container, nativeEvent);
144139
} finally {
145-
setCurrentUpdatePriority(previousPriority);
140+
swapCurrentUpdatePriority(previousPriority);
146141
ReactCurrentBatchConfig.transition = prevTransition;
147142
}
148143
}

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ import {isHigherEventPriority} from 'react-reconciler/src/ReactEventPriorities';
3838
import {isRootDehydrated} from 'react-reconciler/src/ReactFiberShellHydration';
3939
import {dispatchReplayedFormAction} from './plugins/FormActionEventPlugin';
4040
import {
41-
getCurrentUpdatePriority,
41+
peekCurrentUpdatePriority,
4242
runWithPriority as attemptHydrationAtPriority,
4343
} from '../client/ReactDOMUpdatePriority';
4444

@@ -336,7 +336,7 @@ export function queueExplicitHydrationTarget(target: Node): void {
336336
// TODO: This will read the priority if it's dispatched by the React
337337
// event system but not native events. Should read window.event.type, like
338338
// we do for updates (getCurrentEventPriority).
339-
const updatePriority = getCurrentUpdatePriority();
339+
const updatePriority = peekCurrentUpdatePriority();
340340
const queuedTarget: QueuedHydrationTarget = {
341341
blockedOn: null,
342342
target: target,

packages/react-native-renderer/src/ReactFiberConfigFabric.js

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -313,17 +313,23 @@ export function shouldSetTextContent(type: string, props: Props): boolean {
313313
}
314314

315315
let currentUpdatePriority: EventPriority = NoEventPriority;
316-
export function setCurrentUpdatePriority(
317-
newEventPriority: EventPriority,
318-
): void {
319-
currentUpdatePriority = newEventPriority;
316+
export function swapCurrentUpdatePriority(
317+
newPriority: EventPriority,
318+
): EventPriority {
319+
const previousPriority = currentUpdatePriority;
320+
currentUpdatePriority = newPriority;
321+
return previousPriority;
320322
}
321323

322-
export function getCurrentUpdatePriority(): EventPriority {
324+
export function peekCurrentUpdatePriority(): EventPriority {
323325
return currentUpdatePriority;
324326
}
325327

326-
export function getCurrentEventPriority(): EventPriority {
328+
export function resolveUpdatePriority(): EventPriority {
329+
if (currentUpdatePriority !== NoEventPriority) {
330+
return currentUpdatePriority;
331+
}
332+
327333
const currentEventPriority = fabricGetCurrentEventPriority
328334
? fabricGetCurrentEventPriority()
329335
: null;

packages/react-native-renderer/src/ReactFiberConfigNative.js

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -255,15 +255,22 @@ export function shouldSetTextContent(type: string, props: Props): boolean {
255255
}
256256

257257
let currentUpdatePriority: EventPriority = NoEventPriority;
258-
export function setCurrentUpdatePriority(newPriority: EventPriority): void {
258+
export function swapCurrentUpdatePriority(
259+
newPriority: EventPriority,
260+
): EventPriority {
261+
const previousPriority = currentUpdatePriority;
259262
currentUpdatePriority = newPriority;
263+
return previousPriority;
260264
}
261265

262-
export function getCurrentUpdatePriority(): EventPriority {
266+
export function peekCurrentUpdatePriority(): EventPriority {
263267
return currentUpdatePriority;
264268
}
265269

266-
export function getCurrentEventPriority(): EventPriority {
270+
export function resolveUpdatePriority(): EventPriority {
271+
if (currentUpdatePriority !== NoEventPriority) {
272+
return currentUpdatePriority;
273+
}
267274
return DefaultEventPriority;
268275
}
269276

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

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -510,10 +510,13 @@ function createReactNoop(reconciler: Function, useMutation: boolean) {
510510

511511
resetAfterCommit(): void {},
512512

513-
setCurrentUpdatePriority,
514-
getCurrentUpdatePriority,
513+
swapCurrentUpdatePriority,
514+
peekCurrentUpdatePriority,
515515

516-
getCurrentEventPriority() {
516+
resolveUpdatePriority() {
517+
if (currentUpdatePriority !== NoEventPriority) {
518+
return currentUpdatePriority;
519+
}
517520
return currentEventPriority;
518521
},
519522

@@ -788,11 +791,15 @@ function createReactNoop(reconciler: Function, useMutation: boolean) {
788791
const DEFAULT_ROOT_ID = '<default>';
789792

790793
let currentUpdatePriority = NoEventPriority;
791-
function setCurrentUpdatePriority(newPriority: EventPriority): void {
794+
function swapCurrentUpdatePriority(
795+
newPriority: EventPriority,
796+
): EventPriority {
797+
const previousPriority = currentUpdatePriority;
792798
currentUpdatePriority = newPriority;
799+
return previousPriority;
793800
}
794801

795-
function getCurrentUpdatePriority(): EventPriority {
802+
function peekCurrentUpdatePriority(): EventPriority {
796803
return currentUpdatePriority;
797804
}
798805

@@ -1229,12 +1236,11 @@ function createReactNoop(reconciler: Function, useMutation: boolean) {
12291236
priority: EventPriority,
12301237
fn: () => T,
12311238
): T {
1232-
const previousPriority = getCurrentUpdatePriority();
1239+
const previousPriority = swapCurrentUpdatePriority(priority);
12331240
try {
1234-
setCurrentUpdatePriority(priority);
12351241
return fn();
12361242
} finally {
1237-
setCurrentUpdatePriority(previousPriority);
1243+
swapCurrentUpdatePriority(previousPriority);
12381244
}
12391245
},
12401246

packages/react-reconciler/src/ReactEventPriorities.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,10 @@ export function isHigherEventPriority(
4848
return a !== 0 && a < b;
4949
}
5050

51+
export function eventPriorityToLane(updatePriority: EventPriority): Lane {
52+
return updatePriority;
53+
}
54+
5155
export function lanesToEventPriority(lanes: Lanes): EventPriority {
5256
const lane = getHighestPriorityLane(lanes);
5357
if (!isHigherEventPriority(DiscreteEventPriority, lane)) {

packages/react-reconciler/src/ReactFiberHooks.js

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,8 @@ import type {TransitionStatus} from './ReactFiberConfig';
2929

3030
import {
3131
NotPendingTransition as NoPendingHostTransition,
32-
setCurrentUpdatePriority,
33-
getCurrentUpdatePriority,
32+
swapCurrentUpdatePriority,
33+
peekCurrentUpdatePriority,
3434
} from './ReactFiberConfig';
3535
import ReactSharedInternals from 'shared/ReactSharedInternals';
3636
import {
@@ -2790,8 +2790,8 @@ function startTransition<S>(
27902790
callback: () => mixed,
27912791
options?: StartTransitionOptions,
27922792
): void {
2793-
const previousPriority = getCurrentUpdatePriority();
2794-
setCurrentUpdatePriority(
2793+
const previousPriority = peekCurrentUpdatePriority();
2794+
swapCurrentUpdatePriority(
27952795
higherEventPriority(previousPriority, ContinuousEventPriority),
27962796
);
27972797

@@ -2877,7 +2877,7 @@ function startTransition<S>(
28772877
throw error;
28782878
}
28792879
} finally {
2880-
setCurrentUpdatePriority(previousPriority);
2880+
swapCurrentUpdatePriority(previousPriority);
28812881

28822882
ReactCurrentBatchConfig.transition = prevTransition;
28832883

0 commit comments

Comments
 (0)