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
+});