[webview_flutter_wkwebvew] Fix UIScrollView regression for inset behavior (#6104)
diff --git a/packages/webview_flutter/webview_flutter_wkwebview/CHANGELOG.md b/packages/webview_flutter/webview_flutter_wkwebview/CHANGELOG.md
index 913b0a4..72fab85 100644
--- a/packages/webview_flutter/webview_flutter_wkwebview/CHANGELOG.md
+++ b/packages/webview_flutter/webview_flutter_wkwebview/CHANGELOG.md
@@ -1,3 +1,7 @@
+## 2.9.1
+
+* Fixes regression where the behavior for the `UIScrollView` insets were removed.
+
## 2.9.0
* Ignores unnecessary import warnings in preparation for [upcoming Flutter changes](https://github.com/flutter/flutter/pull/106316).
diff --git a/packages/webview_flutter/webview_flutter_wkwebview/example/ios/RunnerTests/FWFWebViewHostApiTests.m b/packages/webview_flutter/webview_flutter_wkwebview/example/ios/RunnerTests/FWFWebViewHostApiTests.m
index 1061abb..a0026ca 100644
--- a/packages/webview_flutter/webview_flutter_wkwebview/example/ios/RunnerTests/FWFWebViewHostApiTests.m
+++ b/packages/webview_flutter/webview_flutter_wkwebview/example/ios/RunnerTests/FWFWebViewHostApiTests.m
@@ -8,6 +8,8 @@
#import <OCMock/OCMock.h>
+static bool feq(CGFloat a, CGFloat b) { return fabs(b - a) < FLT_EPSILON; }
+
@interface FWFWebViewHostApiTests : XCTestCase
@end
@@ -408,4 +410,60 @@
XCTAssertEqualObjects(errorData.domain, @"errorDomain");
XCTAssertEqualObjects(errorData.localizedDescription, @"description");
}
+
+- (void)testWebViewContentInsetBehaviorShouldBeNeverOnIOS11 API_AVAILABLE(ios(11.0)) {
+ FWFInstanceManager *instanceManager = [[FWFInstanceManager alloc] init];
+ FWFWebViewHostApiImpl *hostAPI = [[FWFWebViewHostApiImpl alloc]
+ initWithBinaryMessenger:OCMProtocolMock(@protocol(FlutterBinaryMessenger))
+ instanceManager:instanceManager];
+
+ [instanceManager addDartCreatedInstance:[[WKWebViewConfiguration alloc] init] withIdentifier:0];
+
+ FlutterError *error;
+ [hostAPI createWithIdentifier:@1 configurationIdentifier:@0 error:&error];
+ FWFWebView *webView = (FWFWebView *)[instanceManager instanceForIdentifier:1];
+
+ XCTAssertEqual(webView.scrollView.contentInsetAdjustmentBehavior,
+ UIScrollViewContentInsetAdjustmentNever);
+}
+
+- (void)testScrollViewsAutomaticallyAdjustsScrollIndicatorInsetsShouldbeNoOnIOS13 API_AVAILABLE(
+ ios(13.0)) {
+ FWFInstanceManager *instanceManager = [[FWFInstanceManager alloc] init];
+ FWFWebViewHostApiImpl *hostAPI = [[FWFWebViewHostApiImpl alloc]
+ initWithBinaryMessenger:OCMProtocolMock(@protocol(FlutterBinaryMessenger))
+ instanceManager:instanceManager];
+
+ [instanceManager addDartCreatedInstance:[[WKWebViewConfiguration alloc] init] withIdentifier:0];
+
+ FlutterError *error;
+ [hostAPI createWithIdentifier:@1 configurationIdentifier:@0 error:&error];
+ FWFWebView *webView = (FWFWebView *)[instanceManager instanceForIdentifier:1];
+
+ XCTAssertFalse(webView.scrollView.automaticallyAdjustsScrollIndicatorInsets);
+}
+
+- (void)testContentInsetsSumAlwaysZeroAfterSetFrame {
+ FWFWebView *webView = [[FWFWebView alloc] initWithFrame:CGRectMake(0, 0, 300, 400)
+ configuration:[[WKWebViewConfiguration alloc] init]];
+
+ webView.scrollView.contentInset = UIEdgeInsetsMake(0, 0, 300, 0);
+ XCTAssertFalse(UIEdgeInsetsEqualToEdgeInsets(webView.scrollView.contentInset, UIEdgeInsetsZero));
+
+ webView.frame = CGRectMake(0, 0, 300, 200);
+ XCTAssertTrue(UIEdgeInsetsEqualToEdgeInsets(webView.scrollView.contentInset, UIEdgeInsetsZero));
+ XCTAssertTrue(CGRectEqualToRect(webView.frame, CGRectMake(0, 0, 300, 200)));
+
+ if (@available(iOS 11, *)) {
+ // After iOS 11, we need to make sure the contentInset compensates the adjustedContentInset.
+ UIScrollView *partialMockScrollView = OCMPartialMock(webView.scrollView);
+ UIEdgeInsets insetToAdjust = UIEdgeInsetsMake(0, 0, 300, 0);
+ OCMStub(partialMockScrollView.adjustedContentInset).andReturn(insetToAdjust);
+ XCTAssertTrue(UIEdgeInsetsEqualToEdgeInsets(webView.scrollView.contentInset, UIEdgeInsetsZero));
+
+ webView.frame = CGRectMake(0, 0, 300, 100);
+ XCTAssertTrue(feq(webView.scrollView.contentInset.bottom, -insetToAdjust.bottom));
+ XCTAssertTrue(CGRectEqualToRect(webView.frame, CGRectMake(0, 0, 300, 100)));
+ }
+}
@end
diff --git a/packages/webview_flutter/webview_flutter_wkwebview/ios/Classes/FWFWebViewHostApi.m b/packages/webview_flutter/webview_flutter_wkwebview/ios/Classes/FWFWebViewHostApi.m
index 9a8aedd..ceaa346 100644
--- a/packages/webview_flutter/webview_flutter_wkwebview/ios/Classes/FWFWebViewHostApi.m
+++ b/packages/webview_flutter/webview_flutter_wkwebview/ios/Classes/FWFWebViewHostApi.m
@@ -20,6 +20,12 @@
if (self) {
_objectApi = [[FWFObjectFlutterApiImpl alloc] initWithBinaryMessenger:binaryMessenger
instanceManager:instanceManager];
+ if (@available(iOS 11.0, *)) {
+ self.scrollView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
+ if (@available(iOS 13.0, *)) {
+ self.scrollView.automaticallyAdjustsScrollIndicatorInsets = NO;
+ }
+ }
}
return self;
}
diff --git a/packages/webview_flutter/webview_flutter_wkwebview/pubspec.yaml b/packages/webview_flutter/webview_flutter_wkwebview/pubspec.yaml
index cd92b86..446f909 100644
--- a/packages/webview_flutter/webview_flutter_wkwebview/pubspec.yaml
+++ b/packages/webview_flutter/webview_flutter_wkwebview/pubspec.yaml
@@ -2,7 +2,7 @@
description: A Flutter plugin that provides a WebView widget based on Apple's WKWebView control.
repository: https://github.com/flutter/plugins/tree/main/packages/webview_flutter/webview_flutter_wkwebview
issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+webview%22
-version: 2.9.0
+version: 2.9.1
environment:
sdk: ">=2.17.0 <3.0.0"