14
import type {
15
DispatchConfig,
16
ReactSyntheticEvent,
17
+ EventPriority,
18
} from 'events/ReactSyntheticEventType';
19
import type {Fiber} from 'react-reconciler/src/ReactFiber';
20
import type {EventTypes, PluginModule} from 'events/PluginModuleType';
21
22
import {accumulateTwoPhaseDispatches} from 'events/EventPropagators';
23
import SyntheticEvent from 'events/SyntheticEvent';
24
+import {
25
+ DiscreteEvent,
26
+ UserBlockingEvent,
27
+ ContinuousEvent,
28
+} from 'events/ReactSyntheticEventType';
29
30
import * as DOMTopLevelEventTypes from './DOMTopLevelEventTypes';
31
import warningWithoutStack from 'shared/warningWithoutStack';
61
* [TOP_ABORT, { sameConfig }],
62
* ]);
63
*/
58
-type EventTuple = [DOMTopLevelEventType, string];
59
-const discreteEventTypeNames: Array<EventTuple> = [
60
- [DOMTopLevelEventTypes.TOP_BLUR, 'blur'],
61
- [DOMTopLevelEventTypes.TOP_CANCEL, 'cancel'],
62
- [DOMTopLevelEventTypes.TOP_CLICK, 'click'],
63
- [DOMTopLevelEventTypes.TOP_CLOSE, 'close'],
64
- [DOMTopLevelEventTypes.TOP_CONTEXT_MENU, 'contextMenu'],
65
- [DOMTopLevelEventTypes.TOP_COPY, 'copy'],
66
- [DOMTopLevelEventTypes.TOP_CUT, 'cut'],
67
- [DOMTopLevelEventTypes.TOP_AUX_CLICK, 'auxClick'],
68
- [DOMTopLevelEventTypes.TOP_DOUBLE_CLICK, 'doubleClick'],
69
- [DOMTopLevelEventTypes.TOP_DRAG_END, 'dragEnd'],
70
- [DOMTopLevelEventTypes.TOP_DRAG_START, 'dragStart'],
71
- [DOMTopLevelEventTypes.TOP_DROP, 'drop'],
72
- [DOMTopLevelEventTypes.TOP_FOCUS, 'focus'],
73
- [DOMTopLevelEventTypes.TOP_INPUT, 'input'],
74
- [DOMTopLevelEventTypes.TOP_INVALID, 'invalid'],
75
- [DOMTopLevelEventTypes.TOP_KEY_DOWN, 'keyDown'],
76
- [DOMTopLevelEventTypes.TOP_KEY_PRESS, 'keyPress'],
77
- [DOMTopLevelEventTypes.TOP_KEY_UP, 'keyUp'],
78
- [DOMTopLevelEventTypes.TOP_MOUSE_DOWN, 'mouseDown'],
79
- [DOMTopLevelEventTypes.TOP_MOUSE_UP, 'mouseUp'],
80
- [DOMTopLevelEventTypes.TOP_PASTE, 'paste'],
81
- [DOMTopLevelEventTypes.TOP_PAUSE, 'pause'],
82
- [DOMTopLevelEventTypes.TOP_PLAY, 'play'],
83
- [DOMTopLevelEventTypes.TOP_POINTER_CANCEL, 'pointerCancel'],
84
- [DOMTopLevelEventTypes.TOP_POINTER_DOWN, 'pointerDown'],
85
- [DOMTopLevelEventTypes.TOP_POINTER_UP, 'pointerUp'],
86
- [DOMTopLevelEventTypes.TOP_RATE_CHANGE, 'rateChange'],
87
- [DOMTopLevelEventTypes.TOP_RESET, 'reset'],
88
- [DOMTopLevelEventTypes.TOP_SEEKED, 'seeked'],
89
- [DOMTopLevelEventTypes.TOP_SUBMIT, 'submit'],
90
- [DOMTopLevelEventTypes.TOP_TOUCH_CANCEL, 'touchCancel'],
91
- [DOMTopLevelEventTypes.TOP_TOUCH_END, 'touchEnd'],
92
- [DOMTopLevelEventTypes.TOP_TOUCH_START, 'touchStart'],
93
- [DOMTopLevelEventTypes.TOP_VOLUME_CHANGE, 'volumeChange'],
94
-];
95
-const continuousEventTypeNames: Array<EventTuple> = [
96
- [DOMTopLevelEventTypes.TOP_ABORT, 'abort'],
97
- [DOMTopLevelEventTypes.TOP_ANIMATION_END, 'animationEnd'],
98
- [DOMTopLevelEventTypes.TOP_ANIMATION_ITERATION, 'animationIteration'],
99
- [DOMTopLevelEventTypes.TOP_ANIMATION_START, 'animationStart'],
100
- [DOMTopLevelEventTypes.TOP_CAN_PLAY, 'canPlay'],
101
- [DOMTopLevelEventTypes.TOP_CAN_PLAY_THROUGH, 'canPlayThrough'],
102
- [DOMTopLevelEventTypes.TOP_DRAG, 'drag'],
103
- [DOMTopLevelEventTypes.TOP_DRAG_ENTER, 'dragEnter'],
104
- [DOMTopLevelEventTypes.TOP_DRAG_EXIT, 'dragExit'],
105
- [DOMTopLevelEventTypes.TOP_DRAG_LEAVE, 'dragLeave'],
106
- [DOMTopLevelEventTypes.TOP_DRAG_OVER, 'dragOver'],
107
- [DOMTopLevelEventTypes.TOP_DURATION_CHANGE, 'durationChange'],
108
- [DOMTopLevelEventTypes.TOP_EMPTIED, 'emptied'],
109
- [DOMTopLevelEventTypes.TOP_ENCRYPTED, 'encrypted'],
110
- [DOMTopLevelEventTypes.TOP_ENDED, 'ended'],
111
- [DOMTopLevelEventTypes.TOP_ERROR, 'error'],
112
- [DOMTopLevelEventTypes.TOP_GOT_POINTER_CAPTURE, 'gotPointerCapture'],
113
- [DOMTopLevelEventTypes.TOP_LOAD, 'load'],
114
- [DOMTopLevelEventTypes.TOP_LOADED_DATA, 'loadedData'],
115
- [DOMTopLevelEventTypes.TOP_LOADED_METADATA, 'loadedMetadata'],
116
- [DOMTopLevelEventTypes.TOP_LOAD_START, 'loadStart'],
117
- [DOMTopLevelEventTypes.TOP_LOST_POINTER_CAPTURE, 'lostPointerCapture'],
118
- [DOMTopLevelEventTypes.TOP_MOUSE_MOVE, 'mouseMove'],
119
- [DOMTopLevelEventTypes.TOP_MOUSE_OUT, 'mouseOut'],
120
- [DOMTopLevelEventTypes.TOP_MOUSE_OVER, 'mouseOver'],
121
- [DOMTopLevelEventTypes.TOP_PLAYING, 'playing'],
122
- [DOMTopLevelEventTypes.TOP_POINTER_MOVE, 'pointerMove'],
123
- [DOMTopLevelEventTypes.TOP_POINTER_OUT, 'pointerOut'],
124
- [DOMTopLevelEventTypes.TOP_POINTER_OVER, 'pointerOver'],
125
- [DOMTopLevelEventTypes.TOP_PROGRESS, 'progress'],
126
- [DOMTopLevelEventTypes.TOP_SCROLL, 'scroll'],
127
- [DOMTopLevelEventTypes.TOP_SEEKING, 'seeking'],
128
- [DOMTopLevelEventTypes.TOP_STALLED, 'stalled'],
129
- [DOMTopLevelEventTypes.TOP_SUSPEND, 'suspend'],
130
- [DOMTopLevelEventTypes.TOP_TIME_UPDATE, 'timeUpdate'],
131
- [DOMTopLevelEventTypes.TOP_TOGGLE, 'toggle'],
132
- [DOMTopLevelEventTypes.TOP_TOUCH_MOVE, 'touchMove'],
133
- [DOMTopLevelEventTypes.TOP_TRANSITION_END, 'transitionEnd'],
134
- [DOMTopLevelEventTypes.TOP_WAITING, 'waiting'],
135
- [DOMTopLevelEventTypes.TOP_WHEEL, 'wheel'],
64
+
65
+type EventTuple = [DOMTopLevelEventType, string, EventPriority];
66
+
67
+const eventTuples: Array<EventTuple> = [
68
+ // Discrete events
69
+ [DOMTopLevelEventTypes.TOP_BLUR, 'blur', DiscreteEvent],
70
+ [DOMTopLevelEventTypes.TOP_CANCEL, 'cancel', DiscreteEvent],
71
+ [DOMTopLevelEventTypes.TOP_CLICK, 'click', DiscreteEvent],
72
+ [DOMTopLevelEventTypes.TOP_CLOSE, 'close', DiscreteEvent],
73
+ [DOMTopLevelEventTypes.TOP_CONTEXT_MENU, 'contextMenu', DiscreteEvent],
74
+ [DOMTopLevelEventTypes.TOP_COPY, 'copy', DiscreteEvent],
75
+ [DOMTopLevelEventTypes.TOP_CUT, 'cut', DiscreteEvent],
76
+ [DOMTopLevelEventTypes.TOP_AUX_CLICK, 'auxClick', DiscreteEvent],
77
+ [DOMTopLevelEventTypes.TOP_DOUBLE_CLICK, 'doubleClick', DiscreteEvent],
78
+ [DOMTopLevelEventTypes.TOP_DRAG_END, 'dragEnd', DiscreteEvent],
79
+ [DOMTopLevelEventTypes.TOP_DRAG_START, 'dragStart', DiscreteEvent],
80
+ [DOMTopLevelEventTypes.TOP_DROP, 'drop', DiscreteEvent],
81
+ [DOMTopLevelEventTypes.TOP_FOCUS, 'focus', DiscreteEvent],
82
+ [DOMTopLevelEventTypes.TOP_INPUT, 'input', DiscreteEvent],
83
+ [DOMTopLevelEventTypes.TOP_INVALID, 'invalid', DiscreteEvent],
84
+ [DOMTopLevelEventTypes.TOP_KEY_DOWN, 'keyDown', DiscreteEvent],
85
+ [DOMTopLevelEventTypes.TOP_KEY_PRESS, 'keyPress', DiscreteEvent],
86
+ [DOMTopLevelEventTypes.TOP_KEY_UP, 'keyUp', DiscreteEvent],
87
+ [DOMTopLevelEventTypes.TOP_MOUSE_DOWN, 'mouseDown', DiscreteEvent],
88
+ [DOMTopLevelEventTypes.TOP_MOUSE_UP, 'mouseUp', DiscreteEvent],
89
+ [DOMTopLevelEventTypes.TOP_PASTE, 'paste', DiscreteEvent],
90
+ [DOMTopLevelEventTypes.TOP_PAUSE, 'pause', DiscreteEvent],
91
+ [DOMTopLevelEventTypes.TOP_PLAY, 'play', DiscreteEvent],
92
+ [DOMTopLevelEventTypes.TOP_POINTER_CANCEL, 'pointerCancel', DiscreteEvent],
93
+ [DOMTopLevelEventTypes.TOP_POINTER_DOWN, 'pointerDown', DiscreteEvent],
94
+ [DOMTopLevelEventTypes.TOP_POINTER_UP, 'pointerUp', DiscreteEvent],
95
+ [DOMTopLevelEventTypes.TOP_RATE_CHANGE, 'rateChange', DiscreteEvent],
96
+ [DOMTopLevelEventTypes.TOP_RESET, 'reset', DiscreteEvent],
97
+ [DOMTopLevelEventTypes.TOP_SEEKED, 'seeked', DiscreteEvent],
98
+ [DOMTopLevelEventTypes.TOP_SUBMIT, 'submit', DiscreteEvent],
99
+ [DOMTopLevelEventTypes.TOP_TOUCH_CANCEL, 'touchCancel', DiscreteEvent],
100
+ [DOMTopLevelEventTypes.TOP_TOUCH_END, 'touchEnd', DiscreteEvent],
101
+ [DOMTopLevelEventTypes.TOP_TOUCH_START, 'touchStart', DiscreteEvent],
102
+ [DOMTopLevelEventTypes.TOP_VOLUME_CHANGE, 'volumeChange', DiscreteEvent],
103
+
104
+ // User-blocking events
105
+ [DOMTopLevelEventTypes.TOP_DRAG, 'drag', UserBlockingEvent],
106
+ [DOMTopLevelEventTypes.TOP_DRAG_ENTER, 'dragEnter', UserBlockingEvent],
107
+ [DOMTopLevelEventTypes.TOP_DRAG_EXIT, 'dragExit', UserBlockingEvent],
108
+ [DOMTopLevelEventTypes.TOP_DRAG_LEAVE, 'dragLeave', UserBlockingEvent],
109
+ [DOMTopLevelEventTypes.TOP_DRAG_OVER, 'dragOver', UserBlockingEvent],
110
+ [DOMTopLevelEventTypes.TOP_MOUSE_MOVE, 'mouseMove', UserBlockingEvent],
111
+ [DOMTopLevelEventTypes.TOP_MOUSE_OUT, 'mouseOut', UserBlockingEvent],
112
+ [DOMTopLevelEventTypes.TOP_MOUSE_OVER, 'mouseOver', UserBlockingEvent],
113
+ [DOMTopLevelEventTypes.TOP_POINTER_MOVE, 'pointerMove', UserBlockingEvent],
114
+ [DOMTopLevelEventTypes.TOP_POINTER_OUT, 'pointerOut', UserBlockingEvent],
115
+ [DOMTopLevelEventTypes.TOP_POINTER_OVER, 'pointerOver', UserBlockingEvent],
116
+ [DOMTopLevelEventTypes.TOP_SCROLL, 'scroll', UserBlockingEvent],
117
+ [DOMTopLevelEventTypes.TOP_TOGGLE, 'toggle', UserBlockingEvent],
118
+ [DOMTopLevelEventTypes.TOP_TOUCH_MOVE, 'touchMove', UserBlockingEvent],
119
+ [DOMTopLevelEventTypes.TOP_WHEEL, 'wheel', UserBlockingEvent],
120
+
121
+ // Continuous events
122
+ [DOMTopLevelEventTypes.TOP_ABORT, 'abort', ContinuousEvent],
123
+ [DOMTopLevelEventTypes.TOP_ANIMATION_END, 'animationEnd', ContinuousEvent],
124
+ [
125
+ DOMTopLevelEventTypes.TOP_ANIMATION_ITERATION,
126
+ 'animationIteration',
127
+ ContinuousEvent,
128
+ ],
129
+ [
130
+ DOMTopLevelEventTypes.TOP_ANIMATION_START,
131
+ 'animationStart',
132
+ ContinuousEvent,
133
+ ],
134
+ [DOMTopLevelEventTypes.TOP_CAN_PLAY, 'canPlay', ContinuousEvent],
135
+ [
136
+ DOMTopLevelEventTypes.TOP_CAN_PLAY_THROUGH,
137
+ 'canPlayThrough',
138
+ ContinuousEvent,
139
+ ],
140
+ [
141
+ DOMTopLevelEventTypes.TOP_DURATION_CHANGE,
142
+ 'durationChange',
143
+ ContinuousEvent,
144
+ ],
145
+ [DOMTopLevelEventTypes.TOP_EMPTIED, 'emptied', ContinuousEvent],
146
+ [DOMTopLevelEventTypes.TOP_ENCRYPTED, 'encrypted', ContinuousEvent],
147
+ [DOMTopLevelEventTypes.TOP_ENDED, 'ended', ContinuousEvent],
148
+ [DOMTopLevelEventTypes.TOP_ERROR, 'error', ContinuousEvent],
149
+ [
150
+ DOMTopLevelEventTypes.TOP_GOT_POINTER_CAPTURE,
151
+ 'gotPointerCapture',
152
+ ContinuousEvent,
153
+ ],
154
+ [DOMTopLevelEventTypes.TOP_LOAD, 'load', ContinuousEvent],
155
+ [DOMTopLevelEventTypes.TOP_LOADED_DATA, 'loadedData', ContinuousEvent],
156
+ [
157
+ DOMTopLevelEventTypes.TOP_LOADED_METADATA,
158
+ 'loadedMetadata',
159
+ ContinuousEvent,
160
+ ],
161
+ [DOMTopLevelEventTypes.TOP_LOAD_START, 'loadStart', ContinuousEvent],
162
+ [
163
+ DOMTopLevelEventTypes.TOP_LOST_POINTER_CAPTURE,
164
+ 'lostPointerCapture',
165
+ ContinuousEvent,
166
+ ],
167
+ [DOMTopLevelEventTypes.TOP_PLAYING, 'playing', ContinuousEvent],
168
+ [DOMTopLevelEventTypes.TOP_PROGRESS, 'progress', ContinuousEvent],
169
+ [DOMTopLevelEventTypes.TOP_SEEKING, 'seeking', ContinuousEvent],
170
+ [DOMTopLevelEventTypes.TOP_STALLED, 'stalled', ContinuousEvent],
171
+ [DOMTopLevelEventTypes.TOP_SUSPEND, 'suspend', ContinuousEvent],
172
+ [DOMTopLevelEventTypes.TOP_TIME_UPDATE, 'timeUpdate', ContinuousEvent],
173
+ [DOMTopLevelEventTypes.TOP_TRANSITION_END, 'transitionEnd', ContinuousEvent],
174
+ [DOMTopLevelEventTypes.TOP_WAITING, 'waiting', ContinuousEvent],
175
];
176
177
const eventTypes: EventTypes = {};
179
[key: TopLevelType]: DispatchConfig,
180
} = {};
181
143
-function addEventTypeNameToConfig(
144
- [topEvent, event]: EventTuple,
145
- isDiscrete: boolean,
146
-) {
182
+for (let i = 0; i < eventTuples.length; i++) {
183
+ const eventTuple = eventTuples[i];
184
+ const topEvent = eventTuple[0];
185
+ const event = eventTuple[1];
186
+ const eventPriority = eventTuple[2];
187
+
188
const capitalizedEvent = event[0].toUpperCase() + event.slice(1);
189
const onEvent = 'on' + capitalizedEvent;
190
150
- const type = {
191
+ const config = {
192
phasedRegistrationNames: {
193
bubbled: onEvent,
194
captured: onEvent + 'Capture',
195
},
196
dependencies: [topEvent],
156
- isDiscrete,
197
+ eventPriority,
198
};
158
- eventTypes[event] = type;
159
- topLevelEventsToDispatchConfig[topEvent] = type;
199
+ eventTypes[event] = config;
200
+ topLevelEventsToDispatchConfig[topEvent] = config;
201
}
202
162
-discreteEventTypeNames.forEach(eventTuple => {
163
- addEventTypeNameToConfig(eventTuple, true);
164
-});
165
-continuousEventTypeNames.forEach(eventTuple => {
166
- addEventTypeNameToConfig(eventTuple, false);
167
-});
168
-
203
// Only used in DEV for exhaustiveness validation.
204
const knownHTMLTopLevelTypes: Array<DOMTopLevelEventType> = [
205
DOMTopLevelEventTypes.TOP_ABORT,
236
];
237
238
const SimpleEventPlugin: PluginModule<MouseEvent> & {
205
- isDiscreteTopLevelEventType: (topLevelType: TopLevelType) => boolean,
239
+ getEventPriority: (topLevelType: TopLevelType) => EventPriority,
240
} = {
241
eventTypes: eventTypes,
242
209
- isDiscreteTopLevelEventType(topLevelType: TopLevelType): boolean {
243
+ getEventPriority(topLevelType: TopLevelType): EventPriority {
244
const config = topLevelEventsToDispatchConfig[topLevelType];
211
- return config !== undefined && config.isDiscrete === true;
245
+ return config !== undefined ? config.eventPriority : ContinuousEvent;
246
},
247
248
extractEvents: function(