10
10
* @suppress {missingRequire}
11
11
*/
12
12
13
- import { ADD_EVENT_LISTENER_STR , attachOriginToPatched , FALSE_STR , isIEOrEdge , ObjectGetPrototypeOf , REMOVE_EVENT_LISTENER_STR , TRUE_STR , ZONE_SYMBOL_PREFIX , zoneSymbol } from './utils' ;
13
+ import { ADD_EVENT_LISTENER_STR , attachOriginToPatched , FALSE_STR , isIE , isIEOrEdge , ObjectGetPrototypeOf , REMOVE_EVENT_LISTENER_STR , TRUE_STR , ZONE_SYMBOL_PREFIX , zoneSymbol } from './utils' ;
14
14
15
15
/** @internal **/
16
16
interface EventTaskData extends TaskData {
@@ -19,15 +19,15 @@ interface EventTaskData extends TaskData {
19
19
}
20
20
21
21
const pointerEventsMap : { [ key : string ] : string } = {
22
- 'pointercancel ' : 'MSPointerCancel ' ,
23
- 'pointerdown ' : 'MSPointerDown ' ,
24
- 'pointerenter ' : 'MSPointerEnter ' ,
25
- 'pointerhover ' : 'MSPointerHover ' ,
26
- 'pointerleave ' : 'MSPointerLeave ' ,
27
- 'pointermove ' : 'MSPointerMove ' ,
28
- 'pointerout ' : 'MSPointerOut ' ,
29
- 'pointerover ' : 'MSPointerOver ' ,
30
- 'pointerup ' : 'MSPointerUp '
22
+ 'MSPointerCancel ' : 'pointercancel ' ,
23
+ 'MSPointerDown ' : 'pointerdown ' ,
24
+ 'MSPointerEnter ' : 'pointerenter ' ,
25
+ 'MSPointerHover ' : 'pointerhover ' ,
26
+ 'MSPointerLeave ' : 'pointerleave ' ,
27
+ 'MSPointerMove ' : 'pointermove ' ,
28
+ 'MSPointerOut ' : 'pointerout ' ,
29
+ 'MSPointerOver ' : 'pointerover ' ,
30
+ 'MSPointerUp ' : 'pointerup '
31
31
} ;
32
32
33
33
let passiveSupported = false ;
@@ -99,6 +99,16 @@ export function patchEventTarget(
99
99
const PREPEND_EVENT_LISTENER = 'prependListener' ;
100
100
const PREPEND_EVENT_LISTENER_SOURCE = '.' + PREPEND_EVENT_LISTENER + ':' ;
101
101
102
+ Object . keys ( pointerEventsMap ) . forEach ( msEventName => {
103
+ const eventName = pointerEventsMap [ msEventName ] ;
104
+ zoneSymbolEventNames [ eventName ] = { } ;
105
+ zoneSymbolEventNames [ eventName ] [ FALSE_STR ] = ZONE_SYMBOL_PREFIX + eventName + FALSE_STR ;
106
+ zoneSymbolEventNames [ eventName ] [ TRUE_STR ] = ZONE_SYMBOL_PREFIX + eventName + TRUE_STR ;
107
+ zoneSymbolEventNames [ msEventName ] = { } ;
108
+ zoneSymbolEventNames [ msEventName ] [ FALSE_STR ] = ZONE_SYMBOL_PREFIX + msEventName + FALSE_STR ;
109
+ zoneSymbolEventNames [ msEventName ] [ TRUE_STR ] = ZONE_SYMBOL_PREFIX + msEventName + TRUE_STR ;
110
+ } ) ;
111
+
102
112
const invokeTask = function ( task : any , target : any , event : Event ) {
103
113
// for better performance, check isRemoved which is set
104
114
// by removeEventListener
@@ -135,10 +145,13 @@ export function patchEventTarget(
135
145
// || global is needed https://github.com/angular/zone.js/issues/190
136
146
const target : any = this || event . target || _global ;
137
147
let tasks = target [ zoneSymbolEventNames [ event . type ] [ FALSE_STR ] ] ;
138
- if ( ! tasks && isIEOrEdge ) {
148
+ if ( isIEOrEdge ) {
139
149
const pointerMappedEvent = pointerEventsMap [ event . type ] ;
140
- tasks =
141
- pointerMappedEvent ? target [ zoneSymbolEventNames [ pointerMappedEvent ] ] [ FALSE_STR ] : tasks ;
150
+ const msTasks =
151
+ pointerMappedEvent && target [ zoneSymbolEventNames [ pointerMappedEvent ] ] [ FALSE_STR ] ;
152
+ if ( msTasks ) {
153
+ tasks = tasks . concat ( msTasks ) ;
154
+ }
142
155
}
143
156
if ( tasks ) {
144
157
// invoke all tasks which attached to current target with given event.type and capture = false
@@ -172,10 +185,13 @@ export function patchEventTarget(
172
185
// || global is needed https://github.com/angular/zone.js/issues/190
173
186
const target : any = this || event . target || _global ;
174
187
let tasks = target [ zoneSymbolEventNames [ event . type ] [ TRUE_STR ] ] ;
175
- if ( ! tasks && isIEOrEdge ) {
188
+ if ( isIEOrEdge ) {
176
189
const pointerMappedEvent = pointerEventsMap [ event . type ] ;
177
- tasks =
178
- pointerMappedEvent ? target [ zoneSymbolEventNames [ pointerMappedEvent ] ] [ TRUE_STR ] : tasks ;
190
+ const msTasks =
191
+ pointerMappedEvent && target [ zoneSymbolEventNames [ pointerMappedEvent ] ] [ FALSE_STR ] ;
192
+ if ( msTasks ) {
193
+ tasks = tasks . concat ( msTasks ) ;
194
+ }
179
195
}
180
196
if ( tasks ) {
181
197
// invoke all tasks which attached to current target with given event.type and capture = false
@@ -372,7 +388,11 @@ export function patchEventTarget(
372
388
return ;
373
389
}
374
390
375
- const eventName = arguments [ 0 ] ;
391
+ let eventName = arguments [ 0 ] ;
392
+ if ( isIEOrEdge ) {
393
+ const msEventName = pointerEventsMap [ eventName ] ;
394
+ eventName = msEventName ? msEventName : eventName ;
395
+ }
376
396
const options = arguments [ 2 ] ;
377
397
378
398
if ( blackListedEvents ) {
@@ -415,6 +435,13 @@ export function patchEventTarget(
415
435
}
416
436
let existingTasks = target [ symbolEventName ] ;
417
437
let isExisting = false ;
438
+ if ( isIEOrEdge && ! existingTasks ) {
439
+ const msEventName = pointerEventsMap [ eventName ] ;
440
+ if ( msEventName ) {
441
+ existingTasks =
442
+ target [ zoneSymbolEventNames [ msEventName ] [ capture ? TRUE_STR : FALSE_STR ] ] ;
443
+ }
444
+ }
418
445
if ( existingTasks ) {
419
446
// already have task registered
420
447
isExisting = true ;
@@ -449,7 +476,8 @@ export function patchEventTarget(
449
476
}
450
477
taskData . target = target ;
451
478
taskData . capture = capture ;
452
- taskData . eventName = eventName ;
479
+ // in pointer event, we need to use original event name here.
480
+ taskData . eventName = arguments [ 0 ] ;
453
481
taskData . isExisting = isExisting ;
454
482
455
483
const data = useGlobalCallback ? OPTIMIZED_ZONE_EVENT_TASK_DATA : undefined ;
@@ -511,7 +539,11 @@ export function patchEventTarget(
511
539
512
540
proto [ REMOVE_EVENT_LISTENER ] = function ( ) {
513
541
const target = this || _global ;
514
- const eventName = arguments [ 0 ] ;
542
+ let eventName = arguments [ 0 ] ;
543
+ if ( isIEOrEdge ) {
544
+ const msEventName = pointerEventsMap [ eventName ] ;
545
+ eventName = msEventName ? msEventName : eventName ;
546
+ }
515
547
const options = arguments [ 2 ] ;
516
548
517
549
let capture ;
@@ -553,6 +585,9 @@ export function patchEventTarget(
553
585
// remove globalZoneAwareCallback and remove the task cache from target
554
586
( existingTask as any ) . allRemoved = true ;
555
587
target [ symbolEventName ] = null ;
588
+ if ( isIEOrEdge ) {
589
+ existingTask . eventName = arguments [ 0 ] ;
590
+ }
556
591
}
557
592
existingTask . zone . cancelTask ( existingTask ) ;
558
593
if ( returnTarget ) {
0 commit comments