Merge pull request #5192 from spicyj/ev-ind

Remove unnecessary indirection in events
This commit is contained in:
Ben Alpert
2015-10-16 21:43:09 -07:00
7 changed files with 60 additions and 77 deletions
@@ -13,10 +13,8 @@
'use strict';
var EventConstants = require('EventConstants');
var EventPluginHub = require('EventPluginHub');
var EventPluginRegistry = require('EventPluginRegistry');
var ReactEventEmitterMixin = require('ReactEventEmitterMixin');
var ReactPerf = require('ReactPerf');
var ViewportMetrics = require('ViewportMetrics');
var assign = require('Object.assign');
@@ -166,7 +164,7 @@ function getListeningForDocument(mountAt) {
* `ReactBrowserEventEmitter` is used to attach top-level event listeners. For
* example:
*
* ReactBrowserEventEmitter.putListener('myID', 'onClick', myFunction);
* EventPluginHub.putListener('myID', 'onClick', myFunction);
*
* This would allocate a "registration" of `('onClick', myFunction)` on 'myID'.
*
@@ -360,23 +358,6 @@ var ReactBrowserEventEmitter = assign({}, ReactEventEmitterMixin, {
}
},
eventNameDispatchConfigs: EventPluginHub.eventNameDispatchConfigs,
registrationNameModules: EventPluginHub.registrationNameModules,
putListener: EventPluginHub.putListener,
getListener: EventPluginHub.getListener,
deleteListener: EventPluginHub.deleteListener,
deleteAllListeners: EventPluginHub.deleteAllListeners,
});
ReactPerf.measureMethods(ReactBrowserEventEmitter, 'ReactBrowserEventEmitter', {
putListener: 'putListener',
deleteListener: 'deleteListener',
});
module.exports = ReactBrowserEventEmitter;
@@ -25,6 +25,7 @@ var oldGetNode;
var oldGetFirstReactDOM;
var EventPluginHub;
var EventPluginRegistry;
var ReactBrowserEventEmitter;
var ReactTestUtils;
var TapEventPlugin;
@@ -66,11 +67,10 @@ setID(PARENT, '.0.0.0');
setID(GRANDPARENT, '.0.0');
function registerSimpleTestHandler() {
ReactBrowserEventEmitter.putListener(getID(CHILD), ON_CLICK_KEY, LISTENER);
var listener =
ReactBrowserEventEmitter.getListener(getID(CHILD), ON_CLICK_KEY);
EventPluginHub.putListener(getID(CHILD), ON_CLICK_KEY, LISTENER);
var listener = EventPluginHub.getListener(getID(CHILD), ON_CLICK_KEY);
expect(listener).toEqual(LISTENER);
return ReactBrowserEventEmitter.getListener(getID(CHILD), ON_CLICK_KEY);
return EventPluginHub.getListener(getID(CHILD), ON_CLICK_KEY);
}
@@ -79,6 +79,7 @@ describe('ReactBrowserEventEmitter', function() {
require('mock-modules').dumpCache();
LISTENER.mockClear();
EventPluginHub = require('EventPluginHub');
EventPluginRegistry = require('EventPluginRegistry');
TapEventPlugin = require('TapEventPlugin');
ReactMount = require('ReactMount');
EventListener = require('EventListener');
@@ -108,23 +109,20 @@ describe('ReactBrowserEventEmitter', function() {
it('should store a listener correctly', function() {
registerSimpleTestHandler();
var listener =
ReactBrowserEventEmitter.getListener(getID(CHILD), ON_CLICK_KEY);
var listener = EventPluginHub.getListener(getID(CHILD), ON_CLICK_KEY);
expect(listener).toBe(LISTENER);
});
it('should retrieve a listener correctly', function() {
registerSimpleTestHandler();
var listener =
ReactBrowserEventEmitter.getListener(getID(CHILD), ON_CLICK_KEY);
var listener = EventPluginHub.getListener(getID(CHILD), ON_CLICK_KEY);
expect(listener).toEqual(LISTENER);
});
it('should clear all handlers when asked to', function() {
registerSimpleTestHandler();
ReactBrowserEventEmitter.deleteAllListeners(getID(CHILD));
var listener =
ReactBrowserEventEmitter.getListener(getID(CHILD), ON_CLICK_KEY);
EventPluginHub.deleteAllListeners(getID(CHILD));
var listener = EventPluginHub.getListener(getID(CHILD), ON_CLICK_KEY);
expect(listener).toBe(undefined);
});
@@ -148,17 +146,17 @@ describe('ReactBrowserEventEmitter', function() {
);
it('should bubble simply', function() {
ReactBrowserEventEmitter.putListener(
EventPluginHub.putListener(
getID(CHILD),
ON_CLICK_KEY,
recordID.bind(null, getID(CHILD))
);
ReactBrowserEventEmitter.putListener(
EventPluginHub.putListener(
getID(PARENT),
ON_CLICK_KEY,
recordID.bind(null, getID(PARENT))
);
ReactBrowserEventEmitter.putListener(
EventPluginHub.putListener(
getID(GRANDPARENT),
ON_CLICK_KEY,
recordID.bind(null, getID(GRANDPARENT))
@@ -171,12 +169,12 @@ describe('ReactBrowserEventEmitter', function() {
});
it('should continue bubbling if an error is thrown', function() {
ReactBrowserEventEmitter.putListener(
EventPluginHub.putListener(
getID(CHILD),
ON_CLICK_KEY,
recordID.bind(null, getID(CHILD))
);
ReactBrowserEventEmitter.putListener(
EventPluginHub.putListener(
getID(PARENT),
ON_CLICK_KEY,
function() {
@@ -184,7 +182,7 @@ describe('ReactBrowserEventEmitter', function() {
throw new Error('Handler interrupted');
}
);
ReactBrowserEventEmitter.putListener(
EventPluginHub.putListener(
getID(GRANDPARENT),
ON_CLICK_KEY,
recordID.bind(null, getID(GRANDPARENT))
@@ -199,7 +197,7 @@ describe('ReactBrowserEventEmitter', function() {
});
it('should set currentTarget', function() {
ReactBrowserEventEmitter.putListener(
EventPluginHub.putListener(
getID(CHILD),
ON_CLICK_KEY,
function(event) {
@@ -207,7 +205,7 @@ describe('ReactBrowserEventEmitter', function() {
expect(event.currentTarget).toBe(CHILD);
}
);
ReactBrowserEventEmitter.putListener(
EventPluginHub.putListener(
getID(PARENT),
ON_CLICK_KEY,
function(event) {
@@ -215,7 +213,7 @@ describe('ReactBrowserEventEmitter', function() {
expect(event.currentTarget).toBe(PARENT);
}
);
ReactBrowserEventEmitter.putListener(
EventPluginHub.putListener(
getID(GRANDPARENT),
ON_CLICK_KEY,
function(event) {
@@ -231,17 +229,17 @@ describe('ReactBrowserEventEmitter', function() {
});
it('should support stopPropagation()', function() {
ReactBrowserEventEmitter.putListener(
EventPluginHub.putListener(
getID(CHILD),
ON_CLICK_KEY,
recordID.bind(null, getID(CHILD))
);
ReactBrowserEventEmitter.putListener(
EventPluginHub.putListener(
getID(PARENT),
ON_CLICK_KEY,
recordIDAndStopPropagation.bind(null, getID(PARENT))
);
ReactBrowserEventEmitter.putListener(
EventPluginHub.putListener(
getID(GRANDPARENT),
ON_CLICK_KEY,
recordID.bind(null, getID(GRANDPARENT))
@@ -253,17 +251,17 @@ describe('ReactBrowserEventEmitter', function() {
});
it('should stop after first dispatch if stopPropagation', function() {
ReactBrowserEventEmitter.putListener(
EventPluginHub.putListener(
getID(CHILD),
ON_CLICK_KEY,
recordIDAndStopPropagation.bind(null, getID(CHILD))
);
ReactBrowserEventEmitter.putListener(
EventPluginHub.putListener(
getID(PARENT),
ON_CLICK_KEY,
recordID.bind(null, getID(PARENT))
);
ReactBrowserEventEmitter.putListener(
EventPluginHub.putListener(
getID(GRANDPARENT),
ON_CLICK_KEY,
recordID.bind(null, getID(GRANDPARENT))
@@ -274,17 +272,17 @@ describe('ReactBrowserEventEmitter', function() {
});
it('should not stopPropagation if false is returned', function() {
ReactBrowserEventEmitter.putListener(
EventPluginHub.putListener(
getID(CHILD),
ON_CLICK_KEY,
recordIDAndReturnFalse.bind(null, getID(CHILD))
);
ReactBrowserEventEmitter.putListener(
EventPluginHub.putListener(
getID(PARENT),
ON_CLICK_KEY,
recordID.bind(null, getID(PARENT))
);
ReactBrowserEventEmitter.putListener(
EventPluginHub.putListener(
getID(GRANDPARENT),
ON_CLICK_KEY,
recordID.bind(null, getID(GRANDPARENT))
@@ -310,14 +308,14 @@ describe('ReactBrowserEventEmitter', function() {
it('should invoke handlers that were removed while bubbling', function() {
var handleParentClick = mocks.getMockFunction();
var handleChildClick = function(event) {
ReactBrowserEventEmitter.deleteAllListeners(getID(PARENT));
EventPluginHub.deleteAllListeners(getID(PARENT));
};
ReactBrowserEventEmitter.putListener(
EventPluginHub.putListener(
getID(CHILD),
ON_CLICK_KEY,
handleChildClick
);
ReactBrowserEventEmitter.putListener(
EventPluginHub.putListener(
getID(PARENT),
ON_CLICK_KEY,
handleParentClick
@@ -329,13 +327,13 @@ describe('ReactBrowserEventEmitter', function() {
it('should not invoke newly inserted handlers while bubbling', function() {
var handleParentClick = mocks.getMockFunction();
var handleChildClick = function(event) {
ReactBrowserEventEmitter.putListener(
EventPluginHub.putListener(
getID(PARENT),
ON_CLICK_KEY,
handleParentClick
);
};
ReactBrowserEventEmitter.putListener(
EventPluginHub.putListener(
getID(CHILD),
ON_CLICK_KEY,
handleChildClick
@@ -345,7 +343,7 @@ describe('ReactBrowserEventEmitter', function() {
});
it('should have mouse enter simulated by test utils', function() {
ReactBrowserEventEmitter.putListener(
EventPluginHub.putListener(
getID(CHILD),
ON_MOUSE_ENTER_KEY,
recordID.bind(null, getID(CHILD))
@@ -356,7 +354,7 @@ describe('ReactBrowserEventEmitter', function() {
});
it('should infer onTouchTap from a touchStart/End', function() {
ReactBrowserEventEmitter.putListener(
EventPluginHub.putListener(
getID(CHILD),
ON_TOUCH_TAP_KEY,
recordID.bind(null, getID(CHILD))
@@ -374,7 +372,7 @@ describe('ReactBrowserEventEmitter', function() {
});
it('should infer onTouchTap from when dragging below threshold', function() {
ReactBrowserEventEmitter.putListener(
EventPluginHub.putListener(
getID(CHILD),
ON_TOUCH_TAP_KEY,
recordID.bind(null, getID(CHILD))
@@ -392,7 +390,7 @@ describe('ReactBrowserEventEmitter', function() {
});
it('should not onTouchTap from when dragging beyond threshold', function() {
ReactBrowserEventEmitter.putListener(
EventPluginHub.putListener(
getID(CHILD),
ON_TOUCH_TAP_KEY,
recordID.bind(null, getID(CHILD))
@@ -439,8 +437,7 @@ describe('ReactBrowserEventEmitter', function() {
setEventListeners.push(captureCalls[i][1]);
}
var module =
ReactBrowserEventEmitter.registrationNameModules[ON_CHANGE_KEY];
var module = EventPluginRegistry.registrationNameModules[ON_CHANGE_KEY];
var dependencies = module.eventTypes.change.dependencies;
expect(setEventListeners.length).toEqual(dependencies.length);
@@ -450,17 +447,17 @@ describe('ReactBrowserEventEmitter', function() {
});
it('should bubble onTouchTap', function() {
ReactBrowserEventEmitter.putListener(
EventPluginHub.putListener(
getID(CHILD),
ON_TOUCH_TAP_KEY,
recordID.bind(null, getID(CHILD))
);
ReactBrowserEventEmitter.putListener(
EventPluginHub.putListener(
getID(PARENT),
ON_TOUCH_TAP_KEY,
recordID.bind(null, getID(PARENT))
);
ReactBrowserEventEmitter.putListener(
EventPluginHub.putListener(
getID(GRANDPARENT),
ON_TOUCH_TAP_KEY,
recordID.bind(null, getID(GRANDPARENT))
@@ -20,6 +20,8 @@ var DOMNamespaces = require('DOMNamespaces');
var DOMProperty = require('DOMProperty');
var DOMPropertyOperations = require('DOMPropertyOperations');
var EventConstants = require('EventConstants');
var EventPluginHub = require('EventPluginHub');
var EventPluginRegistry = require('EventPluginRegistry');
var ReactBrowserEventEmitter = require('ReactBrowserEventEmitter');
var ReactComponentBrowserEnvironment =
require('ReactComponentBrowserEnvironment');
@@ -45,9 +47,9 @@ var shallowEqual = require('shallowEqual');
var validateDOMNesting = require('validateDOMNesting');
var warning = require('warning');
var deleteListener = ReactBrowserEventEmitter.deleteListener;
var deleteListener = EventPluginHub.deleteListener;
var listenTo = ReactBrowserEventEmitter.listenTo;
var registrationNameModules = ReactBrowserEventEmitter.registrationNameModules;
var registrationNameModules = EventPluginRegistry.registrationNameModules;
// For quickly matching children type, to test if can be treated as content.
var CONTENT_TYPES = {'string': true, 'number': true};
@@ -312,7 +314,7 @@ function enqueuePutListener(id, registrationName, listener, transaction) {
function putListener() {
var listenerToPut = this;
ReactBrowserEventEmitter.putListener(
EventPluginHub.putListener(
listenerToPut.id,
listenerToPut.registrationName,
listenerToPut.listener
@@ -1146,7 +1148,7 @@ ReactDOMComponent.Mixin = {
this._nativeNode = null;
this.unmountChildren();
ReactBrowserEventEmitter.deleteAllListeners(this._rootNodeID);
EventPluginHub.deleteAllListeners(this._rootNodeID);
ReactComponentBrowserEnvironment.unmountIDFromEnvironment(this._rootNodeID);
this._rootNodeID = null;
this._wrapperState = null;
@@ -819,7 +819,7 @@ describe('ReactDOMComponent', function() {
describe('unmountComponent', function() {
it('should clean up listeners', function() {
var ReactBrowserEventEmitter = require('ReactBrowserEventEmitter');
var EventPluginHub = require('EventPluginHub');
var ReactMount = require('ReactMount');
var container = document.createElement('div');
@@ -832,14 +832,14 @@ describe('ReactDOMComponent', function() {
var rootNode = ReactDOM.findDOMNode(instance);
var rootNodeID = ReactMount.getID(rootNode);
expect(
ReactBrowserEventEmitter.getListener(rootNodeID, 'onClick')
EventPluginHub.getListener(rootNodeID, 'onClick')
).toBe(callback);
expect(rootNode).toBe(ReactDOM.findDOMNode(instance));
ReactDOM.unmountComponentAtNode(container);
expect(
ReactBrowserEventEmitter.getListener(rootNodeID, 'onClick')
EventPluginHub.getListener(rootNodeID, 'onClick')
).toBe(undefined);
});
});
+6 -4
View File
@@ -14,6 +14,7 @@
var EventPluginRegistry = require('EventPluginRegistry');
var EventPluginUtils = require('EventPluginUtils');
var ReactErrorUtils = require('ReactErrorUtils');
var ReactPerf = require('ReactPerf');
var accumulateInto = require('accumulateInto');
var forEachAccumulated = require('forEachAccumulated');
@@ -137,10 +138,6 @@ var EventPluginHub = {
},
eventNameDispatchConfigs: EventPluginRegistry.eventNameDispatchConfigs,
registrationNameModules: EventPluginRegistry.registrationNameModules,
/**
* Stores `listener` at `listenerBank[registrationName][id]`. Is idempotent.
*
@@ -311,4 +308,9 @@ var EventPluginHub = {
};
ReactPerf.measureMethods(EventPluginHub, 'EventPluginHub', {
putListener: 'putListener',
deleteListener: 'deleteListener',
});
module.exports = EventPluginHub;
+1 -1
View File
@@ -165,7 +165,7 @@ var ReactDefaultPerf = {
].totalTime = performanceNow() - start;
return rv;
} else if (fnName === '_mountImageIntoNode' ||
moduleName === 'ReactBrowserEventEmitter' ||
moduleName === 'EventPluginHub' ||
moduleName === 'ReactDOMIDOperations' ||
moduleName === 'CSSPropertyOperations' ||
moduleName === 'DOMChildrenOperations' ||
+3 -2
View File
@@ -14,6 +14,7 @@
var ClientReactRootIndex = require('ClientReactRootIndex');
var EventConstants = require('EventConstants');
var EventPluginHub = require('EventPluginHub');
var EventPluginRegistry = require('EventPluginRegistry');
var EventPropagators = require('EventPropagators');
var React = require('React');
var ReactDOM = require('ReactDOM');
@@ -476,7 +477,7 @@ function makeSimulator(eventType) {
}
var dispatchConfig =
ReactBrowserEventEmitter.eventNameDispatchConfigs[eventType];
EventPluginRegistry.eventNameDispatchConfigs[eventType];
var fakeNativeEvent = new Event();
fakeNativeEvent.target = node;
@@ -507,7 +508,7 @@ function buildSimulators() {
ReactTestUtils.Simulate = {};
var eventType;
for (eventType in ReactBrowserEventEmitter.eventNameDispatchConfigs) {
for (eventType in EventPluginRegistry.eventNameDispatchConfigs) {
/**
* @param {!Element|ReactDOMComponent} domComponentOrNode
* @param {?object} eventData Fake event data to use in SyntheticEvent.