From 7a210d45252c33a4a0940efbd80466bf8280c5ce Mon Sep 17 00:00:00 2001 From: Matej Knopp Date: Mon, 2 Oct 2023 16:25:42 +0200 Subject: [PATCH] [macOS] Fix tests failing on Sonoma --- .../Source/FlutterKeyboardManagerTest.mm | 4 +- .../Source/FlutterViewControllerTest.mm | 47 +++++++++++++++++-- 2 files changed, 46 insertions(+), 5 deletions(-) diff --git a/shell/platform/darwin/macos/framework/Source/FlutterKeyboardManagerTest.mm b/shell/platform/darwin/macos/framework/Source/FlutterKeyboardManagerTest.mm index 4bb5766791102..5e57509f704c6 100644 --- a/shell/platform/darwin/macos/framework/Source/FlutterKeyboardManagerTest.mm +++ b/shell/platform/darwin/macos/framework/Source/FlutterKeyboardManagerTest.mm @@ -276,7 +276,9 @@ - (nonnull instancetype)init { OCMStub([viewDelegateMock onTextInputKeyEvent:[OCMArg any]]) .andCall(self, @selector(handleTextInputKeyEvent:)); OCMStub([viewDelegateMock getBinaryMessenger]).andReturn(_messengerMock); - OCMStub([viewDelegateMock sendKeyEvent:FlutterKeyEvent {} callback:nil userData:nil]) + OCMStub([viewDelegateMock sendKeyEvent:*(const FlutterKeyEvent*)[OCMArg anyPointer] + callback:nil + userData:nil]) .ignoringNonObjectArgs() .andCall(self, @selector(handleEmbedderEvent:callback:userData:)); OCMStub([viewDelegateMock subscribeToKeyboardLayoutChange:[OCMArg any]]) diff --git a/shell/platform/darwin/macos/framework/Source/FlutterViewControllerTest.mm b/shell/platform/darwin/macos/framework/Source/FlutterViewControllerTest.mm index 76d11595a720c..e5f5befd2ff2a 100644 --- a/shell/platform/darwin/macos/framework/Source/FlutterViewControllerTest.mm +++ b/shell/platform/darwin/macos/framework/Source/FlutterViewControllerTest.mm @@ -38,6 +38,42 @@ - (void)dealloc { } @end +/// Responder wrapper that forwards key events to another responder. This is a necessary middle step +/// for mocking responder because when setting the responder to controller AppKit will access ivars +/// of the objects, which means it must extend NSResponder instead of just implementing the +/// selectors. +@interface FlutterResponderWrapper : NSResponder { + NSResponder* _responder; +} +@end + +@implementation FlutterResponderWrapper + +- (instancetype)initWithResponder:(NSResponder*)responder { + if (self = [super init]) { + _responder = responder; + } + return self; +} + +- (void)keyDown:(NSEvent*)event { + [_responder keyDown:event]; +} + +- (void)keyUp:(NSEvent*)event { + [_responder keyUp:event]; +} + +- (BOOL)performKeyEquivalent:(NSEvent*)event { + return [_responder performKeyEquivalent:event]; +} + +- (void)flagsChanged:(NSEvent*)event { + [_responder flagsChanged:event]; +} + +@end + // A FlutterViewController subclass for testing that mouseDown/mouseUp get called when // mouse events are sent to the associated view. @interface MouseEventFlutterViewController : FlutterViewController @@ -417,7 +453,8 @@ - (bool)testKeyEventsArePropagatedIfNotHandled { nibName:@"" bundle:nil]; id responderMock = flutter::testing::mockResponder(); - viewController.nextResponder = responderMock; + id responderWrapper = [[FlutterResponderWrapper alloc] initWithResponder:responderMock]; + viewController.nextResponder = responderWrapper; NSDictionary* expectedEvent = @{ @"keymap" : @"macos", @"type" : @"keydown", @@ -493,7 +530,8 @@ - (bool)testFlagsChangedEventsArePropagatedIfNotHandled { nibName:@"" bundle:nil]; id responderMock = flutter::testing::mockResponder(); - viewController.nextResponder = responderMock; + id responderWrapper = [[FlutterResponderWrapper alloc] initWithResponder:responderMock]; + viewController.nextResponder = responderWrapper; NSDictionary* expectedEvent = @{ @"keymap" : @"macos", @"type" : @"keydown", @@ -546,7 +584,8 @@ - (bool)testKeyEventsAreNotPropagatedIfHandled { nibName:@"" bundle:nil]; id responderMock = flutter::testing::mockResponder(); - viewController.nextResponder = responderMock; + id responderWrapper = [[FlutterResponderWrapper alloc] initWithResponder:responderMock]; + viewController.nextResponder = responderWrapper; NSDictionary* expectedEvent = @{ @"keymap" : @"macos", @"type" : @"keydown", @@ -825,7 +864,7 @@ - (bool)testTrackpadGesturesAreSentToFramework { CGEventRef cgEventDiscreteShift = CGEventCreateScrollWheelEvent(NULL, kCGScrollEventUnitPixel, 1, 0); CGEventSetType(cgEventDiscreteShift, kCGEventScrollWheel); - CGEventSetFlags(cgEventDiscreteShift, kCGEventFlagMaskShift); + CGEventSetFlags(cgEventDiscreteShift, kCGEventFlagMaskShift | flutter::kModifierFlagShiftLeft); CGEventSetIntegerValueField(cgEventDiscreteShift, kCGScrollWheelEventIsContinuous, 0); CGEventSetIntegerValueField(cgEventDiscreteShift, kCGScrollWheelEventDeltaAxis2, 0); // scroll_delta_x