From ba6482bdbb1177cdc68ee00474679b8c64166235 Mon Sep 17 00:00:00 2001 From: Douglas Iacovelli Date: Thu, 8 Apr 2021 17:45:48 -0300 Subject: [PATCH 1/4] add allowFileAccess for android --- .../io/flutter/plugins/webviewflutter/FlutterWebView.java | 4 ++++ packages/webview_flutter/lib/platform_interface.dart | 6 +++++- .../webview_flutter/lib/src/webview_method_channel.dart | 1 + packages/webview_flutter/lib/webview_flutter.dart | 5 +++++ 4 files changed, 15 insertions(+), 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 ebc7c31987f4..b2ecea2c4a22 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 @@ -132,6 +132,10 @@ public void onProgressChanged(WebView view, int progress) { String url = (String) params.get("initialUrl"); webView.loadUrl(url); } + + if (params.containsKey("allowFileAccess") && params.get("allowFileAccess") != null) { + webView.getSettings().setAllowFileAccess((boolean) params.get("allowFileAccess")); + } } @Override diff --git a/packages/webview_flutter/lib/platform_interface.dart b/packages/webview_flutter/lib/platform_interface.dart index 92aa87b7480f..8bab8ca64b73 100644 --- a/packages/webview_flutter/lib/platform_interface.dart +++ b/packages/webview_flutter/lib/platform_interface.dart @@ -455,6 +455,7 @@ class CreationParams { this.userAgent, this.autoMediaPlaybackPolicy = AutoMediaPlaybackPolicy.require_user_action_for_all_media_types, + this.allowFileAccess, }) : assert(autoMediaPlaybackPolicy != null); /// The initialUrl to load in the webview. @@ -488,9 +489,12 @@ class CreationParams { /// Which restrictions apply on automatic media playback. final AutoMediaPlaybackPolicy autoMediaPlaybackPolicy; + /// The value if it allows file access. + final bool? allowFileAccess; + @override String toString() { - return '$runtimeType(initialUrl: $initialUrl, settings: $webSettings, javascriptChannelNames: $javascriptChannelNames, UserAgent: $userAgent)'; + return '$runtimeType(initialUrl: $initialUrl, settings: $webSettings, javascriptChannelNames: $javascriptChannelNames, UserAgent: $userAgent, allowFileAccess: $allowFileAccess)'; } } diff --git a/packages/webview_flutter/lib/src/webview_method_channel.dart b/packages/webview_flutter/lib/src/webview_method_channel.dart index 05831a9d8794..242561bae90a 100644 --- a/packages/webview_flutter/lib/src/webview_method_channel.dart +++ b/packages/webview_flutter/lib/src/webview_method_channel.dart @@ -211,6 +211,7 @@ class MethodChannelWebViewPlatform implements WebViewPlatformController { 'userAgent': creationParams.userAgent, 'autoMediaPlaybackPolicy': creationParams.autoMediaPlaybackPolicy.index, 'usesHybridComposition': usesHybridComposition, + 'allowFileAccess': creationParams.allowFileAccess, }; } } diff --git a/packages/webview_flutter/lib/webview_flutter.dart b/packages/webview_flutter/lib/webview_flutter.dart index 92ff8e00a50e..c2f0e1c7940e 100644 --- a/packages/webview_flutter/lib/webview_flutter.dart +++ b/packages/webview_flutter/lib/webview_flutter.dart @@ -231,6 +231,7 @@ class WebView extends StatefulWidget { this.initialMediaPlaybackPolicy = AutoMediaPlaybackPolicy.require_user_action_for_all_media_types, this.allowsInlineMediaPlayback = false, + this.allowFileAccess, }) : assert(javascriptMode != null), assert(initialMediaPlaybackPolicy != null), assert(allowsInlineMediaPlayback != null), @@ -415,6 +416,9 @@ class WebView extends StatefulWidget { /// The default policy is [AutoMediaPlaybackPolicy.require_user_action_for_all_media_types]. final AutoMediaPlaybackPolicy initialMediaPlaybackPolicy; + /// The value if it allows file access. + final bool? allowFileAccess; + @override State createState() => _WebViewState(); } @@ -479,6 +483,7 @@ CreationParams _creationParamsfromWidget(WebView widget) { javascriptChannelNames: _extractChannelNames(widget.javascriptChannels), userAgent: widget.userAgent, autoMediaPlaybackPolicy: widget.initialMediaPlaybackPolicy, + allowFileAccess: widget.allowFileAccess, ); } From b20f9d971431262287925b3ac313f5eaea46418d Mon Sep 17 00:00:00 2001 From: Douglas Iacovelli Date: Fri, 9 Apr 2021 09:13:37 -0300 Subject: [PATCH 2/4] add tests for allowFileAccess --- .../webview_flutter/lib/platform_interface.dart | 2 ++ .../webview_flutter/lib/webview_flutter.dart | 2 ++ .../test/webview_flutter_test.dart | 17 +++++++++++++++++ 3 files changed, 21 insertions(+) diff --git a/packages/webview_flutter/lib/platform_interface.dart b/packages/webview_flutter/lib/platform_interface.dart index 8bab8ca64b73..e07595f0cc7f 100644 --- a/packages/webview_flutter/lib/platform_interface.dart +++ b/packages/webview_flutter/lib/platform_interface.dart @@ -490,6 +490,8 @@ class CreationParams { final AutoMediaPlaybackPolicy autoMediaPlaybackPolicy; /// The value if it allows file access. + /// + /// This setting only applies to Android final bool? allowFileAccess; @override diff --git a/packages/webview_flutter/lib/webview_flutter.dart b/packages/webview_flutter/lib/webview_flutter.dart index c2f0e1c7940e..e1d423aae60f 100644 --- a/packages/webview_flutter/lib/webview_flutter.dart +++ b/packages/webview_flutter/lib/webview_flutter.dart @@ -417,6 +417,8 @@ class WebView extends StatefulWidget { final AutoMediaPlaybackPolicy initialMediaPlaybackPolicy; /// The value if it allows file access. + /// + /// This setting only applies to Android final bool? allowFileAccess; @override diff --git a/packages/webview_flutter/test/webview_flutter_test.dart b/packages/webview_flutter/test/webview_flutter_test.dart index 4360484408b5..e7634ff4aa1f 100644 --- a/packages/webview_flutter/test/webview_flutter_test.dart +++ b/packages/webview_flutter/test/webview_flutter_test.dart @@ -920,6 +920,19 @@ void main() { expect(platformWebView.userAgent, 'UA'); }); + + testWidgets('Set allowFileAccess', (WidgetTester tester) async { + await tester.pumpWidget(const WebView( + initialUrl: 'https://youtube.com', + javascriptMode: JavascriptMode.unrestricted, + allowFileAccess: true, + )); + + final FakePlatformWebView platformWebView = + fakePlatformViewsController.lastCreatedView!; + + expect(platformWebView.allowFileAccess, true); + }); } class FakePlatformWebView { @@ -935,6 +948,9 @@ class FakePlatformWebView { javascriptChannelNames = List.from(params['javascriptChannelNames']); } + if (params.containsKey('allowFileAccess')) { + allowFileAccess = params['allowFileAccess']; + } javascriptMode = JavascriptMode.values[params['settings']['jsMode']]; hasNavigationDelegate = params['settings']['hasNavigationDelegate'] ?? false; @@ -959,6 +975,7 @@ class FakePlatformWebView { bool? hasNavigationDelegate; bool? debuggingEnabled; String? userAgent; + bool? allowFileAccess; Future onMethodCall(MethodCall call) { switch (call.method) { From 00899566f37a3e81b5f7b992aec049c01b194859 Mon Sep 17 00:00:00 2001 From: Douglas Iacovelli Date: Fri, 9 Apr 2021 09:22:53 -0300 Subject: [PATCH 3/4] update pubspec.yml and changelog --- packages/webview_flutter/CHANGELOG.md | 3 +++ packages/webview_flutter/pubspec.yaml | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/webview_flutter/CHANGELOG.md b/packages/webview_flutter/CHANGELOG.md index 85767577c403..21d9bfeeeec0 100644 --- a/packages/webview_flutter/CHANGELOG.md +++ b/packages/webview_flutter/CHANGELOG.md @@ -1,3 +1,6 @@ +## 2.1.0 +* Export Android WebView configuration: `allowFileAccess` + ## 2.0.4 * Fix a bug where `allowsInlineMediaPlayback` is not respected on iOS. diff --git a/packages/webview_flutter/pubspec.yaml b/packages/webview_flutter/pubspec.yaml index f4fb0efe83e2..142fb7f56a25 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.4 +version: 2.1.0 environment: sdk: ">=2.12.0-259.9.beta <3.0.0" From 9024d6c6f9c445ef54fe1a042cc75d76fa90b95b Mon Sep 17 00:00:00 2001 From: Douglas Iacovelli Date: Fri, 9 Apr 2021 10:00:57 -0300 Subject: [PATCH 4/4] fix formatting --- packages/webview_flutter/lib/webview_flutter.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/webview_flutter/lib/webview_flutter.dart b/packages/webview_flutter/lib/webview_flutter.dart index e1d423aae60f..c17b491ce54b 100644 --- a/packages/webview_flutter/lib/webview_flutter.dart +++ b/packages/webview_flutter/lib/webview_flutter.dart @@ -180,7 +180,7 @@ class JavascriptChannel { JavascriptChannel({ required this.name, required this.onMessageReceived, - }) : assert(name != null), + }) : assert(name != null), assert(onMessageReceived != null), assert(_validChannelNames.hasMatch(name));