From fa1d5b283cacf92878afb08db6dbb7b74f0c8ea5 Mon Sep 17 00:00:00 2001 From: Chun-Heng Tai Date: Thu, 3 Jun 2021 15:54:01 -0700 Subject: [PATCH 1/3] fixes crash when sets mouseTrackingMode before view is loaded --- .../macos/framework/Source/FlutterViewController.mm | 4 +++- .../framework/Source/FlutterViewControllerTest.mm | 10 ++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/shell/platform/darwin/macos/framework/Source/FlutterViewController.mm b/shell/platform/darwin/macos/framework/Source/FlutterViewController.mm index 942ab17461ea0..8597017a5446f 100644 --- a/shell/platform/darwin/macos/framework/Source/FlutterViewController.mm +++ b/shell/platform/darwin/macos/framework/Source/FlutterViewController.mm @@ -396,7 +396,9 @@ - (void)listenForMetaModifiedKeyUpEvents { } - (void)configureTrackingArea { - NSAssert(self.viewLoaded, @"View must be loaded before setting tracking area"); + if (![self viewLoaded]) { + return; + } if (_mouseTrackingMode != FlutterMouseTrackingModeNone && self.flutterView) { NSTrackingAreaOptions options = NSTrackingMouseEnteredAndExited | NSTrackingMouseMoved | NSTrackingInVisibleRect | NSTrackingEnabledDuringMouseDrag; diff --git a/shell/platform/darwin/macos/framework/Source/FlutterViewControllerTest.mm b/shell/platform/darwin/macos/framework/Source/FlutterViewControllerTest.mm index c0cd3ce4f8100..9ba946617816b 100644 --- a/shell/platform/darwin/macos/framework/Source/FlutterViewControllerTest.mm +++ b/shell/platform/darwin/macos/framework/Source/FlutterViewControllerTest.mm @@ -140,6 +140,16 @@ + (void)respondFalseForSendEvent:(const FlutterKeyEvent&)event EXPECT_EQ([window firstResponder], viewController.flutterView); } +TEST(FlutterViewController, CanSetMouseTrackingModeBeforeViewLoaded) { + NSString* fixtures = @(testing::GetFixturesPath()); + FlutterDartProject* project = [[FlutterDartProject alloc] + initWithAssetsPath:fixtures + ICUDataPath:[fixtures stringByAppendingString:@"/icudtl.dat"]]; + FlutterViewController* viewController = [[FlutterViewController alloc] initWithProject:project]; + viewController.mouseTrackingMode = FlutterMouseTrackingModeInActiveApp; + ASSERT_EQ(viewController.mouseTrackingMode, FlutterMouseTrackingModeInActiveApp); +} + TEST(FlutterViewControllerTest, TestKeyEventsAreSentToFramework) { ASSERT_TRUE([[FlutterViewControllerTestObjC alloc] testKeyEventsAreSentToFramework]); } From 20d19b063590f95a27c91edf49a6558333065459 Mon Sep 17 00:00:00 2001 From: Chun-Heng Tai Date: Thu, 3 Jun 2021 16:31:17 -0700 Subject: [PATCH 2/3] fix build --- .../darwin/macos/framework/Source/FlutterViewController.mm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/shell/platform/darwin/macos/framework/Source/FlutterViewController.mm b/shell/platform/darwin/macos/framework/Source/FlutterViewController.mm index 8597017a5446f..cd4a49c61d025 100644 --- a/shell/platform/darwin/macos/framework/Source/FlutterViewController.mm +++ b/shell/platform/darwin/macos/framework/Source/FlutterViewController.mm @@ -396,7 +396,7 @@ - (void)listenForMetaModifiedKeyUpEvents { } - (void)configureTrackingArea { - if (![self viewLoaded]) { + if (!self.viewLoaded) { return; } if (_mouseTrackingMode != FlutterMouseTrackingModeNone && self.flutterView) { From 1b190b031d09ac7c7d0b9fce8410ef3d881f3161 Mon Sep 17 00:00:00 2001 From: Chun-Heng Tai Date: Fri, 4 Jun 2021 09:58:04 -0700 Subject: [PATCH 3/3] adding comment --- .../darwin/macos/framework/Source/FlutterViewController.mm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/shell/platform/darwin/macos/framework/Source/FlutterViewController.mm b/shell/platform/darwin/macos/framework/Source/FlutterViewController.mm index cd4a49c61d025..d969d556cc4e7 100644 --- a/shell/platform/darwin/macos/framework/Source/FlutterViewController.mm +++ b/shell/platform/darwin/macos/framework/Source/FlutterViewController.mm @@ -397,6 +397,8 @@ - (void)listenForMetaModifiedKeyUpEvents { - (void)configureTrackingArea { if (!self.viewLoaded) { + // The viewDidLoad will call configureTrackingArea again when + // the view is actually loaded. return; } if (_mouseTrackingMode != FlutterMouseTrackingModeNone && self.flutterView) {