Skip to content

Commit 4c733e7

Browse files
committed
Unset transition before entering any special execution contexts
1 parent 760abec commit 4c733e7

File tree

3 files changed

+42
-0
lines changed

3 files changed

+42
-0
lines changed

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,9 @@ import {
5757
getCurrentUpdatePriority,
5858
setCurrentUpdatePriority,
5959
} from 'react-reconciler/src/ReactEventPriorities';
60+
import ReactSharedInternals from 'shared/ReactSharedInternals';
61+
62+
const {ReactCurrentBatchConfig} = ReactSharedInternals;
6063

6164
// TODO: can we stop exporting these?
6265
export let _enabled = true;
@@ -141,11 +144,14 @@ function dispatchContinuousEvent(
141144
nativeEvent,
142145
) {
143146
const previousPriority = getCurrentUpdatePriority();
147+
const prevTransition = ReactCurrentBatchConfig.transition;
148+
ReactCurrentBatchConfig.transition = 0;
144149
try {
145150
setCurrentUpdatePriority(ContinuousEventPriority);
146151
dispatchEvent(domEventName, eventSystemFlags, container, nativeEvent);
147152
} finally {
148153
setCurrentUpdatePriority(previousPriority);
154+
ReactCurrentBatchConfig.transition = prevTransition;
149155
}
150156
}
151157

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

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1073,11 +1073,14 @@ export function flushDiscreteUpdates() {
10731073

10741074
export function deferredUpdates<A>(fn: () => A): A {
10751075
const previousPriority = getCurrentUpdatePriority();
1076+
const prevTransition = ReactCurrentBatchConfig.transition;
10761077
try {
1078+
ReactCurrentBatchConfig.transition = 0;
10771079
setCurrentUpdatePriority(DefaultEventPriority);
10781080
return fn();
10791081
} finally {
10801082
setCurrentUpdatePriority(previousPriority);
1083+
ReactCurrentBatchConfig.transition = prevTransition;
10811084
}
10821085
}
10831086

@@ -1119,11 +1122,14 @@ export function discreteUpdates<A, B, C, D, R>(
11191122
d: D,
11201123
): R {
11211124
const previousPriority = getCurrentUpdatePriority();
1125+
const prevTransition = ReactCurrentBatchConfig.transition;
11221126
try {
1127+
ReactCurrentBatchConfig.transition = 0;
11231128
setCurrentUpdatePriority(DiscreteEventPriority);
11241129
return fn(a, b, c, d);
11251130
} finally {
11261131
setCurrentUpdatePriority(previousPriority);
1132+
ReactCurrentBatchConfig.transition = prevTransition;
11271133
if (executionContext === NoContext) {
11281134
// Flush the immediate callbacks that were scheduled during this batch
11291135
resetRenderTimer();
@@ -1186,12 +1192,15 @@ export function flushSync<A, R>(fn: A => R, a: A): R {
11861192
export function flushControlled(fn: () => mixed): void {
11871193
const prevExecutionContext = executionContext;
11881194
executionContext |= BatchedContext;
1195+
const prevTransition = ReactCurrentBatchConfig.transition;
11891196
const previousPriority = getCurrentUpdatePriority();
11901197
try {
1198+
ReactCurrentBatchConfig.transition = 0;
11911199
setCurrentUpdatePriority(DiscreteEventPriority);
11921200
fn();
11931201
} finally {
11941202
setCurrentUpdatePriority(previousPriority);
1203+
ReactCurrentBatchConfig.transition = prevTransition;
11951204

11961205
executionContext = prevExecutionContext;
11971206
if (executionContext === NoContext) {
@@ -1685,10 +1694,13 @@ function commitRoot(root) {
16851694
// TODO: This no longer makes any sense. We already wrap the mutation and
16861695
// layout phases. Should be able to remove.
16871696
const previousUpdateLanePriority = getCurrentUpdatePriority();
1697+
const prevTransition = ReactCurrentBatchConfig.transition;
16881698
try {
1699+
ReactCurrentBatchConfig.transition = 0;
16891700
setCurrentUpdatePriority(DiscreteEventPriority);
16901701
commitRootImpl(root, previousUpdateLanePriority);
16911702
} finally {
1703+
ReactCurrentBatchConfig.transition = prevTransition;
16921704
setCurrentUpdatePriority(previousUpdateLanePriority);
16931705
}
16941706

@@ -1801,6 +1813,8 @@ function commitRootImpl(root, renderPriorityLevel) {
18011813
NoFlags;
18021814

18031815
if (subtreeHasEffects || rootHasEffect) {
1816+
const prevTransition = ReactCurrentBatchConfig.transition;
1817+
ReactCurrentBatchConfig.transition = 0;
18041818
const previousPriority = getCurrentUpdatePriority();
18051819
setCurrentUpdatePriority(DiscreteEventPriority);
18061820

@@ -1886,6 +1900,7 @@ function commitRootImpl(root, renderPriorityLevel) {
18861900

18871901
// Reset the priority to the previous non-sync value.
18881902
setCurrentUpdatePriority(previousPriority);
1903+
ReactCurrentBatchConfig.transition = prevTransition;
18891904
} else {
18901905
// No effects.
18911906
root.current = finishedWork;
@@ -2023,12 +2038,15 @@ export function flushPassiveEffects(): boolean {
20232038
DefaultEventPriority,
20242039
lanesToEventPriority(pendingPassiveEffectsLanes),
20252040
);
2041+
const prevTransition = ReactCurrentBatchConfig.transition;
20262042
const previousPriority = getCurrentUpdatePriority();
20272043
try {
2044+
ReactCurrentBatchConfig.transition = 0;
20282045
setCurrentUpdatePriority(priority);
20292046
return flushPassiveEffectsImpl();
20302047
} finally {
20312048
setCurrentUpdatePriority(previousPriority);
2049+
ReactCurrentBatchConfig.transition = prevTransition;
20322050
}
20332051
}
20342052
return false;

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

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1073,11 +1073,14 @@ export function flushDiscreteUpdates() {
10731073

10741074
export function deferredUpdates<A>(fn: () => A): A {
10751075
const previousPriority = getCurrentUpdatePriority();
1076+
const prevTransition = ReactCurrentBatchConfig.transition;
10761077
try {
1078+
ReactCurrentBatchConfig.transition = 0;
10771079
setCurrentUpdatePriority(DefaultEventPriority);
10781080
return fn();
10791081
} finally {
10801082
setCurrentUpdatePriority(previousPriority);
1083+
ReactCurrentBatchConfig.transition = prevTransition;
10811084
}
10821085
}
10831086

@@ -1119,11 +1122,14 @@ export function discreteUpdates<A, B, C, D, R>(
11191122
d: D,
11201123
): R {
11211124
const previousPriority = getCurrentUpdatePriority();
1125+
const prevTransition = ReactCurrentBatchConfig.transition;
11221126
try {
1127+
ReactCurrentBatchConfig.transition = 0;
11231128
setCurrentUpdatePriority(DiscreteEventPriority);
11241129
return fn(a, b, c, d);
11251130
} finally {
11261131
setCurrentUpdatePriority(previousPriority);
1132+
ReactCurrentBatchConfig.transition = prevTransition;
11271133
if (executionContext === NoContext) {
11281134
// Flush the immediate callbacks that were scheduled during this batch
11291135
resetRenderTimer();
@@ -1186,12 +1192,15 @@ export function flushSync<A, R>(fn: A => R, a: A): R {
11861192
export function flushControlled(fn: () => mixed): void {
11871193
const prevExecutionContext = executionContext;
11881194
executionContext |= BatchedContext;
1195+
const prevTransition = ReactCurrentBatchConfig.transition;
11891196
const previousPriority = getCurrentUpdatePriority();
11901197
try {
1198+
ReactCurrentBatchConfig.transition = 0;
11911199
setCurrentUpdatePriority(DiscreteEventPriority);
11921200
fn();
11931201
} finally {
11941202
setCurrentUpdatePriority(previousPriority);
1203+
ReactCurrentBatchConfig.transition = prevTransition;
11951204

11961205
executionContext = prevExecutionContext;
11971206
if (executionContext === NoContext) {
@@ -1685,10 +1694,13 @@ function commitRoot(root) {
16851694
// TODO: This no longer makes any sense. We already wrap the mutation and
16861695
// layout phases. Should be able to remove.
16871696
const previousUpdateLanePriority = getCurrentUpdatePriority();
1697+
const prevTransition = ReactCurrentBatchConfig.transition;
16881698
try {
1699+
ReactCurrentBatchConfig.transition = 0;
16891700
setCurrentUpdatePriority(DiscreteEventPriority);
16901701
commitRootImpl(root, previousUpdateLanePriority);
16911702
} finally {
1703+
ReactCurrentBatchConfig.transition = prevTransition;
16921704
setCurrentUpdatePriority(previousUpdateLanePriority);
16931705
}
16941706

@@ -1801,6 +1813,8 @@ function commitRootImpl(root, renderPriorityLevel) {
18011813
NoFlags;
18021814

18031815
if (subtreeHasEffects || rootHasEffect) {
1816+
const prevTransition = ReactCurrentBatchConfig.transition;
1817+
ReactCurrentBatchConfig.transition = 0;
18041818
const previousPriority = getCurrentUpdatePriority();
18051819
setCurrentUpdatePriority(DiscreteEventPriority);
18061820

@@ -1886,6 +1900,7 @@ function commitRootImpl(root, renderPriorityLevel) {
18861900

18871901
// Reset the priority to the previous non-sync value.
18881902
setCurrentUpdatePriority(previousPriority);
1903+
ReactCurrentBatchConfig.transition = prevTransition;
18891904
} else {
18901905
// No effects.
18911906
root.current = finishedWork;
@@ -2023,12 +2038,15 @@ export function flushPassiveEffects(): boolean {
20232038
DefaultEventPriority,
20242039
lanesToEventPriority(pendingPassiveEffectsLanes),
20252040
);
2041+
const prevTransition = ReactCurrentBatchConfig.transition;
20262042
const previousPriority = getCurrentUpdatePriority();
20272043
try {
2044+
ReactCurrentBatchConfig.transition = 0;
20282045
setCurrentUpdatePriority(priority);
20292046
return flushPassiveEffectsImpl();
20302047
} finally {
20312048
setCurrentUpdatePriority(previousPriority);
2049+
ReactCurrentBatchConfig.transition = prevTransition;
20322050
}
20332051
}
20342052
return false;

0 commit comments

Comments
 (0)