mirror of
https://github.com/flutter/flutter.git
synced 2026-02-20 02:29:02 +08:00
Fixes some bugs when multiple Flutter VC shared one engine (flutter/engine#27320)
This commit is contained in:
parent
3c4ae00555
commit
20bf73d974
@ -255,6 +255,7 @@ shared_library("ios_test_flutter") {
|
||||
":ios_gpu_configuration",
|
||||
":ios_test_flutter_mrc",
|
||||
"//flutter/common:common",
|
||||
"//flutter/lib/ui:ui",
|
||||
"//flutter/shell/platform/darwin/common:framework_shared",
|
||||
"//flutter/shell/platform/embedder:embedder_as_internal_library",
|
||||
"//flutter/third_party/tonic",
|
||||
|
||||
@ -641,7 +641,9 @@ static void sendFakeTouchEvent(FlutterEngine* engine,
|
||||
_engineNeedsLaunch = NO;
|
||||
}
|
||||
|
||||
[_engine.get() attachView];
|
||||
if ([_engine.get() viewController] == self) {
|
||||
[_engine.get() attachView];
|
||||
}
|
||||
|
||||
if (@available(iOS 13.4, *)) {
|
||||
_pointerInteraction.reset([[UIPointerInteraction alloc] initWithDelegate:self]);
|
||||
@ -1005,7 +1007,9 @@ static flutter::PointerData::DeviceKind DeviceKindFromTouchType(UITouch* touch)
|
||||
#pragma mark - Handle view resizing
|
||||
|
||||
- (void)updateViewportMetrics {
|
||||
[_engine.get() updateViewportMetrics:_viewportMetrics];
|
||||
if ([_engine.get() viewController] == self) {
|
||||
[_engine.get() updateViewportMetrics:_viewportMetrics];
|
||||
}
|
||||
}
|
||||
|
||||
- (CGFloat)statusBarPadding {
|
||||
|
||||
@ -5,6 +5,7 @@
|
||||
#import <OCMock/OCMock.h>
|
||||
#import <XCTest/XCTest.h>
|
||||
|
||||
#import "flutter/lib/ui/window/viewport_metrics.h"
|
||||
#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"
|
||||
@ -67,6 +68,8 @@ class PointerDataPacket {};
|
||||
libraryURI:(NSString*)libraryURI
|
||||
initialRoute:(NSString*)initialRoute;
|
||||
- (void)dispatchPointerDataPacket:(std::unique_ptr<flutter::PointerDataPacket>)packet;
|
||||
- (void)updateViewportMetrics:(flutter::ViewportMetrics)viewportMetrics;
|
||||
- (void)attachView;
|
||||
@end
|
||||
|
||||
@interface FlutterEngine (TestLowMemory)
|
||||
@ -115,6 +118,7 @@ typedef enum UIAccessibilityContrast : NSInteger {
|
||||
- (void)handlePressEvent:(FlutterUIPressProxy*)press
|
||||
nextAction:(void (^)())next API_AVAILABLE(ios(13.4));
|
||||
- (void)scrollEvent:(UIPanGestureRecognizer*)recognizer;
|
||||
- (void)updateViewportMetrics;
|
||||
@end
|
||||
|
||||
@interface FlutterViewControllerTest : XCTestCase
|
||||
@ -177,6 +181,63 @@ typedef enum UIAccessibilityContrast : NSInteger {
|
||||
XCTAssertNil(weakViewController);
|
||||
}
|
||||
|
||||
- (void)testUpdateViewportMetricsDoesntInvokeEngineWhenNotTheViewController {
|
||||
FlutterEngine* mockEngine = OCMPartialMock([[FlutterEngine alloc] init]);
|
||||
[mockEngine createShell:@"" libraryURI:@"" initialRoute:nil];
|
||||
FlutterViewController* viewControllerA = [[FlutterViewController alloc] initWithEngine:mockEngine
|
||||
nibName:nil
|
||||
bundle:nil];
|
||||
mockEngine.viewController = nil;
|
||||
FlutterViewController* viewControllerB = [[FlutterViewController alloc] initWithEngine:mockEngine
|
||||
nibName:nil
|
||||
bundle:nil];
|
||||
mockEngine.viewController = viewControllerB;
|
||||
[viewControllerA updateViewportMetrics];
|
||||
flutter::ViewportMetrics viewportMetrics;
|
||||
OCMVerify(never(), [mockEngine updateViewportMetrics:viewportMetrics]);
|
||||
}
|
||||
|
||||
- (void)testUpdateViewportMetricsDoesInvokeEngineWhenIsTheViewController {
|
||||
FlutterEngine* mockEngine = OCMPartialMock([[FlutterEngine alloc] init]);
|
||||
[mockEngine createShell:@"" libraryURI:@"" initialRoute:nil];
|
||||
FlutterViewController* viewController = [[FlutterViewController alloc] initWithEngine:mockEngine
|
||||
nibName:nil
|
||||
bundle:nil];
|
||||
mockEngine.viewController = viewController;
|
||||
[viewController updateViewportMetrics];
|
||||
flutter::ViewportMetrics viewportMetrics;
|
||||
OCMVerify([mockEngine updateViewportMetrics:viewportMetrics]);
|
||||
}
|
||||
|
||||
- (void)testViewDidLoadDoesntInvokeEngineWhenNotTheViewController {
|
||||
FlutterEngine* mockEngine = OCMPartialMock([[FlutterEngine alloc] init]);
|
||||
[mockEngine createShell:@"" libraryURI:@"" initialRoute:nil];
|
||||
FlutterViewController* viewControllerA = [[FlutterViewController alloc] initWithEngine:mockEngine
|
||||
nibName:nil
|
||||
bundle:nil];
|
||||
mockEngine.viewController = nil;
|
||||
FlutterViewController* viewControllerB = [[FlutterViewController alloc] initWithEngine:mockEngine
|
||||
nibName:nil
|
||||
bundle:nil];
|
||||
mockEngine.viewController = viewControllerB;
|
||||
UIView* view = viewControllerA.view;
|
||||
XCTAssertNotNil(view);
|
||||
OCMVerify(never(), [mockEngine attachView]);
|
||||
}
|
||||
|
||||
- (void)testViewDidLoadDoesInvokeEngineWhenIsTheViewController {
|
||||
FlutterEngine* mockEngine = OCMPartialMock([[FlutterEngine alloc] init]);
|
||||
[mockEngine createShell:@"" libraryURI:@"" initialRoute:nil];
|
||||
mockEngine.viewController = nil;
|
||||
FlutterViewController* viewController = [[FlutterViewController alloc] initWithEngine:mockEngine
|
||||
nibName:nil
|
||||
bundle:nil];
|
||||
mockEngine.viewController = viewController;
|
||||
UIView* view = viewController.view;
|
||||
XCTAssertNotNil(view);
|
||||
OCMVerify([mockEngine attachView]);
|
||||
}
|
||||
|
||||
- (void)testBinaryMessenger {
|
||||
FlutterViewController* vc = [[FlutterViewController alloc] initWithEngine:self.mockEngine
|
||||
nibName:nil
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user