|
9 | 9 | needsStateRestore,
|
10 | 10 | restoreStateIfNeeded,
|
11 | 11 | } from './ReactDOMControlledComponent';
|
| 12 | +import {enableDiscreteEventFlushingChange} from 'shared/ReactFeatureFlags'; |
12 | 13 |
|
13 | 14 | // Used as a way to call batchedUpdates when we don't have a reference to
|
14 | 15 | // the renderer. Such as when we're dispatching events or if third party
|
@@ -87,9 +88,32 @@ export function discreteUpdates(fn, a, b, c, d) {
|
87 | 88 | }
|
88 | 89 | }
|
89 | 90 |
|
90 |
| -export function flushDiscreteUpdatesIfNeeded() { |
91 |
| - if (!isInsideEventHandler) { |
92 |
| - flushDiscreteUpdatesImpl(); |
| 91 | +let lastFlushedEventTimeStamp = 0; |
| 92 | +export function flushDiscreteUpdatesIfNeeded(timeStamp: number) { |
| 93 | + if (enableDiscreteEventFlushingChange) { |
| 94 | + // event.timeStamp isn't overly reliable due to inconsistencies in |
| 95 | + // how different browsers have historically provided the time stamp. |
| 96 | + // Some browsers provide high-resolution time stamps for all events, |
| 97 | + // some provide low-resolution time stamps for all events. FF < 52 |
| 98 | + // even mixes both time stamps together. Some browsers even report |
| 99 | + // negative time stamps or time stamps that are 0 (iOS9) in some cases. |
| 100 | + // Given we are only comparing two time stamps with equality (!==), |
| 101 | + // we are safe from the resolution differences. If the time stamp is 0 |
| 102 | + // we bail-out of preventing the flush, which can affect semantics, |
| 103 | + // such as if an earlier flush removes or adds event listeners that |
| 104 | + // are fired in the subsequent flush. However, this is the same |
| 105 | + // behaviour as we had before this change, so the risks are low. |
| 106 | + if ( |
| 107 | + !isInsideEventHandler && |
| 108 | + (timeStamp === 0 || lastFlushedEventTimeStamp !== timeStamp) |
| 109 | + ) { |
| 110 | + lastFlushedEventTimeStamp = timeStamp; |
| 111 | + flushDiscreteUpdatesImpl(); |
| 112 | + } |
| 113 | + } else { |
| 114 | + if (!isInsideEventHandler) { |
| 115 | + flushDiscreteUpdatesImpl(); |
| 116 | + } |
93 | 117 | }
|
94 | 118 | }
|
95 | 119 |
|
|
0 commit comments