Skip to content

[webview_flutter] Adds support to receive permission requests #3543

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 67 commits into from
Apr 22, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
67 commits
Select commit Hold shift + click to select a range
48d4c9d
make deps path based
bparrishMines Mar 24, 2023
4ad0174
interface implementation
bparrishMines Mar 24, 2023
a51decc
support for permissionrequest
bparrishMines Mar 24, 2023
c6880bb
add method to webchromeclient
bparrishMines Mar 24, 2023
896ce9b
android impl without tests
bparrishMines Mar 24, 2023
f2f6f2a
remove imports
bparrishMines Mar 24, 2023
d7a54d0
update platform interface
bparrishMines Mar 24, 2023
38a727d
update interface again
bparrishMines Mar 24, 2023
44a0c2e
finish android implementation
bparrishMines Mar 24, 2023
8588900
change to platformwebviewpermissionrequest
bparrishMines Mar 24, 2023
631cfb8
version bump formatting and app facing implementation
bparrishMines Mar 24, 2023
4505f04
test constants
bparrishMines Mar 24, 2023
df40eca
redundant version checks
bparrishMines Mar 24, 2023
83c428a
Merge branch 'main' of github.com:flutter/packages into webview_permi…
bparrishMines Apr 6, 2023
e58ea0d
undo ios mocks change
bparrishMines Apr 6, 2023
07c3ac1
update webviewpermissionrequest
bparrishMines Apr 7, 2023
c8466f4
update app-facing package
bparrishMines Apr 7, 2023
e0801bc
add wkwebview method dart impl
bparrishMines Apr 7, 2023
da4a45f
finish dart ios code with failing tests
bparrishMines Apr 7, 2023
bfd6f27
formatting
bparrishMines Apr 7, 2023
e63f3e9
Merge branch 'main' of github.com:flutter/packages into webview_permi…
bparrishMines Apr 8, 2023
09eea9a
fix tests
bparrishMines Apr 8, 2023
c7606bb
Merge branch 'main' of github.com:flutter/packages into webview_permi…
bparrishMines Apr 10, 2023
10ef24c
controller test
bparrishMines Apr 10, 2023
d516b34
webview data converters
bparrishMines Apr 10, 2023
85f2b56
implement callback
bparrishMines Apr 10, 2023
5fbca14
update app-facing package
bparrishMines Apr 10, 2023
482b7c1
Merge branch 'main' of github.com:flutter/packages into webview_permi…
bparrishMines Apr 10, 2023
a291c52
fix lint errors
bparrishMines Apr 10, 2023
fb2b779
Merge branch 'main' of github.com:flutter/packages into webview_permi…
bparrishMines Apr 11, 2023
eeff573
try fix test
bparrishMines Apr 11, 2023
7a9a039
fix objc test
bparrishMines Apr 11, 2023
356e8ad
prompt by default
bparrishMines Apr 11, 2023
4800b3a
comment
bparrishMines Apr 11, 2023
fd3af75
test that ios works
bparrishMines Apr 11, 2023
7570c5b
add permissions to debug camera access
bparrishMines Apr 11, 2023
8946b87
reference permissions and version bump
bparrishMines Apr 11, 2023
23121e5
Merge branch 'main' of github.com:flutter/packages into webview_permi…
bparrishMines Apr 11, 2023
7d71719
undo webview_flutter change
bparrishMines Apr 11, 2023
6717cf4
improve docs and fix tests
bparrishMines Apr 11, 2023
d566b5e
naming
bparrishMines Apr 11, 2023
8e39a28
add version check
bparrishMines Apr 11, 2023
922028e
fix integration test
bparrishMines Apr 11, 2023
e592ae1
Merge branch 'main' of github.com:flutter/packages into webview_permi…
bparrishMines Apr 13, 2023
adc7f3c
add baseline back
bparrishMines Apr 13, 2023
9a57b03
fix lint
bparrishMines Apr 13, 2023
96b1515
add call to observe URL back
bparrishMines Apr 13, 2023
bfe3d64
Merge branch 'main' of github.com:flutter/packages into webview_permi…
bparrishMines Apr 15, 2023
44aaf7e
Merge branch 'main' of github.com:flutter/packages into webview_permi…
bparrishMines Apr 18, 2023
4f4c253
some of the review comments
bparrishMines Apr 18, 2023
bef6efa
fix methods, docs and make template naming consistent
bparrishMines Apr 19, 2023
f155afb
update dataconverter class names
bparrishMines Apr 19, 2023
f8b2691
Merge branch 'main' of github.com:flutter/packages into webview_permi…
bparrishMines Apr 19, 2023
68610f1
fix old method names
bparrishMines Apr 19, 2023
07a074b
Merge branch 'main' of github.com:flutter/packages into webview_permi…
bparrishMines Apr 19, 2023
a33ea19
docs and added a test
bparrishMines Apr 19, 2023
0638c30
Merge branch 'main' of github.com:flutter/packages into webview_permi…
bparrishMines Apr 20, 2023
d9c4a6e
add a comment about not recognizing permissions
bparrishMines Apr 20, 2023
a6496b8
Merge branch 'main' of github.com:flutter/packages into webview_permi…
bparrishMines Apr 21, 2023
fd13fce
Merge branch 'main' of github.com:flutter/packages into webview_permi…
bparrishMines Apr 21, 2023
ec80236
version bump
bparrishMines Apr 21, 2023
b065c45
move macro
bparrishMines Apr 21, 2023
535374b
fix files
bparrishMines Apr 21, 2023
b8a409f
last file
bparrishMines Apr 21, 2023
ba07eb1
export main_file.PlatformWebViewPermissionRequest
bparrishMines Apr 21, 2023
8715691
undo the export
bparrishMines Apr 21, 2023
520bf59
add more documention
bparrishMines Apr 22, 2023
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions packages/webview_flutter/webview_flutter/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
## 4.2.0

