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(