Fixed global events (like enter/leave events) when event has path.
Jim committed
Jul 28, 2015 at 19:59 UTC
b3d5b7f8db1a12831dd2c3b0f37c2af358faee0e
2 files changed
+31
src/renderers/dom/client/ReactEventListener.js
+11
@@ -104,6 +104,7 @@ function handleTopLevelWithoutPath(bookKeeping) {
104
function handleTopLevelWithPath(bookKeeping) {
105
var path = bookKeeping.nativeEvent.path;
106
var currentNativeTarget = path[0];
107
+ var eventsFired = 0;
108
for (var i = 0; i < path.length; i++) {
109
var currentPathElement = path[i];
110
var currentPathElementID = ReactMount.getID(currentPathElement);
@@ -117,6 +118,7 @@ function handleTopLevelWithPath(bookKeeping) {
118
bookKeeping.ancestors.push(currentPathElement);
119
120
var topLevelTargetID = ReactMount.getID(currentPathElement) || '';
121
+ eventsFired++;
122
ReactEventListener._handleTopLevel(
123
bookKeeping.topLevelType,
124
currentPathElement,
@@ -133,6 +135,15 @@ function handleTopLevelWithPath(bookKeeping) {
135
}
136
}
137
}
138
+ if (eventsFired === 0) {
139
+ ReactEventListener._handleTopLevel(
140
+ bookKeeping.topLevelType,
141
+ window,
142
+ '',
143
+ bookKeeping.nativeEvent,
144
+ getEventTarget(bookKeeping.nativeEvent)
145
+ );
146
+ }
147
}
148
149
function scrollValueMonitor(cb) {
src/renderers/dom/client/__tests__/ReactEventListener-test.js
+20
@@ -36,6 +36,26 @@ describe('ReactEventListener', function() {
36
ReactEventListener._handleTopLevel = handleTopLevel;
37
});
38
39
+ it('should dispatch events from outside React tree', function() {
40
+ var otherNode = document.createElement('h1');
41
+ var component = ReactMount.render(<div />, document.createElement('div'));
42
+ expect(handleTopLevel.mock.calls.length).toBe(0);
43
+ ReactEventListener.dispatchEvent(
44
+ 'topMouseOut',
45
+ {
46
+ type: 'mouseout',
47
+ fromElement: otherNode,
48
+ target: otherNode,
49
+ srcElement: otherNode,
50
+ toElement: React.findDOMNode(component),
51
+ relatedTarget: React.findDOMNode(component),
52
+ view: window,
53
+ path: [otherNode, otherNode],
54
+ },
55
+ );
56
+ expect(handleTopLevel.mock.calls.length).toBe(1);
57
+ });
58
+
59
describe('Propagation', function() {
60
it('should propagate events one level down', function() {
61
var childContainer = document.createElement('div');