|
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