From fe66ac7d3e902db47af9c05d30f4b3d3c64bbe8e Mon Sep 17 00:00:00 2001 From: Maurice Parrish <10687576+bparrishMines@users.noreply.github.com> Date: Wed, 21 Dec 2022 13:29:32 -0500 Subject: [PATCH 1/4] fix bug --- .../webview_flutter_android/CHANGELOG.md | 4 +++ .../WebChromeClientHostApiImpl.java | 21 ++++++++----- .../webviewflutter/WebViewHostApiImpl.java | 31 ++++++++++--------- .../plugins/webviewflutter/WebViewTest.java | 11 +++++++ .../webview_flutter_android/pubspec.yaml | 2 +- 5 files changed, 46 insertions(+), 23 deletions(-) diff --git a/packages/webview_flutter/webview_flutter_android/CHANGELOG.md b/packages/webview_flutter/webview_flutter_android/CHANGELOG.md index a7a820db3141..f746f6406c53 100644 --- a/packages/webview_flutter/webview_flutter_android/CHANGELOG.md +++ b/packages/webview_flutter/webview_flutter_android/CHANGELOG.md @@ -1,3 +1,7 @@ +## 3.0.1 + +* Fixes bug where a `AndroidNavigationDelegate` was required to load a request. + ## 3.0.0 * **BREAKING CHANGE** Updates platform implementation to `2.0.0` release of diff --git a/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/WebChromeClientHostApiImpl.java b/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/WebChromeClientHostApiImpl.java index 7b5241ed4d33..3fa4a2f9c298 100644 --- a/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/WebChromeClientHostApiImpl.java +++ b/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/WebChromeClientHostApiImpl.java @@ -29,9 +29,8 @@ public class WebChromeClientHostApiImpl implements WebChromeClientHostApi { /** * Implementation of {@link WebChromeClient} that passes arguments of callback methods to Dart. */ - public static class WebChromeClientImpl extends WebChromeClient { + public static class WebChromeClientImpl extends SecureWebChromeClient { private final WebChromeClientFlutterApiImpl flutterApi; - @Nullable private WebViewClient webViewClient; /** * Creates a {@link WebChromeClient} that passes arguments of callbacks methods to Dart. @@ -42,6 +41,19 @@ public WebChromeClientImpl(@NonNull WebChromeClientFlutterApiImpl flutterApi) { this.flutterApi = flutterApi; } + @Override + public void onProgressChanged(WebView view, int progress) { + flutterApi.onProgressChanged(this, view, (long) progress, reply -> {}); + } + } + + /** + * Implementation of {@link WebChromeClient} that only allows secure urls when opening a new + * window. + */ + public static class SecureWebChromeClient extends WebChromeClient { + @Nullable private WebViewClient webViewClient; + @Override public boolean onCreateWindow( final WebView view, boolean isDialog, boolean isUserGesture, Message resultMsg) { @@ -105,11 +117,6 @@ public boolean shouldOverrideUrlLoading(WebView windowWebView, String url) { return true; } - @Override - public void onProgressChanged(WebView view, int progress) { - flutterApi.onProgressChanged(this, view, (long) progress, reply -> {}); - } - /** * Set the {@link WebViewClient} that calls to {@link WebChromeClient#onCreateWindow} are passed * to. diff --git a/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/WebViewHostApiImpl.java b/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/WebViewHostApiImpl.java index 2fd990535b29..ecf05984f0a6 100644 --- a/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/WebViewHostApiImpl.java +++ b/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/WebViewHostApiImpl.java @@ -17,7 +17,6 @@ import io.flutter.plugin.common.BinaryMessenger; import io.flutter.plugin.platform.PlatformView; import io.flutter.plugins.webviewflutter.GeneratedAndroidWebView.WebViewHostApi; -import io.flutter.plugins.webviewflutter.WebChromeClientHostApiImpl.WebChromeClientImpl; import java.util.Map; import java.util.Objects; @@ -80,7 +79,7 @@ public void setWebContentsDebuggingEnabled(boolean enabled) { /** Implementation of {@link WebView} that can be used as a Flutter {@link PlatformView}s. */ public static class WebViewPlatformView extends WebView implements PlatformView { private WebViewClient currentWebViewClient; - private WebChromeClientImpl currentWebChromeClient; + private WebChromeClientHostApiImpl.SecureWebChromeClient currentWebChromeClient; /** * Creates a {@link WebViewPlatformView}. @@ -91,9 +90,7 @@ public WebViewPlatformView( Context context, BinaryMessenger binaryMessenger, InstanceManager instanceManager) { super(context); currentWebViewClient = new WebViewClient(); - currentWebChromeClient = - new WebChromeClientImpl( - new WebChromeClientFlutterApiImpl(binaryMessenger, instanceManager)); + currentWebChromeClient = new WebChromeClientHostApiImpl.SecureWebChromeClient(); setWebViewClient(currentWebViewClient); setWebChromeClient(currentWebChromeClient); @@ -119,12 +116,18 @@ public void setWebViewClient(WebViewClient webViewClient) { @Override public void setWebChromeClient(WebChromeClient client) { super.setWebChromeClient(client); - if (!(client instanceof WebChromeClientImpl)) { - throw new AssertionError("Client must be a WebChromeClientImpl."); + if (!(client instanceof WebChromeClientHostApiImpl.SecureWebChromeClient)) { + throw new AssertionError("Client must be a SecureWebChromeClient."); } - currentWebChromeClient = (WebChromeClientImpl) client; + currentWebChromeClient = (WebChromeClientHostApiImpl.SecureWebChromeClient) client; currentWebChromeClient.setWebViewClient(currentWebViewClient); } + + @Nullable + @Override + public WebChromeClient getWebChromeClient() { + return currentWebChromeClient; + } } /** @@ -135,7 +138,7 @@ public void setWebChromeClient(WebChromeClient client) { public static class InputAwareWebViewPlatformView extends InputAwareWebView implements PlatformView { private WebViewClient currentWebViewClient; - private WebChromeClientImpl currentWebChromeClient; + private WebChromeClientHostApiImpl.SecureWebChromeClient currentWebChromeClient; /** * Creates a {@link InputAwareWebViewPlatformView}. @@ -149,9 +152,7 @@ public InputAwareWebViewPlatformView( View containerView) { super(context, containerView); currentWebViewClient = new WebViewClient(); - currentWebChromeClient = - new WebChromeClientImpl( - new WebChromeClientFlutterApiImpl(binaryMessenger, instanceManager)); + currentWebChromeClient = new WebChromeClientHostApiImpl.SecureWebChromeClient(); setWebViewClient(currentWebViewClient); setWebChromeClient(currentWebChromeClient); @@ -198,10 +199,10 @@ public void setWebViewClient(WebViewClient webViewClient) { @Override public void setWebChromeClient(WebChromeClient client) { super.setWebChromeClient(client); - if (!(client instanceof WebChromeClientImpl)) { - throw new AssertionError("Client must be a WebChromeClientImpl."); + if (!(client instanceof WebChromeClientHostApiImpl.SecureWebChromeClient)) { + throw new AssertionError("Client must be a SecureWebChromeClient."); } - currentWebChromeClient = (WebChromeClientImpl) client; + currentWebChromeClient = (WebChromeClientHostApiImpl.SecureWebChromeClient) client; currentWebChromeClient.setWebViewClient(currentWebViewClient); } } diff --git a/packages/webview_flutter/webview_flutter_android/android/src/test/java/io/flutter/plugins/webviewflutter/WebViewTest.java b/packages/webview_flutter/webview_flutter_android/android/src/test/java/io/flutter/plugins/webviewflutter/WebViewTest.java index ecaab779c16a..9f26ee5e7204 100644 --- a/packages/webview_flutter/webview_flutter_android/android/src/test/java/io/flutter/plugins/webviewflutter/WebViewTest.java +++ b/packages/webview_flutter/webview_flutter_android/android/src/test/java/io/flutter/plugins/webviewflutter/WebViewTest.java @@ -5,6 +5,8 @@ package io.flutter.plugins.webviewflutter; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; @@ -262,4 +264,13 @@ public void setWebChromeClient() { testHostApiImpl.setWebChromeClient(0L, 1L); verify(mockWebView).setWebChromeClient(mockWebChromeClient); } + + @Test + public void defaultWebChromeClient() { + final WebViewPlatformView webView = new WebViewPlatformView(mockContext, null, null); + assertTrue( + webView.getWebChromeClient() instanceof WebChromeClientHostApiImpl.SecureWebChromeClient); + assertFalse( + webView.getWebChromeClient() instanceof WebChromeClientHostApiImpl.WebChromeClientImpl); + } } diff --git a/packages/webview_flutter/webview_flutter_android/pubspec.yaml b/packages/webview_flutter/webview_flutter_android/pubspec.yaml index 4b22a1f3998e..12c7f4064225 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/main/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: 3.0.0 +version: 3.0.1 environment: sdk: ">=2.17.0 <3.0.0" From ce35d1f6169b7adbb20bf4dc351b7407abd9c722 Mon Sep 17 00:00:00 2001 From: Maurice Parrish <10687576+bparrishMines@users.noreply.github.com> Date: Wed, 21 Dec 2022 13:34:50 -0500 Subject: [PATCH 2/4] comment --- .../io/flutter/plugins/webviewflutter/WebViewHostApiImpl.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/WebViewHostApiImpl.java b/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/WebViewHostApiImpl.java index ecf05984f0a6..94db5b8b7c90 100644 --- a/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/WebViewHostApiImpl.java +++ b/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/WebViewHostApiImpl.java @@ -123,6 +123,9 @@ public void setWebChromeClient(WebChromeClient client) { currentWebChromeClient.setWebViewClient(currentWebViewClient); } + // When running unit tests, the parent `WebView` class is replaced by a stub that returns null + // for every method. This is overriden so that this returns the current WebChromeClient during + // unit tests. This should only remain overriden as long as `setWebChromeClient` is overriden. @Nullable @Override public WebChromeClient getWebChromeClient() { From 36e6d9c3c2704d98162a4187a453255307c80d61 Mon Sep 17 00:00:00 2001 From: Maurice Parrish <10687576+bparrishMines@users.noreply.github.com> Date: Wed, 21 Dec 2022 13:38:02 -0500 Subject: [PATCH 3/4] another test --- .../io/flutter/plugins/webviewflutter/WebViewTest.java | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/packages/webview_flutter/webview_flutter_android/android/src/test/java/io/flutter/plugins/webviewflutter/WebViewTest.java b/packages/webview_flutter/webview_flutter_android/android/src/test/java/io/flutter/plugins/webviewflutter/WebViewTest.java index 9f26ee5e7204..c49d6c5d1142 100644 --- a/packages/webview_flutter/webview_flutter_android/android/src/test/java/io/flutter/plugins/webviewflutter/WebViewTest.java +++ b/packages/webview_flutter/webview_flutter_android/android/src/test/java/io/flutter/plugins/webviewflutter/WebViewTest.java @@ -20,6 +20,7 @@ import io.flutter.plugin.common.BinaryMessenger; import io.flutter.plugins.webviewflutter.WebViewHostApiImpl.WebViewPlatformView; import java.util.HashMap; +import java.util.Objects; import org.junit.After; import org.junit.Before; import org.junit.Rule; @@ -266,11 +267,18 @@ public void setWebChromeClient() { } @Test - public void defaultWebChromeClient() { + public void defaultWebChromeClientIsSecureWebChromeClient() { final WebViewPlatformView webView = new WebViewPlatformView(mockContext, null, null); assertTrue( webView.getWebChromeClient() instanceof WebChromeClientHostApiImpl.SecureWebChromeClient); assertFalse( webView.getWebChromeClient() instanceof WebChromeClientHostApiImpl.WebChromeClientImpl); } + + @Test + public void defaultWebChromeClientDoesNotAttemptToCommunicateWithDart() { + final WebViewPlatformView webView = new WebViewPlatformView(mockContext, null, null); + // This shouldn't throw an Exception. + Objects.requireNonNull(webView.getWebChromeClient()).onProgressChanged(webView, 0); + } } From ebfa384826dc57f8ddbd08dfcc10ead0ceedf452 Mon Sep 17 00:00:00 2001 From: Maurice Parrish <10687576+bparrishMines@users.noreply.github.com> Date: Wed, 21 Dec 2022 14:16:09 -0500 Subject: [PATCH 4/4] fix spelling --- .../io/flutter/plugins/webviewflutter/WebViewHostApiImpl.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/WebViewHostApiImpl.java b/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/WebViewHostApiImpl.java index 94db5b8b7c90..0a044cc5ab7e 100644 --- a/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/WebViewHostApiImpl.java +++ b/packages/webview_flutter/webview_flutter_android/android/src/main/java/io/flutter/plugins/webviewflutter/WebViewHostApiImpl.java @@ -124,8 +124,8 @@ public void setWebChromeClient(WebChromeClient client) { } // When running unit tests, the parent `WebView` class is replaced by a stub that returns null - // for every method. This is overriden so that this returns the current WebChromeClient during - // unit tests. This should only remain overriden as long as `setWebChromeClient` is overriden. + // for every method. This is overridden so that this returns the current WebChromeClient during + // unit tests. This should only remain overridden as long as `setWebChromeClient` is overridden. @Nullable @Override public WebChromeClient getWebChromeClient() {