* Adds support to receive permission requests. See `WebViewController(onPermissionRequest)`.

## 4.1.0

* Adds support to track URL changes. See `NavigationDelegate(onUrlChange)`.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,8 @@ dependencies:
# The example app is bundled with the plugin so we use a path dependency on
# the parent directory to use the current plugin's version.
path: ../
webview_flutter_android: ^3.5.0
webview_flutter_wkwebview: ^3.3.0
webview_flutter_android: ^3.6.0
webview_flutter_wkwebview: ^3.4.0

dev_dependencies:
build_runner: ^2.1.5
Expand All @@ -29,7 +29,7 @@ dev_dependencies:
sdk: flutter
integration_test:
sdk: flutter
webview_flutter_platform_interface: ^2.1.0
webview_flutter_platform_interface: ^2.3.0

flutter:
uses-material-design: true
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ import 'webview_controller.dart';
class NavigationDelegate {
/// Constructs a [NavigationDelegate].
///
/// {@template webview_fluttter.navigation_delegate.constructor}
/// {@template webview_fluttter.NavigationDelegate.constructor}
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

made the template naming more consistent by matching the class name

/// `onUrlChange`: invoked when the underlying web view changes to a new url.
/// {@endtemplate}
NavigationDelegate({
Expand All @@ -61,6 +61,8 @@ class NavigationDelegate {
/// Constructs a [NavigationDelegate] from creation params for a specific
/// platform.
///
/// {@macro webview_fluttter.NavigationDelegate.constructor}
///
/// {@template webview_flutter.NavigationDelegate.fromPlatformCreationParams}
/// Below is an example of setting platform-specific creation parameters for
/// iOS and Android:
Expand All @@ -87,8 +89,6 @@ class NavigationDelegate {
/// );
/// ```
/// {@endtemplate}
///
/// {@macro webview_fluttter.navigation_delegate.constructor}
NavigationDelegate.fromPlatformCreationParams(
PlatformNavigationDelegateCreationParams params, {
FutureOr<NavigationDecision> Function(NavigationRequest request)?
Expand All @@ -110,7 +110,7 @@ class NavigationDelegate {

/// Constructs a [NavigationDelegate] from a specific platform implementation.
///
/// {@macro webview_fluttter.navigation_delegate.constructor}
/// {@macro webview_fluttter.NavigationDelegate.constructor}
NavigationDelegate.fromPlatform(
this.platform, {
this.onNavigationRequest,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,16 +43,33 @@ import 'webview_widget.dart';
class WebViewController {
/// Constructs a [WebViewController].
///
/// {@template webview_fluttter.WebViewController.constructor}
/// `onPermissionRequest`: A callback that notifies the host application that
/// web content is requesting permission to access the specified resources.
/// To grant access for a device resource, most platforms will need to update
/// their app configurations for the relevant system resource.
///
/// For Android, you will need to update your `AndroidManifest.xml`. See
/// https://developer.android.com/training/permissions/declaring
///
/// For iOS, you will need to update your `Info.plist`. See
/// https://developer.apple.com/documentation/uikit/protecting_the_user_s_privacy/requesting_access_to_protected_resources?language=objc.
/// {@endtemplate}
///
/// See [WebViewController.fromPlatformCreationParams] for setting parameters
/// for a specific platform.
WebViewController()
: this.fromPlatformCreationParams(
WebViewController({
void Function(WebViewPermissionRequest request)? onPermissionRequest,
}) : this.fromPlatformCreationParams(
const PlatformWebViewControllerCreationParams(),
onPermissionRequest: onPermissionRequest,
);

/// Constructs a [WebViewController] from creation params for a specific
/// platform.
///
/// {@macro webview_fluttter.WebViewController.constructor}
///
/// {@template webview_flutter.WebViewController.fromPlatformCreationParams}
/// Below is an example of setting platform-specific creation parameters for
/// iOS and Android:
Expand Down Expand Up @@ -80,11 +97,31 @@ class WebViewController {
/// ```
/// {@endtemplate}
WebViewController.fromPlatformCreationParams(
PlatformWebViewControllerCreationParams params,
) : this.fromPlatform(PlatformWebViewController(params));
PlatformWebViewControllerCreationParams params, {
void Function(WebViewPermissionRequest request)? onPermissionRequest,
}) : this.fromPlatform(
PlatformWebViewController(params),
onPermissionRequest: onPermissionRequest,
);

/// Constructs a [WebViewController] from a specific platform implementation.
WebViewController.fromPlatform(this.platform);
///
/// {@macro webview_fluttter.WebViewController.constructor}
WebViewController.fromPlatform(
this.platform, {
void Function(WebViewPermissionRequest request)? onPermissionRequest,
}) {
if (onPermissionRequest != null) {
platform.setOnPlatformPermissionRequest(
(PlatformWebViewPermissionRequest request) {
onPermissionRequest(WebViewPermissionRequest._(
request,
types: request.types,
));
},
);
}
}

/// Implementation of [PlatformWebViewController] for the current platform.
final PlatformWebViewController platform;
Expand Down Expand Up @@ -319,3 +356,49 @@ class WebViewController {
return platform.setUserAgent(userAgent);
}
}

/// Permissions request when web content requests access to protected resources.
///
/// A response MUST be provided by calling [grant], [deny], or a method from
/// [platform].
///
/// ## Platform-Specific Features
/// This class contains an underlying implementation provided by the current
/// platform. Once a platform implementation is imported, the example below
/// can be followed to use features provided by a platform's implementation.
///
/// Below is an example of accessing the platform-specific implementation for
/// iOS and Android:
///
/// ```dart
/// final WebViewPermissionRequest request = ...;
///
/// if (WebViewPlatform.instance is WebKitWebViewPlatform) {
/// final WebKitWebViewPermissionRequest webKitRequest =
/// request.platform as WebKitWebViewPermissionRequest;
/// } else if (WebViewPlatform.instance is AndroidWebViewPlatform) {
/// final AndroidWebViewPermissionRequest androidRequest =
/// request.platform as AndroidWebViewPermissionRequest;
/// }
/// ```
@immutable
class WebViewPermissionRequest {
const WebViewPermissionRequest._(this.platform, {required this.types});

/// All resources access has been requested for.
final Set<WebViewPermissionResourceType> types;

/// Implementation of [PlatformWebViewPermissionRequest] for the current
/// platform.
final PlatformWebViewPermissionRequest platform;

/// Grant permission for the requested resource(s).
Future<void> grant() {
return platform.grant();
}

/// Deny permission for the requested resource(s).
Future<void> deny() {
return platform.deny();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,13 +16,15 @@ export 'package:webview_flutter_platform_interface/webview_flutter_platform_inte
PlatformNavigationDelegateCreationParams,
PlatformWebViewControllerCreationParams,
PlatformWebViewCookieManagerCreationParams,
PlatformWebViewPermissionRequest,
PlatformWebViewWidgetCreationParams,
ProgressCallback,
UrlChange,
WebResourceError,
WebResourceErrorCallback,
WebResourceErrorType,
WebViewCookie,
WebViewPermissionResourceType,
WebViewPlatform;

export 'src/navigation_delegate.dart';
Expand Down
4 changes: 2 additions & 2 deletions packages/webview_flutter/webview_flutter/pubspec.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ name: webview_flutter
description: A Flutter plugin that provides a WebView widget on Android and iOS.
repository: https://github.com/flutter/packages/tree/main/packages/webview_flutter/webview_flutter
issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+webview%22
version: 4.1.0
version: 4.2.0

environment:
sdk: ">=2.18.0 <4.0.0"
Expand All @@ -20,7 +20,7 @@ dependencies:
flutter:
sdk: flutter
webview_flutter_android: ^3.0.0
webview_flutter_platform_interface: ^2.1.0
webview_flutter_platform_interface: ^2.3.0
webview_flutter_wkwebview: ^3.0.0

dev_dependencies:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -365,4 +365,38 @@ void main() {
mockPlatformNavigationDelegate,
));
});

test('onPermissionRequest', () async {
bool permissionRequestCallbackCalled = false;

final MockPlatformWebViewController mockPlatformWebViewController =
MockPlatformWebViewController();
WebViewController.fromPlatform(
mockPlatformWebViewController,
onPermissionRequest: (WebViewPermissionRequest request) {
permissionRequestCallbackCalled = true;
},
);

final void Function(PlatformWebViewPermissionRequest request)
requestCallback = verify(mockPlatformWebViewController
.setOnPlatformPermissionRequest(captureAny))
.captured
.single as void Function(PlatformWebViewPermissionRequest request);

requestCallback(const TestPlatformWebViewPermissionRequest());
expect(permissionRequestCallbackCalled, isTrue);
});
}

class TestPlatformWebViewPermissionRequest
extends PlatformWebViewPermissionRequest {
const TestPlatformWebViewPermissionRequest()
: super(types: const <WebViewPermissionResourceType>{});

@override
Future<void> grant() async {}

@override
Future<void> deny() async {}
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,7 @@ import 'package:webview_flutter_platform_interface/src/platform_navigation_deleg
as _i6;
import 'package:webview_flutter_platform_interface/src/platform_webview_controller.dart'
as _i4;
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
Expand Down Expand Up @@ -342,6 +341,18 @@ class MockPlatformWebViewController extends _i1.Mock
returnValue: _i5.Future<void>.value(),
returnValueForMissingStub: _i5.Future<void>.value(),
) as _i5.Future<void>);
@override
_i5.Future<void> setOnPlatformPermissionRequest(
void Function(_i2.PlatformWebViewPermissionRequest)?
onPermissionRequest) =>
(super.noSuchMethod(
Invocation.method(
#setOnPlatformPermissionRequest,
[onPermissionRequest],
),
returnValue: _i5.Future<void>.value(),
returnValueForMissingStub: _i5.Future<void>.value(),
) as _i5.Future<void>);
}

/// A class which mocks [PlatformNavigationDelegate].
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,7 @@ import 'dart:async' as _i4;
import 'package:mockito/mockito.dart' as _i1;
import 'package:webview_flutter_platform_interface/src/platform_webview_cookie_manager.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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,10 +30,14 @@ void main() {
// ignore: unnecessary_statements
main_file.PlatformWebViewCookieManagerCreationParams;
// ignore: unnecessary_statements
main_file.PlatformWebViewPermissionRequest;
// ignore: unnecessary_statements
main_file.PlatformWebViewWidgetCreationParams;
// ignore: unnecessary_statements
main_file.ProgressCallback;
// ignore: unnecessary_statements
main_file.WebViewPermissionResourceType;
// ignore: unnecessary_statements
main_file.WebResourceError;
// ignore: unnecessary_statements
main_file.WebResourceErrorCallback;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,7 @@ import 'package:webview_flutter_platform_interface/src/platform_webview_controll
as _i6;
import 'package:webview_flutter_platform_interface/src/platform_webview_widget.dart'
as _i9;
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
Expand Down Expand Up @@ -360,6 +359,18 @@ class MockPlatformWebViewController extends _i1.Mock
returnValue: _i7.Future<void>.value(),
returnValueForMissingStub: _i7.Future<void>.value(),
) as _i7.Future<void>);
@override
_i7.Future<void> setOnPlatformPermissionRequest(
void Function(_i2.PlatformWebViewPermissionRequest)?
onPermissionRequest) =>
(super.noSuchMethod(
Invocation.method(
#setOnPlatformPermissionRequest,
[onPermissionRequest],
),
returnValue: _i7.Future<void>.value(),
returnValueForMissingStub: _i7.Future<void>.value(),
) as _i7.Future<void>);
}

/// A class which mocks [PlatformWebViewWidget].
Expand Down