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/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..e07595f0cc7f 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,14 @@ class CreationParams { /// Which restrictions apply on automatic media playback. final AutoMediaPlaybackPolicy autoMediaPlaybackPolicy; + /// The value if it allows file access. + /// + /// This setting only applies to Android + 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..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)); @@ -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,11 @@ 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. + /// + /// This setting only applies to Android + final bool? allowFileAccess; + @override State createState() => _WebViewState(); } @@ -479,6 +485,7 @@ CreationParams _creationParamsfromWidget(WebView widget) { javascriptChannelNames: _extractChannelNames(widget.javascriptChannels), userAgent: widget.userAgent, autoMediaPlaybackPolicy: widget.initialMediaPlaybackPolicy, + allowFileAccess: widget.allowFileAccess, ); } 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" 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) {