diff --git a/shell/platform/darwin/ios/framework/Source/FlutterUndoManagerPlugin.mm b/shell/platform/darwin/ios/framework/Source/FlutterUndoManagerPlugin.mm index 488704ea4aeb9..b8f4b65f0f561 100644 --- a/shell/platform/darwin/ios/framework/Source/FlutterUndoManagerPlugin.mm +++ b/shell/platform/darwin/ios/framework/Source/FlutterUndoManagerPlugin.mm @@ -104,9 +104,9 @@ - (void)setUndoState:(NSDictionary*)dictionary API_AVAILABLE(ios(9.0)) { // This is needed to notify the iPadOS keyboard that it needs to update the // state of the UIBarButtons. Otherwise, the state changes to NSUndoManager // will not show up until the next keystroke (or other trigger). - id inputDelegate = - _viewController.engine.textInputPlugin.textInputView.inputDelegate; - [inputDelegate selectionDidChange:_viewController.engine.textInputPlugin.textInputView]; + UITextInputAssistantItem* assistantItem = + _viewController.engine.textInputPlugin.textInputView.inputAssistantItem; + assistantItem.leadingBarButtonGroups = assistantItem.leadingBarButtonGroups; } [self undoManager].groupsByEvent = groupsByEvent; } diff --git a/shell/platform/darwin/ios/framework/Source/FlutterUndoManagerPluginTest.mm b/shell/platform/darwin/ios/framework/Source/FlutterUndoManagerPluginTest.mm index 0a30cb1dfb871..d3608ad4c5c37 100644 --- a/shell/platform/darwin/ios/framework/Source/FlutterUndoManagerPluginTest.mm +++ b/shell/platform/darwin/ios/framework/Source/FlutterUndoManagerPluginTest.mm @@ -10,11 +10,13 @@ #import "flutter/shell/platform/darwin/common/framework/Headers/FlutterMacros.h" #import "flutter/shell/platform/darwin/ios/framework/Headers/FlutterEngine.h" #import "flutter/shell/platform/darwin/ios/framework/Headers/FlutterViewController.h" +#import "flutter/shell/platform/darwin/ios/framework/Source/FlutterTextInputPlugin.h" FLUTTER_ASSERT_ARC @interface FlutterEngine () - (nonnull FlutterUndoManagerPlugin*)undoManagerPlugin; +- (nonnull FlutterTextInputPlugin*)textInputPlugin; @end @interface FlutterUndoManagerPluginForTest : FlutterUndoManagerPlugin @@ -50,7 +52,6 @@ - (void)setUp { - (void)tearDown { [self.undoManager removeAllActionsWithTarget:self.undoManagerPlugin]; - self.undoManagerPlugin = nil; self.engine = nil; self.viewController = nil; self.undoManager = nil; @@ -140,4 +141,26 @@ - (void)testSetUndoState { XCTAssertEqual(2, delegateRedoCount); } +- (void)testSetUndoStateDoesInteractWithInputDelegate { + // Regression test for https://github.com/flutter/flutter/issues/133424 + FlutterViewController* viewController = OCMPartialMock(self.viewController); + self.undoManagerPlugin.viewController = self.viewController; + + FlutterTextInputPlugin* textInputPlugin = OCMClassMock([FlutterTextInputPlugin class]); + FlutterTextInputView* textInputView = OCMClassMock([FlutterTextInputView class]); + + OCMStub([viewController engine]).andReturn(self.engine); + OCMStub([self.engine textInputPlugin]).andReturn(textInputPlugin); + OCMStub([textInputPlugin textInputView]).andReturn(textInputView); + + FlutterMethodCall* setUndoStateCall = + [FlutterMethodCall methodCallWithMethodName:@"UndoManager.setUndoState" + arguments:@{@"canUndo" : @NO, @"canRedo" : @NO}]; + [self.undoManagerPlugin handleMethodCall:setUndoStateCall + result:^(id _Nullable result){ + }]; + + OCMVerify(never(), [textInputView inputDelegate]); +} + @end