@@ -38,6 +38,42 @@ - (void)dealloc {
38
38
}
39
39
@end
40
40
41
+ // / Responder wrapper that forwards key events to another responder. This is a necessary middle step
42
+ // / for mocking responder because when setting the responder AppKit will access ivars of the
43
+ // / responder, which means the responder must extend NSResponder instead of just implementing the
44
+ // / selectors.
45
+ @interface FlutterResponderWrapper : NSResponder {
46
+ NSResponder * _responder;
47
+ }
48
+ @end
49
+
50
+ @implementation FlutterResponderWrapper
51
+
52
+ - (instancetype )initWithResponder : (NSResponder *)responder {
53
+ if (self = [super init ]) {
54
+ _responder = responder;
55
+ }
56
+ return self;
57
+ }
58
+
59
+ - (void )keyDown : (NSEvent *)event {
60
+ [_responder keyDown: event];
61
+ }
62
+
63
+ - (void )keyUp : (NSEvent *)event {
64
+ [_responder keyUp: event];
65
+ }
66
+
67
+ - (BOOL )performKeyEquivalent : (NSEvent *)event {
68
+ return [_responder performKeyEquivalent: event];
69
+ }
70
+
71
+ - (void )flagsChanged : (NSEvent *)event {
72
+ [_responder flagsChanged: event];
73
+ }
74
+
75
+ @end
76
+
41
77
// A FlutterViewController subclass for testing that mouseDown/mouseUp get called when
42
78
// mouse events are sent to the associated view.
43
79
@interface MouseEventFlutterViewController : FlutterViewController
@@ -417,7 +453,8 @@ - (bool)testKeyEventsArePropagatedIfNotHandled {
417
453
nibName: @" "
418
454
bundle: nil ];
419
455
id responderMock = flutter::testing::mockResponder ();
420
- viewController.nextResponder = responderMock;
456
+ id responderWrapper = [[FlutterResponderWrapper alloc ] initWithResponder: responderMock];
457
+ viewController.nextResponder = responderWrapper;
421
458
NSDictionary * expectedEvent = @{
422
459
@" keymap" : @" macos" ,
423
460
@" type" : @" keydown" ,
@@ -493,7 +530,8 @@ - (bool)testFlagsChangedEventsArePropagatedIfNotHandled {
493
530
nibName: @" "
494
531
bundle: nil ];
495
532
id responderMock = flutter::testing::mockResponder ();
496
- viewController.nextResponder = responderMock;
533
+ id responderWrapper = [[FlutterResponderWrapper alloc ] initWithResponder: responderMock];
534
+ viewController.nextResponder = responderWrapper;
497
535
NSDictionary * expectedEvent = @{
498
536
@" keymap" : @" macos" ,
499
537
@" type" : @" keydown" ,
@@ -546,7 +584,8 @@ - (bool)testKeyEventsAreNotPropagatedIfHandled {
546
584
nibName: @" "
547
585
bundle: nil ];
548
586
id responderMock = flutter::testing::mockResponder ();
549
- viewController.nextResponder = responderMock;
587
+ id responderWrapper = [[FlutterResponderWrapper alloc ] initWithResponder: responderMock];
588
+ viewController.nextResponder = responderWrapper;
550
589
NSDictionary * expectedEvent = @{
551
590
@" keymap" : @" macos" ,
552
591
@" type" : @" keydown" ,
@@ -825,7 +864,7 @@ - (bool)testTrackpadGesturesAreSentToFramework {
825
864
CGEventRef cgEventDiscreteShift =
826
865
CGEventCreateScrollWheelEvent (NULL , kCGScrollEventUnitPixel , 1 , 0 );
827
866
CGEventSetType (cgEventDiscreteShift, kCGEventScrollWheel );
828
- CGEventSetFlags (cgEventDiscreteShift, kCGEventFlagMaskShift );
867
+ CGEventSetFlags (cgEventDiscreteShift, kCGEventFlagMaskShift | flutter:: kModifierFlagShiftLeft );
829
868
CGEventSetIntegerValueField (cgEventDiscreteShift, kCGScrollWheelEventIsContinuous , 0 );
830
869
CGEventSetIntegerValueField (cgEventDiscreteShift, kCGScrollWheelEventDeltaAxis2 ,
831
870
0 ); // scroll_delta_x
0 commit comments