From c6c42eb85e8622bab7b367765953158776138772 Mon Sep 17 00:00:00 2001 From: Nick Bradshaw Date: Fri, 11 Dec 2020 10:31:13 -0800 Subject: [PATCH 01/72] Adding zoom support and defaulting to wideViewPort(true) --- .../io/flutter/plugins/webviewflutter/FlutterWebView.java | 5 +++++ 1 file changed, 5 insertions(+) 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 bfb79a39e8ba..e2e36545f5df 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 @@ -99,6 +99,11 @@ public boolean shouldOverrideUrlLoading(WebView view, String url) { webView.getSettings().setSupportMultipleWindows(true); webView.setWebChromeClient(new FlutterWebChromeClient()); + webView.getSettings().setUseWideViewPort(true); + + webView.getSettings().setSupportZoom(true); + webView.getSettings().setBuiltInZoomControls(false); + methodChannel = new MethodChannel(messenger, "plugins.flutter.io/webview_" + id); methodChannel.setMethodCallHandler(this); From 4c7fdff0ec8150c8c1a99955aabc4accd55a2c5d Mon Sep 17 00:00:00 2001 From: Nick Bradshaw Date: Fri, 11 Dec 2020 11:39:18 -0800 Subject: [PATCH 02/72] Correct webSettings enabling zoom --- .../io/flutter/plugins/webviewflutter/FlutterWebView.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) 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 e2e36545f5df..fa7aa3768476 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 @@ -100,9 +100,10 @@ public boolean shouldOverrideUrlLoading(WebView view, String url) { webView.setWebChromeClient(new FlutterWebChromeClient()); webView.getSettings().setUseWideViewPort(true); - + webView.getSettings().setSupportZoom(true); - webView.getSettings().setBuiltInZoomControls(false); + webView.getSettings().setBuiltInZoomControls(true); + webView.getSettings().setDisplayZoomControls(false); methodChannel = new MethodChannel(messenger, "plugins.flutter.io/webview_" + id); methodChannel.setMethodCallHandler(this); From 1b578a74a21ced3a86739323a3289d937ed366f8 Mon Sep 17 00:00:00 2001 From: Nick Bradshaw Date: Fri, 11 Dec 2020 12:31:19 -0800 Subject: [PATCH 03/72] Setting wideViewPort to false --- .../java/io/flutter/plugins/webviewflutter/FlutterWebView.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 fa7aa3768476..e456f68e43ef 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 @@ -99,7 +99,7 @@ public boolean shouldOverrideUrlLoading(WebView view, String url) { webView.getSettings().setSupportMultipleWindows(true); webView.setWebChromeClient(new FlutterWebChromeClient()); - webView.getSettings().setUseWideViewPort(true); + webView.getSettings().setUseWideViewPort(false); webView.getSettings().setSupportZoom(true); webView.getSettings().setBuiltInZoomControls(true); From b850adb32ad701be5ca6626e29cf3110dec3dedf Mon Sep 17 00:00:00 2001 From: Nick Bradshaw Date: Fri, 11 Dec 2020 12:59:20 -0800 Subject: [PATCH 04/72] setLoadWithOverviewMode to true by default --- .../java/io/flutter/plugins/webviewflutter/FlutterWebView.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 e456f68e43ef..f3d1a16d892f 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 @@ -99,11 +99,11 @@ public boolean shouldOverrideUrlLoading(WebView view, String url) { webView.getSettings().setSupportMultipleWindows(true); webView.setWebChromeClient(new FlutterWebChromeClient()); - webView.getSettings().setUseWideViewPort(false); webView.getSettings().setSupportZoom(true); webView.getSettings().setBuiltInZoomControls(true); webView.getSettings().setDisplayZoomControls(false); + webView.getSettings().setLoadWithOverviewMode(true); methodChannel = new MethodChannel(messenger, "plugins.flutter.io/webview_" + id); methodChannel.setMethodCallHandler(this); From 5928ebc273af8e272d347f459337eba4ce684734 Mon Sep 17 00:00:00 2001 From: Nick Bradshaw Date: Fri, 11 Dec 2020 13:21:57 -0800 Subject: [PATCH 05/72] Tweak WebSettings to try to get loadWithOverviewMode working --- .../io/flutter/plugins/webviewflutter/FlutterWebView.java | 4 ++++ 1 file changed, 4 insertions(+) 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 f3d1a16d892f..552b8a1e247c 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 @@ -100,9 +100,13 @@ public boolean shouldOverrideUrlLoading(WebView view, String url) { webView.setWebChromeClient(new FlutterWebChromeClient()); + // Allow pinch to zoom webView.getSettings().setSupportZoom(true); webView.getSettings().setBuiltInZoomControls(true); webView.getSettings().setDisplayZoomControls(false); + + // Set the content to zoom out and fit screen + webView.getSettings().setUseWideViewPort(true); webView.getSettings().setLoadWithOverviewMode(true); methodChannel = new MethodChannel(messenger, "plugins.flutter.io/webview_" + id); From fe4e189feaa72458374b1079bcf6732964015c50 Mon Sep 17 00:00:00 2001 From: Nick Bradshaw Date: Fri, 11 Dec 2020 15:07:04 -0800 Subject: [PATCH 06/72] Adding tests --- .../webviewflutter/FlutterWebView.java | 58 +++- .../lib/platform_interface.dart | 24 ++ .../lib/src/webview_method_channel.dart | 8 + .../webview_flutter/lib/webview_flutter.dart | 67 +++++ .../test/webview_flutter_test.dart | 262 +++++++++++++++++- 5 files changed, 408 insertions(+), 11 deletions(-) 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 552b8a1e247c..932f7f187c3d 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 @@ -99,16 +99,6 @@ public boolean shouldOverrideUrlLoading(WebView view, String url) { webView.getSettings().setSupportMultipleWindows(true); webView.setWebChromeClient(new FlutterWebChromeClient()); - - // Allow pinch to zoom - webView.getSettings().setSupportZoom(true); - webView.getSettings().setBuiltInZoomControls(true); - webView.getSettings().setDisplayZoomControls(false); - - // Set the content to zoom out and fit screen - webView.getSettings().setUseWideViewPort(true); - webView.getSettings().setLoadWithOverviewMode(true); - methodChannel = new MethodChannel(messenger, "plugins.flutter.io/webview_" + id); methodChannel.setMethodCallHandler(this); @@ -131,6 +121,18 @@ public boolean shouldOverrideUrlLoading(WebView view, String url) { String url = (String) params.get("initialUrl"); webView.loadUrl(url); } + if (params.containsKey("setBuiltInZoomControls")) { + boolean enable = (Boolean) params.get("setBuiltInZoomControls"); + updatesetBuiltInZoomControls(enable); + } + if (params.containsKey("useWideViewPort")) { + boolean enable = (Boolean) params.get("useWideViewPort"); + setUseWideViewPort(enable); + } + if (params.containsKey("loadWithOverviewMode")) { + boolean enable = (Boolean) params.get("loadWithOverviewMode"); + setLoadWithOverviewMode(enable); + } } @Override @@ -382,6 +384,21 @@ private void applySettings(Map settings) { case "userAgent": updateUserAgent((String) settings.get(key)); break; + case "setSupportZoom": + setSupportZoom((boolean) settings.get(key)); + break; + case "setBuiltInZoomControls": + setBuiltInZoomControls((boolean) settings.get(key)); + break; + case "setDisplayZoomControls": + setDisplayZoomControls((boolean) settings.get(key)); + break; + case "setUseWideViewPort": + setUseWideViewPort((boolean) settings.get(key)); + break; + case "setLoadWithOverviewMode": + setLoadWithOverviewMode((boolean) settings.get(key)); + break; default: throw new IllegalArgumentException("Unknown WebView setting: " + key); } @@ -421,6 +438,27 @@ private void updateUserAgent(String userAgent) { webView.getSettings().setUserAgentString(userAgent); } + private void setSupportZoom(boolean shouldEnable) { + webView.getSettings().setSupportZoom(shouldSupport); + } + + private void setBuiltInZoomControls(boolean shouldEnable) { + webView.getSettings().setBuiltInZoomControls(shouldSupport); + } + + private void setDisplayZoomControls(boolean shouldEnable) { + // oOn-screen zoom controls are deprecated in Android (see ZoomButtonsController) so it's recommended to set this to false. + webView.getSettings().setDisplayZoomControls(shouldEnable); + } + + private void setUseWideViewPort(boolean shouldEnable) { + webView.getSettings().setUseWideViewPort(shouldEnable); + } + + private void setLoadWithOverviewMode(boolean shouldEnable) { + webView.getSettings().setLoadWithOverviewMode(shouldEnable); + } + @Override public void dispose() { methodChannel.setMethodCallHandler(null); diff --git a/packages/webview_flutter/lib/platform_interface.dart b/packages/webview_flutter/lib/platform_interface.dart index 6c991b14a76e..6de1a4a96c6c 100644 --- a/packages/webview_flutter/lib/platform_interface.dart +++ b/packages/webview_flutter/lib/platform_interface.dart @@ -382,6 +382,11 @@ class WebSettings { this.hasNavigationDelegate, this.debuggingEnabled, this.gestureNavigationEnabled, + this.setSupportZoom, + this.setBuiltInZoomControls, + this.setDisplayZoomControls, + this.setUseWideViewPort, + this.setLoadWithOverviewMode, @required this.userAgent, }) : assert(userAgent != null); @@ -411,6 +416,25 @@ class WebSettings { /// See also: [WebView.gestureNavigationEnabled] final bool gestureNavigationEnabled; + /// Sets whether the WebView should support zooming using its on-screen zoom controls and gestures. + final WebSetting setSupportZoom; + + /// Sets whether the WebView should use its built-in zoom mechanisms. + final WebSetting setBuiltInZoomControls; + + /// Sets whether the WebView should display on-screen zoom controls when using the built-in zoom mechanisms. + /// + ///The default is true. However, on-screen zoom controls are deprecated in Android so it's recommended to set this to false. + final WebSetting setDisplayZoomControls; + + /// Sets whether the WebView should enable support for the "viewport" HTML meta tag or should use a wide viewport. + final WebSetting setUseWideViewPort; + + /// Sets whether the WebView loads pages in overview mode, that is, zooms out the content to fit on screen by width. + /// + /// This setting is taken into account when the content width is greater than the width of the WebView control, for example, when getUseWideViewPort() is enabled. + final WebSetting setLoadWithOverviewMode; + @override String toString() { 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 348b225bb257..699a351a3fb9 100644 --- a/packages/webview_flutter/lib/src/webview_method_channel.dart +++ b/packages/webview_flutter/lib/src/webview_method_channel.dart @@ -182,6 +182,14 @@ class MethodChannelWebViewPlatform implements WebViewPlatformController { _addIfNonNull( 'gestureNavigationEnabled', settings.gestureNavigationEnabled); _addSettingIfPresent('userAgent', settings.userAgent); + _addSettingIfPresent('setSupportZoom', settings.setSupportZoom); + _addSettingIfPresent( + 'setBuiltInZoomControls', settings.setBuiltInZoomControls); + _addSettingIfPresent( + 'setDisplayZoomControls', settings.setDisplayZoomControls); + _addSettingIfPresent('setUseWideViewPort', settings.setUseWideViewPort); + _addSettingIfPresent( + 'setLoadWithOverviewMode', settings.setLoadWithOverviewMode); return map; } diff --git a/packages/webview_flutter/lib/webview_flutter.dart b/packages/webview_flutter/lib/webview_flutter.dart index 2fdf639180a7..decd4820bada 100644 --- a/packages/webview_flutter/lib/webview_flutter.dart +++ b/packages/webview_flutter/lib/webview_flutter.dart @@ -221,6 +221,11 @@ class WebView extends StatefulWidget { this.debuggingEnabled = false, this.gestureNavigationEnabled = false, this.userAgent, + this.setSupportZoom = true, + this.setBuiltInZoomControls = true, + this.setDisplayZoomControls = false, + this.setUseWideViewPort, + this.setLoadWithOverviewMode, this.initialMediaPlaybackPolicy = AutoMediaPlaybackPolicy.require_user_action_for_all_media_types, }) : assert(javascriptMode != null), @@ -388,6 +393,35 @@ class WebView extends StatefulWidget { /// By default `userAgent` is null. final String userAgent; + /// Sets whether the WebView should support zooming using its on-screen zoom controls and gestures. + /// + /// The particular zoom mechanisms that should be used can be set with setBuiltInZoomControls(boolean). + final bool setSupportZoom; + + ///Sets whether the WebView should use its built-in zoom mechanisms. + /// + ///The built-in zoom mechanisms comprise on-screen zoom controls, which are displayed over the WebView's content, and the use of a pinch gesture to control zooming. + final bool setBuiltInZoomControls; + + ///Sets whether the WebView should use its built-in zoom mechanisms. + /// + ///The built-in zoom mechanisms comprise on-screen zoom controls, which are displayed over the WebView's content, and the use of a pinch gesture to control zooming. + final bool setDisplayZoomControls; + + /// Sets whether the WebView should enable support for the "viewport" HTML meta tag or should use a wide viewport. + /// + /// When the value of the setting is false, the layout width is always set to the width of the WebView control in device-independent (CSS) pixels. + /// + /// When the value is true and the page contains the viewport meta tag, the value of the width specified in the tag is used. + /// + /// If the page does not contain the tag or does not provide a width, then a wide viewport will be used. + final bool setUseWideViewPort; + + /// Sets whether the WebView loads pages in overview mode, that is, zooms out the content to fit on screen by width. + /// + /// This setting is taken into account when the content width is greater than the width of the WebView control, for example, when getUseWideViewPort() is enabled. + final bool setLoadWithOverviewMode; + /// Which restrictions apply on automatic media playback. /// /// This initial value is applied to the platform's webview upon creation. Any following @@ -470,6 +504,12 @@ WebSettings _webSettingsFromWidget(WebView widget) { debuggingEnabled: widget.debuggingEnabled, gestureNavigationEnabled: widget.gestureNavigationEnabled, userAgent: WebSetting.of(widget.userAgent), + setSupportZoom: WebSetting.of(widget.setSupportZoom), + setBuiltInZoomControls: WebSetting.of(widget.setBuiltInZoomControls), + setDisplayZoomControls: WebSetting.of(widget.setDisplayZoomControls), + setUseWideViewPort: WebSetting.of(widget.setUseWideViewPort), + setLoadWithOverviewMode: + WebSetting.of(widget.setLoadWithOverviewMode), ); } @@ -489,6 +529,12 @@ WebSettings _clearUnchangedWebSettings( bool hasNavigationDelegate; bool debuggingEnabled; WebSetting userAgent = WebSetting.absent(); + bool setSupportZoom; + bool setBuiltInZoomControls; + bool setDisplayZoomControls; + bool setUseWideViewPort; + bool setLoadWithOverviewMode; + if (currentValue.javascriptMode != newValue.javascriptMode) { javascriptMode = newValue.javascriptMode; } @@ -501,12 +547,33 @@ WebSettings _clearUnchangedWebSettings( if (currentValue.userAgent != newValue.userAgent) { userAgent = newValue.userAgent; } + if (currentValue.setSupportZoom != newValue.setSupportZoom) { + setSupportZoom = newValue.setSupportZoom.value; + } + if (currentValue.setBuiltInZoomControls != newValue.setBuiltInZoomControls) { + setBuiltInZoomControls = newValue.setBuiltInZoomControls.value; + } + if (currentValue.setDisplayZoomControls != newValue.setDisplayZoomControls) { + setDisplayZoomControls = newValue.setDisplayZoomControls.value; + } + if (currentValue.setUseWideViewPort != newValue.setUseWideViewPort) { + setUseWideViewPort = newValue.setUseWideViewPort.value; + } + if (currentValue.setLoadWithOverviewMode != + newValue.setLoadWithOverviewMode) { + setLoadWithOverviewMode = newValue.setLoadWithOverviewMode.value; + } return WebSettings( javascriptMode: javascriptMode, hasNavigationDelegate: hasNavigationDelegate, debuggingEnabled: debuggingEnabled, userAgent: userAgent, + setSupportZoom: WebSetting.of(setSupportZoom), + setBuiltInZoomControls: WebSetting.of(setBuiltInZoomControls), + setDisplayZoomControls: WebSetting.of(setDisplayZoomControls), + setUseWideViewPort: WebSetting.of(setUseWideViewPort), + setLoadWithOverviewMode: WebSetting.of(setLoadWithOverviewMode), ); } diff --git a/packages/webview_flutter/test/webview_flutter_test.dart b/packages/webview_flutter/test/webview_flutter_test.dart index c7cf46a080d7..00622c78ce74 100644 --- a/packages/webview_flutter/test/webview_flutter_test.dart +++ b/packages/webview_flutter/test/webview_flutter_test.dart @@ -810,6 +810,226 @@ void main() { }); }); + group('setSupportZoom', () { + testWidgets('set Support Zoom', (WidgetTester tester) async { + await tester.pumpWidget(const WebView( + setSupportZoom: true, + )); + + final FakePlatformWebView platformWebView = + fakePlatformViewsController.lastCreatedView; + + expect(platformWebView.setSupportZoom, isTrue); + }); + + testWidgets('defaults to true', (WidgetTester tester) async { + await tester.pumpWidget(const WebView()); + + final FakePlatformWebView platformWebView = + fakePlatformViewsController.lastCreatedView; + + expect(platformWebView.setSupportZoom, isTrue); + }); + + testWidgets('can be changed', (WidgetTester tester) async { + final GlobalKey key = GlobalKey(); + await tester.pumpWidget(WebView(key: key)); + + final FakePlatformWebView platformWebView = + fakePlatformViewsController.lastCreatedView; + + await tester.pumpWidget(WebView( + key: key, + setSupportZoom: true, + )); + + expect(platformWebView.setSupportZoom, isTrue); + + await tester.pumpWidget(WebView( + key: key, + setSupportZoom: false, + )); + + expect(platformWebView.setSupportZoom, isFalse); + }); + }); + + group('setBuiltInZoomControls', () { + testWidgets('set Built In ZoomControls', (WidgetTester tester) async { + await tester.pumpWidget(const WebView( + setBuiltInZoomControls: true, + )); + + final FakePlatformWebView platformWebView = + fakePlatformViewsController.lastCreatedView; + + expect(platformWebView.setBuiltInZoomControls, isTrue); + }); + + testWidgets('defaults to true', (WidgetTester tester) async { + await tester.pumpWidget(const WebView()); + + final FakePlatformWebView platformWebView = + fakePlatformViewsController.lastCreatedView; + + expect(platformWebView.setBuiltInZoomControls, isTrue); + }); + + testWidgets('can be changed', (WidgetTester tester) async { + final GlobalKey key = GlobalKey(); + await tester.pumpWidget(WebView(key: key)); + + final FakePlatformWebView platformWebView = + fakePlatformViewsController.lastCreatedView; + + await tester.pumpWidget(WebView( + key: key, + setBuiltInZoomControls: true, + )); + + expect(platformWebView.setBuiltInZoomControls, isTrue); + + await tester.pumpWidget(WebView( + key: key, + setBuiltInZoomControls: false, + )); + + expect(platformWebView.setBuiltInZoomControls, isFalse); + }); + }); + + group('setDisplayZoomControls', () { + testWidgets('set Display Zoom Controls', (WidgetTester tester) async { + await tester.pumpWidget(const WebView( + setDisplayZoomControls: true, + )); + + final FakePlatformWebView platformWebView = + fakePlatformViewsController.lastCreatedView; + + expect(platformWebView.setDisplayZoomControls, isTrue); + }); + + testWidgets('defaults to false', (WidgetTester tester) async { + await tester.pumpWidget(const WebView()); + + final FakePlatformWebView platformWebView = + fakePlatformViewsController.lastCreatedView; + + expect(platformWebView.setDisplayZoomControls, isFalse); + }); + + testWidgets('can be changed', (WidgetTester tester) async { + final GlobalKey key = GlobalKey(); + await tester.pumpWidget(WebView(key: key)); + + final FakePlatformWebView platformWebView = + fakePlatformViewsController.lastCreatedView; + + await tester.pumpWidget(WebView( + key: key, + setDisplayZoomControls: true, + )); + + expect(platformWebView.setDisplayZoomControls, isTrue); + + await tester.pumpWidget(WebView( + key: key, + setDisplayZoomControls: false, + )); + + expect(platformWebView.setDisplayZoomControls, isFalse); + }); + }); + + group('setUseWideViewPort', () { + testWidgets('set Use Wide Viewport', (WidgetTester tester) async { + await tester.pumpWidget(const WebView( + setUseWideViewPort: true, + )); + + final FakePlatformWebView platformWebView = + fakePlatformViewsController.lastCreatedView; + + expect(platformWebView.setUseWideViewPort, isTrue); + }); + + testWidgets('defaults to null', (WidgetTester tester) async { + await tester.pumpWidget(const WebView()); + + final FakePlatformWebView platformWebView = + fakePlatformViewsController.lastCreatedView; + + expect(platformWebView.setUseWideViewPort, isNull); + }); + + testWidgets('can be changed', (WidgetTester tester) async { + final GlobalKey key = GlobalKey(); + await tester.pumpWidget(WebView(key: key)); + + final FakePlatformWebView platformWebView = + fakePlatformViewsController.lastCreatedView; + + await tester.pumpWidget(WebView( + key: key, + setUseWideViewPort: true, + )); + + expect(platformWebView.setUseWideViewPort, isTrue); + + await tester.pumpWidget(WebView( + key: key, + setUseWideViewPort: false, + )); + + expect(platformWebView.setUseWideViewPort, isFalse); + }); + }); + + group('setLoadWithOverviewMode', () { + testWidgets('set Load With Overview Mode', (WidgetTester tester) async { + await tester.pumpWidget(const WebView( + setLoadWithOverviewMode: true, + )); + + final FakePlatformWebView platformWebView = + fakePlatformViewsController.lastCreatedView; + + expect(platformWebView.setLoadWithOverviewMode, isTrue); + }); + + testWidgets('defaults to null', (WidgetTester tester) async { + await tester.pumpWidget(const WebView()); + + final FakePlatformWebView platformWebView = + fakePlatformViewsController.lastCreatedView; + + expect(platformWebView.setLoadWithOverviewMode, isNull); + }); + + testWidgets('can be changed', (WidgetTester tester) async { + final GlobalKey key = GlobalKey(); + await tester.pumpWidget(WebView(key: key)); + + final FakePlatformWebView platformWebView = + fakePlatformViewsController.lastCreatedView; + + await tester.pumpWidget(WebView( + key: key, + setLoadWithOverviewMode: true, + )); + + expect(platformWebView.setLoadWithOverviewMode, isTrue); + + await tester.pumpWidget(WebView( + key: key, + setLoadWithOverviewMode: false, + )); + + expect(platformWebView.setLoadWithOverviewMode, isFalse); + }); + }); + group('Custom platform implementation', () { setUpAll(() { WebView.platform = MyWebViewPlatform(); @@ -839,6 +1059,11 @@ void main() { debuggingEnabled: false, userAgent: WebSetting.of(null), gestureNavigationEnabled: true, + setSupportZoom: WebSetting.of(true), + setBuiltInZoomControls: WebSetting.of(true), + setDisplayZoomControls: WebSetting.of(false), + setUseWideViewPort: WebSetting.of(null), + setLoadWithOverviewMode: WebSetting.of(null), ), // TODO(iskakaushik): Remove this when collection literals makes it to stable. // ignore: prefer_collection_literals @@ -909,6 +1134,13 @@ class FakePlatformWebView { params['settings']['hasNavigationDelegate'] ?? false; debuggingEnabled = params['settings']['debuggingEnabled']; userAgent = params['settings']['userAgent']; + setSupportZoom = params['settings']['setSupportZoom'] ?? true; + setBuiltInZoomControls = + params['settings']['setBuiltInZoomControls'] ?? true; + setDisplayZoomControls = + params['settings']['setDisplayZoomControls'] ?? false; + setUseWideViewPort = params['settings']['setUseWideViewPort']; + setLoadWithOverviewMode = params['settings']['setLoadWithOverviewMode']; channel = MethodChannel( 'plugins.flutter.io/webview_$id', const StandardMethodCodec()); channel.setMockMethodCallHandler(onMethodCall); @@ -928,6 +1160,11 @@ class FakePlatformWebView { bool hasNavigationDelegate; bool debuggingEnabled; String userAgent; + bool setSupportZoom; + bool setBuiltInZoomControls; + bool setDisplayZoomControls; + bool setUseWideViewPort; + bool setLoadWithOverviewMode; Future onMethodCall(MethodCall call) { switch (call.method) { @@ -946,6 +1183,21 @@ class FakePlatformWebView { debuggingEnabled = call.arguments['debuggingEnabled']; } userAgent = call.arguments['userAgent']; + if (call.arguments['setSupportZoom'] != null) { + setSupportZoom = call.arguments['setSupportZoom']; + } + if (call.arguments['setBuiltInZoomControls'] != null) { + setBuiltInZoomControls = call.arguments['setBuiltInZoomControls']; + } + if (call.arguments['setDisplayZoomControls'] != null) { + setDisplayZoomControls = call.arguments['setDisplayZoomControls']; + } + if (call.arguments['setUseWideViewPort'] != null) { + setUseWideViewPort = call.arguments['setUseWideViewPort']; + } + if (call.arguments['setLoadWithOverviewMode'] != null) { + setLoadWithOverviewMode = call.arguments['setLoadWithOverviewMode']; + } break; case 'canGoBack': return Future.sync(() => currentPosition > 0); @@ -1186,7 +1438,15 @@ class MatchesWebSettings extends Matcher { _webSettings.debuggingEnabled == webSettings.debuggingEnabled && _webSettings.gestureNavigationEnabled == webSettings.gestureNavigationEnabled && - _webSettings.userAgent == webSettings.userAgent; + _webSettings.userAgent == webSettings.userAgent && + _webSettings.setSupportZoom == webSettings.setSupportZoom && + _webSettings.setBuiltInZoomControls == + webSettings.setBuiltInZoomControls && + _webSettings.setDisplayZoomControls == + webSettings.setDisplayZoomControls && + _webSettings.setUseWideViewPort == webSettings.setUseWideViewPort && + _webSettings.setLoadWithOverviewMode == + webSettings.setLoadWithOverviewMode; } } From c85bd733f8ec7a14ff459a0cb40df6a32551cfeb Mon Sep 17 00:00:00 2001 From: Nick Bradshaw Date: Fri, 11 Dec 2020 16:06:45 -0800 Subject: [PATCH 07/72] Cleaning up code: * Adding default values to bools to avoid npe * Updating mismatched param names * Updating tests --- .../plugins/webviewflutter/FlutterWebView.java | 16 ++-------------- .../webview_flutter/lib/webview_flutter.dart | 4 ++-- .../test/webview_flutter_test.dart | 12 ++++++------ 3 files changed, 10 insertions(+), 22 deletions(-) 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 932f7f187c3d..be050053c7b5 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 @@ -121,18 +121,6 @@ public boolean shouldOverrideUrlLoading(WebView view, String url) { String url = (String) params.get("initialUrl"); webView.loadUrl(url); } - if (params.containsKey("setBuiltInZoomControls")) { - boolean enable = (Boolean) params.get("setBuiltInZoomControls"); - updatesetBuiltInZoomControls(enable); - } - if (params.containsKey("useWideViewPort")) { - boolean enable = (Boolean) params.get("useWideViewPort"); - setUseWideViewPort(enable); - } - if (params.containsKey("loadWithOverviewMode")) { - boolean enable = (Boolean) params.get("loadWithOverviewMode"); - setLoadWithOverviewMode(enable); - } } @Override @@ -439,11 +427,11 @@ private void updateUserAgent(String userAgent) { } private void setSupportZoom(boolean shouldEnable) { - webView.getSettings().setSupportZoom(shouldSupport); + webView.getSettings().setSupportZoom(shouldEnable); } private void setBuiltInZoomControls(boolean shouldEnable) { - webView.getSettings().setBuiltInZoomControls(shouldSupport); + webView.getSettings().setBuiltInZoomControls(shouldEnable); } private void setDisplayZoomControls(boolean shouldEnable) { diff --git a/packages/webview_flutter/lib/webview_flutter.dart b/packages/webview_flutter/lib/webview_flutter.dart index decd4820bada..048e0f214f8c 100644 --- a/packages/webview_flutter/lib/webview_flutter.dart +++ b/packages/webview_flutter/lib/webview_flutter.dart @@ -224,8 +224,8 @@ class WebView extends StatefulWidget { this.setSupportZoom = true, this.setBuiltInZoomControls = true, this.setDisplayZoomControls = false, - this.setUseWideViewPort, - this.setLoadWithOverviewMode, + this.setUseWideViewPort = true, + this.setLoadWithOverviewMode = true, this.initialMediaPlaybackPolicy = AutoMediaPlaybackPolicy.require_user_action_for_all_media_types, }) : assert(javascriptMode != null), diff --git a/packages/webview_flutter/test/webview_flutter_test.dart b/packages/webview_flutter/test/webview_flutter_test.dart index 00622c78ce74..e6502da67b3a 100644 --- a/packages/webview_flutter/test/webview_flutter_test.dart +++ b/packages/webview_flutter/test/webview_flutter_test.dart @@ -954,13 +954,13 @@ void main() { expect(platformWebView.setUseWideViewPort, isTrue); }); - testWidgets('defaults to null', (WidgetTester tester) async { + testWidgets('defaults to true', (WidgetTester tester) async { await tester.pumpWidget(const WebView()); final FakePlatformWebView platformWebView = fakePlatformViewsController.lastCreatedView; - expect(platformWebView.setUseWideViewPort, isNull); + expect(platformWebView.setUseWideViewPort, isTrue); }); testWidgets('can be changed', (WidgetTester tester) async { @@ -998,13 +998,13 @@ void main() { expect(platformWebView.setLoadWithOverviewMode, isTrue); }); - testWidgets('defaults to null', (WidgetTester tester) async { + testWidgets('defaults to true', (WidgetTester tester) async { await tester.pumpWidget(const WebView()); final FakePlatformWebView platformWebView = fakePlatformViewsController.lastCreatedView; - expect(platformWebView.setLoadWithOverviewMode, isNull); + expect(platformWebView.setLoadWithOverviewMode, isTrue); }); testWidgets('can be changed', (WidgetTester tester) async { @@ -1062,8 +1062,8 @@ void main() { setSupportZoom: WebSetting.of(true), setBuiltInZoomControls: WebSetting.of(true), setDisplayZoomControls: WebSetting.of(false), - setUseWideViewPort: WebSetting.of(null), - setLoadWithOverviewMode: WebSetting.of(null), + setUseWideViewPort: WebSetting.of(true), + setLoadWithOverviewMode: WebSetting.of(true), ), // TODO(iskakaushik): Remove this when collection literals makes it to stable. // ignore: prefer_collection_literals From 8e7da7e8d216d604b410d872930543e7d8d579d4 Mon Sep 17 00:00:00 2001 From: Nick Bradshaw Date: Fri, 11 Dec 2020 16:43:58 -0800 Subject: [PATCH 08/72] Updating documentation * Formatting and adding (Android only) --- packages/webview_flutter/lib/webview_flutter.dart | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/webview_flutter/lib/webview_flutter.dart b/packages/webview_flutter/lib/webview_flutter.dart index 048e0f214f8c..b74fa0293817 100644 --- a/packages/webview_flutter/lib/webview_flutter.dart +++ b/packages/webview_flutter/lib/webview_flutter.dart @@ -393,22 +393,22 @@ class WebView extends StatefulWidget { /// By default `userAgent` is null. final String userAgent; - /// Sets whether the WebView should support zooming using its on-screen zoom controls and gestures. + /// (Android only) Sets whether the WebView should support zooming using its on-screen zoom controls and gestures. /// /// The particular zoom mechanisms that should be used can be set with setBuiltInZoomControls(boolean). final bool setSupportZoom; - ///Sets whether the WebView should use its built-in zoom mechanisms. + /// (Android only) Sets whether the WebView should use its built-in zoom mechanisms. /// ///The built-in zoom mechanisms comprise on-screen zoom controls, which are displayed over the WebView's content, and the use of a pinch gesture to control zooming. final bool setBuiltInZoomControls; - ///Sets whether the WebView should use its built-in zoom mechanisms. + /// (Android only) Sets whether the WebView should use its built-in zoom mechanisms. /// ///The built-in zoom mechanisms comprise on-screen zoom controls, which are displayed over the WebView's content, and the use of a pinch gesture to control zooming. final bool setDisplayZoomControls; - /// Sets whether the WebView should enable support for the "viewport" HTML meta tag or should use a wide viewport. + /// (Android only) Sets whether the WebView should enable support for the "viewport" HTML meta tag or should use a wide viewport. /// /// When the value of the setting is false, the layout width is always set to the width of the WebView control in device-independent (CSS) pixels. /// @@ -417,7 +417,7 @@ class WebView extends StatefulWidget { /// If the page does not contain the tag or does not provide a width, then a wide viewport will be used. final bool setUseWideViewPort; - /// Sets whether the WebView loads pages in overview mode, that is, zooms out the content to fit on screen by width. + /// (Android only) Sets whether the WebView loads pages in overview mode, that is, zooms out the content to fit on screen by width. /// /// This setting is taken into account when the content width is greater than the width of the WebView control, for example, when getUseWideViewPort() is enabled. final bool setLoadWithOverviewMode; From 636e99f26f6835b1da9d85c43b1cb1fb66eabc2f Mon Sep 17 00:00:00 2001 From: Nick Bradshaw Date: Fri, 11 Dec 2020 19:23:11 -0800 Subject: [PATCH 09/72] Updating version and CHANGELOG.md --- packages/webview_flutter/CHANGELOG.md | 4 ++++ packages/webview_flutter/pubspec.yaml | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/webview_flutter/CHANGELOG.md b/packages/webview_flutter/CHANGELOG.md index 8f1e238f6919..cd4066711ec1 100644 --- a/packages/webview_flutter/CHANGELOG.md +++ b/packages/webview_flutter/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.0.8 + +* Enable native double-tap to zoom, and pinch to zoom functionality on Android and default to setLoadWithOverviewMode + ## 1.0.7 * Minor documentation update to indicate known issue on iOS 13.4 and 13.5. diff --git a/packages/webview_flutter/pubspec.yaml b/packages/webview_flutter/pubspec.yaml index e4627a4f9f65..86de7b497e2b 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: 1.0.7 +version: 1.0.8 homepage: https://github.com/flutter/plugins/tree/master/packages/webview_flutter environment: From 05ba64fa44989e600e16ce8b6c8f6fa85a959c36 Mon Sep 17 00:00:00 2001 From: Nick Bradshaw Date: Fri, 11 Dec 2020 19:56:23 -0800 Subject: [PATCH 10/72] Updating version and changelog after merging in master --- packages/webview_flutter/CHANGELOG.md | 4 ++++ packages/webview_flutter/pubspec.yaml | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/webview_flutter/CHANGELOG.md b/packages/webview_flutter/CHANGELOG.md index 447e263e54ff..f172f3dbd663 100644 --- a/packages/webview_flutter/CHANGELOG.md +++ b/packages/webview_flutter/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.0.9 + +* Enable native double-tap to zoom, and pinch to zoom functionality on Android and default to setLoadWithOverviewMode + ## 1.0.8 * Update Flutter SDK constraint. diff --git a/packages/webview_flutter/pubspec.yaml b/packages/webview_flutter/pubspec.yaml index de99c4b7cdb8..c1510e4fd27b 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: 1.0.8 +version: 1.0.9 homepage: https://github.com/flutter/plugins/tree/master/packages/webview_flutter environment: From 242019d43f910e8a1b3cb1e933ec57131b35cbc6 Mon Sep 17 00:00:00 2001 From: Nick Bradshaw Date: Tue, 15 Dec 2020 12:11:45 -0800 Subject: [PATCH 11/72] Bumping version after merging in master --- packages/webview_flutter/CHANGELOG.md | 4 ++++ packages/webview_flutter/pubspec.yaml | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/webview_flutter/CHANGELOG.md b/packages/webview_flutter/CHANGELOG.md index 352613997aa0..ba80ee7fc0a6 100644 --- a/packages/webview_flutter/CHANGELOG.md +++ b/packages/webview_flutter/CHANGELOG.md @@ -1,3 +1,7 @@ +## 2.0.1 + +* Enable native double-tap to zoom, and pinch to zoom functionality on Android and default to setLoadWithOverviewMode + ## 2.0.0-nullsafety * Migration to null-safety. diff --git a/packages/webview_flutter/pubspec.yaml b/packages/webview_flutter/pubspec.yaml index de62a50ada17..42ba8b985189 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: 2.0.0-nullsafety +version: 2.0.1 homepage: https://github.com/flutter/plugins/tree/master/packages/webview_flutter environment: From b60dd1afcac4b7221792f274c816f46567ce9289 Mon Sep 17 00:00:00 2001 From: Nick Bradshaw Date: Tue, 15 Dec 2020 13:28:27 -0800 Subject: [PATCH 12/72] Adding back -nullsafety suffix to follow prerelease guidelines --- packages/webview_flutter/CHANGELOG.md | 2 +- packages/webview_flutter/pubspec.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/webview_flutter/CHANGELOG.md b/packages/webview_flutter/CHANGELOG.md index ba80ee7fc0a6..59435cdcbc4f 100644 --- a/packages/webview_flutter/CHANGELOG.md +++ b/packages/webview_flutter/CHANGELOG.md @@ -1,4 +1,4 @@ -## 2.0.1 +## 2.0.1-nullsafety * Enable native double-tap to zoom, and pinch to zoom functionality on Android and default to setLoadWithOverviewMode diff --git a/packages/webview_flutter/pubspec.yaml b/packages/webview_flutter/pubspec.yaml index 42ba8b985189..6e185bfe893c 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: 2.0.1 +version: 2.0.1-nullsafety homepage: https://github.com/flutter/plugins/tree/master/packages/webview_flutter environment: From f236a61af262913cd8b65abdba0a2c1edc7aedc7 Mon Sep 17 00:00:00 2001 From: Nick Bradshaw Date: Tue, 15 Dec 2020 14:19:05 -0800 Subject: [PATCH 13/72] Formatting comments --- packages/webview_flutter/lib/webview_flutter.dart | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/webview_flutter/lib/webview_flutter.dart b/packages/webview_flutter/lib/webview_flutter.dart index c65f137bd30d..92ff09f49383 100644 --- a/packages/webview_flutter/lib/webview_flutter.dart +++ b/packages/webview_flutter/lib/webview_flutter.dart @@ -402,14 +402,14 @@ class WebView extends StatefulWidget { /// (Android only) Sets whether the WebView should use its built-in zoom mechanisms. /// - ///The built-in zoom mechanisms comprise on-screen zoom controls, which are displayed over the WebView's content, and the use of a pinch gesture to control zooming. + /// The built-in zoom mechanisms comprise on-screen zoom controls, which are displayed over the WebView's content, and the use of a pinch gesture to control zooming. /// /// By default 'setBuiltInZoomControls` is true final bool setBuiltInZoomControls; /// (Android only) Sets whether the WebView should use its built-in zoom mechanisms. /// - ///The built-in zoom mechanisms comprise on-screen zoom controls, which are displayed over the WebView's content, and the use of a pinch gesture to control zooming. + /// The built-in zoom mechanisms comprise on-screen zoom controls, which are displayed over the WebView's content, and the use of a pinch gesture to control zooming. /// /// By default 'setDisplayZoomControls` is false final bool setDisplayZoomControls; From 550ea5fc0414cb0cb027674c6a731e85801f5026 Mon Sep 17 00:00:00 2001 From: Nick Bradshaw Date: Thu, 17 Dec 2020 10:40:27 -0800 Subject: [PATCH 14/72] Correcting version# after merging in master --- packages/webview_flutter/pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/webview_flutter/pubspec.yaml b/packages/webview_flutter/pubspec.yaml index 33d5be739619..b2fbfc1110c5 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: 2.0.1-nullsafety.2 +version: 2.0.0-nullsafety.2 homepage: https://github.com/flutter/plugins/tree/master/packages/webview_flutter environment: From 2b4b03f2dff3579f00291be12ea1e73fdaced8a9 Mon Sep 17 00:00:00 2001 From: Nick Bradshaw Date: Thu, 17 Dec 2020 11:09:08 -0800 Subject: [PATCH 15/72] Updating project.pbxproj after running app on iOS --- .../ios/Runner.xcodeproj/project.pbxproj | 19 ------------------- 1 file changed, 19 deletions(-) diff --git a/packages/webview_flutter/example/ios/Runner.xcodeproj/project.pbxproj b/packages/webview_flutter/example/ios/Runner.xcodeproj/project.pbxproj index 33e9d9745bba..b879e0d1278e 100644 --- a/packages/webview_flutter/example/ios/Runner.xcodeproj/project.pbxproj +++ b/packages/webview_flutter/example/ios/Runner.xcodeproj/project.pbxproj @@ -200,7 +200,6 @@ 97C146EC1CF9000F007C117D /* Resources */, 9705A1C41CF9048500538489 /* Embed Frameworks */, 3B06AD1E1E4923F5004D2608 /* Thin Binary */, - A1F14D6FD37A3C5047F5A5AD /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -298,24 +297,6 @@ shellPath = /bin/sh; shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; }; - A1F14D6FD37A3C5047F5A5AD /* [CP] Embed Pods Frameworks */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh", - "${PODS_ROOT}/../Flutter/Flutter.framework", - ); - name = "[CP] Embed Pods Frameworks"; - outputPaths = ( - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Flutter.framework", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; - showEnvVarsInLog = 0; - }; B71376B4FB8384EF9D5F3F84 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; From 63d708539a1d798e6a54766f03a77deb06a66cb7 Mon Sep 17 00:00:00 2001 From: Nick Bradshaw Date: Thu, 17 Dec 2020 12:11:07 -0800 Subject: [PATCH 16/72] Fixing tests and analyze issues after merging in master * Add WidgetTester to some existing tests * Update SDK constraints per analyze issue --- .../webview_flutter_test.dart | 22 ++++++++++--------- packages/webview_flutter/example/pubspec.yaml | 2 +- 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/packages/webview_flutter/example/integration_test/webview_flutter_test.dart b/packages/webview_flutter/example/integration_test/webview_flutter_test.dart index 86cf8ab73e05..b68c669f8823 100644 --- a/packages/webview_flutter/example/integration_test/webview_flutter_test.dart +++ b/packages/webview_flutter/example/integration_test/webview_flutter_test.dart @@ -11,9 +11,9 @@ import 'package:flutter/foundation.dart'; import 'package:flutter/services.dart'; import 'package:flutter/widgets.dart'; import 'package:flutter_test/flutter_test.dart'; +import 'package:integration_test/integration_test.dart'; import 'package:webview_flutter/platform_interface.dart'; import 'package:webview_flutter/webview_flutter.dart'; -import 'package:integration_test/integration_test.dart'; void main() { IntegrationTestWidgetsFlutterBinding.ensureInitialized(); @@ -358,12 +358,12 @@ void main() { videoTestBase64 = base64Encode(const Utf8Encoder().convert(videoTest)); }); - test('Auto media playback', () async { + testWidgets('Auto media playback', (WidgetTester tester) async { Completer controllerCompleter = Completer(); Completer pageLoaded = Completer(); - await pumpWidget( + await tester.pumpWidget( Directionality( textDirection: TextDirection.ltr, child: WebView( @@ -390,7 +390,7 @@ void main() { pageLoaded = Completer(); // We change the key to re-create a new webview as we change the initialMediaPlaybackPolicy - await pumpWidget( + await tester.pumpWidget( Directionality( textDirection: TextDirection.ltr, child: WebView( @@ -416,13 +416,14 @@ void main() { expect(isPaused, _webviewBool(true)); }); - test('Changes to initialMediaPlaybackPolicy are ignored', () async { + testWidgets('Changes to initialMediaPlaybackPolicy are ignored', + (WidgetTester tester) async { final Completer controllerCompleter = Completer(); Completer pageLoaded = Completer(); final GlobalKey key = GlobalKey(); - await pumpWidget( + await tester.pumpWidget( Directionality( textDirection: TextDirection.ltr, child: WebView( @@ -447,7 +448,7 @@ void main() { pageLoaded = Completer(); - await pumpWidget( + await tester.pumpWidget( Directionality( textDirection: TextDirection.ltr, child: WebView( @@ -474,12 +475,13 @@ void main() { expect(isPaused, _webviewBool(false)); }); - test('Video plays inline when allowsInlineMediaPlayback is true', () async { + testWidgets('Video plays inline when allowsInlineMediaPlayback is true', + (WidgetTester tester) async { Completer controllerCompleter = Completer(); Completer pageLoaded = Completer(); - await pumpWidget( + await tester.pumpWidget( Directionality( textDirection: TextDirection.ltr, child: WebView( @@ -507,7 +509,7 @@ void main() { controllerCompleter = Completer(); pageLoaded = Completer(); - await pumpWidget( + await tester.pumpWidget( Directionality( textDirection: TextDirection.ltr, child: WebView( diff --git a/packages/webview_flutter/example/pubspec.yaml b/packages/webview_flutter/example/pubspec.yaml index 543e7fd86971..cc7c887cbd5c 100644 --- a/packages/webview_flutter/example/pubspec.yaml +++ b/packages/webview_flutter/example/pubspec.yaml @@ -2,7 +2,7 @@ name: webview_flutter_example description: Demonstrates how to use the webview_flutter plugin. environment: - sdk: ">=2.0.0-dev.68.0 <3.0.0" + sdk: ">=2.2.0 <3.0.0" dependencies: flutter: From 4d6da851336847c0b01f687cc8ca62c5aa4e01d2 Mon Sep 17 00:00:00 2001 From: Nick Bradshaw Date: Mon, 1 Feb 2021 21:17:43 -0800 Subject: [PATCH 17/72] Updating to Flutter team naming conventions --- packages/webview_flutter/CHANGELOG.md | 2 +- .../webviewflutter/FlutterWebView.java | 40 ++--- .../lib/platform_interface.dart | 30 ++-- .../lib/src/webview_method_channel.dart | 12 +- .../webview_flutter/lib/webview_flutter.dart | 96 +++++------ .../test/webview_flutter_test.dart | 158 +++++++++--------- 6 files changed, 167 insertions(+), 171 deletions(-) diff --git a/packages/webview_flutter/CHANGELOG.md b/packages/webview_flutter/CHANGELOG.md index b4c684f97573..5b96c6e51178 100644 --- a/packages/webview_flutter/CHANGELOG.md +++ b/packages/webview_flutter/CHANGELOG.md @@ -1,6 +1,6 @@ ## 2.0.0-nullsafety.5 -* Enable native double-tap to zoom, and pinch to zoom functionality on Android and default to setLoadWithOverviewMode +* Enable native double-tap to zoom, and pinch to zoom functionality on Android and default to loadWithOverviewMode ## 2.0.0-nullsafety.4 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 b794e2845d5a..bed51c161d97 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 @@ -375,20 +375,20 @@ private void applySettings(Map settings) { case "allowsInlineMediaPlayback": // no-op inline media playback is always allowed on Android. break; - case "setSupportZoom": - setSupportZoom((boolean) settings.get(key)); + case "zoomEnabled": + zoomEnabled((boolean) settings.get(key)); break; - case "setBuiltInZoomControls": - setBuiltInZoomControls((boolean) settings.get(key)); + case "builtInZoomControlsEnabled": + builtInZoomControlsEnabled((boolean) settings.get(key)); break; - case "setDisplayZoomControls": - setDisplayZoomControls((boolean) settings.get(key)); + case "displayZoomControls": + displayZoomControls((boolean) settings.get(key)); break; - case "setUseWideViewPort": - setUseWideViewPort((boolean) settings.get(key)); + case "useWideViewPort": + useWideViewPort((boolean) settings.get(key)); break; - case "setLoadWithOverviewMode": - setLoadWithOverviewMode((boolean) settings.get(key)); + case "loadWithOverviewMode": + loadWithOverviewMode((boolean) settings.get(key)); break; default: throw new IllegalArgumentException("Unknown WebView setting: " + key); @@ -429,25 +429,25 @@ private void updateUserAgent(String userAgent) { webView.getSettings().setUserAgentString(userAgent); } - private void setSupportZoom(boolean shouldEnable) { - webView.getSettings().setSupportZoom(shouldEnable); + private void zoomEnabled(boolean shouldEnable) { + webView.getSettings().zoomEnabled(shouldEnable); } - private void setBuiltInZoomControls(boolean shouldEnable) { - webView.getSettings().setBuiltInZoomControls(shouldEnable); + private void builtInZoomControlsEnabled(boolean shouldEnable) { + webView.getSettings().builtInZoomControlsEnabled(shouldEnable); } - private void setDisplayZoomControls(boolean shouldEnable) { + private void displayZoomControls(boolean shouldEnable) { // oOn-screen zoom controls are deprecated in Android (see ZoomButtonsController) so it's recommended to set this to false. - webView.getSettings().setDisplayZoomControls(shouldEnable); + webView.getSettings().displayZoomControls(shouldEnable); } - private void setUseWideViewPort(boolean shouldEnable) { - webView.getSettings().setUseWideViewPort(shouldEnable); + private void useWideViewPort(boolean shouldEnable) { + webView.getSettings().useWideViewPort(shouldEnable); } - private void setLoadWithOverviewMode(boolean shouldEnable) { - webView.getSettings().setLoadWithOverviewMode(shouldEnable); + private void loadWithOverviewMode(boolean shouldEnable) { + webView.getSettings().loadWithOverviewMode(shouldEnable); } @Override diff --git a/packages/webview_flutter/lib/platform_interface.dart b/packages/webview_flutter/lib/platform_interface.dart index 363ce147c148..9476fccd034e 100644 --- a/packages/webview_flutter/lib/platform_interface.dart +++ b/packages/webview_flutter/lib/platform_interface.dart @@ -391,17 +391,17 @@ class WebSettings { this.debuggingEnabled, this.gestureNavigationEnabled, this.allowsInlineMediaPlayback, - required this.setSupportZoom, - required this.setBuiltInZoomControls, - required this.setDisplayZoomControls, - required this.setUseWideViewPort, - required this.setLoadWithOverviewMode, + required this.zoomEnabled, + required this.builtInZoomControlsEnabled, + required this.displayZoomControls, + required this.useWideViewPort, + required this.loadWithOverviewMode, required this.userAgent, - }) : assert(setSupportZoom != null && - setBuiltInZoomControls != null && - setDisplayZoomControls != null && - setUseWideViewPort != null && - setLoadWithOverviewMode != null && + }) : assert(zoomEnabled != null && + builtInZoomControlsEnabled != null && + displayZoomControls != null && + useWideViewPort != null && + loadWithOverviewMode != null && userAgent != null); /// The JavaScript execution mode to be used by the webview. @@ -436,23 +436,23 @@ class WebSettings { final WebSetting userAgent; /// Sets whether the WebView should support zooming using its on-screen zoom controls and gestures. - final WebSetting setSupportZoom; + final WebSetting zoomEnabled; /// Sets whether the WebView should use its built-in zoom mechanisms. - final WebSetting setBuiltInZoomControls; + final WebSetting builtInZoomControlsEnabled; /// Sets whether the WebView should display on-screen zoom controls when using the built-in zoom mechanisms. /// ///The default is true. However, on-screen zoom controls are deprecated in Android so it's recommended to set this to false. - final WebSetting setDisplayZoomControls; + final WebSetting displayZoomControls; /// Sets whether the WebView should enable support for the "viewport" HTML meta tag or should use a wide viewport. - final WebSetting setUseWideViewPort; + final WebSetting useWideViewPort; /// Sets whether the WebView loads pages in overview mode, that is, zooms out the content to fit on screen by width. /// /// This setting is taken into account when the content width is greater than the width of the WebView control, for example, when getUseWideViewPort() is enabled. - final WebSetting setLoadWithOverviewMode; + final WebSetting loadWithOverviewMode; @override String toString() { diff --git a/packages/webview_flutter/lib/src/webview_method_channel.dart b/packages/webview_flutter/lib/src/webview_method_channel.dart index d9edf3abdeff..299fc88489ec 100644 --- a/packages/webview_flutter/lib/src/webview_method_channel.dart +++ b/packages/webview_flutter/lib/src/webview_method_channel.dart @@ -189,14 +189,12 @@ class MethodChannelWebViewPlatform implements WebViewPlatformController { _addIfNonNull( 'allowsInlineMediaPlayback', settings.allowsInlineMediaPlayback); _addSettingIfPresent('userAgent', settings.userAgent); - _addSettingIfPresent('setSupportZoom', settings.setSupportZoom); + _addSettingIfPresent('zoomEnabled', settings.zoomEnabled); _addSettingIfPresent( - 'setBuiltInZoomControls', settings.setBuiltInZoomControls); - _addSettingIfPresent( - 'setDisplayZoomControls', settings.setDisplayZoomControls); - _addSettingIfPresent('setUseWideViewPort', settings.setUseWideViewPort); - _addSettingIfPresent( - 'setLoadWithOverviewMode', settings.setLoadWithOverviewMode); + 'builtInZoomControlsEnabled', settings.builtInZoomControlsEnabled); + _addSettingIfPresent('displayZoomControls', settings.displayZoomControls); + _addSettingIfPresent('useWideViewPort', settings.useWideViewPort); + _addSettingIfPresent('loadWithOverviewMode', settings.loadWithOverviewMode); return map; } diff --git a/packages/webview_flutter/lib/webview_flutter.dart b/packages/webview_flutter/lib/webview_flutter.dart index c99b13e4f1f6..20651a1c8469 100644 --- a/packages/webview_flutter/lib/webview_flutter.dart +++ b/packages/webview_flutter/lib/webview_flutter.dart @@ -221,11 +221,11 @@ class WebView extends StatefulWidget { this.debuggingEnabled = false, this.gestureNavigationEnabled = false, this.userAgent, - this.setSupportZoom = true, - this.setBuiltInZoomControls = true, - this.setDisplayZoomControls = false, - this.setUseWideViewPort = true, - this.setLoadWithOverviewMode = true, + this.zoomEnabled = true, + this.builtInZoomControlsEnabled = true, + this.displayZoomControls = false, + this.useWideViewPort = true, + this.loadWithOverviewMode = true, this.initialMediaPlaybackPolicy = AutoMediaPlaybackPolicy.require_user_action_for_all_media_types, this.allowsInlineMediaPlayback = false, @@ -404,24 +404,24 @@ class WebView extends StatefulWidget { /// (Android only) Sets whether the WebView should support zooming using its on-screen zoom controls and gestures. /// - /// The particular zoom mechanisms that should be used can be set with setBuiltInZoomControls(boolean). + /// The particular zoom mechanisms that should be used can be set with builtInZoomControlsEnabled(boolean). /// - /// By default 'setSupportZoom` is true - final bool setSupportZoom; + /// By default 'zoomEnabled' is true + final bool zoomEnabled; /// (Android only) Sets whether the WebView should use its built-in zoom mechanisms. /// /// The built-in zoom mechanisms comprise on-screen zoom controls, which are displayed over the WebView's content, and the use of a pinch gesture to control zooming. /// - /// By default 'setBuiltInZoomControls` is true - final bool setBuiltInZoomControls; + /// By default 'builtInZoomControlsEnabled' is true + final bool builtInZoomControlsEnabled; /// (Android only) Sets whether the WebView should use its built-in zoom mechanisms. /// /// The built-in zoom mechanisms comprise on-screen zoom controls, which are displayed over the WebView's content, and the use of a pinch gesture to control zooming. /// - /// By default 'setDisplayZoomControls` is false - final bool setDisplayZoomControls; + /// By default 'displayZoomControls` is false + final bool displayZoomControls; /// (Android only) Sets whether the WebView should enable support for the "viewport" HTML meta tag or should use a wide viewport. /// @@ -431,15 +431,15 @@ class WebView extends StatefulWidget { /// /// If the page does not contain the tag or does not provide a width, then a wide viewport will be used. /// - /// By default 'setUseWideViewPort` is true - final bool setUseWideViewPort; + /// By default 'useWideViewPort` is true + final bool useWideViewPort; /// (Android only) Sets whether the WebView loads pages in overview mode, that is, zooms out the content to fit on screen by width. /// /// This setting is taken into account when the content width is greater than the width of the WebView control, for example, when getUseWideViewPort() is enabled. /// - /// By default 'setLoadWithOverviewMode' is true - final bool setLoadWithOverviewMode; + /// By default 'loadWithOverviewMode' is true + final bool loadWithOverviewMode; /// Which restrictions apply on automatic media playback. /// @@ -524,12 +524,12 @@ WebSettings _webSettingsFromWidget(WebView widget) { gestureNavigationEnabled: widget.gestureNavigationEnabled, allowsInlineMediaPlayback: widget.allowsInlineMediaPlayback, userAgent: WebSetting.of(widget.userAgent), - setSupportZoom: WebSetting.of(widget.setSupportZoom), - setBuiltInZoomControls: WebSetting.of(widget.setBuiltInZoomControls), - setDisplayZoomControls: WebSetting.of(widget.setDisplayZoomControls), - setUseWideViewPort: WebSetting.of(widget.setUseWideViewPort), - setLoadWithOverviewMode: - WebSetting.of(widget.setLoadWithOverviewMode), + zoomEnabled: WebSetting.of(widget.zoomEnabled), + builtInZoomControlsEnabled: + WebSetting.of(widget.builtInZoomControlsEnabled), + displayZoomControls: WebSetting.of(widget.displayZoomControls), + useWideViewPort: WebSetting.of(widget.useWideViewPort), + loadWithOverviewMode: WebSetting.of(widget.loadWithOverviewMode), ); } @@ -543,21 +543,21 @@ WebSettings _clearUnchangedWebSettings( assert(newValue.hasNavigationDelegate != null); assert(newValue.debuggingEnabled != null); assert(newValue.userAgent != null); - assert(newValue.setSupportZoom != null); - assert(newValue.setBuiltInZoomControls != null); - assert(newValue.setDisplayZoomControls != null); - assert(newValue.setUseWideViewPort != null); - assert(newValue.setLoadWithOverviewMode != null); + assert(newValue.zoomEnabled != null); + assert(newValue.builtInZoomControlsEnabled != null); + assert(newValue.displayZoomControls != null); + assert(newValue.useWideViewPort != null); + assert(newValue.loadWithOverviewMode != null); JavascriptMode? javascriptMode; bool? hasNavigationDelegate; bool? debuggingEnabled; WebSetting userAgent = WebSetting.absent(); - WebSetting setSupportZoom = WebSetting.absent(); - WebSetting setBuiltInZoomControls = WebSetting.absent(); - WebSetting setDisplayZoomControls = WebSetting.absent(); - WebSetting setUseWideViewPort = WebSetting.absent(); - WebSetting setLoadWithOverviewMode = WebSetting.absent(); + WebSetting zoomEnabled = WebSetting.absent(); + WebSetting builtInZoomControlsEnabled = WebSetting.absent(); + WebSetting displayZoomControls = WebSetting.absent(); + WebSetting useWideViewPort = WebSetting.absent(); + WebSetting loadWithOverviewMode = WebSetting.absent(); if (currentValue.javascriptMode != newValue.javascriptMode) { javascriptMode = newValue.javascriptMode; } @@ -570,21 +570,21 @@ WebSettings _clearUnchangedWebSettings( if (currentValue.userAgent != newValue.userAgent) { userAgent = newValue.userAgent; } - if (currentValue.setSupportZoom != newValue.setSupportZoom) { - setSupportZoom = newValue.setSupportZoom; + if (currentValue.zoomEnabled != newValue.zoomEnabled) { + zoomEnabled = newValue.zoomEnabled; } - if (currentValue.setBuiltInZoomControls != newValue.setBuiltInZoomControls) { - setBuiltInZoomControls = newValue.setBuiltInZoomControls; + if (currentValue.builtInZoomControlsEnabled != + newValue.builtInZoomControlsEnabled) { + builtInZoomControlsEnabled = newValue.builtInZoomControlsEnabled; } - if (currentValue.setDisplayZoomControls != newValue.setDisplayZoomControls) { - setDisplayZoomControls = newValue.setDisplayZoomControls; + if (currentValue.displayZoomControls != newValue.displayZoomControls) { + displayZoomControls = newValue.displayZoomControls; } - if (currentValue.setUseWideViewPort != newValue.setUseWideViewPort) { - setUseWideViewPort = newValue.setUseWideViewPort; + if (currentValue.useWideViewPort != newValue.useWideViewPort) { + useWideViewPort = newValue.useWideViewPort; } - if (currentValue.setLoadWithOverviewMode != - newValue.setLoadWithOverviewMode) { - setLoadWithOverviewMode = newValue.setLoadWithOverviewMode; + if (currentValue.loadWithOverviewMode != newValue.loadWithOverviewMode) { + loadWithOverviewMode = newValue.loadWithOverviewMode; } return WebSettings( @@ -592,11 +592,11 @@ WebSettings _clearUnchangedWebSettings( hasNavigationDelegate: hasNavigationDelegate, debuggingEnabled: debuggingEnabled, userAgent: userAgent, - setSupportZoom: setSupportZoom, - setBuiltInZoomControls: setBuiltInZoomControls, - setDisplayZoomControls: setDisplayZoomControls, - setUseWideViewPort: setUseWideViewPort, - setLoadWithOverviewMode: setLoadWithOverviewMode, + zoomEnabled: zoomEnabled, + builtInZoomControlsEnabled: builtInZoomControlsEnabled, + displayZoomControls: displayZoomControls, + useWideViewPort: useWideViewPort, + loadWithOverviewMode: loadWithOverviewMode, ); } diff --git a/packages/webview_flutter/test/webview_flutter_test.dart b/packages/webview_flutter/test/webview_flutter_test.dart index a0c5b54f9a15..b437fd18fef9 100644 --- a/packages/webview_flutter/test/webview_flutter_test.dart +++ b/packages/webview_flutter/test/webview_flutter_test.dart @@ -788,16 +788,16 @@ void main() { }); }); - group('setSupportZoom', () { - testWidgets('set Support Zoom', (WidgetTester tester) async { + group('zoomEnabled', () { + testWidgets('Enable zoom', (WidgetTester tester) async { await tester.pumpWidget(const WebView( - setSupportZoom: true, + zoomEnabled: true, )); final FakePlatformWebView platformWebView = fakePlatformViewsController.lastCreatedView!; - expect(platformWebView.setSupportZoom, isTrue); + expect(platformWebView.zoomEnabled, isTrue); }); testWidgets('defaults to true', (WidgetTester tester) async { @@ -806,7 +806,7 @@ void main() { final FakePlatformWebView platformWebView = fakePlatformViewsController.lastCreatedView!; - expect(platformWebView.setSupportZoom, isTrue); + expect(platformWebView.zoomEnabled, isTrue); }); testWidgets('can be changed', (WidgetTester tester) async { @@ -818,30 +818,30 @@ void main() { await tester.pumpWidget(WebView( key: key, - setSupportZoom: true, + zoomEnabled: true, )); - expect(platformWebView.setSupportZoom, isTrue); + expect(platformWebView.zoomEnabled, isTrue); await tester.pumpWidget(WebView( key: key, - setSupportZoom: false, + zoomEnabled: false, )); - expect(platformWebView.setSupportZoom, isFalse); + expect(platformWebView.zoomEnabled, isFalse); }); }); - group('setBuiltInZoomControls', () { - testWidgets('set Built In ZoomControls', (WidgetTester tester) async { + group('builtInZoomControlsEnabled', () { + testWidgets('enable Built In ZoomControls', (WidgetTester tester) async { await tester.pumpWidget(const WebView( - setBuiltInZoomControls: true, + builtInZoomControlsEnabled: true, )); final FakePlatformWebView platformWebView = fakePlatformViewsController.lastCreatedView!; - expect(platformWebView.setBuiltInZoomControls, isTrue); + expect(platformWebView.builtInZoomControlsEnabled, isTrue); }); testWidgets('defaults to true', (WidgetTester tester) async { @@ -850,7 +850,7 @@ void main() { final FakePlatformWebView platformWebView = fakePlatformViewsController.lastCreatedView!; - expect(platformWebView.setBuiltInZoomControls, isTrue); + expect(platformWebView.builtInZoomControlsEnabled, isTrue); }); testWidgets('can be changed', (WidgetTester tester) async { @@ -862,30 +862,30 @@ void main() { await tester.pumpWidget(WebView( key: key, - setBuiltInZoomControls: true, + builtInZoomControlsEnabled: true, )); - expect(platformWebView.setBuiltInZoomControls, isTrue); + expect(platformWebView.builtInZoomControlsEnabled, isTrue); await tester.pumpWidget(WebView( key: key, - setBuiltInZoomControls: false, + builtInZoomControlsEnabled: false, )); - expect(platformWebView.setBuiltInZoomControls, isFalse); + expect(platformWebView.builtInZoomControlsEnabled, isFalse); }); }); - group('setDisplayZoomControls', () { - testWidgets('set Display Zoom Controls', (WidgetTester tester) async { + group('displayZoomControls', () { + testWidgets('Display Zoom Controls', (WidgetTester tester) async { await tester.pumpWidget(const WebView( - setDisplayZoomControls: true, + displayZoomControls: true, )); final FakePlatformWebView platformWebView = fakePlatformViewsController.lastCreatedView!; - expect(platformWebView.setDisplayZoomControls, isTrue); + expect(platformWebView.displayZoomControls, isTrue); }); testWidgets('defaults to false', (WidgetTester tester) async { @@ -894,7 +894,7 @@ void main() { final FakePlatformWebView platformWebView = fakePlatformViewsController.lastCreatedView!; - expect(platformWebView.setDisplayZoomControls, isFalse); + expect(platformWebView.displayZoomControls, isFalse); }); testWidgets('can be changed', (WidgetTester tester) async { @@ -906,30 +906,30 @@ void main() { await tester.pumpWidget(WebView( key: key, - setDisplayZoomControls: true, + displayZoomControls: true, )); - expect(platformWebView.setDisplayZoomControls, isTrue); + expect(platformWebView.displayZoomControls, isTrue); await tester.pumpWidget(WebView( key: key, - setDisplayZoomControls: false, + displayZoomControls: false, )); - expect(platformWebView.setDisplayZoomControls, isFalse); + expect(platformWebView.displayZoomControls, isFalse); }); }); - group('setUseWideViewPort', () { - testWidgets('set Use Wide Viewport', (WidgetTester tester) async { + group('useWideViewPort', () { + testWidgets('Use Wide Viewport', (WidgetTester tester) async { await tester.pumpWidget(const WebView( - setUseWideViewPort: true, + useWideViewPort: true, )); final FakePlatformWebView platformWebView = fakePlatformViewsController.lastCreatedView!; - expect(platformWebView.setUseWideViewPort, isTrue); + expect(platformWebView.useWideViewPort, isTrue); }); testWidgets('defaults to true', (WidgetTester tester) async { @@ -938,7 +938,7 @@ void main() { final FakePlatformWebView platformWebView = fakePlatformViewsController.lastCreatedView!; - expect(platformWebView.setUseWideViewPort, isTrue); + expect(platformWebView.useWideViewPort, isTrue); }); testWidgets('can be changed', (WidgetTester tester) async { @@ -950,30 +950,30 @@ void main() { await tester.pumpWidget(WebView( key: key, - setUseWideViewPort: true, + useWideViewPort: true, )); - expect(platformWebView.setUseWideViewPort, isTrue); + expect(platformWebView.useWideViewPort, isTrue); await tester.pumpWidget(WebView( key: key, - setUseWideViewPort: false, + useWideViewPort: false, )); - expect(platformWebView.setUseWideViewPort, isFalse); + expect(platformWebView.useWideViewPort, isFalse); }); }); - group('setLoadWithOverviewMode', () { - testWidgets('set Load With Overview Mode', (WidgetTester tester) async { + group('loadWithOverviewMode', () { + testWidgets('Load With Overview Mode', (WidgetTester tester) async { await tester.pumpWidget(const WebView( - setLoadWithOverviewMode: true, + loadWithOverviewMode: true, )); final FakePlatformWebView platformWebView = fakePlatformViewsController.lastCreatedView!; - expect(platformWebView.setLoadWithOverviewMode, isTrue); + expect(platformWebView.loadWithOverviewMode, isTrue); }); testWidgets('defaults to true', (WidgetTester tester) async { @@ -982,7 +982,7 @@ void main() { final FakePlatformWebView platformWebView = fakePlatformViewsController.lastCreatedView!; - expect(platformWebView.setLoadWithOverviewMode, isTrue); + expect(platformWebView.loadWithOverviewMode, isTrue); }); testWidgets('can be changed', (WidgetTester tester) async { @@ -994,17 +994,17 @@ void main() { await tester.pumpWidget(WebView( key: key, - setLoadWithOverviewMode: true, + loadWithOverviewMode: true, )); - expect(platformWebView.setLoadWithOverviewMode, isTrue); + expect(platformWebView.loadWithOverviewMode, isTrue); await tester.pumpWidget(WebView( key: key, - setLoadWithOverviewMode: false, + loadWithOverviewMode: false, )); - expect(platformWebView.setLoadWithOverviewMode, isFalse); + expect(platformWebView.loadWithOverviewMode, isFalse); }); }); @@ -1037,11 +1037,11 @@ void main() { debuggingEnabled: false, userAgent: WebSetting.of(null), gestureNavigationEnabled: true, - setSupportZoom: WebSetting.of(true), - setBuiltInZoomControls: WebSetting.of(true), - setDisplayZoomControls: WebSetting.of(false), - setUseWideViewPort: WebSetting.of(true), - setLoadWithOverviewMode: WebSetting.of(true), + zoomEnabled: WebSetting.of(true), + builtInZoomControlsEnabled: WebSetting.of(true), + displayZoomControls: WebSetting.of(false), + useWideViewPort: WebSetting.of(true), + loadWithOverviewMode: WebSetting.of(true), ), ))); }); @@ -1109,13 +1109,12 @@ class FakePlatformWebView { params['settings']['hasNavigationDelegate'] ?? false; debuggingEnabled = params['settings']['debuggingEnabled']; userAgent = params['settings']['userAgent']; - setSupportZoom = params['settings']['setSupportZoom'] ?? true; - setBuiltInZoomControls = - params['settings']['setBuiltInZoomControls'] ?? true; - setDisplayZoomControls = - params['settings']['setDisplayZoomControls'] ?? false; - setUseWideViewPort = params['settings']['setUseWideViewPort']; - setLoadWithOverviewMode = params['settings']['setLoadWithOverviewMode']; + zoomEnabled = params['settings']['zoomEnabled'] ?? true; + builtInZoomControlsEnabled = + params['settings']['builtInZoomControlsEnabled'] ?? true; + displayZoomControls = params['settings']['displayZoomControls'] ?? false; + useWideViewPort = params['settings']['useWideViewPort']; + loadWithOverviewMode = params['settings']['loadWithOverviewMode']; channel = MethodChannel( 'plugins.flutter.io/webview_$id', const StandardMethodCodec()); channel.setMockMethodCallHandler(onMethodCall); @@ -1135,11 +1134,11 @@ class FakePlatformWebView { bool? hasNavigationDelegate; bool? debuggingEnabled; String? userAgent; - bool? setSupportZoom; - bool? setBuiltInZoomControls; - bool? setDisplayZoomControls; - bool? setUseWideViewPort; - bool? setLoadWithOverviewMode; + bool? zoomEnabled; + bool? builtInZoomControlsEnabled; + bool? displayZoomControls; + bool? useWideViewPort; + bool? loadWithOverviewMode; Future onMethodCall(MethodCall call) { switch (call.method) { @@ -1158,20 +1157,21 @@ class FakePlatformWebView { debuggingEnabled = call.arguments['debuggingEnabled']; } userAgent = call.arguments['userAgent']; - if (call.arguments['setSupportZoom'] != null) { - setSupportZoom = call.arguments['setSupportZoom']; + if (call.arguments['zoomEnabled'] != null) { + zoomEnabled = call.arguments['zoomEnabled']; } - if (call.arguments['setBuiltInZoomControls'] != null) { - setBuiltInZoomControls = call.arguments['setBuiltInZoomControls']; + if (call.arguments['builtInZoomControlsEnabled'] != null) { + builtInZoomControlsEnabled = + call.arguments['builtInZoomControlsEnabled']; } - if (call.arguments['setDisplayZoomControls'] != null) { - setDisplayZoomControls = call.arguments['setDisplayZoomControls']; + if (call.arguments['displayZoomControls'] != null) { + displayZoomControls = call.arguments['displayZoomControls']; } - if (call.arguments['setUseWideViewPort'] != null) { - setUseWideViewPort = call.arguments['setUseWideViewPort']; + if (call.arguments['useWideViewPort'] != null) { + useWideViewPort = call.arguments['useWideViewPort']; } - if (call.arguments['setLoadWithOverviewMode'] != null) { - setLoadWithOverviewMode = call.arguments['setLoadWithOverviewMode']; + if (call.arguments['loadWithOverviewMode'] != null) { + loadWithOverviewMode = call.arguments['loadWithOverviewMode']; } break; case 'canGoBack': @@ -1406,14 +1406,12 @@ class MatchesWebSettings extends Matcher { _webSettings!.gestureNavigationEnabled == webSettings.gestureNavigationEnabled && _webSettings!.userAgent == webSettings.userAgent && - _webSettings!.setSupportZoom == webSettings.setSupportZoom && - _webSettings!.setBuiltInZoomControls == - webSettings.setBuiltInZoomControls && - _webSettings!.setDisplayZoomControls == - webSettings.setDisplayZoomControls && - _webSettings!.setUseWideViewPort == webSettings.setUseWideViewPort && - _webSettings!.setLoadWithOverviewMode == - webSettings.setLoadWithOverviewMode; + _webSettings!.zoomEnabled == webSettings.zoomEnabled && + _webSettings!.builtInZoomControlsEnabled == + webSettings.builtInZoomControlsEnabled && + _webSettings!.displayZoomControls == webSettings.displayZoomControls && + _webSettings!.useWideViewPort == webSettings.useWideViewPort && + _webSettings!.loadWithOverviewMode == webSettings.loadWithOverviewMode; } } From 673e8967374e8a66de8094437ffa65ab9edefe49 Mon Sep 17 00:00:00 2001 From: Nick Bradshaw Date: Mon, 1 Feb 2021 21:34:03 -0800 Subject: [PATCH 18/72] More explicitly calling out params ignored on iOS --- .../webview_flutter/lib/webview_flutter.dart | 20 ++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/packages/webview_flutter/lib/webview_flutter.dart b/packages/webview_flutter/lib/webview_flutter.dart index 20651a1c8469..18c0ddcb5081 100644 --- a/packages/webview_flutter/lib/webview_flutter.dart +++ b/packages/webview_flutter/lib/webview_flutter.dart @@ -402,28 +402,34 @@ class WebView extends StatefulWidget { /// By default `userAgent` is null. final String? userAgent; - /// (Android only) Sets whether the WebView should support zooming using its on-screen zoom controls and gestures. + /// Sets whether the WebView should support zooming using its on-screen zoom controls and gestures. /// /// The particular zoom mechanisms that should be used can be set with builtInZoomControlsEnabled(boolean). /// + /// On iOS this property is ignored. + /// /// By default 'zoomEnabled' is true final bool zoomEnabled; - /// (Android only) Sets whether the WebView should use its built-in zoom mechanisms. + /// Sets whether the WebView should use its built-in zoom mechanisms. /// /// The built-in zoom mechanisms comprise on-screen zoom controls, which are displayed over the WebView's content, and the use of a pinch gesture to control zooming. /// + /// On iOS this property is ignored. + /// /// By default 'builtInZoomControlsEnabled' is true final bool builtInZoomControlsEnabled; - /// (Android only) Sets whether the WebView should use its built-in zoom mechanisms. + /// Sets whether the WebView should use its built-in zoom mechanisms. /// /// The built-in zoom mechanisms comprise on-screen zoom controls, which are displayed over the WebView's content, and the use of a pinch gesture to control zooming. /// + /// On iOS this property is ignored. + /// /// By default 'displayZoomControls` is false final bool displayZoomControls; - /// (Android only) Sets whether the WebView should enable support for the "viewport" HTML meta tag or should use a wide viewport. + /// Sets whether the WebView should enable support for the "viewport" HTML meta tag or should use a wide viewport. /// /// When the value of the setting is false, the layout width is always set to the width of the WebView control in device-independent (CSS) pixels. /// @@ -431,13 +437,17 @@ class WebView extends StatefulWidget { /// /// If the page does not contain the tag or does not provide a width, then a wide viewport will be used. /// + /// On iOS this property is ignored. + /// /// By default 'useWideViewPort` is true final bool useWideViewPort; - /// (Android only) Sets whether the WebView loads pages in overview mode, that is, zooms out the content to fit on screen by width. + /// Sets whether the WebView loads pages in overview mode, that is, zooms out the content to fit on screen by width. /// /// This setting is taken into account when the content width is greater than the width of the WebView control, for example, when getUseWideViewPort() is enabled. /// + /// On iOS this property is ignored. + /// /// By default 'loadWithOverviewMode' is true final bool loadWithOverviewMode; From 0094921553a0630b229fc4316fcc1c4fa2258544 Mon Sep 17 00:00:00 2001 From: Nick Bradshaw Date: Mon, 1 Feb 2021 22:04:50 -0800 Subject: [PATCH 19/72] Added TODO per PR comment --- packages/webview_flutter/lib/webview_flutter.dart | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/webview_flutter/lib/webview_flutter.dart b/packages/webview_flutter/lib/webview_flutter.dart index 18c0ddcb5081..415b7a91bc65 100644 --- a/packages/webview_flutter/lib/webview_flutter.dart +++ b/packages/webview_flutter/lib/webview_flutter.dart @@ -409,6 +409,7 @@ class WebView extends StatefulWidget { /// On iOS this property is ignored. /// /// By default 'zoomEnabled' is true + // TODO(https://github.com/flutter/flutter/issues/75196): Update other platform implementations so this param can be used by those platforms final bool zoomEnabled; /// Sets whether the WebView should use its built-in zoom mechanisms. From 9e82faf12a5bff8cb262a19af5afb39af9dc0f61 Mon Sep 17 00:00:00 2001 From: Nick Bradshaw Date: Mon, 1 Feb 2021 22:29:36 -0800 Subject: [PATCH 20/72] Fixing accidentally renamed native Android methods --- .../plugins/webviewflutter/FlutterWebView.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) 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 bed51c161d97..ab069153503f 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 @@ -430,24 +430,24 @@ private void updateUserAgent(String userAgent) { } private void zoomEnabled(boolean shouldEnable) { - webView.getSettings().zoomEnabled(shouldEnable); + webView.getSettings().setSupportZoom(shouldEnable); } private void builtInZoomControlsEnabled(boolean shouldEnable) { - webView.getSettings().builtInZoomControlsEnabled(shouldEnable); + webView.getSettings().setBuiltInZoomControls(shouldEnable); } private void displayZoomControls(boolean shouldEnable) { - // oOn-screen zoom controls are deprecated in Android (see ZoomButtonsController) so it's recommended to set this to false. - webView.getSettings().displayZoomControls(shouldEnable); + // On-screen zoom controls are deprecated in Android (see ZoomButtonsController) so it's recommended to set this to false. + webView.getSettings().setDisplayZoomControls(shouldEnable); } private void useWideViewPort(boolean shouldEnable) { - webView.getSettings().useWideViewPort(shouldEnable); + webView.getSettings().setUseWideViewPort(shouldEnable); } private void loadWithOverviewMode(boolean shouldEnable) { - webView.getSettings().loadWithOverviewMode(shouldEnable); + webView.getSettings().setLoadWithOverviewMode(shouldEnable); } @Override From 2b155894b1f7c43deb1c7d7b18849e94cc67dbec Mon Sep 17 00:00:00 2001 From: Nick Bradshaw Date: Wed, 3 Mar 2021 12:41:17 -0800 Subject: [PATCH 21/72] Updating plugin version to latest version with zoom enabled --- packages/webview_flutter/pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/webview_flutter/pubspec.yaml b/packages/webview_flutter/pubspec.yaml index 0640386c517d..6ee9e119bd3a 100644 --- a/packages/webview_flutter/pubspec.yaml +++ b/packages/webview_flutter/pubspec.yaml @@ -1,7 +1,7 @@ name: webview_flutter description: A Flutter plugin that provides a WebView widget on Android and iOS. homepage: https://github.com/flutter/plugins/tree/master/packages/webview_flutter -version: 2.0.1 +version: 2.0.2 environment: sdk: ">=2.12.0-259.9.beta <3.0.0" From 3b29b4557b6c2c34e0e0d2069806ccf32c40cbe3 Mon Sep 17 00:00:00 2001 From: Nick Bradshaw Date: Mon, 8 Mar 2021 12:20:50 -0800 Subject: [PATCH 22/72] Add some defense against null values --- .../io/flutter/plugins/webviewflutter/FlutterWebView.java | 6 ++++-- packages/webview_flutter/lib/webview_flutter.dart | 5 +++++ 2 files changed, 9 insertions(+), 2 deletions(-) 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 2f192f8b72a3..7a68bf6021b4 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 @@ -352,10 +352,12 @@ private void getScrollY(Result result) { private void applySettings(Map settings) { for (String key : settings.keySet()) { + if (settings.get(key) == null) { + continue; + } switch (key) { case "jsMode": - Integer mode = (Integer) settings.get(key); - if (mode != null) updateJsMode(mode); + updateJsMode((Integer) settings.get(key)); break; case "hasNavigationDelegate": final boolean hasNavigationDelegate = (boolean) settings.get(key); diff --git a/packages/webview_flutter/lib/webview_flutter.dart b/packages/webview_flutter/lib/webview_flutter.dart index e28617e55ec3..9114b8fc1a7c 100644 --- a/packages/webview_flutter/lib/webview_flutter.dart +++ b/packages/webview_flutter/lib/webview_flutter.dart @@ -234,6 +234,11 @@ class WebView extends StatefulWidget { AutoMediaPlaybackPolicy.require_user_action_for_all_media_types, this.allowsInlineMediaPlayback = false, }) : assert(javascriptMode != null), + assert(zoomEnabled != null), + assert(builtInZoomControlsEnabled != null), + assert(displayZoomControls != null), + assert(useWideViewPort != null), + assert(loadWithOverviewMode != null), assert(initialMediaPlaybackPolicy != null), assert(allowsInlineMediaPlayback != null), super(key: key); From 69a4b7d45e1db91922ccbbf748aab4d011906ca9 Mon Sep 17 00:00:00 2001 From: Nick Bradshaw Date: Tue, 7 Sep 2021 15:17:42 -0700 Subject: [PATCH 23/72] Update changelog message formatting to conform to new NEXT rules --- packages/webview_flutter/webview_flutter/CHANGELOG.md | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/packages/webview_flutter/webview_flutter/CHANGELOG.md b/packages/webview_flutter/webview_flutter/CHANGELOG.md index a8ed5a832c67..15926661233f 100644 --- a/packages/webview_flutter/webview_flutter/CHANGELOG.md +++ b/packages/webview_flutter/webview_flutter/CHANGELOG.md @@ -1,10 +1,7 @@ ## 2.0.13 -* Enable native double-tap to zoom, and pinch to zoom functionality on Android - -## NEXT - * Updated Android lint settings. +* Enable native double-tap to zoom, and pinch to zoom functionality on Android ## 2.0.12 From 0e6d931fd4bad64de642b4b6d2fb8f3319b42769 Mon Sep 17 00:00:00 2001 From: Nick Bradshaw Date: Tue, 7 Sep 2021 15:31:42 -0700 Subject: [PATCH 24/72] Adding my name to contributors file --- packages/webview_flutter/webview_flutter/AUTHORS | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/webview_flutter/webview_flutter/AUTHORS b/packages/webview_flutter/webview_flutter/AUTHORS index 493a0b4ef9c2..e214d7ac2b41 100644 --- a/packages/webview_flutter/webview_flutter/AUTHORS +++ b/packages/webview_flutter/webview_flutter/AUTHORS @@ -64,3 +64,4 @@ Aleksandr Yurkovskiy Anton Borries Alex Li Rahul Raj <64.rahulraj@gmail.com> +Nick Bradshaw From 40fca06ac98cd538fddc4bfd07bc05b3e7b3463b Mon Sep 17 00:00:00 2001 From: Nick Bradshaw Date: Tue, 7 Sep 2021 16:54:46 -0700 Subject: [PATCH 25/72] Incorporate disabling zoom on iOS * These changes come from https://github.com/flutter/plugins/pull/2832 via @Dn-a --- .../webview_flutter/webview_flutter/AUTHORS | 1 + .../webview_flutter/example/lib/main.dart | 1 + .../ios/Classes/FLTWKNavigationDelegate.h | 1 + .../ios/Classes/FLTWKNavigationDelegate.m | 1 + .../ios/Classes/FlutterWebView.m | 24 +++++++++++++++++++ 5 files changed, 28 insertions(+) diff --git a/packages/webview_flutter/webview_flutter/AUTHORS b/packages/webview_flutter/webview_flutter/AUTHORS index e214d7ac2b41..85628e432f60 100644 --- a/packages/webview_flutter/webview_flutter/AUTHORS +++ b/packages/webview_flutter/webview_flutter/AUTHORS @@ -65,3 +65,4 @@ Anton Borries Alex Li Rahul Raj <64.rahulraj@gmail.com> Nick Bradshaw +Antonino Di Natale diff --git a/packages/webview_flutter/webview_flutter/example/lib/main.dart b/packages/webview_flutter/webview_flutter/example/lib/main.dart index 88256cc66287..0c3125445f78 100644 --- a/packages/webview_flutter/webview_flutter/example/lib/main.dart +++ b/packages/webview_flutter/webview_flutter/example/lib/main.dart @@ -7,6 +7,7 @@ import 'dart:async'; import 'dart:convert'; import 'dart:io'; + import 'package:flutter/material.dart'; import 'package:webview_flutter/webview_flutter.dart'; diff --git a/packages/webview_flutter/webview_flutter/ios/Classes/FLTWKNavigationDelegate.h b/packages/webview_flutter/webview_flutter/ios/Classes/FLTWKNavigationDelegate.h index 31edadc8cc05..d28fa57825a6 100644 --- a/packages/webview_flutter/webview_flutter/ios/Classes/FLTWKNavigationDelegate.h +++ b/packages/webview_flutter/webview_flutter/ios/Classes/FLTWKNavigationDelegate.h @@ -15,6 +15,7 @@ NS_ASSUME_NONNULL_BEGIN * Whether to delegate navigation decisions over the method channel. */ @property(nonatomic, assign) BOOL hasDartNavigationDelegate; +@property(nonatomic, copy) void (^didFinishLoad)(WKNavigation *navigation); @end diff --git a/packages/webview_flutter/webview_flutter/ios/Classes/FLTWKNavigationDelegate.m b/packages/webview_flutter/webview_flutter/ios/Classes/FLTWKNavigationDelegate.m index 8b7ee7d0cfb7..d21506d9243b 100644 --- a/packages/webview_flutter/webview_flutter/ios/Classes/FLTWKNavigationDelegate.m +++ b/packages/webview_flutter/webview_flutter/ios/Classes/FLTWKNavigationDelegate.m @@ -63,6 +63,7 @@ - (void)webView:(WKWebView *)webView } - (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation { + self.didFinishLoad(navigation); [_methodChannel invokeMethod:@"onPageFinished" arguments:@{@"url" : webView.URL.absoluteString}]; } diff --git a/packages/webview_flutter/webview_flutter/ios/Classes/FlutterWebView.m b/packages/webview_flutter/webview_flutter/ios/Classes/FlutterWebView.m index c6d926d3cfc2..d138d23f3e92 100644 --- a/packages/webview_flutter/webview_flutter/ios/Classes/FlutterWebView.m +++ b/packages/webview_flutter/webview_flutter/ios/Classes/FlutterWebView.m @@ -348,6 +348,9 @@ - (NSString*)applySettings:(NSDictionary*)settings { } else if ([key isEqualToString:@"userAgent"]) { NSString* userAgent = settings[key]; [self updateUserAgent:[userAgent isEqual:[NSNull null]] ? nil : userAgent]; + } else if ([key isEqualToString:@"zoomEnabled"]) { + NSNumber* zoomEnabled = settings[key]; + [self updateZoomEnabled:zoomEnabled]; } else { [unknownKeys addObject:key]; } @@ -475,6 +478,27 @@ - (void)updateUserAgent:(NSString*)userAgent { } } +- (void)updateZoomEnabled:(NSNumber*)zoomEnabled { + BOOL enabled = [zoomEnabled boolValue]; + __typeof__(self) __strong wSelf = self; + if (!enabled) { + _navigationDelegate.didFinishLoad = ^(WKNavigation* view) { + NSString* source = @"var meta = document.createElement('meta'); \\ + meta.name = " + @"'viewport'; \\ + meta.content = 'width=device-width, " + @"initial-scale=1.0, maximum-scale=1.0, user-scalable=no'; \\ + " + @" var head = document.getElementsByTagName('head')[0];\\ + " + @"head.appendChild(meta);"; + [wSelf->_webView evaluateJavaScript:source completionHandler:nil]; + }; + } else + _navigationDelegate.didFinishLoad = ^(WKNavigation* view) { + }; +} + #pragma mark WKUIDelegate - (WKWebView*)webView:(WKWebView*)webView From bfcb89222b4d8141902fb4f8d9c28cc65f490c58 Mon Sep 17 00:00:00 2001 From: Nick Bradshaw Date: Tue, 7 Sep 2021 16:56:54 -0700 Subject: [PATCH 26/72] Simplify API to only have one shared zoomEnabled param for Android and iOS * Remove/update/add tests to verify behavior --- .../webviewflutter/FlutterWebView.java | 33 +--- .../webviewflutter/FlutterWebViewTest.java | 4 + .../lib/platform_interface.dart | 27 +-- .../lib/src/webview_method_channel.dart | 5 - .../webview_flutter/lib/webview_flutter.dart | 83 -------- .../test/webview_flutter_test.dart | 187 +----------------- 6 files changed, 10 insertions(+), 329 deletions(-) diff --git a/packages/webview_flutter/webview_flutter/android/src/main/java/io/flutter/plugins/webviewflutter/FlutterWebView.java b/packages/webview_flutter/webview_flutter/android/src/main/java/io/flutter/plugins/webviewflutter/FlutterWebView.java index 18b1a61b92f0..151e9fb55a04 100644 --- a/packages/webview_flutter/webview_flutter/android/src/main/java/io/flutter/plugins/webviewflutter/FlutterWebView.java +++ b/packages/webview_flutter/webview_flutter/android/src/main/java/io/flutter/plugins/webviewflutter/FlutterWebView.java @@ -166,6 +166,10 @@ static WebView createWebView( .setSupportMultipleWindows(true) // Always support multiple windows. .setWebChromeClient( webChromeClient); // Always use {@link FlutterWebChromeClient} as web Chrome client. + .setBuiltInZoomControls(true); //Always use built-in zoom mechanisms. + .setLoadWithOverviewMode(true); //Always zooms out the content to fit on screen by width. + .setUseWideViewPort(true); //Always support using a wide viewport + .setDisplayZoomControls(false); //Never display on-screen zoom controls. return webViewBuilder.build(); } @@ -441,18 +445,6 @@ private void applySettings(Map settings) { case "zoomEnabled": zoomEnabled((boolean) settings.get(key)); break; - case "builtInZoomControlsEnabled": - builtInZoomControlsEnabled((boolean) settings.get(key)); - break; - case "displayZoomControls": - displayZoomControls((boolean) settings.get(key)); - break; - case "useWideViewPort": - useWideViewPort((boolean) settings.get(key)); - break; - case "loadWithOverviewMode": - loadWithOverviewMode((boolean) settings.get(key)); - break; default: throw new IllegalArgumentException("Unknown WebView setting: " + key); } @@ -496,23 +488,6 @@ private void zoomEnabled(boolean shouldEnable) { webView.getSettings().setSupportZoom(shouldEnable); } - private void builtInZoomControlsEnabled(boolean shouldEnable) { - webView.getSettings().setBuiltInZoomControls(shouldEnable); - } - - private void displayZoomControls(boolean shouldEnable) { - // On-screen zoom controls are deprecated in Android (see ZoomButtonsController) so it's recommended to set this to false. - webView.getSettings().setDisplayZoomControls(shouldEnable); - } - - private void useWideViewPort(boolean shouldEnable) { - webView.getSettings().setUseWideViewPort(shouldEnable); - } - - private void loadWithOverviewMode(boolean shouldEnable) { - webView.getSettings().setLoadWithOverviewMode(shouldEnable); - } - @Override public void dispose() { methodChannel.setMethodCallHandler(null); diff --git a/packages/webview_flutter/webview_flutter/android/src/test/java/io/flutter/plugins/webviewflutter/FlutterWebViewTest.java b/packages/webview_flutter/webview_flutter/android/src/test/java/io/flutter/plugins/webviewflutter/FlutterWebViewTest.java index 96cbdece387c..4e36dd6896e6 100644 --- a/packages/webview_flutter/webview_flutter/android/src/test/java/io/flutter/plugins/webviewflutter/FlutterWebViewTest.java +++ b/packages/webview_flutter/webview_flutter/android/src/test/java/io/flutter/plugins/webviewflutter/FlutterWebViewTest.java @@ -50,6 +50,10 @@ public void createWebView_should_create_webview_with_default_configuration() { verify(mockWebViewBuilder, times(1)).setSupportMultipleWindows(true); verify(mockWebViewBuilder, times(1)).setUsesHybridComposition(false); verify(mockWebViewBuilder, times(1)).setWebChromeClient(mockWebChromeClient); + verify(mockWebViewBuilder, times(1)).setLoadWithOverviewMode(true); + verify(mockWebViewBuilder, times(1)).setUseWideViewPort(true); + verify(mockWebViewBuilder, times(1)).setBuiltInZoomControls(true); + verify(mockWebViewBuilder, times(1)).setDisplayZoomControls(false); } private Map createParameterMap(boolean usesHybridComposition) { diff --git a/packages/webview_flutter/webview_flutter/lib/platform_interface.dart b/packages/webview_flutter/webview_flutter/lib/platform_interface.dart index a30bf4083bff..1688e0b95ef9 100644 --- a/packages/webview_flutter/webview_flutter/lib/platform_interface.dart +++ b/packages/webview_flutter/webview_flutter/lib/platform_interface.dart @@ -397,17 +397,8 @@ class WebSettings { this.gestureNavigationEnabled, this.allowsInlineMediaPlayback, required this.zoomEnabled, - required this.builtInZoomControlsEnabled, - required this.displayZoomControls, - required this.useWideViewPort, - required this.loadWithOverviewMode, required this.userAgent, - }) : assert(zoomEnabled != null && - builtInZoomControlsEnabled != null && - displayZoomControls != null && - useWideViewPort != null && - loadWithOverviewMode != null && - userAgent != null); + }) : assert(zoomEnabled != null && userAgent != null); /// The JavaScript execution mode to be used by the webview. final JavascriptMode? javascriptMode; @@ -447,22 +438,6 @@ class WebSettings { /// Sets whether the WebView should support zooming using its on-screen zoom controls and gestures. final WebSetting zoomEnabled; - /// Sets whether the WebView should use its built-in zoom mechanisms. - final WebSetting builtInZoomControlsEnabled; - - /// Sets whether the WebView should display on-screen zoom controls when using the built-in zoom mechanisms. - /// - ///The default is true. However, on-screen zoom controls are deprecated in Android so it's recommended to set this to false. - final WebSetting displayZoomControls; - - /// Sets whether the WebView should enable support for the "viewport" HTML meta tag or should use a wide viewport. - final WebSetting useWideViewPort; - - /// Sets whether the WebView loads pages in overview mode, that is, zooms out the content to fit on screen by width. - /// - /// This setting is taken into account when the content width is greater than the width of the WebView control, for example, when getUseWideViewPort() is enabled. - final WebSetting loadWithOverviewMode; - @override String toString() { return 'WebSettings(javascriptMode: $javascriptMode, hasNavigationDelegate: $hasNavigationDelegate, hasProgressTracking: $hasProgressTracking, debuggingEnabled: $debuggingEnabled, gestureNavigationEnabled: $gestureNavigationEnabled, userAgent: $userAgent, allowsInlineMediaPlayback: $allowsInlineMediaPlayback)'; diff --git a/packages/webview_flutter/webview_flutter/lib/src/webview_method_channel.dart b/packages/webview_flutter/webview_flutter/lib/src/webview_method_channel.dart index 22ec137dc98c..4cc29f886132 100644 --- a/packages/webview_flutter/webview_flutter/lib/src/webview_method_channel.dart +++ b/packages/webview_flutter/webview_flutter/lib/src/webview_method_channel.dart @@ -194,11 +194,6 @@ class MethodChannelWebViewPlatform implements WebViewPlatformController { 'allowsInlineMediaPlayback', settings.allowsInlineMediaPlayback); _addSettingIfPresent('userAgent', settings.userAgent); _addSettingIfPresent('zoomEnabled', settings.zoomEnabled); - _addSettingIfPresent( - 'builtInZoomControlsEnabled', settings.builtInZoomControlsEnabled); - _addSettingIfPresent('displayZoomControls', settings.displayZoomControls); - _addSettingIfPresent('useWideViewPort', settings.useWideViewPort); - _addSettingIfPresent('loadWithOverviewMode', settings.loadWithOverviewMode); return map; } diff --git a/packages/webview_flutter/webview_flutter/lib/webview_flutter.dart b/packages/webview_flutter/webview_flutter/lib/webview_flutter.dart index e3fefd837621..1504cefe3525 100644 --- a/packages/webview_flutter/webview_flutter/lib/webview_flutter.dart +++ b/packages/webview_flutter/webview_flutter/lib/webview_flutter.dart @@ -229,19 +229,11 @@ class WebView extends StatefulWidget { this.gestureNavigationEnabled = false, this.userAgent, this.zoomEnabled = true, - this.builtInZoomControlsEnabled = true, - this.displayZoomControls = false, - this.useWideViewPort = true, - this.loadWithOverviewMode = true, this.initialMediaPlaybackPolicy = AutoMediaPlaybackPolicy.require_user_action_for_all_media_types, this.allowsInlineMediaPlayback = false, }) : assert(javascriptMode != null), assert(zoomEnabled != null), - assert(builtInZoomControlsEnabled != null), - assert(displayZoomControls != null), - assert(useWideViewPort != null), - assert(loadWithOverviewMode != null), assert(initialMediaPlaybackPolicy != null), assert(allowsInlineMediaPlayback != null), super(key: key); @@ -418,54 +410,9 @@ class WebView extends StatefulWidget { /// Sets whether the WebView should support zooming using its on-screen zoom controls and gestures. /// - /// The particular zoom mechanisms that should be used can be set with builtInZoomControlsEnabled(boolean). - /// - /// On iOS this property is ignored. - /// /// By default 'zoomEnabled' is true - // TODO(https://github.com/flutter/flutter/issues/75196): Update other platform implementations so this param can be used by those platforms final bool zoomEnabled; - /// Sets whether the WebView should use its built-in zoom mechanisms. - /// - /// The built-in zoom mechanisms comprise on-screen zoom controls, which are displayed over the WebView's content, and the use of a pinch gesture to control zooming. - /// - /// On iOS this property is ignored. - /// - /// By default 'builtInZoomControlsEnabled' is true - final bool builtInZoomControlsEnabled; - - /// Sets whether the WebView should use its built-in zoom mechanisms. - /// - /// The built-in zoom mechanisms comprise on-screen zoom controls, which are displayed over the WebView's content, and the use of a pinch gesture to control zooming. - /// - /// On iOS this property is ignored. - /// - /// By default 'displayZoomControls` is false - final bool displayZoomControls; - - /// Sets whether the WebView should enable support for the "viewport" HTML meta tag or should use a wide viewport. - /// - /// When the value of the setting is false, the layout width is always set to the width of the WebView control in device-independent (CSS) pixels. - /// - /// When the value is true and the page contains the viewport meta tag, the value of the width specified in the tag is used. - /// - /// If the page does not contain the tag or does not provide a width, then a wide viewport will be used. - /// - /// On iOS this property is ignored. - /// - /// By default 'useWideViewPort` is true - final bool useWideViewPort; - - /// Sets whether the WebView loads pages in overview mode, that is, zooms out the content to fit on screen by width. - /// - /// This setting is taken into account when the content width is greater than the width of the WebView control, for example, when getUseWideViewPort() is enabled. - /// - /// On iOS this property is ignored. - /// - /// By default 'loadWithOverviewMode' is true - final bool loadWithOverviewMode; - /// Which restrictions apply on automatic media playback. /// /// This initial value is applied to the platform's webview upon creation. Any following @@ -551,11 +498,6 @@ WebSettings _webSettingsFromWidget(WebView widget) { allowsInlineMediaPlayback: widget.allowsInlineMediaPlayback, userAgent: WebSetting.of(widget.userAgent), zoomEnabled: WebSetting.of(widget.zoomEnabled), - builtInZoomControlsEnabled: - WebSetting.of(widget.builtInZoomControlsEnabled), - displayZoomControls: WebSetting.of(widget.displayZoomControls), - useWideViewPort: WebSetting.of(widget.useWideViewPort), - loadWithOverviewMode: WebSetting.of(widget.loadWithOverviewMode), ); } @@ -571,10 +513,6 @@ WebSettings _clearUnchangedWebSettings( assert(newValue.debuggingEnabled != null); assert(newValue.userAgent != null); assert(newValue.zoomEnabled != null); - assert(newValue.builtInZoomControlsEnabled != null); - assert(newValue.displayZoomControls != null); - assert(newValue.useWideViewPort != null); - assert(newValue.loadWithOverviewMode != null); JavascriptMode? javascriptMode; bool? hasNavigationDelegate; @@ -582,10 +520,6 @@ WebSettings _clearUnchangedWebSettings( bool? debuggingEnabled; WebSetting userAgent = WebSetting.absent(); WebSetting zoomEnabled = WebSetting.absent(); - WebSetting builtInZoomControlsEnabled = WebSetting.absent(); - WebSetting displayZoomControls = WebSetting.absent(); - WebSetting useWideViewPort = WebSetting.absent(); - WebSetting loadWithOverviewMode = WebSetting.absent(); if (currentValue.javascriptMode != newValue.javascriptMode) { javascriptMode = newValue.javascriptMode; } @@ -604,19 +538,6 @@ WebSettings _clearUnchangedWebSettings( if (currentValue.zoomEnabled != newValue.zoomEnabled) { zoomEnabled = newValue.zoomEnabled; } - if (currentValue.builtInZoomControlsEnabled != - newValue.builtInZoomControlsEnabled) { - builtInZoomControlsEnabled = newValue.builtInZoomControlsEnabled; - } - if (currentValue.displayZoomControls != newValue.displayZoomControls) { - displayZoomControls = newValue.displayZoomControls; - } - if (currentValue.useWideViewPort != newValue.useWideViewPort) { - useWideViewPort = newValue.useWideViewPort; - } - if (currentValue.loadWithOverviewMode != newValue.loadWithOverviewMode) { - loadWithOverviewMode = newValue.loadWithOverviewMode; - } return WebSettings( javascriptMode: javascriptMode, @@ -625,10 +546,6 @@ WebSettings _clearUnchangedWebSettings( debuggingEnabled: debuggingEnabled, userAgent: userAgent, zoomEnabled: zoomEnabled, - builtInZoomControlsEnabled: builtInZoomControlsEnabled, - displayZoomControls: displayZoomControls, - useWideViewPort: useWideViewPort, - loadWithOverviewMode: loadWithOverviewMode, ); } diff --git a/packages/webview_flutter/webview_flutter/test/webview_flutter_test.dart b/packages/webview_flutter/webview_flutter/test/webview_flutter_test.dart index 4c4eb55031f0..e95eeef39b86 100644 --- a/packages/webview_flutter/webview_flutter/test/webview_flutter_test.dart +++ b/packages/webview_flutter/webview_flutter/test/webview_flutter_test.dart @@ -888,182 +888,6 @@ void main() { }); }); - group('builtInZoomControlsEnabled', () { - testWidgets('enable Built In ZoomControls', (WidgetTester tester) async { - await tester.pumpWidget(const WebView( - builtInZoomControlsEnabled: true, - )); - - final FakePlatformWebView platformWebView = - fakePlatformViewsController.lastCreatedView!; - - expect(platformWebView.builtInZoomControlsEnabled, isTrue); - }); - - testWidgets('defaults to true', (WidgetTester tester) async { - await tester.pumpWidget(const WebView()); - - final FakePlatformWebView platformWebView = - fakePlatformViewsController.lastCreatedView!; - - expect(platformWebView.builtInZoomControlsEnabled, isTrue); - }); - - testWidgets('can be changed', (WidgetTester tester) async { - final GlobalKey key = GlobalKey(); - await tester.pumpWidget(WebView(key: key)); - - final FakePlatformWebView platformWebView = - fakePlatformViewsController.lastCreatedView!; - - await tester.pumpWidget(WebView( - key: key, - builtInZoomControlsEnabled: true, - )); - - expect(platformWebView.builtInZoomControlsEnabled, isTrue); - - await tester.pumpWidget(WebView( - key: key, - builtInZoomControlsEnabled: false, - )); - - expect(platformWebView.builtInZoomControlsEnabled, isFalse); - }); - }); - - group('displayZoomControls', () { - testWidgets('Display Zoom Controls', (WidgetTester tester) async { - await tester.pumpWidget(const WebView( - displayZoomControls: true, - )); - - final FakePlatformWebView platformWebView = - fakePlatformViewsController.lastCreatedView!; - - expect(platformWebView.displayZoomControls, isTrue); - }); - - testWidgets('defaults to false', (WidgetTester tester) async { - await tester.pumpWidget(const WebView()); - - final FakePlatformWebView platformWebView = - fakePlatformViewsController.lastCreatedView!; - - expect(platformWebView.displayZoomControls, isFalse); - }); - - testWidgets('can be changed', (WidgetTester tester) async { - final GlobalKey key = GlobalKey(); - await tester.pumpWidget(WebView(key: key)); - - final FakePlatformWebView platformWebView = - fakePlatformViewsController.lastCreatedView!; - - await tester.pumpWidget(WebView( - key: key, - displayZoomControls: true, - )); - - expect(platformWebView.displayZoomControls, isTrue); - - await tester.pumpWidget(WebView( - key: key, - displayZoomControls: false, - )); - - expect(platformWebView.displayZoomControls, isFalse); - }); - }); - - group('useWideViewPort', () { - testWidgets('Use Wide Viewport', (WidgetTester tester) async { - await tester.pumpWidget(const WebView( - useWideViewPort: true, - )); - - final FakePlatformWebView platformWebView = - fakePlatformViewsController.lastCreatedView!; - - expect(platformWebView.useWideViewPort, isTrue); - }); - - testWidgets('defaults to true', (WidgetTester tester) async { - await tester.pumpWidget(const WebView()); - - final FakePlatformWebView platformWebView = - fakePlatformViewsController.lastCreatedView!; - - expect(platformWebView.useWideViewPort, isTrue); - }); - - testWidgets('can be changed', (WidgetTester tester) async { - final GlobalKey key = GlobalKey(); - await tester.pumpWidget(WebView(key: key)); - - final FakePlatformWebView platformWebView = - fakePlatformViewsController.lastCreatedView!; - - await tester.pumpWidget(WebView( - key: key, - useWideViewPort: true, - )); - - expect(platformWebView.useWideViewPort, isTrue); - - await tester.pumpWidget(WebView( - key: key, - useWideViewPort: false, - )); - - expect(platformWebView.useWideViewPort, isFalse); - }); - }); - - group('loadWithOverviewMode', () { - testWidgets('Load With Overview Mode', (WidgetTester tester) async { - await tester.pumpWidget(const WebView( - loadWithOverviewMode: true, - )); - - final FakePlatformWebView platformWebView = - fakePlatformViewsController.lastCreatedView!; - - expect(platformWebView.loadWithOverviewMode, isTrue); - }); - - testWidgets('defaults to true', (WidgetTester tester) async { - await tester.pumpWidget(const WebView()); - - final FakePlatformWebView platformWebView = - fakePlatformViewsController.lastCreatedView!; - - expect(platformWebView.loadWithOverviewMode, isTrue); - }); - - testWidgets('can be changed', (WidgetTester tester) async { - final GlobalKey key = GlobalKey(); - await tester.pumpWidget(WebView(key: key)); - - final FakePlatformWebView platformWebView = - fakePlatformViewsController.lastCreatedView!; - - await tester.pumpWidget(WebView( - key: key, - loadWithOverviewMode: true, - )); - - expect(platformWebView.loadWithOverviewMode, isTrue); - - await tester.pumpWidget(WebView( - key: key, - loadWithOverviewMode: false, - )); - - expect(platformWebView.loadWithOverviewMode, isFalse); - }); - }); - group('Custom platform implementation', () { setUpAll(() { WebView.platform = MyWebViewPlatform(); @@ -1094,10 +918,6 @@ void main() { userAgent: WebSetting.of(null), gestureNavigationEnabled: true, zoomEnabled: WebSetting.of(true), - builtInZoomControlsEnabled: WebSetting.of(true), - displayZoomControls: WebSetting.of(false), - useWideViewPort: WebSetting.of(true), - loadWithOverviewMode: WebSetting.of(true), ), ))); }); @@ -1481,12 +1301,7 @@ class MatchesWebSettings extends Matcher { _webSettings!.gestureNavigationEnabled == webSettings.gestureNavigationEnabled && _webSettings!.userAgent == webSettings.userAgent && - _webSettings!.zoomEnabled == webSettings.zoomEnabled && - _webSettings!.builtInZoomControlsEnabled == - webSettings.builtInZoomControlsEnabled && - _webSettings!.displayZoomControls == webSettings.displayZoomControls && - _webSettings!.useWideViewPort == webSettings.useWideViewPort && - _webSettings!.loadWithOverviewMode == webSettings.loadWithOverviewMode; + _webSettings!.zoomEnabled == webSettings.zoomEnabled; } } From d1bcd6f442207676a873fdc90ac5cb7ad38eb296 Mon Sep 17 00:00:00 2001 From: Nick Bradshaw Date: Tue, 7 Sep 2021 17:01:50 -0700 Subject: [PATCH 27/72] Fixing java formatting issue --- .../io/flutter/plugins/webviewflutter/FlutterWebView.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/webview_flutter/webview_flutter/android/src/main/java/io/flutter/plugins/webviewflutter/FlutterWebView.java b/packages/webview_flutter/webview_flutter/android/src/main/java/io/flutter/plugins/webviewflutter/FlutterWebView.java index 151e9fb55a04..029943bcc59f 100644 --- a/packages/webview_flutter/webview_flutter/android/src/main/java/io/flutter/plugins/webviewflutter/FlutterWebView.java +++ b/packages/webview_flutter/webview_flutter/android/src/main/java/io/flutter/plugins/webviewflutter/FlutterWebView.java @@ -165,10 +165,10 @@ static WebView createWebView( true) // Always allow automatically opening of windows. .setSupportMultipleWindows(true) // Always support multiple windows. .setWebChromeClient( - webChromeClient); // Always use {@link FlutterWebChromeClient} as web Chrome client. - .setBuiltInZoomControls(true); //Always use built-in zoom mechanisms. - .setLoadWithOverviewMode(true); //Always zooms out the content to fit on screen by width. - .setUseWideViewPort(true); //Always support using a wide viewport + webChromeClient) // Always use {@link FlutterWebChromeClient} as web Chrome client. + .setBuiltInZoomControls(true) //Always use built-in zoom mechanisms. + .setLoadWithOverviewMode(true) //Always zooms out the content to fit on screen by width. + .setUseWideViewPort(true) //Always support using a wide viewport .setDisplayZoomControls(false); //Never display on-screen zoom controls. return webViewBuilder.build(); From 428fd91c25ea0a95f9c76d14c98c19cdc12f09ee Mon Sep 17 00:00:00 2001 From: Nick Bradshaw Date: Tue, 7 Sep 2021 23:37:31 -0700 Subject: [PATCH 28/72] Adding corresponding WebView builder default setters and updating tests --- .../webviewflutter/WebViewBuilder.java | 57 +++++++++++++++++++ .../webviewflutter/FlutterWebViewTest.java | 4 ++ 2 files changed, 61 insertions(+) diff --git a/packages/webview_flutter/webview_flutter/android/src/main/java/io/flutter/plugins/webviewflutter/WebViewBuilder.java b/packages/webview_flutter/webview_flutter/android/src/main/java/io/flutter/plugins/webviewflutter/WebViewBuilder.java index 6b8cc51febe8..09cc052de459 100644 --- a/packages/webview_flutter/webview_flutter/android/src/main/java/io/flutter/plugins/webviewflutter/WebViewBuilder.java +++ b/packages/webview_flutter/webview_flutter/android/src/main/java/io/flutter/plugins/webviewflutter/WebViewBuilder.java @@ -44,6 +44,11 @@ static WebView create(Context context, boolean usesHybridComposition, View conta private boolean supportMultipleWindows; private boolean usesHybridComposition; private WebChromeClient webChromeClient; + private boolean builtInZoomControls; + private boolean loadWithOverviewMode; + private boolean useWideViewPort; + private boolean displayZoomControls; + /** * Constructs a new {@link WebViewBuilder} object with a custom implementation of the {@link @@ -122,6 +127,54 @@ public WebViewBuilder setWebChromeClient(@Nullable WebChromeClient webChromeClie return this; } + /** + * Sets whether the {@link WebView} should use its built-in zoom mechanisms. + * The default value is {@code true}. + * + * @param flag {@code true} if built in zoom controls are allowed. + * @return This builder. This value cannot be {@code null}. + */ + public WebViewBuilder setBuiltInZoomControls(boolean flag) { + this.builtInZoomControls = flag; + return this; + } + + /** + * Sets whether the {@link WebView} loads pages zoomed out so the content will fit on screen by width + * The default value is {@code true}. + * + * @param flag {@code true} if should allow pages to load in overview mode. + * @return This builder. This value cannot be {@code null}. + */ + public WebViewBuilder setLoadWithOverviewMode(boolean flag) { + this.loadWithOverviewMode = flag; + return this; + } + + /** + * Sets whether the {@link WebView} should enable support for the "viewport" HTML meta tag or should use a wide viewport + * The default value is {@code true}. + * + * @param flag {@code true} if should use wide viewport. + * @return This builder. This value cannot be {@code null}. + */ + public WebViewBuilder setUseWideViewPort(boolean flag) { + this.useWideViewPort = flag; + return this; + } + + /** + * Sets whether the {@link WebView} should display on-screen zoom controls when using the built-in zoom mechanisms. + * The default value is {@code false} as on-screen zoom controls are deprecated in Android. + * + * @param flag {@code true} if should display zoom controls + * @return This builder. This value cannot be {@code null}. + */ + public WebViewBuilder setDisplayZoomControls(boolean flag) { + this.displayZoomControls = flag; + return this; + } + /** * Build the {@link android.webkit.WebView} using the current settings. * @@ -134,6 +187,10 @@ public WebView build() { webSettings.setDomStorageEnabled(enableDomStorage); webSettings.setJavaScriptCanOpenWindowsAutomatically(javaScriptCanOpenWindowsAutomatically); webSettings.setSupportMultipleWindows(supportMultipleWindows); + webSettings.setLoadWithOverviewMode(loadWithOverviewMode); + webSettings.setUseWideViewPort(useWideViewPort); + webSettings.setBuiltInZoomControls(builtInZoomControls); + webSettings.setDisplayZoomControls(displayZoomControls); webView.setWebChromeClient(webChromeClient); return webView; diff --git a/packages/webview_flutter/webview_flutter/android/src/test/java/io/flutter/plugins/webviewflutter/FlutterWebViewTest.java b/packages/webview_flutter/webview_flutter/android/src/test/java/io/flutter/plugins/webviewflutter/FlutterWebViewTest.java index 4e36dd6896e6..e48bd05a04e0 100644 --- a/packages/webview_flutter/webview_flutter/android/src/test/java/io/flutter/plugins/webviewflutter/FlutterWebViewTest.java +++ b/packages/webview_flutter/webview_flutter/android/src/test/java/io/flutter/plugins/webviewflutter/FlutterWebViewTest.java @@ -34,6 +34,10 @@ public void before() { .thenReturn(mockWebViewBuilder); when(mockWebViewBuilder.setSupportMultipleWindows(anyBoolean())).thenReturn(mockWebViewBuilder); when(mockWebViewBuilder.setUsesHybridComposition(anyBoolean())).thenReturn(mockWebViewBuilder); + when(mockWebViewBuilder.setLoadWithOverviewMode(anyBoolean())).thenReturn(mockWebViewBuilder); + when(mockWebViewBuilder.setUseWideViewPort(anyBoolean())).thenReturn(mockWebViewBuilder); + when(mockWebViewBuilder.setBuiltInZoomControls(anyBoolean())).thenReturn(mockWebViewBuilder); + when(mockWebViewBuilder.setDisplayZoomControls(anyBoolean())).thenReturn(mockWebViewBuilder); when(mockWebViewBuilder.setWebChromeClient(any(WebChromeClient.class))) .thenReturn(mockWebViewBuilder); From d49b19cb2e1bbba2b401c1682dd82e9e04bc165e Mon Sep 17 00:00:00 2001 From: Nick Bradshaw Date: Wed, 8 Sep 2021 12:24:18 -0700 Subject: [PATCH 29/72] Fixing formatting in iOS code --- .../webview_flutter/ios/Classes/FlutterWebView.m | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/packages/webview_flutter/webview_flutter/ios/Classes/FlutterWebView.m b/packages/webview_flutter/webview_flutter/ios/Classes/FlutterWebView.m index d138d23f3e92..8e93e26fd9f3 100644 --- a/packages/webview_flutter/webview_flutter/ios/Classes/FlutterWebView.m +++ b/packages/webview_flutter/webview_flutter/ios/Classes/FlutterWebView.m @@ -483,15 +483,12 @@ - (void)updateZoomEnabled:(NSNumber*)zoomEnabled { __typeof__(self) __strong wSelf = self; if (!enabled) { _navigationDelegate.didFinishLoad = ^(WKNavigation* view) { - NSString* source = @"var meta = document.createElement('meta'); \\ - meta.name = " - @"'viewport'; \\ - meta.content = 'width=device-width, " - @"initial-scale=1.0, maximum-scale=1.0, user-scalable=no'; \\ - " - @" var head = document.getElementsByTagName('head')[0];\\ - " - @"head.appendChild(meta);"; + NSString* source = @"var meta = document.createElement('meta');" + + "meta.name = 'viewport';" + + "meta.content = 'width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no';" + + "var head = document.getElementsByTagName('head')[0];" + + "head.appendChild(meta);"; + [wSelf->_webView evaluateJavaScript:source completionHandler:nil]; }; } else From 87da4bf5c624b3164213ec8c4c4cc77fcaca210e Mon Sep 17 00:00:00 2001 From: Nick Bradshaw Date: Wed, 8 Sep 2021 14:15:35 -0700 Subject: [PATCH 30/72] Addressing some lint/formatting issues --- .../webview_flutter/ios/Classes/FlutterWebView.m | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/packages/webview_flutter/webview_flutter/ios/Classes/FlutterWebView.m b/packages/webview_flutter/webview_flutter/ios/Classes/FlutterWebView.m index 8e93e26fd9f3..8c27d4b46137 100644 --- a/packages/webview_flutter/webview_flutter/ios/Classes/FlutterWebView.m +++ b/packages/webview_flutter/webview_flutter/ios/Classes/FlutterWebView.m @@ -349,8 +349,8 @@ - (NSString*)applySettings:(NSDictionary*)settings { NSString* userAgent = settings[key]; [self updateUserAgent:[userAgent isEqual:[NSNull null]] ? nil : userAgent]; } else if ([key isEqualToString:@"zoomEnabled"]) { - NSNumber* zoomEnabled = settings[key]; - [self updateZoomEnabled:zoomEnabled]; + NSNumber* zoomEnabled = settings[key]; + [self updateZoomEnabled:zoomEnabled]; } else { [unknownKeys addObject:key]; } @@ -483,17 +483,14 @@ - (void)updateZoomEnabled:(NSNumber*)zoomEnabled { __typeof__(self) __strong wSelf = self; if (!enabled) { _navigationDelegate.didFinishLoad = ^(WKNavigation* view) { - NSString* source = @"var meta = document.createElement('meta');" + - "meta.name = 'viewport';" + - "meta.content = 'width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no';" + - "var head = document.getElementsByTagName('head')[0];" + - "head.appendChild(meta);"; + NSString* source = @"var meta = document.createElement('meta');meta.name = 'viewport';meta.content = 'width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no';var head = document.getElementsByTagName('head')[0];head.appendChild(meta);"; - [wSelf->_webView evaluateJavaScript:source completionHandler:nil]; + [wSelf->_webView evaluateJavaScript:source completionHandler:nil]; }; - } else + } else { _navigationDelegate.didFinishLoad = ^(WKNavigation* view) { }; + } } #pragma mark WKUIDelegate From 76931cb7d597c4356d6c5093b7fc59ebb39e127f Mon Sep 17 00:00:00 2001 From: Nick Bradshaw Date: Wed, 8 Sep 2021 14:27:32 -0700 Subject: [PATCH 31/72] Following format suggestions from CI format helper --- .../io/flutter/plugins/webviewflutter/WebViewBuilder.java | 8 +++++--- .../webview_flutter/ios/Classes/FLTWKNavigationDelegate.h | 2 +- .../webview_flutter/ios/Classes/FlutterWebView.m | 5 ++++- 3 files changed, 10 insertions(+), 5 deletions(-) diff --git a/packages/webview_flutter/webview_flutter/android/src/main/java/io/flutter/plugins/webviewflutter/WebViewBuilder.java b/packages/webview_flutter/webview_flutter/android/src/main/java/io/flutter/plugins/webviewflutter/WebViewBuilder.java index 09cc052de459..4eeb2b8bc9e9 100644 --- a/packages/webview_flutter/webview_flutter/android/src/main/java/io/flutter/plugins/webviewflutter/WebViewBuilder.java +++ b/packages/webview_flutter/webview_flutter/android/src/main/java/io/flutter/plugins/webviewflutter/WebViewBuilder.java @@ -152,7 +152,8 @@ public WebViewBuilder setLoadWithOverviewMode(boolean flag) { } /** - * Sets whether the {@link WebView} should enable support for the "viewport" HTML meta tag or should use a wide viewport + * Sets whether the {@link WebView} should enable support for the "viewport" HTML meta tag or + * should use a wide viewport * The default value is {@code true}. * * @param flag {@code true} if should use wide viewport. @@ -164,8 +165,9 @@ public WebViewBuilder setUseWideViewPort(boolean flag) { } /** - * Sets whether the {@link WebView} should display on-screen zoom controls when using the built-in zoom mechanisms. - * The default value is {@code false} as on-screen zoom controls are deprecated in Android. + * Sets whether the {@link WebView} should display on-screen zoom controls when using the built-in + * zoom mechanisms. + * The default value is {@code false} as on-screen zoom controls are deprecated * * @param flag {@code true} if should display zoom controls * @return This builder. This value cannot be {@code null}. diff --git a/packages/webview_flutter/webview_flutter/ios/Classes/FLTWKNavigationDelegate.h b/packages/webview_flutter/webview_flutter/ios/Classes/FLTWKNavigationDelegate.h index d28fa57825a6..0244ccc8c934 100644 --- a/packages/webview_flutter/webview_flutter/ios/Classes/FLTWKNavigationDelegate.h +++ b/packages/webview_flutter/webview_flutter/ios/Classes/FLTWKNavigationDelegate.h @@ -9,7 +9,7 @@ NS_ASSUME_NONNULL_BEGIN @interface FLTWKNavigationDelegate : NSObject -- (instancetype)initWithChannel:(FlutterMethodChannel*)channel; +- (instancetype)initWithChannel:(FlutterMethodChannel *)channel; /** * Whether to delegate navigation decisions over the method channel. diff --git a/packages/webview_flutter/webview_flutter/ios/Classes/FlutterWebView.m b/packages/webview_flutter/webview_flutter/ios/Classes/FlutterWebView.m index 8c27d4b46137..d16600973101 100644 --- a/packages/webview_flutter/webview_flutter/ios/Classes/FlutterWebView.m +++ b/packages/webview_flutter/webview_flutter/ios/Classes/FlutterWebView.m @@ -483,7 +483,10 @@ - (void)updateZoomEnabled:(NSNumber*)zoomEnabled { __typeof__(self) __strong wSelf = self; if (!enabled) { _navigationDelegate.didFinishLoad = ^(WKNavigation* view) { - NSString* source = @"var meta = document.createElement('meta');meta.name = 'viewport';meta.content = 'width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no';var head = document.getElementsByTagName('head')[0];head.appendChild(meta);"; + NSString* source = + @"var meta = document.createElement('meta');meta.name = 'viewport';meta.content = " + @"'width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no';var head " + @"= document.getElementsByTagName('head')[0];head.appendChild(meta);"; [wSelf->_webView evaluateJavaScript:source completionHandler:nil]; }; From 0aeb88760d0c43b7143ad712807359f47a56e4e5 Mon Sep 17 00:00:00 2001 From: Nick Bradshaw Date: Wed, 8 Sep 2021 14:37:05 -0700 Subject: [PATCH 32/72] More format fixes --- .../flutter/plugins/webviewflutter/WebViewBuilder.java | 9 ++++----- .../webview_flutter/ios/Classes/FlutterWebView.m | 10 +++++----- 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/packages/webview_flutter/webview_flutter/android/src/main/java/io/flutter/plugins/webviewflutter/WebViewBuilder.java b/packages/webview_flutter/webview_flutter/android/src/main/java/io/flutter/plugins/webviewflutter/WebViewBuilder.java index 4eeb2b8bc9e9..98bf9577870d 100644 --- a/packages/webview_flutter/webview_flutter/android/src/main/java/io/flutter/plugins/webviewflutter/WebViewBuilder.java +++ b/packages/webview_flutter/webview_flutter/android/src/main/java/io/flutter/plugins/webviewflutter/WebViewBuilder.java @@ -140,7 +140,8 @@ public WebViewBuilder setBuiltInZoomControls(boolean flag) { } /** - * Sets whether the {@link WebView} loads pages zoomed out so the content will fit on screen by width + * Sets whether the {@link WebView} loads pages zoomed out so the content will fit on screen + * by width * The default value is {@code true}. * * @param flag {@code true} if should allow pages to load in overview mode. @@ -153,8 +154,7 @@ public WebViewBuilder setLoadWithOverviewMode(boolean flag) { /** * Sets whether the {@link WebView} should enable support for the "viewport" HTML meta tag or - * should use a wide viewport - * The default value is {@code true}. + * should use a wide viewport. The default value is {@code true}. * * @param flag {@code true} if should use wide viewport. * @return This builder. This value cannot be {@code null}. @@ -166,8 +166,7 @@ public WebViewBuilder setUseWideViewPort(boolean flag) { /** * Sets whether the {@link WebView} should display on-screen zoom controls when using the built-in - * zoom mechanisms. - * The default value is {@code false} as on-screen zoom controls are deprecated + * zoom mechanisms. The default value is {@code false} as on-screen zoom controls are deprecated * * @param flag {@code true} if should display zoom controls * @return This builder. This value cannot be {@code null}. diff --git a/packages/webview_flutter/webview_flutter/ios/Classes/FlutterWebView.m b/packages/webview_flutter/webview_flutter/ios/Classes/FlutterWebView.m index d16600973101..a2fa5e5a7fe9 100644 --- a/packages/webview_flutter/webview_flutter/ios/Classes/FlutterWebView.m +++ b/packages/webview_flutter/webview_flutter/ios/Classes/FlutterWebView.m @@ -483,12 +483,12 @@ - (void)updateZoomEnabled:(NSNumber*)zoomEnabled { __typeof__(self) __strong wSelf = self; if (!enabled) { _navigationDelegate.didFinishLoad = ^(WKNavigation* view) { - NSString* source = - @"var meta = document.createElement('meta');meta.name = 'viewport';meta.content = " - @"'width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no';var head " - @"= document.getElementsByTagName('head')[0];head.appendChild(meta);"; + NSString* source = + @"var meta = document.createElement('meta');meta.name = 'viewport';meta.content = " + @"'width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no';var head " + @"= document.getElementsByTagName('head')[0];head.appendChild(meta);"; - [wSelf->_webView evaluateJavaScript:source completionHandler:nil]; + [wSelf->_webView evaluateJavaScript:source completionHandler:nil]; }; } else { _navigationDelegate.didFinishLoad = ^(WKNavigation* view) { From 5816db7aa3b2ab6e769ca54b7a994f801c5e7a46 Mon Sep 17 00:00:00 2001 From: Nick Bradshaw Date: Wed, 8 Sep 2021 14:41:43 -0700 Subject: [PATCH 33/72] More format fixes --- .../flutter/plugins/webviewflutter/WebViewBuilder.java | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/packages/webview_flutter/webview_flutter/android/src/main/java/io/flutter/plugins/webviewflutter/WebViewBuilder.java b/packages/webview_flutter/webview_flutter/android/src/main/java/io/flutter/plugins/webviewflutter/WebViewBuilder.java index 98bf9577870d..112f65e0369c 100644 --- a/packages/webview_flutter/webview_flutter/android/src/main/java/io/flutter/plugins/webviewflutter/WebViewBuilder.java +++ b/packages/webview_flutter/webview_flutter/android/src/main/java/io/flutter/plugins/webviewflutter/WebViewBuilder.java @@ -49,7 +49,6 @@ static WebView create(Context context, boolean usesHybridComposition, View conta private boolean useWideViewPort; private boolean displayZoomControls; - /** * Constructs a new {@link WebViewBuilder} object with a custom implementation of the {@link * WebViewFactory} object. @@ -128,8 +127,8 @@ public WebViewBuilder setWebChromeClient(@Nullable WebChromeClient webChromeClie } /** - * Sets whether the {@link WebView} should use its built-in zoom mechanisms. - * The default value is {@code true}. + * Sets whether the {@link WebView} should use its built-in zoom mechanisms. The default value is + * {@code true}. * * @param flag {@code true} if built in zoom controls are allowed. * @return This builder. This value cannot be {@code null}. @@ -140,9 +139,8 @@ public WebViewBuilder setBuiltInZoomControls(boolean flag) { } /** - * Sets whether the {@link WebView} loads pages zoomed out so the content will fit on screen - * by width - * The default value is {@code true}. + * Sets whether the {@link WebView} loads pages zoomed out so the content will fit on screen by + * width The default value is {@code true}. * * @param flag {@code true} if should allow pages to load in overview mode. * @return This builder. This value cannot be {@code null}. From 31a20dbba7122b9159c5ca444ed39eab63872851 Mon Sep 17 00:00:00 2001 From: Nick Bradshaw Date: Wed, 8 Sep 2021 22:21:01 -0700 Subject: [PATCH 34/72] Removing leftover test artifacts from original implementation --- .../test/webview_flutter_test.dart | 22 ------------------- 1 file changed, 22 deletions(-) diff --git a/packages/webview_flutter/webview_flutter/test/webview_flutter_test.dart b/packages/webview_flutter/webview_flutter/test/webview_flutter_test.dart index e95eeef39b86..bd6e2e08f66d 100644 --- a/packages/webview_flutter/webview_flutter/test/webview_flutter_test.dart +++ b/packages/webview_flutter/webview_flutter/test/webview_flutter_test.dart @@ -986,11 +986,6 @@ class FakePlatformWebView { debuggingEnabled = params['settings']['debuggingEnabled']; userAgent = params['settings']['userAgent']; zoomEnabled = params['settings']['zoomEnabled'] ?? true; - builtInZoomControlsEnabled = - params['settings']['builtInZoomControlsEnabled'] ?? true; - displayZoomControls = params['settings']['displayZoomControls'] ?? false; - useWideViewPort = params['settings']['useWideViewPort']; - loadWithOverviewMode = params['settings']['loadWithOverviewMode']; channel = MethodChannel( 'plugins.flutter.io/webview_$id', const StandardMethodCodec()); channel.setMockMethodCallHandler(onMethodCall); @@ -1011,10 +1006,6 @@ class FakePlatformWebView { bool? debuggingEnabled; String? userAgent; bool? zoomEnabled; - bool? builtInZoomControlsEnabled; - bool? displayZoomControls; - bool? useWideViewPort; - bool? loadWithOverviewMode; Future onMethodCall(MethodCall call) { switch (call.method) { @@ -1036,19 +1027,6 @@ class FakePlatformWebView { if (call.arguments['zoomEnabled'] != null) { zoomEnabled = call.arguments['zoomEnabled']; } - if (call.arguments['builtInZoomControlsEnabled'] != null) { - builtInZoomControlsEnabled = - call.arguments['builtInZoomControlsEnabled']; - } - if (call.arguments['displayZoomControls'] != null) { - displayZoomControls = call.arguments['displayZoomControls']; - } - if (call.arguments['useWideViewPort'] != null) { - useWideViewPort = call.arguments['useWideViewPort']; - } - if (call.arguments['loadWithOverviewMode'] != null) { - loadWithOverviewMode = call.arguments['loadWithOverviewMode']; - } break; case 'canGoBack': return Future.sync(() => currentPosition > 0); From b40f51c01f59aa0d8697ba279daf5032bd46652f Mon Sep 17 00:00:00 2001 From: Nick Bradshaw Date: Fri, 10 Sep 2021 10:39:56 -0700 Subject: [PATCH 35/72] Formatting after merging in master --- .../java/io/flutter/plugins/webviewflutter/FlutterWebView.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/webview_flutter/webview_flutter/android/src/main/java/io/flutter/plugins/webviewflutter/FlutterWebView.java b/packages/webview_flutter/webview_flutter/android/src/main/java/io/flutter/plugins/webviewflutter/FlutterWebView.java index 8e675523c84b..341ed7dfb46b 100644 --- a/packages/webview_flutter/webview_flutter/android/src/main/java/io/flutter/plugins/webviewflutter/FlutterWebView.java +++ b/packages/webview_flutter/webview_flutter/android/src/main/java/io/flutter/plugins/webviewflutter/FlutterWebView.java @@ -177,7 +177,7 @@ static WebView createWebView( true) // Always allow automatically opening of windows. .setSupportMultipleWindows(true) // Always support multiple windows. .setWebChromeClient( - webChromeClient) // Always use {@link FlutterWebChromeClient} as web Chrome client. + webChromeClient) // Always use {@link FlutterWebChromeClient} as web Chrome client. .setDownloadListener(downloadListener) .setBuiltInZoomControls(true) //Always use built-in zoom mechanisms. .setLoadWithOverviewMode(true) //Always zooms out the content to fit on screen by width. From 31407b9cb9bda5d430932ab4c7206eaf5cb15a5a Mon Sep 17 00:00:00 2001 From: Nick Bradshaw Date: Mon, 27 Sep 2021 14:55:21 -0700 Subject: [PATCH 36/72] Adjustments after merging in federated architecture --- packages/webview_flutter/webview_flutter/lib/src/webview.dart | 2 +- .../lib/src/method_channel/webview_method_channel.dart | 2 +- .../lib/src/types/web_settings.dart | 4 ++-- .../test/src/method_channel/webview_method_channel_test.dart | 3 ++- 4 files changed, 6 insertions(+), 5 deletions(-) diff --git a/packages/webview_flutter/webview_flutter/lib/src/webview.dart b/packages/webview_flutter/webview_flutter/lib/src/webview.dart index 6b884fe1aef2..3278f4608527 100644 --- a/packages/webview_flutter/webview_flutter/lib/src/webview.dart +++ b/packages/webview_flutter/webview_flutter/lib/src/webview.dart @@ -366,7 +366,7 @@ WebSettings _webSettingsFromWidget(WebView widget) { gestureNavigationEnabled: widget.gestureNavigationEnabled, allowsInlineMediaPlayback: widget.allowsInlineMediaPlayback, userAgent: WebSetting.of(widget.userAgent), - zoomEnabled: WebSetting.of(widget.zoomEnabled), + zoomEnabled: widget.zoomEnabled, ); } diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/method_channel/webview_method_channel.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/method_channel/webview_method_channel.dart index b1da1e93f2f2..411cad038618 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/method_channel/webview_method_channel.dart +++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/method_channel/webview_method_channel.dart @@ -200,7 +200,7 @@ class MethodChannelWebViewPlatform implements WebViewPlatformController { _addIfNonNull( 'allowsInlineMediaPlayback', settings.allowsInlineMediaPlayback); _addSettingIfPresent('userAgent', settings.userAgent); - _addSettingIfPresent('zoomEnabled', settings.zoomEnabled); + _addIfNonNull('zoomEnabled', settings.zoomEnabled); return map; } diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/types/web_settings.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/types/web_settings.dart index 9aa115f2ebe6..3d94153c886e 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/types/web_settings.dart +++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/types/web_settings.dart @@ -78,7 +78,7 @@ class WebSettings { this.debuggingEnabled, this.gestureNavigationEnabled, this.allowsInlineMediaPlayback, - required this.zoomEnabled, + this.zoomEnabled, required this.userAgent, }) : assert(userAgent != null); @@ -113,7 +113,7 @@ class WebSettings { final WebSetting userAgent; /// Sets whether the WebView should support zooming using its on-screen zoom controls and gestures. - final WebSetting zoomEnabled; + final bool? zoomEnabled; /// Whether to allow swipe based navigation in iOS. /// diff --git a/packages/webview_flutter/webview_flutter_platform_interface/test/src/method_channel/webview_method_channel_test.dart b/packages/webview_flutter/webview_flutter_platform_interface/test/src/method_channel/webview_method_channel_test.dart index 2f845eaa4999..3914b2080259 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/test/src/method_channel/webview_method_channel_test.dart +++ b/packages/webview_flutter/webview_flutter_platform_interface/test/src/method_channel/webview_method_channel_test.dart @@ -5,7 +5,6 @@ import 'package:flutter/services.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:mockito/mockito.dart'; - import 'package:webview_flutter_platform_interface/src/method_channel/webview_method_channel.dart'; import 'package:webview_flutter_platform_interface/webview_flutter_platform_interface.dart'; @@ -229,6 +228,7 @@ void main() { debuggingEnabled: true, gestureNavigationEnabled: true, allowsInlineMediaPlayback: true, + zoomEnabled: false, ); await webViewPlatform.updateSettings(settings); @@ -245,6 +245,7 @@ void main() { 'debuggingEnabled': true, 'gestureNavigationEnabled': true, 'allowsInlineMediaPlayback': true, + 'zoomEnabled': false, }, ), ], From 243edbddf9d3cedafa061132e47eb03d43e752a8 Mon Sep 17 00:00:00 2001 From: Nick Bradshaw Date: Mon, 27 Sep 2021 15:22:43 -0700 Subject: [PATCH 37/72] Update versions after federated plugin changes --- packages/webview_flutter/webview_flutter/CHANGELOG.md | 4 +++- .../webview_flutter/webview_flutter/lib/src/webview.dart | 2 +- packages/webview_flutter/webview_flutter/pubspec.yaml | 8 ++++---- .../webview_flutter/test/webview_flutter_test.dart | 4 ++-- .../webview_flutter/webview_flutter_android/CHANGELOG.md | 4 ++++ .../webview_flutter/webview_flutter_android/pubspec.yaml | 4 ++-- .../webview_flutter_platform_interface/CHANGELOG.md | 4 ++++ .../webview_flutter_platform_interface/pubspec.yaml | 2 +- .../webview_flutter_wkwebview/CHANGELOG.md | 4 ++++ .../webview_flutter_wkwebview/pubspec.yaml | 4 ++-- 10 files changed, 27 insertions(+), 13 deletions(-) diff --git a/packages/webview_flutter/webview_flutter/CHANGELOG.md b/packages/webview_flutter/webview_flutter/CHANGELOG.md index a7e82f1ed294..180182d1f397 100644 --- a/packages/webview_flutter/webview_flutter/CHANGELOG.md +++ b/packages/webview_flutter/webview_flutter/CHANGELOG.md @@ -1,3 +1,6 @@ +## 2.1.1 +* Add ability to enable/disable zoom functionality + ## 2.1.0 * Migrated to fully federated architecture. @@ -10,7 +13,6 @@ * Send URL of File to download to the NavigationDelegate on Android just like it is already done on iOS. * Updated Android lint settings. -* Enable native double-tap to zoom, and pinch to zoom functionality on Android ## 2.0.12 diff --git a/packages/webview_flutter/webview_flutter/lib/src/webview.dart b/packages/webview_flutter/webview_flutter/lib/src/webview.dart index 3278f4608527..b768ba2e1bc0 100644 --- a/packages/webview_flutter/webview_flutter/lib/src/webview.dart +++ b/packages/webview_flutter/webview_flutter/lib/src/webview.dart @@ -389,7 +389,7 @@ WebSettings _clearUnchangedWebSettings( bool? hasProgressTracking; bool? debuggingEnabled; WebSetting userAgent = WebSetting.absent(); - WebSetting zoomEnabled = WebSetting.absent(); + bool? zoomEnabled; if (currentValue.javascriptMode != newValue.javascriptMode) { javascriptMode = newValue.javascriptMode; } diff --git a/packages/webview_flutter/webview_flutter/pubspec.yaml b/packages/webview_flutter/webview_flutter/pubspec.yaml index ab870639d615..90625d04b65d 100644 --- a/packages/webview_flutter/webview_flutter/pubspec.yaml +++ b/packages/webview_flutter/webview_flutter/pubspec.yaml @@ -2,7 +2,7 @@ name: webview_flutter description: A Flutter plugin that provides a WebView widget on Android and iOS. repository: https://github.com/flutter/plugins/tree/master/packages/webview_flutter/webview_flutter issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+webview%22 -version: 2.1.0 +version: 2.1.1 environment: sdk: ">=2.14.0 <3.0.0" @@ -19,9 +19,9 @@ flutter: dependencies: flutter: sdk: flutter - webview_flutter_platform_interface: ^1.0.0 - webview_flutter_android: ^2.0.13 - webview_flutter_wkwebview: ^2.0.13 + webview_flutter_platform_interface: ^1.0.1 + webview_flutter_android: ^2.0.14 + webview_flutter_wkwebview: ^2.0.14 dev_dependencies: flutter_driver: diff --git a/packages/webview_flutter/webview_flutter/test/webview_flutter_test.dart b/packages/webview_flutter/webview_flutter/test/webview_flutter_test.dart index 607b595dffe5..e6941d2675d6 100644 --- a/packages/webview_flutter/webview_flutter/test/webview_flutter_test.dart +++ b/packages/webview_flutter/webview_flutter/test/webview_flutter_test.dart @@ -10,8 +10,8 @@ import 'package:flutter/src/foundation/basic_types.dart'; import 'package:flutter/src/gestures/recognizer.dart'; import 'package:flutter/widgets.dart'; import 'package:flutter_test/flutter_test.dart'; -import 'package:webview_flutter_platform_interface/webview_flutter_platform_interface.dart'; import 'package:webview_flutter/webview_flutter.dart'; +import 'package:webview_flutter_platform_interface/webview_flutter_platform_interface.dart'; typedef void VoidCallback(); @@ -917,7 +917,7 @@ void main() { debuggingEnabled: false, userAgent: WebSetting.of(null), gestureNavigationEnabled: true, - zoomEnabled: WebSetting.of(true), + zoomEnabled: true, ), ))); }); diff --git a/packages/webview_flutter/webview_flutter_android/CHANGELOG.md b/packages/webview_flutter/webview_flutter_android/CHANGELOG.md index d6a10e9b918a..5ae063341812 100644 --- a/packages/webview_flutter/webview_flutter_android/CHANGELOG.md +++ b/packages/webview_flutter/webview_flutter_android/CHANGELOG.md @@ -1,3 +1,7 @@ +## 2.0.14 + +* Add `zoomEnabled` functionality. + ## 2.0.13 * Extract Android implementation from `webview_flutter`. diff --git a/packages/webview_flutter/webview_flutter_android/pubspec.yaml b/packages/webview_flutter/webview_flutter_android/pubspec.yaml index f7db4c6fb63a..1e2741c754c3 100644 --- a/packages/webview_flutter/webview_flutter_android/pubspec.yaml +++ b/packages/webview_flutter/webview_flutter_android/pubspec.yaml @@ -2,7 +2,7 @@ name: webview_flutter_android description: A Flutter plugin that provides a WebView widget on Android. repository: https://github.com/flutter/plugins/tree/master/packages/webview_flutter/webview_flutter_android issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+webview%22 -version: 2.0.13 +version: 2.0.14 environment: sdk: ">=2.14.0 <3.0.0" @@ -20,7 +20,7 @@ dependencies: flutter: sdk: flutter - webview_flutter_platform_interface: ^1.0.0 + webview_flutter_platform_interface: ^1.0.1 dev_dependencies: flutter_driver: diff --git a/packages/webview_flutter/webview_flutter_platform_interface/CHANGELOG.md b/packages/webview_flutter/webview_flutter_platform_interface/CHANGELOG.md index 9e217a04e961..46ea0ba8cdd7 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/CHANGELOG.md +++ b/packages/webview_flutter/webview_flutter_platform_interface/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.0.1 + +* Add `zoomEnabled` functionality to `WebSettings`. + ## 1.0.0 * Extracted platform interface from `webview_flutter`. \ No newline at end of file diff --git a/packages/webview_flutter/webview_flutter_platform_interface/pubspec.yaml b/packages/webview_flutter/webview_flutter_platform_interface/pubspec.yaml index bf43c265d77a..467d0cfcfb7d 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/pubspec.yaml +++ b/packages/webview_flutter/webview_flutter_platform_interface/pubspec.yaml @@ -4,7 +4,7 @@ repository: https://github.com/flutter/plugins/tree/master/packages/webview_flut issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+webview_flutter%22 # NOTE: We strongly prefer non-breaking changes, even at the expense of a # less-clean API. See https://flutter.dev/go/platform-interface-breaking-changes -version: 1.0.0 +version: 1.0.1 environment: sdk: ">=2.12.0 <3.0.0" diff --git a/packages/webview_flutter/webview_flutter_wkwebview/CHANGELOG.md b/packages/webview_flutter/webview_flutter_wkwebview/CHANGELOG.md index 1a85bc8a53e5..a2e70a148010 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/CHANGELOG.md +++ b/packages/webview_flutter/webview_flutter_wkwebview/CHANGELOG.md @@ -1,3 +1,7 @@ +## 2.0.14 + +* Add `zoomEnabled` functionality. + ## 2.0.13 * Extract WKWebView implementation from `webview_flutter`. diff --git a/packages/webview_flutter/webview_flutter_wkwebview/pubspec.yaml b/packages/webview_flutter/webview_flutter_wkwebview/pubspec.yaml index c6f6d6f94f07..551e51b3e81d 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/pubspec.yaml +++ b/packages/webview_flutter/webview_flutter_wkwebview/pubspec.yaml @@ -2,7 +2,7 @@ name: webview_flutter_wkwebview description: A Flutter plugin that provides a WebView widget based on Apple's WKWebView control. repository: https://github.com/flutter/plugins/tree/master/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.0.13 +version: 2.0.14 environment: sdk: ">=2.14.0 <3.0.0" @@ -19,7 +19,7 @@ dependencies: flutter: sdk: flutter - webview_flutter_platform_interface: ^1.0.0 + webview_flutter_platform_interface: ^1.0.1 dev_dependencies: flutter_driver: From 8482c6e3cca5869632591036df3204dbbb3a94b8 Mon Sep 17 00:00:00 2001 From: Nick Bradshaw Date: Mon, 27 Sep 2021 15:38:01 -0700 Subject: [PATCH 38/72] Remove leftover file after Federated Plugin migration --- .../webview_flutter/lib/src/webview_method_channel.dart | 1 - 1 file changed, 1 deletion(-) delete mode 100644 packages/webview_flutter/webview_flutter/lib/src/webview_method_channel.dart diff --git a/packages/webview_flutter/webview_flutter/lib/src/webview_method_channel.dart b/packages/webview_flutter/webview_flutter/lib/src/webview_method_channel.dart deleted file mode 100644 index 8b137891791f..000000000000 --- a/packages/webview_flutter/webview_flutter/lib/src/webview_method_channel.dart +++ /dev/null @@ -1 +0,0 @@ - From d3f929522658fb59908d42826cb23b95e998f5ab Mon Sep 17 00:00:00 2001 From: Nick Bradshaw Date: Thu, 30 Sep 2021 16:11:49 -0700 Subject: [PATCH 39/72] Update to path-based dependency overrides per contribution guidelines --- packages/webview_flutter/webview_flutter/pubspec.yaml | 11 ++++++++--- .../webview_flutter_android/pubspec.yaml | 4 +++- .../webview_flutter_wkwebview/pubspec.yaml | 4 +++- 3 files changed, 14 insertions(+), 5 deletions(-) diff --git a/packages/webview_flutter/webview_flutter/pubspec.yaml b/packages/webview_flutter/webview_flutter/pubspec.yaml index 08fbcec50bd2..da72ceb03d32 100644 --- a/packages/webview_flutter/webview_flutter/pubspec.yaml +++ b/packages/webview_flutter/webview_flutter/pubspec.yaml @@ -19,9 +19,14 @@ flutter: dependencies: flutter: sdk: flutter - webview_flutter_platform_interface: ^1.0.1 - webview_flutter_android: ^2.0.15 - webview_flutter_wkwebview: ^2.0.16 + + # FOR TESTING ONLY. DO NOT MERGE. + webview_flutter_platform_interface: + path: ../webview_flutter_platform_interface + webview_flutter_android: + path: ../webview_flutter_android + webview_flutter_wkwebview: + path: ../webview_flutter_wkwebview dev_dependencies: flutter_driver: diff --git a/packages/webview_flutter/webview_flutter_android/pubspec.yaml b/packages/webview_flutter/webview_flutter_android/pubspec.yaml index 38f43099c358..46661a4bae07 100644 --- a/packages/webview_flutter/webview_flutter_android/pubspec.yaml +++ b/packages/webview_flutter/webview_flutter_android/pubspec.yaml @@ -20,7 +20,9 @@ dependencies: flutter: sdk: flutter - webview_flutter_platform_interface: ^1.0.1 + # FOR TESTING ONLY. DO NOT MERGE. + webview_flutter_platform_interface: + path: ../webview_flutter_platform_interface dev_dependencies: flutter_driver: diff --git a/packages/webview_flutter/webview_flutter_wkwebview/pubspec.yaml b/packages/webview_flutter/webview_flutter_wkwebview/pubspec.yaml index 9f5653d5d34d..08caf8a652a6 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/pubspec.yaml +++ b/packages/webview_flutter/webview_flutter_wkwebview/pubspec.yaml @@ -19,7 +19,9 @@ dependencies: flutter: sdk: flutter - webview_flutter_platform_interface: ^1.0.1 + # FOR TESTING ONLY. DO NOT MERGE. + webview_flutter_platform_interface: + path: ../webview_flutter_platform_interface dev_dependencies: flutter_driver: From 41563a9188e4514a6a1a7a3a4090282c5b65636a Mon Sep 17 00:00:00 2001 From: Nick Bradshaw Date: Thu, 30 Sep 2021 17:27:02 -0700 Subject: [PATCH 40/72] Updating platform-specific WebView implementations --- .../example/lib/web_view.dart | 14 ++++++++++++++ .../example/lib/web_view.dart | 10 +++++++++- 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/packages/webview_flutter/webview_flutter_android/example/lib/web_view.dart b/packages/webview_flutter/webview_flutter_android/example/lib/web_view.dart index 33773f96cad8..05f93e091f36 100644 --- a/packages/webview_flutter/webview_flutter_android/example/lib/web_view.dart +++ b/packages/webview_flutter/webview_flutter_android/example/lib/web_view.dart @@ -72,10 +72,12 @@ class WebView extends StatefulWidget { this.debuggingEnabled = false, this.gestureNavigationEnabled = false, this.userAgent, + this.zoomEnabled = true, this.initialMediaPlaybackPolicy = AutoMediaPlaybackPolicy.require_user_action_for_all_media_types, this.allowsInlineMediaPlayback = false, }) : assert(javascriptMode != null), + assert(zoomEnabled != null), assert(initialMediaPlaybackPolicy != null), assert(allowsInlineMediaPlayback != null), super(key: key); @@ -221,6 +223,11 @@ class WebView extends StatefulWidget { /// By default `gestureNavigationEnabled` is false. final bool gestureNavigationEnabled; + /// Sets whether the WebView should support zooming using its on-screen zoom controls and gestures. + /// + /// By default 'zoomEnabled' is true + final bool zoomEnabled; + /// The value used for the HTTP User-Agent: request header. /// /// When null the platform's webview default is used for the User-Agent header. @@ -553,11 +560,13 @@ class WebViewController { assert(newValue.hasNavigationDelegate != null); assert(newValue.debuggingEnabled != null); assert(newValue.userAgent != null); + assert(newValue.zoomEnabled != null); JavascriptMode? javascriptMode; bool? hasNavigationDelegate; bool? hasProgressTracking; bool? debuggingEnabled; + bool? zoomEnabled; WebSetting userAgent = WebSetting.absent(); if (currentValue.javascriptMode != newValue.javascriptMode) { javascriptMode = newValue.javascriptMode; @@ -574,6 +583,9 @@ class WebViewController { if (currentValue.userAgent != newValue.userAgent) { userAgent = newValue.userAgent; } + if (currentValue.zoomEnabled != newValue.zoomEnabled) { + zoomEnabled = newValue.zoomEnabled; + } return WebSettings( javascriptMode: javascriptMode, @@ -581,6 +593,7 @@ class WebViewController { hasProgressTracking: hasProgressTracking, debuggingEnabled: debuggingEnabled, userAgent: userAgent, + zoomEnabled: zoomEnabled, ); } @@ -613,5 +626,6 @@ WebSettings _webSettingsFromWidget(WebView widget) { gestureNavigationEnabled: widget.gestureNavigationEnabled, allowsInlineMediaPlayback: widget.allowsInlineMediaPlayback, userAgent: WebSetting.of(widget.userAgent), + zoomEnabled: widget.zoomEnabled, ); } diff --git a/packages/webview_flutter/webview_flutter_wkwebview/example/lib/web_view.dart b/packages/webview_flutter/webview_flutter_wkwebview/example/lib/web_view.dart index ddb8e9b0f14f..e86323094cce 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/example/lib/web_view.dart +++ b/packages/webview_flutter/webview_flutter_wkwebview/example/lib/web_view.dart @@ -4,9 +4,9 @@ import 'dart:async'; -import 'package:flutter/widgets.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/gestures.dart'; +import 'package:flutter/widgets.dart'; import 'package:webview_flutter_platform_interface/webview_flutter_platform_interface.dart'; import 'package:webview_flutter_wkwebview/webview_flutter_wkwebview.dart'; @@ -65,10 +65,12 @@ class WebView extends StatefulWidget { this.debuggingEnabled = false, this.gestureNavigationEnabled = false, this.userAgent, + this.zoomEnabled = true, this.initialMediaPlaybackPolicy = AutoMediaPlaybackPolicy.require_user_action_for_all_media_types, this.allowsInlineMediaPlayback = false, }) : assert(javascriptMode != null), + assert(zoomEnabled != null), assert(initialMediaPlaybackPolicy != null), assert(allowsInlineMediaPlayback != null), super(key: key); @@ -213,6 +215,11 @@ class WebView extends StatefulWidget { /// By default `userAgent` is null. final String? userAgent; + /// Sets whether the WebView should support zooming using its on-screen zoom controls and gestures. + /// + /// By default 'zoomEnabled' is true + final bool zoomEnabled; + /// Which restrictions apply on automatic media playback. /// /// This initial value is applied to the platform's webview upon creation. Any following @@ -542,6 +549,7 @@ WebSettings _webSettingsFromWidget(WebView widget) { gestureNavigationEnabled: widget.gestureNavigationEnabled, allowsInlineMediaPlayback: widget.allowsInlineMediaPlayback, userAgent: WebSetting.of(widget.userAgent), + zoomEnabled: widget.zoomEnabled, ); } From 1cf973b8ca7a1b14a370109eeefcdf45e0b738b5 Mon Sep 17 00:00:00 2001 From: Nick Bradshaw Date: Fri, 1 Oct 2021 07:12:43 -0700 Subject: [PATCH 41/72] Correcting version numbers --- packages/webview_flutter/webview_flutter_android/pubspec.yaml | 2 +- packages/webview_flutter/webview_flutter_wkwebview/pubspec.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/webview_flutter/webview_flutter_android/pubspec.yaml b/packages/webview_flutter/webview_flutter_android/pubspec.yaml index 46661a4bae07..0278acb1c41f 100644 --- a/packages/webview_flutter/webview_flutter_android/pubspec.yaml +++ b/packages/webview_flutter/webview_flutter_android/pubspec.yaml @@ -2,7 +2,7 @@ name: webview_flutter_android description: A Flutter plugin that provides a WebView widget on Android. repository: https://github.com/flutter/plugins/tree/master/packages/webview_flutter/webview_flutter_android issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+webview%22 -version: 2.0.15 +version: 2.0.16 environment: sdk: ">=2.14.0 <3.0.0" diff --git a/packages/webview_flutter/webview_flutter_wkwebview/pubspec.yaml b/packages/webview_flutter/webview_flutter_wkwebview/pubspec.yaml index 08caf8a652a6..a41f82719bd6 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/pubspec.yaml +++ b/packages/webview_flutter/webview_flutter_wkwebview/pubspec.yaml @@ -2,7 +2,7 @@ name: webview_flutter_wkwebview description: A Flutter plugin that provides a WebView widget based on Apple's WKWebView control. repository: https://github.com/flutter/plugins/tree/master/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.0.16 +version: 2.0.15 environment: sdk: ">=2.14.0 <3.0.0" From 84c91ff28a5f238c5205d83d79e01849e77455d4 Mon Sep 17 00:00:00 2001 From: Nick Bradshaw Date: Fri, 1 Oct 2021 08:00:24 -0700 Subject: [PATCH 42/72] Correcting version number per semver/PR feedback (cherry picked from commit dc60b837729714ea699c18cfb23e0d4908fd6e72) --- .../webview_flutter_platform_interface/CHANGELOG.md | 2 +- .../webview_flutter_platform_interface/pubspec.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/webview_flutter/webview_flutter_platform_interface/CHANGELOG.md b/packages/webview_flutter/webview_flutter_platform_interface/CHANGELOG.md index 46ea0ba8cdd7..93c470cee069 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/CHANGELOG.md +++ b/packages/webview_flutter/webview_flutter_platform_interface/CHANGELOG.md @@ -1,4 +1,4 @@ -## 1.0.1 +## 1.1.0 * Add `zoomEnabled` functionality to `WebSettings`. diff --git a/packages/webview_flutter/webview_flutter_platform_interface/pubspec.yaml b/packages/webview_flutter/webview_flutter_platform_interface/pubspec.yaml index 467d0cfcfb7d..166c55b133db 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/pubspec.yaml +++ b/packages/webview_flutter/webview_flutter_platform_interface/pubspec.yaml @@ -4,7 +4,7 @@ repository: https://github.com/flutter/plugins/tree/master/packages/webview_flut issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+webview_flutter%22 # NOTE: We strongly prefer non-breaking changes, even at the expense of a # less-clean API. See https://flutter.dev/go/platform-interface-breaking-changes -version: 1.0.1 +version: 1.1.0 environment: sdk: ">=2.12.0 <3.0.0" From d1577608988e27ede691a85d574f388dc44e1b4a Mon Sep 17 00:00:00 2001 From: Nick Bradshaw Date: Fri, 1 Oct 2021 08:09:19 -0700 Subject: [PATCH 43/72] Updating versioning to better reflect semver standards --- packages/webview_flutter/webview_flutter/CHANGELOG.md | 2 +- packages/webview_flutter/webview_flutter/pubspec.yaml | 2 +- packages/webview_flutter/webview_flutter_android/CHANGELOG.md | 2 +- packages/webview_flutter/webview_flutter_android/pubspec.yaml | 2 +- packages/webview_flutter/webview_flutter_wkwebview/CHANGELOG.md | 2 +- packages/webview_flutter/webview_flutter_wkwebview/pubspec.yaml | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/webview_flutter/webview_flutter/CHANGELOG.md b/packages/webview_flutter/webview_flutter/CHANGELOG.md index 92a41a84f50e..71f7ce82e891 100644 --- a/packages/webview_flutter/webview_flutter/CHANGELOG.md +++ b/packages/webview_flutter/webview_flutter/CHANGELOG.md @@ -1,4 +1,4 @@ -## 2.1.2 +## 2.2.0 * Add ability to enable/disable zoom functionality ## 2.1.1 diff --git a/packages/webview_flutter/webview_flutter/pubspec.yaml b/packages/webview_flutter/webview_flutter/pubspec.yaml index da72ceb03d32..45b25de94815 100644 --- a/packages/webview_flutter/webview_flutter/pubspec.yaml +++ b/packages/webview_flutter/webview_flutter/pubspec.yaml @@ -2,7 +2,7 @@ name: webview_flutter description: A Flutter plugin that provides a WebView widget on Android and iOS. repository: https://github.com/flutter/plugins/tree/master/packages/webview_flutter/webview_flutter issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+webview%22 -version: 2.1.2 +version: 2.2.0 environment: sdk: ">=2.14.0 <3.0.0" diff --git a/packages/webview_flutter/webview_flutter_android/CHANGELOG.md b/packages/webview_flutter/webview_flutter_android/CHANGELOG.md index 54359d8f7ba6..a7e8b1504624 100644 --- a/packages/webview_flutter/webview_flutter_android/CHANGELOG.md +++ b/packages/webview_flutter/webview_flutter_android/CHANGELOG.md @@ -1,4 +1,4 @@ -## 2.0.16 +## 2.1.0 * Add `zoomEnabled` functionality. diff --git a/packages/webview_flutter/webview_flutter_android/pubspec.yaml b/packages/webview_flutter/webview_flutter_android/pubspec.yaml index 0278acb1c41f..0e53e97df4e7 100644 --- a/packages/webview_flutter/webview_flutter_android/pubspec.yaml +++ b/packages/webview_flutter/webview_flutter_android/pubspec.yaml @@ -2,7 +2,7 @@ name: webview_flutter_android description: A Flutter plugin that provides a WebView widget on Android. repository: https://github.com/flutter/plugins/tree/master/packages/webview_flutter/webview_flutter_android issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+webview%22 -version: 2.0.16 +version: 2.1.0 environment: sdk: ">=2.14.0 <3.0.0" diff --git a/packages/webview_flutter/webview_flutter_wkwebview/CHANGELOG.md b/packages/webview_flutter/webview_flutter_wkwebview/CHANGELOG.md index 163990fe4f2a..1f2ab0b2521b 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/CHANGELOG.md +++ b/packages/webview_flutter/webview_flutter_wkwebview/CHANGELOG.md @@ -1,4 +1,4 @@ -## 2.0.15 +## 2.1.0 * Add `zoomEnabled` functionality. diff --git a/packages/webview_flutter/webview_flutter_wkwebview/pubspec.yaml b/packages/webview_flutter/webview_flutter_wkwebview/pubspec.yaml index a41f82719bd6..b75e93834176 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/pubspec.yaml +++ b/packages/webview_flutter/webview_flutter_wkwebview/pubspec.yaml @@ -2,7 +2,7 @@ name: webview_flutter_wkwebview description: A Flutter plugin that provides a WebView widget based on Apple's WKWebView control. repository: https://github.com/flutter/plugins/tree/master/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.0.15 +version: 2.1.0 environment: sdk: ">=2.14.0 <3.0.0" From 6388d77481f0895e2f65b65eeed4c3f496e71914 Mon Sep 17 00:00:00 2001 From: Nick Bradshaw Date: Fri, 1 Oct 2021 11:51:05 -0700 Subject: [PATCH 44/72] Addressing PR feedback: * Simplifying and cleaning up how zoom is disabled on iOS * Formatting --- .../webview_flutter/CHANGELOG.md | 1 + .../ios/Classes/FLTWKNavigationDelegate.h | 6 +++++- .../ios/Classes/FLTWKNavigationDelegate.m | 10 +++++++++- .../ios/Classes/FlutterWebView.m | 20 +------------------ 4 files changed, 16 insertions(+), 21 deletions(-) diff --git a/packages/webview_flutter/webview_flutter/CHANGELOG.md b/packages/webview_flutter/webview_flutter/CHANGELOG.md index 71f7ce82e891..4003edc8e764 100644 --- a/packages/webview_flutter/webview_flutter/CHANGELOG.md +++ b/packages/webview_flutter/webview_flutter/CHANGELOG.md @@ -1,4 +1,5 @@ ## 2.2.0 + * Add ability to enable/disable zoom functionality ## 2.1.1 diff --git a/packages/webview_flutter/webview_flutter_wkwebview/ios/Classes/FLTWKNavigationDelegate.h b/packages/webview_flutter/webview_flutter_wkwebview/ios/Classes/FLTWKNavigationDelegate.h index 0244ccc8c934..6531931c4cf4 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/ios/Classes/FLTWKNavigationDelegate.h +++ b/packages/webview_flutter/webview_flutter_wkwebview/ios/Classes/FLTWKNavigationDelegate.h @@ -15,7 +15,11 @@ NS_ASSUME_NONNULL_BEGIN * Whether to delegate navigation decisions over the method channel. */ @property(nonatomic, assign) BOOL hasDartNavigationDelegate; -@property(nonatomic, copy) void (^didFinishLoad)(WKNavigation *navigation); + +/** + * Whether to allow zoom functionality on the WebView. + */ +@property(nonatomic, assign) BOOL shouldEnableZoom; @end diff --git a/packages/webview_flutter/webview_flutter_wkwebview/ios/Classes/FLTWKNavigationDelegate.m b/packages/webview_flutter/webview_flutter_wkwebview/ios/Classes/FLTWKNavigationDelegate.m index d21506d9243b..b54e0079b8d9 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/ios/Classes/FLTWKNavigationDelegate.m +++ b/packages/webview_flutter/webview_flutter_wkwebview/ios/Classes/FLTWKNavigationDelegate.m @@ -63,7 +63,15 @@ - (void)webView:(WKWebView *)webView } - (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation { - self.didFinishLoad(navigation); + if(!self.shouldEnableZoom) { + NSString* source = + @"var meta = document.createElement('meta');meta.name = 'viewport';meta.content = " + @"'width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no';var head " + @"= document.getElementsByTagName('head')[0];head.appendChild(meta);"; + + [webView evaluateJavaScript:source completionHandler:nil]; + } + [_methodChannel invokeMethod:@"onPageFinished" arguments:@{@"url" : webView.URL.absoluteString}]; } diff --git a/packages/webview_flutter/webview_flutter_wkwebview/ios/Classes/FlutterWebView.m b/packages/webview_flutter/webview_flutter_wkwebview/ios/Classes/FlutterWebView.m index a2fa5e5a7fe9..7fd78ee302d0 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/ios/Classes/FlutterWebView.m +++ b/packages/webview_flutter/webview_flutter_wkwebview/ios/Classes/FlutterWebView.m @@ -350,7 +350,7 @@ - (NSString*)applySettings:(NSDictionary*)settings { [self updateUserAgent:[userAgent isEqual:[NSNull null]] ? nil : userAgent]; } else if ([key isEqualToString:@"zoomEnabled"]) { NSNumber* zoomEnabled = settings[key]; - [self updateZoomEnabled:zoomEnabled]; + _navigationDelegate.shouldEnableZoom = [zoomEnabled boolValue]; } else { [unknownKeys addObject:key]; } @@ -478,24 +478,6 @@ - (void)updateUserAgent:(NSString*)userAgent { } } -- (void)updateZoomEnabled:(NSNumber*)zoomEnabled { - BOOL enabled = [zoomEnabled boolValue]; - __typeof__(self) __strong wSelf = self; - if (!enabled) { - _navigationDelegate.didFinishLoad = ^(WKNavigation* view) { - NSString* source = - @"var meta = document.createElement('meta');meta.name = 'viewport';meta.content = " - @"'width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no';var head " - @"= document.getElementsByTagName('head')[0];head.appendChild(meta);"; - - [wSelf->_webView evaluateJavaScript:source completionHandler:nil]; - }; - } else { - _navigationDelegate.didFinishLoad = ^(WKNavigation* view) { - }; - } -} - #pragma mark WKUIDelegate - (WKWebView*)webView:(WKWebView*)webView From 6c046eb65b03506756f003567d6238e3e1f156a3 Mon Sep 17 00:00:00 2001 From: Nick Bradshaw Date: Fri, 1 Oct 2021 12:01:00 -0700 Subject: [PATCH 45/72] Formatting JS string to read better --- .../ios/Classes/FLTWKNavigationDelegate.m | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/packages/webview_flutter/webview_flutter_wkwebview/ios/Classes/FLTWKNavigationDelegate.m b/packages/webview_flutter/webview_flutter_wkwebview/ios/Classes/FLTWKNavigationDelegate.m index b54e0079b8d9..54836ede63e4 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/ios/Classes/FLTWKNavigationDelegate.m +++ b/packages/webview_flutter/webview_flutter_wkwebview/ios/Classes/FLTWKNavigationDelegate.m @@ -65,9 +65,12 @@ - (void)webView:(WKWebView *)webView - (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation { if(!self.shouldEnableZoom) { NSString* source = - @"var meta = document.createElement('meta');meta.name = 'viewport';meta.content = " - @"'width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no';var head " - @"= document.getElementsByTagName('head')[0];head.appendChild(meta);"; + @"var meta = document.createElement('meta');" + @"meta.name = 'viewport';" + @"meta.content = 'width=device-width, initial-scale=1.0, maximum-scale=1.0," + @"user-scalable=no';" + @"'width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no';" + @"var head = document.getElementsByTagName('head')[0];head.appendChild(meta);"; [webView evaluateJavaScript:source completionHandler:nil]; } From 505e912ffe4974930560d4c687c7085bc68b0428 Mon Sep 17 00:00:00 2001 From: Nick Bradshaw Date: Fri, 1 Oct 2021 12:22:58 -0700 Subject: [PATCH 46/72] Update naming to reflect enabling instead of setting --- .../io/flutter/plugins/webviewflutter/FlutterWebView.java | 6 +++--- .../io/flutter/plugins/webviewflutter/WebViewBuilder.java | 2 +- .../flutter/plugins/webviewflutter/FlutterWebViewTest.java | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/FlutterWebView.java b/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/FlutterWebView.java index 5bbdc4cd078b..10e00ca74b47 100644 --- a/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/FlutterWebView.java +++ b/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/FlutterWebView.java @@ -179,7 +179,7 @@ static WebView createWebView( .setWebChromeClient( webChromeClient) // Always use {@link FlutterWebChromeClient} as web Chrome client. .setDownloadListener(downloadListener) - .setBuiltInZoomControls(true) //Always use built-in zoom mechanisms. + .enableBuiltInZoomControls(true) //Always use built-in zoom mechanisms. .setLoadWithOverviewMode(true) //Always zooms out the content to fit on screen by width. .setUseWideViewPort(true) //Always support using a wide viewport .setDisplayZoomControls(false); //Never display on-screen zoom controls. @@ -436,7 +436,7 @@ private void applySettings(Map settings) { // no-op inline media playback is always allowed on Android. break; case "zoomEnabled": - zoomEnabled((boolean) settings.get(key)); + setZoomEnabled((boolean) settings.get(key)); break; default: throw new IllegalArgumentException("Unknown WebView setting: " + key); @@ -477,7 +477,7 @@ private void updateUserAgent(String userAgent) { webView.getSettings().setUserAgentString(userAgent); } - private void zoomEnabled(boolean shouldEnable) { + private void setZoomEnabled(boolean shouldEnable) { webView.getSettings().setSupportZoom(shouldEnable); } diff --git a/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/WebViewBuilder.java b/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/WebViewBuilder.java index ecb3e42f7e3d..83bc86a2f573 100644 --- a/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/WebViewBuilder.java +++ b/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/WebViewBuilder.java @@ -147,7 +147,7 @@ public WebViewBuilder setDownloadListener(@Nullable DownloadListener downloadLis * @param flag {@code true} if built in zoom controls are allowed. * @return This builder. This value cannot be {@code null}. */ - public WebViewBuilder setBuiltInZoomControls(boolean flag) { + public WebViewBuilder enableBuiltInZoomControls(boolean flag) { this.builtInZoomControls = flag; return this; } diff --git a/packages/webview_flutter/webview_flutter_android/android/src/test/java/io/flutter/plugins/webviewflutter/FlutterWebViewTest.java b/packages/webview_flutter/webview_flutter_android/android/src/test/java/io/flutter/plugins/webviewflutter/FlutterWebViewTest.java index 4bee64d79de5..1c349cbd3cce 100644 --- a/packages/webview_flutter/webview_flutter_android/android/src/test/java/io/flutter/plugins/webviewflutter/FlutterWebViewTest.java +++ b/packages/webview_flutter/webview_flutter_android/android/src/test/java/io/flutter/plugins/webviewflutter/FlutterWebViewTest.java @@ -39,7 +39,7 @@ public void before() { when(mockWebViewBuilder.setUsesHybridComposition(anyBoolean())).thenReturn(mockWebViewBuilder); when(mockWebViewBuilder.setLoadWithOverviewMode(anyBoolean())).thenReturn(mockWebViewBuilder); when(mockWebViewBuilder.setUseWideViewPort(anyBoolean())).thenReturn(mockWebViewBuilder); - when(mockWebViewBuilder.setBuiltInZoomControls(anyBoolean())).thenReturn(mockWebViewBuilder); + when(mockWebViewBuilder.enableBuiltInZoomControls(anyBoolean())).thenReturn(mockWebViewBuilder); when(mockWebViewBuilder.setDisplayZoomControls(anyBoolean())).thenReturn(mockWebViewBuilder); when(mockWebViewBuilder.setWebChromeClient(any(WebChromeClient.class))) .thenReturn(mockWebViewBuilder); @@ -61,7 +61,7 @@ public void createWebView_should_create_webview_with_default_configuration() { verify(mockWebViewBuilder, times(1)).setWebChromeClient(mockWebChromeClient); verify(mockWebViewBuilder, times(1)).setLoadWithOverviewMode(true); verify(mockWebViewBuilder, times(1)).setUseWideViewPort(true); - verify(mockWebViewBuilder, times(1)).setBuiltInZoomControls(true); + verify(mockWebViewBuilder, times(1)).enableBuiltInZoomControls(true); verify(mockWebViewBuilder, times(1)).setDisplayZoomControls(false); } From 7b65cc6290dafda86291d047e370998345586c46 Mon Sep 17 00:00:00 2001 From: Nick Bradshaw Date: Fri, 1 Oct 2021 12:27:59 -0700 Subject: [PATCH 47/72] Adding name to AUTHORS files --- packages/webview_flutter/webview_flutter_android/AUTHORS | 1 + packages/webview_flutter/webview_flutter_wkwebview/AUTHORS | 1 + 2 files changed, 2 insertions(+) diff --git a/packages/webview_flutter/webview_flutter_android/AUTHORS b/packages/webview_flutter/webview_flutter_android/AUTHORS index 4461b602a13b..22e2b0ef78fc 100644 --- a/packages/webview_flutter/webview_flutter_android/AUTHORS +++ b/packages/webview_flutter/webview_flutter_android/AUTHORS @@ -65,4 +65,5 @@ Anton Borries Alex Li Rahul Raj <64.rahulraj@gmail.com> Maurits van Beusekom +Nick Bradshaw diff --git a/packages/webview_flutter/webview_flutter_wkwebview/AUTHORS b/packages/webview_flutter/webview_flutter_wkwebview/AUTHORS index 78f9e5ad9f6b..9c7a4c867552 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/AUTHORS +++ b/packages/webview_flutter/webview_flutter_wkwebview/AUTHORS @@ -65,3 +65,4 @@ Anton Borries Alex Li Rahul Raj <64.rahulraj@gmail.com> Maurits van Beusekom +Nick Bradshaw From bd0b7b25c6f6b79af4db20a6d2159a524057fd17 Mon Sep 17 00:00:00 2001 From: Nick Bradshaw Date: Fri, 1 Oct 2021 14:38:04 -0700 Subject: [PATCH 48/72] Removing setters for params that should always have default values --- .../webviewflutter/FlutterWebView.java | 5 +-- .../webviewflutter/WebViewBuilder.java | 42 ++----------------- .../webviewflutter/FlutterWebViewTest.java | 6 --- 3 files changed, 4 insertions(+), 49 deletions(-) diff --git a/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/FlutterWebView.java b/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/FlutterWebView.java index 10e00ca74b47..535c0edf463c 100644 --- a/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/FlutterWebView.java +++ b/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/FlutterWebView.java @@ -179,10 +179,7 @@ static WebView createWebView( .setWebChromeClient( webChromeClient) // Always use {@link FlutterWebChromeClient} as web Chrome client. .setDownloadListener(downloadListener) - .enableBuiltInZoomControls(true) //Always use built-in zoom mechanisms. - .setLoadWithOverviewMode(true) //Always zooms out the content to fit on screen by width. - .setUseWideViewPort(true) //Always support using a wide viewport - .setDisplayZoomControls(false); //Never display on-screen zoom controls. + .enableBuiltInZoomControls(true); //Always use built-in zoom mechanisms. return webViewBuilder.build(); } diff --git a/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/WebViewBuilder.java b/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/WebViewBuilder.java index 83bc86a2f573..5f297398944b 100644 --- a/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/WebViewBuilder.java +++ b/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/WebViewBuilder.java @@ -152,42 +152,6 @@ public WebViewBuilder enableBuiltInZoomControls(boolean flag) { return this; } - /** - * Sets whether the {@link WebView} loads pages zoomed out so the content will fit on screen by - * width The default value is {@code true}. - * - * @param flag {@code true} if should allow pages to load in overview mode. - * @return This builder. This value cannot be {@code null}. - */ - public WebViewBuilder setLoadWithOverviewMode(boolean flag) { - this.loadWithOverviewMode = flag; - return this; - } - - /** - * Sets whether the {@link WebView} should enable support for the "viewport" HTML meta tag or - * should use a wide viewport. The default value is {@code true}. - * - * @param flag {@code true} if should use wide viewport. - * @return This builder. This value cannot be {@code null}. - */ - public WebViewBuilder setUseWideViewPort(boolean flag) { - this.useWideViewPort = flag; - return this; - } - - /** - * Sets whether the {@link WebView} should display on-screen zoom controls when using the built-in - * zoom mechanisms. The default value is {@code false} as on-screen zoom controls are deprecated - * - * @param flag {@code true} if should display zoom controls - * @return This builder. This value cannot be {@code null}. - */ - public WebViewBuilder setDisplayZoomControls(boolean flag) { - this.displayZoomControls = flag; - return this; - } - /** * Build the {@link android.webkit.WebView} using the current settings. * @@ -200,10 +164,10 @@ public WebView build() { webSettings.setDomStorageEnabled(enableDomStorage); webSettings.setJavaScriptCanOpenWindowsAutomatically(javaScriptCanOpenWindowsAutomatically); webSettings.setSupportMultipleWindows(supportMultipleWindows); - webSettings.setLoadWithOverviewMode(loadWithOverviewMode); - webSettings.setUseWideViewPort(useWideViewPort); + webSettings.setLoadWithOverviewMode(true); + webSettings.setUseWideViewPort(true); + webSettings.setDisplayZoomControls(false); webSettings.setBuiltInZoomControls(builtInZoomControls); - webSettings.setDisplayZoomControls(displayZoomControls); webView.setWebChromeClient(webChromeClient); webView.setDownloadListener(downloadListener); return webView; diff --git a/packages/webview_flutter/webview_flutter_android/android/src/test/java/io/flutter/plugins/webviewflutter/FlutterWebViewTest.java b/packages/webview_flutter/webview_flutter_android/android/src/test/java/io/flutter/plugins/webviewflutter/FlutterWebViewTest.java index 1c349cbd3cce..d14b75ad2395 100644 --- a/packages/webview_flutter/webview_flutter_android/android/src/test/java/io/flutter/plugins/webviewflutter/FlutterWebViewTest.java +++ b/packages/webview_flutter/webview_flutter_android/android/src/test/java/io/flutter/plugins/webviewflutter/FlutterWebViewTest.java @@ -37,10 +37,7 @@ public void before() { .thenReturn(mockWebViewBuilder); when(mockWebViewBuilder.setSupportMultipleWindows(anyBoolean())).thenReturn(mockWebViewBuilder); when(mockWebViewBuilder.setUsesHybridComposition(anyBoolean())).thenReturn(mockWebViewBuilder); - when(mockWebViewBuilder.setLoadWithOverviewMode(anyBoolean())).thenReturn(mockWebViewBuilder); - when(mockWebViewBuilder.setUseWideViewPort(anyBoolean())).thenReturn(mockWebViewBuilder); when(mockWebViewBuilder.enableBuiltInZoomControls(anyBoolean())).thenReturn(mockWebViewBuilder); - when(mockWebViewBuilder.setDisplayZoomControls(anyBoolean())).thenReturn(mockWebViewBuilder); when(mockWebViewBuilder.setWebChromeClient(any(WebChromeClient.class))) .thenReturn(mockWebViewBuilder); when(mockWebViewBuilder.setDownloadListener(any(DownloadListener.class))) @@ -59,10 +56,7 @@ public void createWebView_should_create_webview_with_default_configuration() { verify(mockWebViewBuilder, times(1)).setSupportMultipleWindows(true); verify(mockWebViewBuilder, times(1)).setUsesHybridComposition(false); verify(mockWebViewBuilder, times(1)).setWebChromeClient(mockWebChromeClient); - verify(mockWebViewBuilder, times(1)).setLoadWithOverviewMode(true); - verify(mockWebViewBuilder, times(1)).setUseWideViewPort(true); verify(mockWebViewBuilder, times(1)).enableBuiltInZoomControls(true); - verify(mockWebViewBuilder, times(1)).setDisplayZoomControls(false); } private Map createParameterMap(boolean usesHybridComposition) { From 8a6662d119a7477b0df90d1f6096dfda5473e347 Mon Sep 17 00:00:00 2001 From: Nick Bradshaw Date: Fri, 1 Oct 2021 15:26:11 -0700 Subject: [PATCH 49/72] Updating formatting --- .../ios/Classes/FLTWKNavigationDelegate.m | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/packages/webview_flutter/webview_flutter_wkwebview/ios/Classes/FLTWKNavigationDelegate.m b/packages/webview_flutter/webview_flutter_wkwebview/ios/Classes/FLTWKNavigationDelegate.m index 54836ede63e4..76a13eb0aa1c 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/ios/Classes/FLTWKNavigationDelegate.m +++ b/packages/webview_flutter/webview_flutter_wkwebview/ios/Classes/FLTWKNavigationDelegate.m @@ -63,16 +63,16 @@ - (void)webView:(WKWebView *)webView } - (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation { - if(!self.shouldEnableZoom) { - NSString* source = - @"var meta = document.createElement('meta');" - @"meta.name = 'viewport';" - @"meta.content = 'width=device-width, initial-scale=1.0, maximum-scale=1.0," - @"user-scalable=no';" - @"'width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no';" - @"var head = document.getElementsByTagName('head')[0];head.appendChild(meta);"; - - [webView evaluateJavaScript:source completionHandler:nil]; + if (!self.shouldEnableZoom) { + NSString* source = + @"var meta = document.createElement('meta');" + @"meta.name = 'viewport';" + @"meta.content = 'width=device-width, initial-scale=1.0, maximum-scale=1.0," + @"user-scalable=no';" + @"'width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no';" + @"var head = document.getElementsByTagName('head')[0];head.appendChild(meta);"; + + [webView evaluateJavaScript:source completionHandler:nil]; } [_methodChannel invokeMethod:@"onPageFinished" arguments:@{@"url" : webView.URL.absoluteString}]; From 3cefa7a6e2cdd928416fde3440823e61c229e399 Mon Sep 17 00:00:00 2001 From: Nick Bradshaw Date: Fri, 1 Oct 2021 16:20:43 -0700 Subject: [PATCH 50/72] One more small formatting change --- .../ios/Classes/FLTWKNavigationDelegate.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/webview_flutter/webview_flutter_wkwebview/ios/Classes/FLTWKNavigationDelegate.m b/packages/webview_flutter/webview_flutter_wkwebview/ios/Classes/FLTWKNavigationDelegate.m index 76a13eb0aa1c..cef75eedb808 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/ios/Classes/FLTWKNavigationDelegate.m +++ b/packages/webview_flutter/webview_flutter_wkwebview/ios/Classes/FLTWKNavigationDelegate.m @@ -64,7 +64,7 @@ - (void)webView:(WKWebView *)webView - (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation { if (!self.shouldEnableZoom) { - NSString* source = + NSString *source = @"var meta = document.createElement('meta');" @"meta.name = 'viewport';" @"meta.content = 'width=device-width, initial-scale=1.0, maximum-scale=1.0," From 439e13b83cc53a7557c9eea0ca2f785ea3a98037 Mon Sep 17 00:00:00 2001 From: Nick Bradshaw Date: Mon, 4 Oct 2021 12:16:44 -0700 Subject: [PATCH 51/72] Removing duplicated string --- .../ios/Classes/FLTWKNavigationDelegate.m | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/webview_flutter/webview_flutter_wkwebview/ios/Classes/FLTWKNavigationDelegate.m b/packages/webview_flutter/webview_flutter_wkwebview/ios/Classes/FLTWKNavigationDelegate.m index cef75eedb808..125d3cabdcf1 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/ios/Classes/FLTWKNavigationDelegate.m +++ b/packages/webview_flutter/webview_flutter_wkwebview/ios/Classes/FLTWKNavigationDelegate.m @@ -69,7 +69,6 @@ - (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigat @"meta.name = 'viewport';" @"meta.content = 'width=device-width, initial-scale=1.0, maximum-scale=1.0," @"user-scalable=no';" - @"'width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no';" @"var head = document.getElementsByTagName('head')[0];head.appendChild(meta);"; [webView evaluateJavaScript:source completionHandler:nil]; From f13a0dd349155634b86473157ec54251d3fa8032 Mon Sep 17 00:00:00 2001 From: Nick Bradshaw Date: Mon, 4 Oct 2021 17:11:24 -0700 Subject: [PATCH 52/72] Removing unneeded null checks for non-nullable bool --- packages/webview_flutter/webview_flutter/lib/src/webview.dart | 1 - .../webview_flutter_android/example/lib/web_view.dart | 1 - .../webview_flutter_wkwebview/example/lib/web_view.dart | 1 - 3 files changed, 3 deletions(-) diff --git a/packages/webview_flutter/webview_flutter/lib/src/webview.dart b/packages/webview_flutter/webview_flutter/lib/src/webview.dart index b768ba2e1bc0..735e489e71b4 100644 --- a/packages/webview_flutter/webview_flutter/lib/src/webview.dart +++ b/packages/webview_flutter/webview_flutter/lib/src/webview.dart @@ -95,7 +95,6 @@ class WebView extends StatefulWidget { AutoMediaPlaybackPolicy.require_user_action_for_all_media_types, this.allowsInlineMediaPlayback = false, }) : assert(javascriptMode != null), - assert(zoomEnabled != null), assert(initialMediaPlaybackPolicy != null), assert(allowsInlineMediaPlayback != null), super(key: key); diff --git a/packages/webview_flutter/webview_flutter_android/example/lib/web_view.dart b/packages/webview_flutter/webview_flutter_android/example/lib/web_view.dart index 05f93e091f36..6b98944b55bd 100644 --- a/packages/webview_flutter/webview_flutter_android/example/lib/web_view.dart +++ b/packages/webview_flutter/webview_flutter_android/example/lib/web_view.dart @@ -77,7 +77,6 @@ class WebView extends StatefulWidget { AutoMediaPlaybackPolicy.require_user_action_for_all_media_types, this.allowsInlineMediaPlayback = false, }) : assert(javascriptMode != null), - assert(zoomEnabled != null), assert(initialMediaPlaybackPolicy != null), assert(allowsInlineMediaPlayback != null), super(key: key); diff --git a/packages/webview_flutter/webview_flutter_wkwebview/example/lib/web_view.dart b/packages/webview_flutter/webview_flutter_wkwebview/example/lib/web_view.dart index e86323094cce..b0765a7cbd96 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/example/lib/web_view.dart +++ b/packages/webview_flutter/webview_flutter_wkwebview/example/lib/web_view.dart @@ -70,7 +70,6 @@ class WebView extends StatefulWidget { AutoMediaPlaybackPolicy.require_user_action_for_all_media_types, this.allowsInlineMediaPlayback = false, }) : assert(javascriptMode != null), - assert(zoomEnabled != null), assert(initialMediaPlaybackPolicy != null), assert(allowsInlineMediaPlayback != null), super(key: key); From 004312bbb86b24877e247784695bab7d79c9f62c Mon Sep 17 00:00:00 2001 From: Nick Bradshaw Date: Tue, 5 Oct 2021 11:32:02 -0700 Subject: [PATCH 53/72] Updating some documentation/naming and removing unused java variables --- .../webview_flutter/lib/src/webview.dart | 2 +- .../plugins/webviewflutter/FlutterWebView.java | 2 +- .../plugins/webviewflutter/WebViewBuilder.java | 11 ++++------- .../plugins/webviewflutter/FlutterWebViewTest.java | 4 ++-- .../webview_flutter_android/example/lib/web_view.dart | 2 +- .../lib/src/types/web_settings.dart | 2 +- .../example/lib/web_view.dart | 2 +- 7 files changed, 11 insertions(+), 14 deletions(-) diff --git a/packages/webview_flutter/webview_flutter/lib/src/webview.dart b/packages/webview_flutter/webview_flutter/lib/src/webview.dart index 735e489e71b4..b8f1cee23ac9 100644 --- a/packages/webview_flutter/webview_flutter/lib/src/webview.dart +++ b/packages/webview_flutter/webview_flutter/lib/src/webview.dart @@ -269,7 +269,7 @@ class WebView extends StatefulWidget { /// By default `userAgent` is null. final String? userAgent; - /// Sets whether the WebView should support zooming using its on-screen zoom controls and gestures. + /// A Boolean value indicating whether the WebView should support zooming using its on-screen zoom controls and gestures. /// /// By default 'zoomEnabled' is true final bool zoomEnabled; diff --git a/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/FlutterWebView.java b/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/FlutterWebView.java index 535c0edf463c..c0ea3d3b2e7c 100644 --- a/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/FlutterWebView.java +++ b/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/FlutterWebView.java @@ -179,7 +179,7 @@ static WebView createWebView( .setWebChromeClient( webChromeClient) // Always use {@link FlutterWebChromeClient} as web Chrome client. .setDownloadListener(downloadListener) - .enableBuiltInZoomControls(true); //Always use built-in zoom mechanisms. + .setZoomControlsEnabled(true); //Always use built-in zoom mechanisms. return webViewBuilder.build(); } diff --git a/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/WebViewBuilder.java b/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/WebViewBuilder.java index 5f297398944b..e0d5e8815f31 100644 --- a/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/WebViewBuilder.java +++ b/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/WebViewBuilder.java @@ -46,10 +46,7 @@ static WebView create(Context context, boolean usesHybridComposition, View conta private boolean usesHybridComposition; private WebChromeClient webChromeClient; private DownloadListener downloadListener; - private boolean builtInZoomControls; - private boolean loadWithOverviewMode; - private boolean useWideViewPort; - private boolean displayZoomControls; + private boolean enableBuiltInZoomControls; /** * Constructs a new {@link WebViewBuilder} object with a custom implementation of the {@link @@ -147,8 +144,8 @@ public WebViewBuilder setDownloadListener(@Nullable DownloadListener downloadLis * @param flag {@code true} if built in zoom controls are allowed. * @return This builder. This value cannot be {@code null}. */ - public WebViewBuilder enableBuiltInZoomControls(boolean flag) { - this.builtInZoomControls = flag; + public WebViewBuilder setZoomControlsEnabled(boolean flag) { + this.enableBuiltInZoomControls = flag; return this; } @@ -167,7 +164,7 @@ public WebView build() { webSettings.setLoadWithOverviewMode(true); webSettings.setUseWideViewPort(true); webSettings.setDisplayZoomControls(false); - webSettings.setBuiltInZoomControls(builtInZoomControls); + webSettings.setBuiltInZoomControls(enableBuiltInZoomControls); webView.setWebChromeClient(webChromeClient); webView.setDownloadListener(downloadListener); return webView; diff --git a/packages/webview_flutter/webview_flutter_android/android/src/test/java/io/flutter/plugins/webviewflutter/FlutterWebViewTest.java b/packages/webview_flutter/webview_flutter_android/android/src/test/java/io/flutter/plugins/webviewflutter/FlutterWebViewTest.java index d14b75ad2395..fd79bccabbce 100644 --- a/packages/webview_flutter/webview_flutter_android/android/src/test/java/io/flutter/plugins/webviewflutter/FlutterWebViewTest.java +++ b/packages/webview_flutter/webview_flutter_android/android/src/test/java/io/flutter/plugins/webviewflutter/FlutterWebViewTest.java @@ -37,7 +37,7 @@ public void before() { .thenReturn(mockWebViewBuilder); when(mockWebViewBuilder.setSupportMultipleWindows(anyBoolean())).thenReturn(mockWebViewBuilder); when(mockWebViewBuilder.setUsesHybridComposition(anyBoolean())).thenReturn(mockWebViewBuilder); - when(mockWebViewBuilder.enableBuiltInZoomControls(anyBoolean())).thenReturn(mockWebViewBuilder); + when(mockWebViewBuilder.setZoomControlsEnabled(anyBoolean())).thenReturn(mockWebViewBuilder); when(mockWebViewBuilder.setWebChromeClient(any(WebChromeClient.class))) .thenReturn(mockWebViewBuilder); when(mockWebViewBuilder.setDownloadListener(any(DownloadListener.class))) @@ -56,7 +56,7 @@ public void createWebView_should_create_webview_with_default_configuration() { verify(mockWebViewBuilder, times(1)).setSupportMultipleWindows(true); verify(mockWebViewBuilder, times(1)).setUsesHybridComposition(false); verify(mockWebViewBuilder, times(1)).setWebChromeClient(mockWebChromeClient); - verify(mockWebViewBuilder, times(1)).enableBuiltInZoomControls(true); + verify(mockWebViewBuilder, times(1)).setZoomControlsEnabled(true); } private Map createParameterMap(boolean usesHybridComposition) { diff --git a/packages/webview_flutter/webview_flutter_android/example/lib/web_view.dart b/packages/webview_flutter/webview_flutter_android/example/lib/web_view.dart index 6b98944b55bd..05c86383adf3 100644 --- a/packages/webview_flutter/webview_flutter_android/example/lib/web_view.dart +++ b/packages/webview_flutter/webview_flutter_android/example/lib/web_view.dart @@ -222,7 +222,7 @@ class WebView extends StatefulWidget { /// By default `gestureNavigationEnabled` is false. final bool gestureNavigationEnabled; - /// Sets whether the WebView should support zooming using its on-screen zoom controls and gestures. + /// A Boolean value indicating whether the WebView should support zooming using its on-screen zoom controls and gestures. /// /// By default 'zoomEnabled' is true final bool zoomEnabled; diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/types/web_settings.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/types/web_settings.dart index 3d94153c886e..dd3b0982ceda 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/types/web_settings.dart +++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/types/web_settings.dart @@ -112,7 +112,7 @@ class WebSettings { /// See also [WebView.userAgent]. final WebSetting userAgent; - /// Sets whether the WebView should support zooming using its on-screen zoom controls and gestures. + /// Whether the WebView should support zooming using its on-screen zoom controls and gestures. final bool? zoomEnabled; /// Whether to allow swipe based navigation in iOS. diff --git a/packages/webview_flutter/webview_flutter_wkwebview/example/lib/web_view.dart b/packages/webview_flutter/webview_flutter_wkwebview/example/lib/web_view.dart index b0765a7cbd96..d57499dcef50 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/example/lib/web_view.dart +++ b/packages/webview_flutter/webview_flutter_wkwebview/example/lib/web_view.dart @@ -214,7 +214,7 @@ class WebView extends StatefulWidget { /// By default `userAgent` is null. final String? userAgent; - /// Sets whether the WebView should support zooming using its on-screen zoom controls and gestures. + /// A Boolean value indicating whether the WebView should support zooming using its on-screen zoom controls and gestures. /// /// By default 'zoomEnabled' is true final bool zoomEnabled; From 5c728154e49a48528a8e3b4db11c2047914e27b2 Mon Sep 17 00:00:00 2001 From: Nick Bradshaw Date: Tue, 5 Oct 2021 11:41:07 -0700 Subject: [PATCH 54/72] Updating android AUTHORS/CHANGELOG/pubspec.yaml --- packages/webview_flutter/webview_flutter_android/AUTHORS | 1 + packages/webview_flutter/webview_flutter_android/CHANGELOG.md | 4 ++++ packages/webview_flutter/webview_flutter_android/pubspec.yaml | 2 +- 3 files changed, 6 insertions(+), 1 deletion(-) diff --git a/packages/webview_flutter/webview_flutter_android/AUTHORS b/packages/webview_flutter/webview_flutter_android/AUTHORS index 4461b602a13b..22e2b0ef78fc 100644 --- a/packages/webview_flutter/webview_flutter_android/AUTHORS +++ b/packages/webview_flutter/webview_flutter_android/AUTHORS @@ -65,4 +65,5 @@ Anton Borries Alex Li Rahul Raj <64.rahulraj@gmail.com> Maurits van Beusekom +Nick Bradshaw diff --git a/packages/webview_flutter/webview_flutter_android/CHANGELOG.md b/packages/webview_flutter/webview_flutter_android/CHANGELOG.md index d4827a71e47d..c0837263509d 100644 --- a/packages/webview_flutter/webview_flutter_android/CHANGELOG.md +++ b/packages/webview_flutter/webview_flutter_android/CHANGELOG.md @@ -1,3 +1,7 @@ +## 2.1.0 + +* Add `zoomEnabled` functionality. + ## 2.0.15 * Added Overrides in FlutterWebView.java diff --git a/packages/webview_flutter/webview_flutter_android/pubspec.yaml b/packages/webview_flutter/webview_flutter_android/pubspec.yaml index 36f186087c08..57d39260011f 100644 --- a/packages/webview_flutter/webview_flutter_android/pubspec.yaml +++ b/packages/webview_flutter/webview_flutter_android/pubspec.yaml @@ -2,7 +2,7 @@ name: webview_flutter_android description: A Flutter plugin that provides a WebView widget on Android. repository: https://github.com/flutter/plugins/tree/master/packages/webview_flutter/webview_flutter_android issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+webview%22 -version: 2.0.15 +version: 2.1.0 environment: sdk: ">=2.14.0 <3.0.0" From 1172d73370d7fceb24969c18236c78d8fe89c916 Mon Sep 17 00:00:00 2001 From: Nick Bradshaw Date: Tue, 5 Oct 2021 11:45:50 -0700 Subject: [PATCH 55/72] Adding Java implementation for zoomEnabled --- .../plugins/webviewflutter/FlutterWebView.java | 14 +++++++++++--- .../plugins/webviewflutter/WebViewBuilder.java | 17 +++++++++++++++++ .../webviewflutter/FlutterWebViewTest.java | 2 ++ 3 files changed, 30 insertions(+), 3 deletions(-) diff --git a/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/FlutterWebView.java b/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/FlutterWebView.java index ff573c771960..198e759c121a 100644 --- a/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/FlutterWebView.java +++ b/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/FlutterWebView.java @@ -176,9 +176,10 @@ static WebView createWebView( .setJavaScriptCanOpenWindowsAutomatically( true) // Always allow automatically opening of windows. .setSupportMultipleWindows(true) // Always support multiple windows. - .setWebChromeClient(webChromeClient) - .setDownloadListener( - downloadListener); // Always use {@link FlutterWebChromeClient} as web Chrome client. + .setWebChromeClient( + webChromeClient) // Always use {@link FlutterWebChromeClient} as web Chrome client. + .setDownloadListener(downloadListener) + .setZoomControlsEnabled(true); //Always use built-in zoom mechanisms. return webViewBuilder.build(); } @@ -428,6 +429,9 @@ private void applySettings(Map settings) { case "allowsInlineMediaPlayback": // no-op inline media playback is always allowed on Android. break; + case "zoomEnabled": + setZoomEnabled((boolean) settings.get(key)); + break; default: throw new IllegalArgumentException("Unknown WebView setting: " + key); } @@ -467,6 +471,10 @@ private void updateUserAgent(String userAgent) { webView.getSettings().setUserAgentString(userAgent); } + private void setZoomEnabled(boolean shouldEnable) { + webView.getSettings().setSupportZoom(shouldEnable); + } + @Override public void dispose() { methodChannel.setMethodCallHandler(null); diff --git a/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/WebViewBuilder.java b/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/WebViewBuilder.java index d3cd1d57cdae..e0d5e8815f31 100644 --- a/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/WebViewBuilder.java +++ b/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/WebViewBuilder.java @@ -46,6 +46,7 @@ static WebView create(Context context, boolean usesHybridComposition, View conta private boolean usesHybridComposition; private WebChromeClient webChromeClient; private DownloadListener downloadListener; + private boolean enableBuiltInZoomControls; /** * Constructs a new {@link WebViewBuilder} object with a custom implementation of the {@link @@ -136,6 +137,18 @@ public WebViewBuilder setDownloadListener(@Nullable DownloadListener downloadLis return this; } + /** + * Sets whether the {@link WebView} should use its built-in zoom mechanisms. The default value is + * {@code true}. + * + * @param flag {@code true} if built in zoom controls are allowed. + * @return This builder. This value cannot be {@code null}. + */ + public WebViewBuilder setZoomControlsEnabled(boolean flag) { + this.enableBuiltInZoomControls = flag; + return this; + } + /** * Build the {@link android.webkit.WebView} using the current settings. * @@ -148,6 +161,10 @@ public WebView build() { webSettings.setDomStorageEnabled(enableDomStorage); webSettings.setJavaScriptCanOpenWindowsAutomatically(javaScriptCanOpenWindowsAutomatically); webSettings.setSupportMultipleWindows(supportMultipleWindows); + webSettings.setLoadWithOverviewMode(true); + webSettings.setUseWideViewPort(true); + webSettings.setDisplayZoomControls(false); + webSettings.setBuiltInZoomControls(enableBuiltInZoomControls); webView.setWebChromeClient(webChromeClient); webView.setDownloadListener(downloadListener); return webView; diff --git a/packages/webview_flutter/webview_flutter_android/android/src/test/java/io/flutter/plugins/webviewflutter/FlutterWebViewTest.java b/packages/webview_flutter/webview_flutter_android/android/src/test/java/io/flutter/plugins/webviewflutter/FlutterWebViewTest.java index 56d9db1ee493..fd79bccabbce 100644 --- a/packages/webview_flutter/webview_flutter_android/android/src/test/java/io/flutter/plugins/webviewflutter/FlutterWebViewTest.java +++ b/packages/webview_flutter/webview_flutter_android/android/src/test/java/io/flutter/plugins/webviewflutter/FlutterWebViewTest.java @@ -37,6 +37,7 @@ public void before() { .thenReturn(mockWebViewBuilder); when(mockWebViewBuilder.setSupportMultipleWindows(anyBoolean())).thenReturn(mockWebViewBuilder); when(mockWebViewBuilder.setUsesHybridComposition(anyBoolean())).thenReturn(mockWebViewBuilder); + when(mockWebViewBuilder.setZoomControlsEnabled(anyBoolean())).thenReturn(mockWebViewBuilder); when(mockWebViewBuilder.setWebChromeClient(any(WebChromeClient.class))) .thenReturn(mockWebViewBuilder); when(mockWebViewBuilder.setDownloadListener(any(DownloadListener.class))) @@ -55,6 +56,7 @@ public void createWebView_should_create_webview_with_default_configuration() { verify(mockWebViewBuilder, times(1)).setSupportMultipleWindows(true); verify(mockWebViewBuilder, times(1)).setUsesHybridComposition(false); verify(mockWebViewBuilder, times(1)).setWebChromeClient(mockWebChromeClient); + verify(mockWebViewBuilder, times(1)).setZoomControlsEnabled(true); } private Map createParameterMap(boolean usesHybridComposition) { From d84d39f676e79cf0c4d702b0461525a54049744e Mon Sep 17 00:00:00 2001 From: Nick Bradshaw Date: Tue, 5 Oct 2021 11:47:49 -0700 Subject: [PATCH 56/72] Reverting changes to platform_interface made during follow-up platform PR --- .../lib/src/types/web_settings.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/types/web_settings.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/types/web_settings.dart index dd3b0982ceda..3d94153c886e 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/types/web_settings.dart +++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/types/web_settings.dart @@ -112,7 +112,7 @@ class WebSettings { /// See also [WebView.userAgent]. final WebSetting userAgent; - /// Whether the WebView should support zooming using its on-screen zoom controls and gestures. + /// Sets whether the WebView should support zooming using its on-screen zoom controls and gestures. final bool? zoomEnabled; /// Whether to allow swipe based navigation in iOS. From 68283a0eeb567e19de1a263da9f84132c57f76a0 Mon Sep 17 00:00:00 2001 From: Nick Bradshaw Date: Tue, 5 Oct 2021 11:53:22 -0700 Subject: [PATCH 57/72] Updating Android WebView with zoomEnabled param --- .../example/lib/web_view.dart | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/packages/webview_flutter/webview_flutter_android/example/lib/web_view.dart b/packages/webview_flutter/webview_flutter_android/example/lib/web_view.dart index 33773f96cad8..5e8a2798b8ca 100644 --- a/packages/webview_flutter/webview_flutter_android/example/lib/web_view.dart +++ b/packages/webview_flutter/webview_flutter_android/example/lib/web_view.dart @@ -72,6 +72,7 @@ class WebView extends StatefulWidget { this.debuggingEnabled = false, this.gestureNavigationEnabled = false, this.userAgent, + this.zoomEnabled = true, this.initialMediaPlaybackPolicy = AutoMediaPlaybackPolicy.require_user_action_for_all_media_types, this.allowsInlineMediaPlayback = false, @@ -221,6 +222,11 @@ class WebView extends StatefulWidget { /// By default `gestureNavigationEnabled` is false. final bool gestureNavigationEnabled; + /// A Boolean value indicating whether the WebView should support zooming using its on-screen zoom controls and gestures. + /// + /// By default 'zoomEnabled' is true + final bool zoomEnabled; + /// The value used for the HTTP User-Agent: request header. /// /// When null the platform's webview default is used for the User-Agent header. @@ -553,12 +559,14 @@ class WebViewController { assert(newValue.hasNavigationDelegate != null); assert(newValue.debuggingEnabled != null); assert(newValue.userAgent != null); + assert(newValue.zoomEnabled != null); JavascriptMode? javascriptMode; bool? hasNavigationDelegate; bool? hasProgressTracking; bool? debuggingEnabled; WebSetting userAgent = WebSetting.absent(); + bool? zoomEnabled; if (currentValue.javascriptMode != newValue.javascriptMode) { javascriptMode = newValue.javascriptMode; } @@ -574,6 +582,9 @@ class WebViewController { if (currentValue.userAgent != newValue.userAgent) { userAgent = newValue.userAgent; } + if (currentValue.zoomEnabled != newValue.zoomEnabled) { + zoomEnabled = newValue.zoomEnabled; + } return WebSettings( javascriptMode: javascriptMode, @@ -581,6 +592,7 @@ class WebViewController { hasProgressTracking: hasProgressTracking, debuggingEnabled: debuggingEnabled, userAgent: userAgent, + zoomEnabled: zoomEnabled, ); } @@ -613,5 +625,6 @@ WebSettings _webSettingsFromWidget(WebView widget) { gestureNavigationEnabled: widget.gestureNavigationEnabled, allowsInlineMediaPlayback: widget.allowsInlineMediaPlayback, userAgent: WebSetting.of(widget.userAgent), + zoomEnabled: widget.zoomEnabled, ); } From 3d5467ceb8cf43ac466c77e4ce7f26dfa1042af3 Mon Sep 17 00:00:00 2001 From: Nick Bradshaw Date: Tue, 5 Oct 2021 11:54:45 -0700 Subject: [PATCH 58/72] Updating android pubspec version of platform_interface --- packages/webview_flutter/webview_flutter_android/pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/webview_flutter/webview_flutter_android/pubspec.yaml b/packages/webview_flutter/webview_flutter_android/pubspec.yaml index 57d39260011f..4146b756602b 100644 --- a/packages/webview_flutter/webview_flutter_android/pubspec.yaml +++ b/packages/webview_flutter/webview_flutter_android/pubspec.yaml @@ -20,7 +20,7 @@ dependencies: flutter: sdk: flutter - webview_flutter_platform_interface: ^1.0.0 + webview_flutter_platform_interface: ^1.1.0 dev_dependencies: flutter_driver: From b0f92d61fe051a40e40dacd8359cbad87cf09aa5 Mon Sep 17 00:00:00 2001 From: Nick Bradshaw Date: Tue, 5 Oct 2021 11:58:08 -0700 Subject: [PATCH 59/72] Updating iOS pubspec/AUTHORS/CHANGELOG --- packages/webview_flutter/webview_flutter_wkwebview/AUTHORS | 2 ++ .../webview_flutter/webview_flutter_wkwebview/CHANGELOG.md | 4 ++++ .../webview_flutter/webview_flutter_wkwebview/pubspec.yaml | 2 +- 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/packages/webview_flutter/webview_flutter_wkwebview/AUTHORS b/packages/webview_flutter/webview_flutter_wkwebview/AUTHORS index 78f9e5ad9f6b..4fa8b35fca8a 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/AUTHORS +++ b/packages/webview_flutter/webview_flutter_wkwebview/AUTHORS @@ -65,3 +65,5 @@ Anton Borries Alex Li Rahul Raj <64.rahulraj@gmail.com> Maurits van Beusekom +Antonino Di Natale +Nick Bradshaw diff --git a/packages/webview_flutter/webview_flutter_wkwebview/CHANGELOG.md b/packages/webview_flutter/webview_flutter_wkwebview/CHANGELOG.md index 242d79b4bd82..b75519af476c 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/CHANGELOG.md +++ b/packages/webview_flutter/webview_flutter_wkwebview/CHANGELOG.md @@ -1,3 +1,7 @@ +## 2.1.0 + +* Add `zoomEnabled` functionality. + ## 2.0.14 * Update example App so navigation menu loads immediatly but only becomes available when `WebViewController` is available (same behavior as example App in webview_flutter package). diff --git a/packages/webview_flutter/webview_flutter_wkwebview/pubspec.yaml b/packages/webview_flutter/webview_flutter_wkwebview/pubspec.yaml index a7305cea7a94..427b038f8625 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/pubspec.yaml +++ b/packages/webview_flutter/webview_flutter_wkwebview/pubspec.yaml @@ -2,7 +2,7 @@ name: webview_flutter_wkwebview description: A Flutter plugin that provides a WebView widget based on Apple's WKWebView control. repository: https://github.com/flutter/plugins/tree/master/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.0.14 +version: 2.1.0 environment: sdk: ">=2.14.0 <3.0.0" From a342931b9cde9637797418f65ff7cbe7507ab644 Mon Sep 17 00:00:00 2001 From: Nick Bradshaw Date: Tue, 5 Oct 2021 12:03:22 -0700 Subject: [PATCH 60/72] Adding iOS implementation for zoomEnabled --- .../ios/Classes/FLTWKNavigationDelegate.h | 7 ++++++- .../ios/Classes/FLTWKNavigationDelegate.m | 11 +++++++++++ .../ios/Classes/FlutterWebView.m | 3 +++ 3 files changed, 20 insertions(+), 1 deletion(-) diff --git a/packages/webview_flutter/webview_flutter_wkwebview/ios/Classes/FLTWKNavigationDelegate.h b/packages/webview_flutter/webview_flutter_wkwebview/ios/Classes/FLTWKNavigationDelegate.h index 31edadc8cc05..6531931c4cf4 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/ios/Classes/FLTWKNavigationDelegate.h +++ b/packages/webview_flutter/webview_flutter_wkwebview/ios/Classes/FLTWKNavigationDelegate.h @@ -9,13 +9,18 @@ NS_ASSUME_NONNULL_BEGIN @interface FLTWKNavigationDelegate : NSObject -- (instancetype)initWithChannel:(FlutterMethodChannel*)channel; +- (instancetype)initWithChannel:(FlutterMethodChannel *)channel; /** * Whether to delegate navigation decisions over the method channel. */ @property(nonatomic, assign) BOOL hasDartNavigationDelegate; +/** + * Whether to allow zoom functionality on the WebView. + */ +@property(nonatomic, assign) BOOL shouldEnableZoom; + @end NS_ASSUME_NONNULL_END diff --git a/packages/webview_flutter/webview_flutter_wkwebview/ios/Classes/FLTWKNavigationDelegate.m b/packages/webview_flutter/webview_flutter_wkwebview/ios/Classes/FLTWKNavigationDelegate.m index 8b7ee7d0cfb7..125d3cabdcf1 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/ios/Classes/FLTWKNavigationDelegate.m +++ b/packages/webview_flutter/webview_flutter_wkwebview/ios/Classes/FLTWKNavigationDelegate.m @@ -63,6 +63,17 @@ - (void)webView:(WKWebView *)webView } - (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation { + if (!self.shouldEnableZoom) { + NSString *source = + @"var meta = document.createElement('meta');" + @"meta.name = 'viewport';" + @"meta.content = 'width=device-width, initial-scale=1.0, maximum-scale=1.0," + @"user-scalable=no';" + @"var head = document.getElementsByTagName('head')[0];head.appendChild(meta);"; + + [webView evaluateJavaScript:source completionHandler:nil]; + } + [_methodChannel invokeMethod:@"onPageFinished" arguments:@{@"url" : webView.URL.absoluteString}]; } diff --git a/packages/webview_flutter/webview_flutter_wkwebview/ios/Classes/FlutterWebView.m b/packages/webview_flutter/webview_flutter_wkwebview/ios/Classes/FlutterWebView.m index c6d926d3cfc2..7fd78ee302d0 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/ios/Classes/FlutterWebView.m +++ b/packages/webview_flutter/webview_flutter_wkwebview/ios/Classes/FlutterWebView.m @@ -348,6 +348,9 @@ - (NSString*)applySettings:(NSDictionary*)settings { } else if ([key isEqualToString:@"userAgent"]) { NSString* userAgent = settings[key]; [self updateUserAgent:[userAgent isEqual:[NSNull null]] ? nil : userAgent]; + } else if ([key isEqualToString:@"zoomEnabled"]) { + NSNumber* zoomEnabled = settings[key]; + _navigationDelegate.shouldEnableZoom = [zoomEnabled boolValue]; } else { [unknownKeys addObject:key]; } From b6b4c30daed57f6c8be2ce84df843a1c243f4f1a Mon Sep 17 00:00:00 2001 From: Nick Bradshaw Date: Tue, 5 Oct 2021 12:04:56 -0700 Subject: [PATCH 61/72] Updating iOS pubspec platform_interface version and WebView --- .../webview_flutter_wkwebview/example/lib/web_view.dart | 9 ++++++++- .../webview_flutter_wkwebview/pubspec.yaml | 3 +-- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/packages/webview_flutter/webview_flutter_wkwebview/example/lib/web_view.dart b/packages/webview_flutter/webview_flutter_wkwebview/example/lib/web_view.dart index ddb8e9b0f14f..d57499dcef50 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/example/lib/web_view.dart +++ b/packages/webview_flutter/webview_flutter_wkwebview/example/lib/web_view.dart @@ -4,9 +4,9 @@ import 'dart:async'; -import 'package:flutter/widgets.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/gestures.dart'; +import 'package:flutter/widgets.dart'; import 'package:webview_flutter_platform_interface/webview_flutter_platform_interface.dart'; import 'package:webview_flutter_wkwebview/webview_flutter_wkwebview.dart'; @@ -65,6 +65,7 @@ class WebView extends StatefulWidget { this.debuggingEnabled = false, this.gestureNavigationEnabled = false, this.userAgent, + this.zoomEnabled = true, this.initialMediaPlaybackPolicy = AutoMediaPlaybackPolicy.require_user_action_for_all_media_types, this.allowsInlineMediaPlayback = false, @@ -213,6 +214,11 @@ class WebView extends StatefulWidget { /// By default `userAgent` is null. final String? userAgent; + /// A Boolean value indicating whether the WebView should support zooming using its on-screen zoom controls and gestures. + /// + /// By default 'zoomEnabled' is true + final bool zoomEnabled; + /// Which restrictions apply on automatic media playback. /// /// This initial value is applied to the platform's webview upon creation. Any following @@ -542,6 +548,7 @@ WebSettings _webSettingsFromWidget(WebView widget) { gestureNavigationEnabled: widget.gestureNavigationEnabled, allowsInlineMediaPlayback: widget.allowsInlineMediaPlayback, userAgent: WebSetting.of(widget.userAgent), + zoomEnabled: widget.zoomEnabled, ); } diff --git a/packages/webview_flutter/webview_flutter_wkwebview/pubspec.yaml b/packages/webview_flutter/webview_flutter_wkwebview/pubspec.yaml index 427b038f8625..ea80dab63cae 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/pubspec.yaml +++ b/packages/webview_flutter/webview_flutter_wkwebview/pubspec.yaml @@ -18,8 +18,7 @@ flutter: dependencies: flutter: sdk: flutter - - webview_flutter_platform_interface: ^1.0.0 + webview_flutter_platform_interface: ^1.1.0 dev_dependencies: flutter_driver: From ef139b6b38c56c18611ca62e3b00db30f4cfba84 Mon Sep 17 00:00:00 2001 From: Nick Bradshaw Date: Tue, 5 Oct 2021 12:05:22 -0700 Subject: [PATCH 62/72] Removing extra line in Android pubspec.yaml --- packages/webview_flutter/webview_flutter_android/pubspec.yaml | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/webview_flutter/webview_flutter_android/pubspec.yaml b/packages/webview_flutter/webview_flutter_android/pubspec.yaml index 4146b756602b..f323fb4b9ea3 100644 --- a/packages/webview_flutter/webview_flutter_android/pubspec.yaml +++ b/packages/webview_flutter/webview_flutter_android/pubspec.yaml @@ -19,7 +19,6 @@ flutter: dependencies: flutter: sdk: flutter - webview_flutter_platform_interface: ^1.1.0 dev_dependencies: From 11720f3cce201dbf67accea1f3b8126fdfd0432e Mon Sep 17 00:00:00 2001 From: Nick Bradshaw Date: Tue, 5 Oct 2021 12:06:51 -0700 Subject: [PATCH 63/72] Updating iOS Authors file --- packages/webview_flutter/webview_flutter_wkwebview/AUTHORS | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/webview_flutter/webview_flutter_wkwebview/AUTHORS b/packages/webview_flutter/webview_flutter_wkwebview/AUTHORS index 9c7a4c867552..4fa8b35fca8a 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/AUTHORS +++ b/packages/webview_flutter/webview_flutter_wkwebview/AUTHORS @@ -65,4 +65,5 @@ Anton Borries Alex Li Rahul Raj <64.rahulraj@gmail.com> Maurits van Beusekom +Antonino Di Natale Nick Bradshaw From 64db0dbae1b4314344df2e0fb0b621996c3f0a29 Mon Sep 17 00:00:00 2001 From: Nick Bradshaw Date: Wed, 6 Oct 2021 06:11:47 -0700 Subject: [PATCH 64/72] Update platform_interface_version --- packages/webview_flutter/webview_flutter_android/pubspec.yaml | 2 +- packages/webview_flutter/webview_flutter_wkwebview/pubspec.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/webview_flutter/webview_flutter_android/pubspec.yaml b/packages/webview_flutter/webview_flutter_android/pubspec.yaml index f323fb4b9ea3..18f498875272 100644 --- a/packages/webview_flutter/webview_flutter_android/pubspec.yaml +++ b/packages/webview_flutter/webview_flutter_android/pubspec.yaml @@ -19,7 +19,7 @@ flutter: dependencies: flutter: sdk: flutter - webview_flutter_platform_interface: ^1.1.0 + webview_flutter_platform_interface: ^1.2.0 dev_dependencies: flutter_driver: diff --git a/packages/webview_flutter/webview_flutter_wkwebview/pubspec.yaml b/packages/webview_flutter/webview_flutter_wkwebview/pubspec.yaml index ea80dab63cae..bfa4b8050e90 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/pubspec.yaml +++ b/packages/webview_flutter/webview_flutter_wkwebview/pubspec.yaml @@ -18,7 +18,7 @@ flutter: dependencies: flutter: sdk: flutter - webview_flutter_platform_interface: ^1.1.0 + webview_flutter_platform_interface: ^1.2.0 dev_dependencies: flutter_driver: From 74addca18cbc7320bddf0a2f3844c3b09ecec353 Mon Sep 17 00:00:00 2001 From: Nick Bradshaw Date: Thu, 21 Oct 2021 12:17:42 -0700 Subject: [PATCH 65/72] Adding test coverage for iOS --- .../FLTWKNavigationDelegateTests.m | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/packages/webview_flutter/webview_flutter_wkwebview/example/ios/RunnerTests/FLTWKNavigationDelegateTests.m b/packages/webview_flutter/webview_flutter_wkwebview/example/ios/RunnerTests/FLTWKNavigationDelegateTests.m index eb6d1543ec07..810037a7cbf6 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/example/ios/RunnerTests/FLTWKNavigationDelegateTests.m +++ b/packages/webview_flutter/webview_flutter_wkwebview/example/ios/RunnerTests/FLTWKNavigationDelegateTests.m @@ -13,13 +13,22 @@ @interface FLTWKNavigationDelegateTests : XCTestCase @property(strong, nonatomic) FlutterMethodChannel *mockMethodChannel; @property(strong, nonatomic) FLTWKNavigationDelegate *navigationDelegate; +@property(strong, nonatomic) WKNavigation *navigation; @end @implementation FLTWKNavigationDelegateTests +NSString *const expectedJavascript = + @"var meta = document.createElement('meta');" + @"meta.name = 'viewport';" + @"meta.content = 'width=device-width, initial-scale=1.0, maximum-scale=1.0," + @"user-scalable=no';" + @"var head = document.getElementsByTagName('head')[0];head.appendChild(meta);"; + - (void)setUp { self.mockMethodChannel = OCMClassMock(FlutterMethodChannel.class); + self.navigation = OCMClassMock(WKNavigation.class); self.navigationDelegate = [[FLTWKNavigationDelegate alloc] initWithChannel:self.mockMethodChannel]; } @@ -38,4 +47,27 @@ - (void)testWebViewWebContentProcessDidTerminateCallsRecourseErrorChannel { } } +- (void)testWebViewWebEvaluateJavaScriptSourceIsCorrectWhenShouldEnableZoomIsFalse { + WKWebView *webview = OCMClassMock(WKWebView.class); + NSURL *testUrl = [[NSURL alloc] initWithString:@"www.example.com"]; + OCMStub([webview URL]).andReturn(testUrl); + + self.navigationDelegate.shouldEnableZoom = false; + [self.navigationDelegate webView:webview didFinishNavigation:self.navigation]; + + OCMVerify([webview evaluateJavaScript:expectedJavascript completionHandler:nil]); +} + +- (void)testWebViewWebEvaluateJavaScriptShouldNotBeCalledWhenShouldEnableZoomIsTrue { + WKWebView *webview = OCMClassMock(WKWebView.class); + NSURL *testUrl = [[NSURL alloc] initWithString:@"www.example.com"]; + OCMStub([webview URL]).andReturn(testUrl); + + self.navigationDelegate.shouldEnableZoom = true; + + OCMReject([webview evaluateJavaScript:expectedJavascript completionHandler:nil]); + + [self.navigationDelegate webView:webview didFinishNavigation:self.navigation]; +} + @end From 5238f60390b7c32b9d4a53eb686e293b32e43084 Mon Sep 17 00:00:00 2001 From: Nick Bradshaw Date: Thu, 21 Oct 2021 12:43:43 -0700 Subject: [PATCH 66/72] Updating formatting --- .../ios/RunnerTests/FLTWKNavigationDelegateTests.m | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/packages/webview_flutter/webview_flutter_wkwebview/example/ios/RunnerTests/FLTWKNavigationDelegateTests.m b/packages/webview_flutter/webview_flutter_wkwebview/example/ios/RunnerTests/FLTWKNavigationDelegateTests.m index 810037a7cbf6..8f2be3664fd1 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/example/ios/RunnerTests/FLTWKNavigationDelegateTests.m +++ b/packages/webview_flutter/webview_flutter_wkwebview/example/ios/RunnerTests/FLTWKNavigationDelegateTests.m @@ -20,11 +20,11 @@ @interface FLTWKNavigationDelegateTests : XCTestCase @implementation FLTWKNavigationDelegateTests NSString *const expectedJavascript = - @"var meta = document.createElement('meta');" - @"meta.name = 'viewport';" - @"meta.content = 'width=device-width, initial-scale=1.0, maximum-scale=1.0," - @"user-scalable=no';" - @"var head = document.getElementsByTagName('head')[0];head.appendChild(meta);"; + @"var meta = document.createElement('meta');" + @"meta.name = 'viewport';" + @"meta.content = 'width=device-width, initial-scale=1.0, maximum-scale=1.0," + @"user-scalable=no';" + @"var head = document.getElementsByTagName('head')[0];head.appendChild(meta);"; - (void)setUp { self.mockMethodChannel = OCMClassMock(FlutterMethodChannel.class); @@ -54,7 +54,6 @@ - (void)testWebViewWebEvaluateJavaScriptSourceIsCorrectWhenShouldEnableZoomIsFal self.navigationDelegate.shouldEnableZoom = false; [self.navigationDelegate webView:webview didFinishNavigation:self.navigation]; - OCMVerify([webview evaluateJavaScript:expectedJavascript completionHandler:nil]); } @@ -66,7 +65,6 @@ - (void)testWebViewWebEvaluateJavaScriptShouldNotBeCalledWhenShouldEnableZoomIsT self.navigationDelegate.shouldEnableZoom = true; OCMReject([webview evaluateJavaScript:expectedJavascript completionHandler:nil]); - [self.navigationDelegate webView:webview didFinishNavigation:self.navigation]; } From 955440d8edaa59e6b92797d3a9837ac8b0312127 Mon Sep 17 00:00:00 2001 From: Nick Bradshaw Date: Wed, 27 Oct 2021 10:13:21 -0700 Subject: [PATCH 67/72] Addressing PR feedback. * Formatting and minor test cleanup (cherry picked from commit 024397a0037a793c0294764a0321cd4e475271a0) --- .../plugins/webviewflutter/FlutterWebView.java | 2 +- .../ios/RunnerTests/FLTWKNavigationDelegateTests.m | 13 +++++++------ 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/FlutterWebView.java b/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/FlutterWebView.java index c0ea3d3b2e7c..b38c3311680c 100644 --- a/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/FlutterWebView.java +++ b/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/FlutterWebView.java @@ -179,7 +179,7 @@ static WebView createWebView( .setWebChromeClient( webChromeClient) // Always use {@link FlutterWebChromeClient} as web Chrome client. .setDownloadListener(downloadListener) - .setZoomControlsEnabled(true); //Always use built-in zoom mechanisms. + .setZoomControlsEnabled(true); // Always use built-in zoom mechanisms. return webViewBuilder.build(); } diff --git a/packages/webview_flutter/webview_flutter_wkwebview/example/ios/RunnerTests/FLTWKNavigationDelegateTests.m b/packages/webview_flutter/webview_flutter_wkwebview/example/ios/RunnerTests/FLTWKNavigationDelegateTests.m index 8f2be3664fd1..a819a9b53d60 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/example/ios/RunnerTests/FLTWKNavigationDelegateTests.m +++ b/packages/webview_flutter/webview_flutter_wkwebview/example/ios/RunnerTests/FLTWKNavigationDelegateTests.m @@ -19,7 +19,7 @@ @interface FLTWKNavigationDelegateTests : XCTestCase @implementation FLTWKNavigationDelegateTests -NSString *const expectedJavascript = +NSString *const zoomDisablingJavascript = @"var meta = document.createElement('meta');" @"meta.name = 'viewport';" @"meta.content = 'width=device-width, initial-scale=1.0, maximum-scale=1.0," @@ -28,7 +28,6 @@ @implementation FLTWKNavigationDelegateTests - (void)setUp { self.mockMethodChannel = OCMClassMock(FlutterMethodChannel.class); - self.navigation = OCMClassMock(WKNavigation.class); self.navigationDelegate = [[FLTWKNavigationDelegate alloc] initWithChannel:self.mockMethodChannel]; } @@ -49,23 +48,25 @@ - (void)testWebViewWebContentProcessDidTerminateCallsRecourseErrorChannel { - (void)testWebViewWebEvaluateJavaScriptSourceIsCorrectWhenShouldEnableZoomIsFalse { WKWebView *webview = OCMClassMock(WKWebView.class); + WKNavigation *navigation = OCMClassMock(WKNavigation.class); NSURL *testUrl = [[NSURL alloc] initWithString:@"www.example.com"]; OCMStub([webview URL]).andReturn(testUrl); self.navigationDelegate.shouldEnableZoom = false; - [self.navigationDelegate webView:webview didFinishNavigation:self.navigation]; - OCMVerify([webview evaluateJavaScript:expectedJavascript completionHandler:nil]); + [self.navigationDelegate webView:webview didFinishNavigation:navigation]; + OCMVerify([webview evaluateJavaScript:zoomDisablingJavascript completionHandler:nil]); } - (void)testWebViewWebEvaluateJavaScriptShouldNotBeCalledWhenShouldEnableZoomIsTrue { WKWebView *webview = OCMClassMock(WKWebView.class); + WKNavigation *navigation = OCMClassMock(WKNavigation.class); NSURL *testUrl = [[NSURL alloc] initWithString:@"www.example.com"]; OCMStub([webview URL]).andReturn(testUrl); self.navigationDelegate.shouldEnableZoom = true; - OCMReject([webview evaluateJavaScript:expectedJavascript completionHandler:nil]); - [self.navigationDelegate webView:webview didFinishNavigation:self.navigation]; + OCMReject([webview evaluateJavaScript:zoomDisablingJavascript completionHandler:nil]); + [self.navigationDelegate webView:webview didFinishNavigation:navigation]; } @end From ee180b60feb955a33cfd16abae0f18a1a6b91ab1 Mon Sep 17 00:00:00 2001 From: Nick Bradshaw Date: Thu, 28 Oct 2021 10:22:05 -0700 Subject: [PATCH 68/72] Updating pubspec after zoomEnabled flutter_android and flutter_wkwebview modules published --- packages/webview_flutter/webview_flutter/pubspec.yaml | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/packages/webview_flutter/webview_flutter/pubspec.yaml b/packages/webview_flutter/webview_flutter/pubspec.yaml index 35c7bf41e355..6c9f1737c8b3 100644 --- a/packages/webview_flutter/webview_flutter/pubspec.yaml +++ b/packages/webview_flutter/webview_flutter/pubspec.yaml @@ -19,13 +19,9 @@ flutter: dependencies: flutter: sdk: flutter - # FOR TESTING ONLY. DO NOT MERGE. - webview_flutter_android: - path: ../webview_flutter_android + webview_flutter_android: ^2.1.0 webview_flutter_platform_interface: ^1.2.0 - # FOR TESTING ONLY. DO NOT MERGE. - webview_flutter_wkwebview: - path: ../webview_flutter_wkwebview + webview_flutter_wkwebview: ^2.1.0 dev_dependencies: flutter_driver: From 06e24d10975ae472804653358d39db4f2ad0d0b2 Mon Sep 17 00:00:00 2001 From: Nick Bradshaw Date: Thu, 28 Oct 2021 10:35:55 -0700 Subject: [PATCH 69/72] Fixing some formatting issues after some cherry picking from previous PRS --- packages/webview_flutter/webview_flutter_android/CHANGELOG.md | 2 +- .../webview_flutter_android/example/lib/web_view.dart | 1 - packages/webview_flutter/webview_flutter_wkwebview/CHANGELOG.md | 2 +- 3 files changed, 2 insertions(+), 3 deletions(-) diff --git a/packages/webview_flutter/webview_flutter_android/CHANGELOG.md b/packages/webview_flutter/webview_flutter_android/CHANGELOG.md index a7e8b1504624..c0837263509d 100644 --- a/packages/webview_flutter/webview_flutter_android/CHANGELOG.md +++ b/packages/webview_flutter/webview_flutter_android/CHANGELOG.md @@ -8,7 +8,7 @@ ## 2.0.14 -* Update example App so navigation menu loads immediatly but only becomes available when `WebViewController` is available (same behavior as example App in webview_flutter package). +* Update example App so navigation menu loads immediatly but only becomes available when `WebViewController` is available (same behavior as example App in webview_flutter package). ## 2.0.13 diff --git a/packages/webview_flutter/webview_flutter_android/example/lib/web_view.dart b/packages/webview_flutter/webview_flutter_android/example/lib/web_view.dart index 6d55794148b0..05c86383adf3 100644 --- a/packages/webview_flutter/webview_flutter_android/example/lib/web_view.dart +++ b/packages/webview_flutter/webview_flutter_android/example/lib/web_view.dart @@ -567,7 +567,6 @@ class WebViewController { bool? debuggingEnabled; bool? zoomEnabled; WebSetting userAgent = WebSetting.absent(); - bool? zoomEnabled; if (currentValue.javascriptMode != newValue.javascriptMode) { javascriptMode = newValue.javascriptMode; } diff --git a/packages/webview_flutter/webview_flutter_wkwebview/CHANGELOG.md b/packages/webview_flutter/webview_flutter_wkwebview/CHANGELOG.md index 1f2ab0b2521b..b75519af476c 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/CHANGELOG.md +++ b/packages/webview_flutter/webview_flutter_wkwebview/CHANGELOG.md @@ -4,7 +4,7 @@ ## 2.0.14 -* Update example App so navigation menu loads immediatly but only becomes available when `WebViewController` is available (same behavior as example App in webview_flutter package). +* Update example App so navigation menu loads immediatly but only becomes available when `WebViewController` is available (same behavior as example App in webview_flutter package). ## 2.0.13 From 7a1662eca58e745b8767b781f8682b33df05a6b7 Mon Sep 17 00:00:00 2001 From: Nick Bradshaw Date: Thu, 28 Oct 2021 10:38:40 -0700 Subject: [PATCH 70/72] Formatting after merge and removing unneeded null check --- .../java/io/flutter/plugins/webviewflutter/FlutterWebView.java | 3 --- .../webview_flutter_android/example/lib/web_view.dart | 2 +- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/FlutterWebView.java b/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/FlutterWebView.java index b38c3311680c..b2a453adcdac 100644 --- a/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/FlutterWebView.java +++ b/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/FlutterWebView.java @@ -396,9 +396,6 @@ private void getScrollY(Result result) { private void applySettings(Map settings) { for (String key : settings.keySet()) { - if (settings.get(key) == null) { - continue; - } switch (key) { case "jsMode": Integer mode = (Integer) settings.get(key); diff --git a/packages/webview_flutter/webview_flutter_android/example/lib/web_view.dart b/packages/webview_flutter/webview_flutter_android/example/lib/web_view.dart index 05c86383adf3..5e8a2798b8ca 100644 --- a/packages/webview_flutter/webview_flutter_android/example/lib/web_view.dart +++ b/packages/webview_flutter/webview_flutter_android/example/lib/web_view.dart @@ -565,8 +565,8 @@ class WebViewController { bool? hasNavigationDelegate; bool? hasProgressTracking; bool? debuggingEnabled; - bool? zoomEnabled; WebSetting userAgent = WebSetting.absent(); + bool? zoomEnabled; if (currentValue.javascriptMode != newValue.javascriptMode) { javascriptMode = newValue.javascriptMode; } From cc9f536fa0d685e5081a72b9edc9422435163e3e Mon Sep 17 00:00:00 2001 From: Nick Bradshaw Date: Thu, 4 Nov 2021 09:44:12 -0700 Subject: [PATCH 71/72] Addressing PR comments * Formatting --- packages/webview_flutter/webview_flutter/CHANGELOG.md | 2 +- .../webview_flutter_android/example/lib/web_view.dart | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/webview_flutter/webview_flutter/CHANGELOG.md b/packages/webview_flutter/webview_flutter/CHANGELOG.md index 542b54349fd8..ade06d8fdf1b 100644 --- a/packages/webview_flutter/webview_flutter/CHANGELOG.md +++ b/packages/webview_flutter/webview_flutter/CHANGELOG.md @@ -1,6 +1,6 @@ ## 2.2.0 -* Add ability to enable/disable zoom functionality +* Add ability to enable/disable zoom functionality. ## 2.1.2 diff --git a/packages/webview_flutter/webview_flutter_android/example/lib/web_view.dart b/packages/webview_flutter/webview_flutter_android/example/lib/web_view.dart index 5e8a2798b8ca..25aeb5c1956f 100644 --- a/packages/webview_flutter/webview_flutter_android/example/lib/web_view.dart +++ b/packages/webview_flutter/webview_flutter_android/example/lib/web_view.dart @@ -222,7 +222,8 @@ class WebView extends StatefulWidget { /// By default `gestureNavigationEnabled` is false. final bool gestureNavigationEnabled; - /// A Boolean value indicating whether the WebView should support zooming using its on-screen zoom controls and gestures. + /// A Boolean value indicating whether the WebView should support zooming + /// using its on-screen zoom controls and gestures. /// /// By default 'zoomEnabled' is true final bool zoomEnabled; From a1dbd36d0ed9df573b9910eacb6c2bbc3e56dd42 Mon Sep 17 00:00:00 2001 From: Nick Bradshaw Date: Thu, 4 Nov 2021 09:46:51 -0700 Subject: [PATCH 72/72] Reverting change to wrong file * Updating comment formatting in webview.dart --- packages/webview_flutter/webview_flutter/lib/src/webview.dart | 3 ++- .../webview_flutter_android/example/lib/web_view.dart | 3 +-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/webview_flutter/webview_flutter/lib/src/webview.dart b/packages/webview_flutter/webview_flutter/lib/src/webview.dart index b8f1cee23ac9..b1e3490dc64e 100644 --- a/packages/webview_flutter/webview_flutter/lib/src/webview.dart +++ b/packages/webview_flutter/webview_flutter/lib/src/webview.dart @@ -269,7 +269,8 @@ class WebView extends StatefulWidget { /// By default `userAgent` is null. final String? userAgent; - /// A Boolean value indicating whether the WebView should support zooming using its on-screen zoom controls and gestures. + /// A Boolean value indicating whether the WebView should support zooming + /// using its on-screen zoom controls and gestures. /// /// By default 'zoomEnabled' is true final bool zoomEnabled; diff --git a/packages/webview_flutter/webview_flutter_android/example/lib/web_view.dart b/packages/webview_flutter/webview_flutter_android/example/lib/web_view.dart index 25aeb5c1956f..5e8a2798b8ca 100644 --- a/packages/webview_flutter/webview_flutter_android/example/lib/web_view.dart +++ b/packages/webview_flutter/webview_flutter_android/example/lib/web_view.dart @@ -222,8 +222,7 @@ class WebView extends StatefulWidget { /// By default `gestureNavigationEnabled` is false. final bool gestureNavigationEnabled; - /// A Boolean value indicating whether the WebView should support zooming - /// using its on-screen zoom controls and gestures. + /// A Boolean value indicating whether the WebView should support zooming using its on-screen zoom controls and gestures. /// /// By default 'zoomEnabled' is true final bool zoomEnabled;