From a2ecee5353d39be57ca49c6132eb0ca45d5be254 Mon Sep 17 00:00:00 2001 From: Ben Alpert Date: Fri, 3 Jan 2014 22:43:27 -0700 Subject: [PATCH] Use proper window object for iframe in enter/leave Fixes #788. --- src/eventPlugins/EnterLeaveEventPlugin.js | 13 +++- .../__tests__/EnterLeaveEventPlugin-test.js | 64 +++++++++++++++++++ 2 files changed, 75 insertions(+), 2 deletions(-) create mode 100644 src/eventPlugins/__tests__/EnterLeaveEventPlugin-test.js diff --git a/src/eventPlugins/EnterLeaveEventPlugin.js b/src/eventPlugins/EnterLeaveEventPlugin.js index 41616eeaaa..ac95532983 100644 --- a/src/eventPlugins/EnterLeaveEventPlugin.js +++ b/src/eventPlugins/EnterLeaveEventPlugin.js @@ -81,14 +81,23 @@ var EnterLeaveEventPlugin = { return null; } + var win; + if (topLevelTarget != null && topLevelTarget.window === topLevelTarget) { + // topLevelTarget probably is a window object + win = topLevelTarget; + } else { + var doc = topLevelTarget.ownerDocument; + win = doc.defaultView || doc.parentWindow; + } + var from, to; if (topLevelType === topLevelTypes.topMouseOut) { from = topLevelTarget; to = getFirstReactDOM(nativeEvent.relatedTarget || nativeEvent.toElement) || - window; + win; } else { - from = window; + from = win; to = topLevelTarget; } diff --git a/src/eventPlugins/__tests__/EnterLeaveEventPlugin-test.js b/src/eventPlugins/__tests__/EnterLeaveEventPlugin-test.js new file mode 100644 index 0000000000..edc9478edc --- /dev/null +++ b/src/eventPlugins/__tests__/EnterLeaveEventPlugin-test.js @@ -0,0 +1,64 @@ +/** + * Copyright 2013 Facebook, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * @jsx React.DOM + * @emails react-core + */ + +"use strict"; + +var EnterLeaveEventPlugin; +var EventConstants; +var React; +var ReactMount; + +var topLevelTypes; + +describe('EnterLeaveEventPlugin', function() { + beforeEach(function() { + require('mock-modules').dumpCache(); + + EnterLeaveEventPlugin = require('EnterLeaveEventPlugin'); + EventConstants = require('EventConstants'); + React = require('React'); + ReactMount = require('ReactMount'); + + topLevelTypes = EventConstants.topLevelTypes; + }); + + it('should set relatedTarget properly in iframe', function() { + var iframe = document.createElement('iframe'); + document.body.appendChild(iframe); + + var component = React.renderComponent(
, iframe.contentDocument.body); + var div = component.getDOMNode(); + + var extracted = EnterLeaveEventPlugin.extractEvents( + topLevelTypes.topMouseOver, + div, + ReactMount.getID(div), + {target: div} + ); + expect(extracted.length).toBe(2); + + var leave = extracted[0]; + var enter = extracted[1]; + + expect(leave.target).toBe(iframe.contentWindow); + expect(leave.relatedTarget).toBe(div); + expect(enter.target).toBe(div); + expect(enter.relatedTarget).toBe(iframe.contentWindow); + }); +});