From a1817c6d7b1a032aedada2e486c3fb51e4480dfd Mon Sep 17 00:00:00 2001 From: Rakesh Date: Tue, 12 Feb 2019 17:41:04 +0400 Subject: [PATCH 1/3] fixed javascript redirect --- .../webviewflutter/FlutterWebView.java | 20 ++++++++++++++++ .../webview_flutter/example/lib/main.dart | 1 + .../webview_flutter/lib/webview_flutter.dart | 23 ++++++++++++++----- 3 files changed, 38 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 a6528cd34a8c..7f713a3ab6e3 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 @@ -3,6 +3,7 @@ import android.content.Context; import android.view.View; 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; @@ -34,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 @@ -88,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()); } diff --git a/packages/webview_flutter/example/lib/main.dart b/packages/webview_flutter/example/lib/main.dart index 0536b7a5d247..104f0ab81ea4 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 dbb5af0aa3b1..6371c09c2485 100644 --- a/packages/webview_flutter/lib/webview_flutter.dart +++ b/packages/webview_flutter/lib/webview_flutter.dart @@ -79,9 +79,14 @@ 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 +234,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 +254,14 @@ class _CreationParams { final List javascriptChannelNames; + final bool enableJavascriptRedirects; + Map toMap() { return { 'initialUrl': initialUrl, 'settings': settings.toMap(), 'javascriptChannelNames': javascriptChannelNames, + 'enableJavascriptRedirects': enableJavascriptRedirects }; } } From 43e4c1ed08c116701ceb0fe3ee13095dce8bce88 Mon Sep 17 00:00:00 2001 From: Rakesh Date: Tue, 12 Feb 2019 17:58:51 +0400 Subject: [PATCH 2/3] formatted files --- .../webviewflutter/FlutterWebView.java | 397 +++++++++--------- .../webview_flutter/lib/webview_flutter.dart | 1 - 2 files changed, 199 insertions(+), 199 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 7f713a3ab6e3..f11432636c84 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 @@ -4,210 +4,211 @@ import android.view.View; import android.webkit.WebView; import android.webkit.WebViewClient; +import java.util.List; +import java.util.Map; import io.flutter.plugin.common.BinaryMessenger; import io.flutter.plugin.common.MethodCall; import io.flutter.plugin.common.MethodChannel; import io.flutter.plugin.common.MethodChannel.MethodCallHandler; import io.flutter.plugin.common.MethodChannel.Result; import io.flutter.plugin.platform.PlatformView; -import java.util.List; -import java.util.Map; public class FlutterWebView implements PlatformView, MethodCallHandler { - private static final String JS_CHANNEL_NAMES_FIELD = "javascriptChannelNames"; - private final WebView webView; - private final MethodChannel methodChannel; - - @SuppressWarnings("unchecked") - FlutterWebView(Context context, BinaryMessenger messenger, int id, Map params) { - webView = new WebView(context); - - methodChannel = new MethodChannel(messenger, "plugins.flutter.io/webview_" + id); - methodChannel.setMethodCallHandler(this); - - applySettings((Map) params.get("settings")); - - if (params.containsKey(JS_CHANNEL_NAMES_FIELD)) { - registerJavaScriptChannelNames((List) params.get(JS_CHANNEL_NAMES_FIELD)); - } - - if (params.containsKey("initialUrl")) { - 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 - public View getView() { - return webView; - } - - @Override - public void onMethodCall(MethodCall methodCall, Result result) { - switch (methodCall.method) { - case "loadUrl": - loadUrl(methodCall, result); - break; - case "updateSettings": - updateSettings(methodCall, result); - break; - case "canGoBack": - canGoBack(methodCall, result); - break; - case "canGoForward": - canGoForward(methodCall, result); - break; - case "goBack": - goBack(methodCall, result); - break; - case "goForward": - goForward(methodCall, result); - break; - case "reload": - reload(methodCall, result); - break; - case "currentUrl": - currentUrl(methodCall, result); - break; - case "evaluateJavascript": - evaluateJavaScript(methodCall, result); - break; - case "addJavascriptChannels": - addJavaScriptChannels(methodCall, result); - break; - case "removeJavascriptChannels": - removeJavaScriptChannels(methodCall, result); - break; - default: - result.notImplemented(); - } - } - - private void loadUrl(MethodCall methodCall, Result result) { - String url = (String) methodCall.arguments; - webView.loadUrl(url); - 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()); - } - - private void canGoForward(MethodCall methodCall, Result result) { - result.success(webView.canGoForward()); - } - - private void goBack(MethodCall methodCall, Result result) { - if (webView.canGoBack()) { - webView.goBack(); - } - result.success(null); - } - - private void goForward(MethodCall methodCall, Result result) { - if (webView.canGoForward()) { - webView.goForward(); - } - result.success(null); - } - - private void reload(MethodCall methodCall, Result result) { - webView.reload(); - result.success(null); - } - - private void currentUrl(MethodCall methodCall, Result result) { - result.success(webView.getUrl()); - } - - @SuppressWarnings("unchecked") - private void updateSettings(MethodCall methodCall, Result result) { - applySettings((Map) methodCall.arguments); - result.success(null); - } - - private void evaluateJavaScript(MethodCall methodCall, final Result result) { - String jsString = (String) methodCall.arguments; - if (jsString == null) { - throw new UnsupportedOperationException("JavaScript string cannot be null"); - } - webView.evaluateJavascript( - jsString, - new android.webkit.ValueCallback() { - @Override - public void onReceiveValue(String value) { - result.success(value); - } - }); - } - - @SuppressWarnings("unchecked") - private void addJavaScriptChannels(MethodCall methodCall, Result result) { - List channelNames = (List) methodCall.arguments; - registerJavaScriptChannelNames(channelNames); - result.success(null); - } - - @SuppressWarnings("unchecked") - private void removeJavaScriptChannels(MethodCall methodCall, Result result) { - List channelNames = (List) methodCall.arguments; - for (String channelName : channelNames) { - webView.removeJavascriptInterface(channelName); - } - result.success(null); - } - - private void applySettings(Map settings) { - for (String key : settings.keySet()) { - switch (key) { - case "jsMode": - updateJsMode((Integer) settings.get(key)); - break; - default: - throw new IllegalArgumentException("Unknown WebView setting: " + key); - } - } - } - - private void updateJsMode(int mode) { - switch (mode) { - case 0: // disabled - webView.getSettings().setJavaScriptEnabled(false); - break; - case 1: // unrestricted - webView.getSettings().setJavaScriptEnabled(true); - break; - default: - throw new IllegalArgumentException("Trying to set unknown JavaScript mode: " + mode); - } - } - - private void registerJavaScriptChannelNames(List channelNames) { - for (String channelName : channelNames) { - webView.addJavascriptInterface( - new JavaScriptChannel(methodChannel, channelName), channelName); - } - } - - @Override - public void dispose() {} + private static final String JS_CHANNEL_NAMES_FIELD = "javascriptChannelNames"; + private final WebView webView; + private final MethodChannel methodChannel; + + @SuppressWarnings("unchecked") + FlutterWebView(Context context, BinaryMessenger messenger, int id, Map params) { + webView = new WebView(context); + + methodChannel = new MethodChannel(messenger, "plugins.flutter.io/webview_" + id); + methodChannel.setMethodCallHandler(this); + + applySettings((Map) params.get("settings")); + + if (params.containsKey(JS_CHANNEL_NAMES_FIELD)) { + registerJavaScriptChannelNames((List) params.get(JS_CHANNEL_NAMES_FIELD)); + } + + if (params.containsKey("initialUrl")) { + 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 + public View getView() { + return webView; + } + + @Override + public void onMethodCall(MethodCall methodCall, Result result) { + switch (methodCall.method) { + case "loadUrl": + loadUrl(methodCall, result); + break; + case "updateSettings": + updateSettings(methodCall, result); + break; + case "canGoBack": + canGoBack(methodCall, result); + break; + case "canGoForward": + canGoForward(methodCall, result); + break; + case "goBack": + goBack(methodCall, result); + break; + case "goForward": + goForward(methodCall, result); + break; + case "reload": + reload(methodCall, result); + break; + case "currentUrl": + currentUrl(methodCall, result); + break; + case "evaluateJavascript": + evaluateJavaScript(methodCall, result); + break; + case "addJavascriptChannels": + addJavaScriptChannels(methodCall, result); + break; + case "removeJavascriptChannels": + removeJavaScriptChannels(methodCall, result); + break; + default: + result.notImplemented(); + } + } + + private void loadUrl(MethodCall methodCall, Result result) { + String url = (String) methodCall.arguments; + webView.loadUrl(url); + 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()); + } + + private void canGoForward(MethodCall methodCall, Result result) { + result.success(webView.canGoForward()); + } + + private void goBack(MethodCall methodCall, Result result) { + if (webView.canGoBack()) { + webView.goBack(); + } + result.success(null); + } + + private void goForward(MethodCall methodCall, Result result) { + if (webView.canGoForward()) { + webView.goForward(); + } + result.success(null); + } + + private void reload(MethodCall methodCall, Result result) { + webView.reload(); + result.success(null); + } + + private void currentUrl(MethodCall methodCall, Result result) { + result.success(webView.getUrl()); + } + + @SuppressWarnings("unchecked") + private void updateSettings(MethodCall methodCall, Result result) { + applySettings((Map) methodCall.arguments); + result.success(null); + } + + private void evaluateJavaScript(MethodCall methodCall, final Result result) { + String jsString = (String) methodCall.arguments; + if (jsString == null) { + throw new UnsupportedOperationException("JavaScript string cannot be null"); + } + webView.evaluateJavascript( + jsString, + new android.webkit.ValueCallback() { + @Override + public void onReceiveValue(String value) { + result.success(value); + } + }); + } + + @SuppressWarnings("unchecked") + private void addJavaScriptChannels(MethodCall methodCall, Result result) { + List channelNames = (List) methodCall.arguments; + registerJavaScriptChannelNames(channelNames); + result.success(null); + } + + @SuppressWarnings("unchecked") + private void removeJavaScriptChannels(MethodCall methodCall, Result result) { + List channelNames = (List) methodCall.arguments; + for (String channelName : channelNames) { + webView.removeJavascriptInterface(channelName); + } + result.success(null); + } + + private void applySettings(Map settings) { + for (String key : settings.keySet()) { + switch (key) { + case "jsMode": + updateJsMode((Integer) settings.get(key)); + break; + default: + throw new IllegalArgumentException("Unknown WebView setting: " + key); + } + } + } + + private void updateJsMode(int mode) { + switch (mode) { + case 0: // disabled + webView.getSettings().setJavaScriptEnabled(false); + break; + case 1: // unrestricted + webView.getSettings().setJavaScriptEnabled(true); + break; + default: + throw new IllegalArgumentException("Trying to set unknown JavaScript mode: " + mode); + } + } + + private void registerJavaScriptChannelNames(List channelNames) { + for (String channelName : channelNames) { + webView.addJavascriptInterface( + new JavaScriptChannel(methodChannel, channelName), channelName); + } + } + + @Override + public void dispose() { + } } diff --git a/packages/webview_flutter/lib/webview_flutter.dart b/packages/webview_flutter/lib/webview_flutter.dart index 6371c09c2485..da719967ff52 100644 --- a/packages/webview_flutter/lib/webview_flutter.dart +++ b/packages/webview_flutter/lib/webview_flutter.dart @@ -83,7 +83,6 @@ class WebView extends StatefulWidget { }) : assert(javascriptMode != null), super(key: key); - /// enables javascript redirect if sets to true final bool enableJavascriptRedirects; From b1359cf2e4fbeec1f38529b264d844073a364ace Mon Sep 17 00:00:00 2001 From: Rakesh Date: Tue, 12 Feb 2019 18:35:21 +0400 Subject: [PATCH 3/3] formatting java file --- .../java/io/flutter/plugins/webviewflutter/FlutterWebView.java | 2 ++ 1 file changed, 2 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 f11432636c84..110a835a92f0 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 @@ -4,8 +4,10 @@ import android.view.View; import android.webkit.WebView; import android.webkit.WebViewClient; + import java.util.List; import java.util.Map; + import io.flutter.plugin.common.BinaryMessenger; import io.flutter.plugin.common.MethodCall; import io.flutter.plugin.common.MethodChannel;