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

Use proper window object for iframe in enter/leave

Fixes #788.

Ben Alpert committed Jan 3, 2014 at 22:43 UTC a2ecee5353d39be57ca49c6132eb0ca45d5be254
2 files changed +75 -2
src/eventPlugins/EnterLeaveEventPlugin.js
+11 -2
@@ -81,14 +81,23 @@ var EnterLeaveEventPlugin = {
81 return null;
82 }
83
84 + var win;
85 + if (topLevelTarget != null && topLevelTarget.window === topLevelTarget) {
86 + // topLevelTarget probably is a window object
87 + win = topLevelTarget;
88 + } else {
89 + var doc = topLevelTarget.ownerDocument;
90 + win = doc.defaultView || doc.parentWindow;
91 + }
92 +
93 var from, to;
94 if (topLevelType === topLevelTypes.topMouseOut) {
95 from = topLevelTarget;
96 to =
97 getFirstReactDOM(nativeEvent.relatedTarget || nativeEvent.toElement) ||
89 - window;
98 + win;
99 } else {
91 - from = window;
100 + from = win;
101 to = topLevelTarget;
102 }
103
src/eventPlugins/__tests__/EnterLeaveEventPlugin-test.js new
+64
@@ -0,0 +1,64 @@
1 +/**
2 + * Copyright 2013 Facebook, Inc.
3 + *
4 + * Licensed under the Apache License, Version 2.0 (the "License");
5 + * you may not use this file except in compliance with the License.
6 + * You may obtain a copy of the License at
7 + *
8 + * http://www.apache.org/licenses/LICENSE-2.0
9 + *
10 + * Unless required by applicable law or agreed to in writing, software
11 + * distributed under the License is distributed on an "AS IS" BASIS,
12 + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 + * See the License for the specific language governing permissions and
14 + * limitations under the License.
15 + *
16 + * @jsx React.DOM
17 + * @emails react-core
18 + */
19 +
20 +"use strict";
21 +
22 +var EnterLeaveEventPlugin;
23 +var EventConstants;
24 +var React;
25 +var ReactMount;
26 +
27 +var topLevelTypes;
28 +
29 +describe('EnterLeaveEventPlugin', function() {
30 + beforeEach(function() {
31 + require('mock-modules').dumpCache();
32 +
33 + EnterLeaveEventPlugin = require('EnterLeaveEventPlugin');
34 + EventConstants = require('EventConstants');
35 + React = require('React');
36 + ReactMount = require('ReactMount');
37 +
38 + topLevelTypes = EventConstants.topLevelTypes;
39 + });
40 +
41 + it('should set relatedTarget properly in iframe', function() {
42 + var iframe = document.createElement('iframe');
43 + document.body.appendChild(iframe);
44 +
45 + var component = React.renderComponent(<div />, iframe.contentDocument.body);
46 + var div = component.getDOMNode();
47 +
48 + var extracted = EnterLeaveEventPlugin.extractEvents(
49 + topLevelTypes.topMouseOver,
50 + div,
51 + ReactMount.getID(div),
52 + {target: div}
53 + );
54 + expect(extracted.length).toBe(2);
55 +
56 + var leave = extracted[0];
57 + var enter = extracted[1];
58 +
59 + expect(leave.target).toBe(iframe.contentWindow);
60 + expect(leave.relatedTarget).toBe(div);
61 + expect(enter.target).toBe(div);
62 + expect(enter.relatedTarget).toBe(iframe.contentWindow);
63 + });
64 +});