@@ -23,6 +23,7 @@ var PooledClass = require('PooledClass');
23
23
var ReactEventEmitter = require ( 'ReactEventEmitter' ) ;
24
24
var ReactInstanceHandles = require ( 'ReactInstanceHandles' ) ;
25
25
var ReactMount = require ( 'ReactMount' ) ;
26
+ var ReactUpdates = require ( 'ReactUpdates' ) ;
26
27
27
28
var getEventTarget = require ( 'getEventTarget' ) ;
28
29
var mixInto = require ( 'mixInto' ) ;
@@ -56,13 +57,11 @@ function findParent(node) {
56
57
* ancestor list. Separated from createTopLevelCallback to avoid try/finally
57
58
* deoptimization.
58
59
*
59
- * @param {string } topLevelType
60
- * @param {DOMEvent } nativeEvent
61
60
* @param {TopLevelCallbackBookKeeping } bookKeeping
62
61
*/
63
- function handleTopLevelImpl ( topLevelType , nativeEvent , bookKeeping ) {
62
+ function handleTopLevelImpl ( bookKeeping ) {
64
63
var topLevelTarget = ReactMount . getFirstReactDOM (
65
- getEventTarget ( nativeEvent )
64
+ getEventTarget ( bookKeeping . nativeEvent )
66
65
) || window ;
67
66
68
67
// Loop through the hierarchy, in case there's any nested components.
@@ -79,24 +78,31 @@ function handleTopLevelImpl(topLevelType, nativeEvent, bookKeeping) {
79
78
topLevelTarget = bookKeeping . ancestors [ i ] ;
80
79
var topLevelTargetID = ReactMount . getID ( topLevelTarget ) || '' ;
81
80
ReactEventEmitter . handleTopLevel (
82
- topLevelType ,
81
+ bookKeeping . topLevelType ,
83
82
topLevelTarget ,
84
83
topLevelTargetID ,
85
- nativeEvent
84
+ bookKeeping . nativeEvent
86
85
) ;
87
86
}
88
87
}
89
88
90
89
// Used to store ancestor hierarchy in top level callback
91
- function TopLevelCallbackBookKeeping ( ) {
90
+ function TopLevelCallbackBookKeeping ( topLevelType , nativeEvent ) {
91
+ this . topLevelType = topLevelType ;
92
+ this . nativeEvent = nativeEvent ;
92
93
this . ancestors = [ ] ;
93
94
}
94
95
mixInto ( TopLevelCallbackBookKeeping , {
95
96
destructor : function ( ) {
97
+ this . topLevelType = null ;
98
+ this . nativeEvent = null ;
96
99
this . ancestors . length = 0 ;
97
100
}
98
101
} ) ;
99
- PooledClass . addPoolingTo ( TopLevelCallbackBookKeeping ) ;
102
+ PooledClass . addPoolingTo (
103
+ TopLevelCallbackBookKeeping ,
104
+ PooledClass . twoArgumentPooler
105
+ ) ;
100
106
101
107
/**
102
108
* Top-level callback creator used to implement event handling using delegation.
@@ -135,9 +141,14 @@ var ReactEventTopLevelCallback = {
135
141
return ;
136
142
}
137
143
138
- var bookKeeping = TopLevelCallbackBookKeeping . getPooled ( ) ;
144
+ var bookKeeping = TopLevelCallbackBookKeeping . getPooled (
145
+ topLevelType ,
146
+ nativeEvent
147
+ ) ;
139
148
try {
140
- handleTopLevelImpl ( topLevelType , nativeEvent , bookKeeping ) ;
149
+ // Event queue being processed in the same cycle allows
150
+ // `preventDefault`.
151
+ ReactUpdates . batchedUpdates ( handleTopLevelImpl , bookKeeping ) ;
141
152
} finally {
142
153
TopLevelCallbackBookKeeping . release ( bookKeeping ) ;
143
154
}
0 commit comments