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 1ff869b04c61..d94593981183 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 @@ -2,8 +2,8 @@ import android.content.Context; import android.view.View; -import android.webkit.WebStorage; import android.webkit.WebView; +import android.webkit.WebViewClient; import io.flutter.plugin.common.BinaryMessenger; import io.flutter.plugin.common.MethodCall; import io.flutter.plugin.common.MethodChannel; @@ -21,8 +21,6 @@ public class FlutterWebView implements PlatformView, MethodCallHandler { @SuppressWarnings("unchecked") FlutterWebView(Context context, BinaryMessenger messenger, int id, Map params) { webView = new WebView(context); - // Allow local storage. - webView.getSettings().setDomStorageEnabled(true); methodChannel = new MethodChannel(messenger, "plugins.flutter.io/webview_" + id); methodChannel.setMethodCallHandler(this); @@ -37,6 +35,19 @@ public class FlutterWebView implements PlatformView, MethodCallHandler { String url = (String) params.get("initialUrl"); webView.loadUrl(url); } + + if (params.containsKey("enableJavascriptRedirects")) { + boolean enableJavascriptRedirects = (boolean) params.get("enableJavascriptRedirects"); + if (enableJavascriptRedirects) { + webView.setWebViewClient( + new WebViewClient() { + @Override + public boolean shouldOverrideUrlLoading(WebView view, String url) { + return false; + } + }); + } + } } @Override @@ -80,9 +91,6 @@ public void onMethodCall(MethodCall methodCall, Result result) { case "removeJavascriptChannels": removeJavaScriptChannels(methodCall, result); break; - case "clearCache": - clearCache(result); - break; default: result.notImplemented(); } @@ -94,6 +102,12 @@ private void loadUrl(MethodCall methodCall, Result result) { result.success(null); } + private void doJavascriptRedirect(MethodCall methodCall, Result result) { + String url = (String) methodCall.arguments; + webView.loadUrl(url); + result.success(null); + } + private void canGoBack(MethodCall methodCall, Result result) { result.success(webView.canGoBack()); } @@ -162,12 +176,6 @@ private void removeJavaScriptChannels(MethodCall methodCall, Result result) { result.success(null); } - private void clearCache(Result result) { - webView.clearCache(true); - WebStorage.getInstance().deleteAllData(); - result.success(null); - } - private void applySettings(Map settings) { for (String key : settings.keySet()) { switch (key) { @@ -201,7 +209,5 @@ private void registerJavaScriptChannelNames(List channelNames) { } @Override - public void dispose() { - methodChannel.setMethodCallHandler(null); - } + public void dispose() {} } diff --git a/packages/webview_flutter/example/lib/main.dart b/packages/webview_flutter/example/lib/main.dart index 4e3fe6cbdbdd..174624974702 100644 --- a/packages/webview_flutter/example/lib/main.dart +++ b/packages/webview_flutter/example/lib/main.dart @@ -29,6 +29,7 @@ class WebViewExample extends StatelessWidget { return WebView( initialUrl: 'https://flutter.io', javascriptMode: JavascriptMode.unrestricted, + enableJavascriptRedirects: true, onWebViewCreated: (WebViewController webViewController) { _controller.complete(webViewController); }, diff --git a/packages/webview_flutter/lib/webview_flutter.dart b/packages/webview_flutter/lib/webview_flutter.dart index a4bb285a2d8d..2393105e5b08 100644 --- a/packages/webview_flutter/lib/webview_flutter.dart +++ b/packages/webview_flutter/lib/webview_flutter.dart @@ -79,9 +79,13 @@ class WebView extends StatefulWidget { this.javascriptMode = JavascriptMode.disabled, this.javascriptChannels, this.gestureRecognizers, + this.enableJavascriptRedirects, }) : assert(javascriptMode != null), super(key: key); + /// enables javascript redirect if sets to true + final bool enableJavascriptRedirects; + /// If not null invoked once the web view is created. final WebViewCreatedCallback onWebViewCreated; @@ -229,15 +233,18 @@ Set _extractChannelNames(Set channels) { class _CreationParams { _CreationParams( - {this.initialUrl, this.settings, this.javascriptChannelNames}); + {this.initialUrl, + this.settings, + this.javascriptChannelNames, + this.enableJavascriptRedirects}); static _CreationParams fromWidget(WebView widget) { return _CreationParams( - initialUrl: widget.initialUrl, - settings: _WebSettings.fromWidget(widget), - javascriptChannelNames: - _extractChannelNames(widget.javascriptChannels).toList(), - ); + initialUrl: widget.initialUrl, + settings: _WebSettings.fromWidget(widget), + javascriptChannelNames: + _extractChannelNames(widget.javascriptChannels).toList(), + enableJavascriptRedirects: widget.enableJavascriptRedirects); } final String initialUrl; @@ -246,11 +253,14 @@ class _CreationParams { final List javascriptChannelNames; + final bool enableJavascriptRedirects; + Map toMap() { return { 'initialUrl': initialUrl, 'settings': settings.toMap(), 'javascriptChannelNames': javascriptChannelNames, + 'enableJavascriptRedirects': enableJavascriptRedirects }; } }