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

Commit 1f00437

Browse files
committed
add test
1 parent 9a6a31e commit 1f00437

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: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -504,7 +504,8 @@ - (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:)] &&
508+
event.type == NSEventTypeKeyDown) {
508509
[self.nextResponder keyDown:event];
509510
}
510511
} else if ([type isEqual:@"keyup"]) {
@@ -513,13 +514,20 @@ - (void)propagateKeyEvent:(NSEvent*)event ofType:(NSString*)type {
513514
return;
514515
}
515516
}
516-
if ([self.nextResponder respondsToSelector:@selector(keyUp:)]) {
517+
if ([self.nextResponder respondsToSelector:@selector(keyUp:)] &&
518+
event.type == NSEventTypeKeyUp) {
517519
[self.nextResponder keyUp:event];
518520
}
519521
}
522+
if ([self.nextResponder respondsToSelector:@selector(flagsChanged:)] &&
523+
event.type == NSEventTypeFlagsChanged) {
524+
[self.nextResponder flagsChanged:event];
525+
}
520526
}
521527

522528
- (void)dispatchKeyEvent:(NSEvent*)event ofType:(NSString*)type {
529+
// Be sure to add a handler in propagateKeyEvent if you allow more event
530+
// types here.
523531
if (event.type != NSEventTypeKeyDown && event.type != NSEventTypeKeyUp &&
524532
event.type != NSEventTypeFlagsChanged) {
525533
return;

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

Lines changed: 53 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)testFlagsChangedEventsArePropagatedIfNotHandled;
2122
@end
2223

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

102+
TEST(FlutterViewControllerTest, TestFlagsChangedEventsArePropagatedIfNotHandled) {
103+
ASSERT_TRUE(
104+
[[FlutterViewControllerTestObjC alloc] testFlagsChangedEventsArePropagatedIfNotHandled]);
105+
}
106+
101107
} // namespace flutter::testing
102108

103109
@implementation FlutterViewControllerTestObjC
@@ -185,6 +191,53 @@ - (bool)testKeyEventsArePropagatedIfNotHandled {
185191
return true;
186192
}
187193

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

0 commit comments

Comments
 (0)