@@ -14,6 +14,7 @@ import {Platform} from '@angular/cdk/platform';
14
14
import {
15
15
createKeyboardEvent ,
16
16
createMouseEvent ,
17
+ createPointerEvent ,
17
18
dispatchEvent ,
18
19
dispatchFakeEvent ,
19
20
dispatchKeyboardEvent ,
@@ -718,10 +719,10 @@ describe('MDC-based MatSlider', () => {
718
719
it ( 'should emit an input event while sliding' , ( ) => {
719
720
expect ( testComponent . onChange ) . not . toHaveBeenCalled ( ) ;
720
721
721
- dispatchSliderMouseEvent ( sliderNativeElement , 'mousedown ' , 0 ) ;
722
- dispatchSliderMouseEvent ( sliderNativeElement , 'mousemove ' , 0.5 ) ;
723
- dispatchSliderMouseEvent ( sliderNativeElement , 'mousemove ' , 1 ) ;
724
- dispatchSliderMouseEvent ( sliderNativeElement , 'mouseup ' , 1 ) ;
722
+ dispatchSliderMouseEvent ( sliderNativeElement , 'down ' , 0 ) ;
723
+ dispatchSliderMouseEvent ( sliderNativeElement , 'move ' , 0.5 ) ;
724
+ dispatchSliderMouseEvent ( sliderNativeElement , 'move ' , 1 ) ;
725
+ dispatchSliderMouseEvent ( sliderNativeElement , 'up ' , 1 ) ;
725
726
726
727
fixture . detectChanges ( ) ;
727
728
@@ -1409,8 +1410,8 @@ class SliderWithTwoWayBinding {
1409
1410
*/
1410
1411
function dispatchMousedownEventSequence ( sliderElement : HTMLElement , percentage : number ,
1411
1412
button = 0 ) : void {
1412
- dispatchSliderMouseEvent ( sliderElement , 'mousedown ' , percentage , button ) ;
1413
- dispatchSliderMouseEvent ( sliderElement , 'mouseup ' , percentage , button ) ;
1413
+ dispatchSliderMouseEvent ( sliderElement , 'down ' , percentage , button ) ;
1414
+ dispatchSliderMouseEvent ( sliderElement , 'up ' , percentage , button ) ;
1414
1415
}
1415
1416
1416
1417
/**
@@ -1421,25 +1422,32 @@ function dispatchMousedownEventSequence(sliderElement: HTMLElement, percentage:
1421
1422
*/
1422
1423
function dispatchSlideEventSequence ( sliderElement : HTMLElement , startPercent : number ,
1423
1424
endPercent : number ) : void {
1424
- dispatchSliderMouseEvent ( sliderElement , 'mousedown ' , startPercent ) ;
1425
- dispatchSliderMouseEvent ( sliderElement , 'mousemove ' , startPercent ) ;
1426
- dispatchSliderMouseEvent ( sliderElement , 'mousemove ' , endPercent ) ;
1427
- dispatchSliderMouseEvent ( sliderElement , 'mouseup ' , endPercent ) ;
1425
+ dispatchSliderMouseEvent ( sliderElement , 'down ' , startPercent ) ;
1426
+ dispatchSliderMouseEvent ( sliderElement , 'move ' , startPercent ) ;
1427
+ dispatchSliderMouseEvent ( sliderElement , 'move ' , endPercent ) ;
1428
+ dispatchSliderMouseEvent ( sliderElement , 'up ' , endPercent ) ;
1428
1429
}
1429
1430
1430
1431
/**
1431
1432
* Dispatches a mouse event from an element at a given position based on the percentage.
1432
1433
* @param sliderElement The mat-slider element from which the event will be dispatched.
1433
- * @param type Type of the mouse event that should be dispatched .
1434
+ * @param type Type of mouse interaction .
1434
1435
* @param percent The percentage of the slider where the event will happen.
1435
1436
* @param button Button that should be held for this event.
1436
1437
*/
1437
- function dispatchSliderMouseEvent ( sliderElement : HTMLElement , type : string , percent : number ,
1438
- button = 0 ) : void {
1439
- let trackElement = sliderElement . querySelector ( '.mdc-slider__track-container' ) ! ;
1440
- let dimensions = trackElement . getBoundingClientRect ( ) ;
1441
- let x = dimensions . left + ( dimensions . width * percent ) ;
1442
- let y = dimensions . top + ( dimensions . height * percent ) ;
1443
-
1444
- dispatchEvent ( sliderElement , createMouseEvent ( type , x , y , 0 ) ) ;
1438
+ function dispatchSliderMouseEvent ( sliderElement : HTMLElement , type : 'up' | 'down' | 'move' ,
1439
+ percent : number , button = 0 ) : void {
1440
+ const trackElement = sliderElement . querySelector ( '.mdc-slider__track-container' ) ! ;
1441
+ const dimensions = trackElement . getBoundingClientRect ( ) ;
1442
+ const clientX = dimensions . left + ( dimensions . width * percent ) ;
1443
+ const clientY = dimensions . top + ( dimensions . height * percent ) ;
1444
+
1445
+ // The latest versions of all browsers we support have the new `PointerEvent` API.
1446
+ // Though since we capture the two most recent versions of these browsers, we also
1447
+ // need to support Safari 12 at time of writing. Safari 12 does not have support for this,
1448
+ // so we need to conditionally create and dispatch these events based on feature detection.
1449
+ if ( window . PointerEvent !== undefined ) {
1450
+ dispatchEvent ( sliderElement , createPointerEvent ( `pointer${ type } ` , clientX , clientY ) ) ;
1451
+ }
1452
+ dispatchEvent ( sliderElement , createMouseEvent ( `mouse${ type } ` , clientX , clientY , 0 ) ) ;
1445
1453
}
0 commit comments