[webview_flutter] add gesture navigation for iOS (#2339)
diff --git a/packages/webview_flutter/CHANGELOG.md b/packages/webview_flutter/CHANGELOG.md
index 5230a2b..f3dcd42 100644
--- a/packages/webview_flutter/CHANGELOG.md
+++ b/packages/webview_flutter/CHANGELOG.md
@@ -1,3 +1,7 @@
+## 0.3.19
+
+* Add setting for iOS to allow gesture based navigation.
+
## 0.3.18+1
* Be explicit that keyboard is not ready for production in README.md.
diff --git a/packages/webview_flutter/android/src/main/java/io/flutter/plugins/webviewflutter/FlutterWebView.java b/packages/webview_flutter/android/src/main/java/io/flutter/plugins/webviewflutter/FlutterWebView.java
index 83a7ed6..0e5a560 100644
--- a/packages/webview_flutter/android/src/main/java/io/flutter/plugins/webviewflutter/FlutterWebView.java
+++ b/packages/webview_flutter/android/src/main/java/io/flutter/plugins/webviewflutter/FlutterWebView.java
@@ -272,6 +272,8 @@
webView.setWebContentsDebuggingEnabled(debuggingEnabled);
break;
+ case "gestureNavigationEnabled":
+ break;
case "userAgent":
updateUserAgent((String) settings.get(key));
break;
diff --git a/packages/webview_flutter/example/lib/main.dart b/packages/webview_flutter/example/lib/main.dart
index 20520d1..59c87a2 100644
--- a/packages/webview_flutter/example/lib/main.dart
+++ b/packages/webview_flutter/example/lib/main.dart
@@ -74,6 +74,7 @@
onPageFinished: (String url) {
print('Page finished loading: $url');
},
+ gestureNavigationEnabled: true,
);
}),
floatingActionButton: favoriteButton(),
diff --git a/packages/webview_flutter/example/test_driver/webview_flutter_e2e.dart b/packages/webview_flutter/example/test_driver/webview_flutter_e2e.dart
index 373e65c..9bb7259 100644
--- a/packages/webview_flutter/example/test_driver/webview_flutter_e2e.dart
+++ b/packages/webview_flutter/example/test_driver/webview_flutter_e2e.dart
@@ -652,6 +652,32 @@
expect(currentUrl, 'https://www.google.com/');
});
});
+
+ testWidgets('launches with gestureNavigationEnabled on iOS',
+ (WidgetTester tester) async {
+ final Completer<WebViewController> controllerCompleter =
+ Completer<WebViewController>();
+ await tester.pumpWidget(
+ Directionality(
+ textDirection: TextDirection.ltr,
+ child: SizedBox(
+ width: 400,
+ height: 300,
+ child: WebView(
+ key: GlobalKey(),
+ initialUrl: 'https://flutter.dev/',
+ gestureNavigationEnabled: true,
+ onWebViewCreated: (WebViewController controller) {
+ controllerCompleter.complete(controller);
+ },
+ ),
+ ),
+ ),
+ );
+ final WebViewController controller = await controllerCompleter.future;
+ final String currentUrl = await controller.currentUrl();
+ expect(currentUrl, 'https://flutter.dev/');
+ });
}
// JavaScript booleans evaluate to different string values on Android and iOS.
diff --git a/packages/webview_flutter/ios/Classes/FlutterWebView.m b/packages/webview_flutter/ios/Classes/FlutterWebView.m
index 60fa240..cfcfdaf 100644
--- a/packages/webview_flutter/ios/Classes/FlutterWebView.m
+++ b/packages/webview_flutter/ios/Classes/FlutterWebView.m
@@ -257,6 +257,10 @@
_navigationDelegate.hasDartNavigationDelegate = [hasDartNavigationDelegate boolValue];
} else if ([key isEqualToString:@"debuggingEnabled"]) {
// no-op debugging is always enabled on iOS.
+ } else if ([key isEqualToString:@"gestureNavigationEnabled"]) {
+ NSNumber* allowsBackForwardNavigationGestures = settings[key];
+ _webView.allowsBackForwardNavigationGestures =
+ [allowsBackForwardNavigationGestures boolValue];
} else if ([key isEqualToString:@"userAgent"]) {
NSString* userAgent = settings[key];
[self updateUserAgent:[userAgent isEqual:[NSNull null]] ? nil : userAgent];
diff --git a/packages/webview_flutter/lib/platform_interface.dart b/packages/webview_flutter/lib/platform_interface.dart
index a3af47a..aaf63c2 100644
--- a/packages/webview_flutter/lib/platform_interface.dart
+++ b/packages/webview_flutter/lib/platform_interface.dart
@@ -231,6 +231,7 @@
this.javascriptMode,
this.hasNavigationDelegate,
this.debuggingEnabled,
+ this.gestureNavigationEnabled,
@required this.userAgent,
}) : assert(userAgent != null);
@@ -255,9 +256,14 @@
/// See also [WebView.userAgent].
final WebSetting<String> userAgent;
+ /// Whether to allow swipe based navigation in iOS.
+ ///
+ /// See also: [WebView.gestureNavigationEnabled]
+ final bool gestureNavigationEnabled;
+
@override
String toString() {
- return 'WebSettings(javascriptMode: $javascriptMode, hasNavigationDelegate: $hasNavigationDelegate, debuggingEnabled: $debuggingEnabled, userAgent: $userAgent,)';
+ return 'WebSettings(javascriptMode: $javascriptMode, hasNavigationDelegate: $hasNavigationDelegate, debuggingEnabled: $debuggingEnabled, gestureNavigationEnabled: $gestureNavigationEnabled, userAgent: $userAgent)';
}
}
diff --git a/packages/webview_flutter/lib/src/webview_method_channel.dart b/packages/webview_flutter/lib/src/webview_method_channel.dart
index ad5a81e..03d392e 100644
--- a/packages/webview_flutter/lib/src/webview_method_channel.dart
+++ b/packages/webview_flutter/lib/src/webview_method_channel.dart
@@ -137,6 +137,8 @@
_addIfNonNull('jsMode', settings.javascriptMode?.index);
_addIfNonNull('hasNavigationDelegate', settings.hasNavigationDelegate);
_addIfNonNull('debuggingEnabled', settings.debuggingEnabled);
+ _addIfNonNull(
+ 'gestureNavigationEnabled', settings.gestureNavigationEnabled);
_addSettingIfPresent('userAgent', settings.userAgent);
return map;
}
diff --git a/packages/webview_flutter/lib/webview_flutter.dart b/packages/webview_flutter/lib/webview_flutter.dart
index a57e2e1..a91a9ac 100644
--- a/packages/webview_flutter/lib/webview_flutter.dart
+++ b/packages/webview_flutter/lib/webview_flutter.dart
@@ -148,6 +148,7 @@
this.onPageStarted,
this.onPageFinished,
this.debuggingEnabled = false,
+ this.gestureNavigationEnabled = false,
this.userAgent,
this.initialMediaPlaybackPolicy =
AutoMediaPlaybackPolicy.require_user_action_for_all_media_types,
@@ -290,6 +291,13 @@
final bool debuggingEnabled;
/// The value used for the HTTP User-Agent: request header.
+ /// A Boolean value indicating whether horizontal swipe gestures will trigger back-forward list navigations.
+ ///
+ /// This only works on iOS.
+ ///
+ /// By default `gestureNavigationEnabled` is false.
+ final bool gestureNavigationEnabled;
+
///
/// When null the platform's webview default is used for the User-Agent header.
///
@@ -383,6 +391,7 @@
javascriptMode: widget.javascriptMode,
hasNavigationDelegate: widget.navigationDelegate != null,
debuggingEnabled: widget.debuggingEnabled,
+ gestureNavigationEnabled: widget.gestureNavigationEnabled,
userAgent: WebSetting<String>.of(widget.userAgent),
);
}
diff --git a/packages/webview_flutter/pubspec.yaml b/packages/webview_flutter/pubspec.yaml
index 8983f05..5979ec7 100644
--- a/packages/webview_flutter/pubspec.yaml
+++ b/packages/webview_flutter/pubspec.yaml
@@ -1,6 +1,6 @@
name: webview_flutter
description: A Flutter plugin that provides a WebView widget on Android and iOS.
-version: 0.3.18+1
+version: 0.3.19
homepage: https://github.com/flutter/plugins/tree/master/packages/webview_flutter
environment:
diff --git a/packages/webview_flutter/test/webview_flutter_test.dart b/packages/webview_flutter/test/webview_flutter_test.dart
index 1772df3..10c7bbb 100644
--- a/packages/webview_flutter/test/webview_flutter_test.dart
+++ b/packages/webview_flutter/test/webview_flutter_test.dart
@@ -822,6 +822,7 @@
await tester.pumpWidget(
const WebView(
initialUrl: 'https://youtube.com',
+ gestureNavigationEnabled: true,
),
);
@@ -837,6 +838,7 @@
hasNavigationDelegate: false,
debuggingEnabled: false,
userAgent: WebSetting<String>.of(null),
+ gestureNavigationEnabled: true,
),
// TODO(iskakaushik): Remove this when collection literals makes it to stable.
// ignore: prefer_collection_literals
@@ -1193,6 +1195,8 @@
_webSettings.hasNavigationDelegate ==
webSettings.hasNavigationDelegate &&
_webSettings.debuggingEnabled == webSettings.debuggingEnabled &&
+ _webSettings.gestureNavigationEnabled ==
+ webSettings.gestureNavigationEnabled &&
_webSettings.userAgent == webSettings.userAgent;
}
}