From 800ec2bac7775f319a88c6752f96cee27a57107d Mon Sep 17 00:00:00 2001 From: Maurice Parrish <10687576+bparrishMines@users.noreply.github.com> Date: Thu, 20 Apr 2023 10:24:12 -0400 Subject: [PATCH 1/4] interface commit --- .../CHANGELOG.md | 5 + .../lib/src/platform_navigation_delegate.dart | 1 + .../lib/src/platform_webview_controller.dart | 11 +++ .../src/platform_webview_cookie_manager.dart | 1 + .../lib/src/platform_webview_widget.dart | 1 + .../platform_webview_permission_request.dart | 98 +++++++++++++++++++ .../lib/src/types/types.dart | 1 + .../lib/src/webview_platform.dart | 2 - .../platform_webview_controller_test.dart | 13 +++ ...latform_webview_controller_test.mocks.dart | 3 +- 10 files changed, 132 insertions(+), 4 deletions(-) create mode 100644 packages/webview_flutter/webview_flutter_platform_interface/lib/src/types/platform_webview_permission_request.dart diff --git a/packages/webview_flutter/webview_flutter_platform_interface/CHANGELOG.md b/packages/webview_flutter/webview_flutter_platform_interface/CHANGELOG.md index 0d90e0c2f50..af8135f270b 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/CHANGELOG.md +++ b/packages/webview_flutter/webview_flutter_platform_interface/CHANGELOG.md @@ -1,3 +1,8 @@ +## 2.3.0 + +* Adds support to receive permission requests. See + `PlatformWebViewController.setOnPlatformPermissionRequest`. + ## 2.2.0 * Updates minimum Flutter version to 3.3. diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/platform_navigation_delegate.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/platform_navigation_delegate.dart index 51e2cb2691b..3ab66ee94d4 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/platform_navigation_delegate.dart +++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/platform_navigation_delegate.dart @@ -6,6 +6,7 @@ import 'dart:async'; import 'package:flutter/foundation.dart'; import 'package:plugin_platform_interface/plugin_platform_interface.dart'; +import 'types/types.dart'; import 'webview_platform.dart'; diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/platform_webview_controller.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/platform_webview_controller.dart index 71710cfdc66..3f6382e6ddd 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/platform_webview_controller.dart +++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/platform_webview_controller.dart @@ -7,6 +7,7 @@ import 'package:flutter/painting.dart'; import 'package:plugin_platform_interface/plugin_platform_interface.dart'; import 'platform_navigation_delegate.dart'; +import 'types/types.dart'; import 'webview_platform.dart'; /// Interface for a platform implementation of a web view controller. @@ -259,6 +260,16 @@ abstract class PlatformWebViewController extends PlatformInterface { throw UnimplementedError( 'setUserAgent is not implemented on the current platform'); } + + /// Sets a callback that notifies the host application that web content is + /// requesting permission to access the specified resources. + Future setOnPlatformPermissionRequest( + void Function(PlatformWebViewPermissionRequest request) onPermissionRequest, + ) { + throw UnimplementedError( + 'setOnPermissionRequest is not implemented on the current platform', + ); + } } /// Describes the parameters necessary for registering a JavaScript channel. diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/platform_webview_cookie_manager.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/platform_webview_cookie_manager.dart index a6740670e5c..9cb680ce9ff 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/platform_webview_cookie_manager.dart +++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/platform_webview_cookie_manager.dart @@ -5,6 +5,7 @@ import 'package:flutter/foundation.dart'; import 'package:plugin_platform_interface/plugin_platform_interface.dart'; +import 'types/types.dart'; import 'webview_platform.dart'; /// Interface for a platform implementation of a cookie manager. diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/platform_webview_widget.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/platform_webview_widget.dart index 2e49c80d0a9..4f4e5fc2e26 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/platform_webview_widget.dart +++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/platform_webview_widget.dart @@ -5,6 +5,7 @@ import 'package:flutter/widgets.dart'; import 'package:plugin_platform_interface/plugin_platform_interface.dart'; +import 'types/types.dart'; import 'webview_platform.dart'; /// Interface for a platform implementation of a web view widget. diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/types/platform_webview_permission_request.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/types/platform_webview_permission_request.dart new file mode 100644 index 00000000000..03e426e8453 --- /dev/null +++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/types/platform_webview_permission_request.dart @@ -0,0 +1,98 @@ +// Copyright 2013 The Flutter 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 'package:flutter/cupertino.dart'; + +/// Types of resources that can require permissions. +/// +/// Platform specific implementations can create their own resource types. +/// +/// This example demonstrates how to extend the [WebViewPermissionResourceType] +/// to create additional platform-specific types: +/// +/// ```dart +/// class AndroidWebViewPermissionResourceType +/// extends WebViewPermissionResourceType { +/// const AndroidWebViewPermissionResourceType._(super.name); +/// +/// static const AndroidWebViewPermissionResourceType midiSysex = +/// AndroidWebViewPermissionResourceType._('midiSysex'); +/// +/// static const AndroidWebViewPermissionResourceType protectedMediaId = +/// AndroidWebViewPermissionResourceType._('protectedMediaId'); +/// } +///``` +/// +@immutable +class WebViewPermissionResourceType { + /// Constructs a [WebViewPermissionResourceType]. + /// + /// This should only be used by this class and subclasses in platform + /// implementations. + @protected + const WebViewPermissionResourceType(this.name); + + /// Unique name of the resource type. + /// + /// For platform implementations, this should match the name of variable. + final String name; + + /// A media device that can capture video. + static const WebViewPermissionResourceType camera = + WebViewPermissionResourceType('camera'); + + /// A media device that can capture audio. + static const WebViewPermissionResourceType microphone = + WebViewPermissionResourceType('microphone'); +} + +/// Permissions request when web content requests access to protected resources. +/// +/// A response MUST be provided by calling a provided method. +/// +/// Platform specific implementations can add additional methods when extending +/// this class. +/// +/// This example demonstrates how to extend the +/// [PlatformWebViewPermissionRequest] to provide additional platform-specific +/// features: +/// +/// ```dart +/// class WebKitWebViewPermissionRequest extends PlatformWebViewPermissionRequest { +/// const WebKitWebViewPermissionRequest._({ +/// required super.types, +/// required void Function(WKPermissionDecision decision) onDecision, +/// }) : _onDecision = onDecision; +/// +/// final void Function(WKPermissionDecision) _onDecision; +/// +/// @override +/// Future grant() async { +/// _onDecision(WKPermissionDecision.grant); +/// } +/// +/// @override +/// Future deny() async { +/// _onDecision(WKPermissionDecision.deny); +/// } +/// +/// Future prompt() async { +/// _onDecision(WKPermissionDecision.prompt); +/// } +/// } +/// ``` +@immutable +abstract class PlatformWebViewPermissionRequest { + /// Creates a [PlatformWebViewPermissionRequest]. + const PlatformWebViewPermissionRequest({required this.types}); + + /// All resources access has been requested for. + final Set types; + + /// Grant permission for the requested resource(s). + Future grant(); + + /// Deny permission for the requested resource(s). + Future deny(); +} diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/types/types.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/types/types.dart index 1da20655548..e980aece3af 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/types/types.dart +++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/types/types.dart @@ -11,6 +11,7 @@ export 'navigation_request.dart'; export 'platform_navigation_delegate_creation_params.dart'; export 'platform_webview_controller_creation_params.dart'; export 'platform_webview_cookie_manager_creation_params.dart'; +export 'platform_webview_permission_request.dart'; export 'platform_webview_widget_creation_params.dart'; export 'url_change.dart'; export 'web_resource_error.dart'; diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/webview_platform.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/webview_platform.dart index c5c5dffc6a2..4a82b562635 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/webview_platform.dart +++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/webview_platform.dart @@ -10,8 +10,6 @@ import 'platform_webview_cookie_manager.dart'; import 'platform_webview_widget.dart'; import 'types/types.dart'; -export 'types/types.dart'; - /// Interface for a platform implementation of a WebView. abstract class WebViewPlatform extends PlatformInterface { /// Creates a new [WebViewPlatform]. diff --git a/packages/webview_flutter/webview_flutter_platform_interface/test/platform_webview_controller_test.dart b/packages/webview_flutter/webview_flutter_platform_interface/test/platform_webview_controller_test.dart index b3226886f70..2d808dceb69 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/test/platform_webview_controller_test.dart +++ b/packages/webview_flutter/webview_flutter_platform_interface/test/platform_webview_controller_test.dart @@ -374,6 +374,19 @@ void main() { throwsUnimplementedError, ); }); + + test( + 'Default implementation of setOnPermissionRequest should throw unimplemented error', + () { + final PlatformWebViewController controller = + ExtendsPlatformWebViewController( + const PlatformWebViewControllerCreationParams()); + + expect( + () => controller.setOnPlatformPermissionRequest((_) {}), + throwsUnimplementedError, + ); + }); } class MockWebViewPlatformWithMixin extends MockWebViewPlatform diff --git a/packages/webview_flutter/webview_flutter_platform_interface/test/platform_webview_controller_test.mocks.dart b/packages/webview_flutter/webview_flutter_platform_interface/test/platform_webview_controller_test.mocks.dart index 2147fbcedd0..1268858978c 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/test/platform_webview_controller_test.mocks.dart +++ b/packages/webview_flutter/webview_flutter_platform_interface/test/platform_webview_controller_test.mocks.dart @@ -8,8 +8,7 @@ import 'dart:async' as _i4; import 'package:mockito/mockito.dart' as _i1; import 'package:webview_flutter_platform_interface/src/platform_navigation_delegate.dart' as _i3; -import 'package:webview_flutter_platform_interface/src/webview_platform.dart' - as _i2; +import 'package:webview_flutter_platform_interface/src/types/types.dart' as _i2; // ignore_for_file: type=lint // ignore_for_file: avoid_redundant_argument_values From fca0babc8040ba84827166fa651c441023294ffd Mon Sep 17 00:00:00 2001 From: Maurice Parrish <10687576+bparrishMines@users.noreply.github.com> Date: Thu, 20 Apr 2023 10:49:28 -0400 Subject: [PATCH 2/4] update pubspec --- .../webview_flutter_platform_interface/pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/webview_flutter/webview_flutter_platform_interface/pubspec.yaml b/packages/webview_flutter/webview_flutter_platform_interface/pubspec.yaml index b4c271375ee..12c4050ccca 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/pubspec.yaml +++ b/packages/webview_flutter/webview_flutter_platform_interface/pubspec.yaml @@ -4,7 +4,7 @@ repository: https://github.com/flutter/packages/tree/main/packages/webview_flutt issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+webview_flutter%22 # NOTE: We strongly prefer non-breaking changes, even at the expense of a # less-clean API. See https://flutter.dev/go/platform-interface-breaking-changes -version: 2.2.0 +version: 2.3.0 environment: sdk: ">=2.18.0 <4.0.0" From 728c6e233f86952898bb4d8a13c10375d81ca770 Mon Sep 17 00:00:00 2001 From: Maurice Parrish <10687576+bparrishMines@users.noreply.github.com> Date: Thu, 20 Apr 2023 11:16:12 -0400 Subject: [PATCH 3/4] add export back and todo --- .../lib/src/webview_platform.dart | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/webview_platform.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/webview_platform.dart index 4a82b562635..e593627511f 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/webview_platform.dart +++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/webview_platform.dart @@ -10,6 +10,10 @@ import 'platform_webview_cookie_manager.dart'; import 'platform_webview_widget.dart'; import 'types/types.dart'; +// TODO(bparrishMines): This should be removed once webview_flutter_android and +// webview_flutter_wkwebview no longer depend on this file in tests. +export 'types/types.dart'; + /// Interface for a platform implementation of a WebView. abstract class WebViewPlatform extends PlatformInterface { /// Creates a new [WebViewPlatform]. From 2e68808451b1804a7e7f7d6baca88b85452264b2 Mon Sep 17 00:00:00 2001 From: Maurice Parrish <10687576+bparrishMines@users.noreply.github.com> Date: Thu, 20 Apr 2023 11:33:34 -0400 Subject: [PATCH 4/4] fix import lint --- .../lib/src/platform_navigation_delegate.dart | 2 +- .../lib/src/platform_webview_controller.dart | 2 +- .../lib/src/platform_webview_cookie_manager.dart | 2 +- .../lib/src/platform_webview_widget.dart | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/platform_navigation_delegate.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/platform_navigation_delegate.dart index 3ab66ee94d4..dc3fefbb513 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/platform_navigation_delegate.dart +++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/platform_navigation_delegate.dart @@ -8,7 +8,7 @@ import 'package:flutter/foundation.dart'; import 'package:plugin_platform_interface/plugin_platform_interface.dart'; import 'types/types.dart'; -import 'webview_platform.dart'; +import 'webview_platform.dart' show WebViewPlatform; /// Signature for callbacks that report a pending navigation request. typedef NavigationRequestCallback = FutureOr Function( diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/platform_webview_controller.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/platform_webview_controller.dart index 3f6382e6ddd..c7ec71e5dcc 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/platform_webview_controller.dart +++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/platform_webview_controller.dart @@ -8,7 +8,7 @@ import 'package:plugin_platform_interface/plugin_platform_interface.dart'; import 'platform_navigation_delegate.dart'; import 'types/types.dart'; -import 'webview_platform.dart'; +import 'webview_platform.dart' show WebViewPlatform; /// Interface for a platform implementation of a web view controller. /// diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/platform_webview_cookie_manager.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/platform_webview_cookie_manager.dart index 9cb680ce9ff..f87a386cf0e 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/platform_webview_cookie_manager.dart +++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/platform_webview_cookie_manager.dart @@ -6,7 +6,7 @@ import 'package:flutter/foundation.dart'; import 'package:plugin_platform_interface/plugin_platform_interface.dart'; import 'types/types.dart'; -import 'webview_platform.dart'; +import 'webview_platform.dart' show WebViewPlatform; /// Interface for a platform implementation of a cookie manager. /// diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/platform_webview_widget.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/platform_webview_widget.dart index 4f4e5fc2e26..124ba5747b1 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/platform_webview_widget.dart +++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/platform_webview_widget.dart @@ -6,7 +6,7 @@ import 'package:flutter/widgets.dart'; import 'package:plugin_platform_interface/plugin_platform_interface.dart'; import 'types/types.dart'; -import 'webview_platform.dart'; +import 'webview_platform.dart' show WebViewPlatform; /// Interface for a platform implementation of a web view widget. abstract class PlatformWebViewWidget extends PlatformInterface {