@@ -101,6 +101,7 @@ - (bool)testKeyEquivalentIsPassedToTextInputPlugin:(id)mockEngine;
101
101
- (bool )testFlagsChangedEventsArePropagatedIfNotHandled : (id )mockEngine ;
102
102
- (bool )testKeyboardIsRestartedOnEngineRestart : (id )mockEngine ;
103
103
- (bool )testTrackpadGesturesAreSentToFramework : (id )mockEngine ;
104
+ - (bool )mouseAndGestureEventsAreHandledSeparately : (id )engineMock ;
104
105
- (bool )testMouseDownUpEventsSentToNextResponder : (id )mockEngine ;
105
106
- (bool )testModifierKeysAreSynthesizedOnMouseMove : (id )mockEngine ;
106
107
- (bool )testViewWillAppearCalledMultipleTimes : (id )mockEngine ;
@@ -287,6 +288,12 @@ id MockGestureEvent(NSEventType type, NSEventPhase phase, double magnification,
287
288
[[FlutterViewControllerTestObjC alloc ] testTrackpadGesturesAreSentToFramework: mockEngine]);
288
289
}
289
290
291
+ TEST_F (FlutterViewControllerMockEngineTest, TestmouseAndGestureEventsAreHandledSeparately) {
292
+ id mockEngine = GetMockEngine ();
293
+ ASSERT_TRUE (
294
+ [[FlutterViewControllerTestObjC alloc ] mouseAndGestureEventsAreHandledSeparately: mockEngine]);
295
+ }
296
+
290
297
TEST_F (FlutterViewControllerMockEngineTest, TestMouseDownUpEventsSentToNextResponder) {
291
298
id mockEngine = GetMockEngine ();
292
299
ASSERT_TRUE (
@@ -1004,6 +1011,39 @@ - (bool)testTrackpadGesturesAreSentToFramework:(id)engineMock {
1004
1011
return true ;
1005
1012
}
1006
1013
1014
+ - (bool )mouseAndGestureEventsAreHandledSeparately : (id )engineMock {
1015
+ FlutterViewController* viewController = [[FlutterViewController alloc ] initWithEngine: engineMock
1016
+ nibName: @" "
1017
+ bundle: nil ];
1018
+ [viewController loadView ];
1019
+
1020
+ // Test for pan events.
1021
+ // Start gesture.
1022
+ CGEventRef cgEventStart = CGEventCreateScrollWheelEvent (NULL , kCGScrollEventUnitPixel , 1 , 0 );
1023
+ CGEventSetType (cgEventStart, kCGEventScrollWheel );
1024
+ CGEventSetIntegerValueField (cgEventStart, kCGScrollWheelEventScrollPhase , kCGScrollPhaseBegan );
1025
+ CGEventSetIntegerValueField (cgEventStart, kCGScrollWheelEventIsContinuous , 1 );
1026
+ [viewController scrollWheel: [NSEvent eventWithCGEvent: cgEventStart]];
1027
+
1028
+ CGEventRef cgEventUpdate = CGEventCreateCopy (cgEventStart);
1029
+ CGEventSetIntegerValueField (cgEventUpdate, kCGScrollWheelEventScrollPhase , kCGScrollPhaseChanged );
1030
+ CGEventSetIntegerValueField (cgEventUpdate, kCGScrollWheelEventDeltaAxis2 , 1 ); // pan_x
1031
+ CGEventSetIntegerValueField (cgEventUpdate, kCGScrollWheelEventDeltaAxis1 , 2 ); // pan_y
1032
+ [viewController scrollWheel: [NSEvent eventWithCGEvent: cgEventUpdate]];
1033
+
1034
+ // Magic mouse can interleave mouse events with scroll events.
1035
+ NSEvent * mouseEvent = flutter::testing::CreateMouseEvent (0x00 );
1036
+ [viewController mouseEntered: mouseEvent];
1037
+ [viewController mouseExited: mouseEvent];
1038
+
1039
+ // End gesture.
1040
+ CGEventRef cgEventEnd = CGEventCreateCopy (cgEventStart);
1041
+ CGEventSetIntegerValueField (cgEventEnd, kCGScrollWheelEventScrollPhase , kCGScrollPhaseEnded );
1042
+ [viewController scrollWheel: [NSEvent eventWithCGEvent: cgEventEnd]];
1043
+
1044
+ return true ;
1045
+ }
1046
+
1007
1047
- (bool )testViewWillAppearCalledMultipleTimes : (id )engineMock {
1008
1048
FlutterViewController* viewController = [[FlutterViewController alloc ] initWithEngine: engineMock
1009
1049
nibName: @" "
0 commit comments