@@ -18,6 +18,7 @@ @interface FlutterViewControllerTestObjC : NSObject
18
18
- (bool )testKeyEventsAreSentToFramework ;
19
19
- (bool )testKeyEventsArePropagatedIfNotHandled ;
20
20
- (bool )testKeyEventsAreNotPropagatedIfHandled ;
21
+ - (bool )testFlagsChangedEventsArePropagatedIfNotHandled ;
21
22
@end
22
23
23
24
namespace flutter ::testing {
@@ -98,6 +99,11 @@ id mockViewController(NSString* pasteboardString) {
98
99
ASSERT_TRUE ([[FlutterViewControllerTestObjC alloc ] testKeyEventsAreNotPropagatedIfHandled ]);
99
100
}
100
101
102
+ TEST (FlutterViewControllerTest, TestFlagsChangedEventsArePropagatedIfNotHandled) {
103
+ ASSERT_TRUE (
104
+ [[FlutterViewControllerTestObjC alloc ] testFlagsChangedEventsArePropagatedIfNotHandled ]);
105
+ }
106
+
101
107
} // namespace flutter::testing
102
108
103
109
@implementation FlutterViewControllerTestObjC
@@ -185,6 +191,53 @@ - (bool)testKeyEventsArePropagatedIfNotHandled {
185
191
return true ;
186
192
}
187
193
194
+ - (bool )testFlagsChangedEventsArePropagatedIfNotHandled {
195
+ id engineMock = OCMClassMock ([FlutterEngine class ]);
196
+ id binaryMessengerMock = OCMProtocolMock (@protocol (FlutterBinaryMessenger));
197
+ OCMStub ( // NOLINT(google-objc-avoid-throwing-exception)
198
+ [engineMock binaryMessenger ])
199
+ .andReturn (binaryMessengerMock);
200
+ FlutterViewController* viewController = [[FlutterViewController alloc ] initWithEngine: engineMock
201
+ nibName: @" "
202
+ bundle: nil ];
203
+ id responderMock = OCMClassMock ([FlutterIntermediateKeyResponder class ]);
204
+ [viewController addKeyResponder: responderMock];
205
+ NSDictionary * expectedEvent = @{
206
+ @" keymap" : @" macos" ,
207
+ @" type" : @" keydown" ,
208
+ @" keyCode" : @(56 ), // SHIFT key
209
+ @" modifiers" : @(537001986 ),
210
+ };
211
+ NSData * encodedKeyEvent = [[FlutterJSONMessageCodec sharedInstance ] encode: expectedEvent];
212
+ CGEventRef cgEvent = CGEventCreateKeyboardEvent (NULL , 56 , TRUE ); // SHIFT key
213
+ CGEventSetType (cgEvent, kCGEventFlagsChanged );
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 flagsChanged: event];
230
+ @try {
231
+ OCMVerify ( // NOLINT(google-objc-avoid-throwing-exception)
232
+ [binaryMessengerMock sendOnChannel: @" flutter/keyevent"
233
+ message: encodedKeyEvent
234
+ binaryReply: [OCMArg any ]]);
235
+ } @catch (...) {
236
+ return false ;
237
+ }
238
+ return true ;
239
+ }
240
+
188
241
- (bool )testKeyEventsAreNotPropagatedIfHandled {
189
242
id engineMock = OCMClassMock ([FlutterEngine class ]);
190
243
id binaryMessengerMock = OCMProtocolMock (@protocol (FlutterBinaryMessenger));
0 commit comments