@samitouri / QOS-React-2 / commits / 796f8c353c

put/deleteListener take an instance, not an ID

This removes SimpleEventPlugin's dependency on ReactMount.getID.

Ben Alpert committed Oct 17, 2015 at 20:17 UTC 796f8c353c2a68104672c61ec2cee457bf2de490
9 files changed +128 -126
src/renderers/dom/client/__tests__/ReactBrowserEventEmitter-test.js
+85 -85
@@ -46,14 +46,14 @@ var PARENT;
46 var CHILD;
47
48 function registerSimpleTestHandler() {
49 - EventPluginHub.putListener(getID(CHILD), ON_CLICK_KEY, LISTENER);
50 - var listener = EventPluginHub.getListener(getID(CHILD), ON_CLICK_KEY);
49 + EventPluginHub.putListener(getInternal(CHILD), ON_CLICK_KEY, LISTENER);
50 + var listener = EventPluginHub.getListener(getInternal(CHILD), ON_CLICK_KEY);
51 expect(listener).toEqual(LISTENER);
52 - return EventPluginHub.getListener(getID(CHILD), ON_CLICK_KEY);
52 + return EventPluginHub.getListener(getInternal(CHILD), ON_CLICK_KEY);
53 }
54
55 -function getID(node) {
56 - return ReactDOMComponentTree.getInstanceFromNode(node)._rootNodeID;
55 +function getInternal(node) {
56 + return ReactDOMComponentTree.getInstanceFromNode(node);
57 }
58
59
@@ -87,20 +87,20 @@ describe('ReactBrowserEventEmitter', function() {
87
88 it('should store a listener correctly', function() {
89 registerSimpleTestHandler();
90 - var listener = EventPluginHub.getListener(getID(CHILD), ON_CLICK_KEY);
90 + var listener = EventPluginHub.getListener(getInternal(CHILD), ON_CLICK_KEY);
91 expect(listener).toBe(LISTENER);
92 });
93
94 it('should retrieve a listener correctly', function() {
95 registerSimpleTestHandler();
96 - var listener = EventPluginHub.getListener(getID(CHILD), ON_CLICK_KEY);
96 + var listener = EventPluginHub.getListener(getInternal(CHILD), ON_CLICK_KEY);
97 expect(listener).toEqual(LISTENER);
98 });
99
100 it('should clear all handlers when asked to', function() {
101 registerSimpleTestHandler();
102 - EventPluginHub.deleteAllListeners(getID(CHILD));
103 - var listener = EventPluginHub.getListener(getID(CHILD), ON_CLICK_KEY);
102 + EventPluginHub.deleteAllListeners(getInternal(CHILD));
103 + var listener = EventPluginHub.getListener(getInternal(CHILD), ON_CLICK_KEY);
104 expect(listener).toBe(undefined);
105 });
106
@@ -125,152 +125,152 @@ describe('ReactBrowserEventEmitter', function() {
125
126 it('should bubble simply', function() {
127 EventPluginHub.putListener(
128 - getID(CHILD),
128 + getInternal(CHILD),
129 ON_CLICK_KEY,
130 - recordID.bind(null, getID(CHILD))
130 + recordID.bind(null, getInternal(CHILD))
131 );
132 EventPluginHub.putListener(
133 - getID(PARENT),
133 + getInternal(PARENT),
134 ON_CLICK_KEY,
135 - recordID.bind(null, getID(PARENT))
135 + recordID.bind(null, getInternal(PARENT))
136 );
137 EventPluginHub.putListener(
138 - getID(GRANDPARENT),
138 + getInternal(GRANDPARENT),
139 ON_CLICK_KEY,
140 - recordID.bind(null, getID(GRANDPARENT))
140 + recordID.bind(null, getInternal(GRANDPARENT))
141 );
142 ReactTestUtils.Simulate.click(CHILD);
143 expect(idCallOrder.length).toBe(3);
144 - expect(idCallOrder[0]).toBe(getID(CHILD));
145 - expect(idCallOrder[1]).toBe(getID(PARENT));
146 - expect(idCallOrder[2]).toBe(getID(GRANDPARENT));
144 + expect(idCallOrder[0]).toBe(getInternal(CHILD));
145 + expect(idCallOrder[1]).toBe(getInternal(PARENT));
146 + expect(idCallOrder[2]).toBe(getInternal(GRANDPARENT));
147 });
148
149 it('should continue bubbling if an error is thrown', function() {
150 EventPluginHub.putListener(
151 - getID(CHILD),
151 + getInternal(CHILD),
152 ON_CLICK_KEY,
153 - recordID.bind(null, getID(CHILD))
153 + recordID.bind(null, getInternal(CHILD))
154 );
155 EventPluginHub.putListener(
156 - getID(PARENT),
156 + getInternal(PARENT),
157 ON_CLICK_KEY,
158 function() {
159 - recordID(getID(PARENT));
159 + recordID(getInternal(PARENT));
160 throw new Error('Handler interrupted');
161 }
162 );
163 EventPluginHub.putListener(
164 - getID(GRANDPARENT),
164 + getInternal(GRANDPARENT),
165 ON_CLICK_KEY,
166 - recordID.bind(null, getID(GRANDPARENT))
166 + recordID.bind(null, getInternal(GRANDPARENT))
167 );
168 expect(function() {
169 ReactTestUtils.Simulate.click(CHILD);
170 }).toThrow();
171 expect(idCallOrder.length).toBe(3);
172 - expect(idCallOrder[0]).toBe(getID(CHILD));
173 - expect(idCallOrder[1]).toBe(getID(PARENT));
174 - expect(idCallOrder[2]).toBe(getID(GRANDPARENT));
172 + expect(idCallOrder[0]).toBe(getInternal(CHILD));
173 + expect(idCallOrder[1]).toBe(getInternal(PARENT));
174 + expect(idCallOrder[2]).toBe(getInternal(GRANDPARENT));
175 });
176
177 it('should set currentTarget', function() {
178 EventPluginHub.putListener(
179 - getID(CHILD),
179 + getInternal(CHILD),
180 ON_CLICK_KEY,
181 function(event) {
182 - recordID(getID(CHILD));
182 + recordID(getInternal(CHILD));
183 expect(event.currentTarget).toBe(CHILD);
184 }
185 );
186 EventPluginHub.putListener(
187 - getID(PARENT),
187 + getInternal(PARENT),
188 ON_CLICK_KEY,
189 function(event) {
190 - recordID(getID(PARENT));
190 + recordID(getInternal(PARENT));
191 expect(event.currentTarget).toBe(PARENT);
192 }
193 );
194 EventPluginHub.putListener(
195 - getID(GRANDPARENT),
195 + getInternal(GRANDPARENT),
196 ON_CLICK_KEY,
197 function(event) {
198 - recordID(getID(GRANDPARENT));
198 + recordID(getInternal(GRANDPARENT));
199 expect(event.currentTarget).toBe(GRANDPARENT);
200 }
201 );
202 ReactTestUtils.Simulate.click(CHILD);
203 expect(idCallOrder.length).toBe(3);
204 - expect(idCallOrder[0]).toBe(getID(CHILD));
205 - expect(idCallOrder[1]).toBe(getID(PARENT));
206 - expect(idCallOrder[2]).toBe(getID(GRANDPARENT));
204 + expect(idCallOrder[0]).toBe(getInternal(CHILD));
205 + expect(idCallOrder[1]).toBe(getInternal(PARENT));
206 + expect(idCallOrder[2]).toBe(getInternal(GRANDPARENT));
207 });
208
209 it('should support stopPropagation()', function() {
210 EventPluginHub.putListener(
211 - getID(CHILD),
211 + getInternal(CHILD),
212 ON_CLICK_KEY,
213 - recordID.bind(null, getID(CHILD))
213 + recordID.bind(null, getInternal(CHILD))
214 );
215 EventPluginHub.putListener(
216 - getID(PARENT),
216 + getInternal(PARENT),
217 ON_CLICK_KEY,
218 - recordIDAndStopPropagation.bind(null, getID(PARENT))
218 + recordIDAndStopPropagation.bind(null, getInternal(PARENT))
219 );
220 EventPluginHub.putListener(
221 - getID(GRANDPARENT),
221 + getInternal(GRANDPARENT),
222 ON_CLICK_KEY,
223 - recordID.bind(null, getID(GRANDPARENT))
223 + recordID.bind(null, getInternal(GRANDPARENT))
224 );
225 ReactTestUtils.Simulate.click(CHILD);
226 expect(idCallOrder.length).toBe(2);
227 - expect(idCallOrder[0]).toBe(getID(CHILD));
228 - expect(idCallOrder[1]).toBe(getID(PARENT));
227 + expect(idCallOrder[0]).toBe(getInternal(CHILD));
228 + expect(idCallOrder[1]).toBe(getInternal(PARENT));
229 });
230
231 it('should stop after first dispatch if stopPropagation', function() {
232 EventPluginHub.putListener(
233 - getID(CHILD),
233 + getInternal(CHILD),
234 ON_CLICK_KEY,
235 - recordIDAndStopPropagation.bind(null, getID(CHILD))
235 + recordIDAndStopPropagation.bind(null, getInternal(CHILD))
236 );
237 EventPluginHub.putListener(
238 - getID(PARENT),
238 + getInternal(PARENT),
239 ON_CLICK_KEY,
240 - recordID.bind(null, getID(PARENT))
240 + recordID.bind(null, getInternal(PARENT))
241 );
242 EventPluginHub.putListener(
243 - getID(GRANDPARENT),
243 + getInternal(GRANDPARENT),
244 ON_CLICK_KEY,
245 - recordID.bind(null, getID(GRANDPARENT))
245 + recordID.bind(null, getInternal(GRANDPARENT))
246 );
247 ReactTestUtils.Simulate.click(CHILD);
248 expect(idCallOrder.length).toBe(1);
249 - expect(idCallOrder[0]).toBe(getID(CHILD));
249 + expect(idCallOrder[0]).toBe(getInternal(CHILD));
250 });
251
252 it('should not stopPropagation if false is returned', function() {
253 EventPluginHub.putListener(
254 - getID(CHILD),
254 + getInternal(CHILD),
255 ON_CLICK_KEY,
256 - recordIDAndReturnFalse.bind(null, getID(CHILD))
256 + recordIDAndReturnFalse.bind(null, getInternal(CHILD))
257 );
258 EventPluginHub.putListener(
259 - getID(PARENT),
259 + getInternal(PARENT),
260 ON_CLICK_KEY,
261 - recordID.bind(null, getID(PARENT))
261 + recordID.bind(null, getInternal(PARENT))
262 );
263 EventPluginHub.putListener(
264 - getID(GRANDPARENT),
264 + getInternal(GRANDPARENT),
265 ON_CLICK_KEY,
266 - recordID.bind(null, getID(GRANDPARENT))
266 + recordID.bind(null, getInternal(GRANDPARENT))
267 );
268 spyOn(console, 'error');
269 ReactTestUtils.Simulate.click(CHILD);
270 expect(idCallOrder.length).toBe(3);
271 - expect(idCallOrder[0]).toBe(getID(CHILD));
272 - expect(idCallOrder[1]).toBe(getID(PARENT));
273 - expect(idCallOrder[2]).toBe(getID(GRANDPARENT));
271 + expect(idCallOrder[0]).toBe(getInternal(CHILD));
272 + expect(idCallOrder[1]).toBe(getInternal(PARENT));
273 + expect(idCallOrder[2]).toBe(getInternal(GRANDPARENT));
274 expect(console.error.calls.length).toEqual(0);
275 });
276
@@ -286,15 +286,15 @@ describe('ReactBrowserEventEmitter', function() {
286 it('should invoke handlers that were removed while bubbling', function() {
287 var handleParentClick = jest.genMockFn();
288 var handleChildClick = function(event) {
289 - EventPluginHub.deleteAllListeners(getID(PARENT));
289 + EventPluginHub.deleteAllListeners(getInternal(PARENT));
290 };
291 EventPluginHub.putListener(
292 - getID(CHILD),
292 + getInternal(CHILD),
293 ON_CLICK_KEY,
294 handleChildClick
295 );
296 EventPluginHub.putListener(
297 - getID(PARENT),
297 + getInternal(PARENT),
298 ON_CLICK_KEY,
299 handleParentClick
300 );
@@ -306,13 +306,13 @@ describe('ReactBrowserEventEmitter', function() {
306 var handleParentClick = jest.genMockFn();
307 var handleChildClick = function(event) {
308 EventPluginHub.putListener(
309 - getID(PARENT),
309 + getInternal(PARENT),
310 ON_CLICK_KEY,
311 handleParentClick
312 );
313 };
314 EventPluginHub.putListener(
315 - getID(CHILD),
315 + getInternal(CHILD),
316 ON_CLICK_KEY,
317 handleChildClick
318 );
@@ -322,20 +322,20 @@ describe('ReactBrowserEventEmitter', function() {
322
323 it('should have mouse enter simulated by test utils', function() {
324 EventPluginHub.putListener(
325 - getID(CHILD),
325 + getInternal(CHILD),
326 ON_MOUSE_ENTER_KEY,
327 - recordID.bind(null, getID(CHILD))
327 + recordID.bind(null, getInternal(CHILD))
328 );
329 ReactTestUtils.Simulate.mouseEnter(CHILD);
330 expect(idCallOrder.length).toBe(1);
331 - expect(idCallOrder[0]).toBe(getID(CHILD));
331 + expect(idCallOrder[0]).toBe(getInternal(CHILD));
332 });
333
334 it('should infer onTouchTap from a touchStart/End', function() {
335 EventPluginHub.putListener(
336 - getID(CHILD),
336 + getInternal(CHILD),
337 ON_TOUCH_TAP_KEY,
338 - recordID.bind(null, getID(CHILD))
338 + recordID.bind(null, getInternal(CHILD))
339 );
340 ReactTestUtils.SimulateNative.touchStart(
341 CHILD,
@@ -346,14 +346,14 @@ describe('ReactBrowserEventEmitter', function() {
346 ReactTestUtils.nativeTouchData(0, 0)
347 );
348 expect(idCallOrder.length).toBe(1);
349 - expect(idCallOrder[0]).toBe(getID(CHILD));
349 + expect(idCallOrder[0]).toBe(getInternal(CHILD));
350 });
351
352 it('should infer onTouchTap from when dragging below threshold', function() {
353 EventPluginHub.putListener(
354 - getID(CHILD),
354 + getInternal(CHILD),
355 ON_TOUCH_TAP_KEY,
356 - recordID.bind(null, getID(CHILD))
356 + recordID.bind(null, getInternal(CHILD))
357 );
358 ReactTestUtils.SimulateNative.touchStart(
359 CHILD,
@@ -364,14 +364,14 @@ describe('ReactBrowserEventEmitter', function() {
364 ReactTestUtils.nativeTouchData(0, tapMoveThreshold - 1)
365 );
366 expect(idCallOrder.length).toBe(1);
367 - expect(idCallOrder[0]).toBe(getID(CHILD));
367 + expect(idCallOrder[0]).toBe(getInternal(CHILD));
368 });
369
370 it('should not onTouchTap from when dragging beyond threshold', function() {
371 EventPluginHub.putListener(
372 - getID(CHILD),
372 + getInternal(CHILD),
373 ON_TOUCH_TAP_KEY,
374 - recordID.bind(null, getID(CHILD))
374 + recordID.bind(null, getInternal(CHILD))
375 );
376 ReactTestUtils.SimulateNative.touchStart(
377 CHILD,
@@ -426,19 +426,19 @@ describe('ReactBrowserEventEmitter', function() {
426
427 it('should bubble onTouchTap', function() {
428 EventPluginHub.putListener(
429 - getID(CHILD),
429 + getInternal(CHILD),
430 ON_TOUCH_TAP_KEY,
431 - recordID.bind(null, getID(CHILD))
431 + recordID.bind(null, getInternal(CHILD))
432 );
433 EventPluginHub.putListener(
434 - getID(PARENT),
434 + getInternal(PARENT),
435 ON_TOUCH_TAP_KEY,
436 - recordID.bind(null, getID(PARENT))
436 + recordID.bind(null, getInternal(PARENT))
437 );
438 EventPluginHub.putListener(
439 - getID(GRANDPARENT),
439 + getInternal(GRANDPARENT),
440 ON_TOUCH_TAP_KEY,
441 - recordID.bind(null, getID(GRANDPARENT))
441 + recordID.bind(null, getInternal(GRANDPARENT))
442 );
443 ReactTestUtils.SimulateNative.touchStart(
444 CHILD,
@@ -449,9 +449,9 @@ describe('ReactBrowserEventEmitter', function() {
449 ReactTestUtils.nativeTouchData(0, 0)
450 );
451 expect(idCallOrder.length).toBe(3);
452 - expect(idCallOrder[0]).toBe(getID(CHILD));
453 - expect(idCallOrder[1]).toBe(getID(PARENT));
454 - expect(idCallOrder[2]).toBe(getID(GRANDPARENT));
452 + expect(idCallOrder[0]).toBe(getInternal(CHILD));
453 + expect(idCallOrder[1]).toBe(getInternal(PARENT));
454 + expect(idCallOrder[2]).toBe(getInternal(GRANDPARENT));
455 });
456
457 });
src/renderers/dom/client/eventPlugins/SelectEventPlugin.js
+1 -1
@@ -213,7 +213,7 @@ var SelectEventPlugin = {
213 return null;
214 },
215
216 - didPutListener: function(id, registrationName, listener) {
216 + didPutListener: function(inst, registrationName, listener) {
217 if (registrationName === ON_SELECT_KEY) {
218 hasListener = true;
219 }
src/renderers/dom/client/eventPlugins/SimpleEventPlugin.js
+6 -4
@@ -14,7 +14,7 @@
14 var EventConstants = require('EventConstants');
15 var EventListener = require('EventListener');
16 var EventPropagators = require('EventPropagators');
17 -var ReactMount = require('ReactMount');
17 +var ReactDOMComponentTree = require('ReactDOMComponentTree');
18 var SyntheticClipboardEvent = require('SyntheticClipboardEvent');
19 var SyntheticEvent = require('SyntheticEvent');
20 var SyntheticFocusEvent = require('SyntheticFocusEvent');
@@ -576,13 +576,14 @@ var SimpleEventPlugin = {
576 return event;
577 },
578
579 - didPutListener: function(id, registrationName, listener) {
579 + didPutListener: function(inst, registrationName, listener) {
580 // Mobile Safari does not fire properly bubble click events on
581 // non-interactive elements, which means delegated click listeners do not
582 // fire. The workaround for this bug involves attaching an empty click
583 // listener on the target node.
584 if (registrationName === ON_CLICK_KEY) {
585 - var node = ReactMount.getNode(id);
585 + var id = inst._rootNodeID;
586 + var node = ReactDOMComponentTree.getNodeFromInstance(inst);
587 if (!onClickListeners[id]) {
588 onClickListeners[id] = EventListener.listen(
589 node,
@@ -593,8 +594,9 @@ var SimpleEventPlugin = {
594 }
595 },
596
596 - willDeleteListener: function(id, registrationName) {
597 + willDeleteListener: function(inst, registrationName) {
598 if (registrationName === ON_CLICK_KEY) {
599 + var id = inst._rootNodeID;
600 onClickListeners[id].remove();
601 delete onClickListeners[id];
602 }
src/renderers/dom/shared/ReactDOMComponent.js
+14 -16
@@ -61,8 +61,6 @@ var CHILDREN = keyOf({children: null});
61 var STYLE = keyOf({style: null});
62 var HTML = keyOf({__html: null});
63
64 -var ELEMENT_NODE_TYPE = 1;
65 -
64 function getDeclarationErrorAddendum(internalInstance) {
65 if (internalInstance) {
66 var owner = internalInstance._currentElement._owner || null;
@@ -294,7 +292,7 @@ function assertValidProps(component, props) {
292 );
293 }
294
297 -function enqueuePutListener(id, registrationName, listener, transaction) {
295 +function enqueuePutListener(inst, registrationName, listener, transaction) {
296 if (__DEV__) {
297 // IE8 has no API for event capturing and the `onScroll` event doesn't
298 // bubble.
@@ -303,15 +301,15 @@ function enqueuePutListener(id, registrationName, listener, transaction) {
301 'This browser doesn\'t support the `onScroll` event'
302 );
303 }
306 - var container = ReactMount.findReactContainerForID(id);
307 - if (container) {
308 - var doc = container.nodeType === ELEMENT_NODE_TYPE ?
309 - container.ownerDocument :
310 - container;
311 - listenTo(registrationName, doc);
304 + var containerInfo = inst._nativeContainerInfo;
305 + if (!containerInfo) {
306 + // Server rendering.
307 + return;
308 }
309 + var doc = containerInfo._ownerDocument;
310 + listenTo(registrationName, doc);
311 transaction.getReactMountReady().enqueue(putListener, {
314 - id: id,
312 + inst: inst,
313 registrationName: registrationName,
314 listener: listener,
315 });
@@ -320,7 +318,7 @@ function enqueuePutListener(id, registrationName, listener, transaction) {
318 function putListener() {
319 var listenerToPut = this;
320 EventPluginHub.putListener(
323 - listenerToPut.id,
321 + listenerToPut.inst,
322 listenerToPut.registrationName,
323 listenerToPut.listener
324 );
@@ -729,7 +727,7 @@ ReactDOMComponent.Mixin = {
727 }
728 if (registrationNameModules.hasOwnProperty(propKey)) {
729 if (propValue) {
732 - enqueuePutListener(this._rootNodeID, propKey, propValue, transaction);
730 + enqueuePutListener(this, propKey, propValue, transaction);
731 }
732 } else {
733 if (propKey === STYLE) {
@@ -957,7 +955,7 @@ ReactDOMComponent.Mixin = {
955 // Only call deleteListener if there was a listener previously or
956 // else willDeleteListener gets called when there wasn't actually a
957 // listener (e.g., onClick={null})
960 - deleteListener(this._rootNodeID, propKey);
958 + deleteListener(this, propKey);
959 }
960 } else if (
961 DOMProperty.properties[propKey] ||
@@ -1012,9 +1010,9 @@ ReactDOMComponent.Mixin = {
1010 }
1011 } else if (registrationNameModules.hasOwnProperty(propKey)) {
1012 if (nextProp) {
1015 - enqueuePutListener(this._rootNodeID, propKey, nextProp, transaction);
1013 + enqueuePutListener(this, propKey, nextProp, transaction);
1014 } else if (lastProp) {
1017 - deleteListener(this._rootNodeID, propKey);
1015 + deleteListener(this, propKey);
1016 }
1017 } else if (isCustomComponent(this._tag, nextProps)) {
1018 if (propKey === CHILDREN) {
@@ -1147,7 +1145,7 @@ ReactDOMComponent.Mixin = {
1145
1146 ReactDOMComponentTree.uncacheNode(this);
1147 this.unmountChildren();
1150 - EventPluginHub.deleteAllListeners(this._rootNodeID);
1148 + EventPluginHub.deleteAllListeners(this);
1149 ReactComponentBrowserEnvironment.unmountIDFromEnvironment(this._rootNodeID);
1150 this._rootNodeID = null;
1151 this._wrapperState = null;
src/renderers/dom/shared/__tests__/ReactDOMComponent-test.js
+4 -4
@@ -843,7 +843,7 @@ describe('ReactDOMComponent', function() {
843 describe('unmountComponent', function() {
844 it('should clean up listeners', function() {
845 var EventPluginHub = require('EventPluginHub');
846 - var ReactMount = require('ReactMount');
846 + var ReactDOMComponentTree = require('ReactDOMComponentTree');
847
848 var container = document.createElement('div');
849 document.body.appendChild(container);
@@ -853,16 +853,16 @@ describe('ReactDOMComponent', function() {
853 instance = ReactDOM.render(instance, container);
854
855 var rootNode = ReactDOM.findDOMNode(instance);
856 - var rootNodeID = ReactMount.getID(rootNode);
856 + var inst = ReactDOMComponentTree.getInstanceFromNode(rootNode);
857 expect(
858 - EventPluginHub.getListener(rootNodeID, 'onClick')
858 + EventPluginHub.getListener(inst, 'onClick')
859 ).toBe(callback);
860 expect(rootNode).toBe(ReactDOM.findDOMNode(instance));
861
862 ReactDOM.unmountComponentAtNode(container);
863
864 expect(
865 - EventPluginHub.getListener(rootNodeID, 'onClick')
865 + EventPluginHub.getListener(inst, 'onClick')
866 ).toBe(undefined);
867 });
868 });
src/renderers/shared/event/EventPluginHub.js
+12 -12
@@ -102,7 +102,7 @@ var EventPluginHub = {
102 * @param {string} registrationName Name of listener (e.g. `onClick`).
103 * @param {?function} listener The callback to store.
104 */
105 - putListener: function(id, registrationName, listener) {
105 + putListener: function(inst, registrationName, listener) {
106 invariant(
107 typeof listener === 'function',
108 'Expected %s listener to be a function, instead got type %s',
@@ -111,12 +111,12 @@ var EventPluginHub = {
111
112 var bankForRegistrationName =
113 listenerBank[registrationName] || (listenerBank[registrationName] = {});
114 - bankForRegistrationName[id] = listener;
114 + bankForRegistrationName[inst._rootNodeID] = listener;
115
116 var PluginModule =
117 EventPluginRegistry.registrationNameModules[registrationName];
118 if (PluginModule && PluginModule.didPutListener) {
119 - PluginModule.didPutListener(id, registrationName, listener);
119 + PluginModule.didPutListener(inst, registrationName, listener);
120 }
121 },
122
@@ -125,9 +125,9 @@ var EventPluginHub = {
125 * @param {string} registrationName Name of listener (e.g. `onClick`).
126 * @return {?function} The stored callback.
127 */
128 - getListener: function(id, registrationName) {
128 + getListener: function(inst, registrationName) {
129 var bankForRegistrationName = listenerBank[registrationName];
130 - return bankForRegistrationName && bankForRegistrationName[id];
130 + return bankForRegistrationName && bankForRegistrationName[inst._rootNodeID];
131 },
132
133 /**
@@ -136,17 +136,17 @@ var EventPluginHub = {
136 * @param {string} id ID of the DOM element.
137 * @param {string} registrationName Name of listener (e.g. `onClick`).
138 */
139 - deleteListener: function(id, registrationName) {
139 + deleteListener: function(inst, registrationName) {
140 var PluginModule =
141 EventPluginRegistry.registrationNameModules[registrationName];
142 if (PluginModule && PluginModule.willDeleteListener) {
143 - PluginModule.willDeleteListener(id, registrationName);
143 + PluginModule.willDeleteListener(inst, registrationName);
144 }
145
146 var bankForRegistrationName = listenerBank[registrationName];
147 // TODO: This should never be null -- when is it?
148 if (bankForRegistrationName) {
149 - delete bankForRegistrationName[id];
149 + delete bankForRegistrationName[inst._rootNodeID];
150 }
151 },
152
@@ -155,19 +155,19 @@ var EventPluginHub = {
155 *
156 * @param {string} id ID of the DOM element.
157 */
158 - deleteAllListeners: function(id) {
158 + deleteAllListeners: function(inst) {
159 for (var registrationName in listenerBank) {
160 - if (!listenerBank[registrationName][id]) {
160 + if (!listenerBank[registrationName][inst._rootNodeID]) {
161 continue;
162 }
163
164 var PluginModule =
165 EventPluginRegistry.registrationNameModules[registrationName];
166 if (PluginModule && PluginModule.willDeleteListener) {
167 - PluginModule.willDeleteListener(id, registrationName);
167 + PluginModule.willDeleteListener(inst, registrationName);
168 }
169
170 - delete listenerBank[registrationName][id];
170 + delete listenerBank[registrationName][inst._rootNodeID];
171 }
172 },
173
src/renderers/shared/event/EventPropagators.js
+2 -2
@@ -29,7 +29,7 @@ var getListener = EventPluginHub.getListener;
29 function listenerAtPhase(inst, event, propagationPhase) {
30 var registrationName =
31 event.dispatchConfig.phasedRegistrationNames[propagationPhase];
32 - return getListener(inst._rootNodeID, registrationName);
32 + return getListener(inst, registrationName);
33 }
34
35 /**
@@ -96,7 +96,7 @@ function accumulateTwoPhaseDispatchesSingleSkipTarget(event) {
96 function accumulateDispatches(inst, ignoredDirection, event) {
97 if (event && event.dispatchConfig.registrationName) {
98 var registrationName = event.dispatchConfig.registrationName;
99 - var listener = getListener(inst._rootNodeID, registrationName);
99 + var listener = getListener(inst, registrationName);
100 if (listener) {
101 event._dispatchListeners =
102 accumulateInto(event._dispatchListeners, listener);
src/renderers/shared/event/eventPlugins/__tests__/ResponderEventPlugin-test.js
+1 -1
@@ -237,7 +237,7 @@ var registerTestHandlers = function(eventTestConfig, readableIDToID) {
237 }
238 return nodeConfig.returnVal;
239 }.bind(null, readableID, nodeConfig);
240 - EventPluginHub.putListener(id, registrationName, handler);
240 + EventPluginHub.putListener(idToInstance[id], registrationName, handler);
241 }
242 };
243 /*eslint-enable no-loop-func, no-shadow */
src/test/ReactDefaultPerf.js
+3 -1
@@ -203,7 +203,9 @@ var ReactDefaultPerf = {
203 } else {
204 // basic format
205 var id = args[0];
206 - if (typeof id === 'object') {
206 + if (moduleName === 'EventPluginHub') {
207 + id = id._rootNodeID;
208 + } else if (typeof id === 'object') {
209 id = ReactMount.getID(args[0]);
210 }
211 ReactDefaultPerf._recordWrite(