@@ -23,6 +23,7 @@ var PooledClass = require('PooledClass');
2323var ReactEventEmitter = require ( 'ReactEventEmitter' ) ;
2424var ReactInstanceHandles = require ( 'ReactInstanceHandles' ) ;
2525var ReactMount = require ( 'ReactMount' ) ;
26+ var ReactUpdates = require ( 'ReactUpdates' ) ;
2627
2728var getEventTarget = require ( 'getEventTarget' ) ;
2829var mixInto = require ( 'mixInto' ) ;
@@ -56,13 +57,11 @@ function findParent(node) {
5657 * ancestor list. Separated from createTopLevelCallback to avoid try/finally
5758 * deoptimization.
5859 *
59- * @param {string } topLevelType
60- * @param {DOMEvent } nativeEvent
6160 * @param {TopLevelCallbackBookKeeping } bookKeeping
6261 */
63- function handleTopLevelImpl ( topLevelType , nativeEvent , bookKeeping ) {
62+ function handleTopLevelImpl ( bookKeeping ) {
6463 var topLevelTarget = ReactMount . getFirstReactDOM (
65- getEventTarget ( nativeEvent )
64+ getEventTarget ( bookKeeping . nativeEvent )
6665 ) || window ;
6766
6867 // Loop through the hierarchy, in case there's any nested components.
@@ -79,24 +78,31 @@ function handleTopLevelImpl(topLevelType, nativeEvent, bookKeeping) {
7978 topLevelTarget = bookKeeping . ancestors [ i ] ;
8079 var topLevelTargetID = ReactMount . getID ( topLevelTarget ) || '' ;
8180 ReactEventEmitter . handleTopLevel (
82- topLevelType ,
81+ bookKeeping . topLevelType ,
8382 topLevelTarget ,
8483 topLevelTargetID ,
85- nativeEvent
84+ bookKeeping . nativeEvent
8685 ) ;
8786 }
8887}
8988
9089// 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 ;
9293 this . ancestors = [ ] ;
9394}
9495mixInto ( TopLevelCallbackBookKeeping , {
9596 destructor : function ( ) {
97+ this . topLevelType = null ;
98+ this . nativeEvent = null ;
9699 this . ancestors . length = 0 ;
97100 }
98101} ) ;
99- PooledClass . addPoolingTo ( TopLevelCallbackBookKeeping ) ;
102+ PooledClass . addPoolingTo (
103+ TopLevelCallbackBookKeeping ,
104+ PooledClass . twoArgumentPooler
105+ ) ;
100106
101107/**
102108 * Top-level callback creator used to implement event handling using delegation.
@@ -135,9 +141,14 @@ var ReactEventTopLevelCallback = {
135141 return ;
136142 }
137143
138- var bookKeeping = TopLevelCallbackBookKeeping . getPooled ( ) ;
144+ var bookKeeping = TopLevelCallbackBookKeeping . getPooled (
145+ topLevelType ,
146+ nativeEvent
147+ ) ;
139148 try {
140- handleTopLevelImpl ( topLevelType , nativeEvent , bookKeeping ) ;
149+ // Event queue being processed in the same cycle allows
150+ // `preventDefault`.
151+ ReactUpdates . batchedUpdates ( handleTopLevelImpl , bookKeeping ) ;
141152 } finally {
142153 TopLevelCallbackBookKeeping . release ( bookKeeping ) ;
143154 }
0 commit comments