From b3d5b7f8db1a12831dd2c3b0f37c2af358faee0e Mon Sep 17 00:00:00 2001 From: Jim Date: Tue, 28 Jul 2015 19:59:35 -0700 Subject: [PATCH] Fixed global events (like enter/leave events) when event has path. --- .../dom/client/ReactEventListener.js | 11 ++++++++++ .../__tests__/ReactEventListener-test.js | 20 +++++++++++++++++++ 2 files changed, 31 insertions(+) diff --git a/src/renderers/dom/client/ReactEventListener.js b/src/renderers/dom/client/ReactEventListener.js index d1e867db30..b2d328e3b9 100644 --- a/src/renderers/dom/client/ReactEventListener.js +++ b/src/renderers/dom/client/ReactEventListener.js @@ -104,6 +104,7 @@ function handleTopLevelWithoutPath(bookKeeping) { function handleTopLevelWithPath(bookKeeping) { var path = bookKeeping.nativeEvent.path; var currentNativeTarget = path[0]; + var eventsFired = 0; for (var i = 0; i < path.length; i++) { var currentPathElement = path[i]; var currentPathElementID = ReactMount.getID(currentPathElement); @@ -117,6 +118,7 @@ function handleTopLevelWithPath(bookKeeping) { bookKeeping.ancestors.push(currentPathElement); var topLevelTargetID = ReactMount.getID(currentPathElement) || ''; + eventsFired++; ReactEventListener._handleTopLevel( bookKeeping.topLevelType, currentPathElement, @@ -133,6 +135,15 @@ function handleTopLevelWithPath(bookKeeping) { } } } + if (eventsFired === 0) { + ReactEventListener._handleTopLevel( + bookKeeping.topLevelType, + window, + '', + bookKeeping.nativeEvent, + getEventTarget(bookKeeping.nativeEvent) + ); + } } function scrollValueMonitor(cb) { diff --git a/src/renderers/dom/client/__tests__/ReactEventListener-test.js b/src/renderers/dom/client/__tests__/ReactEventListener-test.js index 6aba363c6b..c8037150f9 100644 --- a/src/renderers/dom/client/__tests__/ReactEventListener-test.js +++ b/src/renderers/dom/client/__tests__/ReactEventListener-test.js @@ -36,6 +36,26 @@ describe('ReactEventListener', function() { ReactEventListener._handleTopLevel = handleTopLevel; }); + it('should dispatch events from outside React tree', function() { + var otherNode = document.createElement('h1'); + var component = ReactMount.render(
, document.createElement('div')); + expect(handleTopLevel.mock.calls.length).toBe(0); + ReactEventListener.dispatchEvent( + 'topMouseOut', + { + type: 'mouseout', + fromElement: otherNode, + target: otherNode, + srcElement: otherNode, + toElement: React.findDOMNode(component), + relatedTarget: React.findDOMNode(component), + view: window, + path: [otherNode, otherNode], + }, + ); + expect(handleTopLevel.mock.calls.length).toBe(1); + }); + describe('Propagation', function() { it('should propagate events one level down', function() { var childContainer = document.createElement('div');