@@ -18,6 +18,7 @@ @interface FlutterViewControllerTestObjC : NSObject
18
18
- (bool )testKeyEventsAreSentToFramework ;
19
19
- (bool )testKeyEventsArePropagatedIfNotHandled ;
20
20
- (bool )testKeyEventsAreNotPropagatedIfHandled ;
21
+ - (bool )testModifierChangedEventsArePropagatedIfNotHandled ;
21
22
@end
22
23
23
24
namespace flutter ::testing {
@@ -98,6 +99,10 @@ id mockViewController(NSString* pasteboardString) {
98
99
ASSERT_TRUE ([[FlutterViewControllerTestObjC alloc ] testKeyEventsAreNotPropagatedIfHandled ]);
99
100
}
100
101
102
+ TEST (FlutterViewControllerTest, TestModifierChangedEventsArePropagatedIfNotHandled) {
103
+ ASSERT_TRUE ([[FlutterViewControllerTestObjC alloc ] testModifierChangedEventsArePropagatedIfNotHandled ]);
104
+ }
105
+
101
106
} // namespace flutter::testing
102
107
103
108
@implementation FlutterViewControllerTestObjC
@@ -185,6 +190,57 @@ - (bool)testKeyEventsArePropagatedIfNotHandled {
185
190
return true ;
186
191
}
187
192
193
+ - (bool )testModifierChangedEventsArePropagatedIfNotHandled {
194
+ id engineMock = OCMClassMock ([FlutterEngine class ]);
195
+ id binaryMessengerMock = OCMProtocolMock (@protocol (FlutterBinaryMessenger));
196
+ OCMStub ( // NOLINT(google-objc-avoid-throwing-exception)
197
+ [engineMock binaryMessenger ])
198
+ .andReturn (binaryMessengerMock);
199
+ FlutterViewController* viewController = [[FlutterViewController alloc ] initWithEngine: engineMock
200
+ nibName: @" "
201
+ bundle: nil ];
202
+ id responderMock = OCMClassMock ([FlutterIntermediateKeyResponder class ]);
203
+ [viewController addKeyResponder: responderMock];
204
+ NSDictionary * expectedEvent = @{
205
+ @" keymap" : @" macos" ,
206
+ @" type" : @" keydown" ,
207
+ @" keyCode" : @(56 ), // SHIFT key
208
+ @" modifiers" : @(131330 ),
209
+ @" characters" : @" " ,
210
+ @" charactersIgnoringModifiers" : @" " ,
211
+ };
212
+ NSData * encodedKeyEvent = [[FlutterJSONMessageCodec sharedInstance ] encode: expectedEvent];
213
+ CGEventRef cgEvent = CGEventCreateKeyboardEvent (NULL , 56 , TRUE ); // SHIFT key
214
+ NSEvent * event = [NSEvent eventWithCGEvent: cgEvent];
215
+ OCMExpect ( // NOLINT(google-objc-avoid-throwing-exception)
216
+ [binaryMessengerMock sendOnChannel: @" flutter/keyevent"
217
+ message: encodedKeyEvent
218
+ binaryReply: [OCMArg any ]])
219
+ .andDo ((^(NSInvocation * invocation) {
220
+ FlutterBinaryReply handler;
221
+ [invocation getArgument: &handler atIndex: 4 ];
222
+ NSDictionary * reply = @{
223
+ @" handled" : @(false ),
224
+ };
225
+ NSData * encodedReply = [[FlutterJSONMessageCodec sharedInstance ] encode: reply];
226
+ handler (encodedReply);
227
+ }));
228
+ [viewController viewWillAppear ]; // Initializes the event channel.
229
+ [viewController keyDown: event];
230
+ [viewController flagsChanged: event];
231
+ @try {
232
+ OCMVerify ( // NOLINT(google-objc-avoid-throwing-exception)
233
+ [responderMock handleKeyDown: [OCMArg any ]]);
234
+ OCMVerify ( // NOLINT(google-objc-avoid-throwing-exception)
235
+ [binaryMessengerMock sendOnChannel: @" flutter/keyevent"
236
+ message: encodedKeyEvent
237
+ binaryReply: [OCMArg any ]]);
238
+ } @catch (...) {
239
+ return false ;
240
+ }
241
+ return true ;
242
+ }
243
+
188
244
- (bool )testKeyEventsAreNotPropagatedIfHandled {
189
245
id engineMock = OCMClassMock ([FlutterEngine class ]);
190
246
id binaryMessengerMock = OCMProtocolMock (@protocol (FlutterBinaryMessenger));
0 commit comments