Contact
CoCalc Logo Icon
StoreFeaturesDocsShareSupport News AboutSign UpSign In
| Download
Views: 50912
1
/**
2
* Copyright 2013-2015, Facebook, Inc.
3
* All rights reserved.
4
*
5
* This source code is licensed under the BSD-style license found in the
6
* LICENSE file in the root directory of this source tree. An additional grant
7
* of patent rights can be found in the PATENTS file in the same directory.
8
*
9
* @providesModule SimpleEventPlugin
10
*/
11
12
'use strict';
13
14
var EventConstants = require("./EventConstants");
15
var EventPluginUtils = require("./EventPluginUtils");
16
var EventPropagators = require("./EventPropagators");
17
var SyntheticClipboardEvent = require("./SyntheticClipboardEvent");
18
var SyntheticEvent = require("./SyntheticEvent");
19
var SyntheticFocusEvent = require("./SyntheticFocusEvent");
20
var SyntheticKeyboardEvent = require("./SyntheticKeyboardEvent");
21
var SyntheticMouseEvent = require("./SyntheticMouseEvent");
22
var SyntheticDragEvent = require("./SyntheticDragEvent");
23
var SyntheticTouchEvent = require("./SyntheticTouchEvent");
24
var SyntheticUIEvent = require("./SyntheticUIEvent");
25
var SyntheticWheelEvent = require("./SyntheticWheelEvent");
26
27
var getEventCharCode = require("./getEventCharCode");
28
29
var invariant = require("./invariant");
30
var keyOf = require("./keyOf");
31
var warning = require("./warning");
32
33
var topLevelTypes = EventConstants.topLevelTypes;
34
35
var eventTypes = {
36
blur: {
37
phasedRegistrationNames: {
38
bubbled: keyOf({onBlur: true}),
39
captured: keyOf({onBlurCapture: true})
40
}
41
},
42
click: {
43
phasedRegistrationNames: {
44
bubbled: keyOf({onClick: true}),
45
captured: keyOf({onClickCapture: true})
46
}
47
},
48
contextMenu: {
49
phasedRegistrationNames: {
50
bubbled: keyOf({onContextMenu: true}),
51
captured: keyOf({onContextMenuCapture: true})
52
}
53
},
54
copy: {
55
phasedRegistrationNames: {
56
bubbled: keyOf({onCopy: true}),
57
captured: keyOf({onCopyCapture: true})
58
}
59
},
60
cut: {
61
phasedRegistrationNames: {
62
bubbled: keyOf({onCut: true}),
63
captured: keyOf({onCutCapture: true})
64
}
65
},
66
doubleClick: {
67
phasedRegistrationNames: {
68
bubbled: keyOf({onDoubleClick: true}),
69
captured: keyOf({onDoubleClickCapture: true})
70
}
71
},
72
drag: {
73
phasedRegistrationNames: {
74
bubbled: keyOf({onDrag: true}),
75
captured: keyOf({onDragCapture: true})
76
}
77
},
78
dragEnd: {
79
phasedRegistrationNames: {
80
bubbled: keyOf({onDragEnd: true}),
81
captured: keyOf({onDragEndCapture: true})
82
}
83
},
84
dragEnter: {
85
phasedRegistrationNames: {
86
bubbled: keyOf({onDragEnter: true}),
87
captured: keyOf({onDragEnterCapture: true})
88
}
89
},
90
dragExit: {
91
phasedRegistrationNames: {
92
bubbled: keyOf({onDragExit: true}),
93
captured: keyOf({onDragExitCapture: true})
94
}
95
},
96
dragLeave: {
97
phasedRegistrationNames: {
98
bubbled: keyOf({onDragLeave: true}),
99
captured: keyOf({onDragLeaveCapture: true})
100
}
101
},
102
dragOver: {
103
phasedRegistrationNames: {
104
bubbled: keyOf({onDragOver: true}),
105
captured: keyOf({onDragOverCapture: true})
106
}
107
},
108
dragStart: {
109
phasedRegistrationNames: {
110
bubbled: keyOf({onDragStart: true}),
111
captured: keyOf({onDragStartCapture: true})
112
}
113
},
114
drop: {
115
phasedRegistrationNames: {
116
bubbled: keyOf({onDrop: true}),
117
captured: keyOf({onDropCapture: true})
118
}
119
},
120
focus: {
121
phasedRegistrationNames: {
122
bubbled: keyOf({onFocus: true}),
123
captured: keyOf({onFocusCapture: true})
124
}
125
},
126
input: {
127
phasedRegistrationNames: {
128
bubbled: keyOf({onInput: true}),
129
captured: keyOf({onInputCapture: true})
130
}
131
},
132
keyDown: {
133
phasedRegistrationNames: {
134
bubbled: keyOf({onKeyDown: true}),
135
captured: keyOf({onKeyDownCapture: true})
136
}
137
},
138
keyPress: {
139
phasedRegistrationNames: {
140
bubbled: keyOf({onKeyPress: true}),
141
captured: keyOf({onKeyPressCapture: true})
142
}
143
},
144
keyUp: {
145
phasedRegistrationNames: {
146
bubbled: keyOf({onKeyUp: true}),
147
captured: keyOf({onKeyUpCapture: true})
148
}
149
},
150
load: {
151
phasedRegistrationNames: {
152
bubbled: keyOf({onLoad: true}),
153
captured: keyOf({onLoadCapture: true})
154
}
155
},
156
error: {
157
phasedRegistrationNames: {
158
bubbled: keyOf({onError: true}),
159
captured: keyOf({onErrorCapture: true})
160
}
161
},
162
// Note: We do not allow listening to mouseOver events. Instead, use the
163
// onMouseEnter/onMouseLeave created by `EnterLeaveEventPlugin`.
164
mouseDown: {
165
phasedRegistrationNames: {
166
bubbled: keyOf({onMouseDown: true}),
167
captured: keyOf({onMouseDownCapture: true})
168
}
169
},
170
mouseMove: {
171
phasedRegistrationNames: {
172
bubbled: keyOf({onMouseMove: true}),
173
captured: keyOf({onMouseMoveCapture: true})
174
}
175
},
176
mouseOut: {
177
phasedRegistrationNames: {
178
bubbled: keyOf({onMouseOut: true}),
179
captured: keyOf({onMouseOutCapture: true})
180
}
181
},
182
mouseOver: {
183
phasedRegistrationNames: {
184
bubbled: keyOf({onMouseOver: true}),
185
captured: keyOf({onMouseOverCapture: true})
186
}
187
},
188
mouseUp: {
189
phasedRegistrationNames: {
190
bubbled: keyOf({onMouseUp: true}),
191
captured: keyOf({onMouseUpCapture: true})
192
}
193
},
194
paste: {
195
phasedRegistrationNames: {
196
bubbled: keyOf({onPaste: true}),
197
captured: keyOf({onPasteCapture: true})
198
}
199
},
200
reset: {
201
phasedRegistrationNames: {
202
bubbled: keyOf({onReset: true}),
203
captured: keyOf({onResetCapture: true})
204
}
205
},
206
scroll: {
207
phasedRegistrationNames: {
208
bubbled: keyOf({onScroll: true}),
209
captured: keyOf({onScrollCapture: true})
210
}
211
},
212
submit: {
213
phasedRegistrationNames: {
214
bubbled: keyOf({onSubmit: true}),
215
captured: keyOf({onSubmitCapture: true})
216
}
217
},
218
touchCancel: {
219
phasedRegistrationNames: {
220
bubbled: keyOf({onTouchCancel: true}),
221
captured: keyOf({onTouchCancelCapture: true})
222
}
223
},
224
touchEnd: {
225
phasedRegistrationNames: {
226
bubbled: keyOf({onTouchEnd: true}),
227
captured: keyOf({onTouchEndCapture: true})
228
}
229
},
230
touchMove: {
231
phasedRegistrationNames: {
232
bubbled: keyOf({onTouchMove: true}),
233
captured: keyOf({onTouchMoveCapture: true})
234
}
235
},
236
touchStart: {
237
phasedRegistrationNames: {
238
bubbled: keyOf({onTouchStart: true}),
239
captured: keyOf({onTouchStartCapture: true})
240
}
241
},
242
wheel: {
243
phasedRegistrationNames: {
244
bubbled: keyOf({onWheel: true}),
245
captured: keyOf({onWheelCapture: true})
246
}
247
}
248
};
249
250
var topLevelEventsToDispatchConfig = {
251
topBlur: eventTypes.blur,
252
topClick: eventTypes.click,
253
topContextMenu: eventTypes.contextMenu,
254
topCopy: eventTypes.copy,
255
topCut: eventTypes.cut,
256
topDoubleClick: eventTypes.doubleClick,
257
topDrag: eventTypes.drag,
258
topDragEnd: eventTypes.dragEnd,
259
topDragEnter: eventTypes.dragEnter,
260
topDragExit: eventTypes.dragExit,
261
topDragLeave: eventTypes.dragLeave,
262
topDragOver: eventTypes.dragOver,
263
topDragStart: eventTypes.dragStart,
264
topDrop: eventTypes.drop,
265
topError: eventTypes.error,
266
topFocus: eventTypes.focus,
267
topInput: eventTypes.input,
268
topKeyDown: eventTypes.keyDown,
269
topKeyPress: eventTypes.keyPress,
270
topKeyUp: eventTypes.keyUp,
271
topLoad: eventTypes.load,
272
topMouseDown: eventTypes.mouseDown,
273
topMouseMove: eventTypes.mouseMove,
274
topMouseOut: eventTypes.mouseOut,
275
topMouseOver: eventTypes.mouseOver,
276
topMouseUp: eventTypes.mouseUp,
277
topPaste: eventTypes.paste,
278
topReset: eventTypes.reset,
279
topScroll: eventTypes.scroll,
280
topSubmit: eventTypes.submit,
281
topTouchCancel: eventTypes.touchCancel,
282
topTouchEnd: eventTypes.touchEnd,
283
topTouchMove: eventTypes.touchMove,
284
topTouchStart: eventTypes.touchStart,
285
topWheel: eventTypes.wheel
286
};
287
288
for (var type in topLevelEventsToDispatchConfig) {
289
topLevelEventsToDispatchConfig[type].dependencies = [type];
290
}
291
292
var SimpleEventPlugin = {
293
294
eventTypes: eventTypes,
295
296
/**
297
* Same as the default implementation, except cancels the event when return
298
* value is false. This behavior will be disabled in a future release.
299
*
300
* @param {object} Event to be dispatched.
301
* @param {function} Application-level callback.
302
* @param {string} domID DOM ID to pass to the callback.
303
*/
304
executeDispatch: function(event, listener, domID) {
305
var returnValue = EventPluginUtils.executeDispatch(event, listener, domID);
306
307
("production" !== process.env.NODE_ENV ? warning(
308
typeof returnValue !== 'boolean',
309
'Returning `false` from an event handler is deprecated and will be ' +
310
'ignored in a future release. Instead, manually call ' +
311
'e.stopPropagation() or e.preventDefault(), as appropriate.'
312
) : null);
313
314
if (returnValue === false) {
315
event.stopPropagation();
316
event.preventDefault();
317
}
318
},
319
320
/**
321
* @param {string} topLevelType Record from `EventConstants`.
322
* @param {DOMEventTarget} topLevelTarget The listening component root node.
323
* @param {string} topLevelTargetID ID of `topLevelTarget`.
324
* @param {object} nativeEvent Native browser event.
325
* @return {*} An accumulation of synthetic events.
326
* @see {EventPluginHub.extractEvents}
327
*/
328
extractEvents: function(
329
topLevelType,
330
topLevelTarget,
331
topLevelTargetID,
332
nativeEvent) {
333
var dispatchConfig = topLevelEventsToDispatchConfig[topLevelType];
334
if (!dispatchConfig) {
335
return null;
336
}
337
var EventConstructor;
338
switch (topLevelType) {
339
case topLevelTypes.topInput:
340
case topLevelTypes.topLoad:
341
case topLevelTypes.topError:
342
case topLevelTypes.topReset:
343
case topLevelTypes.topSubmit:
344
// HTML Events
345
// @see http://www.w3.org/TR/html5/index.html#events-0
346
EventConstructor = SyntheticEvent;
347
break;
348
case topLevelTypes.topKeyPress:
349
// FireFox creates a keypress event for function keys too. This removes
350
// the unwanted keypress events. Enter is however both printable and
351
// non-printable. One would expect Tab to be as well (but it isn't).
352
if (getEventCharCode(nativeEvent) === 0) {
353
return null;
354
}
355
/* falls through */
356
case topLevelTypes.topKeyDown:
357
case topLevelTypes.topKeyUp:
358
EventConstructor = SyntheticKeyboardEvent;
359
break;
360
case topLevelTypes.topBlur:
361
case topLevelTypes.topFocus:
362
EventConstructor = SyntheticFocusEvent;
363
break;
364
case topLevelTypes.topClick:
365
// Firefox creates a click event on right mouse clicks. This removes the
366
// unwanted click events.
367
if (nativeEvent.button === 2) {
368
return null;
369
}
370
/* falls through */
371
case topLevelTypes.topContextMenu:
372
case topLevelTypes.topDoubleClick:
373
case topLevelTypes.topMouseDown:
374
case topLevelTypes.topMouseMove:
375
case topLevelTypes.topMouseOut:
376
case topLevelTypes.topMouseOver:
377
case topLevelTypes.topMouseUp:
378
EventConstructor = SyntheticMouseEvent;
379
break;
380
case topLevelTypes.topDrag:
381
case topLevelTypes.topDragEnd:
382
case topLevelTypes.topDragEnter:
383
case topLevelTypes.topDragExit:
384
case topLevelTypes.topDragLeave:
385
case topLevelTypes.topDragOver:
386
case topLevelTypes.topDragStart:
387
case topLevelTypes.topDrop:
388
EventConstructor = SyntheticDragEvent;
389
break;
390
case topLevelTypes.topTouchCancel:
391
case topLevelTypes.topTouchEnd:
392
case topLevelTypes.topTouchMove:
393
case topLevelTypes.topTouchStart:
394
EventConstructor = SyntheticTouchEvent;
395
break;
396
case topLevelTypes.topScroll:
397
EventConstructor = SyntheticUIEvent;
398
break;
399
case topLevelTypes.topWheel:
400
EventConstructor = SyntheticWheelEvent;
401
break;
402
case topLevelTypes.topCopy:
403
case topLevelTypes.topCut:
404
case topLevelTypes.topPaste:
405
EventConstructor = SyntheticClipboardEvent;
406
break;
407
}
408
("production" !== process.env.NODE_ENV ? invariant(
409
EventConstructor,
410
'SimpleEventPlugin: Unhandled event type, `%s`.',
411
topLevelType
412
) : invariant(EventConstructor));
413
var event = EventConstructor.getPooled(
414
dispatchConfig,
415
topLevelTargetID,
416
nativeEvent
417
);
418
EventPropagators.accumulateTwoPhaseDispatches(event);
419
return event;
420
}
421
422
};
423
424
module.exports = SimpleEventPlugin;
425
426