@@ -957,13 +957,17 @@ - (bool)testMouseDownUpEventsSentToNextResponder {
957957
958958- (bool )testModifierKeysAreSynthesizedOnMouseMove {
959959 id engineMock = flutter::testing::CreateMockFlutterEngine (@" " );
960+ id binaryMessengerMock = OCMProtocolMock (@protocol (FlutterBinaryMessenger));
961+ OCMStub ( // NOLINT(google-objc-avoid-throwing-exception)
962+ [engineMock binaryMessenger ])
963+ .andReturn (binaryMessengerMock);
964+
960965 // Need to return a real renderer to allow view controller to load.
961966 FlutterRenderer* renderer_ = [[FlutterRenderer alloc ] initWithFlutterEngine: engineMock];
962967 OCMStub ([engineMock renderer ]).andReturn (renderer_);
963968
964969 // Capture calls to sendKeyEvent
965- __block NSMutableArray <KeyEventWrapper*>* events =
966- [[NSMutableArray <KeyEventWrapper*> alloc] init ];
970+ __block NSMutableArray <KeyEventWrapper*>* events = [NSMutableArray array ];
967971 OCMStub ([[engineMock ignoringNonObjectArgs ] sendKeyEvent: FlutterKeyEvent {}
968972 callback: nil
969973 userData: nil ])
@@ -973,6 +977,17 @@ - (bool)testModifierKeysAreSynthesizedOnMouseMove {
973977 [events addObject: [[KeyEventWrapper alloc ] initWithEvent: event]];
974978 }));
975979
980+ __block NSMutableArray <NSDictionary *>* channelEvents = [NSMutableArray array ];
981+ OCMStub ([binaryMessengerMock sendOnChannel: @" flutter/keyevent"
982+ message: [OCMArg any ]
983+ binaryReply: [OCMArg any ]])
984+ .andDo ((^(NSInvocation * invocation) {
985+ NSData * data;
986+ [invocation getArgument: &data atIndex: 3 ];
987+ id event = [[FlutterJSONMessageCodec sharedInstance ] decode: data];
988+ [channelEvents addObject: event];
989+ }));
990+
976991 FlutterViewController* viewController = [[FlutterViewController alloc ] initWithEngine: engineMock
977992 nibName: @" "
978993 bundle: nil ];
@@ -987,12 +1002,27 @@ - (bool)testModifierKeysAreSynthesizedOnMouseMove {
9871002 // For each modifier key, check that key events are synthesized.
9881003 for (NSNumber * keyCode in flutter::keyCodeToModifierFlag) {
9891004 FlutterKeyEvent* event;
1005+ NSDictionary * channelEvent;
9901006 NSNumber * logicalKey;
9911007 NSNumber * physicalKey;
992- NSNumber * flag = flutter::keyCodeToModifierFlag[keyCode];
1008+ NSEventModifierFlags flag = [flutter::keyCodeToModifierFlag[keyCode] unsignedLongValue ];
1009+
1010+ // Cocoa event always contain combined flags.
1011+ if (flag & (flutter::kModifierFlagShiftLeft | flutter::kModifierFlagShiftRight )) {
1012+ flag |= NSEventModifierFlagShift;
1013+ }
1014+ if (flag & (flutter::kModifierFlagControlLeft | flutter::kModifierFlagControlRight )) {
1015+ flag |= NSEventModifierFlagControl;
1016+ }
1017+ if (flag & (flutter::kModifierFlagAltLeft | flutter::kModifierFlagAltRight )) {
1018+ flag |= NSEventModifierFlagOption;
1019+ }
1020+ if (flag & (flutter::kModifierFlagMetaLeft | flutter::kModifierFlagMetaRight )) {
1021+ flag |= NSEventModifierFlagCommand;
1022+ }
9931023
9941024 // Should synthesize down event.
995- NSEvent * mouseEvent = flutter::testing::CreateMouseEvent ([ flag unsignedLongValue ] );
1025+ NSEvent * mouseEvent = flutter::testing::CreateMouseEvent (flag);
9961026 [viewController mouseMoved: mouseEvent];
9971027 EXPECT_EQ ([events count ], 1u );
9981028 event = events[0 ].data ;
@@ -1003,6 +1033,11 @@ - (bool)testModifierKeysAreSynthesizedOnMouseMove {
10031033 EXPECT_EQ (event->physical , physicalKey.unsignedLongLongValue );
10041034 EXPECT_EQ (event->synthesized , true );
10051035
1036+ channelEvent = channelEvents[0 ];
1037+ EXPECT_TRUE ([channelEvent[@" type" ] isEqual: @" keydown" ]);
1038+ EXPECT_TRUE ([channelEvent[@" keyCode" ] isEqual: keyCode]);
1039+ EXPECT_TRUE ([channelEvent[@" modifiers" ] isEqual: @(flag)]);
1040+
10061041 // Should synthesize up event.
10071042 mouseEvent = flutter::testing::CreateMouseEvent (0x00 );
10081043 [viewController mouseMoved: mouseEvent];
@@ -1015,7 +1050,13 @@ - (bool)testModifierKeysAreSynthesizedOnMouseMove {
10151050 EXPECT_EQ (event->physical , physicalKey.unsignedLongLongValue );
10161051 EXPECT_EQ (event->synthesized , true );
10171052
1053+ channelEvent = channelEvents[1 ];
1054+ EXPECT_TRUE ([channelEvent[@" type" ] isEqual: @" keyup" ]);
1055+ EXPECT_TRUE ([channelEvent[@" keyCode" ] isEqual: keyCode]);
1056+ EXPECT_TRUE ([channelEvent[@" modifiers" ] isEqual: @(0 )]);
1057+
10181058 [events removeAllObjects ];
1059+ [channelEvents removeAllObjects ];
10191060 };
10201061
10211062 return true ;
0 commit comments