@@ -116,6 +116,132 @@ export function main() {
116
116
getDOM ( ) . dispatchEvent ( element , dispatchedEvent ) ;
117
117
expect ( receivedEvent ) . toBe ( null ) ;
118
118
} ) ;
119
+
120
+ it ( 'should keep zone when addEventListener multiple times' , ( ) => {
121
+ const Zone = ( window as any ) [ 'Zone' ] ;
122
+
123
+ const element = el ( '<div><div></div></div>' ) ;
124
+ getDOM ( ) . appendChild ( doc . body , element ) ;
125
+ const dispatchedEvent = getDOM ( ) . createMouseEvent ( 'click' ) ;
126
+ let receivedEvents : any [ ] /** TODO #9100 */ = [ ] ;
127
+ let receivedZones : any [ ] = [ ] ;
128
+ const handler1 = ( e : any /** TODO #9100 */ ) => {
129
+ receivedEvents . push ( e ) ;
130
+ receivedZones . push ( Zone . current . name ) ;
131
+ } ;
132
+ const handler2 = ( e : any /** TODO #9100 */ ) => {
133
+ receivedEvents . push ( e ) ;
134
+ receivedZones . push ( Zone . current . name ) ;
135
+ } ;
136
+ const manager = new EventManager ( [ domEventPlugin ] , new FakeNgZone ( ) ) ;
137
+
138
+ let remover1 = null ;
139
+ let remover2 = null ;
140
+ Zone . root . run ( ( ) => { remover1 = manager . addEventListener ( element , 'click' , handler1 ) ; } ) ;
141
+ Zone . root . fork ( { name : 'test' } ) . run ( ( ) => {
142
+ remover2 = manager . addEventListener ( element , 'click' , handler2 ) ;
143
+ } ) ;
144
+ getDOM ( ) . dispatchEvent ( element , dispatchedEvent ) ;
145
+ expect ( receivedEvents ) . toEqual ( [ dispatchedEvent , dispatchedEvent ] ) ;
146
+ expect ( receivedZones ) . toEqual ( [ Zone . root . name , 'test' ] ) ;
147
+
148
+ receivedEvents = [ ] ;
149
+ remover1 && remover1 ( ) ;
150
+ remover2 && remover2 ( ) ;
151
+ getDOM ( ) . dispatchEvent ( element , dispatchedEvent ) ;
152
+ expect ( receivedEvents ) . toEqual ( [ ] ) ;
153
+ } ) ;
154
+
155
+ it ( 'should handle event correctly when one handler remove itself ' , ( ) => {
156
+ const Zone = ( window as any ) [ 'Zone' ] ;
157
+
158
+ const element = el ( '<div><div></div></div>' ) ;
159
+ getDOM ( ) . appendChild ( doc . body , element ) ;
160
+ const dispatchedEvent = getDOM ( ) . createMouseEvent ( 'click' ) ;
161
+ let receivedEvents : any [ ] /** TODO #9100 */ = [ ] ;
162
+ let receivedZones : any [ ] = [ ] ;
163
+ let remover1 : any = null ;
164
+ let remover2 : any = null ;
165
+ const handler1 = ( e : any /** TODO #9100 */ ) => {
166
+ receivedEvents . push ( e ) ;
167
+ receivedZones . push ( Zone . current . name ) ;
168
+ remover1 && remover1 ( ) ;
169
+ } ;
170
+ const handler2 = ( e : any /** TODO #9100 */ ) => {
171
+ receivedEvents . push ( e ) ;
172
+ receivedZones . push ( Zone . current . name ) ;
173
+ } ;
174
+ const manager = new EventManager ( [ domEventPlugin ] , new FakeNgZone ( ) ) ;
175
+
176
+ Zone . root . run ( ( ) => { remover1 = manager . addEventListener ( element , 'click' , handler1 ) ; } ) ;
177
+ Zone . root . fork ( { name : 'test' } ) . run ( ( ) => {
178
+ remover2 = manager . addEventListener ( element , 'click' , handler2 ) ;
179
+ } ) ;
180
+ getDOM ( ) . dispatchEvent ( element , dispatchedEvent ) ;
181
+ expect ( receivedEvents ) . toEqual ( [ dispatchedEvent , dispatchedEvent ] ) ;
182
+ expect ( receivedZones ) . toEqual ( [ Zone . root . name , 'test' ] ) ;
183
+
184
+ receivedEvents = [ ] ;
185
+ remover1 && remover1 ( ) ;
186
+ remover2 && remover2 ( ) ;
187
+ getDOM ( ) . dispatchEvent ( element , dispatchedEvent ) ;
188
+ expect ( receivedEvents ) . toEqual ( [ ] ) ;
189
+ } ) ;
190
+
191
+ it ( 'should only add same callback once when addEventListener' , ( ) => {
192
+ const Zone = ( window as any ) [ 'Zone' ] ;
193
+
194
+ const element = el ( '<div><div></div></div>' ) ;
195
+ getDOM ( ) . appendChild ( doc . body , element ) ;
196
+ const dispatchedEvent = getDOM ( ) . createMouseEvent ( 'click' ) ;
197
+ let receivedEvents : any [ ] /** TODO #9100 */ = [ ] ;
198
+ let receivedZones : any [ ] = [ ] ;
199
+ const handler = ( e : any /** TODO #9100 */ ) => {
200
+ receivedEvents . push ( e ) ;
201
+ receivedZones . push ( Zone . current . name ) ;
202
+ } ;
203
+ const manager = new EventManager ( [ domEventPlugin ] , new FakeNgZone ( ) ) ;
204
+
205
+ let remover1 = null ;
206
+ let remover2 = null ;
207
+ Zone . root . run ( ( ) => { remover1 = manager . addEventListener ( element , 'click' , handler ) ; } ) ;
208
+ Zone . root . fork ( { name : 'test' } ) . run ( ( ) => {
209
+ remover2 = manager . addEventListener ( element , 'click' , handler ) ;
210
+ } ) ;
211
+ getDOM ( ) . dispatchEvent ( element , dispatchedEvent ) ;
212
+ expect ( receivedEvents ) . toEqual ( [ dispatchedEvent ] ) ;
213
+ expect ( receivedZones ) . toEqual ( [ Zone . root . name ] ) ;
214
+
215
+ receivedEvents = [ ] ;
216
+ remover1 && remover1 ( ) ;
217
+ remover2 && remover2 ( ) ;
218
+ getDOM ( ) . dispatchEvent ( element , dispatchedEvent ) ;
219
+ expect ( receivedEvents ) . toEqual ( [ ] ) ;
220
+ } ) ;
221
+
222
+ it ( 'should run blackListedEvents handler outside of ngZone' , ( ) => {
223
+ const Zone = ( window as any ) [ 'Zone' ] ;
224
+ const element = el ( '<div><div></div></div>' ) ;
225
+ getDOM ( ) . appendChild ( doc . body , element ) ;
226
+ const dispatchedEvent = getDOM ( ) . createMouseEvent ( 'scroll' ) ;
227
+ let receivedEvent : any /** TODO #9100 */ = null ;
228
+ let receivedZone : any = null ;
229
+ const handler = ( e : any /** TODO #9100 */ ) => {
230
+ receivedEvent = e ;
231
+ receivedZone = Zone . current ;
232
+ } ;
233
+ const manager = new EventManager ( [ domEventPlugin ] , new FakeNgZone ( ) ) ;
234
+
235
+ let remover = manager . addEventListener ( element , 'scroll' , handler ) ;
236
+ getDOM ( ) . dispatchEvent ( element , dispatchedEvent ) ;
237
+ expect ( receivedEvent ) . toBe ( dispatchedEvent ) ;
238
+ expect ( receivedZone . name ) . toBe ( Zone . root . name ) ;
239
+
240
+ receivedEvent = null ;
241
+ remover && remover ( ) ;
242
+ getDOM ( ) . dispatchEvent ( element , dispatchedEvent ) ;
243
+ expect ( receivedEvent ) . toBe ( null ) ;
244
+ } ) ;
119
245
} ) ;
120
246
}
121
247
0 commit comments