@@ -957,13 +957,17 @@ - (bool)testMouseDownUpEventsSentToNextResponder {
957
957
958
958
- (bool )testModifierKeysAreSynthesizedOnMouseMove {
959
959
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
+
960
965
// Need to return a real renderer to allow view controller to load.
961
966
FlutterRenderer* renderer_ = [[FlutterRenderer alloc ] initWithFlutterEngine: engineMock];
962
967
OCMStub ([engineMock renderer ]).andReturn (renderer_);
963
968
964
969
// Capture calls to sendKeyEvent
965
- __block NSMutableArray <KeyEventWrapper*>* events =
966
- [[NSMutableArray <KeyEventWrapper*> alloc] init ];
970
+ __block NSMutableArray <KeyEventWrapper*>* events = [NSMutableArray array ];
967
971
OCMStub ([[engineMock ignoringNonObjectArgs ] sendKeyEvent: FlutterKeyEvent {}
968
972
callback: nil
969
973
userData: nil ])
@@ -973,6 +977,17 @@ - (bool)testModifierKeysAreSynthesizedOnMouseMove {
973
977
[events addObject: [[KeyEventWrapper alloc ] initWithEvent: event]];
974
978
}));
975
979
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
+
976
991
FlutterViewController* viewController = [[FlutterViewController alloc ] initWithEngine: engineMock
977
992
nibName: @" "
978
993
bundle: nil ];
@@ -987,12 +1002,27 @@ - (bool)testModifierKeysAreSynthesizedOnMouseMove {
987
1002
// For each modifier key, check that key events are synthesized.
988
1003
for (NSNumber * keyCode in flutter::keyCodeToModifierFlag) {
989
1004
FlutterKeyEvent* event;
1005
+ NSDictionary * channelEvent;
990
1006
NSNumber * logicalKey;
991
1007
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
+ }
993
1023
994
1024
// Should synthesize down event.
995
- NSEvent * mouseEvent = flutter::testing::CreateMouseEvent ([ flag unsignedLongValue ] );
1025
+ NSEvent * mouseEvent = flutter::testing::CreateMouseEvent (flag);
996
1026
[viewController mouseMoved: mouseEvent];
997
1027
EXPECT_EQ ([events count ], 1u );
998
1028
event = events[0 ].data ;
@@ -1003,6 +1033,11 @@ - (bool)testModifierKeysAreSynthesizedOnMouseMove {
1003
1033
EXPECT_EQ (event->physical , physicalKey.unsignedLongLongValue );
1004
1034
EXPECT_EQ (event->synthesized , true );
1005
1035
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
+
1006
1041
// Should synthesize up event.
1007
1042
mouseEvent = flutter::testing::CreateMouseEvent (0x00 );
1008
1043
[viewController mouseMoved: mouseEvent];
@@ -1015,7 +1050,13 @@ - (bool)testModifierKeysAreSynthesizedOnMouseMove {
1015
1050
EXPECT_EQ (event->physical , physicalKey.unsignedLongLongValue );
1016
1051
EXPECT_EQ (event->synthesized , true );
1017
1052
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
+
1018
1058
[events removeAllObjects ];
1059
+ [channelEvents removeAllObjects ];
1019
1060
};
1020
1061
1021
1062
return true ;
0 commit comments