From 2375fa7fd9206766279ee665b8b3de646472d42f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Je=CC=81re=CC=81mie=20Vincke?= Date: Fri, 4 Oct 2019 17:18:28 +0200 Subject: [PATCH 01/23] Added support for loading progress tracking (iOS & Android) --- .../webviewflutter/FlutterWebView.java | 15 ++++ .../webviewflutter/FlutterWebViewClient.java | 8 ++ .../webview_flutter/example/lib/main.dart | 3 + .../ios/Classes/FLTWKProgressionDelegate.h | 22 ++++++ .../ios/Classes/FLTWKProgressionDelegate.m | 37 ++++++++++ .../ios/Classes/FlutterWebView.m | 16 +++- .../lib/platform_interface.dart | 9 ++- .../lib/src/webview_method_channel.dart | 4 + .../webview_flutter/lib/webview_flutter.dart | 21 ++++++ .../test/webview_flutter_test.dart | 74 +++++++++++++++++++ 10 files changed, 207 insertions(+), 2 deletions(-) create mode 100644 packages/webview_flutter/ios/Classes/FLTWKProgressionDelegate.h create mode 100644 packages/webview_flutter/ios/Classes/FLTWKProgressionDelegate.m 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 a7f2db308e15..08d87c0e0c61 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 @@ -10,14 +10,18 @@ import android.os.Build; import android.os.Handler; import android.view.View; +import android.webkit.WebChromeClient; 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; import io.flutter.plugin.common.MethodChannel.MethodCallHandler; import io.flutter.plugin.common.MethodChannel.Result; import io.flutter.plugin.platform.PlatformView; + import java.util.Collections; import java.util.List; import java.util.Map; @@ -246,12 +250,23 @@ private void applySettings(Map settings) { flutterWebViewClient.createWebViewClient(hasNavigationDelegate); webView.setWebViewClient(webViewClient); + break; case "debuggingEnabled": final boolean debuggingEnabled = (boolean) settings.get(key); webView.setWebContentsDebuggingEnabled(debuggingEnabled); break; + case "hasProgressTracking": + final boolean progressTrackingEnabled = (boolean) settings.get(key); + if (progressTrackingEnabled) { + webView.setWebChromeClient(new WebChromeClient() { + public void onProgressChanged(WebView view, int progress) { + flutterWebViewClient.onLoadingProgress(progress); + } + }); + } + break; case "userAgent": updateUserAgent((String) settings.get(key)); break; diff --git a/packages/webview_flutter/android/src/main/java/io/flutter/plugins/webviewflutter/FlutterWebViewClient.java b/packages/webview_flutter/android/src/main/java/io/flutter/plugins/webviewflutter/FlutterWebViewClient.java index bdd6abb66282..90addbf81e05 100644 --- a/packages/webview_flutter/android/src/main/java/io/flutter/plugins/webviewflutter/FlutterWebViewClient.java +++ b/packages/webview_flutter/android/src/main/java/io/flutter/plugins/webviewflutter/FlutterWebViewClient.java @@ -14,6 +14,7 @@ import androidx.annotation.NonNull; import androidx.webkit.WebViewClientCompat; import io.flutter.plugin.common.MethodChannel; + import java.util.HashMap; import java.util.Map; @@ -25,6 +26,7 @@ class FlutterWebViewClient { private static final String TAG = "FlutterWebViewClient"; private final MethodChannel methodChannel; private boolean hasNavigationDelegate; + private boolean hasProgressTracking; FlutterWebViewClient(MethodChannel methodChannel) { this.methodChannel = methodChannel; @@ -73,6 +75,12 @@ private void onPageFinished(WebView view, String url) { methodChannel.invokeMethod("onPageFinished", args); } + void onLoadingProgress(int progress) { + Map args = new HashMap<>(); + args.put("progress", progress); + methodChannel.invokeMethod("onProgress", args); + } + private void notifyOnNavigationRequest( String url, Map headers, WebView webview, boolean isMainFrame) { HashMap args = new HashMap<>(); diff --git a/packages/webview_flutter/example/lib/main.dart b/packages/webview_flutter/example/lib/main.dart index 5f3e0f8ff4fa..7316808b7ab4 100644 --- a/packages/webview_flutter/example/lib/main.dart +++ b/packages/webview_flutter/example/lib/main.dart @@ -53,6 +53,9 @@ class _WebViewExampleState extends State { onWebViewCreated: (WebViewController webViewController) { _controller.complete(webViewController); }, + onProgress: (progress) { + print("WebView is loading (progress : $progress%)"); + }, // TODO(iskakaushik): Remove this when collection literals makes it to stable. // ignore: prefer_collection_literals javascriptChannels: [ diff --git a/packages/webview_flutter/ios/Classes/FLTWKProgressionDelegate.h b/packages/webview_flutter/ios/Classes/FLTWKProgressionDelegate.h new file mode 100644 index 000000000000..e84523e14ce0 --- /dev/null +++ b/packages/webview_flutter/ios/Classes/FLTWKProgressionDelegate.h @@ -0,0 +1,22 @@ +// +// FLTWKProgressionDelegate.h +// webview_flutter +// +// Created by Jérémie Vincke on 03/10/2019. +// + +#import +#import +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface FLTWKProgressionDelegate : NSObject + +- (instancetype)initWithWebView:(WKWebView *)webView channel:(FlutterMethodChannel*)channel; + +- (void)stopObservingProgress:(WKWebView *)webView; + +@end + +NS_ASSUME_NONNULL_END diff --git a/packages/webview_flutter/ios/Classes/FLTWKProgressionDelegate.m b/packages/webview_flutter/ios/Classes/FLTWKProgressionDelegate.m new file mode 100644 index 000000000000..d0e2222b7585 --- /dev/null +++ b/packages/webview_flutter/ios/Classes/FLTWKProgressionDelegate.m @@ -0,0 +1,37 @@ +// +// FLTWKProgressionDelegate.m +// webview_flutter +// +// Created by Jérémie Vincke on 03/10/2019. +// + +#import "FLTWKProgressionDelegate.h" + +NSString *const keyPath = @"estimatedProgress"; + +@implementation FLTWKProgressionDelegate { + FlutterMethodChannel* _methodChannel; +} + +- (instancetype)initWithWebView:(WKWebView *)webView channel:(FlutterMethodChannel*)channel { + self = [super init]; + if (self) { + _methodChannel = channel; + [webView addObserver:self forKeyPath:keyPath options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:nil]; + } + return self; +} + +- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { + if ([keyPath isEqualToString:keyPath]) { + NSNumber *newValue = change[NSKeyValueChangeNewKey] ?: 0; // newValue is anywhere between 0.0 and 1.0 + int newValueAsInt = [newValue floatValue] * 100; // Anywhere between 0 and 100 + [_methodChannel invokeMethod:@"onProgress" arguments:@{@"progress" : [NSNumber numberWithInt:newValueAsInt]}]; + } +} + +- (void)stopObservingProgress:(WKWebView *)webView { + [webView removeObserver:self forKeyPath:keyPath]; +} + +@end diff --git a/packages/webview_flutter/ios/Classes/FlutterWebView.m b/packages/webview_flutter/ios/Classes/FlutterWebView.m index 36f4e8cb5cfe..d180649b1e46 100644 --- a/packages/webview_flutter/ios/Classes/FlutterWebView.m +++ b/packages/webview_flutter/ios/Classes/FlutterWebView.m @@ -4,6 +4,7 @@ #import "FlutterWebView.h" #import "FLTWKNavigationDelegate.h" +#import "FLTWKProgressionDelegate.h" #import "JavaScriptChannelHandler.h" @implementation FLTWebViewFactory { @@ -42,6 +43,7 @@ @implementation FLTWebViewController { // The set of registered JavaScript channel names. NSMutableSet* _javaScriptChannelNames; FLTWKNavigationDelegate* _navigationDelegate; + FLTWKProgressionDelegate* _progressionDelegate; } - (instancetype)initWithFrame:(CGRect)frame @@ -54,7 +56,7 @@ - (instancetype)initWithFrame:(CGRect)frame NSString* channelName = [NSString stringWithFormat:@"plugins.flutter.io/webview_%lld", viewId]; _channel = [FlutterMethodChannel methodChannelWithName:channelName binaryMessenger:messenger]; _javaScriptChannelNames = [[NSMutableSet alloc] init]; - + WKUserContentController* userContentController = [[WKUserContentController alloc] init]; if ([args[@"javascriptChannelNames"] isKindOfClass:[NSArray class]]) { NSArray* javaScriptChannelNames = args[@"javascriptChannelNames"]; @@ -89,6 +91,12 @@ - (instancetype)initWithFrame:(CGRect)frame return self; } +- (void)dealloc { + if (_progressionDelegate != nil) { + [_progressionDelegate stopObservingProgress:_webView]; + } +} + - (UIView*)view { return _webView; } @@ -255,6 +263,12 @@ - (NSString*)applySettings:(NSDictionary*)settings { } else if ([key isEqualToString:@"hasNavigationDelegate"]) { NSNumber* hasDartNavigationDelegate = settings[key]; _navigationDelegate.hasDartNavigationDelegate = [hasDartNavigationDelegate boolValue]; + } else if ([key isEqualToString:@"hasProgressTracking"]) { + NSNumber* hasProgressTrackingValue = settings[key]; + bool hasProgressTracking = [hasProgressTrackingValue boolValue]; + if (hasProgressTracking) { + _progressionDelegate = [[FLTWKProgressionDelegate alloc] initWithWebView: _webView channel:_channel]; + } } else if ([key isEqualToString:@"debuggingEnabled"]) { // no-op debugging is always enabled on iOS. } else if ([key isEqualToString:@"userAgent"]) { diff --git a/packages/webview_flutter/lib/platform_interface.dart b/packages/webview_flutter/lib/platform_interface.dart index 7e82bae91138..842373c36cc5 100644 --- a/packages/webview_flutter/lib/platform_interface.dart +++ b/packages/webview_flutter/lib/platform_interface.dart @@ -25,6 +25,9 @@ abstract class WebViewPlatformCallbacksHandler { /// Invoked by [WebViewPlatformController] when a page has finished loading. void onPageFinished(String url); + + /// Invoked by [WebViewPlatformController] when a page is loading. + void onProgress(int progress); } /// Interface for talking to the webview's platform implementation. @@ -223,6 +226,7 @@ class WebSettings { WebSettings({ this.javascriptMode, this.hasNavigationDelegate, + this.hasProgressTracking, this.debuggingEnabled, @required this.userAgent, }) : assert(userAgent != null); @@ -233,6 +237,9 @@ class WebSettings { /// Whether the [WebView] has a [NavigationDelegate] set. final bool hasNavigationDelegate; + /// Whether the [WebView] should track page loading progress. + final bool hasProgressTracking; + /// Whether to enable the platform's webview content debugging tools. /// /// See also: [WebView.debuggingEnabled]. @@ -250,7 +257,7 @@ class WebSettings { @override String toString() { - return 'WebSettings(javascriptMode: $javascriptMode, hasNavigationDelegate: $hasNavigationDelegate, debuggingEnabled: $debuggingEnabled, userAgent: $userAgent,)'; + return 'WebSettings(javascriptMode: $javascriptMode, hasNavigationDelegate: $hasNavigationDelegate, hasProgressTracking: $hasProgressTracking, debuggingEnabled: $debuggingEnabled, 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 c2949cc77a2a..c3918a34ea8f 100644 --- a/packages/webview_flutter/lib/src/webview_method_channel.dart +++ b/packages/webview_flutter/lib/src/webview_method_channel.dart @@ -38,6 +38,9 @@ class MethodChannelWebViewPlatform implements WebViewPlatformController { case 'onPageFinished': _platformCallbacksHandler.onPageFinished(call.arguments['url']); return null; + case 'onProgress': + _platformCallbacksHandler.onProgress(call.arguments['progress']); + return null; } throw MissingPluginException( '${call.method} was invoked but has no handler'); @@ -131,6 +134,7 @@ class MethodChannelWebViewPlatform implements WebViewPlatformController { _addIfNonNull('jsMode', settings.javascriptMode?.index); _addIfNonNull('hasNavigationDelegate', settings.hasNavigationDelegate); + _addIfNonNull('hasProgressTracking', settings.hasProgressTracking); _addIfNonNull('debuggingEnabled', settings.debuggingEnabled); _addSettingIfPresent('userAgent', settings.userAgent); return map; diff --git a/packages/webview_flutter/lib/webview_flutter.dart b/packages/webview_flutter/lib/webview_flutter.dart index cd5ca46701d7..071542c5fc18 100644 --- a/packages/webview_flutter/lib/webview_flutter.dart +++ b/packages/webview_flutter/lib/webview_flutter.dart @@ -72,6 +72,9 @@ typedef NavigationDecision NavigationDelegate(NavigationRequest navigation); /// Signature for when a [WebView] has finished loading a page. typedef void PageFinishedCallback(String url); +/// Signature for when a [WebView] is loading a page. +typedef void PageLoadingCallback(int progress); + /// Specifies possible restrictions on automatic media playback. /// /// This is typically used in [WebView.initialMediaPlaybackPolicy]. @@ -139,6 +142,7 @@ class WebView extends StatefulWidget { this.navigationDelegate, this.gestureRecognizers, this.onPageFinished, + this.onProgress, this.debuggingEnabled = false, this.userAgent, this.initialMediaPlaybackPolicy = @@ -265,6 +269,9 @@ class WebView extends StatefulWidget { /// [WebViewController.evaluateJavascript] can assume this. final PageFinishedCallback onPageFinished; + /// Invoked when a page is loading. + final PageLoadingCallback onProgress; + /// Controls whether WebView debugging is enabled. /// /// Setting this to true enables [WebView debugging on Android](https://developers.google.com/web/tools/chrome-devtools/remote-debugging/). @@ -371,6 +378,7 @@ WebSettings _webSettingsFromWidget(WebView widget) { return WebSettings( javascriptMode: widget.javascriptMode, hasNavigationDelegate: widget.navigationDelegate != null, + hasProgressTracking: widget.onProgress != null, debuggingEnabled: widget.debuggingEnabled, userAgent: WebSetting.of(widget.userAgent), ); @@ -381,6 +389,7 @@ WebSettings _clearUnchangedWebSettings( WebSettings currentValue, WebSettings newValue) { assert(currentValue.javascriptMode != null); assert(currentValue.hasNavigationDelegate != null); + assert(currentValue.hasProgressTracking != null); assert(currentValue.debuggingEnabled != null); assert(currentValue.userAgent.isPresent); assert(newValue.javascriptMode != null); @@ -390,6 +399,7 @@ WebSettings _clearUnchangedWebSettings( JavascriptMode javascriptMode; bool hasNavigationDelegate; + bool hasProgressTracking; bool debuggingEnabled; WebSetting userAgent = WebSetting.absent(); if (currentValue.javascriptMode != newValue.javascriptMode) { @@ -398,6 +408,9 @@ WebSettings _clearUnchangedWebSettings( if (currentValue.hasNavigationDelegate != newValue.hasNavigationDelegate) { hasNavigationDelegate = newValue.hasNavigationDelegate; } + if (currentValue.hasProgressTracking != newValue.hasProgressTracking) { + hasProgressTracking = newValue.hasProgressTracking; + } if (currentValue.debuggingEnabled != newValue.debuggingEnabled) { debuggingEnabled = newValue.debuggingEnabled; } @@ -408,6 +421,7 @@ WebSettings _clearUnchangedWebSettings( return WebSettings( javascriptMode: javascriptMode, hasNavigationDelegate: hasNavigationDelegate, + hasProgressTracking: hasProgressTracking, debuggingEnabled: debuggingEnabled, userAgent: userAgent, ); @@ -454,6 +468,13 @@ class _PlatformCallbacksHandler implements WebViewPlatformCallbacksHandler { } } + @override + void onProgress(int progress) { + if (_widget.onProgress != null) { + _widget.onProgress(progress); + } + } + void _updateJavascriptChannelsFromSet(Set channels) { _javascriptChannels.clear(); if (channels == null) { diff --git a/packages/webview_flutter/test/webview_flutter_test.dart b/packages/webview_flutter/test/webview_flutter_test.dart index 5184ddd13de3..7f3698567a51 100644 --- a/packages/webview_flutter/test/webview_flutter_test.dart +++ b/packages/webview_flutter/test/webview_flutter_test.dart @@ -658,6 +658,62 @@ void main() { }); }); + group('$PageLoadingCallback', () { + testWidgets('onLoadingProgress is not null', (WidgetTester tester) async { + int loadingProgress; + + await tester.pumpWidget(WebView( + initialUrl: 'https://youtube.com', + onProgress: (int progress) { + loadingProgress = progress; + }, + )); + + final FakePlatformWebView platformWebView = + fakePlatformViewsController.lastCreatedView; + + platformWebView.fakeOnProgressCallback(50); + + expect(loadingProgress, 50); + }); + + testWidgets('onLoadingProgress is null', (WidgetTester tester) async { + await tester.pumpWidget(const WebView( + initialUrl: 'https://youtube.com', + onProgress: null, + )); + + final FakePlatformWebView platformWebView = + fakePlatformViewsController.lastCreatedView; + + // This is to test that it does not crash on a null callback. + platformWebView.fakeOnProgressCallback(50); + }); + + testWidgets('onLoadingProgress changed', (WidgetTester tester) async { + int loadingProgress; + + await tester.pumpWidget(WebView( + initialUrl: 'https://youtube.com', + onProgress: (int progress) {}, + )); + + await tester.pumpWidget(WebView( + initialUrl: 'https://youtube.com', + onProgress: (int progress) { + loadingProgress = progress; + }, + )); + + final FakePlatformWebView platformWebView = + fakePlatformViewsController.lastCreatedView; + + platformWebView.fakeOnProgressCallback(50); + + expect(loadingProgress, 50); + }); + }); + group('navigationDelegate', () { testWidgets('hasNavigationDelegate', (WidgetTester tester) async { await tester.pumpWidget(const WebView( @@ -986,6 +1042,24 @@ class FakePlatformWebView { ); } + void fakeOnProgressCallback(int progress) { + final StandardMethodCodec codec = const StandardMethodCodec(); + + final ByteData data = codec.encodeMethodCall(MethodCall( + 'onProgress', + {'progress': progress}, + )); + + // TODO(hterkelsen): Remove this when defaultBinaryMessages is in stable. + // https://github.com/flutter/flutter/issues/33446 + // ignore: deprecated_member_use + BinaryMessages.handlePlatformMessage( + channel.name, + data, + (ByteData data) {}, + ); + } + void _loadUrl(String url) { history = history.sublist(0, currentPosition + 1); history.add(url); From 704cc75093c1548045f322e2f7037cbc7f638caf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Je=CC=81re=CC=81mie=20Vincke?= Date: Fri, 4 Oct 2019 17:29:56 +0200 Subject: [PATCH 02/23] Updated changelog, bumped plugin version & fixed Dart analyzer --- packages/webview_flutter/CHANGELOG.md | 4 ++++ packages/webview_flutter/example/lib/main.dart | 2 +- packages/webview_flutter/pubspec.yaml | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/webview_flutter/CHANGELOG.md b/packages/webview_flutter/CHANGELOG.md index 98e312afd3a3..517aa5576298 100644 --- a/packages/webview_flutter/CHANGELOG.md +++ b/packages/webview_flutter/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.3.15 + +* Added loading progress tracking support. + ## 0.3.14+1 * Allow underscores anywhere for Javascript Channel name. diff --git a/packages/webview_flutter/example/lib/main.dart b/packages/webview_flutter/example/lib/main.dart index 7316808b7ab4..196ffeaf5d25 100644 --- a/packages/webview_flutter/example/lib/main.dart +++ b/packages/webview_flutter/example/lib/main.dart @@ -53,7 +53,7 @@ class _WebViewExampleState extends State { onWebViewCreated: (WebViewController webViewController) { _controller.complete(webViewController); }, - onProgress: (progress) { + onProgress: (int progress) { print("WebView is loading (progress : $progress%)"); }, // TODO(iskakaushik): Remove this when collection literals makes it to stable. diff --git a/packages/webview_flutter/pubspec.yaml b/packages/webview_flutter/pubspec.yaml index e5f39f14da87..c4dab3164486 100644 --- a/packages/webview_flutter/pubspec.yaml +++ b/packages/webview_flutter/pubspec.yaml @@ -1,6 +1,6 @@ name: webview_flutter description: A Flutter plugin that provides a WebView widget on Android and iOS. -version: 0.3.14+1 +version: 0.3.15 author: Flutter Team homepage: https://github.com/flutter/plugins/tree/master/packages/webview_flutter From 90b47c196003424e8465c7a3349f4fa1a9e451c8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Je=CC=81re=CC=81mie=20Vincke?= Date: Fri, 4 Oct 2019 17:42:30 +0200 Subject: [PATCH 03/23] Fixed formatting --- .../java/io/flutter/plugins/webviewflutter/FlutterWebView.java | 2 -- 1 file changed, 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 08d87c0e0c61..cccf02bf26d1 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 @@ -14,14 +14,12 @@ 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; import io.flutter.plugin.common.MethodChannel.MethodCallHandler; import io.flutter.plugin.common.MethodChannel.Result; import io.flutter.plugin.platform.PlatformView; - import java.util.Collections; import java.util.List; import java.util.Map; From a795c90dfbf3b0a221ece7c9394815dd894399b8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Je=CC=81re=CC=81mie=20Vincke?= Date: Fri, 4 Oct 2019 17:52:57 +0200 Subject: [PATCH 04/23] Fixed formatting for FlutterWebView & FlutterWebViewClient --- .../plugins/webviewflutter/FlutterWebView.java | 11 ++++++----- .../plugins/webviewflutter/FlutterWebViewClient.java | 1 - 2 files 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 cccf02bf26d1..8de9044d35df 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 @@ -258,11 +258,12 @@ private void applySettings(Map settings) { case "hasProgressTracking": final boolean progressTrackingEnabled = (boolean) settings.get(key); if (progressTrackingEnabled) { - webView.setWebChromeClient(new WebChromeClient() { - public void onProgressChanged(WebView view, int progress) { - flutterWebViewClient.onLoadingProgress(progress); - } - }); + webView.setWebChromeClient( + new WebChromeClient() { + public void onProgressChanged(WebView view, int progress) { + flutterWebViewClient.onLoadingProgress(progress); + } + }); } break; case "userAgent": diff --git a/packages/webview_flutter/android/src/main/java/io/flutter/plugins/webviewflutter/FlutterWebViewClient.java b/packages/webview_flutter/android/src/main/java/io/flutter/plugins/webviewflutter/FlutterWebViewClient.java index 90addbf81e05..dbaf6d139601 100644 --- a/packages/webview_flutter/android/src/main/java/io/flutter/plugins/webviewflutter/FlutterWebViewClient.java +++ b/packages/webview_flutter/android/src/main/java/io/flutter/plugins/webviewflutter/FlutterWebViewClient.java @@ -14,7 +14,6 @@ import androidx.annotation.NonNull; import androidx.webkit.WebViewClientCompat; import io.flutter.plugin.common.MethodChannel; - import java.util.HashMap; import java.util.Map; From a61883175424d7ef508ef66559b67479d4536135 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Je=CC=81re=CC=81mie=20Vincke?= Date: Fri, 4 Oct 2019 18:31:52 +0200 Subject: [PATCH 05/23] One more formatting pass --- .../ios/Classes/FLTWKNavigationDelegate.h | 2 +- .../ios/Classes/FLTWKProgressionDelegate.h | 4 +-- .../ios/Classes/FLTWKProgressionDelegate.m | 26 ++++++++++++------- .../ios/Classes/FlutterWebView.m | 3 ++- 4 files changed, 22 insertions(+), 13 deletions(-) diff --git a/packages/webview_flutter/ios/Classes/FLTWKNavigationDelegate.h b/packages/webview_flutter/ios/Classes/FLTWKNavigationDelegate.h index 1625c4999bd2..7df1f124f804 100644 --- a/packages/webview_flutter/ios/Classes/FLTWKNavigationDelegate.h +++ b/packages/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/ios/Classes/FLTWKProgressionDelegate.h b/packages/webview_flutter/ios/Classes/FLTWKProgressionDelegate.h index e84523e14ce0..9938160994c1 100644 --- a/packages/webview_flutter/ios/Classes/FLTWKProgressionDelegate.h +++ b/packages/webview_flutter/ios/Classes/FLTWKProgressionDelegate.h @@ -5,15 +5,15 @@ // Created by Jérémie Vincke on 03/10/2019. // -#import #import +#import #import NS_ASSUME_NONNULL_BEGIN @interface FLTWKProgressionDelegate : NSObject -- (instancetype)initWithWebView:(WKWebView *)webView channel:(FlutterMethodChannel*)channel; +- (instancetype)initWithWebView:(WKWebView *)webView channel:(FlutterMethodChannel *)channel; - (void)stopObservingProgress:(WKWebView *)webView; diff --git a/packages/webview_flutter/ios/Classes/FLTWKProgressionDelegate.m b/packages/webview_flutter/ios/Classes/FLTWKProgressionDelegate.m index d0e2222b7585..9b0464486f47 100644 --- a/packages/webview_flutter/ios/Classes/FLTWKProgressionDelegate.m +++ b/packages/webview_flutter/ios/Classes/FLTWKProgressionDelegate.m @@ -13,25 +13,33 @@ @implementation FLTWKProgressionDelegate { FlutterMethodChannel* _methodChannel; } -- (instancetype)initWithWebView:(WKWebView *)webView channel:(FlutterMethodChannel*)channel { +- (instancetype)initWithWebView:(WKWebView *)webView channel:(FlutterMethodChannel *)channel { self = [super init]; if (self) { _methodChannel = channel; - [webView addObserver:self forKeyPath:keyPath options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:nil]; + [webView addObserver:self + forKeyPath:keyPath + options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld + context:nil]; } return self; } -- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { +- (void)stopObservingProgress:(WKWebView *)webView { + [webView removeObserver:self forKeyPath:keyPath]; +} + +-(void)observeValueForKeyPath:(NSString *)keyPath + ofObject:(id)object + change:(NSDictionary *)change + context:(void *)context { if ([keyPath isEqualToString:keyPath]) { - NSNumber *newValue = change[NSKeyValueChangeNewKey] ?: 0; // newValue is anywhere between 0.0 and 1.0 + NSNumber *newValue = + change[NSKeyValueChangeNewKey] ?: 0; // newValue is anywhere between 0.0 and 1.0 int newValueAsInt = [newValue floatValue] * 100; // Anywhere between 0 and 100 - [_methodChannel invokeMethod:@"onProgress" arguments:@{@"progress" : [NSNumber numberWithInt:newValueAsInt]}]; + [_methodChannel invokeMethod:@"onProgress" + arguments:@{@"progress" : [NSNumber numberWithInt:newValueAsInt]}]; } } -- (void)stopObservingProgress:(WKWebView *)webView { - [webView removeObserver:self forKeyPath:keyPath]; -} - @end diff --git a/packages/webview_flutter/ios/Classes/FlutterWebView.m b/packages/webview_flutter/ios/Classes/FlutterWebView.m index d180649b1e46..df12ac6051df 100644 --- a/packages/webview_flutter/ios/Classes/FlutterWebView.m +++ b/packages/webview_flutter/ios/Classes/FlutterWebView.m @@ -267,7 +267,8 @@ - (NSString*)applySettings:(NSDictionary*)settings { NSNumber* hasProgressTrackingValue = settings[key]; bool hasProgressTracking = [hasProgressTrackingValue boolValue]; if (hasProgressTracking) { - _progressionDelegate = [[FLTWKProgressionDelegate alloc] initWithWebView: _webView channel:_channel]; + _progressionDelegate = [[FLTWKProgressionDelegate alloc] initWithWebView: _webView + channel:_channel]; } } else if ([key isEqualToString:@"debuggingEnabled"]) { // no-op debugging is always enabled on iOS. From e201d3c5e54d8da8ce97c323098b7b63bb952ba8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Je=CC=81re=CC=81mie=20Vincke?= Date: Fri, 4 Oct 2019 18:41:05 +0200 Subject: [PATCH 06/23] One more formatting pass --- .../ios/Classes/FLTWKProgressionDelegate.m | 10 +++++----- packages/webview_flutter/ios/Classes/FlutterWebView.m | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/packages/webview_flutter/ios/Classes/FLTWKProgressionDelegate.m b/packages/webview_flutter/ios/Classes/FLTWKProgressionDelegate.m index 9b0464486f47..4eb2faa7ddda 100644 --- a/packages/webview_flutter/ios/Classes/FLTWKProgressionDelegate.m +++ b/packages/webview_flutter/ios/Classes/FLTWKProgressionDelegate.m @@ -10,7 +10,7 @@ NSString *const keyPath = @"estimatedProgress"; @implementation FLTWKProgressionDelegate { - FlutterMethodChannel* _methodChannel; + FlutterMethodChannel *_methodChannel; } - (instancetype)initWithWebView:(WKWebView *)webView channel:(FlutterMethodChannel *)channel { @@ -29,10 +29,10 @@ - (void)stopObservingProgress:(WKWebView *)webView { [webView removeObserver:self forKeyPath:keyPath]; } --(void)observeValueForKeyPath:(NSString *)keyPath - ofObject:(id)object - change:(NSDictionary *)change - context:(void *)context { +- (void)observeValueForKeyPath:(NSString *)keyPath + ofObject:(id)object + change:(NSDictionary *)change + context:(void *)context { if ([keyPath isEqualToString:keyPath]) { NSNumber *newValue = change[NSKeyValueChangeNewKey] ?: 0; // newValue is anywhere between 0.0 and 1.0 diff --git a/packages/webview_flutter/ios/Classes/FlutterWebView.m b/packages/webview_flutter/ios/Classes/FlutterWebView.m index df12ac6051df..eeb77950e8c3 100644 --- a/packages/webview_flutter/ios/Classes/FlutterWebView.m +++ b/packages/webview_flutter/ios/Classes/FlutterWebView.m @@ -56,7 +56,7 @@ - (instancetype)initWithFrame:(CGRect)frame NSString* channelName = [NSString stringWithFormat:@"plugins.flutter.io/webview_%lld", viewId]; _channel = [FlutterMethodChannel methodChannelWithName:channelName binaryMessenger:messenger]; _javaScriptChannelNames = [[NSMutableSet alloc] init]; - + WKUserContentController* userContentController = [[WKUserContentController alloc] init]; if ([args[@"javascriptChannelNames"] isKindOfClass:[NSArray class]]) { NSArray* javaScriptChannelNames = args[@"javascriptChannelNames"]; @@ -267,7 +267,7 @@ - (NSString*)applySettings:(NSDictionary*)settings { NSNumber* hasProgressTrackingValue = settings[key]; bool hasProgressTracking = [hasProgressTrackingValue boolValue]; if (hasProgressTracking) { - _progressionDelegate = [[FLTWKProgressionDelegate alloc] initWithWebView: _webView + _progressionDelegate = [[FLTWKProgressionDelegate alloc] initWithWebView:_webView channel:_channel]; } } else if ([key isEqualToString:@"debuggingEnabled"]) { From 5cd61b2a24d01d5b7845f526db4a480be5e0f13c Mon Sep 17 00:00:00 2001 From: jeremie-movify <40164740+jeremie-movify@users.noreply.github.com> Date: Tue, 28 Jan 2020 16:17:40 +0100 Subject: [PATCH 07/23] Update FLTWKNavigationDelegate.h --- packages/webview_flutter/ios/Classes/FLTWKNavigationDelegate.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/webview_flutter/ios/Classes/FLTWKNavigationDelegate.h b/packages/webview_flutter/ios/Classes/FLTWKNavigationDelegate.h index 7df1f124f804..1625c4999bd2 100644 --- a/packages/webview_flutter/ios/Classes/FLTWKNavigationDelegate.h +++ b/packages/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. From f153499c646ec1b07030272a7fcd434d76f2f10a Mon Sep 17 00:00:00 2001 From: jeremie-movify <40164740+jeremie-movify@users.noreply.github.com> Date: Tue, 28 Jan 2020 16:18:50 +0100 Subject: [PATCH 08/23] Update pubspec.yaml --- packages/webview_flutter/pubspec.yaml | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/webview_flutter/pubspec.yaml b/packages/webview_flutter/pubspec.yaml index 934505e412c3..e7003c62f066 100644 --- a/packages/webview_flutter/pubspec.yaml +++ b/packages/webview_flutter/pubspec.yaml @@ -1,6 +1,5 @@ name: webview_flutter description: A Flutter plugin that provides a WebView widget on Android and iOS. -author: Flutter Team version: 0.3.20 homepage: https://github.com/flutter/plugins/tree/master/packages/webview_flutter From 19d697edfe37019611d8d10de70d23299d7cef38 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Je=CC=81re=CC=81mie=20Vincke?= Date: Mon, 2 Mar 2020 09:58:25 +0100 Subject: [PATCH 09/23] Added missing null return --- packages/webview_flutter/lib/src/webview_method_channel.dart | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/webview_flutter/lib/src/webview_method_channel.dart b/packages/webview_flutter/lib/src/webview_method_channel.dart index 8ea158fabf45..705c80742268 100644 --- a/packages/webview_flutter/lib/src/webview_method_channel.dart +++ b/packages/webview_flutter/lib/src/webview_method_channel.dart @@ -42,6 +42,7 @@ class MethodChannelWebViewPlatform implements WebViewPlatformController { return null; case 'onProgress': _platformCallbacksHandler.onProgress(call.arguments['progress']); + return null; case 'onPageStarted': _platformCallbacksHandler.onPageStarted(call.arguments['url']); return null; From 677bad9c7906cbfbb02dcfb7c5e57e543f7799fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Je=CC=81re=CC=81mie=20Vincke?= Date: Wed, 6 May 2020 11:00:09 +0200 Subject: [PATCH 10/23] Trigger checks From 07ab3229f246aac7d86b60a736a437b4acfa942e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Je=CC=81re=CC=81mie=20Vincke?= Date: Thu, 10 Sep 2020 10:07:51 +0200 Subject: [PATCH 11/23] Improvements based on @cyanglaz's feedback --- packages/webview_flutter/CHANGELOG.md | 1 - .../flutter/plugins/webviewflutter/FlutterWebView.java | 1 - .../ios/Classes/FLTWKProgressionDelegate.h | 9 +++------ .../ios/Classes/FLTWKProgressionDelegate.m | 9 +++------ packages/webview_flutter/lib/platform_interface.dart | 2 ++ 5 files changed, 8 insertions(+), 14 deletions(-) diff --git a/packages/webview_flutter/CHANGELOG.md b/packages/webview_flutter/CHANGELOG.md index 9b1f11b8f094..d180e327916f 100644 --- a/packages/webview_flutter/CHANGELOG.md +++ b/packages/webview_flutter/CHANGELOG.md @@ -40,7 +40,6 @@ * Remove example app's iOS workspace settings. - ## 0.3.19+8 * Make the pedantic dev_dependency explicit. 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 773202abb034..8942781817f3 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 @@ -308,7 +308,6 @@ private void applySettings(Map settings) { flutterWebViewClient.createWebViewClient(hasNavigationDelegate); webView.setWebViewClient(webViewClient); - break; case "debuggingEnabled": final boolean debuggingEnabled = (boolean) settings.get(key); diff --git a/packages/webview_flutter/ios/Classes/FLTWKProgressionDelegate.h b/packages/webview_flutter/ios/Classes/FLTWKProgressionDelegate.h index 9938160994c1..40139ead262c 100644 --- a/packages/webview_flutter/ios/Classes/FLTWKProgressionDelegate.h +++ b/packages/webview_flutter/ios/Classes/FLTWKProgressionDelegate.h @@ -1,9 +1,6 @@ -// -// FLTWKProgressionDelegate.h -// webview_flutter -// -// Created by Jérémie Vincke on 03/10/2019. -// +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. #import #import diff --git a/packages/webview_flutter/ios/Classes/FLTWKProgressionDelegate.m b/packages/webview_flutter/ios/Classes/FLTWKProgressionDelegate.m index 4eb2faa7ddda..a30757e967eb 100644 --- a/packages/webview_flutter/ios/Classes/FLTWKProgressionDelegate.m +++ b/packages/webview_flutter/ios/Classes/FLTWKProgressionDelegate.m @@ -1,9 +1,6 @@ -// -// FLTWKProgressionDelegate.m -// webview_flutter -// -// Created by Jérémie Vincke on 03/10/2019. -// +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. #import "FLTWKProgressionDelegate.h" diff --git a/packages/webview_flutter/lib/platform_interface.dart b/packages/webview_flutter/lib/platform_interface.dart index 17d330819523..da2205fd6c3e 100644 --- a/packages/webview_flutter/lib/platform_interface.dart +++ b/packages/webview_flutter/lib/platform_interface.dart @@ -30,6 +30,7 @@ abstract class WebViewPlatformCallbacksHandler { void onPageFinished(String url); /// Invoked by [WebViewPlatformController] when a page is loading. + /// /// Only works when [WebSettings.hasProgressTracking] is set to `true`. void onProgress(int progress); /// Report web resource loading error to the host application. @@ -396,6 +397,7 @@ class WebSettings { final bool hasNavigationDelegate; /// Whether the [WebView] should track page loading progress. + /// See also: [WebViewPlatformCallbacksHandler.onProgress] to get the progress. final bool hasProgressTracking; /// Whether to enable the platform's webview content debugging tools. From f3de98b9111ab7403a978bad9f828e4d1293208d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Je=CC=81re=CC=81mie=20Vincke?= Date: Thu, 10 Sep 2020 10:16:25 +0200 Subject: [PATCH 12/23] Only observe newValues on webView's 'estimatedProgress' keyPath --- packages/webview_flutter/ios/Classes/FLTWKProgressionDelegate.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/webview_flutter/ios/Classes/FLTWKProgressionDelegate.m b/packages/webview_flutter/ios/Classes/FLTWKProgressionDelegate.m index a30757e967eb..0aaeafa3f0c6 100644 --- a/packages/webview_flutter/ios/Classes/FLTWKProgressionDelegate.m +++ b/packages/webview_flutter/ios/Classes/FLTWKProgressionDelegate.m @@ -16,7 +16,7 @@ - (instancetype)initWithWebView:(WKWebView *)webView channel:(FlutterMethodChann _methodChannel = channel; [webView addObserver:self forKeyPath:keyPath - options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld + options:NSKeyValueObservingOptionNew context:nil]; } return self; From 76e2d768fedc66152d09ed7f2e7110c7b018aac3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Je=CC=81re=CC=81mie=20Vincke?= Date: Fri, 11 Sep 2020 11:40:03 +0200 Subject: [PATCH 13/23] Fixed formatting --- .../webview_flutter/ios/Classes/FLTWKProgressionDelegate.m | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/packages/webview_flutter/ios/Classes/FLTWKProgressionDelegate.m b/packages/webview_flutter/ios/Classes/FLTWKProgressionDelegate.m index 0aaeafa3f0c6..aecbcb8d31a0 100644 --- a/packages/webview_flutter/ios/Classes/FLTWKProgressionDelegate.m +++ b/packages/webview_flutter/ios/Classes/FLTWKProgressionDelegate.m @@ -14,10 +14,7 @@ - (instancetype)initWithWebView:(WKWebView *)webView channel:(FlutterMethodChann self = [super init]; if (self) { _methodChannel = channel; - [webView addObserver:self - forKeyPath:keyPath - options:NSKeyValueObservingOptionNew - context:nil]; + [webView addObserver:self forKeyPath:keyPath options:NSKeyValueObservingOptionNew context:nil]; } return self; } From a778bf3a04401c77482c64c0d3ce3a2972f36cd5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Je=CC=81re=CC=81mie=20Vincke?= Date: Mon, 14 Sep 2020 17:01:25 +0200 Subject: [PATCH 14/23] Updated keyPath constant name to FLTWKEstimatedProgressKeyPath --- .../ios/Classes/FLTWKProgressionDelegate.m | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/webview_flutter/ios/Classes/FLTWKProgressionDelegate.m b/packages/webview_flutter/ios/Classes/FLTWKProgressionDelegate.m index aecbcb8d31a0..79ed4f3b1af2 100644 --- a/packages/webview_flutter/ios/Classes/FLTWKProgressionDelegate.m +++ b/packages/webview_flutter/ios/Classes/FLTWKProgressionDelegate.m @@ -4,7 +4,7 @@ #import "FLTWKProgressionDelegate.h" -NSString *const keyPath = @"estimatedProgress"; +NSString *const FLTWKEstimatedProgressKeyPath = @"estimatedProgress"; @implementation FLTWKProgressionDelegate { FlutterMethodChannel *_methodChannel; @@ -14,20 +14,20 @@ - (instancetype)initWithWebView:(WKWebView *)webView channel:(FlutterMethodChann self = [super init]; if (self) { _methodChannel = channel; - [webView addObserver:self forKeyPath:keyPath options:NSKeyValueObservingOptionNew context:nil]; + [webView addObserver:self forKeyPath:FLTWKEstimatedProgressKeyPath options:NSKeyValueObservingOptionNew context:nil]; } return self; } - (void)stopObservingProgress:(WKWebView *)webView { - [webView removeObserver:self forKeyPath:keyPath]; + [webView removeObserver:self forKeyPath:FLTWKEstimatedProgressKeyPath]; } - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { - if ([keyPath isEqualToString:keyPath]) { + if ([keyPath isEqualToString:FLTWKEstimatedProgressKeyPath]) { NSNumber *newValue = change[NSKeyValueChangeNewKey] ?: 0; // newValue is anywhere between 0.0 and 1.0 int newValueAsInt = [newValue floatValue] * 100; // Anywhere between 0 and 100 From 0090288c677deababa911350da0a730b64632829 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Je=CC=81re=CC=81mie=20Vincke?= Date: Mon, 14 Sep 2020 17:56:49 +0200 Subject: [PATCH 15/23] Fixed formatting --- .../webview_flutter/ios/Classes/FLTWKProgressionDelegate.m | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/webview_flutter/ios/Classes/FLTWKProgressionDelegate.m b/packages/webview_flutter/ios/Classes/FLTWKProgressionDelegate.m index 79ed4f3b1af2..ad864e6e1fd1 100644 --- a/packages/webview_flutter/ios/Classes/FLTWKProgressionDelegate.m +++ b/packages/webview_flutter/ios/Classes/FLTWKProgressionDelegate.m @@ -14,7 +14,10 @@ - (instancetype)initWithWebView:(WKWebView *)webView channel:(FlutterMethodChann self = [super init]; if (self) { _methodChannel = channel; - [webView addObserver:self forKeyPath:FLTWKEstimatedProgressKeyPath options:NSKeyValueObservingOptionNew context:nil]; + [webView addObserver:self + forKeyPath:FLTWKEstimatedProgressKeyPath + options:NSKeyValueObservingOptionNew + context:nil]; } return self; } From a706d3e670c51e6e6a9e78bfd7e950d1b61c712b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Je=CC=81re=CC=81mie=20Vincke?= Date: Tue, 22 Sep 2020 17:01:24 +0200 Subject: [PATCH 16/23] Fixed formatting --- .../java/io/flutter/plugins/webviewflutter/FlutterWebView.java | 1 - 1 file changed, 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 df6e86fdfe58..93051c62847d 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 @@ -20,7 +20,6 @@ import io.flutter.plugin.common.MethodChannel.MethodCallHandler; import io.flutter.plugin.common.MethodChannel.Result; import io.flutter.plugin.platform.PlatformView; - import java.util.Collections; import java.util.List; import java.util.Map; From 069af29c3c610a0c78ad1583ce755c4558ca8e5d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Je=CC=81re=CC=81mie=20Vincke?= Date: Tue, 12 Jan 2021 16:28:21 +0100 Subject: [PATCH 17/23] Fixed hasProgressTracking nullability --- packages/webview_flutter/lib/platform_interface.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/webview_flutter/lib/platform_interface.dart b/packages/webview_flutter/lib/platform_interface.dart index 72ff2b97df7e..16b529d7090e 100644 --- a/packages/webview_flutter/lib/platform_interface.dart +++ b/packages/webview_flutter/lib/platform_interface.dart @@ -407,7 +407,7 @@ class WebSettings { /// Whether the [WebView] should track page loading progress. /// See also: [WebViewPlatformCallbacksHandler.onProgress] to get the progress. - final bool hasProgressTracking; + final bool? hasProgressTracking; /// Whether to enable the platform's webview content debugging tools. /// From 6fa576d041cfe1cc955c10753586dc41b428e425 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Je=CC=81re=CC=81mie=20Vincke?= Date: Tue, 12 Jan 2021 17:05:46 +0100 Subject: [PATCH 18/23] Nullability fixes --- packages/webview_flutter/lib/webview_flutter.dart | 2 +- .../webview_flutter/test/webview_flutter_test.dart | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/packages/webview_flutter/lib/webview_flutter.dart b/packages/webview_flutter/lib/webview_flutter.dart index a8dee37814e3..072cf0db48d9 100644 --- a/packages/webview_flutter/lib/webview_flutter.dart +++ b/packages/webview_flutter/lib/webview_flutter.dart @@ -362,7 +362,7 @@ class WebView extends StatefulWidget { final PageFinishedCallback? onPageFinished; /// Invoked when a page is loading. - final PageLoadingCallback onProgress; + final PageLoadingCallback? onProgress; /// Invoked when a web resource has failed to load. /// diff --git a/packages/webview_flutter/test/webview_flutter_test.dart b/packages/webview_flutter/test/webview_flutter_test.dart index 15077675b005..bc48d200fed7 100644 --- a/packages/webview_flutter/test/webview_flutter_test.dart +++ b/packages/webview_flutter/test/webview_flutter_test.dart @@ -694,7 +694,7 @@ void main() { group('$PageLoadingCallback', () { testWidgets('onLoadingProgress is not null', (WidgetTester tester) async { - int loadingProgress; + int? loadingProgress; await tester.pumpWidget(WebView( initialUrl: 'https://youtube.com', @@ -703,10 +703,10 @@ void main() { }, )); - final FakePlatformWebView platformWebView = + final FakePlatformWebView? platformWebView = fakePlatformViewsController.lastCreatedView; - platformWebView.fakeOnProgressCallback(50); + platformWebView?.fakeOnProgressCallback(50); expect(loadingProgress, 50); }); @@ -718,14 +718,14 @@ void main() { )); final FakePlatformWebView platformWebView = - fakePlatformViewsController.lastCreatedView; + fakePlatformViewsController.lastCreatedView!; // This is to test that it does not crash on a null callback. platformWebView.fakeOnProgressCallback(50); }); testWidgets('onLoadingProgress changed', (WidgetTester tester) async { - int loadingProgress; + int? loadingProgress; await tester.pumpWidget(WebView( initialUrl: 'https://youtube.com', @@ -740,7 +740,7 @@ void main() { )); final FakePlatformWebView platformWebView = - fakePlatformViewsController.lastCreatedView; + fakePlatformViewsController.lastCreatedView!; platformWebView.fakeOnProgressCallback(50); From 7d7c4006daa413d32f5fe7ee9ceba9ac55f74a90 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Je=CC=81re=CC=81mie=20Vincke?= Date: Tue, 12 Jan 2021 17:20:49 +0100 Subject: [PATCH 19/23] One more --- packages/webview_flutter/lib/webview_flutter.dart | 2 +- .../webview_flutter/test/webview_flutter_test.dart | 10 ++-------- 2 files changed, 3 insertions(+), 9 deletions(-) diff --git a/packages/webview_flutter/lib/webview_flutter.dart b/packages/webview_flutter/lib/webview_flutter.dart index 072cf0db48d9..7e4f3d6ac079 100644 --- a/packages/webview_flutter/lib/webview_flutter.dart +++ b/packages/webview_flutter/lib/webview_flutter.dart @@ -587,7 +587,7 @@ class _PlatformCallbacksHandler implements WebViewPlatformCallbacksHandler { @override void onProgress(int progress) { if (_widget.onProgress != null) { - _widget.onProgress(progress); + _widget.onProgress!(progress); } } diff --git a/packages/webview_flutter/test/webview_flutter_test.dart b/packages/webview_flutter/test/webview_flutter_test.dart index bc48d200fed7..8ae6e625431d 100644 --- a/packages/webview_flutter/test/webview_flutter_test.dart +++ b/packages/webview_flutter/test/webview_flutter_test.dart @@ -1085,14 +1085,8 @@ class FakePlatformWebView { {'progress': progress}, )); - // TODO(hterkelsen): Remove this when defaultBinaryMessages is in stable. - // https://github.com/flutter/flutter/issues/33446 - // ignore: deprecated_member_use - BinaryMessages.handlePlatformMessage( - channel.name, - data, - (ByteData data) {}, - ); + ServicesBinding.instance!.defaultBinaryMessenger + .handlePlatformMessage(channel.name, data, (ByteData? data) {}); } void _loadUrl(String? url) { From 11e6ade97e2c978a09ed2e1a2376fb8e976df73d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Je=CC=81re=CC=81mie=20Vincke?= Date: Thu, 14 Jan 2021 12:24:52 +0100 Subject: [PATCH 20/23] Fixed imports --- .../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 ea7764512e57..a6b60348124d 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 @@ -9,8 +9,10 @@ import android.hardware.display.DisplayManager; import android.os.Build; import android.os.Handler; +import android.os.Message; import android.view.View; import android.webkit.WebChromeClient; +import android.webkit.WebResourceRequest; import android.webkit.WebStorage; import android.webkit.WebView; import android.webkit.WebViewClient; From 16c7d33a134eefbe0b01fdf4e70c888228483385 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Je=CC=81re=CC=81mie=20Vincke?= Date: Fri, 15 Jan 2021 16:55:45 +0100 Subject: [PATCH 21/23] Trigger checks From 73d09beb0af08dc0c9c33dbfa67f9ce4fcfed41f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Je=CC=81re=CC=81mie=20Vincke?= Date: Mon, 18 Jan 2021 08:43:25 +0100 Subject: [PATCH 22/23] Imported androidx.annotation.NonNull to fix apk build on cirrus --- .../java/io/flutter/plugins/webviewflutter/FlutterWebView.java | 1 + 1 file changed, 1 insertion(+) 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 a6b60348124d..f2b468db12db 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 @@ -16,6 +16,7 @@ import android.webkit.WebStorage; import android.webkit.WebView; import android.webkit.WebViewClient; +import androidx.annotation.NonNull; import io.flutter.plugin.common.BinaryMessenger; import io.flutter.plugin.common.MethodCall; import io.flutter.plugin.common.MethodChannel; From 6cc00fc45613dc2dd2e30586f4df240ee6b5535b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Je=CC=81re=CC=81mie=20Vincke?= Date: Wed, 17 Feb 2021 08:40:42 +0100 Subject: [PATCH 23/23] PR remarks: Android: improved progress tracking setup & reused existing WebChromeClient --- .../plugins/webviewflutter/FlutterWebView.java | 16 +++++++--------- .../webviewflutter/FlutterWebViewClient.java | 10 ++++++---- packages/webview_flutter/example/lib/main.dart | 2 -- 3 files changed, 13 insertions(+), 15 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 f2b468db12db..4578c7e0d1fe 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 @@ -72,6 +72,11 @@ public boolean shouldOverrideUrlLoading(WebView view, String url) { return true; } + + @Override + public void onProgressChanged(WebView view, int progress) { + flutterWebViewClient.onLoadingProgress(progress); + } } @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1) @@ -368,15 +373,8 @@ private void applySettings(Map settings) { } break; case "hasProgressTracking": - final boolean progressTrackingEnabled = (boolean) settings.get(key); - if (progressTrackingEnabled) { - webView.setWebChromeClient( - new WebChromeClient() { - public void onProgressChanged(WebView view, int progress) { - flutterWebViewClient.onLoadingProgress(progress); - } - }); - } + flutterWebViewClient.hasProgressTracking = (boolean) settings.get(key); + break; case "gestureNavigationEnabled": break; case "userAgent": diff --git a/packages/webview_flutter/android/src/main/java/io/flutter/plugins/webviewflutter/FlutterWebViewClient.java b/packages/webview_flutter/android/src/main/java/io/flutter/plugins/webviewflutter/FlutterWebViewClient.java index 684bc5a7b3c5..3590d67eb334 100644 --- a/packages/webview_flutter/android/src/main/java/io/flutter/plugins/webviewflutter/FlutterWebViewClient.java +++ b/packages/webview_flutter/android/src/main/java/io/flutter/plugins/webviewflutter/FlutterWebViewClient.java @@ -30,7 +30,7 @@ class FlutterWebViewClient { private static final String TAG = "FlutterWebViewClient"; private final MethodChannel methodChannel; private boolean hasNavigationDelegate; - private boolean hasProgressTracking; + boolean hasProgressTracking; FlutterWebViewClient(MethodChannel methodChannel) { this.methodChannel = methodChannel; @@ -127,9 +127,11 @@ private void onPageFinished(WebView view, String url) { } void onLoadingProgress(int progress) { - Map args = new HashMap<>(); - args.put("progress", progress); - methodChannel.invokeMethod("onProgress", args); + if (hasProgressTracking) { + Map args = new HashMap<>(); + args.put("progress", progress); + methodChannel.invokeMethod("onProgress", args); + } } private void onWebResourceError( diff --git a/packages/webview_flutter/example/lib/main.dart b/packages/webview_flutter/example/lib/main.dart index df523bbe36c5..e7e7981150ca 100644 --- a/packages/webview_flutter/example/lib/main.dart +++ b/packages/webview_flutter/example/lib/main.dart @@ -65,8 +65,6 @@ class _WebViewExampleState extends State { onProgress: (int progress) { print("WebView is loading (progress : $progress%)"); }, - // TODO(iskakaushik): Remove this when collection literals makes it to stable. - // ignore: prefer_collection_literals javascriptChannels: { _toasterJavascriptChannel(context), },