Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.

Commit b9a334f

Browse files
committed
add test
1 parent 9a6a31e commit b9a334f

File tree

2 files changed

+63
-2
lines changed

2 files changed

+63
-2
lines changed

shell/platform/darwin/macos/framework/Source/FlutterViewController.mm

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -504,7 +504,7 @@ - (void)propagateKeyEvent:(NSEvent*)event ofType:(NSString*)type {
504504
return;
505505
}
506506
}
507-
if ([self.nextResponder respondsToSelector:@selector(keyDown:)]) {
507+
if ([self.nextResponder respondsToSelector:@selector(keyDown:)] && event.type == NSEventTypeKeyDown) {
508508
[self.nextResponder keyDown:event];
509509
}
510510
} else if ([type isEqual:@"keyup"]) {
@@ -513,13 +513,18 @@ - (void)propagateKeyEvent:(NSEvent*)event ofType:(NSString*)type {
513513
return;
514514
}
515515
}
516-
if ([self.nextResponder respondsToSelector:@selector(keyUp:)]) {
516+
if ([self.nextResponder respondsToSelector:@selector(keyUp:)] && event.type == NSEventTypeKeyUp) {
517517
[self.nextResponder keyUp:event];
518518
}
519519
}
520+
if ([self.nextResponder respondsToSelector:@selector(flagsChanged:)] && event.type == NSEventTypeFlagsChanged) {
521+
[self.nextResponder flagsChanged:event];
522+
}
520523
}
521524

522525
- (void)dispatchKeyEvent:(NSEvent*)event ofType:(NSString*)type {
526+
// Be sure to add a handler in propagateKeyEvent if you allow more event
527+
// types here.
523528
if (event.type != NSEventTypeKeyDown && event.type != NSEventTypeKeyUp &&
524529
event.type != NSEventTypeFlagsChanged) {
525530
return;

shell/platform/darwin/macos/framework/Source/FlutterViewControllerTest.mm

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ @interface FlutterViewControllerTestObjC : NSObject
1818
- (bool)testKeyEventsAreSentToFramework;
1919
- (bool)testKeyEventsArePropagatedIfNotHandled;
2020
- (bool)testKeyEventsAreNotPropagatedIfHandled;
21+
- (bool)testModifierChangedEventsArePropagatedIfNotHandled;
2122
@end
2223

2324
namespace flutter::testing {
@@ -98,6 +99,10 @@ id mockViewController(NSString* pasteboardString) {
9899
ASSERT_TRUE([[FlutterViewControllerTestObjC alloc] testKeyEventsAreNotPropagatedIfHandled]);
99100
}
100101

102+
TEST(FlutterViewControllerTest, TestModifierChangedEventsArePropagatedIfNotHandled) {
103+
ASSERT_TRUE([[FlutterViewControllerTestObjC alloc] testModifierChangedEventsArePropagatedIfNotHandled]);
104+
}
105+
101106
} // namespace flutter::testing
102107

103108
@implementation FlutterViewControllerTestObjC
@@ -185,6 +190,57 @@ - (bool)testKeyEventsArePropagatedIfNotHandled {
185190
return true;
186191
}
187192

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+
188244
- (bool)testKeyEventsAreNotPropagatedIfHandled {
189245
id engineMock = OCMClassMock([FlutterEngine class]);
190246
id binaryMessengerMock = OCMProtocolMock(@protocol(FlutterBinaryMessenger));

0 commit comments

Comments
 (0)