@samitouri / QOS-React-2 / commits / b3d5b7f8db

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');