Skip to content

[webview_flutter_platform_interface] Adds method to receive permission requests #3767

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
Show file tree
Hide file tree
Changes from all commits
Commits
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
Original file line number Diff line number Diff line change
@@ -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.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,9 @@ 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';
import 'webview_platform.dart' show WebViewPlatform;

/// Signature for callbacks that report a pending navigation request.
typedef NavigationRequestCallback = FutureOr<NavigationDecision> Function(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,8 @@ import 'package:flutter/painting.dart';
import 'package:plugin_platform_interface/plugin_platform_interface.dart';

import 'platform_navigation_delegate.dart';
import 'webview_platform.dart';
import 'types/types.dart';
import 'webview_platform.dart' show WebViewPlatform;

/// Interface for a platform implementation of a web view controller.
///
Expand Down Expand Up @@ -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<void> 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.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,8 @@
import 'package:flutter/foundation.dart';
import 'package:plugin_platform_interface/plugin_platform_interface.dart';

import 'webview_platform.dart';
import 'types/types.dart';
import 'webview_platform.dart' show WebViewPlatform;

/// Interface for a platform implementation of a cookie manager.
///
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,8 @@
import 'package:flutter/widgets.dart';
import 'package:plugin_platform_interface/plugin_platform_interface.dart';

import 'webview_platform.dart';
import 'types/types.dart';
import 'webview_platform.dart' show WebViewPlatform;

/// Interface for a platform implementation of a web view widget.
abstract class PlatformWebViewWidget extends PlatformInterface {
Expand Down
Original file line number Diff line number Diff line change
@@ -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<void> grant() async {
/// _onDecision(WKPermissionDecision.grant);
/// }
///
/// @override
/// Future<void> deny() async {
/// _onDecision(WKPermissionDecision.deny);
/// }
///
/// Future<void> 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<WebViewPermissionResourceType> types;

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

/// Deny permission for the requested resource(s).
Future<void> deny();
}
Original file line number Diff line number Diff line change
Expand Up @@ -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';
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@ 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';
Copy link
Contributor Author

Choose a reason for hiding this comment

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

This is an implementation file and is being used by our platform implementations tests for this export: https://github.com/flutter/packages/blob/main/packages/webview_flutter/webview_flutter_android/test/android_webview_controller_test.dart#L21

I think this export may had caused the IDE to choose this file to import when accessing the classes from this file. Instead of the package:webview_flutter_platform_interface/webview_flutter_platform_interface.dart. In the platform PRs I'll change the imports in the tests.

Copy link
Contributor

Choose a reason for hiding this comment

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

Aren't there types that are part of this interface that come from there? Like the param object types?

Copy link
Contributor Author

@bparrishMines bparrishMines Apr 20, 2023

Choose a reason for hiding this comment

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


/// Interface for a platform implementation of a WebView.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
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_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
Expand Down