9
9
10
10
'use strict' ;
11
11
12
- var SyntheticEvent ;
13
12
var React ;
14
13
var ReactDOM ;
15
14
var ReactTestUtils ;
16
15
17
16
describe ( 'SyntheticEvent' , ( ) => {
18
- var createEvent ;
17
+ var container ;
19
18
20
19
beforeEach ( ( ) => {
21
- // TODO: can we express this test with only public API?
22
- SyntheticEvent = require ( 'events/SyntheticEvent' ) . default ;
23
20
React = require ( 'react' ) ;
24
21
ReactDOM = require ( 'react-dom' ) ;
25
22
ReactTestUtils = require ( 'react-dom/test-utils' ) ;
26
23
27
- createEvent = function ( nativeEvent ) {
28
- var target = require ( '../getEventTarget' ) . default ( nativeEvent ) ;
29
- return SyntheticEvent . getPooled ( { } , '' , nativeEvent , target ) ;
30
- } ;
24
+ container = document . createElement ( 'div' ) ;
25
+ document . body . appendChild ( container ) ;
26
+ } ) ;
27
+
28
+ afterEach ( ( ) => {
29
+ document . body . removeChild ( container ) ;
30
+ container = null ;
31
31
} ) ;
32
32
33
33
it ( 'should normalize `target` from the nativeEvent' , ( ) => {
34
- var target = document . createElement ( 'div' ) ;
35
- var syntheticEvent = createEvent ( { srcElement : target } ) ;
34
+ var node ;
35
+ var expectedCount = 0 ;
36
+
37
+ var eventHandler = syntheticEvent => {
38
+ expect ( syntheticEvent . target ) . toBe ( node ) ;
39
+
40
+ expectedCount ++ ;
41
+ } ;
42
+ node = ReactDOM . render ( < div onClick = { eventHandler } /> , container ) ;
43
+
44
+ var event = document . createEvent ( 'Event' ) ;
45
+ event . initEvent ( 'click' , true , true ) ;
46
+ // Emulate IE8
47
+ Object . defineProperty ( event , 'target' , {
48
+ get ( ) { } ,
49
+ } ) ;
50
+ Object . defineProperty ( event , 'srcElement' , {
51
+ get ( ) {
52
+ return node ;
53
+ } ,
54
+ } ) ;
55
+ node . dispatchEvent ( event ) ;
36
56
37
- expect ( syntheticEvent . target ) . toBe ( target ) ;
38
- expect ( syntheticEvent . type ) . toBe ( undefined ) ;
57
+ expect ( expectedCount ) . toBe ( 1 ) ;
39
58
} ) ;
40
59
41
60
it ( 'should be able to `preventDefault`' , ( ) => {
42
- var nativeEvent = { } ;
43
- var syntheticEvent = createEvent ( nativeEvent ) ;
61
+ var node ;
62
+ var expectedCount = 0 ;
44
63
45
- expect ( syntheticEvent . isDefaultPrevented ( ) ) . toBe ( false ) ;
46
- syntheticEvent . preventDefault ( ) ;
47
- expect ( syntheticEvent . isDefaultPrevented ( ) ) . toBe ( true ) ;
64
+ var eventHandler = syntheticEvent => {
65
+ expect ( syntheticEvent . isDefaultPrevented ( ) ) . toBe ( false ) ;
66
+ syntheticEvent . preventDefault ( ) ;
67
+ expect ( syntheticEvent . isDefaultPrevented ( ) ) . toBe ( true ) ;
68
+ expect ( syntheticEvent . defaultPrevented ) . toBe ( true ) ;
69
+
70
+ expectedCount ++ ;
71
+ } ;
72
+ node = ReactDOM . render ( < div onClick = { eventHandler } /> , container ) ;
48
73
49
- expect ( syntheticEvent . defaultPrevented ) . toBe ( true ) ;
74
+ var event = document . createEvent ( 'Event' ) ;
75
+ event . initEvent ( 'click' , true , true ) ;
76
+ node . dispatchEvent ( event ) ;
50
77
51
- expect ( nativeEvent . returnValue ) . toBe ( false ) ;
78
+ expect ( expectedCount ) . toBe ( 1 ) ;
52
79
} ) ;
53
80
54
81
it ( 'should be prevented if nativeEvent is prevented' , ( ) => {
55
- expect ( createEvent ( { defaultPrevented : true } ) . isDefaultPrevented ( ) ) . toBe (
56
- true ,
57
- ) ;
58
- expect ( createEvent ( { returnValue : false } ) . isDefaultPrevented ( ) ) . toBe ( true ) ;
82
+ var node ;
83
+ var expectedCount = 0 ;
84
+
85
+ var eventHandler = syntheticEvent => {
86
+ expect ( syntheticEvent . isDefaultPrevented ( ) ) . toBe ( true ) ;
87
+
88
+ expectedCount ++ ;
89
+ } ;
90
+ node = ReactDOM . render ( < div onClick = { eventHandler } /> , container ) ;
91
+
92
+ var event ;
93
+ event = document . createEvent ( 'Event' ) ;
94
+ event . initEvent ( 'click' , true , true ) ;
95
+ event . preventDefault ( ) ;
96
+ node . dispatchEvent ( event ) ;
97
+
98
+ event = document . createEvent ( 'Event' ) ;
99
+ event . initEvent ( 'click' , true , true ) ;
100
+ // Emulate IE8
101
+ Object . defineProperty ( event , 'defaultPrevented' , {
102
+ get ( ) { } ,
103
+ } ) ;
104
+ Object . defineProperty ( event , 'returnValue' , {
105
+ get ( ) {
106
+ return false ;
107
+ } ,
108
+ } ) ;
109
+ node . dispatchEvent ( event ) ;
110
+
111
+ expect ( expectedCount ) . toBe ( 2 ) ;
59
112
} ) ;
60
113
61
114
it ( 'should be able to `stopPropagation`' , ( ) => {
62
- var nativeEvent = { } ;
63
- var syntheticEvent = createEvent ( nativeEvent ) ;
115
+ var node ;
116
+ var expectedCount = 0 ;
64
117
65
- expect ( syntheticEvent . isPropagationStopped ( ) ) . toBe ( false ) ;
66
- syntheticEvent . stopPropagation ( ) ;
67
- expect ( syntheticEvent . isPropagationStopped ( ) ) . toBe ( true ) ;
118
+ var eventHandler = syntheticEvent => {
119
+ expect ( syntheticEvent . isPropagationStopped ( ) ) . toBe ( false ) ;
120
+ syntheticEvent . stopPropagation ( ) ;
121
+ expect ( syntheticEvent . isPropagationStopped ( ) ) . toBe ( true ) ;
68
122
69
- expect ( nativeEvent . cancelBubble ) . toBe ( true ) ;
123
+ expectedCount ++ ;
124
+ } ;
125
+ node = ReactDOM . render ( < div onClick = { eventHandler } /> , container ) ;
126
+
127
+ var event = document . createEvent ( 'Event' ) ;
128
+ event . initEvent ( 'click' , true , true ) ;
129
+ node . dispatchEvent ( event ) ;
130
+
131
+ expect ( expectedCount ) . toBe ( 1 ) ;
70
132
} ) ;
71
133
72
134
it ( 'should be able to `persist`' , ( ) => {
73
- var syntheticEvent = createEvent ( { } ) ;
135
+ var node ;
136
+ var expectedCount = 0 ;
137
+ var syntheticEvent ;
138
+
139
+ var eventHandler = e => {
140
+ expect ( e . isPersistent ( ) ) . toBe ( false ) ;
141
+ e . persist ( ) ;
142
+ syntheticEvent = e ;
143
+ expect ( e . isPersistent ( ) ) . toBe ( true ) ;
144
+
145
+ expectedCount ++ ;
146
+ } ;
147
+ node = ReactDOM . render ( < div onClick = { eventHandler } /> , container ) ;
74
148
75
- expect ( syntheticEvent . isPersistent ( ) ) . toBe ( false ) ;
76
- syntheticEvent . persist ( ) ;
77
- expect ( syntheticEvent . isPersistent ( ) ) . toBe ( true ) ;
149
+ var event = document . createEvent ( 'Event' ) ;
150
+ event . initEvent ( 'click' , true , true ) ;
151
+ node . dispatchEvent ( event ) ;
152
+
153
+ expect ( syntheticEvent . type ) . toBe ( 'click' ) ;
154
+ expect ( syntheticEvent . bubbles ) . toBe ( true ) ;
155
+ expect ( syntheticEvent . cancelable ) . toBe ( true ) ;
156
+ expect ( expectedCount ) . toBe ( 1 ) ;
78
157
} ) ;
79
158
80
- it ( 'should be nullified if the synthetic event has called destructor and log warnings ' , ( ) => {
159
+ it ( 'should be nullified and log warnings if the synthetic event has not been persisted ' , ( ) => {
81
160
spyOn ( console , 'error' ) ;
82
- var target = document . createElement ( 'div' ) ;
83
- var syntheticEvent = createEvent ( { srcElement : target } ) ;
84
- syntheticEvent . destructor ( ) ;
161
+ var node ;
162
+ var expectedCount = 0 ;
163
+ var syntheticEvent ;
164
+
165
+ var eventHandler = e => {
166
+ syntheticEvent = e ;
167
+
168
+ expectedCount ++ ;
169
+ } ;
170
+ node = ReactDOM . render ( < div onClick = { eventHandler } /> , container ) ;
171
+
172
+ var event = document . createEvent ( 'Event' ) ;
173
+ event . initEvent ( 'click' , true , true ) ;
174
+ node . dispatchEvent ( event ) ;
175
+
85
176
expect ( syntheticEvent . type ) . toBe ( null ) ;
86
177
expect ( syntheticEvent . nativeEvent ) . toBe ( null ) ;
87
178
expect ( syntheticEvent . target ) . toBe ( null ) ;
@@ -95,14 +186,27 @@ describe('SyntheticEvent', () => {
95
186
'keep the original synthetic event around, use event.persist(). ' +
96
187
'See https://fb.me/react-event-pooling for more information.' ,
97
188
) ;
189
+ expect ( expectedCount ) . toBe ( 1 ) ;
98
190
} ) ;
99
191
100
- it ( 'should warn when setting properties of a destructored synthetic event' , ( ) => {
192
+ it ( 'should warn when setting properties of a synthetic event that has not been persisted ' , ( ) => {
101
193
spyOn ( console , 'error' ) ;
102
- var target = document . createElement ( 'div' ) ;
103
- var syntheticEvent = createEvent ( { srcElement : target } ) ;
104
- syntheticEvent . destructor ( ) ;
105
- expect ( ( syntheticEvent . type = 'MouseEvent' ) ) . toBe ( 'MouseEvent' ) ;
194
+ var node ;
195
+ var expectedCount = 0 ;
196
+ var syntheticEvent ;
197
+
198
+ var eventHandler = e => {
199
+ syntheticEvent = e ;
200
+
201
+ expectedCount ++ ;
202
+ } ;
203
+ node = ReactDOM . render ( < div onClick = { eventHandler } /> , container ) ;
204
+
205
+ var event = document . createEvent ( 'Event' ) ;
206
+ event . initEvent ( 'click' , true , true ) ;
207
+ node . dispatchEvent ( event ) ;
208
+
209
+ syntheticEvent . type = 'MouseEvent' ;
106
210
expectDev ( console . error . calls . count ( ) ) . toBe ( 1 ) ;
107
211
expectDev ( console . error . calls . argsFor ( 0 ) [ 0 ] ) . toBe (
108
212
'Warning: This synthetic event is reused for performance reasons. If ' +
@@ -111,12 +215,25 @@ describe('SyntheticEvent', () => {
111
215
'keep the original synthetic event around, use event.persist(). ' +
112
216
'See https://fb.me/react-event-pooling for more information.' ,
113
217
) ;
218
+ expect ( expectedCount ) . toBe ( 1 ) ;
114
219
} ) ;
115
220
116
- it ( 'should warn if the synthetic event has been released when calling `preventDefault` ' , ( ) => {
221
+ it ( 'should warn when calling `preventDefault` if the synthetic event has not been persisted ' , ( ) => {
117
222
spyOn ( console , 'error' ) ;
118
- var syntheticEvent = createEvent ( { } ) ;
119
- SyntheticEvent . release ( syntheticEvent ) ;
223
+ var node ;
224
+ var expectedCount = 0 ;
225
+ var syntheticEvent ;
226
+
227
+ var eventHandler = e => {
228
+ syntheticEvent = e ;
229
+ expectedCount ++ ;
230
+ } ;
231
+ node = ReactDOM . render ( < div onClick = { eventHandler } /> , container ) ;
232
+
233
+ var event = document . createEvent ( 'Event' ) ;
234
+ event . initEvent ( 'click' , true , true ) ;
235
+ node . dispatchEvent ( event ) ;
236
+
120
237
syntheticEvent . preventDefault ( ) ;
121
238
expectDev ( console . error . calls . count ( ) ) . toBe ( 1 ) ;
122
239
expectDev ( console . error . calls . argsFor ( 0 ) [ 0 ] ) . toBe (
@@ -126,12 +243,26 @@ describe('SyntheticEvent', () => {
126
243
'keep the original synthetic event around, use event.persist(). ' +
127
244
'See https://fb.me/react-event-pooling for more information.' ,
128
245
) ;
246
+ expect ( expectedCount ) . toBe ( 1 ) ;
129
247
} ) ;
130
248
131
- it ( 'should warn if the synthetic event has been released when calling `stopPropagation` ' , ( ) => {
249
+ it ( 'should warn when calling `stopPropagation` if the synthetic event has not been persisted ' , ( ) => {
132
250
spyOn ( console , 'error' ) ;
133
- var syntheticEvent = createEvent ( { } ) ;
134
- SyntheticEvent . release ( syntheticEvent ) ;
251
+ var node ;
252
+ var expectedCount = 0 ;
253
+ var syntheticEvent ;
254
+
255
+ var eventHandler = e => {
256
+ syntheticEvent = e ;
257
+ expectedCount ++ ;
258
+ } ;
259
+ node = ReactDOM . render ( < div onClick = { eventHandler } /> , container ) ;
260
+
261
+ var event = document . createEvent ( 'Event' ) ;
262
+ event . initEvent ( 'click' , true , true ) ;
263
+
264
+ node . dispatchEvent ( event ) ;
265
+
135
266
syntheticEvent . stopPropagation ( ) ;
136
267
expectDev ( console . error . calls . count ( ) ) . toBe ( 1 ) ;
137
268
expectDev ( console . error . calls . argsFor ( 0 ) [ 0 ] ) . toBe (
@@ -141,6 +272,7 @@ describe('SyntheticEvent', () => {
141
272
'keep the original synthetic event around, use event.persist(). ' +
142
273
'See https://fb.me/react-event-pooling for more information.' ,
143
274
) ;
275
+ expect ( expectedCount ) . toBe ( 1 ) ;
144
276
} ) ;
145
277
146
278
// TODO: reenable this test. We are currently silencing these warnings when
@@ -153,8 +285,8 @@ describe('SyntheticEvent', () => {
153
285
function assignEvent ( e ) {
154
286
event = e ;
155
287
}
156
- var instance = ReactDOM . render ( < div onClick = { assignEvent } /> , element ) ;
157
- ReactTestUtils . Simulate . click ( ReactDOM . findDOMNode ( instance ) ) ;
288
+ var node = ReactDOM . render ( < div onClick = { assignEvent } /> , element ) ;
289
+ ReactTestUtils . Simulate . click ( ReactDOM . findDOMNode ( node ) ) ;
158
290
expectDev ( console . error . calls . count ( ) ) . toBe ( 0 ) ;
159
291
160
292
// access a property to cause the warning
@@ -172,9 +304,22 @@ describe('SyntheticEvent', () => {
172
304
173
305
it ( 'should warn if Proxy is supported and the synthetic event is added a property' , ( ) => {
174
306
spyOn ( console , 'error' ) ;
175
- var syntheticEvent = createEvent ( { } ) ;
176
- syntheticEvent . foo = 'bar' ;
177
- SyntheticEvent . release ( syntheticEvent ) ;
307
+ var node ;
308
+ var expectedCount = 0 ;
309
+ var syntheticEvent ;
310
+
311
+ var eventHandler = e => {
312
+ e . foo = 'bar' ;
313
+ syntheticEvent = e ;
314
+ expectedCount ++ ;
315
+ } ;
316
+ node = ReactDOM . render ( < div onClick = { eventHandler } /> , container ) ;
317
+
318
+ var event = document . createEvent ( 'Event' ) ;
319
+ event . initEvent ( 'click' , true , true ) ;
320
+
321
+ node . dispatchEvent ( event ) ;
322
+
178
323
expect ( syntheticEvent . foo ) . toBe ( 'bar' ) ;
179
324
if ( typeof Proxy === 'function' ) {
180
325
expectDev ( console . error . calls . count ( ) ) . toBe ( 1 ) ;
@@ -187,5 +332,6 @@ describe('SyntheticEvent', () => {
187
332
} else {
188
333
expectDev ( console . error . calls . count ( ) ) . toBe ( 0 ) ;
189
334
}
335
+ expect ( expectedCount ) . toBe ( 1 ) ;
190
336
} ) ;
191
337
} ) ;
0 commit comments