mirror of
https://github.com/flutter/flutter.git
synced 2026-02-20 02:29:02 +08:00
[iOS] Add FlutterViewController weak pointer check before use (flutter/engine#31008)
This commit is contained in:
parent
67b6d37a8b
commit
a05ff11045
@ -673,7 +673,9 @@ static void SendFakeTouchEvent(FlutterEngine* engine,
|
||||
fml::WeakPtr<FlutterViewController> weakSelf = [self getWeakPtr];
|
||||
FlutterSendKeyEvent sendEvent =
|
||||
^(const FlutterKeyEvent& event, FlutterKeyEventCallback callback, void* userData) {
|
||||
[weakSelf.get()->_engine.get() sendKeyEvent:event callback:callback userData:userData];
|
||||
if (weakSelf) {
|
||||
[weakSelf.get()->_engine.get() sendKeyEvent:event callback:callback userData:userData];
|
||||
}
|
||||
};
|
||||
[self.keyboardManager addPrimaryResponder:[[[FlutterEmbedderKeyResponder alloc]
|
||||
initWithSendEvent:sendEvent] autorelease]];
|
||||
|
||||
@ -10,6 +10,7 @@
|
||||
#import "flutter/shell/platform/darwin/common/framework/Headers/FlutterBinaryMessenger.h"
|
||||
#import "flutter/shell/platform/darwin/common/framework/Headers/FlutterMacros.h"
|
||||
#import "flutter/shell/platform/darwin/ios/framework/Headers/FlutterViewController.h"
|
||||
#import "flutter/shell/platform/darwin/ios/framework/Source/FlutterEmbedderKeyResponder.h"
|
||||
#import "flutter/shell/platform/darwin/ios/framework/Source/FlutterFakeKeyEvents.h"
|
||||
#import "flutter/shell/platform/darwin/ios/framework/Source/FlutterTextInputPlugin.h"
|
||||
#import "flutter/shell/platform/darwin/ios/framework/Source/FlutterViewController_Internal.h"
|
||||
@ -116,6 +117,15 @@ typedef enum UIAccessibilityContrast : NSInteger {
|
||||
@end
|
||||
#endif
|
||||
|
||||
@interface FlutterKeyboardManager (Tests)
|
||||
@property(nonatomic, retain, readonly)
|
||||
NSMutableArray<id<FlutterKeyPrimaryResponder>>* primaryResponders;
|
||||
@end
|
||||
|
||||
@interface FlutterEmbedderKeyResponder (Tests)
|
||||
@property(nonatomic, copy, readonly) FlutterSendKeyEvent sendEvent;
|
||||
@end
|
||||
|
||||
@interface FlutterViewController (Tests)
|
||||
- (void)surfaceUpdated:(BOOL)appeared;
|
||||
- (void)performOrientationUpdate:(UIInterfaceOrientationMask)new_preferences;
|
||||
@ -130,6 +140,7 @@ typedef enum UIAccessibilityContrast : NSInteger {
|
||||
- (void)startKeyBoardAnimation:(NSTimeInterval)duration;
|
||||
- (void)ensureViewportMetricsIsCorrect;
|
||||
- (void)invalidateDisplayLink;
|
||||
- (void)addInternalPlugins;
|
||||
@end
|
||||
|
||||
@interface FlutterViewControllerTest : XCTestCase
|
||||
@ -392,6 +403,24 @@ typedef enum UIAccessibilityContrast : NSInteger {
|
||||
OCMVerify([mockEngine attachView]);
|
||||
}
|
||||
|
||||
- (void)testInternalPluginsWeakPtrNotCrash {
|
||||
FlutterSendKeyEvent sendEvent;
|
||||
@autoreleasepool {
|
||||
FlutterViewController* vc = [[FlutterViewController alloc] initWithProject:nil
|
||||
nibName:nil
|
||||
bundle:nil];
|
||||
[vc addInternalPlugins];
|
||||
FlutterKeyboardManager* keyboardManager = vc.keyboardManager;
|
||||
FlutterEmbedderKeyResponder* keyPrimaryResponder = (FlutterEmbedderKeyResponder*)
|
||||
[(NSArray<id<FlutterKeyPrimaryResponder>>*)keyboardManager.primaryResponders firstObject];
|
||||
sendEvent = [keyPrimaryResponder sendEvent];
|
||||
}
|
||||
|
||||
if (sendEvent) {
|
||||
sendEvent({}, nil, nil);
|
||||
}
|
||||
}
|
||||
|
||||
- (void)testBinaryMessenger {
|
||||
FlutterViewController* vc = [[FlutterViewController alloc] initWithEngine:self.mockEngine
|
||||
nibName:nil
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user